Client FOG pour machines GNU/Linux 
FOG est un système de clonage très bien conçu, l'administration et les tâches de clonage à réaliser sont prises en charge via une interface web sur le serveur FOG.
Les clients windows disposent d'un service qui permet aux machines de rebooter seules si une tâche de clonage les concernant a été ajoutée.
Les clients GNU/Linux ne disposent pas d'un tel service, j'ai donc codé de petits scripts python pour permettre de piloter les clonages à distance sur les machines GNU/Linux et pour loguer les logins/logouts des utilisateurs.

Le script suivant (tuxfogtaskrebootclient.py) permet d'émuler la fonction taskReboot du service FOG de Windows :

#!/usr/bin/python
# -*- coding: utf_8 -*-

"""
FOG GNU/Linux pseudo client service
Reboote la machine locale si une tâche est trouvée sur le serveur FOG et si elle n'est pas utilisée (session graphique tty7)
planifier ce script via la crontab de root toutes les 5 minutes

request exemple : http://serveurfog/fog/service/jobs.php? ... e:74:4d:bd

"""

#### Modules ####
import httplib2
import subprocess
import re

#### Functions ####
def GetMAC(nic='eth0'):
MAC = '([a-fA-F0-9]{2}[:|\-]?){6}'
stdout_lines = subprocess.Popen('/sbin/ifconfig', shell=True, stdout=subprocess.PIPE).communicate()[0].split("\n")
for line in stdout_lines:
if nic in line and 'HWaddr' in line:
MACpos = re.compile(MAC).search(line)
if MACpos:
return line[MACpos.start(): MACpos.end()]

def ComputerUsed():
stdout = subprocess.Popen('/usr/bin/who', shell=True, stdout=subprocess.PIPE).communicate()[0]
if 'tty7' in stdout:
return True
else:
return False

#### Variables ####
mac=GetMAC()
url = "http://serveurfog/fog/service/jobs.php?mac=" + mac
JobCodes={"#!db": 'Database error',"#!im": 'Invalid MAC Format', "#!er": 'Other error', "#!ok": 'Job Exists -> GO!',"#!nj": 'No Job Exists'}

#### Code ####
http = httplib2.Http()
response, content = http.request(url, "GET")
response = dict(response)

print(JobCodes[content])

if content=="#!ok":
if not ComputerUsed():
print('Reboot')
stdout_lines = subprocess.Popen('/sbin/reboot', shell=True, stdout=subprocess.PIPE).communicate()[0]
else:
print('Doing Nothing')



Le script suivant (tuxfogusertrackingclient.py) permet d'émuler la fonctionnalité userTracking du client FOG de Windows :


#!/usr/bin/python
# -*- coding: utf-8 -*-

"""
FOG GNU/Linux pseudo client service
usertracking.report
passer 'LOGIN' ou 'LOGOUT' en argument

Installation :
Pour les LogIns:
# Dans le fichier /etc/X11/gdm/PostLogin/Default
# Log FOG ouverture de session
/usr/bin/tuxfogusertrackingclient.py LOGIN

Pour les LogOuts :
# Dans le fichier : /etc/X11/gdm/PostSession/Default
# Log FOG fermeture de session
/usr/bin/tuxfogusertrackingclient.py LOGOUT
"""

#### Modules ####
import httplib2
import subprocess
import re
import base64
import socket
import os
import sys

#if len(sys.argv) < 2 : exit()

#### Functions ####
def GetMAC(nic='eth0'):
MAC = '([a-fA-F0-9]{2}[:|\-]?){6}'
stdout_lines = subprocess.Popen('/sbin/ifconfig', shell=True, stdout=subprocess.PIPE).communicate()[0].split("\n")
for line in stdout_lines:
if nic in line and 'HWaddr' in line:
MACpos = re.compile(MAC).search(line)
if MACpos:
return line[MACpos.start(): MACpos.end()]

def GetHostName():
return str(socket.gethostbyaddr(socket.gethostname())[0].split('.')[0])

def GetUserName():
#return os.getlogin()
return os.getenv('USER')

#### Variables ####
try:
mac=base64.b64encode(GetMAC())
except:
#print('No MAC Found')
exit()

try:
action=base64.b64encode(sys.argv[1])
except:
#print('Missing Argument Login/Logout')
exit()

try:
user=base64.b64encode(GetHostName()+'\\'+GetUserName())
except:
#print('Either Hostname or Username not defined')
#print('Host:',GetHostName())
#print('User:',GetUserName())
exit()

date=''
url='http://fogserver/fog/service/usertracking.report.php?mac='+mac+'&action='+action+'&user='+user+'&date='


#### Code ####
http = httplib2.Http()
response, content = http.request(url, "GET")
#print(GetMAC(),GetUserName(),GetHostName(),url, sys.argv, response, content)

#if content=="#!ok":
# print('User Tracking OK')
#else:
# print('Error')




Déposer ces scripts dans /usr/bin/ et appliquer un chmod +x dessus

[ Ajouter un commentaire ]   |  [ 0 Trackbacks ]   |  Lien permanent
Ubuntu One VS myOne 
"One" est un service "offert" par Ubuntu :

    "Ubuntu One helps you store, sync and share"


Ubuntu One est très pratique lorsque l'on utilise plusieurs ordinateurs (Bureau Pro, Bureau Perso, Salon, Salle de bain :) ...) pour retrouver ses documents d'un ordinateur à l'autre.
Ubuntu One se charge de synchroniser nos documents sur tous nos ordinateurs.

MAIS, ubuntu One est gratuit seulement dans la limite de 2 GB, ensuite il faut payer un abonnement.
MAIS, le fait de déposer des documents perso, voir confidentiels, sur un serveur géré par une entreprise tierce en rebute peut être certains, dont moi.
MAIS, si vous souhaitez accéder à vos documents sur plusieurs ordinateurs de votre réseau domestique, Ubuntu One sera lent car limité par la bande passante de votre accès internet.

Bref, le service rendu par Ubuntu One m'intéresse mais je voudrais gérer mon propre serveur "One", d'où "myOne".

Je vous propose de mettre en oeuvre "myOne", un "Ubuntu One Like" mais rien que pour vous, ce sera certes un peu moins user friendly mais nous aurons la maitrise totale du dispositif. Dans la suite de ce tutoriel remplacez "fred" par votre nom d'utilisateur et "centralisateur" par l'ip ou le fqdn de votre serveur.

Comment ca marche :

Nous aurons besoin d'un serveur ssh (Debian ou Ubuntu par exemple), qui jouera le rôle de "centralisateur", toutes vos autres machines se réfèreront à ce centralisateur pour synchroniser leurs fichiers. Ce centralisateur peut être un serveur dédié chez un hébergeur ou un serveur chez vous visible sur le web via une redirection de port sur votre "xxxxBox".

Sur le centralisateur je créer un dossier "myOne" (n'importe quel nom convient) :

# mkdir /home/fred/myOne


Sur chacun de mes autres ordinateurs, je créer aussi un dossier "myOne" (pas forcément au même endroit, peu importe) :

# mkdir /home/fred/Bureau/myOne



Ce seront les deux dossiers qui seront synchronisés, je ne synchronise pas mon home entier : "/home/fred" car cela synchroniserait inutilement tout un tas de documents. Le fait de ne synchroniser qu'un sous dossier permet de choisir ce que l'on souhaite effectivement synchroniser, il suffira de copier dans myOne les documents que vous souhaitez retrouver sur vos autres machines.

La synchronisation sera toujours initiée du côté client, en effet le centralisateur est sencé toujours être allumé et joignable, ce n'est pas forcément le cas des ordinateurs clients.

Nous utiliserons l'excellent programme "unison" pour synchroniser nos dossiers.

Installation d'unison :
# sudo apt-get install unison


Utilisation d'unison, sur un ordinateur client :
# unison /home/fred/Bureau/myOne ssh://fred@centralisateur:port//home/fred/myOne


La première synchronisation sera plus longue car il faut qu'unison copie tous les documents déposés dans le dossier myOne de votre ordinateur sur votre centralisateur. Les synchronisations ultérieures iront beaucoup plus vite car seules les documents modifiés/ajoutés/supprimés seront synchronisés.

On pourrait se contenter de cela et synchroniser à la main nos dossiers quand on le jugerait nécessaire mais ce ne serait tout de même pas très pratique, et selon la loi de Murphy, on oublierait nécessairement de synchroniser lorsque cela aurait vraiment été utile.

Faisons donc en sorte que nos dossiers se synchronisent automatiquement.

Plusieurs "problèmes" à régler pour rendre l'automatisation possible :

- Ne plus avoir à taper de mot de passe SSH tout en conservant la sécurité d'accès :
Sur notre poste client :
On génère un couple de clef publique/privée sans passphrase :
# ssh-keygen


On copie la clef publique générée : id_rsa.pub, vers notre centralisateur
# scp .ssh/id_rsa.pub fred@centralisateur:/home/fred/.ssh/


On ajoute le contenu de id_rsa.pub dans l'authorized_keys du centralisateur pour qu'il puisse authentifier notre poste client :
# ssh fred@centralisateur "cat /home/fred/.ssh/id_rsa.pub >> /home/fred/.ssh/authorized_keys"



- Ne plus avoir à répondre aux questions et confirmations d'unison :
L'argument de commande "-batch" provoque le mutisme d'unison, il ne posera plus de question.

- Planifier l'exécution automatique périodique d'unison sans provoquer le chargements d'instances simultanées :
Lancer unison par cron risquerait de provoquer le chargement parallèle de plusieurs instances en cas de synchronisation longue, si on ne prenait pas de précaution particulière. Avec un petit script python nous allons vérifier qu'unison ne tourne plus avant de redemander une synchronisation.

#### Start Python Code ####

#!/usr/bin/env python
#-*- coding: utf-8 -*-

from __future__ import with_statement
import time, subprocess

LogFilePath="/home/fred/myOne.log"
cmd_myOne = "/usr/bin/unison /home/fred/Bureau/myOne ssh://fred@centralisateur//home/fred/myOne -batch"
cmd_CheckIfRunning = "ps ax|grep /usr/bin/unison"

def TimeNow(): return time.strftime("%Y/%m/%d %H:%M:%S", time.localtime())

def AppendFile(TheFile,Content):
with open(TheFile,"a") as f:
f.write(Content)

CheckIfRunning = subprocess.Popen(cmd_CheckIfRunning, shell=True, stdout=subprocess.PIPE)

if cmd_myOne not in CheckIfRunning.communicate()[0]:
myOne = subprocess.Popen(cmd_myOne, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output, errors = myOne.communicate()
if "Nothing to do: replicas have not changed since last sync." not in errors:
AppendFile(LogFilePath, "\n" + TimeNow() +' '+ str(myOne.returncode) +' '+ cmd_myOne + "\n" + str(output))
else:
AppendFile(LogFilePath, "\n" + TimeNow() + " Unison Process Already Running")


#### Stop Python Code ####

Enregistrez ce script sous /home/fred/scripts/myOne

Planifiez l'exécution automatique via cron toutes les 5 minutes :

    # crontab -e 
*/5 * * * * /usr/bin/python /home/fred/scripts/myOne


Et voilà, vous n'avez plus qu'à copier coller des documents dans le dossier myOne de vos ordinateurs, et vous les retrouverez sur tous les autres ordinateurs sur lesquels vous avez planifié la synchronisation.

Astuces :
Lancez la première synchronisation à la main pour voir les éventuels messages d'erreur.
Le fichier /home/fred/myOne.log (Variable LogFilePath) enregistre tous les transferts de fichiers.
Evitez de créer des conflits unison : Ne pas éditer en même temps deux fichiers portant le même nom sur deux clients, ils ne seront pas synchronisés en mode automatique (-batch).
Pour régler les conflits et choisir quelle version synchroniser, lancer unison à la main sans "-batch".


[ 8 Commentaires ] ( ( 70 vues ) )   |  [ 0 Trackbacks ]   |  Lien permanent  |  Lien relatif
Installer une imprimante virtuelle pour créer des PDF sous Ubuntu : cups-pdf 
Testé et approuvé sous Jaunty


sudo apt-get install cups-pdf
sudo chmod +s /usr/lib/cups/backend/cups-pdf
cd
mkdir PDF


Et voilà, il n'y a plus qu'à virtuellement imprimer pour générer des PDF


[ Ajouter un commentaire ]   |  [ 0 Trackbacks ]   |  Lien permanent
wolframalpha.com, un moteur de recherche qui comprend vos questions (ou presque) 
Par pure sérendipité je suis tombé sur wolframalpha.com, ce moteur de recherche, cherche à comprendre le sens de votre question avant d'y répondre, il a par exemple répondu très précisément à mes questions :

what is the weight of one cubic meter of air
what is the weight of one cubic meter of helium
what is the weight of one cubic meter of hydrogen
how to convert watts in horse power
what is the distance between the earth and the moon
what is the answer to life, the universe and everything

et beaucoup moins précisément à d'autres questions plus complexes mais
ca promet, quand google aura racheté la technologie ca ira loin

[ Ajouter un commentaire ] ( ( 10 vues ) )   |  [ 0 Trackbacks ]   |  Lien permanent
Monter un partage CIFS sur un Client GNU/Linux 
Pour monter un partage CIFS d'un serveur Windows/Samba sur un client debian/Ubuntu GNU/Linux on utilise la commande mount.cifs du paquet smbfs :

# sudo apt-get install smbfs

Pour pouvoir monter/démonter des partages CIFS sans être root on peut donner aux commandes correspondantes les droits de leur propriétaire :

# sudo chmod 4755 /sbin/mount.cifs
# sudo chmod 4755 /sbin/umount.cifs

On peut maintenant monter le partage truc du serveur machin avec l'identifiant bidule du domaine domaine ayant pour mot de passe chose sur le point de montage ici avec la commande :

# mount.cifs //machin/truc ./ici -o user=domaine/bidule,password=chose,uid=utilisateurlocal,gid=utilisateurlocal,iocharset=utf8,nobrl

et démonter ce partage avec :

# umount.cifs ./ici


Si cela est trop demandé à un utilisateur lambda qu'il ne faut pas effrayer avec des commandes à rallonge, vous pouvez utiliser mon petit script python Connect2Share.py.


L'ojectif de ce programme est de proposer à l'utilisateur une interface graphique (GTK), permettant de saisir son identifiant et mot de passe afin de lui connecter son partage. (En partant du principe que le nom de son partage correspond à son identifiant)
Vous pouvez adapter le code et les paramètres de la commande mount.cifs à vos besoins car ...

c'est libre (et gratuit) ...


ps : Une doc vraiment très bien faite, et très instructive, sur les montages CIFS : http://www.swerdna.net.au/linhowtosambacifs.html , cela permet de bien comprendre les histoires de droits locaux/distants, pourquoi openoffice fonctionne différemment etc ...






[ Ajouter un commentaire ] ( ( 10 vues ) )   |  [ 0 Trackbacks ]   |  Lien permanent

| 1 | 2 | 3 | 4 | 5 | 6 | 7 | Suivant> >>