#!/bin/bash # # Example: mayor remote-backup --backup-file=/tmp/wiki.tgz # Az eredmény a $BACKUPDIR/$DATE-crypt.tgz állományba kerül # (Vagy jobb lenne, ha a file nevéből venné a nevét?) # # TODO: ellenőrizni kell még, hogy van-e openssl és aespipe # OPT_SPEC="hf:d::" LONG_OPT_SPEC="help,file:,backup-file:,dir:,backup-dir::" PARSED_OPTIONS=$(getopt -n "$0" -a -o $OPT_SPEC --long $LONG_OPT_SPEC -- "$@") OPTIONS_RET=$? eval set -- "$PARSED_OPTIONS" help_usage() { cat <<EOF Remote-backup használata: mayor remote-backup [opciók] A parancs segítségével menthetjük egy központi szerverre a MaYoR rendszer adatbázisait, aktuális forrását és beállításait titkosított formában. A távoli szerverre való bejele- lentkezéshez szükséges az intézmény privát kulcsa, amit a program alapesetben az adat- bázisban keres. A szkript, ha nincs más megadva, akkor az aktuális dátumnak megelelő, "YYYYmmdd-crypt.tgz" alkú néven keresi a feltöltendő mentési állományt. A mentési könyvtár, a szükséges jelszavak és egyéb mentési paraméterek beállításait a /etc/mayor/main.conf állományban kell megadni. Opciók: -h, --help: A parancs leírása (amit most olvasol...) -f, --file, --backup-file: A mentési állomány neve -d, --dir, --backup-dir: A mentési könyvtár elérési útja EOF } if [ $OPTIONS_RET -ne 0 ]; then help_usage; exit; fi FILE="${DATE}-crypt.tgz" while [ $# -ge 1 ]; do case $1 in --help | -h ) help_usage exit ;; --backup-file | --file | -f ) shift FILE="$1" echo "Backup fájl: $FILE" ;; --backup-dir | --dir | -d ) shift BACKUPDIR="$1" echo "Backup könyvtár: $BACKUPDIR" ;; -- ) shift break ;; * ) echo "HIBA: ismeretlen opció: $1" # ide elvileg sose jutunk, mert a getopts már kiszűrte a hibás paraméterek exit ;; esac shift done SSH_PORT="8023" SSH_HOST="backup.mayor.hu" # mysql bináris ellenőrzése if [ ! -f $MYSQL ]; then echo -e "\n\nERROR: A mysql kliens nem található: $MYSQL\n" exit 1 fi # Login adatbázis eléréséhez szükséges paraméterek lekérdezése a konfig-ból... DB=`grep db $BASEDIR/config/main-config.php | sed -e "s/$.*=\ *['|\"]//g" -e "s/['|\"];//g"` USER=`grep user $BASEDIR/config/main-config.php | sed -e "s/$.*=\ *['|\"]//g" -e "s/['|\"];//g" | sed 's/^ *//g'` PW=`grep pw $BASEDIR/config/main-config.php | sed -e "s/$.*=\ *['|\"]//g" -e "s/['|\"];//g" | sed 's/^ *//g'` # Ellenőrizzük, hogy van-e publikus kulcs - regisztrált intézmény-e COUNT=`$MYSQL -e 'SELECT count(publicKey) FROM mayorSsl' -p$PW -u$USER $DB | grep -i -v count` if [ "$COUNT" -ne "1" ]; then echo "Publikus kulcsok száma: $COUNT" echo "Nem regisztrált intézmény? A mentés titkosítása csak regisztrált intézmények számára érhető el!" exit 2 fi # Backup könyvtár létrehozása if [ ! -e $BACKUPDIR ]; then mkdir $BACKUPDIR > /dev/null 2>&1 if [ $? -ne 0 ]; then echo "Nem sikerült a ${BACKUPDIR} könyvtárat létrehozni!" echo "MaYoR Backup failure!" exit 3 fi fi CRYPTDIR=$BACKUPDIR/$DATE if [ ! -e $CRYPTDIR ]; then mkdir $CRYPTDIR fi chown $WEB_SERVER_USER $BACKUPDIR chmod 700 $BACKUPDIR if [ ! -f $FILE ]; then echo -e " HIBA: Hiányzik a kódolandó mentési állomámny: ${FILE}" FILE=$BACKUPDIR/${FILE} echo "Próbáljuk a mentési könyvtárban! (${FILE})" if [ ! -f $FILE ]; then echo -e " HIBA: Hiányzik a kódolandó mentési állomámny: ${FILE}" FILE=$BACKUPDIR/${PREFIX}${DATE}.tgz echo "Próbáljuk az alapértelmezett állományt! (${FILE})" if [ ! -e $FILE ]; then echo -e " HIBA: Hiányzik a kódolandó mentési állomámny: ${FILE}" exit 3 fi fi fi BASENAME=`basename $FILE` # Publikus kulcs lekérdezése echo 'SELECT publicKey FROM mayorSsl' | $MYSQL -p$PW -u$USER $DB | grep -v publicKey | sed -e 's/\\n/\n/g' > $CRYPTDIR/id_rsa.pub # Véletlen kulcs generálás a szimmetrikus AES kódoláshoz pwgen -nc 50 1 > $CRYPTDIR/key.txt # AES kódolás aespipe -P $CRYPTDIR/key.txt -e aes256 < $FILE > $CRYPTDIR/$BASENAME.aes # A kulcsok RSA kódolása a publikus kulccsal openssl rsautl -encrypt -inkey $CRYPTDIR/id_rsa.pub -pubin -in $CRYPTDIR/key.txt -out $CRYPTDIR/key.rsa # Kulcsok törlése rm $CRYPTDIR/id_rsa.pub rm $CRYPTDIR/key.txt cd $BACKUPDIR tar cfz ${DATE}-crypt.tgz ${DATE} rm -rf $DATE echo -e "\nBecsomagolva: $BACKUPDIR/${DATE}-crypt.tgz\n\n" # A privát kulcs lekérdezése, elhelyezése if [ ! -d $BASEDIR/ssh ]; then echo "Létrehozzuk a $BASEDIR/ssh könyvtárat, amibe belerakjuk a privát kulcsot..." mkdir $BASEDIR/ssh chmod 700 $BASEDIR/ssh fi if [ ! -f $BASEDIR/ssh/id_rsa ]; then echo 'SELECT privateKey FROM mayorSsl' | $MYSQL -p$PW -u$USER $DB | grep -v privateKey | sed -e 's/\\n/\n/g' > $BASEDIR/ssh/id_rsa chmod 700 $BASEDIR/ssh/id_rsa fi # Az intézmény OM kódjának lekérdezése # A mayor_naplo adatbázis eléréséhez szükséges paraméterek lekérdezése a konfig-ból... DB=`grep db $BASEDIR/config/module-naplo/config.php | sed -e "s/$.*=\ *['|\"]//g" -e "s/['|\"];//g"` USER=`grep userRead $BASEDIR/config/module-naplo/config.php | sed -e "s/$.*=\ *['|\"]//g" -e "s/['|\"];//g" | sed 's/^ *//g'` PW=`grep pwRead $BASEDIR/config/module-naplo/config.php | sed -e "s/$.*=\ *['|\"]//g" -e "s/['|\"];//g" | sed 's/^ *//g'` OMKOD=`echo 'SELECT SUBSTR(OMKod,-6) FROM intezmeny WHERE alapertelmezett = 1' | $MYSQL -p$PW -u$USER $DB | grep -v OMKod` SSH_USER="om$OMKOD" echo $SSH_USER # A kódolt adatállomány másolása scp -i $BASEDIR/ssh/id_rsa -P $SSH_PORT $BACKUPDIR/${DATE}-crypt.tgz $SSH_USER@$SSH_HOST:/home/$SSH_USER/