Prima versione correttamente funzionante.

This commit is contained in:
Emiliano Vavassori 2015-07-13 23:32:25 +02:00
parent 5eb621dad3
commit 6ef8960be5
2 changed files with 26 additions and 20 deletions

View File

@ -13,4 +13,4 @@ Digits = 2
[Files] [Files]
Domain = /etc/domain.yml Domain = /etc/domain.yml
MgmtKey = /home/amgmt/.ssh/id_rsa.pub MgmtKey = /home/amgmt/.ssh/id_rsa.pub
VaulPassFile = /root/.ansible/vault.txt VaultPassFile = /home/amgmt/.ansible/vault.txt

View File

@ -1,4 +1,5 @@
#!/usr/bin/env python #!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Helps a client to join domain and maintain itself.""" """Helps a client to join domain and maintain itself."""
__author__ = 'Enrico Bacis' __author__ = 'Enrico Bacis'
@ -68,13 +69,17 @@ class MyApp:
def __normalizemac(self, mac): def __normalizemac(self, mac):
return ':'.join(x.zfill(2) for x in mac.split('_')).lower() return ':'.join(x.zfill(2) for x in mac.split('_')).lower()
def __gethostname(self, mac): def __gethostname(self, mac, base = None, role = None):
# At this point, the mac is set. if base == None:
base = self.__defaultbase
if role == None:
role = self.__defaultrole
with self.__getcursor() as cursor: with self.__getcursor() as cursor:
(newid,) = cursor.execute('SELECT COALESCE(MAX(id) + 1, 1) FROM client').fetchone() (newid,) = cursor.execute('SELECT COALESCE(MAX(id) + 1, 1) FROM client').fetchone()
# Constucts the hostname format # Constucts the hostname format
formatstring = '%s-%0' + self.__namedigits + 'd' formatstring = '%s-%0' + self.__namedigits + 'd'
data = (newid, formatstring % (self.__defaultbase, newid), mac, self.__role) data = (newid, formatstring % (base, newid), mac, role)
# Since MAC is Unique, this fails with the same MAC address # Since MAC is Unique, this fails with the same MAC address
cursor.execute('INSERT OR IGNORE INTO client VALUES (?, ?, ?, ?)', data) cursor.execute('INSERT OR IGNORE INTO client VALUES (?, ?, ?, ?)', data)
(hostname,) = cursor.execute('SELECT hostname FROM client WHERE mac = "%s"' % mac).fetchone() (hostname,) = cursor.execute('SELECT hostname FROM client WHERE mac = "%s"' % mac).fetchone()
@ -93,15 +98,16 @@ class MyApp:
return "Usage: GET /mac2hostname?mac=XX_XX_XX_XX_XX_XX[&base=YYY][&role=ZZZ]" return "Usage: GET /mac2hostname?mac=XX_XX_XX_XX_XX_XX[&base=YYY][&role=ZZZ]"
# Sets up variables for possible parameters # Sets up variables for possible parameters
mac = self.__normalizemac(request.query.mac) mac = self.__normalizemac(request.query.mac)
self.__base = request.query.base or self.__defaultbase base = request.query.base or self.__defaultbase
self.__role = request.query.role or self.__defaultrole role = request.query.role or self.__defaultrole
return self.__gethostname(mac) return self.__gethostname(mac, base, role)
def whatsmyhostname(self): def whatsmyhostname(self):
# No required parameters # No required parameters
ip = request.query.ip or request['REMOTE_ADDR'] ip = request.query.ip or request['REMOTE_ADDR']
self.__role = request.query.role or self.__defaultrole base = request.query.base or self.__defaultbase
return self.__gethostname(self.__getmac(ip)) role = request.query.role or self.__defaultrole
return self.__gethostname(self.__getmac(ip), base, role)
def hosts(self): def hosts(self):
# Default where clause: no where specifications # Default where clause: no where specifications
@ -124,21 +130,21 @@ class MyApp:
return f.read() return f.read()
def vaultpass(self): def vaultpass(self):
with open(self.__vaultpassfile) as f: with open(self.__vaultpassfile, 'r') as f:
ip = request.query.ip or request['REMOTE_ADDR'] ip = request.query.ip or request['REMOTE_ADDR']
hostname = self.__gethostname(self.__getmac(ip)) base = request.query.base or self.__defaultbase
# Chiave role = request.query.role or self.__defaultrole
hostname = self.__gethostname(self.__getmac(ip), base, role)
# Encryption key
key = MD5.new(hostname).digest() key = MD5.new(hostname).digest()
# Segreto da crittare # Secret
secret = f.read().strip() secret = f.read().strip()
# Rendo il segreto lungo un multiplo di 16 byte # Creating a secret that is multiple of 16 in length
i = 16 - (len(secret) % 16) i = 16 - (len(secret) % 16)
lenghty_secret = secret + i * 'x' lengthy_secret = secret + i * 'x'
cipher = AES.new(key, AES.MODE_ECB) cipher = AES.new(key, AES.MODE_ECB)
crypted = cipher.encrypt(lenghty_secret) crypted = cipher.encrypt(lengthy_secret)
# Encode in base64 because of unicode strings
# Devo ritornare un base64 perché la stringa criptata è UTF-8 e non è
# sempre visibile.
return base64.b64encode(crypted) return base64.b64encode(crypted)
def start(self): def start(self):
@ -153,7 +159,7 @@ class MyApp:
# Main body # Main body
if __name__ == '__main__': if __name__ == '__main__':
cfgfile = '/etc/mac2hostname.ini' cfgfile = '/etc/doraemon.ini'
if len(sys.argv) > 1: if len(sys.argv) > 1:
cfgfile = sys.argv[1] cfgfile = sys.argv[1]
app = MyApp(cfgfile) app = MyApp(cfgfile)