aboutsummaryrefslogtreecommitdiffstats
path: root/mayor-jav/mayor-base-jav/bin/remote-backup.sh
blob: 71e241d5d16e1c1e7a44c4b7894e8718d80e8a6f (plain)
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
#!/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/