Topic: Skripta za azuriranje NetBSD sistema koristeci snapshot setove

Skripta ima dosta komentara tako da necu komentarisati nego samo nalepiti skriptu:

#!/bin/ksh
#
#    dalibor Dot gudzic At gmail Dot com
#    www.bsd-srbija.org
#    09/2009
#
# Skripta sluzi za preuzimanje instalacionih setova sa ftp servera
# koji se onda koriste za azuriranje NetBSD sistema tako sto ih ekstraktujemo
# i na kraju uklonimo zastarele fajlove koristeci etcupdate i postinstall. Prilikom azuriranja
# prvo instaliramo kernel i ako je sve u redu nakon podizanja sistema sa novim kernelom tek
# onda nastavljamo sa instaliranjem setova. Prvo cemo definisati neke stvari koje su nam
# potrebne dalje u skripti tako da ubuduce ne moramo da menjamo samu skriptu 
# nego samo vrednosti ovih varijabli
#

#
# Direktorijum gde ce se cuvati preuzeti setovi
#

DWNLD_DIR="/home/soxxx/netbsd_sets"

#
# FTP server sa kojeg preuzimamo setove i putanja
#

FTP_SAJT="http://nyftp.netbsd.org"                #FTP_SAJT="ftp://ftp.fr.netbsd.org"
FTP_RELENG="pub/NetBSD-daily"

#
# Verzija NetBSD-a za koju preuzimamo setove
#

TAG="netbsd-5"

#
# Belezimo staru verziju i pravimo niz sa imenima setova
#

VERZIJA="$(awk -F\' '/BUILDID/ { print $2 }' /etc/release)"

set -A SETOVI "base comp etc kern-GENERIC man misc tests text xbase xcomp xetc xfont xserver"

#
# Fukcija koja objasnjava pravilno pokretanje skripte
#

f_koriscenje() {
cat <<EOF

Pokretanje skripte: ${0##*/} <getsets | installkernel | installsets | postinstall | etcupdate | help>

    getsets           -    Preuzimanje setova sa ftp servera
    installkernel     -    Ekstraktovanje i instaliranje GENERIC kernela
    installsets       -    Instaliranje setova
    postinstall       -    Uklanjanje starih sistemskih fajlova
    etcupdate         -    Azuriranje, spajanje konfiguracionih fajlova u /etc direktorijumu
    help              -    Prikaz pravilnog pokretanja skripte

Osim u slucaju preuzimanja setova, za pravilno izvrsenje skripte potrebno je skriptu pokrenuti sa:

    sudo ${0##*/} parametar

EOF
}

#
# Proveravamo broj parametara
#

if [ $# != 1 ]
then
    print "Greska: potreban je (samo) jedan parametar za izvrsenje skripte jebi ga."
    f_koriscenje
    exit 1
fi

#
# Koristimo case petlju za dobijanje zadatog parametra. U slucaju da je parametar nepoznat,
# ispisujemo poruku o gresci
#

case $1 in
    getsets)
        # 
        # Proveravamo dali postoji novija verzija na FTP serveru od one koju vec koristimo
        #

        NOVA_VERZIJA=$(ftp -o - $FTP_SAJT/$FTP_RELENG/$TAG/ | sed -Ene 's|.*href="([0-9]+[^/]*).*|\1|p' | sort -r | head -1)

        # awk verzija
        # NOVA_VERZIJA=$(ftp -o - $FTP_SAJT/$FTP_RELENG/$TAG/ | \
        #                                awk '{ if(match($0, "[0-9]+Z[^/]*") {
        #                                        print substr($0, RSTART, RLENGTH)
        #                                        }
        #                                    }' | sort -r | head -1)

        if [[ $NOVA_VERZIJA == $VERZIJA ]]; then
            print "Yo, nema novih setova za azuriranje, prekidam skriptu."
            exit
        else
            VERZIJA=$NOVA_VERZIJA
            FTP_PUTANJA="$FTP_RELENG/$TAG/$VERZIJA/i386/binary/sets"

            print "Nova verzija je $VERZIJA."

        #
        # Proveravamo dali smo u direktorijumu za smestaj setova
        #

            if [[ $(pwd) != $DWNLD_DIR ]]; then
                print "Prelazim u $DWNLD_DIR"
                cd $DWNLD_DIR
            fi

        #
        # Koristimo for petlju za skidanje setova i ispisujemo poruku za svaki
        #

            for SET in ${SETOVI[@]}; do
                    print "Skidam $SET set..."
                ftp $FTP_SAJT/$FTP_PUTANJA/${SET}.tgz
            done
        fi
    ;;
    installkernel)
        #
        # Cuvamo stari kernel tako da u slucaju da nesto krene pogresno uvek mozemo
        # da se vratimo i prilikom podizanja sistema ucitamo stari kernel
        #
        if [ -f $DWNLD_DIR/kern-GENERIC.tgz ]; then
            print "Cuvamo stari kernel kao netbsd.old..."
                 mv /netbsd /netbsd.old || ( print "Greska prilikom kopiranja" && exit 1 )
            print "Ekstraktujemo GENERIC kernel u / ..."
                 progress -zf $DWNLD_DIR/kern-GENERIC.tgz /rescue/tar -C / -xpf - || \
                                ( print "Greska prilikom ekstraktovanja kernela" && exit 1 )
            print ""
            print -n "Novi kernel ekstraktovan, restart sistema za ucitavanje novog kernela ( da/ne ): "
            while read ODGOVOR; do
                 case $ODGOVOR in
                     [Dd]|[Dd][Aa]) 
                         sync; sync; shutdown -r now ;;
                     [Nn]|[Nn][Ee])
                         print "Novi kernel ce se ucitati prilikom sledeceg podizanja sistema."
                         exit ;;
                     *) 
                         print "Odgovori sa [d]a ili [n]e"
                         continue ;;
                 esac
             done
        else
            print "kern-GENERIC ne postoji" && exit 1
        fi
    ;;
    installsets)
        #
        # Instaliramo svaki set osim 'etc.tgz' i 'xetc.tgz'. Koristimo progress komandu za ugodne trenutke
        #

        for SET in ${SETOVI[@]}; do
            [[ ($SET == "etc") || ($SET == "xetc") ]] && continue
            print "Ekstraktujem set $SET..."
                progress -zf $DWNLD_DIR/$SET.tgz /rescue/tar -C / -xpf - 
        done
    ;;
    etcupdate)
        #
        # Azuriramo /etc direktorijum
        #

        /usr/sbin/etcupdate -s $DWNLD_DIR/etc.tgz -s $DWNLD_DIR/xetc.tgz
    ;;
    postinstall)
        #
        # Proveravamo zaostale i nepotrebne fajlove
        #

        /usr/sbin/postinstall -s $DWNLD_DIR/etc.tgz -s $DWNLD_DIR/xetc.tgz check
        #/usr/sbin/postinstall -s ~/etc.tgz fix
    ;;
    help)
        f_koriscenje
        ;;
    *)
        print ""
        print "Greska: nepoznati perametar $1"
        print ""
        f_koriscenje
        exit 1
    ;;
esac

Ah da, da objasnim zasto ksh a ne sh; skripta je prvobitno koristila coprocess, to je opcija koja je dostupna samo u ksh (i odnedavno u bash). Kada su preselili NetBSD-daily na http:// server nisam mogao vise da koristim tu opciju pa sam jednostavno izmenio skriptu. Naravno previse sam lenj da skriptu izmenim na sh, a jedino arrays treba da se srede. Ali ipak... big_smile:D

Evo i na pastebin ko zeli highlighted opcije: http://bsdsrbija.pastebin.com/m4d9d2797

The best way to learn UNIX is to play with it, and the harder you play, the more you learn.
If you play hard enough, you'll break something for sure, and having to fix a badly broken system is arguably the fastest way of all to learn. -Michael Lucas, AbsoluteBSD

Re: Skripta za azuriranje NetBSD sistema koristeci snapshot setove

Ko ne zeli komentare moze da ih ukloni sa sledecom sed skripticom:

$ cat nokoment.sed

1!{
     /^[[:blank:]]*#/d;
     /./,/^$/!d;
}

$ sed -f nokoment.sed getsets.ksh > getsets_bez_komentara.ksh

Edit: pojednostavljen regex

The best way to learn UNIX is to play with it, and the harder you play, the more you learn.
If you play hard enough, you'll break something for sure, and having to fix a badly broken system is arguably the fastest way of all to learn. -Michael Lucas, AbsoluteBSD

Re: Skripta za azuriranje NetBSD sistema koristeci snapshot setove

A evo i skripte "u akciji":

Skidanje setova:

nbsd$ ./getset.script getsets                                                                                
Nova verzija je 200909140000Z
Prelazim u /home/soxxx/netbsd_sets
Skidam base set...
Requesting http://nyftp.netbsd.org/pub/NetBSD-daily/netbsd-5/200909140000Z/i386/binary/sets/base.tgz
100% |*****************************************************************************| 26241 KiB  189.47 KiB/s    00:00 ETA
26870857 bytes retrieved in 02:18 (189.47 KiB/s)
Skidam comp set...
Requesting http://nyftp.netbsd.org/pub/NetBSD-daily/netbsd-5/200909140000Z/i386/binary/sets/comp.tgz
100% |*****************************************************************************| 37822 KiB  189.44 KiB/s    00:00 ETA
38730622 bytes retrieved in 03:19 (189.44 KiB/s)
Skidam etc set...
Requesting http://nyftp.netbsd.org/pub/NetBSD-daily/netbsd-5/200909140000Z/i386/binary/sets/etc.tgz
100% |*****************************************************************************|   367 KiB  157.78 KiB/s    00:00 ETA
376257 bytes retrieved in 00:02 (157.75 KiB/s)
Skidam kern-GENERIC set...
Requesting http://nyftp.netbsd.org/pub/NetBSD-daily/netbsd-5/200909140000Z/i386/binary/sets/kern-GENERIC.tgz
 32% |************************                                                     |  1632 KiB  181.04 KiB/s    00:18 ETA

Instaliranje kernela:

nbsd$ sudo ./getset.script installkernel 
Cuvamo stari kernel kao netbsd.old...
Ekstraktujemo GENERIC kernel u / ...
100% |*****************************************************************************| 11470 KiB   41.90 MiB/s    00:00 ETA

Novi kernel ekstraktovan, restart sistema za ucitavanje novog kernela ( da/ne ): n
Novi kernel ce se ucitati prilikom sledeceg podizanja sistema.

Instaliranje setova:

nbsd$ sudo ./getset.script installsets 
Ekstraktujem set base...
100% |**************************************************************************************| 77550 KiB    9.82 MiB/s    00:00 ETA
Ekstraktujem set comp...
100% |**************************************************************************************|   130 MiB    9.22 MiB/s    00:00 ETA
Ekstraktujem set kern-GENERIC...
100% |**************************************************************************************| 11470 KiB   36.95 MiB/s    00:00 ETA
Ekstraktujem set man...
100% |**************************************************************************************| 50790 KiB   13.91 MiB/s    00:00 ETA
Ekstraktujem set misc...
100% |**************************************************************************************| 12310 KiB   23.33 MiB/s    00:00 ETA
Ekstraktujem set tests...
100% |**************************************************************************************|  8410 KiB    5.73 MiB/s    00:00 ETA
Ekstraktujem set text...
100% |**************************************************************************************|  9830 KiB   18.97 MiB/s    00:00 ETA
Ekstraktujem set xbase...
 82% |**********************************************************************                | 17399 KiB    8.47 MiB/s    00:00 ETA

The best way to learn UNIX is to play with it, and the harder you play, the more you learn.
If you play hard enough, you'll break something for sure, and having to fix a badly broken system is arguably the fastest way of all to learn. -Michael Lucas, AbsoluteBSD

Re: Skripta za azuriranje NetBSD sistema koristeci snapshot setove

E, svaka ti dala za ovo, evo bas se zadnjih dana nesto smaram sa NetBSD-om. Ovo ce mi dobro doci, posto sam slab sa skriptingom.

Nego, soxxx, primetio sam da ti od svihBSD-ova, najvise lezi NetBSD, ili mi se cini?

"If 386BSD had been available when I started on Linux, Linux would probably never had happened." Linus Torvalds

Re: Skripta za azuriranje NetBSD sistema koristeci snapshot setove

Ma BSD je BSD...salim se, koristim ja i OpenBSD i FreeBSD, ali sam trenutno nesto zastao na NetBSD... smile

Inace verujem da skripta uz neke izmene moze da se preuredi da radi i na ostalim BSD sistemima, tako da nije vezana za NetBSD.

The best way to learn UNIX is to play with it, and the harder you play, the more you learn.
If you play hard enough, you'll break something for sure, and having to fix a badly broken system is arguably the fastest way of all to learn. -Michael Lucas, AbsoluteBSD

Re: Skripta za azuriranje NetBSD sistema koristeci snapshot setove

Evo novije verzije skripte. Ispravio sam nekoliko gresaka, uklonio postinstall (pokrece se na kraju etcupdate) i dodao dosta provera. Uklonio sam sve komentare. Zasto? Pitajte meku. big_smile Ocekujem komentare i kritike za poboljsanje skripte. wink

#!/bin/ksh
#    getsets.ksh v.0.2
#    dalibor Dot gudzic At gmail Dot com
#    www.bsdserbia.org
#    11/2009
#

DWNLD_DIR="/home/soxxx/netbsd_sets"
FTP_SAJT="http://nyftp.netbsd.org"
FTP_OPCIJE="ftp -o -"
FTP_RELENG="pub/NetBSD-daily"
TAG="netbsd-5"
VERZIJA="$(awk -F\' '/BUILDID/ { print $2 }' /etc/release)"

set -A SETOVI "base.tgz comp.tgz etc.tgz kern-GENERIC.tgz man.tgz misc.tgz tests.tgz \
            text.tgz xbase.tgz xcomp.tgz xetc.tgz xfont.tgz xserver.tgz"

f_koriscenje() {
cat <<EOF

Pokretanje skripte: ${0##*/} <getsets | installkernel | installsets | etcupdate | help>

    getsets          -    Preuzimanje setova sa ftp servera
    installkernel    -    Ekstraktovanje i instaliranje GENERIC kernela
    installsets      -    Instaliranje setova
    etcupdate        -    Azuriranje, spajanje konfiguracionih fajlova u /etc direktorijumu
    help             -    Prikaz pravilnog pokretanja skripte

Osim u slucaju preuzimanja setova, za pravilno izvrsenje skripte potrebno je skriptu pokrenuti sa:

    sudo ${0##*/} parametar

EOF
}

f_provera_greske() {
    greska=$?
    print ""
    test "greska" -eq "$1" && print "$2" && exit $1
}

if [[ $# -ne 1 ]]
then
    print "Greska: potreban je (samo) jedan parametar za izvrsenje skripte jebi ga."
    f_koriscenje
    exit 1
fi

case $1 in
    getsets)
        NOVA_VERZIJA=$(ftp -o - $FTP_SAJT/$FTP_RELENG/$TAG/ | \
                            awk '{ if(match($0, "[0-9]+Z")) {
                                    print substr($0, RSTART, RLENGTH)
                                }
                            }' | sort -r | head -1)

        if [[ $NOVA_VERZIJA == $VERZIJA ]]; then
            print "Yo, nema novih setova za azuriranje, prekidam skriptu."
            exit 0
        else
            VERZIJA=$NOVA_VERZIJA
            print "Nova verzija je: $VERZIJA"
            FTP_PUTANJA="$FTP_RELENG/$TAG/$VERZIJA/i386/binary/sets"

            print -n "Proveravamo dali postoji direktorijum 'i386'..."
            
            ftp -o - $FTP_SAJT/$FTP_RELENG/$TAG/$VERZIJA | \
            awk '/i386/ {tu_je=1}
                    END{ if(tu_je)
                        {
                            print " prisutan na casu, nastavljamo."
                        }else{
                            print " odsutan. Neopravdani izostanak."
                            exit 33;
                        }
                    }'
            f_provera_greske 33 "Prekidam skriptu."
        
            print "Proveravamo unose..."

            ftp -o - $FTP_SAJT/$FTP_PUTANJA/ | \
            awk -v S="$SETOVI" 'BEGIN {
                        split(S " SHA512 MD5", niz_setova)
                    }
                    {
                        for(i in niz_setova) {
                            if($0 ~ niz_setova[i]) {
                                nadjeno_niz[niz_setova[i]]++
                            }
                        }
                    }
                    END {
                        for(j in niz_setova) {
                            if(niz_setova[j] in nadjeno_niz) {
                                print "Set " niz_setova[j] " je na serveru."
                            } else {
                                print "Set " niz_setova[j] " nije pronadjen na serveru."
                                n++
                            }
                        } if(n>0)
                            exit 44;
                    }'
            f_provera_greske 44 "Neki setovi nisu nadjeni. Prekidam skriptu."

            if [[ $(pwd) != $DWNLD_DIR ]]; then
                print "Prelazim u $DWNLD_DIR"
                cd $DWNLD_DIR
                f_provera_greske 1 "Greska prilikom prelaska u $DWNLD_DIR."
            fi

            for SET in ${SETOVI[@]}; do
                    print "Skidam set ==> $SET..."
                ftp $FTP_SAJT/$FTP_PUTANJA/$SET
                f_provera_greske 1 "Greska prilikom preuzimanja seta $SET."
            done
        fi
    ;;
    installkernel)
        if [ -f $DWNLD_DIR/kern-GENERIC.tgz ]; then
            print "Cuvamo stari kernel kao netbsd.old..."
                /bin/mv /netbsd /netbsd.old
                f_provera_greske 1 "Greska prilikom kopiranja kernela."

            print "Ekstraktujemo GENERIC kernel u / ..."
                /usr/bin/progress -zf $DWNLD_DIR/kern-GENERIC.tgz /bin/tar -C / -xpf -
                f_provera_greske 1 "Greska prilikom ekstraktovanja kernela."

            print ""
            print -n "Novi kernel ekstraktovan, restart sistema za ucitavanje novog kernela ( da/ne ): "

            while read ODGOVOR; do
            case $ODGOVOR in
                [Dd]|[Dd][Aa]) 
                    sync; sync; shutdown -r now ;;
                [Nn]|[Nn][Ee])
                    print "Novi kernel ce se ucitati prilikom sledeceg podizanja sistema."
                    exit ;;
                *) 
                    print "Odgovori sa [d]a ili [n]e"
                    continue ;;
            esac
        done
        else
            print "kern-GENERIC ne postoji" && exit 1
        fi
    ;;
    installsets)
        print "Proveravamo validnost arhiva:"; print ""
        for SET in ${SETOVI[@]}; do
            [[ $SET == "kern-GENERIC.tgz" ]] && continue
            print -n "Testiram arhivu ==> $SET ..."
                /bin/tar -tzvf $DWNLD_DIR/$SET >/dev/null 2>&1 && print " moze da prodje."
                f_provera_greske 1 " shajt, nesto smrdi u arhivi $SET. Prekidam skriptu"
        done
        print
        print "Sve arhive su (valjda) ispravne. :-) Nastavljamo dalje..."

        for SET in ${SETOVI[@]}; do
            [[ ($SET == "etc.tgz") || ($SET == "xetc.tgz") || ($SET == "kern-GENERIC.tgz") ]] && continue
            print "Ekstraktujem set ==> $SET..."
                /usr/bin/progress -zf $DWNLD_DIR/$SET /rescue/tar -C / -xpf -
                f_provera_greske 1 "Greska prilikom ekstraktovanja seta $SET."
        done
    ;;
    etcupdate)
        /usr/sbin/etcupdate -s $DWNLD_DIR/etc.tgz -s $DWNLD_DIR/xetc.tgz
    ;;
    help)
        f_koriscenje
        ;;
    *)
        print ""
        print "Greska: nepoznati perametar $1"
        print ""
        f_koriscenje
        exit 1
    ;;
esac

The best way to learn UNIX is to play with it, and the harder you play, the more you learn.
If you play hard enough, you'll break something for sure, and having to fix a badly broken system is arguably the fastest way of all to learn. -Michael Lucas, AbsoluteBSD

Re: Skripta za azuriranje NetBSD sistema koristeci snapshot setove

soxxx wrote:

Uklonio sam sve komentare. Zasto? Pitajte meku. big_smile

Svaka cast i hvala na trudu. Ja cu da kritikujem kad jos malo porastem, a za sada samo da kazem da se meni vise svidjalo sa komentarima. big_smile

Re: Skripta za azuriranje NetBSD sistema koristeci snapshot setove

Imas u gornjoj skripti vise manje posto nju necu da skidam za sada. Ako nesto nije jasno naravno slobdno pitaj, tu smo da pojasnimo koliko mozemo. wink

The best way to learn UNIX is to play with it, and the harder you play, the more you learn.
If you play hard enough, you'll break something for sure, and having to fix a badly broken system is arguably the fastest way of all to learn. -Michael Lucas, AbsoluteBSD