MonSeeerveur

MonSeeerveur

Un article de Tifauve|NET.

Sommaire

Socle technique

Préparation administration facile

Modifier .bashrc

-alias ll
-couleur prompt (34)

Modifier bannière (http://www.network-science.de/ascii/)

sudo nano /etc/motd.tail
 
_ _ _
___ | |__ __ _ _ __ ___ _ __ | | __ _ (_) _ __
/ __|| '_ \ / _` || '_ ` _ \ | '_ \ | | / _` || || '_ \
| (__ | | | || (_| || | | | | || |_) || || (_| || || | | |
\___||_| |_| \__,_||_| |_| |_|| .__/ |_| \__,_||_||_| |_|
|_|

Ajouter clé ssh

ssh-copy-id -i id_rsa.pub user@ip

Sécurité

Être prévenu à chaque connexion ssh

sudo apt-get install sendemail

Puis rajouter dans /etc/ssh/sshrc

DATE=`date "+%d.%m.%Y à %Hh%Mm"`
IP=`echo $SSH_CONNECTION | awk '{print $1}'`
REVERSE=`dig -x $IP +short`
 
echo "Connexion de $USER sur Champlain
 
IP: $IP
ReverseDNS: $REVERSE
Date: $DATE
 
"
| sendEmail -s smtp.xx.xx -t destinataire@xx.xx -q -u "Connexion de $USER le $DATE" -f admin@tifauve.net &

Gestion d'urgence de l'énergie

dans /etc/acpi/events créer un fichier ac_dc contenant:

event=ac_adapter.*
action=/home/tifauve/scripts/acpi/battery/ac_dc.py %e

Code python pour lancer les procédures

#!/usr/bin/python
# -*- coding: utf-8 -*-
 
#
# Gère l'état de la batterie
#
 
__author__ = 'Julien Raigneau'
VERSION = "0.4"
 
import sys,os,logging
from time import strftime,sleep
from subprocess import Popen
 
lock_file = os.path.join(sys.path[0], "battery.lock")
fork_path = os.path.join(sys.path[0], "ac_dc.py")
 
def read_capacity():
#récupere stats battery
infos_batterie= open("/proc/acpi/battery/BAT0/state","r").readlines()
capacite = int(infos_batterie[4].replace("remaining capacity:","").replace("\n","").replace(" ","").replace("mAh",""))
voltage = int(infos_batterie[5].replace("present voltage:","").replace("\n","").replace(" ","").replace("mV",""))
logging.info("read_capacity: %s,%s" % (capacite,voltage))
return capacite,voltage
 
def send_mail(sujet,corps):
#envoi un mail
msg = "sendEmail -s smtp.cegetel.net -t julien@raigneau.net -q -u \"%s\" -m \"%s\" -f admin@tifauve.net" % (sujet,corps)
p = Popen(msg, shell=True)
logging.info("send_mail: Mail envoyé avec sujet=(%s)" % sujet)
 
def on_battery(capacite):
#actions si sur battery
while(os.path.isfile(lock_file)):
capacite_encours,voltage = read_capacity()
if capacite_encours <= capacite/2:
logging.info("on_battery: Capacité actuelle %s inférieur à la référence %s" % (capacite_encours,capacite))
sujet = "[admin@champlain]Alerte critique: Extinction du serveur en cours"
corps = "Toujours pas de rétablissement du courant le %s.\n/!\Extinction du serveur.\n\nCapacité restante: %s mAh\nVoltage: %s mV" % (strftime("%d/%m/%Y à %H:%M:%S"),capacite_encours,voltage)
send_mail(sujet,corps)
os.remove(lock_file)
logging.info("on_battery: Extinction du serveur lancée")
p = Popen("shutdown -P now", shell=True)
else:
logging.info("on_battery: Capacité actuelle %s" % capacite_encours)
logging.info("on_battery: En sommeil pendant 2min")
sleep(120)
logging.info("on_battery: plus de fichier de lock: sortie de la procédure")
 
def on_dc():
#actions si sur secteur
logging.info("on_dc: Remise sur secteur")
if os.path.isfile(lock_file):
logging.info("on_dc: suppression du fichier de lock")
os.remove(lock_file)
 
 
if __name__ == '__main__':
 
logFile = os.path.join(sys.path[0],"ac_dc.log")
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(levelname)s %(message)s',
filename=logFile)
 
logging.info('main: == Démarrage des contrôles ac_dc ==')
logging.info("main: Valeur des arguments d'entrée %s" % sys.argv)
ac_dc_valeur = sys.argv[4]
logging.info("main: Valeur de l'argument d'entrée %s" % ac_dc_valeur)
capacite,voltage = read_capacity()
logging.info("main: Etat de la batterie: %s / %s" % (capacite,voltage))
 
if ac_dc_valeur == "00000000":
#si le lock existe déjà c'est qu'on est en mode "forké" sinon il faut forké
if (os.path.isfile(lock_file)):
logging.info("main: le fichier de lock existe déjà => nous sommes dans le fork")
corps = "Le courant a été coupé sur Champlain le %s.\nDébut de la procédure de sauvegarde.\n\nCapacité restante: %s mAh\nVoltage: %s mV" % (strftime("%d/%m/%Y à %H:%M:%S"),capacite,voltage)
sujet = "[admin@champlain]Alerte: perte d'énergie sur CHAMPLAIN"
send_mail(sujet,corps)
on_battery(capacite)
else:
logging.info("main: Création du fichier de lock")
file = open(lock_file,"w")
file.write("%s" % capacite)
file.close()
logging.info("main: Fork du process pour rendre la main au démon ACPI")
pid = Popen([fork_path, "00000000", "00000000" ,"00000000", "00000000"]).pid
logging.info("main: Fork effectué dans %s - sortie" % pid)
 
else:
corps = "Le courant a été rétabli sur Champlain le %s.\nFin de la procédure de sauvegarde.\n\nCapacité restante: %s mAh\nVoltage: %s mV" % (strftime("%d/%m/%Y à %H:%M:%S"),capacite,voltage)
sujet = "[admin@champlain]Fin d'alerte: retour de l'énergie sur CHAMPLAIN"
send_mail(sujet,corps)
on_dc()

Script simplissime de monitoring

script lancé et affiché à chaque connexion

home_dd=`df -h | grep "/dev/sdb5" | awk '{ print $5}'`
system_dd=`df -h | grep "/dev/sdb1" | awk '{ print $5}'`
temp=`cat /proc/acpi/thermal_zone/TZ00/temperature |awk '{ print $2}'`
voltage=`cat /proc/acpi/battery/BAT0/state | grep voltage | awk '{ print $3}'`
load=`uptime |awk -F'average:' '{ print $2}'`
uptime=`uptime | cut -d, -f1`
process=`ps axue | grep -vE "^USER|grep|ps" | wc -l`
free_ram=`free -mto | grep Mem: | awk '{ print $4 " MB" }'`
free_swap=`free -mto | grep Swap: | awk '{ print $4 " MB" }'`
 
gsD="\033[1m"
gsF="\033[0m"
blue="\E[34;47m"
red="\E[1;31m"
blueF="\E[0;39m"
 
 
echo ""
echo -e "$gsD""$red""\t** HealthCheck **""$blueF""$gsF"
echo -e "$gsD""Disque""$gsF"
echo -e "Taux occupation de /: ""$blue""$system_dd""$blueF"
echo -e "Taux occupation de /home: ""$blue""$home_dd""$blueF"
echo -e "$gsD""Statut""$gsF"
echo -e "Temperature: ""$blue""$temp""$blueF""°C"
echo -e "Voltage: ""$blue""$voltage""$blueF""mV"
echo -e "Uptime: ""$blue""$uptime""$blueF"
echo -e "$gsD""Ressources""$gsF"
echo -e "Charge sur 1,5,15min: ""$blue""$load""$blueF"
echo -e "Nb de processus: ""$blue""$process""$blueF"
echo -e "Ram libre: ""$blue""$free_ram""$blueF"" // Swap libre: ""$blue""$free_$
echo "
"

Mise en place de NFS

Doc complète sur http://doc.ubuntu-fr.org/nfs Sur le serveur

sudo apt-get install nfs-kernel-server

puis paramétrage de /etc/exports

/home/tifauve einstein(rw,sync,subtree_check)

Sur le client

sudo apt-get install nfs-common
sudo mkdir /media/champlain

puis dans /etc/fstab

champlain:/home/tifauve /media/champlain nfs rw,soft,timeo=20 0 0

Installation noyau eeepc optimisé

Noyau spécial eeepc (de http://array.org/ubuntu/setup-jaunty.html)

wget http://www.array.org/ubuntu/array-jaunty.list
sudo mv -v array-jaunty.list /etc/apt/sources.list.d/
wget http://www.array.org/ubuntu/array-apt-key.asc
sudo apt-key add array-apt-key.asc
sudo apt-get update
sudo apt-get install linux-netbook-eeepc

Extinction de l'écran

vbetool dpms off

Fonctions multimédia

Mise en place Music Player Demon (MPD)

Tiré de http://doc.ubuntu-fr.org/mpd Installer mpd, Modifier /etc/mpd.conf

music_directory         "/home/walter/musique_de_walter" #dossier
playlist_directory "/home/walter/mpd/playlists" #dossier
db_file "/home/walter/mpd/tag_cache" #fichier
log_file "/home/walter/mpd/mpd.log" #fichier
error_file "/home/walter/mpd/errors.log" #fichier
pid_file "/home/walter/mpd/pid" #fichier
 
user "walter"
 
audio_output {
type "alsa"
name "Sound Card"
options "dev=dmixer"
device "plug:dmix"
}

Installer http://hem.bredband.net/kaw/ncmpc/ pour commander le démon en mode console

Attention: avec mon serveur, nécessité de passer /dev/snd en rw pour tous. NB: plutôt voir du côté https://help.ubuntu.com/community/HdaIntelSoundHowto + ajouter le groupe audio à mon login

Côté client, utilisation de gmpc, avec le petit script pour ouvrir le tunnel ssh

#!/bin/bash
#permet d'ouvrir le tunnel ssh
echo "Lancement tunnel SSH avec le pid:"
ssh -L6600:localhost:6600 -Nf champlain
pid=`ps -ef | grep "ssh -L6600" | grep -v "grep" | cut -f 3 -d " "`
echo $pid
echo "\nLancement application"
gmpc
echo "\nSuppression tunnel"
kill -9 $pid

Pour gérer sans tunnel ssh, il suffit d'avoir any pour le bind_to_adress dans /etc/mpd.conf + penser à mettre un mot de passe.

Dernière modification de cette page le 6 septembre 2009 à 13:31.
Cette page a été consultée 110 fois.