Diese Seite ist optimiert für eine Auflösung von min. 1280x1024.

facebook   google   twitter   digg   email  





Dialog



Ein Beispiel, wie man Scripte schreibt mittels "dalog" mit einem Shellscript, das Dienste restarten kann, den Server neu booten kann und Backups erstellen kann. Zudem sieht man auch noch, wie man auf Rootservern Backups erstellt etc. Das Script ist schon etwas älter, ein paar Sachen würde ich heute anders machen, aber es ist recht gut dokumentiert und das Beispiel für Dialog ist eigentlich recht gut dargestellt.

Dialogscripte sehen so hier aus:
dialog.jpg
Das Script an sich sieht so hier aus:
#!/bin/sh
# Standardfehlerausgabe abschalten:
exec 2>&-
#(Signale 2 und 15 abfangen und mit Aufräumarbeiten behandeln)
trap 'rm ~/tmp{1,2}.$$; clear; exit 0' 2 15
#adresse des Backupservers:
BACKUPSERVER=backupxx.alturo-server.de
dialog  --backtitle "Shell-Tool"\
	--clear\
	--title "Aufgerufene Datei: $0"\
	--radiolist 'Was willst du machen?' 10 60 5\
	'1' 'Dienste restarten' off\
	'2' 'Backup-Optionen' off\
	'3' 'Server rebooten' off\
	2> ~/tmp1.$$
OPTION1=$(cat ~/tmp1.$$)
rm ~/tmp1.$$
case "$OPTION1" in
	   1) 
		dialog  --backtitle "Shell-Tool"\
			--clear\
			--title "Aufgerufene Datei: $0"\
			--radiolist 'Welcher Dienst soll restartet werden??' 20 80 15\
			'1' 'Apache2      (Webserver)' off\
			'2' 'Bind9        (Nameserver)' off\
			'3' 'cron         (Cronjobs)' off\
			'4' 'inetd        (Superdaemon)' off\
			'5' 'MySQL        (Datenbank)' off\
			'6' 'Networking   (Netzwerk-Dienste)' off\
			'7' 'Postfix      (Email-POP-Dienst)' off\
			'8' 'Quota        (Speicherplatz-UEberwachung)' off\
			'9' 'SSH          (Secure Socket Shell)' off\
			'10' 'Spamassassin (Mailfilter)' off\
			'11' 'Sysklogd     (Ereignis-Dienst)' off\
			'12' 'vsFTPd       (FTP)' off\
			'13' 'ALLE ANGEGEBENEN DIENSTE' off\
			2> ~/tmp2.$$
			OPTION2=$(cat ~/tmp2.$$)
			rm ~/tmp2.$$

			case "$OPTION2" in
			 	  1)
         	   			dialog --backtitle "Eine Bestätigung des Dialogs fuehrt die Aktion sofort aus!" --yesno "Apache2 restarten?" 6 70
		   			case $? in
					   0)
						/etc/init.d/apache2 restart > /dev/null 2>&1
						dialog --infobox "Done." 5 50
					   
					   ;;
					   1)
						 dialog --infobox "Aktion abgebrochen!!!" 5 50
					   ;;
					   esac
					   $0
					
				  ;;
			 	  2)
         	   			dialog --backtitle "Eine Bestätigung des Dialogs fuehrt die Aktion sofort aus!" --yesno "Bind9 restarten?" 6 70
		   			case $? in
					   0)
						/etc/init.d/named restart > /dev/null 2>&1
						dialog --infobox "Done." 5 50
					   
					   ;;
					   1)
						 dialog --infobox "Aktion abgebrochen!!!" 5 50
					   ;;
					   esac
					   $0
					
				  ;;
			 	  3)
         	   			dialog --backtitle "Eine Bestätigung des Dialogs fuehrt die Aktion sofort aus!" --yesno "Cron restarten?" 6 70
		   			case $? in
					   0)
						/etc/init.d/cron restart > /dev/null 2>&1
						dialog --infobox "Done." 5 50
					   
					   ;;
					   1)
						 dialog --infobox "Aktion abgebrochen!!!" 5 50
					   ;;
					   esac
					   $0
					
				  ;;
			 	  4)
         	   			dialog --backtitle "Eine Bestätigung des Dialogs fuehrt die Aktion sofort aus!" --yesno "inetd restarten?" 6 70
		   			case $? in
					   0)
						/etc/init.d/inetd restart > /dev/null 2>&1
						dialog --infobox "Done." 5 50
					   
					   ;;
					   1)
						 dialog --infobox "Aktion abgebrochen!!!" 5 50
					   ;;
					   esac
					   $0
					
				  ;;
			 	  5)
         	   			dialog --backtitle "Eine Bestätigung des Dialogs fuehrt die Aktion sofort aus!" --yesno "MySQL restarten?" 6 70
		   			case $? in
					   0)
						/etc/init.d/mysql restart > /dev/null 2>&1
						dialog --infobox "Done." 5 50
					   
					   ;;
					   1)
						 dialog --infobox "Aktion abgebrochen!!!" 5 50
					   ;;
					   esac
					   $0
					
				  ;;
			 	  6)
         	   			dialog --backtitle "Eine Bestätigung des Dialogs fuehrt die Aktion sofort aus!" --yesno "Networking restarten?" 6 70
		   			case $? in
					   0)
						/etc/init.d/networking restart > /dev/null 2>&1
						dialog --infobox "Done." 5 50
					   
					   ;;
					   1)
						 dialog --infobox "Aktion abgebrochen!!!" 5 50
					   ;;
					   esac
					   $0
					
				  ;;
			 	  7)
         	   			dialog --backtitle "Eine Bestätigung des Dialogs fuehrt die Aktion sofort aus!" --yesno "Postfix restarten?" 6 70
		   			case $? in
					   0)
						/etc/init.d/postfix restart > /dev/null 2>&1
						dialog --infobox "Done." 5 50
					   
					   ;;
					   1)
						 dialog --infobox "Aktion abgebrochen!!!" 5 50
					   ;;
					   esac
					   $0
					
				  ;;
			 	  8)
         	   			dialog --backtitle "Eine Bestätigung des Dialogs fuehrt die Aktion sofort aus!" --yesno "Quota restarten?" 6 70
		   			case $? in
					   0)
						/etc/init.d/quota restart > /dev/null 2>&1
						dialog --infobox "Done." 5 50
					   
					   ;;
					   1)
						 dialog --infobox "Aktion abgebrochen!!!" 5 50
					   ;;
					   esac
					   $0
					
				  ;;
			 	  9)
         	   			dialog --backtitle "Eine Bestätigung des Dialogs fuehrt die Aktion sofort aus!" --yesno "SSH restarten?" 6 70
		   			case $? in
					   0)
						/etc/init.d/ssh restart > /dev/null 2>&1
						dialog --infobox "Done." 5 50
					   
					   ;;
					   1)
						 dialog --infobox "Aktion abgebrochen!!!" 5 50
					   ;;
					   esac
					   $0
					
				  ;;
			 	  10)
         	   			dialog --backtitle "Eine Bestätigung des Dialogs fuehrt die Aktion sofort aus!" --yesno "Spamassassin restarten?" 6 70
		   			case $? in
					   0)
						/etc/init.d/spamassassin restart > /dev/null 2>&1
						dialog --infobox "Done." 5 50
					   
					   ;;
					   1)
						 dialog --infobox "Aktion abgebrochen!!!" 5 50
					   ;;
					   esac
					   $0
					
				  ;;
			 	  11)
         	   			dialog --backtitle "Eine Bestätigung des Dialogs fuehrt die Aktion sofort aus!" --yesno "Sysklogd restarten?" 6 70
		   			case $? in
					   0)
						/etc/init.d/sysklogd restart > /dev/null 2>&1
						dialog --infobox "Done." 5 50
					   
					   ;;
					   1)
						 dialog --infobox "Aktion abgebrochen!!!" 5 50
					   ;;
					   esac
					   $0
				  ;;
			 	  12)
         	   			dialog --backtitle "Eine Bestätigung des Dialogs fuehrt die Aktion sofort aus!" --yesno "vsFTPd restarten?" 6 70
		   			case $? in
					   0)
						/etc/init.d/vsftpd restart > /dev/null 2>&1
						dialog --infobox "Done." 5 50
					   
					   ;;
					   1)
						 dialog --infobox "Aktion abgebrochen!!!" 5 50
					   ;;
					   esac
					   $0
				  ;;
			 	  13)
         	   			dialog --backtitle "Eine Bestätigung des Dialogs fuehrt die Aktion sofort aus!" --yesno "ALLE DIENSTE RESTARTEN? (IM NORMALFALL NICHT ERFORDERLICH!!!)" 6 70
		   			case $? in
					   0)
						/etc/init.d/apache2 restart > /dev/null 2>&1
						/etc/init.d/bind9 restart > /dev/null 2>&1
						/etc/init.d/cron restart > /dev/null 2>&1
						/etc/init.d/inetd restart > /dev/null 2>&1
						/etc/init.d/mysql restart > /dev/null 2>&1
						/etc/init.d/networking restart > /dev/null 2>&1
						/etc/init.d/postfix restart > /dev/null 2>&1
						/etc/init.d/quota restart > /dev/null 2>&1
						/etc/init.d/ssh restart > /dev/null 2>&1
						/etc/init.d/spamassassin restart > /dev/null 2>&1
						/etc/init.d/sysklogd restart > /dev/null 2>&1
						/etc/init.d/vsftpd restart > /dev/null 2>&1
						dialog --infobox "Done." 5 50
					   
					   ;;
					   1)
						 dialog --infobox "Aktion abgebrochen!!!" 5 50
					   ;;
					   esac
					   $0
				  ;;
				  esac
	   ;;
	   2) 
		dialog  --backtitle "Shell-Tool"\
			--clear\
			--title "Aufgerufene Datei: $0"\
			--radiolist 'Backup-Optionen' 20 80 15\
			'1' 'Inkrementelles Backup starten' off\
			'2' 'Explizite Ordner backuppen' off\
			'3' '/etc backupen' off\
			'4' '/root backuppen' off\
			'5' '/usr backuppen' off\
			2> ~/tmp3.$$
			OPTION3=$(cat ~/tmp3.$$)
			rm ~/tmp3.$$

			case "$OPTION3" in
			 	  1)
         	   			dialog --backtitle "Eine Bestätigung des Dialogs fuehrt die Aktion sofort aus!" --yesno "Inkrementelles Backup starten?" 6 70
		   			case $? in
					   0)
						/home/tools/inkrementelles_backup.sh > /dev/null 2>&1
						dialog --infobox "Done." 5 50
					   
					   ;;
					   1)
						 dialog --infobox "Aktion abgebrochen!!!" 5 50
					   ;;
					   esac
					   $0
				  ;;
			 	  2)
			         	dialog --clear --title "Zu backuppende Verzeichnisse mit Space getrennt angeben!"  \
				               --inputbox "Z.B.: /home/kunden /var" 10 50 \
				               2>~/tmp4.$$
					       BACKUP_FOLDER=`cat ~/tmp4.$$`
				
				dialog --backtitle "Eine Bestätigung des Dialogs fuehrt die Aktion sofort aus!" --yesno "Ordner ${BACKUP_FOLDER} backuppen?" 6 70
					   case $? in
					   0)
						
						# Name der Backup-Datei
						BACKUP_FILE="$(date -d "now" +%Y-%b-%d_%H:%M:%S)_explizit.tar.gz"
						
						# temporaerer Speicherort des Backup-Archivs
						BACKUP_TMP="/home/backup/"
						
						# kompletter Pfad zum Backup
						BACKUP=${BACKUP_TMP}${BACKUP_FILE}
						# Verzeichnisse die gesichert werden sollen
						# in diesem Beispiel sind dies die Kunden Webseiten und E-Mails
						BACKUP_DATA="${BACKUP_FOLDER}" 
				
						#pfad auf dem ftp-server
						BACKUP_DIR="/manuell/"
						# alte UMASK sichern
						UMASK=`umask`
			
						umask 0077
						tar --exclude=${BACKUP} -czf ${BACKUP} ${BACKUP_DATA} 2>/dev/null
						md5sum ${BACKUP} > ${BACKUP}.md5
						echo "\$ backup ${BACKUP} ${BACKUP_DIR}${BACKUP_FILE}" | pftp ${BACKUPSERVER}
						rm -f ${BACKUP} ${BACKUP}.md5
						umask ${UMASK}
						
						dialog --infobox "Done." 5 50
					   
					   ;;
					   1)
						 dialog --infobox "Aktion abgebrochen!!!" 5 50
					   ;;
					   esac
					   $0
			 	   ;;
			 	  3)
			        	 dialog --backtitle "Eine Bestätigung des Dialogs fuehrt die Aktion sofort aus!" --yesno "Ordner /etc backuppen?" 6 70
					   case $? in
					   0)
						
						# Name der Backup-Datei
						BACKUP_FILE="$(date -d "now" +%Y-%b-%d)_etc.tar.gz"
						
						# temporaerer Speicherort des Backup-Archivs
						BACKUP_TMP="/home/backup/"
						
						# kompletter Pfad zum Backup
						BACKUP=${BACKUP_TMP}${BACKUP_FILE}
						# Verzeichnisse die gesichert werden sollen
						# in diesem Beispiel sind dies die Kunden Webseiten und E-Mails
						BACKUP_DATA="/etc" 
				
				
						#pfad auf dem ftp-server
						BACKUP_DIR="/manuell/"
						# alte UMASK sichern
						UMASK=`umask`
			
						umask 0077
						tar --exclude=${BACKUP} -czf ${BACKUP} ${BACKUP_DATA} 2>/dev/null
						md5sum ${BACKUP} > ${BACKUP}.md5
						echo "\$ backup ${BACKUP} ${BACKUP_DIR}${BACKUP_FILE}" | pftp ${BACKUPSERVER} >/dev/null
						rm -f ${BACKUP} ${BACKUP}.md5
						umask ${UMASK}
						dialog --infobox "Done." 5 50
					   
					   ;;
					   1)
						 dialog --infobox "Aktion abgebrochen!!!" 5 50
					   ;;
					   esac
					   $0
			 	   ;;
			 	  4)
			        	 dialog --backtitle "Eine Bestätigung des Dialogs fuehrt die Aktion sofort aus!" --yesno "Ordner /root backuppen?" 6 70
					   case $? in
					   0)
						
						# Name der Backup-Datei
						BACKUP_FILE="$(date -d "now" +%Y-%b-%d)_root.tar.gz"
						
						# temporaerer Speicherort des Backup-Archivs
						BACKUP_TMP="/home/backup/"
						
						# kompletter Pfad zum Backup
						BACKUP=${BACKUP_TMP}${BACKUP_FILE}
						# Verzeichnisse die gesichert werden sollen
						# in diesem Beispiel sind dies die Kunden Webseiten und E-Mails
						BACKUP_DATA="/root"
				
						#pfad auf dem ftp-server
						BACKUP_DIR="/manuell/"
						# alte UMASK sichern
						UMASK=`umask`
			
						umask 0077
						tar --exclude=${BACKUP} -czf ${BACKUP} ${BACKUP_DATA} 2>/dev/null
						md5sum ${BACKUP} > ${BACKUP}.md5
						echo "\$ backup ${BACKUP} ${BACKUP_DIR}${BACKUP_FILE}" | pftp ${BACKUPSERVER} >/dev/null
						rm -f ${BACKUP} ${BACKUP}.md5
						umask ${UMASK}
						
						dialog --infobox "Done." 5 50
					   
					   ;;
					   1)
						 dialog --infobox "Aktion abgebrochen!!!" 5 50
					   ;;
					   esac
					   $0
			 	   ;;
			 	  5)
			        	 dialog --backtitle "Eine Bestätigung des Dialogs fuehrt die Aktion sofort aus!" --yesno "Ordner /usr backuppen?" 6 70
					   case $? in
					   0)
						
						# Name der Backup-Datei
						BACKUP_FILE="$(date -d "now" +%Y-%b-%d)_usr.tar.gz"
						
						# temporaerer Speicherort des Backup-Archivs
						BACKUP_TMP="/home/backup/"
						
						# kompletter Pfad zum Backup
						BACKUP=${BACKUP_TMP}${BACKUP_FILE}
						# Verzeichnisse die gesichert werden sollen
						# in diesem Beispiel sind dies die Kunden Webseiten und E-Mails
						BACKUP_DATA="/usr" 
				
						#pfad auf dem ftp-server
						BACKUP_DIR="/manuell/"
						# alte UMASK sichern
						UMASK=`umask`
			
						umask 0077
						tar --exclude=${BACKUP} -czf ${BACKUP} ${BACKUP_DATA} 2>/dev/null
						md5sum ${BACKUP} > ${BACKUP}.md5
						echo "\$ backup ${BACKUP} ${BACKUP_DIR}${BACKUP_FILE}" | pftp ${BACKUPSERVER} >/dev/null
						rm -f ${BACKUP} ${BACKUP}.md5
						umask ${UMASK}
						
						
						dialog --infobox "Done." 5 50
					   
					   ;;
					   1)
						 dialog --infobox "Aktion abgebrochen!!!" 5 50
					   ;;
					   esac
					   $0
			 	   ;;
				   esac
	   ;;
	   3) 
         	   dialog --backtitle "Eine Bestätigung des Dialogs fuehrt die Aktion sofort aus!" --yesno "Server Rebooten? (Für die Zeit des Rebootens wird der Server nicht erreichbar sein!!!)" 6 70
		   case $? in
		   0)
			/sbin/reboot
			dialog --infobox "Done." 5 50
		   
		   ;;
		   1)
			 dialog --infobox "Aktion abgebrochen!!!" 5 50
		   ;;
		   esac
		   $0
	   ;;
	   6) 
        	   dialog --backtitle "Eine Bestätigung des Dialogs fuehrt die Aktion sofort aus!" --yesno "Sitzung beenden und Gateway verlassen?" 6 70
		   case $? in
		   0)
			ps cax | grep bash | awk 'system("kill -9 " $1)'
			dialog --infobox "Done." 5 50
		   
		   ;;
		   1)
			 dialog --infobox "Aktion abgebrochen!!!" 5 50
		   ;;
		   esac
		   $0
	   ;;
esac
#         dialog --backtitle "Eine Bestätigung des Dialogs entfernt eine Datei unwiderruflich!" --yesno "Removing $x?" 6 70
#        dialog --infobox "Removing $x" 5 70
# Aufräumen erzwingen:
kill -INT $$
Damit die Backup-Funktionen auch Ihren Dienst tun, sind des weiteren noch Makro-Definitionen notwendig. Diese legt man in der Datei .netrc unter /root ab:
machine backupXX.alturo-server.de
login usrname
password passwort
macdef backup
put $1 $2
put $1.md5 $2.md5
quit

macdef killold
delete $1
delete $1.md5
quit


ACHTUNG: ES MUSS IN DER LETZTEN ZEILE EINE LEERE ZEILE VORHANDEN SEIN!!! Sonst tut das ganze nicht!

Erklärung:
machine backupxx-server.de
login username
password passwort

machine, login und passwort sind alles Variablen-Definitionen und dafür Zuständig, dass bei einer Verbindung zum FTP-Server kein Benutzername und Passwort angegeben werden müssen (sonst könnte man das Backup nicht automatisieren).
Das eigentliche Makro beginnt hier:
macdef backup
put $1 $2
put $1.md5 $2.md5
quit

Das Macro hat den Namen "backup", schiebt 2 mal 1 Datei auf den FTP-Server und beendet anschliessend die FTP-Verbindung. macdef steht hierbei für "macro definition". Es müssen immer 2 Werte an die Funktion übergeben werden. Der Dateiname lokal sowie der Dateiname auf dem Server. Dann wird die Datei sowie ihr md5-Hash auf den Server geladen:
echo "\$ backup ${BACKUP} ${BACKUP_DIR}${BACKUP_FILE}" | pftp ${BACKUPSERVER} >/dev/null
Dies wird in unserem Backup-Script auch durchgeführt. Fällt man obigen Befehl, so Sieht er wie folgt aus:
echo "\$ backup datei.tar.gz /backup_pfad_auf_ftp/backup.tar.gz" | pftp backupxx-server.de >/dev/null
Unser Macro macht dann folgendes:
Es lädt datei.tar.gz auf den FTP-Server in den Ordner "backup_pfad_auf_ftp" und nennt die Datei "backup.tar.gz". Anschliessend macht es exakt das gleiche mit dem Zusatz ".md5":
Es lädt datei.tar.gz.md5 auf den FTP-Server in den Ordner "backup_pfad_auf_ftp" und nennt die Datei "backup.tar.gz.md5".

Ein Beispiel, was in dem obigen Script nicht angeführt wird, ist, wie man einen "Ladebalken" realisieren kann. Das sieht man hier im Beispiel, um einen Ladebalken mit 10 Sekunden Dauer zu bauen:
{
	for I in $(seq 1 100); do
		echo $I
		sleep 0.1;
	done;
	echo 100;
} | dialog      --backtitle "$BACKTITLE" \
		--gauge "In 10 Sekunden geht es weiter..." 6 60 0;
Ausschauen tut es dann so hier:
dialog2.jpg

dialog3.jpg



  logo