Commit d834d23f authored by Pierre-Elliott Becue's avatar Pierre-Elliott Becue
Browse files

[modules iscsi] On transforme udev-update-symlinks pour gérer "proprement" la redondance

parent a78a22ee
......@@ -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..."
......
#!/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
......@@ -10,39 +10,37 @@
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
import sys
import 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)
from config import ISCSI_MAP_FILE
baie = None
if len(sys.argv) == 2:
baie = "nols"
else:
baie = sys.argv[2]
def getname(device):
map_file = ISCSI_MAP_FILE
map_file = ISCSI_MAP_FILE_TEMPLATE % baie
# Rechreche le nom complet du périphérique dans /sys
dev = os.readlink("/sys/block/%s/device" % device)
# 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)
# 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)
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())
map = {}
execfile(map_file)
return map.get(lun, "lun%d" % lun)
print 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
#!/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
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment