source: lliurex-mirror/trunk/fuentes/lliurex-mirror-core.install/usr/sbin/lliurex-mirror @ 246

Last change on this file since 246 was 246, checked in by hectorgh, 5 years ago

adding project files

  • Property svn:executable set to *
File size: 12.3 KB
Line 
1#!/bin/bash
2#
3# This script is licensed under GPL v3 or higher
4# Author: Angel Berlanas Vicente <angel.berlanas@gmail.com>
5# Author: Hector García Huerta <hectorgh@gmail.com>
6# The chosen language is BASH...Why?
7# Some reasons:
8#       - BASH is powerfull and allows quickly development...
9#       - The comandline power burns in our fingers
10#       - reprepro commands are always for Systems Adminstrators and
11#         bindings for other languages are not in their develpment line.
12#       - BASH is for me! I love it and it loves me.
13#       - Frankenstein monster one of our favorites... ^_^
14#       - Search, compare and if you want something better ... programalo yourself!     
15
16#### Colors for terminal #####
17# Some colors
18# Reset
19Color_Off='\e[0m'                       # Text Reset
20
21# Regular Colors
22Black='\e[0;30m'                        # Black
23Red='\e[0;31m'                          # Red
24Green='\e[0;32m'                        # Green
25Yellow='\e[0;33m'                       # Yellow
26Blue='\e[0;34m'                         # Blue
27Purple='\e[0;35m'                       # Purple
28Cyan='\e[0;36m'                         # Cyan
29White='\e[0;37m'                        # White
30
31
32CONFIG_SEL="${1}".conf
33MOUNT_DIR="/tmp/llx-mnt/"
34EXIT_RC=0
35
36if [ -r "/etc/lliurex-mirror/conf/${CONFIG_SEL}" ]; then
37        source  "/etc/lliurex-mirror/conf/${CONFIG_SEL}"
38        shift
39else
40        source  "/etc/lliurex-mirror/conf/default.conf"
41fi
42
43
44
45# N4D Mirror Methods
46_prepare_log(){
47        # Clean log file
48        [ ! -e /tmp/n4drmirror.log ] || rm  -f /tmp/n4drmirror.log
49}
50
51_exist_log_file(){
52        if [ -e /tmp/n4drmirror.log ] ; then
53                echo "True"
54        else
55                echo "False"
56        fi
57}
58
59check_mirror(){
60    # check if mirror is able to create images
61    reprepro -b "$MIRROR_DIR" $COMMON_REPREPRO_OPTS check pandora &>/tmp/reprepro_exit
62    a=`cat /tmp/reprepro_exit | wc -l`
63    if [ $a = "0" ] ; then
64       echo "{'status':'True','msg':'Mirror is safe.'}"
65    else
66        echo "{'status':'False','msg':'Mirror needs to be updated.'}"
67    fi
68}
69
70get_mirror_architecture_32_status()
71{
72        # check if mirror is 32 bits and ready to build images
73        # check if mirror is able to create images
74    ARCHITECTURES=$(cat ${MIRROR_DIR}/conf/distributions | grep "Architectures:" | cut -d ":" -f2| sed -e "s%^ %%g;s% $%%g"|tr " " ",") 
75    rc=0
76    echo ${ARCHITECTURES}| grep -q "i386"|| rc=1
77    if [ ${rc} -eq 0 ]; then
78        echo "{'status':'True','msg':'Mirror is 32bits capable'}"
79        else
80                echo "{'status':'False','msg':'Mirror not is 32 capable'}"
81    fi
82}
83
84get_mirror_architecture_64_status()
85{       # check if mirror is 32 bits and ready to build images
86        # check if mirror is able to create images
87    ARCHITECTURES=$(cat ${MIRROR_DIR}/conf/distributions | grep "Architectures:" | cut -d ":" -f2| sed -e "s%^ %%g;s% $%%g"|tr " " ",") 
88    rc=0
89    echo ${ARCHITECTURES}| grep -q "amd64"|| rc=1
90    if [ ${rc} -eq 0 ]; then
91        echo "{'status':'True','msg':'Mirror is 64bits capable'}"
92        else
93                echo "{'status':'False','msg':'Mirror not is 64bits capable'}"
94    fi
95}
96
97
98backup_updates(){
99       
100        # Make a simple backup from updates rules
101        if [ -e ${MIRROR_DIR}/conf/updates ] ; then
102                cp -f ${MIRROR_DIR}/conf/updates ${MIRROR_DIR}/conf/updates.bak
103        fi
104}
105
106restore_updates(){
107       
108        # Make a simple restore from updates rules
109        if [ -e ${MIRROR_DIR}/conf/updates.bak ] ; then
110                cp -f ${MIRROR_DIR}/conf/updates.bak ${MIRROR_DIR}/conf/updates
111        fi
112}
113
114_update_from_ip(){
115
116        # Update the mirror from a custom ip
117       
118        CUSTOM_IP="$1"
119
120        if [ -z $CUSTOM_IP ] ; then
121                show_usage
122        fi     
123       
124        # Make a backup
125        backup_updates
126
127        sed -i "s%Method:.*%Method: http://$CUSTOM_IP/$DIST_CODE%g" "${MIRROR_DIR}/conf/updates" 
128
129       
130}
131
132
133get_status()
134{
135        # Is the current distribution being update now?
136        if [ -f "${LOCK_FILE}" ] ; then
137                echo "{'status':'busy','msg':'reprepro is running'}"
138        else
139                # You can access the data with: exec("ret="+"plugin.isalive()[status]")
140                echo "{'status':'available','msg':'mirror is ready'}"
141        fi
142}
143
144_die()
145{
146        echo "[ERROR] $1"
147        exit 1
148}
149
150_printf()
151{
152        if [ $(basename $0) = "lliurex_mirror" ] ; then
153                echo -e "[ LliureX Mirror ] : $1"
154        else
155                echo -e "[$Blue LliureX Mirror $Color_Off] : $Cyan $1 $Color_Off"
156        fi
157}
158
159
160_printf_error()
161{
162        if [ $(basename $0) = "lliurex_mirror" ] ; then
163                echo -e "[ LliureX Mirror ] : $1"
164        else
165                echo -e "[$Blue LliureX Mirror $Color_Off] : $Red $1 $Color_Off"
166        fi
167}
168
169
170set_architecture_32()
171{
172        _printf "* 32 bits server ... "
173        cp "$TEMPLATES_DIR/distributions_32" "$MIRROR_DIR/conf/distributions"
174        cp "$TEMPLATES_DIR/updates_32" "$MIRROR_DIR/conf/updates"
175}
176
177set_architecture_64()
178{
179        _printf "* 64 bits server ... "
180        cp "$TEMPLATES_DIR/distributions_64" "$MIRROR_DIR/conf/distributions"
181        cp "$TEMPLATES_DIR/updates_64" "$MIRROR_DIR/conf/updates"
182}
183
184set_architecture_all()
185{
186        _printf "* ALL Architectures server ... "
187        cp "$TEMPLATES_DIR/distributions_all" "$MIRROR_DIR/conf/distributions"
188        cp "$TEMPLATES_DIR/updates_all" "$MIRROR_DIR/conf/updates"
189}
190
191
192_do_architecture_checks()
193{
194        if [ ! -f "$MIRROR_DIR/conf/distributions" ] ; then
195                arch=$(uname -m)
196                if [ $arch = 'x86_64' ] ; then
197                        _printf "* 64 bits server ... "
198                        cp "$TEMPLATES_DIR/distributions_all" "$MIRROR_DIR/conf/distributions"
199                else
200                        _printf "* 32 bits server ... "
201                        cp "$TEMPLATES_DIR/distributions_32" "$MIRROR_DIR/conf/distributions"
202                fi
203        fi
204        if [ ! -f "$MIRROR_DIR/conf/updates" ] ; then
205                arch=$(uname -m)
206                if [ $arch = 'x86_64' ] ; then
207                        _printf "* 64 bits server ... "
208                        cp "$TEMPLATES_DIR/updates_all" "$MIRROR_DIR/conf/updates"
209                else
210                        _printf "* 32 bits server ... "
211                        cp "$TEMPLATES_DIR/updates_32" "$MIRROR_DIR/conf/updates"
212                fi
213        fi
214}
215
216_do_sanity_checks()
217{       
218        # Test if directories exists?
219        _printf "Test $MIRROR_DIR"
220        [ -d "$MIRROR_DIR" ] || mkdir -p "$MIRROR_DIR"
221        [ -d "$MIRROR_DIR/conf" ] || mkdir -p "$MIRROR_DIR/conf" 
222        #[ -x "$MIRROR_DIR/conf/endhook.sh" ] || cp "$TEMPLATES_DIR/endhook.sh" "$MIRROR_DIR/conf/endhook.sh" && chmod +x "$MIRROR_DIR/conf/endhook.sh"
223
224
225        _do_architecture_checks
226
227        mkdir -p "$LOG_DIR"
228               
229        # Now all exists... but... is repreprepro ready?
230        _printf "* - Reprepro - checkpool"
231        _printf "reprepro -b $MIRROR_DIR checkpool"
232}
233
234_do_update()
235{
236        # Update the mirror
237        _printf "* Get Token for Update in the middle"
238        _get_the_token ${TOKEN_BEFORE_THE_UPDATE}       
239       
240        _printf "* - Reprepro - update"
241       
242        #echo $(basename $0)
243       
244        if [ $(basename $0) != "lliurex_mirror" ] ; then
245                # Call to n4d to solve the thread problem
246                N4D_RET=$(n4d-client -r -c LliurexMirrorCore -m update)
247               
248                # While is alive, echo the pogress
249                IS_ALIVE="$(n4d-client -c LliurexMirrorCore -m is_alive)"
250               
251                while [ "$IS_ALIVE" !=  "False" ]; do
252                        sleep 25
253                        IS_ALIVE="$(n4d-client -c LliurexMirrorCore -m is_alive)"
254                        n4d-client -c LliurexMirrorCore -m get_progress
255                done
256               
257                N4D_RC=$(n4d-client -c LliurexMirrorCore -m get_rc_status)
258               
259                if [ "$N4D_RC" != "0" ]; then
260                        EXIT_RC=255
261                fi
262               
263        else
264                reprepro -b $MIRROR_DIR $COMMON_REPREPRO_OPTS --show-percent update
265                EXIT_RC=$?
266                echo $EXIT_RC
267                reprepro -b $MIRROR_DIR $COMMON_REPREPRO_OPTS --show-percent retrack
268                reprepro -b $MIRROR_DIR $COMMON_REPREPRO_OPTS --show-percent export
269        fi
270        # Vanilla percent
271        #       for i in $(seq 1 100); do _printf $i%; done
272        if [ "$EXIT_RC" = "0" ]; then
273                echo "Got 100%: Finished"
274        fi
275        _printf "* - Finished - "
276        if [ ! -L "$HTTP_DIR" ] ; then
277                mkdir -p "/var/www/"
278                ln -s "$MIRROR_DIR" "$HTTP_DIR"
279                cp "$JSON_DIR/mirror.json" "$HTTP_DIR/srv/links/"
280                _printf "* - link is now ready"
281        fi
282       
283        if [ "$EXIT_RC" != "0" ]; then
284                _printf_error ""
285                _printf_error "[!] Something went wrong. [!]"
286                _printf_error "You might want to try updating again."
287        fi
288       
289        # Get the token after
290        _get_the_token ${TOKEN_AFTER_THE_UPDATE}
291       
292        # Test if update in the middle
293        _test_the_update_in_the_middle 
294
295        # Do the umount
296        _do_umount
297
298}
299
300
301get_mirror_architecture()
302{
303        ARCHITECTURES=$(cat ${MIRROR_DIR}/conf/distributions | grep "Architectures:" | cut -d ":" -f2| sed -e "s%^ %%g;s% $%%g"|tr " " ",") 
304        echo "{'status':'True','architecture':'${ARCHITECTURES}'}"
305}
306
307_get_the_unix_date()
308{
309        # Test if the file exists
310        [ -f "$LOG_FILE" ] || _die "Not log"
311        # Get the Value
312    UNIX_DATE=$(head -1 $LOG_FILE | cut -d ";" -f1)
313        # Return as a python dic
314        echo "{'status':'True','date':'$UNIX_DATE'}"
315}       
316
317_do_test()
318{
319        # Test the database status
320        if [ -e "$LOCK_FILE" ] ; then
321                _printf_error "Database is locked."
322                _printf_error "If no reprepro instance is running, you might need to delete the lock file:"
323                _printf_error "$LOCK_FILE"
324        fi 
325       
326        # Test the mirror presence on apache
327        if [ -L "$HTTP_DIR" ] ; then
328                _printf ""
329                #_printf "* - /var/www is created"
330        else
331                _printf "* - http server link is not present"
332        fi
333       
334        # Test the last log
335        if [ -e "$LOG_FILE" ] ; then
336                _printf "$(cat $LOG_FILE)"
337        else
338                _printf " - Log File at $LOG_FILE is not ready "
339        fi
340}
341
342_save_current_update()
343{
344        # Save current update rule
345        _printf "Backup the current update rule"
346        cp -f "$MIRROR_DIR"/conf/updates "$MIRROR_DIR"/conf/updates.bak
347}
348
349
350
351_do_update_from_custom_dir()
352{
353        # Make the update
354
355        mkdir -p $MOUNT_DIR
356        CUSTOM_DIR="$@"
357
358        mount --bind "$CUSTOM_DIR" $MOUNT_DIR
359               
360        _printf "Update from custom dir DIRECTORY="$CUSTOM_DIR""
361        FULL_PATH="$(readlink -f  "$MOUNT_DIR")"
362        #echo $FULL_PATH
363
364        cat "$MIRROR_DIR"/conf/updates.bak | sed -e "s%Method: http:\/\/.*%Method: file://$FULL_PATH%g" > "$MIRROR_DIR"/conf/updates
365        cat "$MIRROR_DIR"/conf/updates
366        echo "$CUSTOM_DIR" > "$MIRROR_DIR"/conf/updates.custom
367
368}
369
370_do_umount()
371{
372        mount | grep $MOUNT_DIR && umount $MOUNT_DIR || true
373}
374
375_update_in_the_middle_actions()
376{
377        echo "[ LliureX Mirror ]"
378        echo " A Update in the middle is present "
379}
380
381
382_test_the_update_in_the_middle()
383{
384        #_printf "[ LliureX Mirror ] Test Update in the middle"
385        rc=0
386        diff -q ${TOKEN_BEFORE_THE_UPDATE} ${TOKEN_AFTER_THE_UPDATE} || rc=1
387        if [ $rc -eq 1 ] ; then
388                _update_in_the_middle_actions
389        fi
390}
391
392_get_the_token()
393{
394        TOKEN_DEST=${1}
395        :>${TOKEN_DEST}
396        wget -q -O ${TOKEN_DEST} ${UPDATE_IN_THE_MIDDLE_URL} 
397}
398
399
400get_the_last_custom_dir()
401{
402        if [ -e "$MIRROR_DIR"/conf/updates.custom ] ; then
403                cat "$MIRROR_DIR"/conf/updates.custom
404        else
405                echo "None"
406        fi
407}
408
409do_the_rsync()
410{
411        DESTINATION_DIR="$@"
412        mkdir -p "$DESTINATION_DIR/"
413        rsync -av "$MIRROR_DIR" "$DESTINATION_DIR/"
414}
415
416
417show_usage()
418{
419        LIST_OF_CONFS="$(ls -1 /etc/lliurex-mirror/conf/*.conf | cut -d "." -f1 | cut -d "/" -f 5| tr "\n" "|")"
420        echo "lliurex-mirror [$LIST_OF_CONFS] [OPTIONS]" | sed -e "s%|]%]%g"
421        echo "          update_from_custom_dir [DIR]"
422        echo "          update_from_ip [IP]"
423        echo "          save_to_custom_dir [DIR]"
424        echo "          get_the_last_custom_dir"
425        echo "          update"
426        echo "          check_and_fix"
427        echo "          do_sanity_checks"
428        echo "          get_mirror_architecture"
429        echo "          set_architecture_all"
430        echo "          set_architecture_64"
431        echo "          set_architecture_32"
432        echo "          is_mirror_32_available"
433        echo "          is_mirror_64_available"
434        echo ""
435        echo ""
436        echo "n4dupdate Methods (use internal)"
437        echo "      n4dupdate"
438        echo "      n4d_get_unix_date"
439        echo "      get_status"
440        echo "      do_sanity_checks"
441}
442
443#MAIN
444
445if [ $# -eq 0 ] ; then
446        show_usage
447        exit 0
448fi
449
450ACTION=$1
451shift
452
453case $ACTION in
454        get_the_last_custom_dir)
455                get_the_last_custom_dir
456                ;;
457        get_mirror_architecture)
458                get_mirror_architecture
459                ;;
460        n4dupdate)
461                _do_sanity_checks
462                _do_update
463                _do_test
464                echo "End n4dmirrorupdate !" >&2
465                exit $EXIT_RC
466                ;;
467        n4d_get_unix_date)
468                _get_the_unix_date
469                ;;
470        set_architecture_32)
471                set_architecture_32
472                exit 0
473                ;;
474        set_architecture_64)
475                set_architecture_64
476                exit 0
477                ;;
478        set_architecture_all)
479                set_architecture_all
480                exit 0
481                ;;
482        is_mirror_32_available)
483                get_mirror_architecture_32_status
484                ;;
485        is_mirror_64_available)
486                get_mirror_architecture_64_status
487                ;;
488        save_to_custom_dir)
489                do_the_rsync "$@"
490                ;;
491        update_from_ip)
492                _do_sanity_checks
493                _update_from_ip $1
494                _do_update
495                restore_updates
496                exit $EXIT_RC
497                ;;
498        update_from_custom_dir)
499                CUSTOM_DIR="$@"
500                _do_sanity_checks
501                _save_current_update
502                _do_update_from_custom_dir "$CUSTOM_DIR"
503                _do_update
504                _do_test
505                restore_updates
506                exit $EXIT_RC
507                ;;
508       
509        update_from_custom_dir_pre_actions)
510                CUSTOM_DIR="$@"
511                _do_sanity_checks
512                _save_current_update
513                _do_update_from_custom_dir "$CUSTOM_DIR"
514                ;;
515               
516        update_from_custom_dir_post_actions)
517                _do_test
518                restore_updates
519                ;;
520
521        get_status)
522                get_status
523                ;;
524        do_sanity_checks)
525                _do_sanity_checks
526                ;;
527        check_and_fix)
528                _do_sanity_checks
529                ;;
530        update) 
531                _do_sanity_checks       
532                _do_update     
533                _do_test
534                exit $EXIT_RC
535                ;;
536        prepare_log)
537                _prepare_log
538                ;;
539        exist_log_file)
540                _exist_log_file
541                ;;
542        set_ip_in_updates)
543                _do_sanity_checks
544                _update_from_ip $1
545                ;;
546        restore_default_updates)
547                restore_updates
548                ;;
549        test)
550                _do_test
551        ;;
552
553        check_mirror)
554            check_mirror
555        ;;
556        *)
557        show_usage
558        exit 0
559        ;;
560esac
561
562exit 0
Note: See TracBrowser for help on using the repository browser.