summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbeber <beber>2005-07-19 18:59:09 +0000
committerbeber <beber>2005-07-19 18:59:09 +0000
commit5358c1af4d45c6a302187a4baec6542a65e94cbb (patch)
tree8f37a018ba29bfb8a12eb715d84420c9eb3a7c4f
downloadfsave-5358c1af4d45c6a302187a4baec6542a65e94cbb.tar.gz
Add fsave to reposSVN_Import
-rw-r--r--cnf/fsave.conf45
-rw-r--r--install.sh16
-rw-r--r--src/files.sh34
-rw-r--r--src/fsave.sh84
-rw-r--r--src/gest-check.sh44
-rw-r--r--src/gest-mount.sh35
-rw-r--r--src/gest-replace.sh35
-rw-r--r--src/gest-screen.sh59
-rw-r--r--src/gest-url.sh34
-rw-r--r--src/modules.sh20
-rw-r--r--src/mysql.sh34
11 files changed, 440 insertions, 0 deletions
diff --git a/cnf/fsave.conf b/cnf/fsave.conf
new file mode 100644
index 0000000..9a6c6a7
--- /dev/null
+++ b/cnf/fsave.conf
@@ -0,0 +1,45 @@
+# /etc/fsave.conf
+# Fichier de configuration de fsave
+#
+# (c) Bertand Jacquin <beber.gentoo:gmail.com>
+# Under GPL
+
+# PATH_TO_SAVE:
+# Peut etre des fichier réguliers et/ou repertoire
+# ex: PATH_TO_SAVE="/etc /usr/local /etc/lftp.conf"
+#
+# Peut etre une base de données MySQL
+# ex: PATH_TO_SAVE="mysql://127.0.0.1" pour toutes les bases de données
+# PATH_TO_SAVE="mysql://127.0.0.1/cacti" pour la base cacti
+# PATH_TO_SAVE="mysql://admin:password@127.0.0.1/cacti" pour la base cacti en tant que
+# "admin" et mot de passe "password sur l'host "127.0.0.1"
+#
+# Peut etre tout ca
+# ex: PATH_TO_SAVE="/etc /usr/local/fichier.conf \
+# mysql://127.0.0.1 mysql://root:motdepasse@sbdg.domain.com/phpbb \
+# mysql://john@localhost"
+#
+PATH_TO_SAVE=" /etc /var/chroot /var/www/ /usr/local \
+ /home/beber/cic.gsb /home/beber/.enlightenment \
+ /home/beber/bin /root/bin \
+ mysql://beber@localhost"
+
+#PATH_TO_SAVE=" /etv \
+# /dev \
+# mysql://root:@localhost/sys_cacti \
+# ssh://zesdfx"
+
+# DEST:
+# Destination des sauvegardes (peut etre un montage ou autre)
+# Préférer une partition prévue a cet effet
+#
+DEST="/mnt/save"
+
+# TO_UMOUNT:
+# La partition de sauvegarde doit-elle etre démontée a la fin de la procédure ?
+# Peut etre O ou 1
+TO_UMOUNT=0
+
+# MODULES:
+# Modules a charger
+MODULES="mysql"
diff --git a/install.sh b/install.sh
new file mode 100644
index 0000000..8d490bc
--- /dev/null
+++ b/install.sh
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+# Installer for fsave
+# (c) Bertrand Jacquin 2005
+# Under GPL
+
+echo ">>> cp cnf/fsave.conf /etc"
+cp cnf/fsave.conf /etc
+
+echo ">>> cp src/fsave.sh /usr/sbin"
+cp src/fsave.sh /usr/sbin
+
+echo ">>> mkdir -p /usr/lib/fsave"
+mkdir -p /usr/lib/fsave
+echo ">>> cp src/files.sh src/gest-check.sh src/gest-mount.sh src/gest-replace.sh src/gest-screen.sh src/gest-url.sh src/modules.sh src/mysql.sh -- /usr/lib/fsave"
+cp src/files.sh src/gest-check.sh src/gest-mount.sh src/gest-replace.sh src/gest-screen.sh src/gest-url.sh src/modules.sh src/mysql.sh -- /usr/lib/fsave
diff --git a/src/files.sh b/src/files.sh
new file mode 100644
index 0000000..3d233ac
--- /dev/null
+++ b/src/files.sh
@@ -0,0 +1,34 @@
+#!/bin/sh
+#
+# (c) Bertand Jacquin <beber.gentoo:gmail.com>
+# Under GPL
+#
+# Modules de sauvegarde de repertoire et fichier pour fsave
+
+files_archive()
+{
+ moreindent
+ einfo "Archiving $1"
+
+ moreindent
+
+ if [ ! -e "$1" ]
+ then
+ eerror "$1 does not exist"
+ lessindent
+ lessindent
+ continue
+ fi
+
+ replace_slash_with_dash $1
+
+ local FDEST="${DEST}/${TRANS_PATH}"
+ check_fdest
+
+ einfo "Taring $1 to ${FDEST}/${DATE}.tar.bz2"
+ eecho "tar -cj --atime-preserve --preserve-permissions --index-file ${FDEST}/${DATE}.log -f ${FDEST}/${DATE}.tar.bz2 $1"
+ tar -cj --atime-preserve --preserve-permissions --index-file ${FDEST}/${DATE}.log -f ${FDEST}/${DATE}.tar.bz2 $1 2>&1 >> ${FDEST}/${DATE}.log
+
+ lessindent
+ lessindent
+}
diff --git a/src/fsave.sh b/src/fsave.sh
new file mode 100644
index 0000000..272dbf9
--- /dev/null
+++ b/src/fsave.sh
@@ -0,0 +1,84 @@
+#!/bin/sh
+
+# (c) Beber <beber:setibzh.com>
+# Under GPL
+
+# Sauvegarde de répertoire pour crontab
+# Monte la destination si possible et démontage
+# Enregistre au format <destination>/<chemin a sauvegarder>-<date du jour>.tar.bz2
+# Création d'un log
+
+# Todo:
+# Si destination non trouvé alors rechercher le point de montage qui serait le plus adéquate et test de récursivité (si repertoire dans partition, !root de la partition)
+# Gestion des différentes sauvegarde faite
+# Gestion du nombre max de sauvegarde | date maxi | temps de stockage max (par options)
+# Calcul de la taille moyenne d'une sauvegarde pour éviter le remplissage de la partition de stockage
+# Suppression d'une vieille sauvegarde (par options)
+# Laisser le choix du démontage a la fin (par options)
+# SCP sur machine distante de la sauvegarde
+# Script pour la restauration
+# Script pour visualiser/gérer les sauvegarde
+# Vérif de si sauvegarde sur machine distante ok
+# Sauvegarde de /dev/x (dd)
+# Sauvegarde svn (svnadmin dump / hotcopy)
+# Sauvegarde mysql
+# Rajouter la possiblité de sauvegarder une table
+# Modifier le code pour plus de flexibilité dans le traitement des user, pass, host & bases
+
+
+. /usr/lib/fsave/gest-screen.sh
+. /usr/lib/fsave/gest-url.sh
+. /usr/lib/fsave/gest-mount.sh
+. /usr/lib/fsave/gest-check.sh
+. /usr/lib/fsave/gest-replace.sh
+. /usr/lib/fsave/files.sh
+. /usr/lib/fsave/modules.sh
+
+check_fsave_conf
+
+DATE=`date +%F`
+
+check_to_save
+dest_mount
+check_dest
+
+load_modules
+
+einfo "Starting archiving"
+
+for i in $PATH_TO_SAVE
+do
+ get_proto $i
+
+ if [ -z $PROTO ]
+ then
+ files_archive $i
+ else
+ cut_url $i
+
+ # Crado, a travailler avec du sed pour récuperer directement la commande a executer
+ if [ `echo $REGISTER_PROTO | grep $PROTO | wc -l` -eq 0 ]
+ then
+ moreindent
+ eerror "$PROTO is not a supported protocol"
+ lessindent
+ else
+ for j in $REGISTER_PROTO
+ do
+ if [ `echo $REGISTER_PROTO | grep $PROTO | wc -l` -eq 1 ]
+ then
+ FCT_TO_CALL=`echo $j | cut -s -d ':' -f 2`
+ if [ -z $FCT_TO_CALL ]
+ then
+ eerror "Module for $PROTO is not usable"
+ else
+ $FCT_TO_CALL
+ break
+ fi
+ fi
+ done
+ fi
+ fi
+done
+
+dest_umount
diff --git a/src/gest-check.sh b/src/gest-check.sh
new file mode 100644
index 0000000..5352974
--- /dev/null
+++ b/src/gest-check.sh
@@ -0,0 +1,44 @@
+#!/bin/sh
+#
+# (c) Bertrand Jacquin <beber.gentoo:gmail.com>
+# Under GPL
+#
+# Verification des points de montage, répertoire, validité des sauvegardes
+
+# Fonction de vérification de la présence du fichier de config
+check_fsave_conf()
+{
+ if [ -f /etc/fsave.conf ]
+ then
+ . /etc/fsave.conf
+ else
+ echo "The configuration file (/etc/fsave.conf) doesn't exist, please create it"
+ exit 1
+ fi
+}
+
+# Fonction qui verifie s'il y a quelques chose a sauvegarder
+check_to_save()
+{
+ if [ -z "$PATH_TO_SAVE" ]
+ then
+ eerror "Nothing to archive"
+ exit
+ fi
+}
+
+# Fonction de vérification de la destination (globale)
+check_dest()
+{
+ if [ ! -d $DEST ]
+ then
+ eerror "$DEST does not exist (or not a directory)"
+ exit
+ fi
+}
+
+# Fonction de vérification de la destination (précise)
+check_fdest()
+{
+ [ ! -d $FDEST ] && mkdir -p $FDEST
+}
diff --git a/src/gest-mount.sh b/src/gest-mount.sh
new file mode 100644
index 0000000..55c52fd
--- /dev/null
+++ b/src/gest-mount.sh
@@ -0,0 +1,35 @@
+#!/bin/sh
+#
+# (c) Bertand Jacquin <beber.gentoo:gmail.com>
+#
+# Gestion du montage, démontage de la partition de sauvegarde
+
+# Fonction de verification du point de montage
+# Et prise de decision de montage ou nom
+dest_mount()
+{
+ local IS_IN_FSTAB=`cat /etc/fstab | grep $DEST | grep -vE "^#" | wc -l`
+ if [ $IS_IN_FSTAB -ne 0 ]
+ then
+ TO_UMOUNT=${TO_UMOUNT:-"1"}
+ local IS_ALLREADY_MOUNTED=`cat /etc/mtab | grep $DEST | wc -l`
+ if [ $IS_ALLREADY_MOUNTED -eq 0 ]
+ then
+ ewarn "Mounting $DEST"
+ TO_UMOUNT=${TO_UMOUNT:-"1"}
+ mount $DEST
+ fi
+ else
+ ewarn "$DEST is not a partition"
+ fi
+}
+
+# Démontage de la destination
+dest_umount()
+{
+ if [ $TO_UMOUNT -eq 1 ]
+ then
+ ewarn "Unmounting $DEST"
+ umount $DEST
+ fi
+}
diff --git a/src/gest-replace.sh b/src/gest-replace.sh
new file mode 100644
index 0000000..5301990
--- /dev/null
+++ b/src/gest-replace.sh
@@ -0,0 +1,35 @@
+#!/bin/sh
+#
+# (c) Bertand Jacquin <beber.gentoo:gmail.com>
+#
+# Gestion diverse
+
+# Fonction de remplacement des '/' par '-'
+replace_slash_with_dash()
+{
+ TRANS_PATH=$1
+
+ if [ ${TRANS_PATH:0:1} = "/" ]
+ then
+ TRANS_PATH=`echo $TRANS_PATH | cut -c 2-`
+ fi
+
+ if [ ${TRANS_PATH:${#TRANS_PATH}-1:1} = "/" ]
+ then
+ TRANS_PATH=`echo $TRANS_PATH | cut -c -$((${#TRANS_PATH}-1))`
+ fi
+
+ TRANS_PATH=`echo $TRANS_PATH | tr '/' '-'`
+}
+
+# Fonction de remplacement des mots de passes par des '*'
+replace_password_with_star()
+{
+ local NB_CHAR=$((${#FPASS}))
+
+ while [ $NB_CHAR -gt 1 ]
+ do
+ STAR_PASS=`echo -n $STAR_PASS && echo -n "$"`
+ NB_CHAR=$(($NB_CHAR-1))
+ done
+}
diff --git a/src/gest-screen.sh b/src/gest-screen.sh
new file mode 100644
index 0000000..a36c82d
--- /dev/null
+++ b/src/gest-screen.sh
@@ -0,0 +1,59 @@
+#!/bin/sh
+
+# (c) Bertrand Jacquin <beber.gentoo:gmail.com>
+# Under GPL
+
+# Script de gestion des couleurs et indentation a la facon gentoo
+
+DOTS="..."
+
+GOOD=$'\e[32;01m'
+WARN=$'\e[33;01m'
+BAD=$'\e[31;01m'
+NORMAL=$'\e[0m'
+HILITE=$'\e[36;01m'
+BRACKET=$'\e[34;01m'
+
+INDENT=" "
+
+eperso()
+{
+ echo " ${INDENT}$1"
+}
+
+eecho()
+{
+ echo " ${GOOD}*${NORMAL}${INDENT}$1"
+}
+
+einfo()
+{
+ echo " ${GOOD}*${NORMAL}${INDENT}$1 $DOTS"
+}
+
+ewarn()
+{
+ echo " ${WARN}*${NORMAL}${INDENT}$1 $DOTS"
+}
+
+eerror()
+{
+ echo " ${BAD}!${NORMAL}${INDENT}$1 $DOTS"
+}
+
+moreindent()
+{
+ INDENT=`echo -n "$INDENT" && echo -n " "`
+}
+
+lessindent()
+{
+ INDENT=`echo "$INDENT" | cut -c 3-`
+}
+
+#echo "${GOOD}GOOD"
+#echo "${WARN}WARN"
+#echo "${BAD}BAD"
+#echo "${NORMAL}NORMAL"
+#echo "${HILITE}HILITE"
+#echo "${BRACKET}BRACKET"
diff --git a/src/gest-url.sh b/src/gest-url.sh
new file mode 100644
index 0000000..4c3bb8e
--- /dev/null
+++ b/src/gest-url.sh
@@ -0,0 +1,34 @@
+#!/bin/sh
+#
+# (c) Bertand Jacquin <beber.gentoo:gmail.com>
+#
+# Gestion des URL
+
+# Fonction de récupération du protocole
+get_proto()
+{
+ local URL=$1
+
+ PROTO=`echo $URL | cut -s -d ':' -f 1`
+}
+
+# Fonction récuperant le user, mot de passe, host et chemin
+# Si user absent, devient l'utilisateur executant le script
+# Si host absent, devient localhost
+cut_url()
+{
+ local URL=$1
+
+ local FULL_WITHOUT_PROTO=`echo $URL | cut -c $((${#PROTO}+4))-`
+ local FUSER_AND_FPASS=`echo $FULL_WITHOUT_PROTO | rev | cut -s -d '@' -f 2- | rev`
+ local FHOST_AND_FPATH=`echo $FULL_WITHOUT_PROTO | rev | cut -s -d '@' -f 1 | rev`
+
+ FUSER=`echo $FUSER_AND_FPASS | cut -s -d ':' -f 1`
+ FPASS=`echo $FUSER_AND_FPASS | cut -s -d ':' -f 2-`
+
+ FHOST=`echo $FHOST_AND_FPATH | cut -s -d '/' -f 1`
+ FPATH=`echo $FHOST_AND_FPATH | cut -s -d '/' -f 2-`
+
+ FUSER=${FUSER:-"$USER"}
+ FHOST=${FHOST:-"localhost"}
+}
diff --git a/src/modules.sh b/src/modules.sh
new file mode 100644
index 0000000..f46554f
--- /dev/null
+++ b/src/modules.sh
@@ -0,0 +1,20 @@
+#!/bin/sh
+#
+# (c) Bertrand Jacquin <beber.gentoo:gmail.com>
+# Under GPL
+#
+# Fonctions de gestion des modules
+
+load_modules()
+{
+ for i in $MODULES
+ do
+ if [ ! -f /usr/lib/fsave/${i}.sh ]
+ then
+ eerror "Module for $i is not available"
+ else
+ . /usr/lib/fsave/${i}.sh
+ fi
+
+ done
+}
diff --git a/src/mysql.sh b/src/mysql.sh
new file mode 100644
index 0000000..3a892c6
--- /dev/null
+++ b/src/mysql.sh
@@ -0,0 +1,34 @@
+#!/bin/sh
+#
+# (c) Bertrand Jacquin <beber.gentoo:gmail.com>
+# Under GPL
+#
+# Module MySQL pour fsave
+
+REGISTER_PROTO="$REGISTER_PROTO mysql:mysql_archive"
+
+mysql_archive()
+{
+ local SQL_BASE=`echo $FPATH | cut -d '/' -f 1`
+ local SQL_TABLE=`echo $FPATH | cut -d '/' -f 2`
+
+ moreindent
+ einfo "MySQL: Dumping $SQL_BASE databases"
+
+ local JUST_BASE=$SQL_BASE
+ SQL_BASE=${SQL_BASE:+"--databases $SQL_BASE"}
+ SQL_BASE=${SQL_BASE:-"--all-databases"}
+
+ local FDEST="${DEST}/mysql/${FHOST}/${JUST_BASE:-"all-databases"}"
+ check_fdest
+
+ replace_password_with_star
+
+ moreindent
+ eecho "mysqldump $SQL_BASE --comments --lock-tables --host=$FHOST --user=$FUSER ${FPASS:+"--password=$STAR_PASS"} | gzip > ${FDEST}/${DATE}.gz"
+
+ mysqldump $SQL_BASE --comments --lock-tables --host=$FHOST --user=$FUSER ${FPASS:+"--password=$FPASS"} | gzip > ${FDEST}/${DATE}.gz
+
+ lessindent
+ lessindent
+}