[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
|
#: Fichier de mapping lun/nom de volume iscsi
|
||||||
ISCSI_MAP_FILE = "/usr/scripts/var/iscsi_names.py"
|
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
|
#: Algorithmes de hashage pour le champ SSHFP
|
||||||
# format : { algorithm : (IANA_id, ssh_algo) }
|
# format : { algorithm : (IANA_id, ssh_algo) }
|
||||||
|
|
|
@ -13,10 +13,10 @@ stockage'''
|
||||||
import nolslib, re, sys
|
import nolslib, re, sys
|
||||||
|
|
||||||
sys.path.append("/usr/scripts/gestion")
|
sys.path.append("/usr/scripts/gestion")
|
||||||
from config import ISCSI_MAP_FILE_TEMPLATE
|
from config import ISCSI_MAP_FILE
|
||||||
import affich_tools
|
import affich_tools
|
||||||
|
|
||||||
map_file = ISCSI_MAP_FILE_TEMPLATE % "nols"
|
map_file = ISCSI_MAP_FILE
|
||||||
|
|
||||||
print u"Connexion a la baie de stockage..."
|
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
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
if [[ $1 = "" ]]; then
|
|
||||||
BAIE="nols"
|
|
||||||
else
|
|
||||||
BAIE="$1"
|
|
||||||
fi
|
|
||||||
|
|
||||||
exec_cmd "Récupération du mapping lun<->nom de volume" \
|
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" \
|
exec_cmd "Rechargement des règles de udev" \
|
||||||
invoke-rc.d udev reload
|
invoke-rc.d udev reload
|
||||||
|
@ -43,4 +37,4 @@ exec_cmd "Rescan des volumes iscsi" \
|
||||||
iscsiadm -m session --rescan
|
iscsiadm -m session --rescan
|
||||||
|
|
||||||
exec_cmd "Mises à jours des liens symboliques dans /dev" \
|
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