[modules iscsi] On transforme udev-update-symlinks pour gérer "proprement" la redondance
This commit is contained in:
parent
a78a22eed5
commit
d834d23fa2
7 changed files with 140 additions and 100 deletions
|
@ -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) }
|
||||
|
|
|
@ -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..."
|
||||
|
|
@ -1,48 +0,0 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# udev-get-iscsi-name.py
|
||||
# ----------------------
|
||||
# Copyright : (c) 2012, Olivier Iffrig <iffrig@crans.org>
|
||||
# Copyright : (c) 2008, Jeremie Dimino <jeremie@dimino.org>
|
||||
# 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 <nom de périphérique> [<nom de la baie>]" % 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)
|
|
@ -1,41 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
# udev-update-symlinks.sh
|
||||
# -----------------------
|
||||
# Modifié par : Pierre-Elliott Bécue <peb@crans.org> (8 août 2012)
|
||||
# Copyright : (c) 2012, Olivier Iffrig <iffrig@crans.org>
|
||||
# Copyright : (c) 2008, Jeremie Dimino <jeremie@dimino.org>
|
||||
# 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
|
46
gestion/iscsi/udev_get_iscsi_name.py
Executable file
46
gestion/iscsi/udev_get_iscsi_name.py
Executable file
|
@ -0,0 +1,46 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# udev-get-iscsi-name.py
|
||||
# ----------------------
|
||||
# Copyright : (c) 2012, Olivier Iffrig <iffrig@crans.org>
|
||||
# Copyright : (c) 2008, Jeremie Dimino <jeremie@dimino.org>
|
||||
# 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 <nom de périphérique>" % sys.argv[0]
|
||||
sys.exit(2)
|
||||
a = getname(sys.argv[1])
|
||||
print a
|
90
gestion/iscsi/udev_update_symlinks.py
Normal file
90
gestion/iscsi/udev_update_symlinks.py
Normal file
|
@ -0,0 +1,90 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# Auteur : Pierre-Elliott Bécue <becue@crans.org>
|
||||
# Inspiré du travail de Jérémie Dimino <jeremie@dimino.org>
|
||||
# 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")
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue