#!/usr/bin/python3 # coding=utf-8 # import os # import subprocess # import sys import time import paramiko import MySQLdb sshuser = 'root' sshpass = 'admin' dbhost = '10.5.1.248' dbuser = 'kea' dbpass = 'kea1234' dbbase = 'dhcp4' ippool = [10, 210] q1c = "SELECT REPLACE(hw_addr, ':','') as hw_addr, " \ "serial, " \ "net_num " \ "FROM dhcp4.1c_import " \ "where imported = 0;" qleases4 = "SELECT INET_NTOA(address) as ip4, " \ "HEX(hwaddr)as hw_addr, hostname, " \ "expire, " \ "valid_lifetime " \ "FROM lease4 " \ "where INET_NTOA(address) like '10.6.0%';" qhosts_ip = "SELECT " \ "INET_NTOA(ipv4_address) AS ipv4_address " \ "FROM dhcp4.hosts;" qinsert_hosts = "START TRANSACTION; " \ "SET @ipv4_reservation='%s'; " \ "SET @hostname = '%s'; " \ "SET @identifier_type='hw-address'; " \ "SET @identifier_value='%s'; " \ "SET @dhcp4_subnet_id=1024; " \ "INSERT INTO hosts ( dhcp_identifier, " \ " dhcp_identifier_type, " \ " dhcp4_subnet_id, " \ " ipv4_address, " \ " hostname) " \ "VALUES ( " \ "UNHEX(@identifier_value)," \ " (SELECT type FROM host_identifier_type WHERE name=@identifier_type)," \ " @dhcp4_subnet_id," \ " INET_ATON(@ipv4_reservation)," \ " @hostname); " \ "COMMIT;" qupdate_1c = "update 1c_import set imported = 1 where serial = '%s';" def send_data(user, password, name, host): errorcode = '' work = True commands = [] # commands.append("hostname %s" % name) # commands.append("echo '%s' > /etc/hostname" % name) # commands.append("echo 'hostname=%s' > /etc/network.conf.factory" % name) # commands.append("echo 'dhcp=true' >> /etc/network.conf.factory") # commands.append("echo 'hostname=%s' > /config/network.conf" % name) # commands.append("echo 'dhcp=true' >> /config/network.conf") # commands.append("sync") commands.append("reboot") print(commands) client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # если нет хоста - добавляем try: client.connect(hostname=host, username=user, password=password, look_for_keys=False, allow_agent=False) # пытаемся подключиться, look_for_keys=False, allow_agent=False - зачем-то # нужны циске. except Exception as exept: # в случае исключения - errorcode = exept # возвращаем код и описание исключения else: # усли все в порядке conn = client.invoke_shell() # врубаем интерактивный шелл - с цисками только так. time.sleep(1) # задержка conn.recv(1000) # хаваем все, что выплюнула, дабы не отсвечивало (ограничиваю 1000 строк) conn.send("head -n 1 /config/network.conf\n") time.sleep(1) h = conn.recv(100) if "hostname=" + name in h: work = False work = True # ЗАГЛУШКА!!! В данном случае условия не проверяются. if work: print(name, host, "will reboot") for command in commands: # Читаем и исполняем команды conn.send(command + '\n') # засылаем команду time.sleep(0.1) # ждем указанный таймаут conn.recv(99999999999) # хаваем его в никуда else: print("nothing to do") finally: # по окончании всех процедур client.close() # закрываем коннектий return errorcode # Вертаем все, что наковыряли def read_table(sql): try: conn = MySQLdb.connect(host=dbhost, user=dbuser, passwd=dbpass, db=dbbase) except MySQLdb.Error as err: print("Connection error: {}".format(err)) conn.close() try: cur = conn.cursor(MySQLdb.cursors.DictCursor) cur.execute(sql) data = cur.fetchall() except MySQLdb.Error as err: print("Query error: {}".format(err)) conn.close() return data def first_free_ip(ips, ip_pool, net_num): locked_ip = [] octet1 = '' octet2 = '' octet3 = net_num octet4 = '' set_octets = False for ip in ips: octets = ip['ipv4_address'].split('.') if not set_octets: octet1 = octets[0] octet2 = octets[1] set_octets = True if octets[2] == str(net_num): locked_ip.append(octets[3]) i = ip_pool[0] while i < ip_pool[1]: if not str(i) in locked_ip: octet4 = str(i) break i = i + 1 if octet4 == '': return '' else: return "%s.%s.%s.%s" % (octet1, octet2, octet3, octet4) def make_hosts(sql, ip, hostname, hw_addr): try: conn = MySQLdb.connect(host=dbhost, user=dbuser, passwd=dbpass, db=dbbase) except MySQLdb.Error as err: print("Connection error: {}".format(err)) conn.close() try: cur = conn.cursor(MySQLdb.cursors.DictCursor) cur.execute(sql % (ip, hostname, hw_addr)) data = cur.fetchall() cur.close() except MySQLdb.Error as err: print("Query error: {}".format(err)) try: cur = conn.cursor(MySQLdb.cursors.DictCursor) print(qupdate_1c % hostname) cur.execute(qupdate_1c % hostname) data = cur.fetchall() cur.close() except MySQLdb.Error as err: print("Query error: {}".format(err)) conn.commit() conn.close() return data def main(): data_1c = read_table(q1c) data_leases = read_table(qleases4) for line in data_1c: set_ip = first_free_ip(read_table(qhosts_ip), ippool, line['net_num']) set_hw_addr = line['hw_addr'] set_host = line['serial'] make_hosts(qinsert_hosts, set_ip, set_host, set_hw_addr) print('host built name %s, mac %s, ip %s' % (set_host, set_hw_addr, set_ip)) for line in data_1c: for lease in data_leases: if line['hw_addr'] == lease['hw_addr']: send_data(sshuser, sshpass, line['serial'], lease['ip4']) if __name__ == '__main__': main()