Projet

Général

Profil

migration29_OK.sh

moncef ziani, 01/04/2025 11:55

Télécharger (68,9 ko)

 
1
#!/bin/bash
2

    
3
######################################################
4
# Script de migration EOLE 2.6 à 2.8 vers EOLE 2.9   #
5
# Les donnees sont lues depuis un support externe    #
6
# Le script est utilisable pour :                    #
7
# - sauvegarder sur EOLE 2.6 à 2.8                   #
8
# - restaurer sur EOLE 2.9                           #
9
######################################################
10

    
11
VERSION="20240724"
12
LDIF=eole.ldif
13
SYMPA=/var/lib/sympa
14
MYSQLDB=mysql.sql
15
ACLS=acls.sauv
16
QUOTAS=quotas.sauv
17
SID=sid.txt
18
READER=reader.txt
19
DD=/media/migration
20
RSYNC_LOG=/tmp/rsync.log
21
ACLS_LOG=/tmp/aclserr.log
22
ACLS_FIXED=/tmp/acls.txt
23
ACLS_DIR=/tmp/acls_blocks
24
UMOUNT_NEEDED=0
25
rne=$(CreoleGet numero_etab)
26
rnemin=${rne,,}
27
DOM="${rnemin:1:8}"
28

    
29
LOG_FILE="/tmp/migration-$(date +'%d%m%Y-%H%M%S').log"
30

    
31
if [ -f /usr/lib/eole/ihm.sh ];then
32
# version 2.4/2.5
33
. /usr/lib/eole/ihm.sh
34
numero_etab="$(CreoleGet numero_etab)"
35
interactive='True'
36
else
37
# version 2.2 ou 2.3
38
. /usr/share/eole/FonctionsEoleNg
39
. /usr/bin/ParseDico
40
[ -f /etc/eole/containers.conf ] && . /etc/eole/containers.conf
41
fi
42

    
43
Green(){
44
  local msg="${@}"
45
  echo "[INFO] ${msg}" >> ${LOG_FILE}
46
  EchoVert "${msg}"
47
}
48

    
49
Red(){
50
  local msg="${@}"
51
  echo "[ERROR] ${msg}" >> ${LOG_FILE}
52
  EchoRouge "${msg}"
53
}
54

    
55
Cyan(){
56
  local msg="${@}"
57
  echo "[INFO] ${msg}" >> ${LOG_FILE}
58
  EchoCyan "${msg}"
59
}
60

    
61
Orange(){
62
  local msg="${@}"
63
  echo "[WARN] ${msg}" >> ${LOG_FILE}
64
  EchoOrange "${msg}"
65
}
66

    
67
StdEcho(){
68
  local msg="${@}"
69
  echo "[INFO] ${msg} | tee -a ${LOG_FILE}"
70
}
71

    
72
if [ -z "$numero_etab" ]
73
then
74
    Red "Récupération du numéro d'établissement impossible !"
75
    exit 1
76
fi
77

    
78
Version(){
79
    echo "Script de migration version : $VERSION"
80
    echo
81
}
82

    
83
Title(){
84
    echo
85
    Cyan "  * $1"
86
}
87

    
88
testcmd(){
89
    if [ "$1" -ne 0 ];then
90
        msg="$2"
91
        [ -z "$msg" ] && msg="Erreur, Abandon."
92
        Red "$msg"
93
        echo
94
        [ -z "$3" ] && exit 1
95
    fi
96
}
97

    
98
testf(){
99
    if [ ! -e $1 ];    then
100
        Red "$1 introuvable, Abandon."
101
        echo
102
        exit 1
103
    fi
104
}
105

    
106
Alerte(){
107
    echo
108
    Question_ouinon "Attention ceci va détruire votre annuaire, voulez-vous continuer ?" $interactive "non" "warn"
109
    testcmd $? "Abandon"
110
}
111

    
112
Alerte2(){
113
    echo
114
    Question_ouinon "Attention ceci va écraser certaines données de votre serveur, voulez-vous continuer ?" $interactive "non" "warn"
115
    testcmd $? "Abandon"
116
}
117

    
118
montage(){
119
    # $1 : point de montage
120
    # $2 : version (exemple 25)
121
    /bin/mkdir -p "$1"
122
    /bin/umount "$1" 2>/dev/null
123
    echo
124
    echo "Quel est le support de sauvegarde ?"
125
    echo "* support distant en nfs  => ex : IP_NAS:/sauvscribe"
126
    echo "* disque USB       => ex : /dev/sd.."
127
    echo "* répertoire local => ex : /root/sauvegarde"
128
    echo
129
    read -p "Chemin : " peri
130
    if [ "${peri:0:1}" = "1" ]
131
    then
132
       mount -t nfs $peri "$1"
133
       [[ $(mount) =~ .*$1.* ]]
134
    elif [ "${peri:0:2}" = "//" ]
135
    then
136
        echo -n "Entrez un nom d'utilisateur (sinon rien) : "
137
        read user
138
        echo Montage de $peri
139
        [ "$2" = "25" ] && fs="cifs" || fs="smbfs"
140
        [ "$user" != "" ] && mount -t $fs $peri "$1" -o username=$user,iocharset=utf8 || mount -t $fs $peri "$1" -o password='',iocharset=utf8
141
        testcmd $? "Montage $peri impossible, Abandon."
142
        UMOUNT_NEEDED=1
143
    elif [ "${peri:0:4}" = "/dev" ]
144
    then
145
        echo Disque local
146
        echo Montage de $peri
147
        /bin/mount $peri "$1"
148
        testcmd $? "Montage $peri impossible, Abandon."
149
        UMOUNT_NEEDED=1
150
    elif [ "${peri:0:1}" = "/" ]
151
    then
152
        testf $peri
153
        [ -L "$1" ] && rm -f "$1"
154
        if [ -d "$1" ];then
155
            rmdir "$1"
156
            testcmd $?
157
        fi
158
        ln -ns $peri "$1"
159
        UMOUNT_NEEDED=0
160
    else
161
        testcmd 1 "Le chemin doit être complet !"
162
    fi
163
}
164

    
165
demontage(){
166
    # $1 : point de montage
167
    if [ $UMOUNT_NEEDED -eq 1 ]
168
    then
169
        Title "Démontage du support"
170
        /bin/umount "$1"
171
        echo
172
    fi
173
    [ -L "$1" ] && rm -f "$1"
174
}
175

    
176
NotificationMail2729(){
177
    echo
178
    EchoCyan "Voulez-vous activer la notification par mail lors des étapes de sauvegarde/restauration ?"
179
    Question_ouinon "Repondre 'oui' pour activer la notification :" "True" "oui"
180
    if [ $? -eq 0 ] && MAIL="oui"
181
        then MAIL="oui"
182
             EchoVert "Renseigner votre adresse mail:"
183
             read MAIL_UTIL
184
        else MAIL="non"
185
             EchoVert "La notification par mail ne sera pas activee"
186
    fi
187
}
188

    
189
finresto(){
190
    Green "Restauration spéciale terminée"
191
    if [ "$MAIL" = 'oui' ]
192
    then echo "Opération terminée." | mail -s "$(CreoleGet numero_etab)-Restauration complete terminee" $MAIL_UTIL
193
    else EchoVert "Pas de notification"
194
    fi
195
}
196

    
197
finsauve(){
198
    echo
199
    Green "Sauvegarde spéciale terminée"
200
    if [ "$MAIL" = 'oui' ]
201
    then echo "Opération terminée." | mail -s "$(CreoleGet numero_etab)-Sauvegarde complete terminee" $MAIL_UTIL
202
    else EchoVert "Pas de notification"
203
    fi
204
}
205

    
206
SuppressionLns272(){
207
    ls /home/adhomes > /root/listusers
208
    while read line
209
            do
210
              lettre="${line:0:1}"
211
              rm /home/$lettre/$line
212
            done < /root/listusers
213
}
214

    
215
RajoutLettreHome(){
216
    ls /home/adhomes > /root/listusers
217
    while read line
218
            do
219
              lettre="${line:0:1}"
220
              mkdir -p /home/$lettre
221
            done < /root/listusers
222
}
223

    
224
RemiseLnS(){
225
    ls /home/adhomes > /root/listusers
226
    while read line
227
            do
228
              lettre="${line:0:1}"
229
              ln -s /home/adhomes/$line /home/$lettre/$line
230
            done < /root/listusers
231

    
232
    /usr/share/eole/backend/droits_user.py
233
    /usr/share/eole/backend/droits_partage.sh
234
}
235

    
236

    
237
saveconfigeol(){
238
    # $1 : répertoire de sauvegarde
239
    Title "Test du support"
240
    /bin/mkdir -p "$1"
241
    testcmd $? "Ecriture impossible sur le support !"
242
    ln -s /tmp "$1/testln"
243
    if [ $? -ne 0 ];then
244
        Red "Le support ne supporte pas les liens symboliques !"
245
        Question "Voulez-vous continuer malgré tout ?"
246
        testcmd $? "Abandon"
247
    fi
248
    rm -f "$1/testln"
249
    Title "Copie du fichier config.eol"
250
    /bin/cp -f /etc/eole/config.eol "$1/$version.eol"
251
    testf "$1/$version.eol"
252
    if [ -d /etc/eole/extra ];then
253
        /bin/cp -rf /etc/eole/extra "$1/"
254
    fi
255
}
256

    
257
questionsave(){
258
    # $1 : emplacement des données (/home ou /data)
259
    echo
260
    Question "Voulez-vous sauvegarder automatiquement les données ?"
261
    if [ $? -ne 0 ];then
262
        Orange "La migration des données contenues dans $1 ne sera pas automatique !"
263
        return 1
264
    fi
265
    return 0
266
}
267

    
268

    
269
questionrestore(){
270
    # $1 : répertoire de sauvegarde
271
    # $2 : emplacement des données (/home ou /data)
272
    echo
273
    if [ ! -d "$1$2" ];then
274
        Orange "Les données de $2 ne sont pas présentes dans la sauvegarde"
275
        Question_ouinon "Voulez-vous restaurer les ACL malgré tout ?" "$interactive" "oui"
276
        return $?
277
    fi
278
    return 0
279
}
280

    
281
questionadhomes(){
282
    # $1 : répertoire de sauvegarde
283
    if [ ! -d "$1/samba/bareos" ];then
284
        Question_ouinon "Voulez-vous que les liens vers /home/adhomes soient générés automatiquement ?" "$interactive" "oui"
285
        return $?
286
    fi
287
    return 0
288
}
289

    
290
savebcdi(){
291
    # $1 : répertoire de sauvegarde
292
    if [ -d /home/bcdiserv ];then
293
        Question "Voulez-vous sauvegarder les fichiers liés à Bcdi Web ?"
294
        if [ $? -eq 0 ];then
295
            Title "Sauvegarde de Bcdi Web"
296
            mkdir -p "$1/bcdi"
297
            cp -R /home/bcdiserv "$1/home/"
298
            cp -R /var/www/html/bcdiweb "$1/bcdi/"
299
            cp -f /etc/apache2/sites-enabled/bcdiweb.conf "$1/bcdi/"
300
            cp -f /etc/default/rsync "$1/bcdi/"
301
            cp -f /etc/rsyncd.conf "$1/bcdi/"
302
            echo
303
        fi
304
    fi
305
}
306

    
307
restorebcdi(){
308
    # $1 : répertoire de sauvegarde
309
    if [ -d "$1/home/bcdiserv" ];then
310
        echo "Restauration des données liées à Bcdi Web"
311
        # /home/bcdiserv est restauré par restorescribedata()
312
        if [ -d "$1/bcdi/bcdiweb" ];then
313
            cp -R "$1/bcdi/bcdiweb" /var/www/html/bcdiweb
314
            chown -R www-data:www-data /var/www/html/bcdiweb
315
        fi
316
        cp -f "$1/bcdi/bcdiweb.conf" /etc/apache2/sites-enabled
317
        cp -f "$1/bcdi/rsync" /etc/default/rsync
318
        cp -f "$1/bcdi/rsyncd.conf" /etc/rsyncd.conf
319
        echo
320
    fi
321
}
322

    
323
savescribedata(){
324
    # $1 : répertoire de sauvegarde
325
    mkdir -p "$1/home"
326
    savebcdi "$1"
327
    Title "Copie des données"
328
    echo -n "."
329
    # ménage
330
    rm -f /home/netlogon/*.bat
331
    rm -f /home/netlogon/*.txt
332
    mkdir -p /home/options
333
    # FIXME : supprimer tous les .virus et .scanned avant ?
334
    for rep in "netlogon" "workgroups" "classes" "options";do
335
        echo -n "."
336
        cp --preserve=timestamps -rf /home/$rep "$1/home"
337
    done
338
    if [ -d /home/wpkg ];then
339
        echo -n "."
340
        mkdir -p "$1/home/wpkg"
341
        cp --preserve=timestamps -rf /home/wpkg/* "$1/home/wpkg"
342
        rm -rf "$1/home/wpkg/documents"
343
        rm -f  "$1/home/wpkg/wpkg.js"
344
    fi
345

    
346
    # realpath absent sur EOLE < 2.6
347
    command -v realpath >/dev/null && realpath="realpath" || realpath="ls -d"
348

    
349
    for abc in `find /home -maxdepth 2 -wholename '/home/?/*' | sort`;do
350
        echo -n "."
351
        rsync -cav --log-file $RSYNC_LOG --exclude=MailDir \
352
            --exclude=IntegrDom --exclude=.scanned* $($realpath ${abc}) "$1/${abc%/*}" >/dev/null
353
        testcmd $? "Erreur lors de la sauvegarde des données $abc : consulter le fichier $RSYNC_LOG" 'noexit'
354
    done
355
    if [ -d /home/adhomes ]; then
356
        rsync -cav --log-file $RSYNC_LOG --exclude=MailDir \
357
                --exclude=IntegrDom --exclude=.scanned* /home/adhomes "$1/home/" >/dev/null
358
    fi
359
    # scribe (controle-vnc-applis)
360
    rm -rf "$1/home/netlogon/blockinput"
361
    rm -f "$1/home/a/admin/perso/Alias.lnk"
362
    rm -f "$1/home/a/admin/perso/alias"
363
    rm -f "$1/home/a/admin/perso/Esu.lnk"
364
    rm -f "$1/home/a/admin/perso/Install_Client_Scribe.lnk"
365
    rm -rf "$1/home/workgroups/professeurs/gestion-postes"
366
    rm -f "$1/home/workgroups/professeurs/Gestion-postes.lnk"
367
    echo
368
    # scribe (controle-vnc-client)
369
    # scribe (divers)
370
    # les corbeilles ($smb_trash_dir)
371
    # horus ?
372
}
373

    
374
savehorusdata(){
375
    # $1 : répertoire de sauvegarde
376
    Title "Copie des données"
377
    echo "(cette opération peut prendre du temps)"
378
    echo -n "."
379
    # purge des fichiers de connexion
380
    rm -f /home/netlogon/*.bat
381
    # FIXME : on devrait supprimer tous les .virus et .scanned avant
382
    echo -n "."
383
    if [ -L /data ];then
384
        # spécifique Horus-2.3
385
        mkdir -p "$1/data/home"
386
        for dir in `find /home/* -maxdepth 0 -type d`;do
387
            if [ $dir != "/home/workgroups" ];then
388
                cp -rf --preserve=timestamps $dir "$1/data/home"
389
                echo -n "."
390
            fi
391
        done
392
        cp -rf /home/workgroups/* "$1/data"
393
    else
394
        # spécifique Horus-2.2
395
        cp -rf --preserve=timestamps /data "$1/"
396
    fi
397
    # suppression des fichiers spéciaux
398
    echo -n "."
399
    rm -f "$1/data/aquota.group"
400
    rm -f "$1/data/aquota.user"
401
    rm -rf "$1/data/home/horus"
402
    rm -rf "$1/data/home/ftp"
403
    echo -n "."
404
    for prof in `find "$1/data/home" -maxdepth 2 -name "profiles"`;do
405
        ls $prof/* &>/dev/null
406
        if [ $? -ne 0 ];then
407
            # suppression des répertoires vides
408
            rmdir $prof
409
        elif [ ! -d `dirname $prof`/profil ];then
410
            # renommage profiles -> profil
411
            mv "$prof" "`dirname $prof`/profil"
412
        fi
413
    done
414
    echo -n "."
415
    if [ ! -L /opt ];then
416
        # spécifique Horus-2.3
417
        cp -rf --preserve=timestamps /opt "$1/data"
418
    fi
419
    echo
420
}
421

    
422
restorescribedata(){
423
    # $1 : répertoire de sauvegarde
424
    Title "Restauration des données"
425
    if [ ! -d "$1/home" ];then
426
        echo "Aucune donnée à restaurer"
427
        return
428
    fi
429
    echo "(cette opération peut prendre du temps)"
430
    restorebcdi "$1"
431
    rsync -cav --log-file $RSYNC_LOG --ignore-existing "$1/home/" /home/ >/dev/null
432
    testcmd $? "Erreur lors de la restauration des données, consulter le fichier $RSYNC_LOG"
433
    [ -f "$1/home/wpkg/hosts.xml" ] && cp -f "$1/home/wpkg/hosts.xml" /home/wpkg/
434
    # liens morts (#30782)
435
    for link in "/home/a/admin/perso/esu" "/home/a/admin/perso/client"
436
    do
437
        [ -L "$link" ] && [ ! -e "$link" ] && rm -f "$link"
438
    done
439
}
440

    
441
genadhome(){
442
    Title "Génération des liens vers /home/adhomes"
443
    for dir in /home/?/*;do
444
        /usr/share/eole/sbin/create_adhome "$(basename $dir)" "/home/adhomes"
445
    done
446
}
447

    
448
savequota(){
449
    # $1 : répertoire de sauvegarde
450
    Title "Sauvegardes des quotas utilisateurs"
451
    /usr/sbin/repquota -a |grep -v '^#' > "$1/$QUOTAS"
452
}
453

    
454
restorequota(){
455
    # $1 : répertoire de sauvegarde
456
    Title "Restauration des quotas utilisateurs"
457
    testf "$1/$QUOTAS"
458
    python3 -c """from fichier.quota import set_quota
459
from sys import stdout
460
with open('$1/$QUOTAS', 'r') as fp:
461
    started = False
462
    num = 0
463
    for ligne in fp.readlines():
464
        if not started:
465
            if ligne.startswith('------------'):started = True
466
            continue
467
        # cas plusieurs partition
468
        if ligne.startswith('***'):
469
            started = False
470
            continue
471
        elts = ligne.strip().split()
472
        try:
473
            user  = elts[0]
474
            quota = elts[3]
475
        except:
476
            continue
477
        if quota != '0':
478
            num+=1
479
            if num % 20 == 0:
480
                stdout.write('.')
481
                stdout.flush()
482
            set_quota(user, int(quota)/1024)
483
print(\"\\n%d quotas non nuls restaurés\" % num)
484
"""
485
}
486

    
487
savescribeacl(){
488
    # $1 : répertoire de sauvegarde
489
    Title "Sauvegarde des ACL"
490
    true > "$1/$ACLS"
491
    for rep in "netlogon" "workgroups" "classes" "options";do
492
        echo -n "."
493
        /usr/bin/getfacl -R --absolute-names /home/$rep >> "$1/$ACLS"
494
    done
495
    for abc in $(find /home -maxdepth 1 -name '?' | sort)
496
    do
497
        echo -n "."
498
        /usr/bin/getfacl -R --absolute-names "$abc" >> "$1/$ACLS"
499
    done
500
    if [ -d /home/adhomes ];then
501
        echo
502
        for abc in $(find /home/adhomes/* -maxdepth 0 | sort);do
503
            echo -n "."
504
            /usr/bin/getfacl -R --absolute-names "$abc" >> "$1/$ACLS"
505
        done
506
    fi
507
    echo
508
}
509

    
510
savehorusacl(){
511
    # $1 : répertoire de sauvegarde
512
    Title "Sauvegarde des ACL"
513
    if [ -L /data ];then
514
        HOME="/home"
515
    else
516
        HOME="/data"
517
    fi
518
    /usr/bin/getfacl -R --absolute-names $HOME > "$1/$ACLS"
519
}
520

    
521
restoreacl(){
522
    # $1 : répertoire de sauvegarde
523
    Title "Restauration des ACL"
524
    if [ ! -f "$1/$ACLS" ];then
525
        echo
526
        Orange "Les ACL ne sont pas présentes dans la sauvegarde"
527
        return
528
    fi
529
    echo "Nettoyage du fichier"
530
    echo -n "."
531
    sed -i -e "s;\(/home/workgroups/professeurs/gestion-postes/wx\(base\)\|\(msw\)\)28uh\(.*\?\)\(.dll\);\130u\490\5;g" "$1/$ACLS"
532
    echo -n "."
533
    [ -d /data ] && ln -nsf /home /data/home
534
    # Remplacement des anciens groupes "DomainAdmins" et "DomainUsers"
535
    sed "s/:DomainAdmins:/:domain\\\040admins:/ ; s/:DomainUsers:/:domain\\\040users:/" "$1/$ACLS" > "$ACLS_FIXED"
536
    echo -n "."
537
    rm -f $ACLS_LOG
538
    touch $ACLS_LOG
539
    [ -d "$ACLS_DIR" ] && rm -rf "$ACLS_DIR"
540
    mkdir "$ACLS_DIR"
541
    echo
542
    echo "Restauration des ACL"
543
    awk -v acl_dir=$ACLS_DIR -v acls_log=$ACLS_LOG -v RS= '{FS="\n";
544
        if(FNR % 10000 == 0) {printf "."};
545
        if(FNR % 500000 == 0) {print " "};
546
        block = sprintf("%s/acl_block-%.10d.txt",acl_dir, NR);
547
        blocklog = block".log"
548
        print > block;
549
        split($1, c, ": ")
550
        cible = c[2]
551
        close(block);
552
        acl_code = system("/usr/bin/setfacl --restore="block" >"blocklog" 2>&1");
553
        if (acl_code == 0)
554
            system("rm -f "block"*");
555
        else
556
            {getline < (blocklog);
557
             n = split($0, b, " ")
558
             filtre_erreur = b[n]
559
             if ($0 !~ /MailDir|data\/opt|aquota|horus|recyclage|netlogon|Alias\.lnk|\.scanned|profiles|\/home\/ftp|gestion-postes|IntegrDom|.lnk:/)
560
                {if (filtre_erreur ~ /[[:digit:]]+/)
561
                    {getline detail < block
562
                    split(detail, d)
563
                    close(block)
564
                    split(d[filtre_erreur], e, ":")
565
                    print "ACL non restaurée pour "cible" ("e[1]" "e[2]")" >> acls_log
566
                    }
567
                else
568
                    print "ACL non restaurée pour "cible" (cible inexistante)" >> acls_log
569
                }
570
             else
571
                 system("rm -f "block"*")
572
            close(blocklog)
573

    
574
          }
575
     }' "$ACLS_FIXED"
576
    echo
577
    echo "Fin de la restauration des ACL"
578
    [ -L /data/home ] && rm -f /data/home
579
    if [ -e "$ACLS_LOG" ]
580
    then
581
        ERR=`wc -l $ACLS_LOG|cut -d' ' -f1`
582
        if [ $ERR -gt 0 ];then
583
            Orange "ATTENTION : $ERR messages d'erreur dans $ACLS_LOG"
584

    
585
            sort -u "$ACLS_LOG" > /tmp/aclserr_uniq.log
586
            rm -f "$ACLS_LOG"
587
            Red "$(head -n10 /tmp/aclserr_uniq.log)"
588
            echo
589
            Red "Consulter le fichier /tmp/aclserr_uniq.log pour la liste des comptes non retrouvés"
590
            echo "Corriger le fichier le fichier $1/$ACLS avant de relancer la procédure"
591
            echo
592
            exit 1
593
        fi
594
    fi
595
}
596

    
597
savemail(){
598
    # $1 : répertoire de sauvegarde
599
    Title "Sauvegarde des données liées à la messagerie"
600
    [ -x /usr/bin/CreoleGet ] && container_path_mail="$(CreoleGet container_path_mail)"
601
    if [ "$(CreoleGet activer_sympa oui)" = "oui" ]; then
602
        mkdir -p "$1/listes"
603
        echo -n "."
604
        if [ ! -e "$1/listes/sympa" ];then
605
            mkdir -p "$1/listes/sympa"
606
        fi
607
        if [ -f "$container_path_mail/etc/mail/sympa.aliases" ];then
608
            cp "$container_path_mail/etc/mail/sympa.aliases" "$1/listes/sympa/aliases"
609
        elif [ -f "$container_path_mail/etc/mail/sympa_aliases" ];then
610
            cp "$container_path_mail/etc/mail/sympa_aliases" "$1/listes/sympa/aliases"
611
        else
612
            cp "$container_path_mail/etc/mail/sympa/aliases" "$1/listes/sympa/aliases"
613
        fi
614
        cp -R $container_path_mail/$SYMPA/expl "$1/listes"
615
        echo -n "."
616
        cp -R $container_path_mail/$SYMPA/wwsarchive "$1/listes"
617
    fi
618
    mkdir -p "$1/courier"
619
    echo -n "."
620
    cp -f $container_path_mail/etc/courier/pop3d.* $container_path_mail/etc/courier/imapd.* "$1/courier"
621
    mkdir -p "$1/mail"
622
    echo -n "."
623
    for maildir in `find /home -maxdepth 3 -name MailDir`;do
624
        # 2.2 : mails dans /home/<l>/<login>/MailDir
625
        if [ -d "$maildir/cur" ];then
626
            user=`echo $maildir | awk -F "/" '{ print $(NF-1) }'`
627
            mkdir -p "$1/mail/$user"
628
            rsync -cav --log-file $RSYNC_LOG $maildir/ "$1/mail/$user" >/dev/null
629
        fi
630
    done
631
    if [ "$(ls -A /var/spool/mail)" ];then
632
        # 2.2 : mails responsables dans /var/spool/mail
633
        echo -n "."
634
        rsync -cav --log-file $RSYNC_LOG /var/spool/mail/* "$1/mail" >/dev/null
635
    fi
636
    if [ -d /home/mail ];then
637
        # 2.3/2.4 : toutes les boîtes dans /home/mail
638
        echo -n "."
639
        rsync -cav --log-file $RSYNC_LOG /home/mail/* "$1/mail" >/dev/null
640
    fi
641
    echo
642
}
643

    
644
restoremail(){
645
    # $1 : répertoire de sauvegarde
646
    Title "Restauration des données liées à la messagerie"
647
    container_path_mail="$(CreoleGet container_path_mail)"
648
    # restauration des certificats SSL pour pop et imap
649
    #cp -f "$1"/courier/*.* "$container_path_mail/etc/courier"
650
    echo -n "."
651
    rsync --log-file $RSYNC_LOG -cav "$1/mail" /home/ >/dev/null
652
    echo -n "."
653
    CreoleRun "chown -R mail:mail /home/mail" mail
654
    echo -n "."
655
    if [ "$(CreoleGet activer_sympa non)" = 'oui' ];then
656
        # sympa_aliases => sympa.aliases => sympa/aliases (#5049 puis #17087)
657
        if [ ! -e "$container_path_mail/etc/mail/sympa/aliases" ];then
658
        mkdir -p "$container_path_mail/etc/mail/sympa/aliases"
659
        fi
660
        cp "$1/listes/sympa/aliases" "$container_path_mail/etc/mail/sympa/aliases"
661
        echo -n "."
662
        rsync --log-file $RSYNC_LOG --ignore-existing -cav "$1/listes/expl" "$container_path_mail/$SYMPA" >/dev/null
663
        echo -n "."
664
        rsync --log-file $RSYNC_LOG --ignore-existing -cav "$1/listes/wwsarchive" "$container_path_mail/$SYMPA" >/dev/null
665
        echo -n "."
666
        CreoleRun "chown -R sympa:sympa $SYMPA" mail
667
        echo -n "."
668
        # re-génération des listes de diffusion (pour les responsables)
669
        python3 -c """from scribe.eolegroup import Group
670
g = Group()
671
g.ldap_admin.connect()
672
for classe in g._get_groups('Classe'):
673
    domain = g._get_maillist(classe).split('@')[1]
674
    g._delete_maillist(classe, domain)
675
    g._delete_maillist('profs-%s' % classe, domain)
676
    g._delete_maillist('resp-%s' % classe, domain)
677
    g._add_maillist('Classe', classe)
678
    g._add_maillist('Equipe', 'profs-%s' % classe)
679
    g._add_resp_maillist(classe)
680
g.ldap_admin.close()
681
"""
682
        echo -n "."
683
        # vérification de l'adresse IP du serveur ldap
684
        SEARCHPATH="$container_path_mail/$SYMPA/expl"
685
        adresse_ip_mysql="$(CreoleGet adresse_ip_mysql)"
686
        for config in `grep -l "host localhost" $SEARCHPATH/*/config $SEARCHPATH/*/*/config 2>/dev/null`;do
687
        sed -i "s/^host localhost$/host $adresse_ip_mysql/g" $config
688
        done
689
        echo
690
        # re-génération des alias pour sympa
691
        /usr/share/eole/backend/regenalias.sh
692
    fi
693
}
694

    
695
saveldap(){
696
    # $1 : répertoire de sauvegarde
697
    Title "Sauvegarde de l'annuaire"
698
    [ -x /usr/bin/CreoleGet ] && container_path_annuaire="$(CreoleGet container_path_annuaire)"
699
    [ -f /root/.reader ] && cp -f /root/.reader "$1/$READER"
700
    [ -x /usr/bin/CreoleService ] && CreoleService slapd stop || /etc/init.d/slapd stop
701
    chroot "/$container_path_annuaire" /usr/sbin/slapcat -f /etc/ldap/slapd.conf -o ldif-wrap=no | grep -Ev "^sambaShareAdmin:|^sambaShareDep:|^location:|^server:|^sambaLogonScript:" > "$1/$LDIF"
702
    testcmd $?
703
    [ -x /usr/bin/CreoleService ] && CreoleService slapd start || /etc/init.d/slapd start
704
}
705

    
706
restoreldap(){
707
    # $1 : répertoire de sauvegarde
708
    Title "Restauration de l'annuaire"
709
    # Recherche de l'ancienne objectClass "sambaServer" (#3730)
710
    dn=$(grep "ou=ordinateurs,ou=ressource" "$1/$LDIF" | grep "dn: cn" | grep -v '\$')
711
    if [ -n "$dn" ];then
712
        Red "L'entrée ldap débutant par \"$dn\" est obsolète."
713
        echo "Veuillez la supprimer du fichier : $LDIF"
714
        echo
715
        exit 1
716
    fi
717
    # Recherche des chemins commençant par /partages (#5686)
718
    grep -q "^sambaFilePath: \/partages\/" "$1/$LDIF"
719
    if [ $? -eq 0 ];then
720
        Red "Des attributs \"sambaFilePath\" débutent par \"/partages\""
721
        echo "Les occurences de \"/partages\" doivent être remplacées par \"/home\" dans le fichier : $LDIF"
722
        echo
723
        exit 1
724
    fi
725
    [ -f "$1/$READER" ] && cp -f "$1/$READER" /root/.reader
726
    # code inspiré de posttemplate/02-annuaire
727
    container_path_annuaire="$(CreoleGet container_path_annuaire)"
728
    CHROOT=''
729
    [ ! "$container_path_annuaire" = "" ] && CHROOT="chroot $container_path_annuaire"
730
    # le montage n'est pas accessible depuis le conteneur :)
731
    CreoleService slapd stop -c annuaire
732
    rm -f $container_path_annuaire/var/lib/ldap/*.*
733
    cp -f "$1/$LDIF" "$container_path_annuaire/tmp/$LDIF"
734
    $CHROOT slapadd -f /etc/ldap/slapd.conf -l "/tmp/$LDIF"
735
    testcmd $? "Erreur lors de la restauration de l'annuaire !"
736
    CreoleRun "chown openldap:openldap /var/lib/ldap/*" annuaire
737
    rm -f "$container_path_annuaire/tmp/$LDIF"
738
    CreoleService slapd start -c annuaire
739
    testcmd $? "Erreur lors du redémarrage d'OpenLDAP !"
740
}
741

    
742
saveldap2scribe(){
743
    # $1 : répertoire de sauvegarde
744
    Title "Mise à niveau de l'annuaire"
745
    python -c """ldif = '$1/$LDIF'
746
with open(ldif, 'r') as ldif_buffer:
747
    fic = ldif_buffer.readlines()
748
new = []
749
for line in fic:
750
    if line.startswith('mailDir: ') and '/MailDir/' in line:
751
        new.append('mailDir: /home/mail/%s/' % line.split('/')[3])
752
    else:
753
        new.append(line)
754
if new != fic:
755
    with open(ldif, 'w') as ldif_buffer:
756
        ldif_buffer.write(''.join(new))
757
"""
758
}
759

    
760
restoreldap2scribe(){
761
    # $1 : répertoire de sauvegarde
762
    Title "Mise à niveau de l'annuaire"
763
    python3 -c """from scribe.eoleshare import Share
764
s = Share()
765
s.ldap_admin.connect()
766
sh = s._get_shares_data()
767
for sha in sh:
768
    if not 'sambaShareModel' in sha[1]:
769
        name = sha[1]['sambaShareName'][0]
770
        if name in ['icones\$', 'groupes', 'commun', 'devoirs']:
771
            s._set_attr(name, 'sambaShareModel', name)
772
        else:
773
            s._set_attr(name, 'sambaShareModel', 'standard')
774
s.ldap_admin.close()
775
"""
776
}
777

    
778
saveldap2horus(){
779
    # $1 : répertoire de sauvegarde
780
    Title "Mise à niveau de l'annuaire"
781
    sed -i 's/\\profiles$/\\profil/g' "$1/$LDIF"
782
}
783

    
784
restoreldap2horus(){
785
    # $1 : répertoire de sauvegarde
786
    Title "Mise à niveau de l'annuaire"
787
    python3 -c """from horus.backend import get_share_template, mod_share
788
if get_share_template('minedu') == 'standard':
789
    mod_share('minedu', model='minedu')
790
if get_share_template('groupes') == 'standard':
791
    mod_share('groupes', model='groupes')
792
"""
793
}
794

    
795
usersync(){
796
    # $1 : répertoire de sauvegarde
797
    ca_file="$1/ca_ad.pem"
798
    if [ ! -e "$ca_file" ]; then
799
        ca_file="/etc/ssl/certs/ca_local.crt"
800
    fi
801
    Title "Synchronisation des comptes AD"
802
    keytool -delete -alias eole-ad -keystore /etc/ssl/certs/java/cacerts -storepass changeit >/dev/null
803
    keytool -import -trustcacerts -keystore /etc/ssl/certs/java/cacerts -storepass changeit -noprompt -alias eole-ad -file "$ca_file"
804
    /usr/share/eole/postservice/05-eolead-join-and-sync-ldap
805
    Title "Nettoyage du cache winbind"
806
    /usr/bin/actualise_cache
807
    if lxc-info addc 2>/dev/null >/dev/null && [ ! -d "$1/samba/bareos" ]
808
    then
809
        Title "Restauration des mots de passe"
810
        > /var/lib/lxc/addc/rootfs/tmp/injectpwd
811
        SEARCH_FILTER="(&(objectClass=inetOrgPerson)(objectClass=posixAccount))"
812
        for user in $(ldapsearch -x $SEARCH_FILTER uid |grep "^uid" | cut -d" " -f2)
813
        do
814
            pass="$(smbldap-usershow "$user" | grep sambaNTPassword | cut -d' ' -f2)"
815
            if [ ! "$pass" = "XXX" ]; then
816
                echo "pdbedit -u $user --set-nt-hash $pass" >> /var/lib/lxc/addc/rootfs/tmp/injectpwd
817
            fi
818
        done
819
        nb=$(wc -l < /var/lib/lxc/addc/rootfs/tmp/injectpwd)
820
        echo "Synchronisation en cours ($nb mots de passe)..."
821
        lxc-attach -n addc -- bash /tmp/injectpwd >/dev/null
822
        [ $? -ne 0 ] && exit 1
823
        rm -f /var/lib/lxc/addc/rootfs/tmp/injectpwd
824
    fi
825
    if [ "$(CreoleGet ldap_sasl_auth_delegation non)" = "oui" ];then
826
        Title "Mise en place de la délégation SASL"
827
        SEARCH_FILTER="(&(objectClass=inetOrgPerson)(objectClass=posixAccount)(!(objectClass=responsable)))"
828
        for user in $(ldapsearch -x $SEARCH_FILTER uid |grep "^uid" | cut -d" " -f2)
829
        do
830
            /usr/sbin/delegatetosasl.pl $user >/dev/null
831
        done
832
    fi
833
    echo
834
}
835

    
836
savesmb(){
837
    # $1 : répertoire de sauvegarde
838
    # $2 : amonecole ou rien
839
    Title "Sauvegarde des données liées à SAMBA et à CUPS"
840
    [ -x /usr/bin/CreoleGet ] && container_path_fichier="$(CreoleGet container_path_fichier)"
841
    mkdir -p "$1/cups"
842
    if [ -d "$container_path_fichier/etc/cups" ]
843
    then
844
        cp -f $container_path_fichier/etc/cups/printers.conf "$1/cups" 2>/dev/null
845
        cp -f $container_path_fichier/etc/cups/ppds.dat "$1/cups" 2>/dev/null
846
        if [ -d "$container_path_fichier/etc/cups/ppd" ]
847
        then
848
            cp -rf $container_path_fichier/etc/cups/ppd "$1/cups"
849
        fi
850
    fi
851
    mkdir -p "$1/samba"
852
    #if [ -f $container_path_fichier/var/lib/samba/secrets.tdb ];then
853
    #    cp -f $container_path_fichier/var/lib/samba/secrets.tdb "$1/samba"
854
    #elif [ -f $container_path_fichier/var/lib/samba/private/secrets.tdb ];then
855
    #    cp -f $container_path_fichier/var/lib/samba/private/secrets.tdb "$1/samba"
856
    #else
857
    #    cp -f $container_path_fichier/etc/samba/secrets.tdb  "$1/samba" 2>/dev/null
858
    #fi
859
    cp -rf $container_path_fichier/var/lib/samba/printers "$1/samba"
860
    for f in "ntdrivers.tdb" "ntforms.tdb" "ntprinters.tdb";do
861
    cp -f "$container_path_fichier/var/lib/samba/$f" "$1/samba" 2>/dev/null
862
    done
863
    if [ -f /var/lib/eole/config/sid.sav ];then
864
        cp /var/lib/eole/config/sid.sav "$1/samba/$SID"
865
    elif [ "$2" = "amonecole" ]; then
866
        CreoleRun "net getlocalsid | /usr/bin/awk '{print \$6}'" domaine > "$1/samba/$SID"
867
    else
868
        chroot "/$container_path_fichier" net getlocalsid | /usr/bin/awk '{print $6}' > "$1/samba/$SID"
869
    fi
870
}
871

    
872
restoresmb(){
873
    # $1 : répertoire de sauvegarde
874
    # $2 : amonecole pour amonecole, sinon rien
875
    Title "Restauration des données liées à SAMBA et à CUPS"
876
    container_path_fichier="$(CreoleGet container_path_fichier)"
877
    cp -f  "$1"/cups/printers.conf "$container_path_fichier/etc/cups/printers.conf" 2>/dev/null
878
    cp -f  "$1"/cups/ppds.dat "$container_path_fichier/etc/cups/ppds.dat" 2>/dev/null
879
    cp -rf "$1"/cups/ppd/* "$container_path_fichier/etc/cups/ppd/" 2>/dev/null
880
    cp -rf "$1"/samba/printers/* "$container_path_fichier/var/lib/samba/printers/" 2>/dev/null
881
    for f in "ntdrivers.tdb" "ntforms.tdb" "ntprinters.tdb";do
882
    cp -f "$1/samba/$f" "$container_path_fichier/var/lib/samba/$f" 2>/dev/null
883
    done
884
    NEWSID=`cat $1/samba/$SID`
885
    # overwrites new (ramdom) SID #25756
886
    cp -f $1/samba/$SID /var/lib/eole/config/sid.sav
887
    if [ ! "$2" = "amonecole" ]; then
888
        CHROOT=''
889
        [ ! "$container_path_fichier" = "" ] && CHROOT="chroot $container_path_fichier"
890
        $CHROOT net setlocalsid $NEWSID
891
        testcmd $? "Impossible de restaurer le SID du domaine"
892
    else
893
        CreoleRun "net setlocalsid $NEWSID" fichier
894
        testcmd $? "Impossible de restaurer le SID du domaine"
895
    fi
896
}
897

    
898
savescribemysql(){
899
    # $1 : répertoire de sauvegarde
900
    # $2 : version (22 ou 23)
901
    Title "Sauvegarde des bases Mysql"
902
    if [ -x /usr/bin/CreoleGet ];then
903
        container_path_mysql="$(CreoleGet container_path_mysql)"
904
        container_ip_mysql="$(CreoleGet container_ip_mysql)"
905
    fi
906
    mkdir -p "$1/mysql"
907
    cp $container_path_mysql/etc/mysql/debian.cnf $1/mysql
908

    
909
    if [ $EOLE_VERSION = '2.6' ] || [ $EOLE_VERSION = "2.8" ];then
910
        mysqlopts="--defaults-file=/etc/mysql/debian.cnf"
911
    else
912
        PASS=`/usr/bin/pwgen -1`
913
        if [ -f /usr/share/eole/sbin/mysql_pwd.py ]; then
914
            MYSQL_PWD=/usr/share/eole/sbin/mysql_pwd.py
915
        elif [ -f /usr/share/eole/mysql_pwd.py ]; then
916
            MYSQL_PWD=/usr/share/eole/mysql_pwd.py
917
        elif [ -f /usr/bin/mysql_pwd.py ]; then
918
            MYSQL_PWD=/usr/bin/mysql_pwd.py
919
        else
920
            echo "Impossible de trouver le script mysql_pwd.py"
921
        fi
922
        if [ ! -z "$MYSQL_PWD" ]; then
923
            "$MYSQL_PWD" "$PASS" nomodif >/dev/null
924
            if [ -n "$container_ip_mysql" ]
925
            then
926
                mysqlhost=""
927
                if [ "${container_ip_mysql}" = "127.0.0.1" ]
928
                then
929
                    mysqlhost="-h localhost"
930
                else
931
                    mysqlhost="-h $container_ip_mysql"
932
                fi
933
            fi
934
            mysqlopts="$mysqlhost -uroot -p$PASS"
935
        fi
936
    fi
937
    [ "$2"  != "22" ] && opt="--events" || opt=""
938
    [ $EOLE_VERSION = '2.6' ] && opt="$opt --single-transaction"
939
    [ "$2"  = "24" ]  && optdb="--databases" || optdb="--database"
940
    DATABASES=$(CreoleRun "mysql $mysqlopts -e \"show databases\"" "mysql" | grep -v "^Database$")
941
    for databasename in $DATABASES;do
942
        [ "$databasename" = "information_schema" ] && continue
943
        [ "$2"  = "24" ] && [ "$databasename" = "performance_schema" ] && continue
944
        echo -n "."
945
        CreoleRun "mysqldump $mysqlopts $optdb $databasename --flush-privileges --create-options -Q -c --lock-tables $opt" "mysql" > "$1/mysql/$databasename.sql"
946
        testcmd $? "Erreur lors de la sauvegarde de la base $databasename !"
947
    done
948
    echo
949
}
950

    
951
savehorusmysql(){
952
    # $1 : répertoire de sauvegarde
953
    # $2 : version (22 ou 23)
954
    Title "Sauvegarde des bases Mysql"
955
    mkdir -p "$1/mysql"
956
    cp /etc/mysql/debian.cnf "$1/mysql"
957
    PASS=`/usr/bin/pwgen -1`
958
    if [ "$2"  = "24" ];then
959
        /usr/share/eole/sbin/mysql_pwd.py "$PASS" nomodif >/dev/null
960
    else
961
        /usr/share/eole/mysql_pwd.py "$PASS" nomodif >/dev/null
962
    fi
963
    [ "$2"  != "22" ] && opt="--events" || opt=""
964
    if [ "$2"  = "24" ];then
965
        all="--all-databases"
966
    else
967
        all="--all-database"
968
    fi
969
    mysqldump $all -uroot -p$PASS $opt > "$1/mysql/$MYSQLDB"
970
}
971

    
972
restorescribemysql(){
973
    # $1 : répertoire de sauvegarde
974
    Title "Restauration des bases Mysql"
975
    #testf $1/mysql/mysql.sql
976
    #PASS=`/usr/bin/pwgen -1`
977
    #/usr/share/eole/sbin/mysql_pwd.py "$PASS" nomodif >/dev/null
978
    # FIXME : intérêt de restaurer la bdd mysql sur Scribe ?
979
    #echo -n "."
980
    #cp -f $1/mysql/debian.cnf /etc/mysql/debian.cnf
981
    #/usr/share/eole/mysql_pwd.py "$PASS" nomodif >/dev/null
982
    #adresse_ip_mysql=$(CreoleGet adresse_ip_mysql)
983
    for database in 'sympa';do
984
        if [ ! -f "$1/mysql/$database.sql" ];then
985
            Orange "Fichier $1/mysql/$database.sql absent"
986
            continue
987
        fi
988
        echo -n "."
989
        mysql --defaults-file=/etc/mysql/debian.cnf <"$1/mysql/$database.sql"
990
    done
991
    echo -n "."
992
    # mysql_upgrade n'est pas disponible sur le maître (fourni par mysql-server)
993
    CreoleRun "mysql_upgrade --defaults-file=/etc/mysql/debian.cnf --force" mysql >/dev/null
994
    echo
995
}
996

    
997
restoreamonecolemysql(){
998
    # $1 : répertoire de sauvegarde
999
    Title "Restauration des bases Mysql"
1000
    container_path_bdd="$(CreoleGet container_path_bdd)"
1001
    for database in 'sympa';do
1002
        if [ ! -f "$1/mysql/$database.sql" ];then
1003
            Orange "Fichier $1/mysql/$database.sql absent"
1004
            continue
1005
        fi
1006
        echo -n "."
1007
        testf "$1/mysql/$database.sql"
1008
        cp "$1/mysql/${database}.sql" $container_path_bdd/root/${database}.sql
1009
        CreoleRun "mysql --defaults-file=/etc/mysql/debian.cnf < /root/${database}.sql" mysql > /dev/null
1010
        rm -f $container_path_bdd/root/${database}.sql
1011
    done
1012
    echo -n "."
1013
    # mysql_upgrade n'est pas disponible sur le maître (fourni par mysql-server)
1014
    CreoleRun "mysql_upgrade --defaults-file=/etc/mysql/debian.cnf --force" mysql >/dev/null
1015
    echo
1016
}
1017
savebacula22(){
1018
    # $1 : répertoire de sauvegarde
1019
    Title "Sauvegarde de la configuration bacula"
1020
    mkdir -p "$1/bacula"
1021
    #cp -f /etc/bacula/typesupport.conf $1/bacula 2>/dev/null
1022
    /usr/share/eole/bacula/baculasupport.py -l >"$1/bacula/support.conf"
1023
    #cp -f /etc/bacula/eolemsgdefs.pic  $1/bacula 2>/dev/null
1024
    #cp -f /etc/bacula/eolemessages.conf $1/bacula 2>/dev/null
1025
    /usr/share/eole/bacula/baculamessage.py -l >"$1/bacula/mail.conf"
1026
    cp -f /etc/bacula/listefichiers*.conf "$1/bacula"
1027
    # chemins Scribe
1028
    cp -f /var/www/ead/config/bacula-distant.txt "$1/bacula" 2>/dev/null
1029
    cp -f /var/www/ead/config/bacula-usb.txt "$1/bacula" 2>/dev/null
1030
    # chemins Horus
1031
    cp -f /var/www/ead/tmp/bacula-distant.txt "$1/bacula" 2>/dev/null
1032
    cp -f /var/www/ead/tmp/bacula-usb.txt "$1/bacula" 2>/dev/null
1033
}
1034

    
1035
savebacula23(){
1036
    # $1 : répertoire de sauvegarde
1037
    Title "Sauvegarde de la configuration bacula"
1038
    mkdir -p "$1/bacula"
1039
    # EOLE 2.3
1040
    python -c """from pyeole.bacula import load_bacula_support;
1041
for k,v in load_bacula_support().items():print '{0}=\"{1}\"'.format(k,v)""" > $1/bacula/bacula23.conf
1042
    python -c """from pyeole.bacula import load_bacula_mail;mail=load_bacula_mail();
1043
if mail:
1044
    for k,v in mail.items():print '{0}=\"{1}\"'.format(k,v)""" >> $1/bacula/bacula23.conf
1045
    if [ -f /var/lib/eole/config/baculajobs.conf ];then
1046
        cp -f /var/lib/eole/config/baculajobs.conf $1/bacula/baculajobs.conf
1047
    fi
1048
}
1049

    
1050
savebacula24(){
1051
    # $1 : répertoire de sauvegarde
1052
    Title "Sauvegarde de la configuration bacula"
1053
    if [ -f $1/extra/bacula/config.eol ];then
1054
        [ -d $1/extra/bareos ] && rm -rf $1/extra/bareos
1055
        mv -f $1/extra/bacula $1/extra/bareos
1056
        sed -i 's/bacula/bareos/g' $1/extra/bareos/config.eol
1057
    fi
1058
}
1059

    
1060
restorebacula(){
1061
    # $1 : répertoire de sauvegarde
1062
    Title "Restauration de la configuration des sauvegardes"
1063
    if [ -f $1/extra/bareos/config.eol ];then
1064
        # configuration "extra" en 2.4
1065
        return
1066
    fi
1067
    script="/usr/share/eole/sbin/bareosconfig.py"
1068
    if [ -f $1/bacula/bacula23.conf ];then
1069
        . $1/bacula/bacula23.conf
1070
    else
1071
        support=`cat $1/bacula/support.conf`
1072
        if [ "$support" = 'bande' ];then
1073
            support='manual'
1074
        elif [ "$support" = 'usb' ];then
1075
            usb_path=`cat "$1/bacula/bacula-usb.txt" 2>/dev/null`
1076
        elif [ "$support" = "distant" ];then
1077
            support='smb'
1078
            if [ -f "$1/bacula/bacula-distant.txt" ];then
1079
                smb_machine=`awk -F ' ' '{print $1}' "$1/bacula/bacula-distant.txt"`
1080
                if [ "${smb_machine:0:2}" = "//" ];then
1081
                    # format Horus-2.2
1082
                    smb_partage=`echo $smb_machine | awk -F '/' '{print $4}'`
1083
                    smb_machine=`echo $smb_machine | awk -F '/' '{print $3}'`
1084
                    smb_login=`awk -F ' ' '{print $3}' "$1/bacula/bacula-distant.txt"`
1085
                    smb_password=`awk -F ' ' '{print $4}' "$1/bacula/bacula-distant.txt"`
1086
                else
1087
                    # format Scribe-2.2
1088
                    smb_partage=`awk -F ' ' '{print $3}' "$1/bacula/bacula-distant.txt"`
1089
                    smb_login=`awk -F ' ' '{print $4}' "$1/bacula/bacula-distant.txt"`
1090
                    smb_password=`awk -F ' ' '{print $5}' "$1/bacula/bacula-distant.txt"`
1091
                fi
1092
                smb_ip=`awk -F ' ' '{print $2}' "$1/bacula/bacula-distant.txt"`
1093
            fi
1094
        fi
1095
        mail_ok=`awk -F ';' '{print $2}' "$1/bacula/mail.conf"`
1096
        mail_error=`awk -F ';' '{print $3}' "$1/bacula/mail.conf"`
1097
    fi
1098

    
1099
    # restauration des adresses mail
1100
    echo -n "."
1101
    [ ! -z "$mail_ok" ] && $script -m --mail_ok=$mail_ok
1102
    echo -n "."
1103
    [ ! -z "$mail_error" ] && $script -m --mail_error=$mail_error
1104
    echo "."
1105
    # restaurtion du support "manual"
1106
    if [ "$support" = 'manual' ];then
1107
        $script -s manual
1108
    # restauration du support "usb"
1109
    elif [ "$support" = 'usb' ];then
1110
        if [ -z "$usb_path" ];then
1111
            Orange "Support USB non configuré"
1112
        else
1113
            $script -s usb --usb_path=$usb_path
1114
        fi
1115
    # restauration du support "smb"
1116
    elif [ "$support" = 'smb' ];then
1117
        if [ -z "$smb_machine" -o -z "$smb_ip" -o -z "$smb_partage" ];then
1118
            Orange "Configuration smb incomplète"
1119
        else
1120
            smbopts="--smb_machine=$smb_machine --smb_ip=$smb_ip --smb_partage=$smb_partage"
1121
            if [ ! -z "$smb_login" -a ! -z "$smb_password" ];then
1122
                smbopts="$smbopts --smb_login=$smb_login --smb_password=$smb_password"
1123
            fi
1124
            $script -s smb $smbopts
1125
        fi
1126
    elif [ "$support" = 'none' ];then
1127
        Orange "Aucun support de sauvegarde configuré"
1128
    else
1129
        Orange "Support de sauvegarde \"$support\" inconnu"
1130
    fi
1131
    if [ -f $1/bacula/baculajobs.conf ];then
1132
        python3 -c """import sys
1133
from pickle import load
1134
from pyeole.bareos import add_job
1135
for job in load(file('$1/bacula/baculajobs.conf', 'r')):
1136
    job.update({'no_reload':True})
1137
    try:
1138
        add_job(**job)
1139
        sys.stdout.write('.')
1140
    except Exception, msg:
1141
        print msg
1142
"""
1143
    fi
1144
}
1145

    
1146
savead(){
1147
    # utiliser samba_backup dans le conteneur en reprenant le fonctionnement du schedule samba_backup (non installé)
1148
    if [ "$2" = "amonecole" ]; then
1149
        Title "Sauvegarde des données du contrôleur de domaine"
1150
        /usr/share/eole/schedule/scripts/samba_backup
1151
        cp -a "/home/backup/samba" "$1/"
1152
        cp "$(CreoleGet container_path_domaine)/etc/eole/private/eole-seth-education.password" "$1/samba"
1153
    elif lxc-info addc 2>/dev/null >/dev/null
1154
    then
1155
        Title "Sauvegarde des données du contrôleur de domaine"
1156
        ADDC_ROOTFS="$(lxc-config lxc.lxcpath)/addc/rootfs"
1157
        #lxc-attach -n addc -- /usr/bin/addc_backup
1158
        cp -a "${ADDC_ROOTFS}/home/backup/samba" "$1/"
1159
    else
1160
        keytool -exportcert -rfc -alias eole-ad -file "$1/ca_ad.pem" -keystore /etc/ssl/certs/java/cacerts -storepass changeit
1161
    fi
1162
}
1163

    
1164
restoread(){
1165
    # utiliser samba-tool backup dans le conteneur
1166
    if lxc-info addc 2>/dev/null >/dev/null && [ -d "$1/samba/" ]
1167
    then
1168
        Title "Restauration des données du contrôleur de domaine"
1169
        ADDC_ROOTFS="$(lxc-config lxc.lxcpath)/addc/rootfs"
1170
    [ -d "${ADDC_ROOTFS}/home/backup/samba" ] || mkdir -p "${ADDC_ROOTFS}/home/backup/samba"
1171
    cp -a "$1/samba" "${ADDC_ROOTFS}/home/backup/"
1172
    cp -a "${ADDC_ROOTFS}/var/lib/samba/private/tls" /tmp/
1173
    if [ -d "$1/samba/bareos" ]; then
1174
        lxc-attach -n addc -- /usr/bin/online_addc_restore
1175
    else
1176
        lxc-attach -n addc -- /usr/bin/addc_restore
1177
    fi
1178
    cp -a /tmp/tls "${ADDC_ROOTFS}/var/lib/samba/private/"
1179

    
1180
    lxc-attach -n addc -- touch /var/lib/samba/.instance_ok
1181
    lxc-attach -n addc -- systemctl stop samba-ad-dc
1182
    lxc-attach -n addc -- chmod 0700 /var/lib/samba/private/msg.sock
1183
    lxc-attach -n addc -- systemctl start samba-ad-dc
1184
    mkdir /var/lib/lxc/addc/rootfs/home/sysvol/$DOM.ac-rennes.fr/Policies
1185
    lxc-attach -n addc -- chown root:BUILTIN/administrators /home/sysvol/$DOM.ac-rennes.fr/Policies
1186
    mv /var/lib/lxc/addc/rootfs/home/sysvol/$DOM.ac-rennes.fr/{* /var/lib/lxc/addc/rootfs/home/sysvol/$DOM.ac-rennes.fr/Policies
1187
    lxc-attach -n addc -- chown  -R "$DOM/domain admins":"$DOM/domain admins" /home/sysvol/$DOM.ac-rennes.fr/Policies/
1188
    mv /var/lib/lxc/addc/rootfs/home/sysvol/$DOM.ac-rennes.fr/PolicyDefinitions /var/lib/lxc/addc/rootfs/home/sysvol/$DOM.ac-rennes.fr/Policies/
1189
    lxc-attach -n addc -- chown -R BUILTIN/administrators:users /home/sysvol/$DOM.ac-rennes.fr/Policies/PolicyDefinitions
1190
    fi
1191
}
1192

    
1193
saveamon(){
1194
    # $1 : répertoire de sauvegarde
1195
    Title "Sauvegarde des personnalisations Eole-Guardian"
1196
    [ -x /usr/bin/CreoleGet ] && container_path_proxy="$(CreoleGet container_path_proxy)"
1197
    mkdir -p "$1/dansguardian"
1198
    dg=$container_path_proxy/var/lib/blacklists/dansguardian
1199
    if [ -d "${dg}0" ];then
1200
        mkdir -p "$1/dansguardian/dansguardian0"
1201
        cp -rf "${dg}0/"* "$1/dansguardian/dansguardian0"
1202
    fi
1203
    if [ -d "${dg}1" ];then
1204
        mkdir -p "$1/dansguardian/dansguardian1"
1205
        cp -rf "${dg}1/"* "$1/dansguardian/dansguardian1"
1206
    fi
1207

    
1208
    mkdir -p "$1/ead"
1209
    ead=/usr/share/ead2/backend/tmp
1210
    config=/var/lib/eole/config
1211
    # Sites / Mode de filtrage
1212
    cp -f $ead/filtrage-contenu* "$1/ead" 2>/dev/null
1213
    # "Destinations interdites"
1214
    cp -f $ead/dest_interdites*.txt "$1/ead" 2>/dev/null
1215
    # "Sources interdites" (web)
1216
    cp -f $ead/horaire_ip*.txt "$1/ead" 2>/dev/null
1217
    # "Sources interdites" (réseau)
1218
    cp -f $ead/poste_all*.txt "$1/ead" 2>/dev/null
1219
    # Groupe de machine
1220
    cp -f $ead/ipset_group*.txt "$1/ead" 2>/dev/null
1221
    cp -f $ead/ipset_schedules*.pickle "$1/ead" 2>/dev/null
1222
    # Règles du pare-feu
1223
    if [ -f $config/regles.csv ];then
1224
        cp -f $config/regles.csv "$1/ead" 2>/dev/null
1225
    else
1226
        cp -f $ead/regles.csv "$1/ead" 2>/dev/null
1227
    fi
1228
    oldead=/var/www/ead/tmp
1229
    cp -f $oldead/kill-p2p "$1/ead" 2>/dev/null
1230
    if [ -f $config/horaires.txt ];then
1231
        cp -f $config/horaires.txt "$1/ead" 2>/dev/null
1232
    else
1233
        cp -f $oldead/horaires.txt "$1/ead" 2>/dev/null
1234
    fi
1235

    
1236
    mkdir -p "$1/squid"
1237
    squid=$container_path_proxy/etc/squid
1238
    # /etc/squid3 sur EOLE 2.4
1239
    [ ! -d $squid ] && squid=${squid}3
1240

    
1241
    Title "Sauvegarde des personnalisations Squid"
1242
    cp -f $squid/domaines_nocache_* "$1/squid" 2>/dev/null
1243
    cp -f $squid/domaines_noauth_* "$1/squid" 2>/dev/null
1244
    cp -f $squid/src_noauth_* "$1/squid" 2>/dev/null
1245
    cp -f $squid/src_nocache_* "$1/squid" 2>/dev/null
1246
}
1247

    
1248
restoreamon(){
1249
    # $1 : répertoire de sauvegarde
1250
    Title "Restauration des personnalisations Eole-Guardian"
1251
    container_path_proxy="$(CreoleGet container_path_proxy)"
1252
    dg=$container_path_proxy/var/lib/blacklists/dansguardian
1253
    if [ "$(CreoleGet dans_instance_1_active 'non')" == "oui" ];then
1254
        if [ -d "$1/dansguardian/dansguardian0" ];then
1255
            cp -rf "$1/dansguardian/dansguardian0/"* "${dg}0"
1256
        fi
1257
    fi
1258
    if [ "$(CreoleGet dans_instance_2_active 'non')" == "oui" ];then
1259
        if [ -d "$1/dansguardian/dansguardian1" ];then
1260
            cp -rf "$1/dansguardian/dansguardian1/"* "${dg}1"
1261
        fi
1262
    fi
1263

    
1264
    ead=/usr/share/ead2/backend/tmp
1265
    for f in "filtrage-contenu*" "dest_interdites*.txt" "horaire_ip*.txt"\
1266
             "poste_all*.txt" "ipset_group*.txt" "ipset_schedules*.pickle";do
1267
        cp -f "$1/ead/"$f $ead 2>/dev/null
1268
    done
1269

    
1270
    if [ ! -f "$1/ead/kill-p2p" ];then
1271
        # il est à "on" par défaut sur 2.3
1272
        echo "KILLP2P=off" > /var/lib/eole/config/killp2p.conf
1273
    fi
1274
    cp -f "$1/ead/horaires.txt" /var/lib/eole/config/horaires.txt 2>/dev/null
1275
    cp -f "$1/ead/regles.csv" /var/lib/eole/config/regles.csv 2>/dev/null
1276

    
1277
    squid=$container_path_proxy/etc/squid
1278
    Title "Restauration des personnalisations Squid"
1279
    cp -f "$1"/squid/domaines_noauth_user "$container_path_proxy/var/lib/eole/domaines_noauth_user" 2>/dev/null
1280
    cp -f "$1"/squid/domaines_noauth_user "$container_path_proxy/etc/guardian/common/domaines_noauth_user" 2>/dev/null
1281
    sed -i s/^\\.//g "$container_path_proxy/etc/guardian/common/domaines_noauth_user" 2>/dev/null
1282
    cp -f "$1"/squid/domaines_nocache_* "$squid" 2>/dev/null
1283
    cp -f "$1"/squid/domaines_noauth_* "$squid" 2>/dev/null
1284
    cp -f "$1"/squid/src_noauth_* "$squid" 2>/dev/null
1285
    cp -f "$1"/squid/src_nocache_* "$squid" 2>/dev/null
1286
}
1287

    
1288
saveenvole(){
1289
    # $1 : répertoire de sauvegarde
1290
    Title "Sauvegarde des applications web"
1291
    [ -x /usr/bin/CreoleGet ] && container_path_web="$(CreoleGet container_path_web)"
1292
    mkdir -p $1/html
1293
    cp -rpf "$container_path_web"/var/www/html/ "$1"
1294

    
1295
    mkdir -p $1/www-data
1296
    if [ -d /home/www-data ];then
1297
        Title "Sauvegarde des données des applications web"
1298
        cp -rpf /home/www-data/ "$1"
1299
    fi
1300

    
1301
    mkdir -p $1/redis
1302
    if [ -d /var/lib/redis ];then
1303
        Title "Sauvegarde des bases Redis"
1304
        cp -rpf /var/lib/redis/ "$1"
1305
    fi
1306
}
1307

    
1308
savedivers(){
1309
    # $1 : répertoire de sauvegarde
1310
    Title "Sauvegarde des autres fichiers"
1311
    # sauvegarde des certificats SSL (#2475)
1312
    mkdir -p $1/ssl
1313
    cp -rf /etc/ssl/* "$1/ssl"
1314
    # suppression des liens symbolique
1315
    find "$1/ssl" -type l -delete
1316
    # déplacer la clé du serveur si elle est à l’ancien emplacement
1317
    [ -f "$1/ssl/certs/eole.key" ] && mv "$1/ssl/certs/eole.key" "$1/ssl/private/eole.key" && chmod 600 "$1/ssl/private/eole.key"
1318
    mkdir -p $1/config
1319
    ead_config=/usr/share/ead2/backend/config
1320
    [ -f "$ead_config/perm_local.ini" ] && cp -f "$ead_config/perm_local.ini" "$1/config"
1321
    [ -f "$ead_config/roles_local.ini" ] && cp -f "$ead_config/roles_local.ini" "$1/config"
1322
    ead_tmp=/usr/share/ead2/backend/tmp
1323
    eole_config=/var/lib/eole/config
1324
    [ -f "$ead_tmp/cron.txt" ] && cp -f "$ead_tmp/cron.txt" "$1/config/cron.txt"
1325
    if [ -f "$eole_config/bp_server.conf" ];then
1326
        cp -f "$eole_config/bp_server.conf" "$1/config/bp_server.conf"
1327
    else
1328
        cp -f "$ead_tmp/bp_server.txt" "$1/config/bp_server.conf"
1329
    fi
1330
    [ -d /usr/share/horus/models ] && cp -rf /usr/share/horus/models "$1/config"
1331
    [ -f /usr/share/eole/wpkg/wpkg_config.eol ] && cp /usr/share/eole/wpkg/wpkg_config.eol "$1"
1332
    cp -f $eole_config/dhcp.conf "$1/config/" 2>/dev/null
1333
    echo
1334
}
1335

    
1336
savesso(){
1337
    # $1 : répertoire de sauvegarde
1338
    sso_dir=/usr/share/sso
1339
    if [ -d $sso_dir ];then
1340
        Title "Sauvegarde des données du service SSO"
1341
        # filtres et fichiers de configuration SSO
1342
        backup_dir=$1/sso
1343
        mkdir -p $backup_dir
1344
        for sso_conf_dir in app_filters attribute_sets external_attrs user_infos metadata interface securid_users
1345
        do
1346
            [ -d ${sso_dir}/${sso_conf_dir} ] && /bin/cp -rf ${sso_dir}/${sso_conf_dir} $backup_dir
1347
        done
1348
    fi
1349
}
1350

    
1351
savecreole(){
1352
    # $1 : répertoire de sauvegarde
1353
    BACKUP_DIR="$1/creolelocal"
1354
    Title "Sauvegarde des personnalisations Creole locales (non restauré)"
1355
    mkdir -p ${BACKUP_DIR}/distrib
1356
    mkdir -p ${BACKUP_DIR}/dicos
1357
    mkdir -p ${BACKUP_DIR}/patch
1358
    if [ -d /usr/share/eole/creole ];then
1359
        CREOLE_DIR="/usr/share/eole/creole"
1360
    else
1361
        CREOLE_DIR="/etc/eole"
1362
    fi
1363
    # dictionnaires locaux
1364
    /bin/cp -rf $CREOLE_DIR/dicos/local/*.xml ${BACKUP_DIR}/dicos/ >/dev/null 2>&1
1365
    # patchs
1366
    /bin/cp -rf $CREOLE_DIR/patch/*.patch ${BACKUP_DIR}/patch/ >/dev/null 2>&1
1367
    # templates non installés par un paquet (variante et locaux)
1368
    for TMPL in `ls $CREOLE_DIR/distrib/*`
1369
    do
1370
        dpkg -S $TMPL >/dev/null 2>&1
1371
        if [ $? -ne 0 ];then
1372
            /bin/cp -rf $TMPL ${BACKUP_DIR}/distrib/
1373
        fi
1374
    done
1375
}
1376

    
1377
restoredivers(){
1378
    # $1 : répertoire de sauvegarde
1379
    Title "Restauration des autres fichiers"
1380
    ead_config=/usr/share/ead2/backend/config/
1381
    [ -f "$1/config/perm_local.ini" ] && cp -f "$1/config/perm_local.ini" "$ead_config"
1382
    [ -f "$1/config/roles_local.ini" ] && cp -f "$1/config/roles_local.ini" "$ead_config"
1383
    cp -f "$1/config/bp_server.conf" /var/lib/eole/config 2>/dev/null
1384
    # restauration des configurations extra
1385
    [ -d $1/extra ] && cp -rf $1/extra/* /etc/eole/extra/
1386
    if [ -d "$1/config/models" ];then
1387
        rsync -cav --log-file $RSYNC_LOG --ignore-existing "$1/config/models" /usr/share/eole/fichier/models >/dev/null
1388
    fi
1389
    if [ -f "$1/wpkg_config.eol" ];then
1390
        mkdir -p /usr/share/eole/wpkg
1391
        cp -f "$1/wpkg_config.eol" /usr/share/eole/wpkg
1392
    fi
1393
    # désactivation de la maj hebdomadaire
1394
    if [ -f "$1/config/cron.txt" ] && [ $(cat "$1/config/cron.txt" | wc -w) -eq 0 ];then
1395
        /usr/share/eole/schedule/manage_schedule post majauto weekly del >/dev/null
1396
    fi
1397
    cp -f "$1/config/dhcp.conf" /var/lib/eole/config/dhcp.conf 2>/dev/null
1398
    echo
1399
}
1400

    
1401
restoresso(){
1402
    # $1 : répertoire de sauvegarde
1403
    sso_dir=/usr/share/sso
1404
    if [ -d $sso_dir ];then
1405
        Title "Restauration des données du service SSO"
1406
        restoresso_dir(){
1407
            # restauration des fichiers d'un répertoire (si non existants)
1408
            src_dir=$1
1409
            dest_dir=$2
1410
            extensions=*
1411
            # traite tout les fichier ou une extension particulière
1412
            [ -z "$3" ] || extensions=*.$3
1413
            mkdir -p ${dest_dir}
1414
            if [ -d $src_dir ];then
1415
                for data_file in $(ls -d ${src_dir}/${extensions} 2>/dev/null);do
1416
                    # on n'écrase pas les fichiers installés par les paquet
1417
                    filename=`basename $data_file`
1418
                    [ -e ${dest_dir}/${filename} ] || /bin/cp -r $data_file $dest_dir/
1419
                done
1420
            fi
1421
        }
1422
        ## répetoires de filtres, attributs calculés, metadata, ..
1423
        backup_dir=$1/sso
1424
        for sso_conf_dir in app_filters attribute_sets external_attrs user_infos metadata securid_users;do
1425
            restoresso_dir ${backup_dir}/${sso_conf_dir} ${sso_dir}/${sso_conf_dir}
1426
        done
1427
        interf_dir=${sso_dir}/interface
1428
        int_backup_dir=$1/sso/interface
1429
        ## presonnalisations de l'interface
1430
        # themes et infos homonymes
1431
        for data_dir in images themes theme/image theme/style info_homonymes;do
1432
            restoresso_dir ${int_backup_dir}/${data_dir} ${interf_dir}/${data_dir}
1433
        done
1434
        # fichiers divers de l'interface (avertissement.txt, fichiers .css et .tmpl)
1435
        restoresso_dir $int_backup_dir $interf_dir "tmpl"
1436
        restoresso_dir $int_backup_dir $interf_dir "css"
1437
        restoresso_dir $int_backup_dir $interf_dir "txt"
1438
    fi
1439
}
1440

    
1441
#scribedivers(){
1442
#    # $1 : répertoire de sauvegarde
1443
#    #Title "Sauvegarde des autres fichiers"
1444
#    mkdir -p $1/config
1445
#    else
1446
#        echo "simple" > $1/config/controlevnc.conf
1447
#    fi
1448
#    # FIXME : posh et applications => c'est mort ?
1449
#}
1450

    
1451
#finsauve(){
1452
#    echo
1453
#    Green "Sauvegarde spéciale terminée"
1454
#}
1455

    
1456
#finresto(){
1457
#    Green "Restauration spéciale terminée"
1458
#}
1459

    
1460
scribe22(){
1461
    ## SAUVEGARDE SPECIALE POUR SCRIBE-2.2 ##
1462
    montage $DD
1463
    /etc/init.d/samba stop
1464
    /etc/init.d/nscd start
1465
    DDS="$DD/scribe-$numero_etab"
1466
    /bin/mkdir -p "$DDS"
1467
    saveconfigeol "$DDS"
1468
    savecreole "$DDS"
1469
    questionsave '/home'
1470
    savedata=$?
1471
    [ $savedata -eq 0 ] && savescribedata "$DDS"
1472
    savemail "$DDS"
1473
    # la sauvegarde des quotas et des acl se base sur pam/ldap
1474
    /etc/init.d/slapd restart
1475
    savequota "$DDS"
1476
    savescribeacl "$DDS"
1477
    saveldap "$DDS"
1478
    saveldap2scribe "$DDS"
1479
    savesmb "$DDS"
1480
    savescribemysql "$DDS" '22'
1481
    savebacula22 "$DDS"
1482
    saveenvole "$DDS"
1483
    savesso "$DDS"
1484
    savedivers "$DDS"
1485
    demontage $DD
1486
    /etc/init.d/samba start
1487
    finsauve
1488
}
1489

    
1490
horus22(){
1491
    ## SAUVEGARDE SPECIALE POUR HORUS-2.2 ##
1492
    montage $DD
1493
    /etc/init.d/xinetd stop
1494
    /etc/init.d/samba stop
1495
    /etc/init.d/nscd start
1496
    DDS="$DD/horus-$numero_etab"
1497
    saveconfigeol "$DDS"
1498
    savecreole "$DDS"
1499
    questionsave '/data'
1500
    savedata=$?
1501
    [ $savedata -eq 0 ] && savehorusdata "$DDS"
1502
    # la sauvegarde des quotas et des acl se base sur pam/ldap
1503
    /etc/init.d/slapd restart
1504
    savequota "$DDS"
1505
    [ $savedata -eq 0 ] && savehorusacl "$DDS"
1506
    saveldap "$DDS"
1507
    saveldap2horus "$DDS"
1508
    savesmb "$DDS"
1509
    savehorusmysql "$DDS" '22'
1510
    savebacula22 "$DDS"
1511
    savesso "$DDS"
1512
    savedivers "$DDS"
1513
    demontage $DD
1514
    /etc/init.d/samba start
1515
    #[ "$xinet_interbase" != 'non' ] && /etc/init.d/xinetd start
1516
    finsauve
1517
}
1518

    
1519
amon22(){
1520
    ## SAUVEGARDE SPECIALE POUR AMON-2.2 ##
1521
    montage $DD
1522
    DDS="$DD/amon-$numero_etab"
1523
    saveconfigeol "$DDS"
1524
    savecreole "$DDS"
1525
    saveamon "$DDS"
1526
    savesso "$DDS"
1527
    savedivers "$DDS"
1528
    demontage $DD
1529
    finsauve
1530
}
1531

    
1532
scribe23(){
1533
    ## SAUVEGARDE SPECIALE POUR SCRIBE-2.3 et AmonEcole 2.3 ##
1534
    montage $DD
1535
    CreoleService smbd stop
1536
    CreoleService nscd start
1537
    DDS="$DD/scribe-$numero_etab"
1538
    /bin/mkdir -p "$DDS"
1539
    saveconfigeol "$DDS"
1540
    savecreole "$DDS"
1541
    questionsave '/home'
1542
    savedata=$?
1543
    [ $savedata -eq 0 ] && savescribedata "$DDS"
1544
    savemail "$DDS"
1545
    # la sauvegarde des quotas et des acl se base sur pam/ldap
1546
    CreoleService slapd restart
1547
    savequota "$DDS"
1548
    savescribeacl "$DDS"
1549
    saveldap "$DDS"
1550
    saveldap2scribe "$DDS"
1551
    savesmb "$DDS"
1552
    savescribemysql "$DDS" '23'
1553
    savebacula23 "$DDS"
1554
    saveenvole "$DDS"
1555
    [ "$1" = "amonecole" ] && saveamon "$DDS"
1556
    savesso "$DDS"
1557
    savedivers "$DDS"
1558
    demontage $DD
1559
    CreoleService smbd start
1560
    finsauve
1561
}
1562

    
1563
horus23(){
1564
    ## SAUVEGARDE SPECIALE POUR HORUS-2.3 ##
1565
    montage $DD
1566
    CreoleService xinetd stop
1567
    CreoleService smbd stop
1568
    CreoleService nscd start
1569
    DDS="$DD/horus-$numero_etab"
1570
    saveconfigeol "$DDS"
1571
    savecreole "$DDS"
1572
    questionsave '/home'
1573
    savedata=$?
1574
    [ $savedata -eq 0 ] && savehorusdata "$DDS"
1575
    # la sauvegarde des quotas et des acl se base sur pam/ldap
1576
    CreoleService slapd restart
1577
    savequota "$DDS"
1578
    [ $savedata -eq 0 ] && savehorusacl "$DDS"
1579
    saveldap "$DDS"
1580
    #saveldap2horus "$DDS"
1581
    savesmb "$DDS"
1582
    savehorusmysql "$DDS" '23'
1583
    savebacula23 "$DDS"
1584
    savesso "$DDS"
1585
    savedivers "$DDS"
1586
    demontage $DD
1587
    CreoleService smbd start
1588
    #[ "$activer_interbase" != 'non' ] && CreoleService xinetd start
1589
    finsauve
1590
}
1591

    
1592
amon23(){
1593
    ## SAUVEGARDE SPECIALE POUR AMON >= 2.3 ##
1594
    # $1 : "25" ou rien
1595
    montage $DD "$1"
1596
    DDS="$DD/amon-$numero_etab"
1597
    saveconfigeol "$DDS"
1598
    savecreole "$DDS"
1599
    saveamon "$DDS"
1600
    savesso "$DDS"
1601
    savedivers "$DDS"
1602
    demontage $DD
1603
    finsauve
1604
}
1605

    
1606
scribe24(){
1607
    ## SAUVEGARDE SPECIALE POUR SCRIBE >= 2.4 et AmonEcole >= 2.4 ##
1608
    # $1 : "amonecole" ou rien
1609
    # $2 : "25" ou rien
1610
    montage $DD "$2"
1611
    CreoleService smbd stop
1612
    CreoleService nscd start
1613
    DDS="$DD/scribe-$numero_etab"
1614
    /bin/mkdir -p "$DDS"
1615
    saveconfigeol "$DDS"
1616
    savecreole "$DDS"
1617
    questionsave '/home'
1618
    savedata=$?
1619
    [ $savedata -eq 0 ] && savescribedata "$DDS"
1620
    savemail "$DDS"
1621
    # la sauvegarde des quotas et des acl se base sur pam/ldap
1622
    CreoleService slapd restart
1623
    savequota "$DDS"
1624
    savescribeacl "$DDS"
1625
    saveldap "$DDS"
1626
    # saveldap2scribe "$DDS"
1627
    savesmb "$DDS"
1628
    savescribemysql "$DDS" '24'
1629
    savebacula24 "$DDS"
1630
    saveenvole "$DDS"
1631
    [ "$1" = "amonecole" ] && amonecole26
1632
    savesso "$DDS"
1633
    savedivers "$DDS"
1634
    demontage $DD
1635
    CreoleService smbd start
1636
    finsauve
1637
}
1638

    
1639
horus24(){
1640
    ## SAUVEGARDE SPECIALE POUR HORUS >= 2.4 ##
1641
    # $1 : "25" ou rien
1642
    montage $DD "$1"
1643
    CreoleService xinetd stop
1644
    CreoleService smbd stop
1645
    CreoleService nscd start
1646
    DDS="$DD/horus-$numero_etab"
1647
    saveconfigeol "$DDS"
1648
    savecreole "$DDS"
1649
    questionsave '/home'
1650
    savedata=$?
1651
    [ $savedata -eq 0 ] && savehorusdata "$DDS"
1652
    # la sauvegarde des quotas et des acl se base sur pam/ldap
1653
    CreoleService slapd restart
1654
    savequota "$DDS"
1655
    [ $savedata -eq 0 ] && savehorusacl "$DDS"
1656
    saveldap "$DDS"
1657
    #saveldap2horus "$DDS"
1658
    savesmb "$DDS"
1659
    savehorusmysql "$DDS" '24'
1660
    savebacula24 "$DDS"
1661
    savesso "$DDS"
1662
    savedivers "$DDS"
1663
    demontage $DD
1664
    CreoleService smbd start
1665
    #[ "$activer_interbase" != 'non' ] && CreoleService xinetd start
1666
    finsauve
1667
}
1668

    
1669
restoreaddc(){
1670
    Title "Restauration de l'annuaire"
1671
    cp /usr/share/eole/upgrade/restore/csv2samba "$1/csv/"
1672
    pushd "$1/csv"
1673
    ./csv2samba
1674
    popd
1675
}
1676

    
1677
restoreaddcseth(){
1678
    Title "Restauration de l'annuaire"
1679
    rm -rf /home/backup/samba/*
1680
    cp -a "$1/samba"/* /home/backup/samba/
1681
    mv "/home/backup/samba/eole-seth-education.password" "$(CreoleGet container_path_domaine)/etc/eole/private/eole-seth-education.password"
1682
    CreoleRun "touch /var/lib/samba/.instance_ok" fichier
1683
    python3 /usr/share/eole/bareos/restore/addc.py --force_post
1684
    #CreoleRun "/usr/bin/addc_restore" domaine
1685
}
1686

    
1687
extract_ldap_2_csv(){
1688
    DDS=$1
1689
    mkdir $DDS/csv
1690
    Title "Extraction de l'annuaire au format CSV"
1691
    echo """#!/usr/bin/python
1692

    
1693
import ldap
1694
import csv
1695
from creole.client import CreoleClient
1696
from creole.eosfunc import pwdreader
1697
from scribe.ldapconf import GROUP_FILTER, SHARE_FILTER, USER_FILTER, RACINE
1698

    
1699
client = CreoleClient()
1700

    
1701
host = 'ldap://{}:389'.format(client.get_creole('container_ip_annuaire'))
1702
ldap_reader='cn=reader,o=gouv,c=fr'
1703
ldap_reader_passfile='/root/.reader'
1704

    
1705
dn = client.get_creole('ldap_reader')
1706
pw = pwdreader('', client.get_creole('ldap_reader_passfile'))
1707
base_dn = client.get_creole('ldap_base_dn')
1708

    
1709
con = ldap.initialize(host)
1710
con.simple_bind_s(dn, pw)
1711

    
1712
# le DN change en 2.8
1713
len_racine = len(RACINE) + 1
1714

    
1715
def extract(filter_, filename):
1716
    res = con.search_s(base_dn, ldap.SCOPE_SUBTREE, '(&{})'.format(filter_))
1717
    with open(filename, 'w') as csvfile:
1718
        # calc csv headers
1719
        headers = {'dn'}
1720
        for obj_dn, obj in res:
1721
            headers |= set(obj.keys())
1722
        writer = csv.DictWriter(csvfile, fieldnames=list(headers))
1723
        writer.writeheader()
1724
        # extract row
1725
        for obj_dn, obj in res:
1726
            export_obj = {'dn': obj_dn[:-len_racine]}
1727
            for key, value in obj.items():
1728
                if not isinstance(value, list):
1729
                    raise Exception('value must be a list')
1730
                if len(value) == 0:
1731
                    raise Exception('value must not be empty')
1732
                if len(value) == 1:
1733
                    value = value[0]
1734
                export_obj[key] = value
1735
            writer.writerow(export_obj)
1736

    
1737
extract(GROUP_FILTER, '$DDS/csv/groups.csv')
1738
extract(SHARE_FILTER, '$DDS/csv/shares.csv')
1739
extract(USER_FILTER, '$DDS/csv/users.csv')
1740
con.unbind()""" > /tmp/ldap2csv
1741
    chmod +x /tmp/ldap2csv
1742
    python /tmp/ldap2csv
1743
    rm -f /tmp/ldap2csv
1744
}
1745

    
1746
amonecole26(){
1747
    DDS="$DD/scribe-$numero_etab"
1748
    extract_ldap_2_csv "$DDS"
1749
    saveamon "$DDS"
1750
}
1751

    
1752
scribe27(){
1753
    ## SAUVEGARDE SPECIALE POUR SCRIBE >= 2.4 et AmonEcole >= 2.4 ##
1754
    # $1 : "amonecole" ou rien
1755
    # $2 : "25" ou rien
1756
    mode_ad="$(CreoleGet activer_ad non)"
1757
    if lxc-info addc 2>/dev/null >/dev/null || [ "$mode_ad" = "oui" ];then
1758
        SuppressionLns272
1759
        NotificationMail2729
1760
        montage $DD "$2"
1761
        CreoleService smbd stop
1762
        #CreoleService nscd start
1763
        DDS="$DD/scribe-$numero_etab"
1764
        /bin/mkdir -p "$DDS"
1765
        saveconfigeol "$DDS"
1766
        savecreole "$DDS"
1767
        questionsave '/home'
1768
        savedata=$?
1769
        [ $savedata -eq 0 ] && savescribedata "$DDS"
1770
        savemail "$DDS"
1771
        # la sauvegarde des quotas et des acl se base sur pam/ldap
1772
        [ ! "$1" = "amonecole" ] && CreoleService slapd restart
1773
        savequota "$DDS"
1774
        savescribeacl "$DDS"
1775
        [ ! "$1" = "amonecole" ] && saveldap "$DDS"
1776
        # saveldap2scribe "$DDS"
1777
        savead "$DDS" "$1"
1778
        savesmb "$DDS" "$1"
1779
        savescribemysql "$DDS" '24'
1780
        savebacula24 "$DDS"
1781
        saveenvole "$DDS"
1782
        [ "$1" = "amonecole" ] && saveamon "$DDS"
1783
        savesso "$DDS"
1784
        savedivers "$DDS"
1785
        demontage $DD
1786
        CreoleService smbd start
1787
        RemiseLnS
1788
        finsauve
1789
    else
1790
        Orange "Passer d’abord le scribe en mode AD"
1791
    fi
1792
}
1793

    
1794
horus27(){
1795
    ## SAUVEGARDE SPECIALE POUR HORUS >= 2.4 ##
1796
    # $1 : "25" ou rien
1797
    echo
1798
    Question_ouinon "Attention le module horus n'est pas disponible en 2.8, voulez-vous continuer ?" $interactive "non" "warn"
1799
    testcmd $? "Abandon"
1800

    
1801
    montage $DD "$1"
1802
    CreoleService xinetd stop
1803
    CreoleService smbd stop
1804
    #CreoleService nscd start
1805
    DDS="$DD/horus-$numero_etab"
1806
    saveconfigeol "$DDS"
1807
    savecreole "$DDS"
1808
    questionsave '/home'
1809
    savedata=$?
1810
    [ $savedata -eq 0 ] && savehorusdata "$DDS"
1811
    # la sauvegarde des quotas et des acl se base sur pam/ldap
1812
    CreoleService slapd restart
1813
    savequota "$DDS"
1814
    [ $savedata -eq 0 ] && savehorusacl "$DDS"
1815
    saveldap "$DDS"
1816
    #saveldap2horus "$DDS"
1817
    savesmb "$DDS"
1818
    savehorusmysql "$DDS" '24'
1819
    savebacula24 "$DDS"
1820
    savesso "$DDS"
1821
    savedivers "$DDS"
1822
    demontage $DD
1823
    CreoleService smbd start
1824
    #[ "$activer_interbase" != 'non' ] && CreoleService xinetd start
1825
    finsauve
1826
}
1827

    
1828
amon27()
1829
{
1830
    ## SAUVEGARDE SPECIALE POUR AMON >= 2.7 ##
1831
    # $1 : "25" ou rien
1832
    montage $DD '25'
1833
    DDS="$DD/amon-$numero_etab"
1834
    saveconfigeol "$DDS"
1835
    savecreole "$DDS"
1836
    saveamon "$DDS"
1837
    savesso "$DDS"
1838
    savedivers "$DDS"
1839
    demontage $DD
1840
    finsauve
1841
}
1842

    
1843
amon29()
1844
{
1845
    ## RESTAURATION SPECIALE POUR AMON-2.9 ##
1846
    Alerte2
1847
    montage $DD '25'
1848
    DDS="$DD/amon-$numero_etab"
1849
    testf "$DDS"
1850
    restoreamon "$DDS"
1851
    restoresso "$DDS"
1852
    restoredivers "$DDS"
1853
    demontage $DD
1854
}
1855

    
1856
scribe29(){
1857
    ## RESTAURATION SPECIALE POUR SCRIBE-2.9 ##
1858
    Alerte
1859
    NotificationMail2729
1860
    montage $DD '25'
1861
    DDS="$DD/scribe-$numero_etab"
1862
    testf "$DDS"
1863
    questionrestore "$DDS" '/home'
1864
    restoacl=$?
1865
    questionadhomes "$DDS"
1866
    adhomelinks=$?
1867
    if [ "$(CreoleGet ad_local non)" = "oui" ]; then
1868
        restoread "$DDS" # problème de conflit entre les deux annuaires
1869
    fi
1870
    CreoleService smbd stop -c fichier
1871
    service eole-lsc stop
1872
    restoreldap "$DDS"
1873
    restoreldap2scribe "$DDS"
1874
    usersync "$DDS"
1875
    restoresmb "$DDS"
1876
    restorescribedata "$DDS"
1877
    RajoutLettreHome
1878
    restoremail "$DDS"
1879
    restorequota "$DDS"
1880
    if [ "$(CreoleGet activer_ad non)" = "oui" ];then
1881
        # ScribeAD : restore symlinks before
1882
        genadhome
1883
        [ $restoacl -eq 0 ] && restoreacl "$DDS"
1884
    else
1885
        # ScribeNT : create symlinks after
1886
        [ $restoacl -eq 0 ] && restoreacl "$DDS"
1887
        [ $adhomelinks -eq 0 ] && genadhome
1888
    fi
1889
    RemiseLnS
1890
    restorescribemysql "$DDS"
1891
    restorebacula "$DDS"
1892
    restoresso "$DDS"
1893
    restoredivers "$DDS"
1894
    demontage $DD
1895
    finresto
1896
}
1897

    
1898
amonecole29(){
1899
    ## RESTAURATION SPECIALE POUR SCRIBE-2.9 ##
1900
    Alerte
1901
    montage $DD '25'
1902
    DDS="$DD/scribe-$numero_etab"
1903
    testf "$DDS"
1904
    questionrestore "$DDS" '/home'
1905
    restoacl=$?
1906
    questionadhomes "$DDS"
1907
    adhomelinks=$?
1908
    restoreaddcseth "$DDS"
1909
    restoresmb "$DDS" "amonecole"
1910
    restorescribedata "$DDS"
1911
    restoremail "$DDS"
1912
    restorequota "$DDS"
1913
    [ $restoacl -eq 0 ] && restoreacl "$DDS"
1914
    [ $adhomelinks -eq 0 ] && genadhome
1915
    restoreamonecolemysql "$DDS"
1916
    restorebacula "$DDS"
1917
    restoreamon "$DDS"
1918
    restoresso "$DDS"
1919
    restoredivers "$DDS"
1920
    demontage $DD
1921
}
1922

    
1923
savezephir(){
1924
    enregistrement_zephir --check > /dev/null
1925
    if [ $? -eq 0 ];then
1926
        Title "Sauvegarde des données locales sur Zéphir"
1927
        /usr/share/zephir/scripts/zephir_client save_files
1928
    fi
1929
}
1930

    
1931
# Sauvegarde
1932
if [ -f /etc/eole/version ]
1933
then
1934
    version="$(cat /etc/eole/version)"
1935
    if [ "$version" = "scribe-2.2" ];then
1936
        clear
1937
        Version
1938
        Green "Sauvegarde du module $version"
1939
        scribe22
1940
    elif [ "$version" = "amon-2.2" ];then
1941
        clear
1942
        Version
1943
        Green "Sauvegarde du module $version"
1944
        amon22
1945
    else
1946
        Version
1947
        Red "Détection d’un module 2.2 indisponible en version 2.8 !"
1948
        exit 1
1949
    fi
1950
elif [ -f /etc/eole/release ]
1951
then
1952
    . /etc/eole/release
1953
    version="$EOLE_MODULE-$EOLE_VERSION"
1954
    # Question => Question_ouinon
1955
    Question() {
1956
         Question_ouinon "$1"
1957
    }
1958
    if [ "$EOLE_VERSION" == '2.3' ];then
1959
        if [ "$version" = "scribe-2.3" ];then
1960
            clear
1961
            Version
1962
            Green "Sauvegarde du module $version"
1963
            scribe23
1964
        elif [ "$version" = "amon-2.3" ];then
1965
            clear
1966
            Version
1967
            Green "Sauvegarde du module $version"
1968
            amon23
1969
        else
1970
            Version
1971
            Red "Détection d’un module indisponible en version 2.8 !"
1972
            exit 1
1973
        fi
1974
    elif [ "$EOLE_VERSION" == '2.4' ];then
1975
        if [ "$version" = "scribe-2.4" ];then
1976
            clear
1977
            Version
1978
            Green "Sauvegarde du module $version"
1979
            scribe24
1980
        elif [ "$version" = "amon-2.4" ];then
1981
            clear
1982
            Version
1983
            Green "Sauvegarde du module $version"
1984
            amon23
1985
        else
1986
            Version
1987
            Red "Détection d’un module indisponible en version 2.8 !"
1988
            exit 1
1989
        fi
1990
    elif [ "$EOLE_VERSION" == '2.5' ];then
1991
        if [ "$version" = "scribe-2.5" ];then
1992
            clear
1993
            Version
1994
            Green "Sauvegarde du module $version"
1995
            scribe24 '' '25'
1996
        elif [ "$version" = "amon-2.5" ];then
1997
            clear
1998
            Version
1999
            Green "Sauvegarde du module $version"
2000
            amon23 '25'
2001
        else
2002
            Version
2003
            Red "Détection d’un module non disponible en version 2.8 !"
2004
            exit 1
2005
        fi
2006
    elif [ "$EOLE_VERSION" == '2.6' ];then
2007
        if [ "$version" = "scribe-2.6" ];then
2008
            clear
2009
            Version
2010
            Green "Sauvegarde du module $version"
2011
            scribe24 '' '25'
2012
        elif [ "$version" = "amonecole-2.6" ];then
2013
            clear
2014
            Version
2015
            Green "Sauvegarde du module $version"
2016
            scribe24 'amonecole' '25'
2017
        elif [ "$version" = "amon-2.6" ];then
2018
            clear
2019
            Version
2020
            Green "Sauvegarde du module $version"
2021
            amon23 '25'
2022
        elif [ "$version" = "amonecoleeclair-2.6" ];then
2023
            clear
2024
            Version
2025
            Question_ouinon "Attention, la partie \"Eclair\" du module n'est pas gérée par le script de migation, voulez-vous continuer ?" $interactive "oui" "warn"
2026
            testcmd $? "Abandon"
2027
            echo
2028
            Green "Sauvegarde du module $version"
2029
            scribe24 'amonecole' '25'
2030
        else
2031
            Version
2032
            Red "Détection d’un module non disponible en version 2.8 !"
2033
            exit 1
2034
        fi
2035
    elif [ "$EOLE_VERSION" == '2.7' ];then
2036
        if [ "$version" = "scribe-2.7" ];then
2037
            clear
2038
            Version
2039
            Green "Sauvegarde du module $version"
2040
            scribe27 '' '25'
2041
        elif [ "$version" = "amon-2.7" ];then
2042
            clear
2043
            Version
2044
            Green "Sauvegarde du module $version"
2045
            amon27
2046
        else
2047
            Version
2048
            Red "Détection d’un module non disponible en version 2.8 !"
2049
            exit 1
2050
        fi
2051
    elif [ "$EOLE_VERSION" == '2.8' ];then
2052
        if [ "$version" = "scribe-2.8" ];then
2053
            clear
2054
            Version
2055
            Green "Sauvegarde du module $version"
2056
            scribe27
2057
        elif [ "$version" = "amon-2.8" ];then
2058
            clear
2059
            Version
2060
            Green "Sauvegarde du module $version"
2061
            amon27
2062
        elif [ "$version" = "amonecole-2.8" ];then
2063
            clear
2064
            Version
2065
            Green "Sauvegarde du module $version"
2066
            scribe27 'amonecole'
2067
        else
2068
            Version
2069
            Red "Détection du module 2.8 impossible !"
2070
            exit 1
2071
        fi
2072
        savezephir
2073
        echo
2074
        finresto
2075
    elif [ "$EOLE_VERSION" == '2.9' ];then
2076
        if [ "$version" = "scribe-2.9" ];then
2077
            clear
2078
            Version
2079
            Green "Restauration du module $version"
2080
            scribe29
2081
        elif [ "$version" = "amon-2.9" ];then
2082
            clear
2083
            Version
2084
            Green "Restauration du module $version"
2085
            amon29
2086
        elif [ "$version" = "amonecole-2.9" ];then
2087
            clear
2088
            Version
2089
            Green "Restauration du module $version"
2090
            amonecole29
2091
        else
2092
            Version
2093
            Red "Détection du module 2.9 impossible !"
2094
            exit 1
2095
        fi
2096
        savezephir
2097
        echo
2098
        finresto
2099
    else
2100
        Version
2101
        Red "Détection du module impossible !"
2102
        exit 1
2103
    fi
2104
else
2105
    Version
2106
    Red "Détection du module impossible !"
2107
    exit 1
2108
fi
2109
echo
2110
exit 0