Breadcrumbs

shell

  • Getopts

    1. Example getopts

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    while getopts ":hf:g:" option; do
                    case $option in
                            f)
                                    echo "[OPTION] f with argument: $OPTARG"
                                    ;;
                            g)
                                    echo "[OPTION] g with argument: $OPTARG"
                                    ;;
                            h)
                                    usage
                                    ;;
     
                            :)
                                    echo "[ERROR] option : $OPTARG requiert un argument"
                                    exit 2
                                    ;;
     
                            \?)
                                    echo "[ERROR] option invalide: $OPTARG"
                                    exit 2
                                    ;;
                    esac
            done

    2. explication

     

    la chaine passé à getopt permet de définir les options:

    • le 1er ":" signifie de laisser l'utilisateur gérer les erreurs. sinon getopts s'en charge
    • "h"  signifie que l'option "h" est valide
    • "f:" signifie que l'option "f" est valide et qu'elle attend un argument
    • "g:" même chose

    on peut donc lancer le script ainsi:

    1
    2
    3
    4
    ./script -h
    ./script -h -f toto
    ./script -g titi
    ./script -g titi -h -f toto

    L'utilisation d'une option invalide (non comprise dans la liste fournise à getopts) sera rejeté.

  • shell script for backup

    #!/bin/bash
     
     
    function backup() {
            # check if the file contains something we don't want
             if egrep -q -v '^[[:space:]]*$|^#.*|^[^ ]*=[^;]*' "$F_OPTION"; then
                    echo "[ERROR] Config file is unclean, cleaning it..." >&2
                    exit 4
            fi
    	myhost=$(hostname)
    	if ! [[ -z "$V_OPTION" ]]; then
            	echo "[VERBOSE] Dossier de destination: $myhost"
    	fi
    	if ! [[ -z "$V_OPTION" ]]; then
    		echo "[VERBOSE] Source du fichier de configuration"
    	fi
            source "$F_OPTION"
    	rep=$(mktemp -d /tmp/backup.XXXXXXXXXXXX)
    	if ! [[ -z "$V_OPTION" ]]; then
    		echo "[VERBOSE] Repertoire temporaire: $rep"
    	fi
    	if ! [[ -z "$V_OPTION" ]]; then
    		echo "[VERBOSE] Creation de la tarball"
    		tar cvzf $rep/backup-$myhost.tar.gz ${files[@]}
    	else
    		tar czf $rep/backup-$myhost.tar.gz ${files[@]}
    	fi
                    if ! [[ -z "$T_OPTION" ]]; then
                            sudo -i -u xxxxxp echo "[TEST] copy file: ${files[@]} contenu dans la tarball $rep/backup-$myhost.tar.gz"
                    else
    			chown -R soc-backup $rep
    			sudo -i -u xxxx sftp -oIdentityFile="~/.ssh/id_rsa" xxxxxx@xxxxx <<-EOF
    			mkdir $myhost
    			cd $myhost
    			put $rep/backup-$myhost.tar.gz
    			quit
    			EOF
     
                    fi
    	rm -rf 	$rep
    }
     
     
    function usage() {
            echo "Le script doit être lancé en root et le user soc-backup doit exister."
    	echo "Plus d'infos : xxxxxxxxxxxxxx"
    	echo "Usage: ./Backup-xxxxxxxxxxxx.sh -f <configfile> [-h] [-t]"
            echo "  Ce script permet de sauvegarder les fichiers de configuration des services sur xxxxxxxxxxxx." 
            echo "Options:"
            echo "  -f: /path/to/config/file : Permet de charger le fichier de configuration du serveur"
            echo "  -h: permet d'afficher l'usage"
            echo "  -t: permet de seulement vérifier la configuration sans effectuer le Backup"
    	echo "	-v: permet de mettre le script en verbose"
    }
     
    if (( $EUID != 0 )); then
        echo "[ERROR]Please run as root"
        usage
        exit 1
    fi
    if ! id -u "soc-backup" >/dev/null 2>&1; then
            echo "[ERROR] User soc-backup n'existe pas... Veuillez le créer et suivre la procédure sur xxxxxxxxxxx..."
    	usage
    	exit 1
    fi
     
    F_OPTION=""
    T_OPTION=""
    OPTION=""
    while getopts ":hvf:t" option; do
                    case $option in
                            f)
                                    echo "[OPTION] Config file: $OPTARG"
                                    F_OPTION=$OPTARG
                                    OPTION=1
                                    ;;
                            t)
                                    echo "[OPTION] Test Mode enable"
                                    T_OPTION=1
                                    OPTION=1
     
                                    ;;
                            h)
                                    OPTION=1
                                    usage
                                    ;;
    			v)
    				OPTION=1
    				V_OPTION=1
    				;;
     
                            :)
                                    echo "[ERROR] option : $OPTARG requiert un argument"
                                    exit 3
                                    ;;
     
                            \?)
                                    echo "[ERROR] option invalide: $OPTARG"
                                    exit 3
                                    ;;
                    esac
            done
     
     
     
    if [[ -z "$OPTION" ]]; then
            usage
            exit 2
    fi
    if ! [[ -z "$T_OPTION" ]]; then
            echo "[TEST] Test mode Enable... Nothing will be done!"
    fi
    if ! [[ -z "$F_OPTION" ]]; then
            if [[ -e "$F_OPTION" ]]; then
                    echo -e "       Loading ConfigFile: $F_OPTION ..."
                    backup
                    echo "done."
            else
                    echo "  [ERROR] $F_OPTION: No such file or directory"
            fi
    fi