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.

186 lines
6.9 KiB

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

Powered by TurnKey Linux.