|
|
- #!/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()
|