Das Script zum Thema „Clonen von Systemen : System updaten Teil 01 – 1“ braucht noch ein paar Erklärungen.
Allgemein:
Es geht bei meiner Art der Programmierung nicht um die Optimierung oder Performance von Code, sondern es soll für jedem der Code verständlich sein, der auch nur geringe Kenntnisse in Programmierung (egal welche Sprache) sein Eigen nennt.
Vor allen Dingen soll auch eine einfache Portierung möglich sein!
Es ist nämlich der Luxus von Linux, das es 1000 und 1 Lösungsmöglichkeiten für ein und dasselbe Problem gibt.
Komponeten-Aufbau des Scriptes:
1 2 3 4 5 6 |
++++__server__++++ --> Kennzeichnung für Server_type ++++__client__++++ --> Kennzeichnung für Client_type menue-03_sub.sh --> Hauptprogramm = Start function_lib.inc --> include Part von für Functions global_filename_update-ilb.inc --> include Part von Filenames global_var_update-ilb.inc --> include Part von Variablen/Constanten |
Dateien, die im laufenden Betrieb angelegt werden:
1 2 3 |
my_update.log --> Protokoll-Datei update_version.4 --> Steuerungdatei für Client, ob es aktuelle Updates gibt aktuelle_installierte_pkgliste --> bei bei jedem Programmaufruf neu geneniert |
Das Startprogramm oder
Menue.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
#!/bin/bash # # 20.12.2017 # # (c) Uwe von Royen # #---------------------------- # Programm für xxxxxxxxxxxxxx #---------------------------- # Programm: menue.sh # Version : 1.0.2 # Stand : 2018.01.07 #---------------------------- # # # ------------------------ # include # ------------------------ . global_filename_update-ilb.inc . global_var_update-ilb.inc . logging-ilb.inc . function_lib.inc #--------- menue_03() #--------- { if [ -e $system_server ] then titel=" ---- Server Steuerungs System ----" else titel=" ---- Client Steuerungs System ----" fi PS3=$(printf "\n Ihre Wahl: " ) ex=0 local func=${FUNCNAME[0]} local tmp=0 # ------ Automatik für Clients-WKS ------ if [ $automatic = "ON" ] then echo "Automatic is ON" temp=func func="automatic for client" logging 904 $func check_drive upgrade_system func=$temp logging 901 $func exit #### fi # ---------------------------------------- logging 900 $func while [ true ] do clear echo echo $titel echo if [ -e $system_server ] then options=("Update Server [+]" "Upgrade [-]" "Ende" ) else options=("Update [-]" "Upgrade Client [+]" "Ende" ) fi select opt in "${options[@]}" do opt-tmp="${opt:0:3}" case $opt-tmp in "Upd") if [ -e $system_server ] then printf " Update auf Server \n\n" build_update_version_filename file_name_update update_system logging 902 $func sleep 4 fi break ;; "Upg") if [ -e $system_client ] then printf " Upgrade auf Client \n\n" upgrade_system logging 903 $func sleep 6 fi break ;; "End") ex=1 break ;; *) echo printf "Falsche Auswahl, nur Ziffern von 1 bis 3 sind erlaubt!" sleep 2 echo clear break ;; esac done if [ $ex -eq 1 ] then break fi done logging 901 $func } exist_host $update_host $update_host_ip return_value=$? if [ $return_value -eq 0 ] then menue_03 fi |
global_var_update-ilb.inc
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# # include: # global_var_update-ilb.inc # # --------------------------------- # var / const # --------------------------------- # 0=apt_cache_ng / 1=CD oder Laufwerk / 2=apt-move update_method=1 automatic="OFF" # OFF file_name_update="update_version" section_declare=[Update] update_host="dummy" # für spätere DNS-Verwendung noch frei! update_host_ip="192.168.0.93" <--- IP des Servers (Master-PCs) system_client="++++__client__++++" system_server="++++__server__++++" |
global_filename_update-ilb.inc
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
# # include: # global_filename_update-ilb.inc # # --------------------------------- # apt-get install nfs-kernel-server ! muss installiert sein # auf den Client-Rechnern muß in einem geschlossenem # System ein /media/drive_proxy und /media/drive_update_daten vorhanden sein. # Path-Angaben auf Client mount_point="/media/update" mount_point_01="/bin/" client_path="/Daten/update/" client_path_sub=$client_path"old/" # 1x client_path_sub1=$client_path"bin/" client_path_sub2=$cient_path"cache/apt/archives" # client_upgrade_path_bin="/media/update/bin/" # 1x client_upgrade_path_bin=$mount_point$mount_point_01 # client_upgrade_path="/media/update/apt/archives" client_upgrade_path=$mount_point"/apt/archives" # Path-Angaben auf Update-Server / Proxy update_drive="/Daten" update_share=$update_drive"/update/cache" update_drive_daten="/cache/apt/" update_drive_daten_sub="apt/bin/" update_drive_server="/Daten/update/cache/apt/" # Auswertung "Modifiziert" - gibt den Zeitstempel der letzten Änderung des Dateiinhalts an. logging_file="my_update.log" |
logging-ilb.inc
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
#!/bin/bash # # include: # logging-ilb.inc # # --------------------------------- # logging() { error_numer=$1 error_function=$2 message_date=$(date "+%d.%m.%Y | %H:%M:%S -> ErrorNr:")$error_numer message_module=" im SourceFile: <<"$0">> in Function: <<"$error_function">> mit Fehlermeldung: " case "$1" in 1) message_error="Rechner-IP's sind nicht gleich!" ;; 2) message_error="Rechner existiert nicht!" ;; 3) message_error="Es ist kein passender Share auf dem Rechner freigeben!" ;; 3.1) message_error="Info: Laufwerk ist schon gemountet!" ;; 4) message_error="Das Mounting der Share konnte nicht durchgeführt werden!" ;; 5) message_error="Update_Versionsdatei ist nicht vorhanden!" ;; 6) message_error="Info: Kein aktuelles Update vorhanden" ;; 7) message_error="Info: Update über Methode-> CD/Files" ;; 8) message_error="Info: Update über Methode-> ProxyServer" ;; 9) message_error="Info: Update über Methode-> APT-MOVE Mirror" ;; 900) message_error="Info: Update wird installiert bzw. vorbereitet!" ;; 901) message_error="Info: Update / Upgrade wird verlassen!" ;; 902) message_error="Info: Update ist vorbereitet!" ;; 903) message_error="Info: Update / Upgrade ist durchgeführt!" ;; 904) message_error="Info: Automatic=ON -> for Client-WKS!" ;; *) message_error="Unbekannter Fehler!" ;; esac echo $message_date $message_module $message_error >> $logging_file } |
function_lib.inc
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 |
#!/bin/bash # # 20.12.2017 # # (c) Uwe von Royen # #---------------------------- # Programm für xxxxxxxxxxxxx #---------------------------- # Programm: function_lib.inc # Version : 1.0.2 # Stand : 2018.01.07 #---------------------------- exist_host() #----------- { local func=${FUNCNAME[0]} local tmp="" pc=$1 #echo $pc # ist nicht weiter im Gebrauch! ip_nr=$2 #echo $ip_nr line=(`ping -c 2 $ip_nr | grep -E -o \ "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\ .(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\ .(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\ .(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?:) ([tty=64]?)" `) laenge="${#line}" if [ $laenge -gt 2 ] then v=0 b=$laenge-1 tmp="${line:$v:$b}" if [ "$tmp" != "$ip_nr" ] then logging 1 $func return 1 fi else logging 2 $func return 1 fi return 0 } check_drive() #------------ { local func=${FUNCNAME[0]} local drive_gemounted=1 # 1=nicht gemountet, 0=gemountet local tmp="" local laenge tmp=$( showmount -e --no-headers $update_host_ip | grep $update_share ) laenge="${#tmp}" if [ $laenge = 0 ] then logging 3 $func echo "Kein Laufwerk gemountet!" #return 1 fi # Test ob Laufwerk gemountet ist # mount -o 192.168.0.97:Daten/update-drive /media/Laufwerk_X tmp=$( mount | grep -o $update_host_ip:$update_share ) if mount | grep $update_host_ip:$update_share > /dev/null 2>&1 then echo "gemountet" drive_gemounted=0 logging 3.1 $func else # z.B.: mount 192.168.0.97:Daten/update-drive /media/Laufwerk_X #echo $update_host_ip:$update_share $mount_point echo "Laufwerk wird gemountet" sudo mount $update_host_ip:$update_share $mount_point > /dev/null 2>&1 # Erfolreiche Ausführung Wert=0, Fehler Wert>0 tmp=$? if [ $tmp != 0 ] then echo "Laufwerk kann nicht gemountet werden!" echo "Programm wird abgebrochen." logging 4 $func return 1 fi fi } build_update_version_filename() #------------------------------ { # wird zusammen beim Erstellen der Update-Dateien # automatisch mit erzeugt auf dem Server! local func=${FUNCNAME[0]} #local tmp_1="[Update]" local tmp_1=$section_declare local tmp_2=$(date "+%d.%m.%Y | %H:%M:%S") local old_filename=$1 local return_value=$old_filename local new_filename="" local tmp_3="" local file_number=0 local filename="" # $update_drive_server filename=$(ls | grep $file_name_update) if [ -a $filename ] then echo "Incrementiere Version" echo $old_filename l0=${#filename} l=${#file_name_update} l1=$((l+1)) l2=${#file_name_update} file_number=${filename:l1:l0} file_number=$((file_number+1)) # altes File löschen rm -f $filename fi file_number="."$file_number tmp_3=$file_name_update$file_number new_filename=$tmp_3 echo -e $tmp_1 > $tmp_3 echo $tmp_2 >> $tmp_3 } section_ermitteln() { # Section : [Update] -> [xxxxx]! local func=${FUNCNAME[0]} local str=$1 local l=0 local tmp="" l=`expr length $str` tmp=${str:0:l} echo $tmp } check_upgrade_version_filename() { local func=${FUNCNAME[0]} local tmp="" local laenge local l=0 local l1=0 local tmp_file="000000000" logging 7 $func #local content_tmp="" #local content_tmp_1="" #local line_01="" # Auswertung "Modifiziert" - gibt den Zeitstempel der letzten Änderung des Dateiinhalts auf Server an. #stat -c %Y $mount_point$file_name_update #tmp1=$( ls $mount_point$mount_point_01 ) tmp=$( ls $mount_point$mount_point_01 | grep 'update_version.' ) l=`expr length $tmp` l1=`expr length $file_name_update` t=${tmp:0:l1} ##cat $mount_point$update_drive_daten_sub$tmp >| $client_path_sub1$tmp_file cat $client_upgrade_path_bin$tmp >| $client_path_sub1$tmp_file if [ "$t" != "$file_name_update" ] then l=0 #echo $t "-" $file_name_update fi #echo $t "-" $file_name_update if [ $l -ne 0 ] then # existiert tmp=$( stat -c %Y $mount_point$mount_point_01$tmp ) tmp_1=$( ls -F $client_path | grep -v "/$" ) laenge="${#tmp_1}" #echo $tmp "-" $tmp_1 if [ "$tmp" != "$tmp_1" ] then #echo "ungleich" if [ $laenge != 0 ] then #echo 2: $client_path$tmp_1 $client_path_sub$tmp_1 mv $client_path$tmp_1 $client_path_sub$tmp_1 fi mv $client_path_sub1$tmp_file $client_path$tmp upgrade_files else if [ "$tmp" = "$tmp_1" ] then echo "Keine aktuellen Informationen" else logging 6 $func upgrade_files fi fi else echo "update-version fehlt" logging 5 $func fi } upgrade_files() { #ls $upgrade_drive_server #apt --download-only --reinstall -y install $client_upgrade_path/*.deb apt -y install $client_upgrade_path/*.deb # #oder # dpkg -i $client_upgrade_path/*.deb # apt-get -y autoclean apt-get -y autoremove reboot now } update_system() #-------------- { echo "Update System" sleep 2 clear echo " *** APT UPDATE *** " apt update sleep 3 clear echo " *** APT DOWNLOAD *** " COLUMNS=200 dpkg -l | grep '^ii' | awk '{ print $2 }' > aktuelle_installierte_pkgliste cat aktuelle_installierte_pkgliste | xargs apt-get --download-only --reinstall -y install sleep 3 clear echo " *** Build Packages *** " cd $client_path_sub2 dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz } upgrade_system() { echo "Upgrade System" # check_drive > 0 dann liegt ein Fehler vor! check_drive if [ $? -ne 0 ]; then echo "error" else echo "ok" check_upgrade_version_filename fi #check_upgrade_version_filename } |
Vorbereitung des Servers bzw. Master-PC’s
_________________________________________________
—- Server Steuerungs System —-
1) Update Server [+]
2) Upgrade [-]
3) Ende
Ihre Wahl:
_________________________________________________
Dateiverzeichnisse anlegen:
/Daten/update/cache/apt
Hier wird automatisch folgendes angelegt:
archives <– Verzeichnis
pkgcache.bin <– Datei
srcpkgcache.bin <– Datei
Es handelt sich um das Cache-Verzeichnis, welches eigentlich und /var/cache/apt zu finden ist.
Verlegung des Verzeichnisses geschieht wie folgt:
/etc/apt/apt.conf.d
anlegen einer Datei im Format: 00xxxxxxx
Ich benenne die Datei z.B.: 00update-archives
Inhalt: dir::cache /Daten/update/cache/apt/ ;
In der Datei: sources.list muss in der Regel beim Server (Master-PC) nichts geändert werde. Das gut ist es muss kein Dient neu gestartet werde.
Jetzt ruft man auf:
apt update
und lädt die *deb herunter, das Alles über nimmt aber das Script.
/Daten/update/cache/bin
in das /bin Verzeichniss kommen die Dateien:
menue-03_sub.sh
function_lib.inc
global_filename_update-ilb.inc
global_var_update-ilb.inc
logging-ilb.inc
++++__server__++++
! /etc/exports > nfs-server installieren
Inhalt:
/Daten/update/cache/ 192.168.0.0/24(rw,async,insecure,no_subtree_check,no_auth_nlm)
Vorbereitung des Clients (Work-PCs)
________________________________________________
—- Client Steuerungs System —-
1) Update [-]
2) Upgrade Client [+]
3) Ende
Ihre Wahl:
________________________________________________
Dateiverzeichnisse anlegen:
z.B.:
/Daten/update/bin
in das /bin Verzeichniss kommen die Dateien:
menue-03_sub.sh
function_lib.inc
global_filename_update-ilb.inc
global_var_update-ilb.inc
logging-ilb.inc
++++__client__++++
/Daten/update/old
Das System merkt, wenn sich die Datei „update_version.x“ { x: xЄℕ} auf dem Server ( Zeitstempel) sich geändert hat. Existiert schon eine „Merkdatei: 1515427394“ in dem Verzeichnis /Daten/update auf dem Client mit älterem Eintrag, so wird diese in das Verzeichnis /old kopiert und eine neue Datei angelegt. Es nimmt eine Auswertung „Modifiziert“ vor – gibt den Zeitstempel der letzten Änderung des Dateiinhalts auf Server an.
/Daten/update/apt
Hier wird automatisch folgendes angelegt:
archives <– Verzeichnis
pkgcache.bin <– Datei
srcpkgcache.bin <– Datei
Es handelt sich um das Cache-Verzeichnis, welches eigentlich und /var/cache/apt zu finden ist.
Verlegung des Verzeichnisses geschieht wie folgt:
/etc/apt/apt.conf.d
anlegen einer Datei im Format: 00xxxxxxx
Ich benenne die Datei z.B.: 00update-archives
Inhalt: Dir{Cache /Daten/update/apt} oder die andere Schreibweise
dir::cache /Daten/update/apt/ ;
In der Datei: sources.list muss in der Regel beim Client (Work-PC) folgendes geändert werden:
Datei sources.list umbenennen in sources.list.org
Datei neu anlegen: entweder touch sources.list oder nano sources.list mit dem Inhalt: deb [trusted=yes] file:///media/update/apt/archives ./
Das gut ist es muss kein Dient neu gestartet werde.
/media/update
Verzeichnis /update z.B.: muss angelegt werden. Viele sagen das das Verzeichnis in /mnt angelegt werden sollte, aber ich habe es lieber im /media Verzeichnis, weil nur temporär das Verzeichnis mit den /*.deb Dateien vom Server gemountet wird.
Damit alles rund läuft muss unbedingt noch ‚nfs-common‚ installiert werden bzw. in das Client-Image aufgenommen werden. Zusätzlich kann, muss aber nicht unbedingt die beiden Programme „dpkg-dev„, „apt-offline“ und „aptitude“ mit ins Client-Image aufgenommen werden.