#!/bin/bash # vim: set expandtab sw=4 ts=4 nu: # migrateip.bash : update ip in specified files # Copyright (C) 2014 David Cachau # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . declare opt_are_file=0; declare -a files; declare run=0; declare old_ip=""; declare new_ip=""; declare backup=0; declare error="no"; function display_usage { echo -e "Usage : $0 --oldip=0.0.0.0 --newip=0.0.0.0 [--apache] [--bind] [--backup] [--dir=PATH]... [--] [FILE]..." } function display_warning { echo -en "\e[91m ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ \e[43;33mo\e[49;91m + \e[1;4;5mAvertissement\e[21;24;25m + \e[43;33mo o\e[49;91m + + \e[43;33mo \e[101;91m*\e[43;33m o\e[49;91m + Ce script permet de migrer les adresses IP dans les fichiers + \e[43;33mo \e[101;91m*\e[43;33m o\e[49;91m + spécifiés. Ce script est fourni sans garantie de + \e[43;33mo \e[101;91m*\e[43;33m o\e[49;91m + fonctionnement, en cas de problème, vous pouvez envoyer un + \e[43;33mo o\e[49;91m + courriel à contact@cachaudavid.fr. Le développeur ne sera + \e[43;33mo \e[101;91m*\e[43;33m o\e[49;91m + pas tenu responsable en cas de dysfonctionnement de ce + \e[43;33mooooooooooooooo\e[49;91m + script. + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ \e[0m migrateip.bash Copyright (C) 2014 David Cachau This program comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions, see http://www.gnu.org/licenses/gpl-3.0.en.html for details. " } function display_help { echo -e "\e[1;7;34m Migration des adresses IP \e[0m "; display_usage; echo -e " Change les adresses IP défini par une nouvelle adresse dans les fichiers spécifiés \e[1m\e[33m--\e[0m Les paramètres suivants seront considérés comme des fichiers \e[1m\e[33m--apache\e[0m Mettre à jour les fichiers .conf situé dans le répertoire d'Apache, les répertoires suivants sont pris en charge : /etc/apache2 /etc/httpd \e[1m\e[33m--backup\e[0m Créer une sauvegarde tar des fichiers à modifier \e[1m\e[33m--bind\e[0m Mettre à jour les fichiers de configuration de Bind, le répertoire suivant est pris en charge : /etc/bind /var/named \e[1m\e[33m--dir=\e[0m Ajoute un répertoire à la liste des fichiers à analyser, tous les fichiers présents dans le répertoire et ses sous-répertoires \e[1m\e[33m--help|-h\e[0m Affiche l'aide \e[1m\e[33m--newip=\e[0m Nouvelle IP à placer dans les fichiers \e[1m\e[33m--oldip=\e[0m Ancienne adresse IP à remplacer Code de retour : \e[32m0 : Fin d'éxécution normal\e[0m \e[33m1 : Mauvais paramètres\e[0m \e[31m2 : Erreurs sur la lecture ecriture des fichiers / répertoires\e[0m \e[33m3 : Erreurs lors de la detection des répertoires\e[0m \e[33m4 : Erreurs sur les adresses IP\e[0m "; display_warning; } function add_file { files[${#files[*]}]=$1 } function add_path { if [[ -d $1 ]] && [[ ! -r $1 ]] && [[ ! -x $1 ]] then echo "Accès imcomplet sur $1"; error="filerw"; fi found_files=`find $1`; for found_file in $found_files do if [[ -f $found_file ]] && [[ -r $1 ]] && [[ -w $1 ]] then add_file $found_file; else if [[ -d $found_file ]] && [[ -r $found_file ]] && [[ -x $found_file ]] && [ "$found_file" != "$1" ] then add_path $found_file; fi fi done } function add_apache { echo -n } function add_bind { echo -n } while [[ $# > 0 ]] do key="$1"; shift case $key in -h|--help) display_help; exit 0; ;; --apache) path="" run=1; for i in "/etc/apache2" "/etc/httpd" do if [[ -d $i ]] && [[ -r $i ]] then path=$i; break; fi done if [[ $path != "" ]] then add_path $path; else echo "Impossible de trouver le répertoire d'Apache" error="autodetect"; fi ;; --backup) backup=1; ;; --bind) path="" run=1; for i in "/etc/bind" "/var/named" do if [[ -d $i ]] && [[ -r $i ]] then path=$i; break; fi done if [[ $path != "" ]] then add_path $path; else echo "Impossible de trouver le répertoire de Bind" error="autodetect"; fi ;; --dir=*) add_path `echo -n $key | sed -e 's/^[^=]*=//g'`; run=1; ;; --newip=*) new_ip=`echo -n $key | sed -e 's/^[^=]*=//g'`; ;; --oldip=*) old_ip=`echo -n $key | sed -e 's/^[^=]*=//g'`; ;; --) opt_are_file=1; ;; -*) if [ $opt_are_file -eq 1 ] then add_file $key; run=1; else display_usage; exit 1; fi ;; *) add_file $key; run=1; ;; esac done if [[ $run -eq 0 ]] then display_usage; exit 1; else for i in ${!files[*]} do file=${files[i]}; if [[ ! -f $file ]] then echo "Le fichier n'existe pas $file"; error="filerw"; else if [[ -f $file ]] && [[ ! -r $file ]] then echo "Impossible de lire $file"; error="filerw"; else if [[ -f $file ]] && [[ ! -w $file ]] then echo "Impossible d'écrire $file"; error="filerw"; fi fi fi done regex="([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])"; regex="^$regex\.$regex\.$regex\.$regex\$"; if [[ ! $old_ip =~ $regex ]] then echo "oldip est incorrect"; error="ip" fi if [[ ! $new_ip =~ $regex ]] then echo "newip est incorrect"; error="ip" fi case $error in autodetect) exit 3; ;; filerw) exit 2; ;; ip) exit 4; ;; no) echo -e "\e[91mLes fichiers suivants seront modifiés : \e[0m" for i in ${!files[*]} do echo ${files[i]}; done if [[ $backup -gt 0 ]] then echo -e "\e[102;30mBackup activé\e[0m"; else echo -e "\e[41;30mBackup désactivé\e[0m"; fi echo ""; echo "Les adresses $old_ip deviendront $new_ip"; read -p "Confirmer la migration ? [N/o] " confirm; if [[ $confirm = "Y" ]] || [[ $confirm = "y" ]] || [[ $confirm = "O" ]] || [[ $confirm = "o" ]] then if [[ $backup -gt 0 ]] then filetar=`date +"%Y%m%d_%H%M%S"`; filetar="migrateIp${filetar}.tar"; for i in ${!files[*]} do echo ${files[i]} >> ${filetar}.tmp; done tar -cf $filetar --files-from=${filetar}.tmp; rm -f ${filetar}.tmp; echo "La sauvegarde est disponible dans le répertoire courant :"; echo $filetar; echo ""; fi for i in ${!files[*]} do sed -ri "s/([^0-9]|^)$old_ip([^0-9]|$)/\1$new_ip\2/g" -- ${files[i]} done fi ;; *) echo "UNKNOW ERROR !!!"; exit -1; ;; esac fi