You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

193 lines
6.7 KiB

  1. #! /usr/bin/python3
  2. # coding=utf-8
  3. # import os
  4. # import subprocess
  5. # import sys
  6. import time
  7. import paramiko
  8. import MySQLdb
  9. ip_oct1 = '10'
  10. ip_oct2 = '5'
  11. sshuser = 'root'
  12. sshpass = 'admin'
  13. dbhost = '10.5.1.248'
  14. dbuser = 'kea'
  15. dbpass = 'kea1234'
  16. dbbase = 'dhcp4'
  17. ippool = [10, 210]
  18. q1c = "SELECT REPLACE(hw_addr, ':','') as hw_addr, " \
  19. "serial, " \
  20. "net_num " \
  21. "FROM dhcp4.1c_import " \
  22. "where imported = 0;"
  23. qleases4 = "SELECT INET_NTOA(address) as ip4, " \
  24. "HEX(hwaddr)as hw_addr, hostname, " \
  25. "expire, " \
  26. "valid_lifetime " \
  27. "FROM lease4 " \
  28. "where INET_NTOA(address) like '10.5.0%';"
  29. qhosts_ip = "SELECT " \
  30. "INET_NTOA(ipv4_address) AS ipv4_address " \
  31. "FROM dhcp4.hosts;"
  32. qinsert_hosts = "START TRANSACTION; " \
  33. "SET @ipv4_reservation='%s'; " \
  34. "SET @hostname = '%s'; " \
  35. "SET @identifier_type='hw-address'; " \
  36. "SET @identifier_value='%s'; " \
  37. "SET @dhcp4_subnet_id=1024; " \
  38. "INSERT INTO hosts ( dhcp_identifier, " \
  39. " dhcp_identifier_type, " \
  40. " dhcp4_subnet_id, " \
  41. " ipv4_address, " \
  42. " hostname) " \
  43. "VALUES ( " \
  44. "UNHEX(@identifier_value)," \
  45. " (SELECT type FROM host_identifier_type WHERE name=@identifier_type)," \
  46. " @dhcp4_subnet_id," \
  47. " INET_ATON(@ipv4_reservation)," \
  48. " @hostname); " \
  49. "COMMIT;"
  50. qupdate_1c = "update 1c_import set imported = 1 where serial = '%s';"
  51. def send_data(user, password, name, host):
  52. errorcode = ''
  53. work = True
  54. commands = []
  55. # commands.append("hostname %s" % name)
  56. # commands.append("echo '%s' > /etc/hostname" % name)
  57. # commands.append("echo 'hostname=%s' > /etc/network.conf.factory" % name)
  58. # commands.append("echo 'dhcp=true' >> /etc/network.conf.factory")
  59. # commands.append("echo 'hostname=%s' > /config/network.conf" % name)
  60. # commands.append("echo 'dhcp=true' >> /config/network.conf")
  61. # commands.append("sync")
  62. commands.append("reboot \n")
  63. print(commands)
  64. client = paramiko.SSHClient()
  65. client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # если нет хоста - добавляем
  66. try:
  67. client.connect(hostname=host, username=user, password=password, look_for_keys=False,
  68. allow_agent=False) # пытаемся подключиться, look_for_keys=False, allow_agent=False - зачем-то
  69. # нужны циске.
  70. except Exception as exept: # в случае исключения -
  71. errorcode = exept # возвращаем код и описание исключения
  72. else: # усли все в порядке
  73. conn = client.invoke_shell() # врубаем интерактивный шелл - с цисками только так.
  74. time.sleep(1) # задержка
  75. conn.recv(1000) # хаваем все, что выплюнула, дабы не отсвечивало (ограничиваю 1000 строк)
  76. # conn.send("head -n 1 /config/network.conf\n")
  77. # time.sleep(1)
  78. # h = conn.recv(100)
  79. # if "hostname=" + name in h:
  80. # work = False
  81. work = True # ЗАГЛУШКА!!! В данном случае условия не проверяются.
  82. if work:
  83. print(name, host, "will reboot")
  84. for command in commands: # Читаем и исполняем команды
  85. conn.send(command + '\n') # засылаем команду
  86. time.sleep(0.1) # ждем указанный таймаут
  87. conn.recv(99999999999) # хаваем его в никуда
  88. else:
  89. print("nothing to do")
  90. finally: # по окончании всех процедур
  91. client.close() # закрываем коннектий
  92. return errorcode # Вертаем все, что наковыряли
  93. def read_table(sql):
  94. try:
  95. conn = MySQLdb.connect(host=dbhost, user=dbuser,
  96. passwd=dbpass, db=dbbase)
  97. except MySQLdb.Error as err:
  98. print("Connection error: {}".format(err))
  99. conn.close()
  100. try:
  101. cur = conn.cursor(MySQLdb.cursors.DictCursor)
  102. cur.execute(sql)
  103. data = cur.fetchall()
  104. except MySQLdb.Error as err:
  105. print("Query error: {}".format(err))
  106. conn.close()
  107. return data
  108. def first_free_ip(ips, ip_pool, net_num):
  109. locked_ip = []
  110. octet1 = ip_oct1
  111. octet2 = ip_oct2
  112. octet3 = net_num
  113. octet4 = ''
  114. set_octets = False
  115. for ip in ips:
  116. octets = ip['ipv4_address'].split('.')
  117. if not set_octets:
  118. octet1 = octets[0]
  119. octet2 = octets[1]
  120. set_octets = True
  121. if octets[2] == str(net_num):
  122. locked_ip.append(octets[3])
  123. i = ip_pool[0]
  124. while i < ip_pool[1]:
  125. if not str(i) in locked_ip:
  126. octet4 = str(i)
  127. break
  128. i = i + 1
  129. if octet4 == '':
  130. return ''
  131. else:
  132. return "%s.%s.%s.%s" % (octet1, octet2, octet3, octet4)
  133. def make_hosts(sql, ip, hostname, hw_addr):
  134. try:
  135. conn = MySQLdb.connect(host=dbhost, user=dbuser,
  136. passwd=dbpass, db=dbbase)
  137. except MySQLdb.Error as err:
  138. print("Connection error: {}".format(err))
  139. conn.close()
  140. try:
  141. cur = conn.cursor(MySQLdb.cursors.DictCursor)
  142. cur.execute(sql % (ip, hostname, hw_addr))
  143. data = cur.fetchall()
  144. cur.close()
  145. except MySQLdb.Error as err:
  146. print("Query error: {}".format(err))
  147. try:
  148. cur = conn.cursor(MySQLdb.cursors.DictCursor)
  149. print(qupdate_1c % hostname)
  150. cur.execute(qupdate_1c % hostname)
  151. data = cur.fetchall()
  152. cur.close()
  153. except MySQLdb.Error as err:
  154. print("Query error: {}".format(err))
  155. conn.commit()
  156. conn.close()
  157. return data
  158. def main():
  159. data_1c = read_table(q1c)
  160. data_leases = read_table(qleases4)
  161. for line in data_1c:
  162. set_ip = first_free_ip(read_table(qhosts_ip), ippool, line['net_num'])
  163. set_hw_addr = line['hw_addr']
  164. set_host = line['serial']
  165. make_hosts(qinsert_hosts, set_ip, set_host, set_hw_addr)
  166. print('host built name %s, mac %s, ip %s' % (set_host, set_hw_addr, set_ip))
  167. for line in data_1c:
  168. for lease in data_leases:
  169. if line['hw_addr'] == lease['hw_addr']:
  170. send_data(sshuser, sshpass, line['serial'], lease['ip4'])
  171. if __name__ == '__main__':
  172. main()

Powered by TurnKey Linux.