Chouette, merci
Aujourd’hui un petit script permettant de répéter un signal Wifi.
Il faut 2 interfaces wifi (par exemple sur un PC portable, une clé usb wifi en plus de l’adaptateur interne).
Fonctionnement du script : il se connecte à votre point d’accès (que vous définissez au début du script) via la première interface wifi, puis crée un nouveau point d’accès sur la deuxième interface wifi. La communication entre les 2 interfaces réseau se fait par du routage NAT.
Ainsi, vous pouvez connecter sur votre nouveau point d’accès “répéteur”, d’autres périphériques (au hasard, un smartphone) qui ne pouvaient pas utiliser le point d’accès principal à cause d’une trop faible portée de signal
update 12 avril 2013 : adapté & testé sur Debian Wheezy
#!/bin/bash
#
# Wifi Repeater/Range extender script
#
# last modified 12/Apr/2013
# - adapted for Debian (tested under 7.0 Wheezy)
#
# http://agentoss.wordpress.com / fredo696@gmail.com
#
# thanks to : http://www.aerospacesoftware.com/howtos/Laptop-NAT-Howto.html
#
# hardware requirements : 2 wireless NICs
# software requirements : iptables, wpa_supplicant, hostapd, dnsmasq, dhcpcd (or equivalent)
#
# This is a standalone script, it will not use your existing configuration files
# (wpa_supplicant/hostapd)
#
# Both wireless interfaces will use WPA/WPA2 encryption.
#
# BEFORE STARTING THIS SCRIPT :
# - you must have root rights
# - stop your wireless connection manager (networkmanager, wicd, etc...)
# - disable your firewall
# - disable power management (prevent the computer to go into suspend mode when unused)
#
# This script has been tested on OpenSUSE 12.2, Debian 7.0
# but should work on other Linux systems with minor adaptations.
# this is the wireless interface we use to connect to our main AP
WLAN_STA="wlan0"
# enter here your SSID and WPA passphrase
WLAN_STA_SSID="YOUR_EXISTING_SSID"
WLAN_STA_PASSPHRASE="your$existing$passphrase"
# this is the wireless interface we use to create our new AP (the "repeater" AP)
WLAN_AP="wlan1"
# your new AP's SSID
WLAN_AP_SSID="REPEAT_$WLAN_STA_SSID"
# Be sure to use different channels for the 2 AP's for best performance
WLAN_AP_CHANNEL=6
WLAN_AP_IP="192.168.7.1"
WLAN_AP_DHCP_RANGE="192.168.7.10,192.168.7.20"
# we can use the same passphrase (or not)
WLAN_AP_PASSPHRASE=$WLAN_STA_PASSPHRASE
# temp files (will contain clear passphrases!)
HOSTAP_TEMP_CONF="/root/hostap_temp.conf"
WPASUPPLICANT_TEMP_CONF="/root/wpasupplicant_temp.conf"
# Path for used commands (adapt to your system)
#DHCPCD="/sbin/dhcpcd"
#for Debian we use dhclient (installed by default)
DHCPCD=$(which dhclient)
HOSTAPD=$(which hostapd)
WPASUPPLICANT=$(which wpa_supplicant)
DNSMASQ=$(which dnsmasq)
IPTABLES=$(which iptables)
# Main program
# check if we are root
if [ $EUID -ne 0 ]; then
echo `basename $0` ": this script must be run as root!" 1>&2
exit 1
fi
# check for software we need
if [ ! -x $DHCPCD ]; then
echo "FATAL: $DHCPCD not found!"; exit 1
fi
if [ ! -x $HOSTAPD ]; then
echo "FATAL: $HOSTAPD not found!"; exit 1
fi
if [ ! -x $WPASUPPLICANT ]; then
echo "FATAL: $WPASUPPLICANT not found!"; exit 1
fi
if [ ! -x $DNSMASQ ]; then
echo "FATAL: $DNSMASQ not found!"; exit 1
fi
if [ ! -x $IPTABLES ]; then
echo "FATAL: $IPTABLES not found!"; exit 1
fi
# check for wireless interfaces
ifconfig $WLAN_STA 1>&2>/dev/null
if [[ $? -ne 0 ]]; then
echo "FATAL: Wireless interface $WLAN_STA unavailable!"; exit 1
fi
ifconfig $WLAN_AP 1>&2>/dev/null
if [[ $? -ne 0 ]]; then
echo "FATAL: Wireless interface $WLAN_AP unavailable!"; exit 1
fi
# some cleanup
# stop network-manager or wicd daemons if running
service network-manager stop 2>/dev/null
service wicd stop 2>/dev/null
# kill existing wireless connections from previous execution of this script
$DHCPCD -x $WLAN_STA 2>/dev/null
$DHCPCD -x $WLAN_AP 2>/dev/null
killall wpa_supplicant 2>/dev/null
# kill running hostapd daemon if it exists
killall hostapd 2>/dev/null
# kill dnsmasq dhcp
killall dnsmasq 2>/dev/null
# empty existing temp.conf files, for security
>$HOSTAP_TEMP_CONF
>$WPASUPPLICANT_TEMP_CONF
# stop the repeater? then just exit, we have already cleaned up!
if [ "$1" == "stop" ]; then
echo "Repeater has been stopped."
exit 0;
fi
# else, continue and create our repeater AP
echo "Please wait, starting up... "
# create temp wpa_supplicant.conf file for our STA interface
cat >$WPASUPPLICANT_TEMP_CONF <<EOF
ctrl_interface=/var/run/wpa_supplicant
eapol_version=1
ap_scan=1
fast_reauth=1
network={
ssid="$WLAN_STA_SSID"
psk="$WLAN_STA_PASSPHRASE"
}
EOF
# start wpa_supplicant
$WPASUPPLICANT -B -i$WLAN_STA -c$WPASUPPLICANT_TEMP_CONF
if [ $? -ne 0 ]; then
echo "FATAL: unable to start $WLAN_STA interface! (wpa_supplicant)"; exit 1
fi
# create temp hostapd.conf file for our new AP interface (the "repeater")
cat >$HOSTAP_TEMP_CONF <<EOF
interface=$WLAN_AP
country_code=FR
ieee80211d=1
ssid=$WLAN_AP_SSID
hw_mode=g
channel=$WLAN_AP_CHANNEL
wme_enabled=0
macaddr_acl=0
auth_algs=1
wpa=2
wpa_passphrase=$WLAN_AP_PASSPHRASE
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
EOF
# start the STA interface (my router has a DHCP server)
$DHCPCD $WLAN_STA
if [ $? -ne 0 ]; then
echo "FATAL: unable to start $WLAN_STA interface! ($DHCPCD)"; exit 1
fi
# start hostapd daemon to create the "repeater" AP
$HOSTAPD -B $HOSTAP_TEMP_CONF
if [ $? -ne 0 ]; then
echo "FATAL: unable to start $WLAN_AP interface ($HOSTAPD)!"; exit 1
fi
# assign an IP address to the AP, and start a new DHCP server
ifconfig $WLAN_AP $WLAN_AP_IP netmask 255.255.255.0
$DNSMASQ --dhcp-range=$WLAN_AP_DHCP_RANGE --interface=$WLAN_AP
if [ $? -ne 0 ]; then
echo "FATAL: unable to start dhcp server! ($DNSMASQ)"; exit 1
fi
# enable packet forwarding and add firewall rules to allow forwarding packets
# between our 2 network interfaces.
IF_IN=$WLAN_STA
IF_OUT=$WLAN_AP
sysctl -w net.ipv4.ip_forward=1
$IPTABLES -F
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT
$IPTABLES -t nat -A POSTROUTING -o $IF_IN -j MASQUERADE
$IPTABLES -A FORWARD -i $IF_IN -o $IF_OUT -m state --state RELATED,ESTABLISHED -j ACCEPT
$IPTABLES -A FORWARD -i $IF_OUT -o $IF_IN -j ACCEPT
echo -e "\nWireless repeater access point \"$WLAN_AP_SSID\" is *up* and running!\n"
echo -e "To kill it : `basename $0` stop"
exit 0
Pourquoi tu n’as pas bridgé directement les 2 réseaux ?
Comme ça tu faisais vraiment un repeater et tu n’avais qu’un plan d’adressage et un serveur dhcp à gérer.
J’avais réussi à bridger les 2 interfaces wifi, mais après impossible d’affecter une IP au bridge avec dhcpcd.
Autant avec une interface wifi + filaire ça fonctionne, là, non.
Mais bon je suis loin d’être un spécialiste!
Bonjour à tous,
Voulant améliorer un peu mon niveau je me suis dit qu’un petit TP pouvait être utile.
Etant un adepte de cacti et me rappellant que parfois c’était gonflant de devoir l’installer j’ai voulu essayer de faire un “script” (je ne sais pas si c’est vraiment digne de ce nom) permettant de prendre une debian vierge et tout y faire. Il vous sera juste demander les mot de passes mysql. C’est normalement sans risque, par exemple il ne supprime rien de la crontab il ne fait que ajouter etc.
Attention il est a adapter selon VOS besoins :
Vous devez modifier le nom de :
-la BDD
-l’utilisateur
-le mot de passe
-le port
Vous pouvez faire un sed de ces termes pour modifier toutes les occurences des deux sciprt en un coup, les mots à changer sont :
Le nom de la BDD : LENOMDEVOTREDATABASE
Le nom utilisateur de la base : LENOMDUUSER
Son mot de passe: LEMOTDEPASSEDUUSER
Je pense avoir pris des noms parlant
Actuellement il marche comme ça j’ai fais correspondre tous les champs pour donner l’exemple fonctionnel.
Voici le script cacti.sh :
[code]#Installation de Cacti
#Installation non automatique car mysql présent
aptitude install apache2 mysql-server php5-mysql php5-cgi php5-cli php5-snmp php-pear snmp snmpd libapache2-mod-php5 rrdtool -y
RECUPERATION DE CaCTI
wget http://www.cacti.net/downloads/cacti-0.8.8a.tar.gz
tar xvzf cacti-0.8.8a.tar.gz -C /var/www
mv /var/www/cacti-0.8.8a /var/www/cacti
#CONFIGURATION DE Mysql
mysqladmin -u root -p create LENOMDEVOTREDATABASE
mysql -u root -p LENOMDEVOTREDATABASE < /var/www/cacti/cacti.sql
cat > mysql.droit <<“EOG”
GRANT ALL ON LENOMDEVOTREDATABASE.* TO LENOMDUUSER@localhost IDENTIFIED BY ‘LEMOTDEPASSEDUUSER’;
FLUSH privileges;
quit
EOG
mysql -u root -p LENOMDEVOTREDATABASE< mysql.droit
CONFIGURATION ACCES BDD
cd /var/www/cacti/include/
cat > config.php <<“EOF”
EOF
CREATION USER ET PERMISSIONS
useradd cactiuser -d /var/www/cacti -s /bin/false
chown -R cactiuser /var/www/cacti/rra
chown -R cactiuser /var/www/cacti/log
AJOUT AU CRONTAB
echo “*/5 * * * * cactiuser php5 /var/www/cacti/poller.php > /dev/null 2>&1” >> /etc/crontab
REBOOT DES SERVICES
service apache2 restart
service mysql restart
service cron restart
#BUGS CONNUS :
#Vérifiez dans le fichier /etc/php5/cli/php.ini que la valeur de la ligne memory_limit ne soit pas à -1
#si c’est le cas mettez le à 512M.
#Si après l’installation de Cacti vous allez dans Graph
#et que les graphiques de bases n’apparaissent pas, #allez dans « System Utilities »
#Cliquez sur « Rebuild Poller Cache ».
[/code]
Une fois le fonctionnement confirmé ( si problème regardez dans bugs connus), vous pouvez donner la dernière touche : SPINE (bien meilleur poller si grand parc à superviser)
Attention encore une fois à l’adapter :
Vous devez modifier le nom de :
-la BDD
-l’utilisateur
-le mot de passe
-le port
J’ai pour lui aussi fait un script simple(encore plus) :
Code de Spine.sh :
[code]#Installation de Spine pour Cacti
apt-get install build-essential libmysqlclient-dev libsnmp-dev -y
RECUPERATION ET COMPILATION DE SPINE
wget http://www.cacti.net/downloads/spine/cacti-spine-0.8.8a.tar.gz
tar xvzf cacti-spine-0.8.8a.tar.gz
cd cacti-spine-0.8.8a
./configure
make
make install
#CONFIGURATION DE SPINE
cd /usr/local/spine/etc/
cat > spine.conf <<“EOF”
±------------------------------------------------------------------------+
| Copyright © 2002-2012 The Cacti Group |
| |
| This program is free software; you can redistribute it and/or |
| modify it under the terms of the GNU Lesser General Public License |
| as published by the Free Software Foundation; either version 2.1 |
| 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. |
±------------------------------------------------------------------------+
| spine: a backend data gatherer for Cacti |
±------------------------------------------------------------------------+
| This poller would not have been possible without: |
| - Larry Adams (current development and enhancements) |
| - Rivo Nurges (rrd support, mysql poller cache, misc functions) |
| - RTG (core poller code, pthreads, snmp, autoconf examples) |
| - Brady Alleman/Doug Warner (threading ideas, implimentation details) |
±------------------------------------------------------------------------+
| Settings |
±------------------------------------------------------------------------+
| DB_Host ‘localhost’ or socket file for UNIX/Linux |
| IP Address for Windows |
| DB_Database Database name, typically ‘cacti’ |
| DB_Port The database port to use |
| DB_User The user to access the database, typically ‘cactiuser’ |
| DB_Pass The password for the Cacti user |
| SNMP_Clientaddr Bind SNMP to a specific address for sites that use |
| higher security levels |
| DB_PreG Set to 1 if you wish to work with older versions of |
| cacti 0.8.7. |
±------------------------------------------------------------------------+
DB_Host localhost
DB_Database LENOMDEVOTREDATABASE
DB_User LENOMDUUSER
DB_Pass LEMOTDEPASSEDUUSER
DB_Port 3306
DB_PreG 0
EOF
#Puis dans l’interface web de cacti allez dans Settings –> Paths et dans Alternate Poller File Path mettez « #/usr/local/spine/bin/spine » et appuyez sur entré #puis sur Save.
#Enfin dans Poller : Prendre Spine au lieu de cmd.php[/code]
Voilà j’espère que ça va vous faire gagner un peu de temps.
J’ai un peu chercher pour modifier le crontab sans risque mais finalement je suis content.
L’autre point me posant problème était les commandes mysql pour finalement trouver cette idée toute simple qui fonctionne à merveille
Kit’
EDIT : Ajout de # à cause de retour à la ligne sur le forum.
DOUBLE POST
SCRIPT : Installation auto OpenVpn + certificat client auto
Voilà j’espère que ce petit script va vous rendre bien des services et vous faire un gagner pas mal de temps.
Source : un peu partout sur le web.
Le script va vous poser les questions pendant l’install rien n’est à toucher
A retenir :
- Changez votre IP et adapter les autres paramètres à vos envies
- Ce script va créer le autovpn.sh qui permet de générer un compte et l’envoyer par mail
- Ce script va créer le bootvpn.sh à lancer à chaque reboot si vous voulez en faire une passerelle
[code]#Kitsun v3
#20/02/13
#Installation
aptitude update
aptitude install openvpn -y
#Configuration des variables systemes
echo Niveau de cryptage disponible : 1024 2048 4096
read cryp_user
echo Cryptage saisi $cryp_user
echo Saisir IP LOCAL de linterface auquel les clients VPN vont se connecter
read ip_local
echo IP local saisie $ip_local
echo Saisir IP Public pour connexion depuis internet auquel les clients VPN vont se connecter
read ip_ext
echo IP public saisie $ip_ext
echo Saisir le port a utiliser :
read port_use
echo le port utilise sera le $port_use
echo Saisir le protocole tcp ou udp :
read proto_use
echo le protocole utilise sera le $proto_use
#Resume
echo OpenVpn sera configure avec : un cryptage de $cryp_user, ip local : $ip_local, ip externe : $ip_ext, sur le port $port_use en $proto_use
echo appuyer sur une touche pour valider sinon ctrl+c
read
#Configuration des identifiants certificats
echo ATTENTION IL FAUT REPONDRE A CHAQUE QUESTION
echo Saisir le pays exemple : FR
read KEY_COUNTRY
echo pays saisie $KEY_COUNTRY
echo Saisir region exemple : SO
read KEY_PROVINCE
echo region saisie $KEY_PROVINCE
echo Saisir ville exemple : City
read KEY_CITY
echo Ville saisie $KEY_CITY
echo Saisir organisation exemple : Umbrella
read KEY_ORG
echo Ville saisie $KEY_ORG
echo Saisir mail exemple : mail@monmail.com
read KEY_EMAIL
echo Mail saisie $KEY_EMAIL
echo appuyer sur une touche pour valider sinon ctrl+c
read
cp -R /usr/share/doc/openvpn/examples/easy-rsa/2.0 /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa
rm vars
cat > vars <<“EOF”
easy-rsa parameter settings
NOTE: If you installed from an RPM,
don’t edit this file in place in
/usr/share/openvpn/easy-rsa –
instead, you should copy the whole
easy-rsa directory to another location
(such as /etc/openvpn) so that your
edits will not be wiped out by a future
OpenVPN package upgrade.
This variable should point to
the top level of the easy-rsa
tree.
export EASY_RSA="pwd
"
This variable should point to
the requested executables
export OPENSSL=“openssl”
export PKCS11TOOL=“pkcs11-tool”
export GREP=“grep”
This variable should point to
the openssl.cnf file included
with easy-rsa.
export KEY_CONFIG=$EASY_RSA/whichopensslcnf $EASY_RSA
Edit this variable to point to
your soon-to-be-created key
directory.
WARNING: clean-all will do
a rm -rf on this directory
so make sure you define
it correctly!
export KEY_DIR="$EASY_RSA/keys"
Issue rm -rf warning
echo NOTE: If you run ./clean-all, I will be doing a rm -rf on $KEY_DIR
PKCS11 fixes
export PKCS11_MODULE_PATH=“dummy”
export PKCS11_PIN=“dummy”
Increase this to 2048 if you
are paranoid. This will slow
down TLS negotiation performance
as well as the one-time DH parms
generation process.
export KEY_COUNTRY=“certificat_country”
export KEY_PROVINCE=“certificat_province”
export KEY_CITY=“certificat_city”
export KEY_ORG=“certificat_org”
export KEY_EMAIL=“certificat_email”
export KEY_SIZE=niveau_cryptage
In how many days should the root CA key expire?
export CA_EXPIRE=3650
In how many days should certificates expire?
export KEY_EXPIRE=3650
These are the default values for fields
which will be placed in the certificate.
Don’t leave any of these fields blank.
EOF
#Ajout des parametre de configuration de certificat
sed -i “s/niveau_cryptage/$cryp_user/g” vars
sed -i “s/certificat_country/$KEY_COUNTRY/g” vars
sed -i “s/certificat_province/$KEY_PROVINCE/g” vars
sed -i “s/certificat_city/$KEY_CITY/g” vars
sed -i “s/certificat_org/$KEY_ORG/g” vars
sed -i “s/certificat_email/$KEY_EMAIL/g” vars
source ./vars
#On supprime tous les anciens certificats
./clean-all
#On creer les parametres Diffie-Helman
./build-dh
#On creer le CA
./pkitool --initca
#On creer le certificat et la clef serveur
./pkitool --server vpn-server
#On creer le certificat et la clef pour le client
./pkitool vpn-client
cd /etc/openvpn/
cat > server.conf <<“EOG”
mode server
tls-server
dev tun
#Chemin des differents certificats
ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/vpn-server.crt
key /etc/openvpn/easy-rsa/keys/vpn-server.key
#dh /etc/openvpn/easy-rsa/keys/dh1024.pem
##ATTENTION SI LE CRYPTAGE CHANGE LE FICHIER AUSSI !!!
#Adresse reseau qui sera attribuée aux clients VPN
server 192.168.10.0 255.255.255.0
#On “pousse” la route 192.168.60.0 pour que nos client VPN puissent se connecter au reseau local
#push “route 192.168.10.0 255.255.255.0”
#On definit le serveur VPN comme passerelle par défaut pour les clients.
push “redirect-gateway def1”
#On configure des serveur DNS pour que les clients puissent resoudres des noms
#Vous pouvez mettre n’importe quels serveur DNS dans cet exemple les DNS de google
push “dhcp-option DNS 8.8.8.8”
push “dhcp-option DNS 8.8.4.4”
Question dhabitude mais les logs cest bien
log /var/log/openvpn.log
fichier de status permettant le monitoring munin etc
status /var/log/openvpn-status.log
verb 3
cipher BF-CBC # Blowfish (default)
#Possibilite de mettre en marche la compression
#comp-lzo
persist-key
persist-tun
max-clients 10
keepalive 10 120
#Ajout du chemin en fonction du cryptage
#IP de linterface auquel les clients VPN vont se connecter
EOG
echo installation OK
#Ajout du chemin en fonction du cryptage
echo dh /etc/openvpn/easy-rsa/keys/dh$cryp_user.pem >> server.conf
#Ajout de l’IP de la carte
echo local $ip_local >> server.conf
#Ajout du port utilise
echo port $port_use >> server.conf
#Ajout du protocole utilise
echo proto $proto_use >> server.conf
#Configuration de OpenVpn terminee
echo Configuration de OpenVpn terminee
##########################################################
##########################################################
##########################################################
################CREATION DES SCRIPTS######################
##########################################################
##########################################################
##########################################################
echo Creation du script de creation automatique des users avec envoi de mail
cd /etc/openvpn/
#CREATION DE LA VERSION ZIP
cat > autovpn_ZIP.sh <<“EOT”
#!/bin/bash
#Script pour creer automatiquement des certificats et des clefs pour les clients OpenVPN
#Initialisation des variables
echo “Nom du certificat: (ex: client ou admin)”
read cn
#Creation des certificats
cd /etc/openvpn/easy-rsa/
source ./vars
./pkitool $cn
mkdir $cn
#Creation du fichier de configuration ovpn pour les clients Windows
echo “client
dev tun
EOT
echo proto $proto_use >> autovpn_ZIP.sh
echo remote $ip_ext $port_use >> autovpn_ZIP.sh
cat >> autovpn_ZIP.sh <<“EED”
ca ca.crt
cert $cn.crt
key $cn.key” > $cn/$cn.ovpn
#Creation de l’archive avec tous les fichiers
cp keys/{ca.crt,$cn.crt,$cn.key} $cn/
zip -r $cn.zip $cn
#Decommentez les lignes suivantes si vous souhaitez envoyer les fichiers par mail
echo “Adresse E-mail a qui envoyer les certificats”
read mail
echo “Configuration d’OpenVPN pour votre serveur” | mutt -x -s “Zip d’OpenVPN” $mail -a $cn.zip
exit 0
EED
#CREATION DE LA VERSION NO ZIP
cat > autovpn_NO_ZIP.sh <<“EOX”
#!/bin/bash
#Script pour creer automatiquement des certificats et des clefs pour les clients OpenVPN
#Initialisation des variables
echo “Nom du certificat: (ex: client ou admin)”
read cn
#Creation des certificats
cd /etc/openvpn/easy-rsa/
source ./vars
./pkitool $cn
mkdir $cn
#Creation du fichier de configuration ovpn pour les clients Windows
echo “client
dev tun
EOX
echo proto $proto_use >> autovpn_ZIP.sh
echo remote $ip_ext $port_use >> autovpn_NO_ZIP.sh
cat >> autovpn_NO_ZIP.sh <<“EEE”
ca ca.crt
cert $cn.crt
key $cn.key” > $cn/$cn.ovpn
#Creation de l’archive avec tous les fichiers
cp keys/{ca.crt,$cn.crt,$cn.key} $cn/
#Decommentez les lignes suivantes si vous souhaitez envoyer les fichiers par mail
cd $cn/
echo “Adresse E-mail a qui envoyer les certificats”
read mail
echo “Configuration d’OpenVPN pour votre serveur” | mutt -x -s “Fichier d’OpenVPN version non compréssée” $mail -a .
exit 0
EEE
#Creation du fichier pour lancer openvpn en passerelle internet
echo Creation du fichier pour lancer openvpn en passerelle internet
cd /etc/openvpn/
cat > bootvpn.sh <<“EOZ”
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i tun0 -o eth0 -j ACCEPT
EOZ
chmod +x autovpn_ZIP.sh
chmod +x bootvpn.sh
chmod +x autovpn_NO_ZIP.sh
touch /usr/share/openssl-blacklist/blacklist.RSA-4096
service openvpn stop
service openvpn start
[/code]
Kit’
Si certaines personnes veulent tester je suis preneur
PS ; Ce script n’est probablement pas fait dans les règles de l’art mais il a le mérite de bien fonctionner et d’être adaptable ^^
Un petit script pour illustrer la puissance de zsh aussi en développement de scripts.
Il faut régulièrement nettoyer les dépôts local git quand vous l’utilisez ça permet de gagner de la place, à mon boulot j’en ai beaucoup 31 et c’est pas le truc au quel je pense tout les jours, donc je me suis fais un script pour ça :
[code]#!/usr/bin/zsh
autoload zargs
setopt EXTENDEDGLOB
function clean() {
pushd $(dirname $1) &> /dev/null
git repack &> /dev/null && git prune &> /dev/null
popd &> /dev/null
echo “Traitement du dossier $1”
}
zargs -n1 – **/.git(/) – clean[/code]
10 lignes pour aller chercher tout les dépôts, se positionner dedans et les nettoyer (je suis pas certains que le popd soit utile). Je n’utilise que 2 programmes externes à zsh dirname et git (bien obligé).
Cerise sur la crème Mont Blanc, c’est parallélisé.
Tu peux utiliser git gc à la place du git prune
[quote=“man git-prune”]In most cases, users should run git gc, which calls git prune. See
the section “NOTES”, below.[/quote]
[code]#!/usr/bin/zsh
autoload zargs
setopt EXTENDEDGLOB
function clean() {
git --git-dir="$(dirname $1)" gc --quiet
echo “Traitement du dossier $1”
}
zargs -n1 – **/.git(/) – clean[/code]
Tu as raison, on peut même un peu simplifier.
[quote=“kitsun”]SCRIPT : Installation auto OpenVpn + certificat client auto
Voilà j’espère que ce petit script va vous rendre bien des services et vous faire un gagner pas mal de temps.
Source : un peu partout sur le web.
Le script va vous poser les questions pendant l’install rien n’est à toucher
A retenir :
- Changez votre IP et adapter les autres paramètres à vos envies
- Ce script va créer le autovpn.sh qui permet de générer un compte et l’envoyer par mail
- Ce script va créer le bootvpn.sh à lancer à chaque reboot si vous voulez en faire une passerelle
[code]#Kitsun v3
#20/02/13
#Installation
aptitude update
aptitude install openvpn -y
#Configuration des variables systemes
echo Niveau de cryptage disponible : 1024 2048 4096
read cryp_user
echo Cryptage saisi $cryp_user
echo Saisir IP LOCAL de linterface auquel les clients VPN vont se connecter
read ip_local
echo IP local saisie $ip_local
echo Saisir IP Public pour connexion depuis internet auquel les clients VPN vont se connecter
read ip_ext
echo IP public saisie $ip_ext
echo Saisir le port a utiliser :
read port_use
echo le port utilise sera le $port_use
echo Saisir le protocole tcp ou udp :
read proto_use
echo le protocole utilise sera le $proto_use
#Resume
echo OpenVpn sera configure avec : un cryptage de $cryp_user, ip local : $ip_local, ip externe : $ip_ext, sur le port $port_use en $proto_use
echo appuyer sur une touche pour valider sinon ctrl+c
read
#Configuration des identifiants certificats
echo ATTENTION IL FAUT REPONDRE A CHAQUE QUESTION
echo Saisir le pays exemple : FR
read KEY_COUNTRY
echo pays saisie $KEY_COUNTRY
echo Saisir region exemple : SO
read KEY_PROVINCE
echo region saisie $KEY_PROVINCE
echo Saisir ville exemple : City
read KEY_CITY
echo Ville saisie $KEY_CITY
echo Saisir organisation exemple : Umbrella
read KEY_ORG
echo Ville saisie $KEY_ORG
echo Saisir mail exemple : mail@monmail.com
read KEY_EMAIL
echo Mail saisie $KEY_EMAIL
echo appuyer sur une touche pour valider sinon ctrl+c
read
cp -R /usr/share/doc/openvpn/examples/easy-rsa/2.0 /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa
rm vars
cat > vars <<“EOF”
easy-rsa parameter settings
NOTE: If you installed from an RPM,
don’t edit this file in place in
/usr/share/openvpn/easy-rsa –
instead, you should copy the whole
easy-rsa directory to another location
(such as /etc/openvpn) so that your
edits will not be wiped out by a future
OpenVPN package upgrade.
This variable should point to
the top level of the easy-rsa
tree.
export EASY_RSA="pwd
"
This variable should point to
the requested executables
export OPENSSL=“openssl”
export PKCS11TOOL=“pkcs11-tool”
export GREP=“grep”
This variable should point to
the openssl.cnf file included
with easy-rsa.
export KEY_CONFIG=$EASY_RSA/whichopensslcnf $EASY_RSA
Edit this variable to point to
your soon-to-be-created key
directory.
WARNING: clean-all will do
a rm -rf on this directory
so make sure you define
it correctly!
export KEY_DIR="$EASY_RSA/keys"
Issue rm -rf warning
echo NOTE: If you run ./clean-all, I will be doing a rm -rf on $KEY_DIR
PKCS11 fixes
export PKCS11_MODULE_PATH=“dummy”
export PKCS11_PIN=“dummy”
Increase this to 2048 if you
are paranoid. This will slow
down TLS negotiation performance
as well as the one-time DH parms
generation process.
export KEY_COUNTRY=“certificat_country”
export KEY_PROVINCE=“certificat_province”
export KEY_CITY=“certificat_city”
export KEY_ORG=“certificat_org”
export KEY_EMAIL=“certificat_email”
export KEY_SIZE=niveau_cryptage
In how many days should the root CA key expire?
export CA_EXPIRE=3650
In how many days should certificates expire?
export KEY_EXPIRE=3650
These are the default values for fields
which will be placed in the certificate.
Don’t leave any of these fields blank.
EOF
#Ajout des parametre de configuration de certificat
sed -i “s/niveau_cryptage/$cryp_user/g” vars
sed -i “s/certificat_country/$KEY_COUNTRY/g” vars
sed -i “s/certificat_province/$KEY_PROVINCE/g” vars
sed -i “s/certificat_city/$KEY_CITY/g” vars
sed -i “s/certificat_org/$KEY_ORG/g” vars
sed -i “s/certificat_email/$KEY_EMAIL/g” vars
source ./vars
#On supprime tous les anciens certificats
./clean-all
#On creer les parametres Diffie-Helman
./build-dh
#On creer le CA
./pkitool --initca
#On creer le certificat et la clef serveur
./pkitool --server vpn-server
#On creer le certificat et la clef pour le client
./pkitool vpn-client
cd /etc/openvpn/
cat > server.conf <<“EOG”
mode server
tls-server
dev tun
#Chemin des differents certificats
ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/vpn-server.crt
key /etc/openvpn/easy-rsa/keys/vpn-server.key
#dh /etc/openvpn/easy-rsa/keys/dh1024.pem
##ATTENTION SI LE CRYPTAGE CHANGE LE FICHIER AUSSI !!!
#Adresse reseau qui sera attribuée aux clients VPN
server 192.168.10.0 255.255.255.0
#On “pousse” la route 192.168.60.0 pour que nos client VPN puissent se connecter au reseau local
#push “route 192.168.10.0 255.255.255.0”
#On definit le serveur VPN comme passerelle par défaut pour les clients.
push “redirect-gateway def1”
#On configure des serveur DNS pour que les clients puissent resoudres des noms
#Vous pouvez mettre n’importe quels serveur DNS dans cet exemple les DNS de google
push “dhcp-option DNS 8.8.8.8”
push “dhcp-option DNS 8.8.4.4”
Question dhabitude mais les logs cest bien
log /var/log/openvpn.log
fichier de status permettant le monitoring munin etc
status /var/log/openvpn-status.log
verb 3
cipher BF-CBC # Blowfish (default)
#Possibilite de mettre en marche la compression
#comp-lzo
persist-key
persist-tun
max-clients 10
keepalive 10 120
#Ajout du chemin en fonction du cryptage
#IP de linterface auquel les clients VPN vont se connecter
EOG
echo installation OK
#Ajout du chemin en fonction du cryptage
echo dh /etc/openvpn/easy-rsa/keys/dh$cryp_user.pem >> server.conf
#Ajout de l’IP de la carte
echo local $ip_local >> server.conf
#Ajout du port utilise
echo port $port_use >> server.conf
#Ajout du protocole utilise
echo proto $proto_use >> server.conf
#Configuration de OpenVpn terminee
echo Configuration de OpenVpn terminee
##########################################################
##########################################################
##########################################################
################CREATION DES SCRIPTS######################
##########################################################
##########################################################
##########################################################
echo Creation du script de creation automatique des users avec envoi de mail
cd /etc/openvpn/
#CREATION DE LA VERSION ZIP
cat > autovpn_ZIP.sh <<“EOT”
#!/bin/bash
#Script pour creer automatiquement des certificats et des clefs pour les clients OpenVPN
#Initialisation des variables
echo “Nom du certificat: (ex: client ou admin)”
read cn
#Creation des certificats
cd /etc/openvpn/easy-rsa/
source ./vars
./pkitool $cn
mkdir $cn
#Creation du fichier de configuration ovpn pour les clients Windows
echo “client
dev tun
EOT
echo proto $proto_use >> autovpn_ZIP.sh
echo remote $ip_ext $port_use >> autovpn_ZIP.sh
cat >> autovpn_ZIP.sh <<“EED”
ca ca.crt
cert $cn.crt
key $cn.key” > $cn/$cn.ovpn
#Creation de l’archive avec tous les fichiers
cp keys/{ca.crt,$cn.crt,$cn.key} $cn/
zip -r $cn.zip $cn
#Decommentez les lignes suivantes si vous souhaitez envoyer les fichiers par mail
echo “Adresse E-mail a qui envoyer les certificats”
read mail
echo “Configuration d’OpenVPN pour votre serveur” | mutt -x -s “Zip d’OpenVPN” $mail -a $cn.zip
exit 0
EED
#CREATION DE LA VERSION NO ZIP
cat > autovpn_NO_ZIP.sh <<“EOX”
#!/bin/bash
#Script pour creer automatiquement des certificats et des clefs pour les clients OpenVPN
#Initialisation des variables
echo “Nom du certificat: (ex: client ou admin)”
read cn
#Creation des certificats
cd /etc/openvpn/easy-rsa/
source ./vars
./pkitool $cn
mkdir $cn
#Creation du fichier de configuration ovpn pour les clients Windows
echo “client
dev tun
EOX
echo proto $proto_use >> autovpn_ZIP.sh
echo remote $ip_ext $port_use >> autovpn_NO_ZIP.sh
cat >> autovpn_NO_ZIP.sh <<“EEE”
ca ca.crt
cert $cn.crt
key $cn.key” > $cn/$cn.ovpn
#Creation de l’archive avec tous les fichiers
cp keys/{ca.crt,$cn.crt,$cn.key} $cn/
#Decommentez les lignes suivantes si vous souhaitez envoyer les fichiers par mail
cd $cn/
echo “Adresse E-mail a qui envoyer les certificats”
read mail
echo “Configuration d’OpenVPN pour votre serveur” | mutt -x -s “Fichier d’OpenVPN version non compréssée” $mail -a .
exit 0
EEE
#Creation du fichier pour lancer openvpn en passerelle internet
echo Creation du fichier pour lancer openvpn en passerelle internet
cd /etc/openvpn/
cat > bootvpn.sh <<“EOZ”
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i tun0 -o eth0 -j ACCEPT
EOZ
chmod +x autovpn_ZIP.sh
chmod +x bootvpn.sh
chmod +x autovpn_NO_ZIP.sh
touch /usr/share/openssl-blacklist/blacklist.RSA-4096
service openvpn stop
service openvpn start
[/code]
Kit’
Si certaines personnes veulent tester je suis preneur
PS ; Ce script n’est probablement pas fait dans les règles de l’art mais il a le mérite de bien fonctionner et d’être adaptable ^^[/quote]
Pas mal du tout …
Il y a aussi le moyen de faire un certificat unique comme ça aucun rebuild et il suffit juste d’ajouter un user ssh pour les connexion VPN
Merci du retour
Je n’avais pas vu ça, faudra que je jette un oeil ça peut faire gagner un peu de temps
Kit’
Bonsoir
Je suis nouveau ici, je suis passionné par le dev et le scripting et ici c’est la classe
Est ce que dans ce post Pour les scripts vous acceptez les scripts Python ?
Car je viens de coder un ptit bout de quelque chose qui permet de surveiller un processus et je me suis dis
autant en faire profiter.
[quote=“olivier36”]Bonsoir
Je suis nouveau ici, je suis passionné par le dev et le scripting et ici c’est la classe
Est ce que dans ce post Pour les scripts vous acceptez les scripts Python ?
Car je viens de coder un ptit bout de quelque chose qui permet de surveiller un processus et je me suis dis
autant en faire profiter.[/quote]
Fais-toi plaisir!
Pff on est vraiment obligé d’accepter les scripts en python ?
hi bon je me lance alors, ce script prend 1 ou 2 paramétres pour fonctionner.
Le premier paramétre est le processus a surveiller, ou sous la forme d’une commande dans quel cas
la commande est lançé, ou sous forme de pid(processus existant.
Le script affiche un petit résumé pour la durée de surveillance, si appelé avec un processus le script s’arrete
automatiquement a la fin de celui ci.
Un petit --help sur le script renvois un petit résumé .
En ésperant que ça puisse être utile et que le code est pas trop vilain, hésitez pas a me corriger
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#olivier36 30 mars 2013
import os
import sys
import time
import signal
import gobject
import threading
class SysInfos(threading.Thread):
'''Return informations about a process pid pass on argument:
-cpu usage for the pid
-memorie usage for the pid
-the thread return a dic with cpu history and memorie history
'''
def __init__(self, process, interval):
threading.Thread.__init__(self)
self.running = False
self.my_process = process
self.interval = float(interval)
self.total_mem = int(psutil.TOTAL_PHYMEM/1048576)
self.cpu_list = []
self.mem_list = []
signal.signal(signal.SIGINT, self.signal_handler)
def stop(self):
self.stop_event.set()
self.running = False
#Just say good by
print "End of thread ."
#Return the dic for apply calculations
return {"cpu_history": self.cpu_list,
"memory_history": self.mem_list,
"duration": self.duration,
"start_time": self.start_time}
def signal_handler(self, signal, frame):
print '\nYou pressed Ctrl+C!'
self.stop()
def run(self):
"""Start the thread."""
self.running = True
print "thread is running now..."
self.stop_event = threading.Event()
self.duration = 0
self.start_time = time.strftime('%H:%M:%S')
print "start at : ", self.start_time
print "process : ", self.my_process
while not self.stop_event.isSet() and self.running == True:
#If process is stop out of the script we stop
#status 5 is not running status
if self.my_process.status == 5:
print self.my_process.status
self.stop()
try:
#Get cpu percentage, may have two arguments(see the doc)
cpu_charge = self.my_process.get_cpu_percent(interval=self.interval)
#Get memory percentage
memorie_use = self.my_process.get_memory_percent()
#print result in terminal on the same line
chaine = ("cpu_charge "+str(cpu_charge)+
" % memory_use "+"%.2f" % memorie_use+"% "+
"%.2f" % float(self.total_mem/100*memorie_use)+" mo")
sys.stdout.write("\r"+chaine)
sys.stdout.flush()
#Construct lists
self.cpu_list.append(cpu_charge)
self.mem_list.append(memorie_use)
#Totalisation to have the duration, may be perfectionned i assume
self.duration = self.duration + self.interval
except:
#If process is killed, thread is always running a small time
#enough to generate some errors, because process does not exist
#so exception nicely pass
self.running = False
if __name__ == "__main__":
#psutil module is perhaps absent
try:
import psutil
except ImportError:
print "You need to install python-psutil module."
print "Try : apt-get install python-psutil"
sys.exit()
#Get parameters
if len(sys.argv) > 1:
param = u"%s" % sys.argv[1]
#If --help is call
if param == "--help":
print """
This script display informations about cpu and memory charge for a process.
It must be call with a command or pid argument\n and stop at the end of the process.
Use :
with command : python process_listner.py <command> -d<seconds>
with pid : python process_listner.py <pid> -d<seconds>
parameter -d<second> is optional, set to 1 second by default.
parameter -d<second> is the interval between two calculation of cpu charge.
Press Ctrl+C to stop the script."""
sys.exit()
#In the case where -d argument exist
if len(sys.argv) == 3:
if sys.argv[2][0:2] == "-d":
try:
interval = float(sys.argv[2][2:])
print "Interval set to ",interval
#Control if parameter interval is really numeric
interval = float(interval)
except:
#if -d is not float do not crash
print "Bad parameter ",sys.argv[2]," Interval set to 1"
interval = 1
else:
#if parameter different of -d do not crash
print "Bad parameter ",sys.argv[2]," Interval set to 1"
interval = 1
else:
#Set by default interval to 1
print "Interval set to 1"
interval = 1
if len(sys.argv) == 2 or len(sys.argv) == 3:
if not param.isnumeric():
#If this script is called with a command
#Open command with psutil Popen
try:
launch_command = psutil.Popen(sys.argv[1])
script_process = psutil.Process(int(launch_command.pid))
except:
print "Nothing to do with command", sys.argv[1]," does not exist."
sys.exit()
else:
#or if this script is called with pid
#Get the process instance with psutil
try:
script_process = psutil.Process(int(sys.argv[1]))
except:
print "Nothing to do with process", sys.argv[1]," does not exist."
sys.exit()
name = script_process.name
pid = script_process.pid
#Start the thread to manage calculations
current_thread = SysInfos(script_process, interval)
current_thread.start()
while not current_thread.isAlive():pass
while current_thread.isAlive():pass
#Stop the thread and get the dic
results = current_thread.stop()
moy_cpu_charge = float(sum(results["cpu_history"])/len(results["cpu_history"]))
total_mem = int(psutil.TOTAL_PHYMEM/1048576)
total_mem_use = float(sum(results["memory_history"])/len(results["memory_history"]))
total_mem_use_percentage = float(total_mem/100*total_mem_use)
#Just need to calculate and formate the results
print "Stopping thread... "
print "----------------------------------------------"
print "Command :",name
print "pid :",pid
print "\ncpu charge :", "%.2f" % moy_cpu_charge, '%'
print "Total memory :", total_mem, " mo"
print "memorie use :", "%.2f" % total_mem_use, '%', "%.2f" % total_mem_use_percentage, 'mo'
print "\nInterval assigned at :",interval, "seconds"
print "Begin at :", results["start_time"]
print "Stopping at :", time.strftime('%H:%M:%S')
print "duration :",results["duration"], " seconds"
print "----------------------------------------------"
sys.exit()
else:
#If no argument passed quit properly
print "You need to pass an argument ."
sys.exit()
Sympathique
pas un script mais un " alias " …
function ban() {
if [ "`id -u`" == "0" ] ; then
iptables -A INPUT -s $1 -j DROP
else
sudo iptables -A INPUT -s $1 -j DROP
fi
}
Encore un petit script, inspiré par ce sujet : exploiter-les-logs-d-apache2-t43627.html#p439474
Il s’agit donc de générer une page html, qui contient les dernières entrées des logs du serveur web Apache. Cela permet une surveillance en temps réél (avec les limites d’un tel script)
A adapter à votre config bien entendu. Il faut les droits pour écrire dans l’arborescence web (le plus simple étant de lancer le script en root, en tache de fond, dans votre /etc/rc.local par exemple)
Ce n’est pas très élégant comme script mais c’est minimaliste et ça fonctionne
Attention à bien protéger la page html générée par un .htaccess pour la soustraire aux yeux indiscrets
#!/bin/bash
#
# apachelog.sh - a quick & dirty "realtime" Apache httpd HTML log generator
#
# http://agentoss.wordpress.com
#
# Usage : apachelog.sh &
#
# Warning : do not expose your logs!
#
# TIP1 : Use the following lines for your virtualhost configuration, for less log noise :
# SetEnvIf Request_URI "^/logs/$" dontlog
# SetEnvIf Request_URI "^/favicon\.ico$" dontlog
# CustomLog ${APACHE_LOG_DIR}/access.log combined env=!dontlog
#
# TIP2 : add a favicon.ico (or create an empty file) to your web document root : less errors in apache error.log
#
apache_log="/var/log/apache2/ssl_access.log"
error_log="/var/log/apache2/error.log"
nlines=25
autorefresh_secs="5"
# protect this generated file from unauthorized view with an .htaccess!
myfile="/var/www/logs/index.html"
# test if we can write the $myfile output
echo >"$myfile"
if [ $? -ne 0 ];
then
echo "$0 : Can't write $myfile! Aborting."
exit 1
fi
# main (endless) loop
while true;
do
cat >"$myfile"<<EOF
<HTML><HEAD><meta http-equiv="refresh" content="$autorefresh_secs"><TITLE>`hostname` : Apache Realtime Access Logs</TITLE><style type="text/css">
body { color: white; background-color: lavender; font-size: 12px; margin: 20px 40px; text-align: center; border-radius: 8px; }
#content {padding: 8px; text-align: left; color: white; background-color: black; overflow: auto; border:4px solid indigo; border-radius: 8px;}
h1 { color: green; text-align: center; }
h2 { color: yellow; text-align: center; }
.pre1 { color: greenyellow; font-family: Monospace; font-size: 10px; }
.pre2 { color: red; font-family: Monospace; font-size: 10px; }
</STYLE></HEAD><BODY><DIV id="content"><H1>$apache_log</H1>
EOF
echo "<PRE class=pre1>" >>"$myfile"
tail "$apache_log" -n $nlines >>"$myfile"
echo "</PRE><H1>$error_log</H1><PRE class=pre2>" >>"$myfile"
tail "$error_log" -n $nlines >>"$myfile"
echo "</PRE>" >>"$myfile"
cat >>"$myfile" <<EOF
<H2>Autorefresh every $autorefresh_secs s. Data last updated : `date`</H2></DIV></BODY></HTML>
EOF
sleep 1
done
exit 0
Bonjour,
J’ai écrit un petit script bash pour faire des sauvegardes de dossiers ou de fichiers dans un fichier tar.
Je tenais à le faire partager à la communauté, bien que je sois un débutant en langage script et que je sois loin du niveau de certain habitué du forum.
Ces dossiers ou fichiers sont paramétrables dans le script ainsi que l’emplacement de sauvegarde.
La référence “all” fait une sauvegarde des références 1 à 9.
[code]#!/bin/bash
Script permettant d’effectuer des sauvegardes de dossier prédèfini rapidement avec ou sans compression
save [option] -c (compression) | [référence préalable]
#############
##Variables##
#############
#Configuration:
#Répertoire ou les fichiers sont archivés
REP_SAUV="/home/toto/sauvegarde"
#Définition du répertoire et de sa référence
“all contient des références de 1 à 9”
REF[0]=“all”
REF[1]="documents"
REP[1]=“home/toto/Documents”
REF[2]="travaux"
REP[2]=“home/toto/Travaux”
REF[3]="non_défini"
REP[3]=“non_défini”
REF[4]="non_défini"
REP[4]=“non_défini”
REF[5]="non_défini"
REP[5]=“non_défini”
REF[6]="non_défini"
REP[6]=“non_défini”
REF[7]="non_défini"
REP[7]=“non_défini”
REF[8]="non_défini"
REP[8]=“non_défini”
REF[9]="non_défini"
REP[9]=“non_défini”
#Références secondaires
REF[10]="txt"
REP[10]=“home/toto/fichier.txt”
REF[11]="odt"
REP[11]=“home/toto/fichier.odt”
REF[12]="non_défini"
REP[12]=“non_défini”
REF[13]="non_défini"
REP[13]=“non_défini”
REF[14]="non_défini"
REP[14]=“non_défini”
REF[15]="non_défini"
REP[15]=“non_défini”
REF[16]="non_défini"
REP[16]=“non_défini”
REF[17]="non_défini"
REP[17]=“non_défini”
REF[18]="non_défini"
REP[18]=“non_défini”
REF[19]="non_défini"
REP[19]=“non_défini”
#########################################
#Commande non valide, VAR_01 = 1, message à afficher.
VAR_01=“null”
#Info évolution du programme (chaine de caractère)
MSG_01=“null”
#Option commande tar
ARG_TAR=“null”
#Argument utile (prend la valeur de l’argument 1 si un seul argument, et de l’argument 2 si deux arguments)
ARG_UTI=“null”
#Test si deux arguments
if [ “$#” = 2 ] ; then
#Test du premier argument
if [ "$1" != -c ] ; then
VAR_01="1"
fi
ARG_UTI="$2"
fi
if [ “$#” = 1 ] ; then
ARG_UTI="$1"
fi
#Test de l’argument utile
if [ “$ARG_UTI” != “${REF[0]}” ] && [ “$ARG_UTI” != “${REF[1]}” ] && [ “$ARG_UTI” != “${REF[2]}” ] && [ “$ARG_UTI” != “${REF[3]}” ] && [ “$ARG_UTI” != “${REF[4]}” ] && [ “$ARG_UTI” != “${REF[5]}” ] && [ “$ARG_UTI” != “${REF[6]}” ] && [ “$ARG_UTI” != “${REF[7]}” ] && [ “$ARG_UTI” != “${REF[8]}” ] && [ “$ARG_UTI” != “${REF[9]}” ] && [ “$ARG_UTI” != “${REF[10]}” ] && [ “$ARG_UTI” != “${REF[11]}” ] && [ “$ARG_UTI” != “${REF[12]}” ] && [ “$ARG_UTI” != “${REF[13]}” ] && [ “$ARG_UTI” != “${REF[14]}” ] && [ “$ARG_UTI” != “${REF[15]}” ] && [ “$ARG_UTI” != “${REF[16]}” ] && [ “$ARG_UTI” != “${REF[17]}” ] && [ “$ARG_UTI” != “${REF[18]}” ] && [ “$ARG_UTI” != “${REF[19]}” ] ; then
VAR_01="1"
fi
if [ “$#” = 1 ] || [ “$#” = 2 ] ; then
if [ "$VAR_01" = null ] ; then
#Avec compression
if [ "$#" = 2 ] ; then
MSG_01="sauvegardé et compressé."
ARG_TAR="-cvzf"
EXT_TAR=".tar.gz"
#Sans compression
else
MSG_01="sauvegardé."
ARG_TAR="-cvf"
EXT_TAR=".tar"
fi
#Création du répertoire "date"
REP_DATE="SAVE_$(date +%y-%m-%d)_$(date +%X)_$ARG_UTI"
mkdir $REP_SAUV/$REP_DATE
touch $REP_SAUV/save_$(date +%y-%m-%d).log
cd $REP_SAUV/$REP_DATE
fi
else
VAR_01="1"
fi
#Si probleme on affiche le message
if [ “$VAR_01” = 1 ] ; then
echo ""
echo "save [option] -c (compression) | [référence préalable]"
echo ""
echo " Références préalables:"
echo ""
echo " ${REF[0]} ; pour la sauvegarde de toutes les références de 1 à 9."
echo ""
for ((i=1 ; i < 10 ; i++))
do
echo " $i: ${REF[$i]}"
done
echo ""
echo " Références secondaires:"
echo ""
for ((i=10 ; i < 20 ; i++))
do
echo " $i: ${REF[$i]}"
done
echo “”
fi
#Si pas de probleme on sauvegarde
if [ “$VAR_01” = null ] ; then
#"All"
if [ "$ARG_UTI" = "${REF[0]}" ] ; then
#Archivage des references 1 a 9
for ((i=1 ; i < 10 ; i++))
do
if [ "${REF[$i]}" != non_défini ] ; then
tar --exclude=".Trash-1000" --exclude="lost+found" $ARG_TAR ${REF[$i]}$EXT_TAR /${REP[$i]}/
fi
done
#Affichage des informations sur la console et dans le fichier log
echo ""
echo "$(date +%X) ..." >> $REP_SAUV/save_$(date +%y-%m-%d).log
for ((i=1 ; i < 10 ; i++))
do
if [ "${REF[$i]}" != non_défini ] ; then
echo "${REF[$i]} $MSG_01"
echo " ... ${REF[$i]} $MSG_01" >> $REP_SAUV/save_$(date +%y-%m-%d).log
fi
done
echo " ..." >> $REP_SAUV/save_$(date +%y-%m-%d).log
exit 0
fi
#Archivage et affichage des informations de la reference choisi
for ((i=1 ; i < 20 ; i++))
do
if [ "$ARG_UTI" = "${REF[$i]}" ] ; then
tar --exclude=".Trash-1000" --exclude="lost+found" $ARG_TAR ${REF[$i]}$EXT_TAR /${REP[$i]}/
echo "${REF[$i]} $MSG_01"
echo "$(date +%X) ... ${REF[$i]} $MSG_01" >> $REP_SAUV/save_$(date +%y-%m-%d).log
echo " ..." >> $REP_SAUV/save_$(date +%y-%m-%d).log
exit 0
fi
done
fi[/code]