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/
|