From b97c4c3edc97ec07b42cc5b6845ccc5b21c94c43 Mon Sep 17 00:00:00 2001 From: MEUNIER Thibaud Date: Sat, 8 Sep 2018 19:01:15 +0200 Subject: [PATCH] =?UTF-8?q?Fichiers=20de=20d=C3=A9part?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/oldies/bin_incremental_backup.sh | 25 +++ bin/oldies/incremental_backup.sh | 49 +++++ bin/oldies/incremental_backup.sh.20180829 | 49 +++++ bin/oldies/quotidien.sh | 20 ++ bin/oldies/recup_topisto_backups.sh | 35 ++++ bin/oldies/rsync.sh | 81 ++++++++ bin/oldies/test_recup_topisto_backups.sh | 20 ++ bin/oldies/tibo_TOPISTO_incremental_backup.sh | 7 + bin/oldies/tibo_incremental_backup.sh | 9 + .../tibo_public_html_incremental_backup.sh | 7 + bin/oldies/topisto_incremental_backup.sh | 12 ++ bin/oldies/trace_incremental_backup.sh | 18 ++ bin/oldies/twitterbot_incremental_backup.sh | 7 + bin/oldies/www_incremental_backup.sh | 7 + bin/r_backup.sh | 42 +++++ data/liste.txt | 4 + scripts/backup.php | 177 ++++++++++++++++++ scripts/controle.php | 32 ++++ scripts/sigSHA1.sqlite.template | Bin 0 -> 3093504 bytes 19 files changed, 601 insertions(+) create mode 100755 bin/oldies/bin_incremental_backup.sh create mode 100755 bin/oldies/incremental_backup.sh create mode 100755 bin/oldies/incremental_backup.sh.20180829 create mode 100755 bin/oldies/quotidien.sh create mode 100755 bin/oldies/recup_topisto_backups.sh create mode 100755 bin/oldies/rsync.sh create mode 100755 bin/oldies/test_recup_topisto_backups.sh create mode 100755 bin/oldies/tibo_TOPISTO_incremental_backup.sh create mode 100755 bin/oldies/tibo_incremental_backup.sh create mode 100755 bin/oldies/tibo_public_html_incremental_backup.sh create mode 100755 bin/oldies/topisto_incremental_backup.sh create mode 100755 bin/oldies/trace_incremental_backup.sh create mode 100755 bin/oldies/twitterbot_incremental_backup.sh create mode 100755 bin/oldies/www_incremental_backup.sh create mode 100755 bin/r_backup.sh create mode 100644 data/liste.txt create mode 100644 scripts/backup.php create mode 100644 scripts/controle.php create mode 100644 scripts/sigSHA1.sqlite.template diff --git a/bin/oldies/bin_incremental_backup.sh b/bin/oldies/bin_incremental_backup.sh new file mode 100755 index 0000000..3046bc3 --- /dev/null +++ b/bin/oldies/bin_incremental_backup.sh @@ -0,0 +1,25 @@ +#!/bin/bash +export TARGET=/opt/backups/X11952 +export SOURCE=/opt/bin +export LADATE=`date +%Y%m%d` +export HIER=`date +%Y%m%d -d "1 day ago"` + +export LEJOUR=`date +%d` +export TODELETE=`date +%Y%m%d -d "3 months ago"` + +SCRIPT=`basename $0 .sh` +FLAGFILE=$TARGET/flag_$SCRIPT.$LADATE + +if [ -f $FLAGFILE ] +then + echo $FLAGFILE found ... + exit 0 +fi + +HEURE=`date +%H:%M` +echo "--- $HEURE - BEGIN" >> $FLAGFILE + +/opt/bin/incremental_backup.sh + +HEURE=`date +%H:%M` +echo "--- $HEURE - END" >> $FLAGFILE diff --git a/bin/oldies/incremental_backup.sh b/bin/oldies/incremental_backup.sh new file mode 100755 index 0000000..0fc73da --- /dev/null +++ b/bin/oldies/incremental_backup.sh @@ -0,0 +1,49 @@ +#!/bin/bash +if [ ! -e $SOURCE ] +then + echo "$SOURCE n'existe pas !" + exit 1 +fi + +export LADATE=`date +%Y%m%d` +export HIER=`date +%Y%m%d -d "1 day ago"` + +export LEJOUR=`date +%d` +export TODELETE=`date +%Y%m%d -d "3 months ago"` + +DESTINATION=`basename $SOURCE` +if [ -d $TARGET/$LADATE/$DESTINATION ] +then + echo "ALREADY DONE : $TARGET/$LADATE" + exit 0 +fi + +if [ ! -d $TARGET/$HIER/$DESTINATION ] +then + # Le backup d'hier n'existe pas + # PC éteint, problème backup, etc. + # On prend le dernier backup comme référence + echo "NOT FOUND : $TARGET/$HIER/$DESTINATION" + LAST_ONE=`ls -tr $TARGET | tail -n 1` + echo $LAST_ONE + if [ ! -d $TARGET/$LAST_ONE/$DESTINATION ] + then + echo "SECOND CHANCE, NOT FOUND : $TARGET/$LAST_ONE/$DESTINATION" + exit 1 + fi + mv $TARGET/$LAST_ONE $TARGET/$HIER + ln -s $TARGET/$HIER $TARGET/$LAST_ONE +fi + +if [ -d $TARGET/$TODELETE/$DESTINATION ] +then + rm -rf $TARGET/$TODELETE/$DESTINATION +fi + +echo $TARGET/$LADATE/$DESTINATION + +mkdir -p $TARGET + +/usr/bin/rsync -a --no-o --delete --safe-links $EXCLUDED_DIRS --link-dest=$TARGET/$HIER/ $SOURCE $TARGET/$LADATE/ + +echo "DONE" diff --git a/bin/oldies/incremental_backup.sh.20180829 b/bin/oldies/incremental_backup.sh.20180829 new file mode 100755 index 0000000..0fc73da --- /dev/null +++ b/bin/oldies/incremental_backup.sh.20180829 @@ -0,0 +1,49 @@ +#!/bin/bash +if [ ! -e $SOURCE ] +then + echo "$SOURCE n'existe pas !" + exit 1 +fi + +export LADATE=`date +%Y%m%d` +export HIER=`date +%Y%m%d -d "1 day ago"` + +export LEJOUR=`date +%d` +export TODELETE=`date +%Y%m%d -d "3 months ago"` + +DESTINATION=`basename $SOURCE` +if [ -d $TARGET/$LADATE/$DESTINATION ] +then + echo "ALREADY DONE : $TARGET/$LADATE" + exit 0 +fi + +if [ ! -d $TARGET/$HIER/$DESTINATION ] +then + # Le backup d'hier n'existe pas + # PC éteint, problème backup, etc. + # On prend le dernier backup comme référence + echo "NOT FOUND : $TARGET/$HIER/$DESTINATION" + LAST_ONE=`ls -tr $TARGET | tail -n 1` + echo $LAST_ONE + if [ ! -d $TARGET/$LAST_ONE/$DESTINATION ] + then + echo "SECOND CHANCE, NOT FOUND : $TARGET/$LAST_ONE/$DESTINATION" + exit 1 + fi + mv $TARGET/$LAST_ONE $TARGET/$HIER + ln -s $TARGET/$HIER $TARGET/$LAST_ONE +fi + +if [ -d $TARGET/$TODELETE/$DESTINATION ] +then + rm -rf $TARGET/$TODELETE/$DESTINATION +fi + +echo $TARGET/$LADATE/$DESTINATION + +mkdir -p $TARGET + +/usr/bin/rsync -a --no-o --delete --safe-links $EXCLUDED_DIRS --link-dest=$TARGET/$HIER/ $SOURCE $TARGET/$LADATE/ + +echo "DONE" diff --git a/bin/oldies/quotidien.sh b/bin/oldies/quotidien.sh new file mode 100755 index 0000000..5446837 --- /dev/null +++ b/bin/oldies/quotidien.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +# +# Les backups du serveur topisto.net +# +/opt/bin/recup_topisto_backups.sh + +# +# Les backups locaux +# +#/opt/bin/twitterbot_incremental_backup.sh +#/opt/bin/www_incremental_backup.sh +#/opt/bin/tibo_incremental_backup.sh +#/opt/bin/bin_incremental_backup.sh +/opt/bin/backup.sh + +# +# Garder une trace des fichiers modifiés +# +#/opt/bin/trace_incremental_backup.sh diff --git a/bin/oldies/recup_topisto_backups.sh b/bin/oldies/recup_topisto_backups.sh new file mode 100755 index 0000000..6593b40 --- /dev/null +++ b/bin/oldies/recup_topisto_backups.sh @@ -0,0 +1,35 @@ +#!/bin/bash +ladate=`date +%Y%m%d` +targetdir=/opt/topisto.net +rootdir=/tmp/download_topisto +backdir=$rootdir/$ladate + +param=`echo TTNsY2gxczNkM2sK | base64 -d` +salt=`date +%Y%m%d%H` + +cmd="wget --quiet --user backup --password $param" + +if [ ! -d $targetdir ] +then + mkdir -p $targetdir +fi + +if [ ! -d $backdir ] +then + rm -rf $rootdir/* + rm -rf $targetdir/* + + mkdir -p $backdir + + for fichier in www.tar.bz2 TOPISTO_apps.tar.bz2 + do + code=`echo -n /opt/backup/$fichier$salt | md5sum | awk '{ print $1 }' ` + echo Récupération de $fichier dans $backdir/$fichier via $code + $cmd -O $backdir/$fichier https://www.topisto.net/backup/download.php?file=$code + cd $targetdir + echo Extraction de $backdir/$fichier dans $targetdir + tar xfj $backdir/$fichier + done +else + echo "ALREADY DONE : Downloads from topisto.net" +fi diff --git a/bin/oldies/rsync.sh b/bin/oldies/rsync.sh new file mode 100755 index 0000000..b85831a --- /dev/null +++ b/bin/oldies/rsync.sh @@ -0,0 +1,81 @@ +#! /bin/bash + +# Put exclude patterns into ~/.backup.exclude + +# Setup + +DEST="/opt/backups/rsync/" +SRC="/home/tibo/public_html/" + + +############################################################################# +# +# Copyright (c) 2009-2014, Florian Jung +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +# +############################################################################# + + +LC_COLLATE="C" # this script relies on the correct sorting order for [0-9]! + +#remove trailing slashes +DEST=$(echo "$DEST" | sed -e 's|\(.*\)/$|\1|') +SRC=$(echo "$SRC" | sed -e 's|\(.*\)/$|\1|') + +cd "$DEST" +# get last and current backup names +LAST="$(echo [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] | sed -e 's|.* \([0-9]*\)$|\1|')" +NOW=$(date +%Y%m%d) + +if echo $LAST | grep '\['; then + echo "no previous backup found. creating initial backup..." + LINKDEST="" +else + echo "last backup was: $LAST" + LINKDEST="--link-dest=../$LAST/" +fi + +echo "today's backup is: $NOW" + +if [ $LAST = $NOW ]; then + echo "ERROR: you already did a backup today" +else + FOO=''; + if [ x$1 != x ]; then FOO='-n'; fi +# do the backup +# echo rsync -a -v -x $FOO --hard-links "$LINKDEST" --exclude-from="$SRC/.backup.exclude" "$SRC/" "$DEST/$NOW/" +# rsync -a -v -x $FOO --hard-links "$LINKDEST" --exclude-from="$SRC/.backup.exclude" "$SRC/" "$DEST/$NOW/" + echo rsync -a -v -x $FOO --hard-links "$LINKDEST" --exclude-from="$SRC/.backup.exclude" "$SRC/" "$DEST/$NOW/" + rsync -a -v -x $FOO --hard-links "$LINKDEST" "$SRC/" "$DEST/$NOW/" + echo +# Disable the next 4 lines at your option + echo -n "Today's backup took " + du -sh "$LAST" "$NOW" | tail -n 1 | sed -e "s,$NOW,," + echo -n "Total disk usage by backups: " + du -sh . | sed -e 's,\([kMGT]\).*,\1,' + echo done! + echo +fi diff --git a/bin/oldies/test_recup_topisto_backups.sh b/bin/oldies/test_recup_topisto_backups.sh new file mode 100755 index 0000000..caaa520 --- /dev/null +++ b/bin/oldies/test_recup_topisto_backups.sh @@ -0,0 +1,20 @@ +#!/bin/bash +targetdir=/opt/backups/topisto.net +tmpdir=/tmp/topisto.net +rootdir=/tmp/download_topisto +ladate=`date +%Y%m%d` +param=`echo TTNsY2gxczNkM2sK | base64 -d` +cmd="wget --quiet --user backup --password $param" +backdir=$rootdir/$ladate +salt=`date +%Y%m%d%H` + +for fichier in Twitterbot.tar.bz2 www.tar.bz2 +do + code=`echo -n /opt/backup/$fichier$salt | md5sum | awk '{ print $1 }' ` + echo Récupération de $fichier $code + $cmd -O /tmp/$fichier https://www.topisto.net/backup/download.php?file=$code +done + +ls -lhtr /tmp/*.tar.bz2 +rm -f /tmp/*.tar.bz2 + diff --git a/bin/oldies/tibo_TOPISTO_incremental_backup.sh b/bin/oldies/tibo_TOPISTO_incremental_backup.sh new file mode 100755 index 0000000..d582c0a --- /dev/null +++ b/bin/oldies/tibo_TOPISTO_incremental_backup.sh @@ -0,0 +1,7 @@ +#!/bin/bash +export TARGET=/opt/backups/X11952/TOPISTO +export SOURCE=/home/tibo/TOPISTO +export LADATE=`date +%Y%m%d` +export HIER=`date +%Y%m%d -d "1 day ago"` + +/opt/bin/incremental_backup.sh diff --git a/bin/oldies/tibo_incremental_backup.sh b/bin/oldies/tibo_incremental_backup.sh new file mode 100755 index 0000000..70585fd --- /dev/null +++ b/bin/oldies/tibo_incremental_backup.sh @@ -0,0 +1,9 @@ +#!/bin/bash +export TARGET=/opt/backups/X11952 +export SOURCE=/home/tibo +export LADATE=`date +%Y%m%d` +export HIER=`date +%Y%m%d -d "1 day ago"` + +export EXCLUDED_DIRS="--exclude-from /home/tibo/backups/rsync_excluded_dirs.txt" + +/opt/bin/incremental_backup.sh diff --git a/bin/oldies/tibo_public_html_incremental_backup.sh b/bin/oldies/tibo_public_html_incremental_backup.sh new file mode 100755 index 0000000..846761a --- /dev/null +++ b/bin/oldies/tibo_public_html_incremental_backup.sh @@ -0,0 +1,7 @@ +#!/bin/bash +export TARGET=/opt/backups/X11952/tibo_public_html +export SOURCE=/home/tibo/public_html +export LADATE=`date +%Y%m%d` +export HIER=`date +%Y%m%d -d "1 day ago"` + +/opt/bin/incremental_backup.sh diff --git a/bin/oldies/topisto_incremental_backup.sh b/bin/oldies/topisto_incremental_backup.sh new file mode 100755 index 0000000..13dffa9 --- /dev/null +++ b/bin/oldies/topisto_incremental_backup.sh @@ -0,0 +1,12 @@ +#!/bin/bash +export TARGET=/opt/topisto.net +export LADATE=`date +%Y%m%d` +export HIER=`date +%Y%m%d -d "1 day ago"` + +export SOURCE=/tmp/topisto.net/www + +/opt/bin/incremental_backup.sh + +export SOURCE=/tmp/topisto.net/TOPISTO + +/opt/bin/incremental_backup.sh diff --git a/bin/oldies/trace_incremental_backup.sh b/bin/oldies/trace_incremental_backup.sh new file mode 100755 index 0000000..fa9a305 --- /dev/null +++ b/bin/oldies/trace_incremental_backup.sh @@ -0,0 +1,18 @@ +#!/bin/bash +export LADATE=`date +%Y%m%d` +export HIER=`date +%Y%m%d -d "1 day ago"` + +export LEJOUR=`date +%d` +export TODELETE=`date +%Y%m%d -d "3 months ago"` + +# Garder une trace des fichiers qui ont changé +# c'est à dire ceux qui ne sont pas des liens +find /opt/backups/*/$LADATE -type f -printf '%n %p\n' | awk '$1 == 1{print $2}' > /opt/backups/trace_$LADATE.log + + +if [ "$LEJOUR" != "01" ] +then + echo TO DELETE $TODELETE + rm -f /opt/backups/trace_$TODELETE.log + rm -rf /opt/backups/*/$TODELETE +fi diff --git a/bin/oldies/twitterbot_incremental_backup.sh b/bin/oldies/twitterbot_incremental_backup.sh new file mode 100755 index 0000000..20b78c0 --- /dev/null +++ b/bin/oldies/twitterbot_incremental_backup.sh @@ -0,0 +1,7 @@ +#!/bin/bash +export TARGET=/opt/backups/Twitterbot +export SOURCE=/opt/Twitterbot +export LADATE=`date +%Y%m%d` +export HIER=`date +%Y%m%d -d "1 day ago"` + +/opt/bin/incremental_backup.sh diff --git a/bin/oldies/www_incremental_backup.sh b/bin/oldies/www_incremental_backup.sh new file mode 100755 index 0000000..e59b2a4 --- /dev/null +++ b/bin/oldies/www_incremental_backup.sh @@ -0,0 +1,7 @@ +#!/bin/bash +export TARGET=/opt/backups/X11952 +export SOURCE=/var/www/html +export LADATE=`date +%Y%m%d` +export HIER=`date +%Y%m%d -d "1 day ago"` + +/opt/bin/incremental_backup.sh diff --git a/bin/r_backup.sh b/bin/r_backup.sh new file mode 100755 index 0000000..0dc904b --- /dev/null +++ b/bin/r_backup.sh @@ -0,0 +1,42 @@ +#!/bin/bash +export TARGET=/opt/backups +export LADATE=`date +%Y%m%d` +export TODELETE=`date +%Y%m%d -d "3 months ago"` + +SCRIPT=`basename $0 .sh` +FLAGFILE=$TARGET/flags/$SCRIPT.$LADATE + +if [ -f $FLAGFILE ] +then + exit 0 +fi + +if [ ! -f $TARGET/data/liste.txt ] +then + echo No $TARGET/data/liste.txt found ... + exit 1 +fi + +if [ ! -f $TARGET/data/signatures.sqlite ] +then + echo No $TARGET/data/signatures.sqlite found ... + exit 1 +fi + +HEURE=`date +%H:%M` +echo "--- $HEURE - BEGIN" >> $FLAGFILE + +for SOURCE in `grep -v "#" $TARGET/data/liste.txt` +do + HEURE=`date +%H:%M` + echo "--- $HEURE - $SOURCE" >> $FLAGFILE + php $TARGET/scripts/backup.php $SOURCE $TARGET/data +done + +HEURE=`date +%H:%M` +echo "--- $HEURE - END" >> $FLAGFILE + +sqlite3 $TARGET/data/signatures.sqlite 'VACUUM' +cp $TARGET/data/signatures.sqlite $TARGET/data/$LADATE/signatures.sqlite + +sqlite3 $TARGET/data/signatures.sqlite 'select substr(filename,0,9) as date, count(*) as nbre, sum(filesize) as size from signatures group by substr(filename,0,9)' >> $FLAGFILE diff --git a/data/liste.txt b/data/liste.txt new file mode 100644 index 0000000..bae944f --- /dev/null +++ b/data/liste.txt @@ -0,0 +1,4 @@ +/opt/bin +/opt/topisto.net +/var/www +/home/tibo diff --git a/scripts/backup.php b/scripts/backup.php new file mode 100644 index 0000000..387ce67 --- /dev/null +++ b/scripts/backup.php @@ -0,0 +1,177 @@ +prepare($insert); + + $update = "UPDATE signatures SET filename = :filename , filesize = :filesize WHERE sha1 = :sha1"; + $stmt2 = $file_db->prepare($update); + + $delete = "DELETE FROM signatures WHERE sha1 = :sha1"; + $stmt3 = $file_db->prepare($delete); + + my_echo_with_eol("Searching SHA1 in database for $basename"); + $result = $file_db->query("SELECT filename, filesize FROM signatures WHERE sha1 = '$sha1_fichier'"); + if ($result !== FALSE) + { + foreach($result as $f) + { + my_echo_with_eol("Found ".$f['filename']); + if ($f['filesize'] != $filesize) my_echo_with_eol("Oups, database and file filesize differ !"); + $in = $destination.'/'.$f['filename']; + $out = $archive; + if (file_exists($in)) link($in, $out); + if (file_exists("$in.gz")) link("$in.gz", "$out.gz"); + if (file_exists($out)||file_exists("$out.gz")) + { + $stmt2->execute(array(':sha1' => $sha1_fichier, ':filename' => $filename, ':filesize' => $filesize)); + $flag = true; + my_echo_with_eol("Update database filename : $filename"); + } + + if (!$flag) + { + my_echo_with_eol("Delete database sha1 : $sha1_fichier"); + $stmt3->execute(array(':sha1' => $sha1_fichier)); + } + } + } + if (!$flag) + { + my_echo_with_eol("Not Found $basename"); + + // Les formats compressés sont juste copiés + $ext = pathinfo($fichier, PATHINFO_EXTENSION); + if ($ext == "avi") copy($fichier, $archive); + if ($ext == "mkv") copy($fichier, $archive); + if ($ext == "mp4") copy($fichier, $archive); + if ($ext == "mp3") copy($fichier, $archive); + + if ($ext == "bz2") copy($fichier, $archive); + if ($ext == "gz") copy($fichier, $archive); + if ($ext == "zip") copy($fichier, $archive); + + if ($ext == "iso") copy($fichier, $archive); + + if (!file_exists($archive)) + { + my_echo_with_eol("Compress $basename"); + gzCompressFile($fichier, "$archive.gz"); + } else my_echo_with_eol("Copy $basename"); + + my_echo_with_eol("Insert database filename : $filename"); + $stmt1->execute(array(':sha1' => $sha1_fichier, ':filename' => $filename, ':filesize' => $filesize)); + } + my_echo_with_eol("--------- "); + return TRUE; +} + +function listeDossier($file_db, $dossier, $destination) // Fonction qui liste un dossier de façon récursive +{ + $ladate = date('Ymd'); + + if (file_exists("$destination/$ladate/$dossier")) + { + my_echo_with_eol('BACKUP already done'); + return true; + } + + if (is_dir($dossier)) + { + if (!file_exists("$destination/$ladate")) mkdir("$destination/$ladate"); + $path = explode("/", $dossier); + $init_path = "$destination/$ladate"; + foreach($path as $p) + { + $init_path .= '/'.$p; + if (!file_exists($init_path)) mkdir($init_path); + } + my_echo_with_eol("BACKUP OF $dossier"); + if($dossierOuvert=opendir($dossier)) + { + $n = 0; + while(($fichier=readdir($dossierOuvert))!== false) + { + // if ($n++ == 8) break; + + if ($fichier[0] == '.') continue; + + if(is_dir("$dossier/$fichier")) + listeDossier($file_db, "$dossier/$fichier", $destination); + else + fileBackup($file_db, "$dossier/$fichier", $destination); + } + } + } + else + { + my_echo_with_eol("Erreur, le paramètre précisé dans la fonction n'est pas un dossier!"); + } +} + +$source = $argv[1]; +$backup = $argv[2]; +$signatures=$backup.'/signatures.sqlite'; + +if (!file_exists($source)) die("$source NOT FOUND !"); +if (!is_dir($backup)) die("$backup NOT FOUND !"); +if (!file_exists($signatures)) die("$signatures NOT FOUND !"); + +$connexion = new PDO('sqlite:'.$signatures); +my_echo_with_eol("DATABASE IS OPEN"); +if(is_dir($backup)) + listeDossier($connexion, $source, $backup); +else + fileBackup($connexion, $source, $backup); +$connexion = null; +my_echo_with_eol("DATABASE IS CLOSED"); + +?> diff --git a/scripts/controle.php b/scripts/controle.php new file mode 100644 index 0000000..455a161 --- /dev/null +++ b/scripts/controle.php @@ -0,0 +1,32 @@ +query("SELECT sha1, filename, filesize FROM signatures"); +if ($result !== FALSE) + foreach($result as $f) + { + $flag = FALSE; + $fichier = $backup.'/'.$f['filename']; + + if (file_exists($fichier)) $flag = TRUE; + if (file_exists("$fichier.gz")) $flag = TRUE; + + if (!$flag) + { + echo $fichier.' inexistant !'.PHP_EOL; + $global_flag = FALSE; + } + } +$connexion = null; + +if ($global_flag) echo "Control signatures OK".PHP_EOL; +else echo "Control signatures NOK".PHP_EOL; + +?> diff --git a/scripts/sigSHA1.sqlite.template b/scripts/sigSHA1.sqlite.template new file mode 100644 index 0000000000000000000000000000000000000000..3bc7814e0bd58a10ac5055dcb3cbe3fa69339767 GIT binary patch literal 3093504 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 z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF{KpfRzgK#07)Iu6{6*bTv((4xjOOR5 zX>I?carxT1?e8}(+xVTvIU66T>uQhox2bh%z1qJHtb^*{I;0M*!|J_tcpXtk*8A$H z`apfKj;>?sL-mpBc}9+_kJkzH$vUx4s#EIJI;}ok6VLsb`fQz5XVe*qaV}_bz|LB zH`k9V%V9?2ZFPJ7tbSg1)SdNhJYJy;%RKm+GIxFgjY3YD$gO)S6yB`{-=-vYNf-s5xt{ zn!Dzyd27C!zZR$k>(#YTEmE(kMeDV-SS?_i0=Cws_SzFcCwN1UV-c{SyyKB4J zzQ$|E+NpM~_tY-6YwcFM*B-TJ?OprSzO`TNUkB77by$6}-dji1k@dcMe;rjHtfT8g z_2D|Uj;rIVe-EQ4)FsQ|h$(RGmKfBS3%v0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly@c)Fs$nHJnbHgxtR-Ikv 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 z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0Rja6pAr~5 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 z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N g0t5&UAV7cs0RjXF5FkK+009C72oNAZ;J+;JFZwT*&;S4c literal 0 HcmV?d00001