From d834d23fa2508988431ab9e450c776903bfb01da Mon Sep 17 00:00:00 2001 From: Pierre-Elliott Becue Date: Wed, 24 Apr 2013 11:53:07 +0200 Subject: [PATCH] =?UTF-8?q?[modules=20iscsi]=20On=20transforme=20udev-upda?= =?UTF-8?q?te-symlinks=20pour=20g=C3=A9rer=20"proprement"=20la=20redondanc?= =?UTF-8?q?e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gestion/config/config.py | 1 - ...-mapping.py => nols_get_volume_mapping.py} | 4 +- gestion/iscsi/udev-get-iscsi-name.py | 48 ---------- gestion/iscsi/udev-update-symlinks.sh | 41 --------- gestion/iscsi/udev_get_iscsi_name.py | 46 ++++++++++ gestion/iscsi/udev_update_symlinks.py | 90 +++++++++++++++++++ gestion/iscsi/update.sh | 10 +-- 7 files changed, 140 insertions(+), 100 deletions(-) rename gestion/iscsi/{nols-get-volume-mapping.py => nols_get_volume_mapping.py} (93%) delete mode 100755 gestion/iscsi/udev-get-iscsi-name.py delete mode 100755 gestion/iscsi/udev-update-symlinks.sh create mode 100755 gestion/iscsi/udev_get_iscsi_name.py create mode 100644 gestion/iscsi/udev_update_symlinks.py diff --git a/gestion/config/config.py b/gestion/config/config.py index d8fff273..4f471163 100644 --- a/gestion/config/config.py +++ b/gestion/config/config.py @@ -106,7 +106,6 @@ bcfg2_main = "bcfg2.adm.crans.org" #: Fichier de mapping lun/nom de volume iscsi ISCSI_MAP_FILE = "/usr/scripts/var/iscsi_names.py" -ISCSI_MAP_FILE_TEMPLATE = "/usr/scripts/var/iscsi_names_%s.py" #: Algorithmes de hashage pour le champ SSHFP # format : { algorithm : (IANA_id, ssh_algo) } diff --git a/gestion/iscsi/nols-get-volume-mapping.py b/gestion/iscsi/nols_get_volume_mapping.py similarity index 93% rename from gestion/iscsi/nols-get-volume-mapping.py rename to gestion/iscsi/nols_get_volume_mapping.py index 1be52964..82ef9a01 100644 --- a/gestion/iscsi/nols-get-volume-mapping.py +++ b/gestion/iscsi/nols_get_volume_mapping.py @@ -13,10 +13,10 @@ stockage''' import nolslib, re, sys sys.path.append("/usr/scripts/gestion") -from config import ISCSI_MAP_FILE_TEMPLATE +from config import ISCSI_MAP_FILE import affich_tools -map_file = ISCSI_MAP_FILE_TEMPLATE % "nols" +map_file = ISCSI_MAP_FILE print u"Connexion a la baie de stockage..." diff --git a/gestion/iscsi/udev-get-iscsi-name.py b/gestion/iscsi/udev-get-iscsi-name.py deleted file mode 100755 index 7cd994b2..00000000 --- a/gestion/iscsi/udev-get-iscsi-name.py +++ /dev/null @@ -1,48 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -# udev-get-iscsi-name.py -# ---------------------- -# Copyright : (c) 2012, Olivier Iffrig -# Copyright : (c) 2008, Jeremie Dimino -# Licence : BSD3 - -u'''Script appelé par udev (/etc/udev/rules.d/10_crans_iscsi.rules) -pour les liens symboliques pour les périphériques iscsi''' - -import sys, os - -sys.path.append("/usr/scripts/gestion") -from config import ISCSI_MAP_FILE_TEMPLATE - -if len(sys.argv) < 2 or len(sys.argv) > 3: - print >>sys.stderr, u"usage: %s []" % sys.argv[0] - sys.exit(2) - -baie = None -if len(sys.argv) == 2: - baie = "nols" -else: - baie = sys.argv[2] - -map_file = ISCSI_MAP_FILE_TEMPLATE % baie - -# Rechreche le nom complet du périphérique dans /sys -dev = os.readlink("/sys/block/%s/device" % sys.argv[1]) - -# L'identifiant est de la forme "../../../0:0:0:42", où 42 (j'ai perdu) -# est le lun. -try: - lun = int(dev.rsplit(":", 1)[1]) -except: - print >>sys.stderr, u"périphérique invalide" - sys.exit(1) - -if not os.access(map_file, os.R_OK): - print >>sys.stderr, u"Impossible de lire le fichier de mapping(%s)" % map_file - sys.exit(1) - -map = {} -execfile(map_file) - -print map.get(lun, "lun%d" % lun) diff --git a/gestion/iscsi/udev-update-symlinks.sh b/gestion/iscsi/udev-update-symlinks.sh deleted file mode 100755 index d8c315ae..00000000 --- a/gestion/iscsi/udev-update-symlinks.sh +++ /dev/null @@ -1,41 +0,0 @@ -#!/bin/bash - -# udev-update-symlinks.sh -# ----------------------- -# Modifié par : Pierre-Elliott Bécue (8 août 2012) -# Copyright : (c) 2012, Olivier Iffrig -# Copyright : (c) 2008, Jeremie Dimino -# Licence : BSD3 - - -# Ce script met à jour les liens symboliques dans /dev - -if [[ $1 = "" ]]; then - BAIE="nols" -else - BAIE="$1" -fi - -# On repère les disques montés depuis la baie dans le dossier -# /dev/disk/by-path/ip-* -cd /dev/disk/by-path/ - -for dev in ip-*; do - - # /dev/disk/by-path/ip-blabla est un lien vers /dev/sdkr - # on utilise readlink pour avoir ce lien. - dev=$(readlink $dev | awk -F "/" '{print $3}') - symlink=iscsi_$(python /usr/scripts/gestion/iscsi/udev-get-iscsi-name.py $dev $BAIE) - - # On linke dans /dev - cd /dev - if [ ! -e $symlink ]; then - echo "création du lien /dev/$symlink -> /dev/$dev" - ln -s $dev $symlink - elif [ -h $symlink -a $(readlink $symlink) != $dev ]; then - echo "mise à jour du lien /dev/$symlink -> /dev/$dev" - rm -f $symlink - ln -s $dev $symlink - fi - cd /dev/disk/by-path/ -done diff --git a/gestion/iscsi/udev_get_iscsi_name.py b/gestion/iscsi/udev_get_iscsi_name.py new file mode 100755 index 00000000..087ca53a --- /dev/null +++ b/gestion/iscsi/udev_get_iscsi_name.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# udev-get-iscsi-name.py +# ---------------------- +# Copyright : (c) 2012, Olivier Iffrig +# Copyright : (c) 2008, Jeremie Dimino +# Licence : BSD3 + +u'''Script appelé par udev (/etc/udev/rules.d/10_crans_iscsi.rules) +pour les liens symboliques pour les périphériques iscsi''' + +import sys +import os +sys.path.append("/usr/scripts/gestion") +from config import ISCSI_MAP_FILE + +def getname(device): + map_file = ISCSI_MAP_FILE + + # Rechreche le nom complet du périphérique dans /sys + dev = os.readlink("/sys/block/%s/device" % device) + + # L'identifiant est de la forme "../../../0:0:0:42", où 42 (j'ai perdu) + # est le lun. + try: + lun = int(dev.rsplit(":", 1)[1]) + except: + print >>sys.stderr, u"périphérique invalide" + sys.exit(1) + + if not os.access(map_file, os.R_OK): + print >>sys.stderr, u"Impossible de lire le fichier de mapping(%s)" % map_file + sys.exit(1) + + globals()['map'] = {} + execfile(map_file, globals()) + + return map.get(lun, "lun%d" % lun) + +if __name__ == '__main__': + if len(sys.argv) != 2: + print >>sys.stderr, u"usage: %s " % sys.argv[0] + sys.exit(2) + a = getname(sys.argv[1]) + print a diff --git a/gestion/iscsi/udev_update_symlinks.py b/gestion/iscsi/udev_update_symlinks.py new file mode 100644 index 00000000..dd375135 --- /dev/null +++ b/gestion/iscsi/udev_update_symlinks.py @@ -0,0 +1,90 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Auteur : Pierre-Elliott Bécue +# Inspiré du travail de Jérémie Dimino +# Licence : BSD3 + +import sys +import os +sys.path.append('/usr/scripts/gestion/iscsi') +sys.path.append('/usr/scripts/gestion') +from affich_tools import coul +import udev_get_iscsi_name as ugin +import subprocess + +PATH = "/dev/disk/by-path/" + +def store_iscsi_volumes(): + """Extrait la liste des volumes + de /dev/disk/by-path/ip-*""" + + links = {} + # os.listdir retourne une liste désordonnée, l'idée est de privilégier + # l'ordre lexicographique pour que l'état du retour soit identifié. + state = subprocess.Popen(['ls', PATH], stdout=subprocess.PIPE) + state = state.stdout.readlines() + for line in state: + line = line.replace('\n', '') + if line.startswith('ip-'): + device = os.readlink(PATH+line) # de la forme ../../sdb42 + device = device.rsplit('/', 1)[1] + symlink = 'iscsi_' + ugin.getname(device) + line = line.rsplit('-', 1)[1] + _ = links.setdefault(line, [symlink, device]) + return links + +def make_link(couple): + """Crée le symlink /dev/iscsi_nom -> /dev/sdb42""" + + os.chdir("/dev/") + sym, dev = couple + diskstatus = subprocess.Popen(['file', '-sb', '/dev/' + dev], stdout=subprocess.PIPE) + diskstatus = diskstatus.stdout.readlines()[0] + if not os.path.islink(sym) and diskstatus != 'empty\n': + sys.stdout.write("Création du lien /dev/" + sym + " -> /dev/" + dev + " … ") + try: + os.symlink(dev, sym) + sys.stdout.write(coul("OK", 'vert')) + res = True + except: + sys.stdout.write(coul("ECHEC", 'rouge')) + res = False + sys.stdout.write('\n') + elif os.path.islink(sym) and diskstatus == 'empty\n': + sys.stdout.write("Destruction du lien /dev/" + sym + " … ") + try: + os.remove(sym) + sys.stdout.write(coul("OK", 'vert')) + res = True + except: + sys.stdout.write(coul("ECHEC", 'rouge')) + res = False + sys.stdout.write('\n') + elif os.path.islink(sym) and os.readlink(sym) != dev: + sys.stdout.write("Mise à jour du lien /dev/" + sym + " -> /dev/" + dev + " … ") + try: + os.remove(sym) + os.symlink(dev, sym) + sys.stdout.write(coul("OK", 'vert')) + res = True + except: + sys.stdout.write(coul("ECHEC", 'rouge')) + res = False + sys.stdout.write('\n') + else: + res = None + return res + +if __name__ == '__main__': + nothing = True + links = store_iscsi_volumes() + for path in links.keys(): + cmd = make_link(links[path]) + if cmd != None: + nothing = False + + if nothing: + sys.stdout.write("Terminé, pas de changement pour les liens.\n") + else: + sys.stdout.write("Terminé.\n") diff --git a/gestion/iscsi/update.sh b/gestion/iscsi/update.sh index 83080132..1a8ebbba 100755 --- a/gestion/iscsi/update.sh +++ b/gestion/iscsi/update.sh @@ -27,14 +27,8 @@ exec_cmd() { fi } -if [[ $1 = "" ]]; then - BAIE="nols" -else - BAIE="$1" -fi - exec_cmd "Récupération du mapping lun<->nom de volume" \ - python /usr/scripts/gestion/iscsi/"$BAIE"-get-volume-mapping.py + python /usr/scripts/gestion/iscsi/nols_get_volume_mapping.py exec_cmd "Rechargement des règles de udev" \ invoke-rc.d udev reload @@ -43,4 +37,4 @@ exec_cmd "Rescan des volumes iscsi" \ iscsiadm -m session --rescan exec_cmd "Mises à jours des liens symboliques dans /dev" \ - bash /usr/scripts/gestion/iscsi/udev-update-symlinks.sh $BAIE + python /usr/scripts/gestion/iscsi/udev_update_symlinks.py