# Pour les scripts : c'est ici

**URL:** <https://www.debian-fr.org/t/pour-les-scripts-cest-ici/3820>\
**Category:** Trucs et Astuces\
**Created:** [Février 20, 2016, 12:53 UTC](https://www.debian-fr.org/t/pour-les-scripts-cest-ici/3820 "2016-02-20T12:53:11Z")\
**Posts on this page:** 20\
**Page:** 16

<div class="post-metadata">

**Author:** ![seb-ksl](https://www.debian-fr.org/user_avatar/www.debian-fr.org/seb-ksl/32/2946_2.png) [@seb-ksl](https://www.debian-fr.org/u/seb-ksl)\
**Post date:** [Février 21, 2016, 1:39 UTC](https://www.debian-fr.org/t/pour-les-scripts-cest-ici/3820/302 "2016-02-21T13:39:14Z")

</div>

Chouette, merci 🙂

---

<div class="post-metadata">

**Author:** ![agentsteel](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/97f17d/32.png) [@agentsteel](https://www.debian-fr.org/u/agentsteel)\
**Post date:** [Février 21, 2016, 1:39 UTC](https://www.debian-fr.org/t/pour-les-scripts-cest-ici/3820/303 "2016-02-21T13:39:49Z")

</div>

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 🙂

```auto
#!/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
```

---

<div class="post-metadata">

**Author:** ![BBT1](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/b/ecc23a/32.png) [@BBT1](https://www.debian-fr.org/u/BBT1)\
**Post date:** [Février 21, 2016, 1:40 UTC](https://www.debian-fr.org/t/pour-les-scripts-cest-ici/3820/304 "2016-02-21T13:40:09Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![agentsteel](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/97f17d/32.png) [@agentsteel](https://www.debian-fr.org/u/agentsteel)\
**Post date:** [Février 21, 2016, 1:40 UTC](https://www.debian-fr.org/t/pour-les-scripts-cest-ici/3820/305 "2016-02-21T13:40:10Z")

</div>

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!

---

<div class="post-metadata">

**Author:** ![kitsun](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/k/54ee81/32.png) [@kitsun](https://www.debian-fr.org/u/kitsun)\
**Post date:** [Février 21, 2016, 2:16 UTC](https://www.debian-fr.org/t/pour-les-scripts-cest-ici/3820/306 "2016-02-21T14:16:16Z")

</div>

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 «&nbsp;script&nbsp;» (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:](https://www.debian-fr.org/uploads/default/original/1X/cc83e9b583138e48ff45f96609046b06d06c7f9d.gif "Mr. Green")

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](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 \<\<«&nbsp;EOG&nbsp;»  
GRANT ALL ON LENOMDEVOTREDATABASE.\* TO LENOMDUUSER@localhost IDENTIFIED BY ‹&nbsp;LEMOTDEPASSEDUUSER&nbsp;›;  
FLUSH privileges;  
quit

EOG

mysql -u root -p LENOMDEVOTREDATABASE\< mysql.droit

# CONFIGURATION ACCES BDD

cd /var/www/cacti/include/  
cat \> config.php \<\<«&nbsp;EOF&nbsp;»

\<?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 «&nbsp;\*/5 \* \* \* \* cactiuser php5 /var/www/cacti/poller.php \> /dev/null 2\>&1&nbsp;» \>\> /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](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 \<\<«&nbsp;EOF&nbsp;»

# ±------------------------------------------------------------------------+

# | Copyright (C) 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 ‹&nbsp;localhost&nbsp;› or socket file for UNIX/Linux |

# | IP Address for Windows |

# | DB\_Database Database name, typically ‹&nbsp;cacti&nbsp;› |

# | DB\_Port The database port to use |

# | DB\_User The user to access the database, typically ‹&nbsp;cactiuser&nbsp;› |

# | 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.

---

<div class="post-metadata">

**Author:** ![kitsun](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/k/54ee81/32.png) [@kitsun](https://www.debian-fr.org/u/kitsun)\
**Post date:** [Février 21, 2016, 2:16 UTC](https://www.debian-fr.org/t/pour-les-scripts-cest-ici/3820/307 "2016-02-21T14:16:20Z")

</div>

DOUBLE POST

---

<div class="post-metadata">

**Author:** ![kitsun](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/k/54ee81/32.png) [@kitsun](https://www.debian-fr.org/u/kitsun)\
**Post date:** [Février 21, 2016, 2:24 UTC](https://www.debian-fr.org/t/pour-les-scripts-cest-ici/3820/308 "2016-02-21T14:24:03Z")

</div>

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 ![:mrgreen:](https://www.debian-fr.org/uploads/default/original/1X/cc83e9b583138e48ff45f96609046b06d06c7f9d.gif "Mr. Green")
- 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](mailto: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 \<\<«&nbsp;EOF&nbsp;»

# 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=«&nbsp;`pwd`&nbsp;»

# 

# This variable should point to

# the requested executables

# 

export OPENSSL=«&nbsp;openssl&nbsp;»  
export PKCS11TOOL=«&nbsp;pkcs11-tool&nbsp;»  
export GREP=«&nbsp;grep&nbsp;»

# 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=«&nbsp;$EASY\_RSA/keys&nbsp;»

# 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=«&nbsp;dummy&nbsp;»  
export PKCS11\_PIN=«&nbsp;dummy&nbsp;»

# 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=«&nbsp;certificat\_country&nbsp;»  
export KEY\_PROVINCE=«&nbsp;certificat\_province&nbsp;»  
export KEY\_CITY=«&nbsp;certificat\_city&nbsp;»  
export KEY\_ORG=«&nbsp;certificat\_org&nbsp;»  
export KEY\_EMAIL=«&nbsp;certificat\_email&nbsp;»  
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 «&nbsp;s/niveau\_cryptage/$cryp\_user/g&nbsp;» vars  
sed -i «&nbsp;s/certificat\_country/$KEY\_COUNTRY/g&nbsp;» vars  
sed -i «&nbsp;s/certificat\_province/$KEY\_PROVINCE/g&nbsp;» vars  
sed -i «&nbsp;s/certificat\_city/$KEY\_CITY/g&nbsp;» vars  
sed -i «&nbsp;s/certificat\_org/$KEY\_ORG/g&nbsp;» vars  
sed -i «&nbsp;s/certificat\_email/$KEY\_EMAIL/g&nbsp;» 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 \<\<«&nbsp;EOG&nbsp;»

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 «&nbsp;pousse&nbsp;» la route 192.168.60.0 pour que nos client VPN puissent se connecter au reseau local  
#push «&nbsp;route 192.168.10.0 255.255.255.0&nbsp;»

#On definit le serveur VPN comme passerelle par défaut pour les clients.  
push «&nbsp;redirect-gateway def1&nbsp;»

#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 «&nbsp;dhcp-option DNS 8.8.8.8&nbsp;»  
push «&nbsp;dhcp-option DNS 8.8.4.4&nbsp;»

# 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 \<\<«&nbsp;EOT&nbsp;»  
#!/bin/bash  
#script pour creer automatiquement des certificats et des clefs pour les clients OpenVPN

#Initialisation des variables  
echo «&nbsp;Nom du certificat: (ex: client ou admin)&nbsp;»  
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 «&nbsp;client  
dev tun  
EOT  
echo proto $proto\_use \>\> autovpn\_ZIP.sh  
echo remote $ip\_ext $port\_use \>\> autovpn\_ZIP.sh  
cat \>\> autovpn\_ZIP.sh \<\<«&nbsp;EED&nbsp;»  
ca ca.crt  
cert $cn.crt  
key $cn.key&nbsp;» \> $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 «&nbsp;Adresse E-mail a qui envoyer les certificats&nbsp;»  
read mail  
echo «&nbsp;Configuration d’OpenVPN pour votre serveur&nbsp;» | mutt -x -s «&nbsp;Zip d’OpenVPN&nbsp;» $mail -a $cn.zip

exit 0  
EED

#CREATION DE LA VERSION NO ZIP

cat \> autovpn\_NO\_ZIP.sh \<\<«&nbsp;EOX&nbsp;»  
#!/bin/bash  
#script pour creer automatiquement des certificats et des clefs pour les clients OpenVPN

#Initialisation des variables  
echo «&nbsp;Nom du certificat: (ex: client ou admin)&nbsp;»  
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 «&nbsp;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 \<\<«&nbsp;EEE&nbsp;»  
ca ca.crt  
cert $cn.crt  
key $cn.key&nbsp;» \> $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 «&nbsp;Adresse E-mail a qui envoyer les certificats&nbsp;»  
read mail  
echo «&nbsp;Configuration d’OpenVPN pour votre serveur&nbsp;» | mutt -x -s «&nbsp;Fichier d’OpenVPN version non compréssée&nbsp;» $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 \<\<«&nbsp;EOZ&nbsp;»  
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 ^^

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 2:24 UTC](https://www.debian-fr.org/t/pour-les-scripts-cest-ici/3820/309 "2016-02-21T14:24:10Z")

</div>

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é.

---

<div class="post-metadata">

**Author:** ![BBT1](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/b/ecc23a/32.png) [@BBT1](https://www.debian-fr.org/u/BBT1)\
**Post date:** [Février 21, 2016, 2:24 UTC](https://www.debian-fr.org/t/pour-les-scripts-cest-ici/3820/310 "2016-02-21T14:24:15Z")

</div>

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]

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 2:24 UTC](https://www.debian-fr.org/t/pour-les-scripts-cest-ici/3820/311 "2016-02-21T14:24:22Z")

</div>

[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.

---

<div class="post-metadata">

**Author:** ![lowterie](https://www.debian-fr.org/user_avatar/www.debian-fr.org/lowterie/32/3012_2.png) [@lowterie](https://www.debian-fr.org/u/lowterie)\
**Post date:** [Février 21, 2016, 2:32 UTC](https://www.debian-fr.org/t/pour-les-scripts-cest-ici/3820/312 "2016-02-21T14:32:03Z")

</div>

[quote=«&nbsp;kitsun&nbsp;»]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 ![:mrgreen:](https://www.debian-fr.org/uploads/default/original/1X/cc83e9b583138e48ff45f96609046b06d06c7f9d.gif "Mr. Green")
- 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](mailto: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 \<\<«&nbsp;EOF&nbsp;»

# 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=«&nbsp;`pwd`&nbsp;»

# 

# This variable should point to

# the requested executables

# 

export OPENSSL=«&nbsp;openssl&nbsp;»  
export PKCS11TOOL=«&nbsp;pkcs11-tool&nbsp;»  
export GREP=«&nbsp;grep&nbsp;»

# 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=«&nbsp;$EASY\_RSA/keys&nbsp;»

# 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=«&nbsp;dummy&nbsp;»  
export PKCS11\_PIN=«&nbsp;dummy&nbsp;»

# 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=«&nbsp;certificat\_country&nbsp;»  
export KEY\_PROVINCE=«&nbsp;certificat\_province&nbsp;»  
export KEY\_CITY=«&nbsp;certificat\_city&nbsp;»  
export KEY\_ORG=«&nbsp;certificat\_org&nbsp;»  
export KEY\_EMAIL=«&nbsp;certificat\_email&nbsp;»  
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 «&nbsp;s/niveau\_cryptage/$cryp\_user/g&nbsp;» vars  
sed -i «&nbsp;s/certificat\_country/$KEY\_COUNTRY/g&nbsp;» vars  
sed -i «&nbsp;s/certificat\_province/$KEY\_PROVINCE/g&nbsp;» vars  
sed -i «&nbsp;s/certificat\_city/$KEY\_CITY/g&nbsp;» vars  
sed -i «&nbsp;s/certificat\_org/$KEY\_ORG/g&nbsp;» vars  
sed -i «&nbsp;s/certificat\_email/$KEY\_EMAIL/g&nbsp;» 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 \<\<«&nbsp;EOG&nbsp;»

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 «&nbsp;pousse&nbsp;» la route 192.168.60.0 pour que nos client VPN puissent se connecter au reseau local  
#push «&nbsp;route 192.168.10.0 255.255.255.0&nbsp;»

#On definit le serveur VPN comme passerelle par défaut pour les clients.  
push «&nbsp;redirect-gateway def1&nbsp;»

#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 «&nbsp;dhcp-option DNS 8.8.8.8&nbsp;»  
push «&nbsp;dhcp-option DNS 8.8.4.4&nbsp;»

# 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 \<\<«&nbsp;EOT&nbsp;»  
#!/bin/bash  
#script pour creer automatiquement des certificats et des clefs pour les clients OpenVPN

#Initialisation des variables  
echo «&nbsp;Nom du certificat: (ex: client ou admin)&nbsp;»  
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 «&nbsp;client  
dev tun  
EOT  
echo proto $proto\_use \>\> autovpn\_ZIP.sh  
echo remote $ip\_ext $port\_use \>\> autovpn\_ZIP.sh  
cat \>\> autovpn\_ZIP.sh \<\<«&nbsp;EED&nbsp;»  
ca ca.crt  
cert $cn.crt  
key $cn.key&nbsp;» \> $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 «&nbsp;Adresse E-mail a qui envoyer les certificats&nbsp;»  
read mail  
echo «&nbsp;Configuration d’OpenVPN pour votre serveur&nbsp;» | mutt -x -s «&nbsp;Zip d’OpenVPN&nbsp;» $mail -a $cn.zip

exit 0  
EED

#CREATION DE LA VERSION NO ZIP

cat \> autovpn\_NO\_ZIP.sh \<\<«&nbsp;EOX&nbsp;»  
#!/bin/bash  
#script pour creer automatiquement des certificats et des clefs pour les clients OpenVPN

#Initialisation des variables  
echo «&nbsp;Nom du certificat: (ex: client ou admin)&nbsp;»  
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 «&nbsp;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 \<\<«&nbsp;EEE&nbsp;»  
ca ca.crt  
cert $cn.crt  
key $cn.key&nbsp;» \> $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 «&nbsp;Adresse E-mail a qui envoyer les certificats&nbsp;»  
read mail  
echo «&nbsp;Configuration d’OpenVPN pour votre serveur&nbsp;» | mutt -x -s «&nbsp;Fichier d’OpenVPN version non compréssée&nbsp;» $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 \<\<«&nbsp;EOZ&nbsp;»  
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 ^\[1\]

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 🙂

* * *

1. /quote

---

<div class="post-metadata">

**Author:** ![kitsun](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/k/54ee81/32.png) [@kitsun](https://www.debian-fr.org/u/kitsun)\
**Post date:** [Février 21, 2016, 2:36 UTC](https://www.debian-fr.org/t/pour-les-scripts-cest-ici/3820/313 "2016-02-21T14:36:19Z")

</div>

Merci du retour 🙂  
Je n’avais pas vu ça, faudra que je jette un oeil ça peut faire gagner un peu de temps ![:mrgreen:](https://www.debian-fr.org/uploads/default/original/1X/cc83e9b583138e48ff45f96609046b06d06c7f9d.gif "Mr. Green")

Kit’

---

<div class="post-metadata">

**Author:** ![olivier36](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/o/ecb155/32.png) [@olivier36](https://www.debian-fr.org/u/olivier36)\
**Post date:** [Février 21, 2016, 2:39 UTC](https://www.debian-fr.org/t/pour-les-scripts-cest-ici/3820/314 "2016-02-21T14:39:26Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![thuban](https://www.debian-fr.org/user_avatar/www.debian-fr.org/thuban/32/4177_2.png) [@thuban](https://www.debian-fr.org/u/thuban)\
**Post date:** [Février 21, 2016, 2:39 UTC](https://www.debian-fr.org/t/pour-les-scripts-cest-ici/3820/315 "2016-02-21T14:39:27Z")

</div>

[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! 🙂

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 2:39 UTC](https://www.debian-fr.org/t/pour-les-scripts-cest-ici/3820/316 "2016-02-21T14:39:29Z")

</div>

Pff on est vraiment obligé d’accepter les scripts en python ? ![:12](https://www.debian-fr.org/uploads/default/original/1X/5ab5476dc281287f8b7ad337242a19cb8485624d.gif "grincheux")

😆

---

<div class="post-metadata">

**Author:** ![olivier36](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/o/ecb155/32.png) [@olivier36](https://www.debian-fr.org/u/olivier36)\
**Post date:** [Février 21, 2016, 2:39 UTC](https://www.debian-fr.org/t/pour-les-scripts-cest-ici/3820/317 "2016-02-21T14:39:29Z")

</div>

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 🙂

```auto
#!/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()
```

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 2:39 UTC](https://www.debian-fr.org/t/pour-les-scripts-cest-ici/3820/318 "2016-02-21T14:39:29Z")

</div>

Sympathique 🙂

---

<div class="post-metadata">

**Author:** ![lowterie](https://www.debian-fr.org/user_avatar/www.debian-fr.org/lowterie/32/3012_2.png) [@lowterie](https://www.debian-fr.org/u/lowterie)\
**Post date:** [Février 21, 2016, 2:49 UTC](https://www.debian-fr.org/t/pour-les-scripts-cest-ici/3820/319 "2016-02-21T14:49:47Z")

</div>

pas un script mais un " alias " … 🙂

```auto
function ban() {
    if ["`id -u`" == "0"] ; then
        iptables -A INPUT -s $1 -j DROP
    else
        sudo iptables -A INPUT -s $1 -j DROP
    fi
}
```

---

<div class="post-metadata">

**Author:** ![agentsteel](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/97f17d/32.png) [@agentsteel](https://www.debian-fr.org/u/agentsteel)\
**Post date:** [Février 21, 2016, 4:48 UTC](https://www.debian-fr.org/t/pour-les-scripts-cest-ici/3820/320 "2016-02-21T16:48:59Z")

</div>

Encore un petit script, inspiré par ce sujet : [exploiter-les-logs-d-apache2-t43627.html#p439474](http://www.debian-fr.org/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](https://www.debian-fr.org/uploads/default/original/1X/42cd8bd0447ecac24cdff1e26fa990a5c8442791.gif "petard")

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

```auto
#!/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

```

---

<div class="post-metadata">

**Author:** ![cedric058](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/c/d2c977/32.png) [@cedric058](https://www.debian-fr.org/u/cedric058)\
**Post date:** [Février 21, 2016, 5:37 UTC](https://www.debian-fr.org/t/pour-les-scripts-cest-ici/3820/321 "2016-02-21T17:37:55Z")

</div>

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]

[Page précédente](https://www.debian-fr.org/t/pour-les-scripts-cest-ici/3820.md?page=15)

[Page suivante](https://www.debian-fr.org/t/pour-les-scripts-cest-ici/3820.md?page=17)
