Pour les scripts : c'est ici

Chouette, merci :slightly_smiling:

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 :slightly_smiling:

update 12 avril 2013 : adapté & testé sur Debian Wheezy :slightly_smiling:

#!/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 :mrgreen:

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”

<?php /* +-------------------------------------------------------------------------+ | Copyright (C) 2004-2012 The Cacti Group | | | | 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 2 | | 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. | +-------------------------------------------------------------------------+ | Cacti: The Complete RRDTool-based Graphing Solution | +-------------------------------------------------------------------------+ | This code is designed, written, and maintained by the Cacti Group. See | | about.php and/or the AUTHORS file for specific developer information. | +-------------------------------------------------------------------------+ | http://www.cacti.net/ | +-------------------------------------------------------------------------+ */ /* make sure these values refect your actual database/host/user/password */ $database_type = "mysql"; $database_default = "LENOMDEVOTREDATABASE"; $database_hostname = "localhost"; $database_username = "LENOMDUUSER"; $database_password = "LEMOTDEPASSEDUUSER"; $database_port = "3306"; $database_ssl = false; /* Edit this to point to the default URL of your Cacti install ex: if your cacti install as at http://serverip/cacti/ this would be set to /cacti/ */ $url_path = "/cacti/"; /* Default session name - Session name must contain alpha characters */ //$cacti_session_name = "Cacti"; ?>

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 :slightly_smiling:

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 :slightly_smiling:

A retenir :

  • Changez votre IP et adapter les autres paramètres à vos envies :mrgreen:
  • 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 :slightly_smiling:

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 :slightly_smiling:

A retenir :

  • Changez votre IP et adapter les autres paramètres à vos envies :mrgreen:
  • 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 :slightly_smiling:

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 :slightly_smiling:

Merci du retour :slightly_smiling:
Je n’avais pas vu ça, faudra que je jette un oeil ça peut faire gagner un peu de temps :mrgreen:

Kit’

Bonsoir

Je suis nouveau ici, je suis passionné par le dev et le scripting et ici c’est la classe :slightly_smiling:
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 :slightly_smiling:
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! :slightly_smiling:

Pff on est vraiment obligé d’accepter les scripts en python ? :12

:laughing:

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 :slightly_smiling:

#!/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 :slightly_smiling:

pas un script mais un " alias " … :slightly_smiling:

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 :033

Attention à bien protéger la page html générée par un .htaccess pour la soustraire aux yeux indiscrets :stuck_out_tongue:

#!/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]