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.

158 lines
4.9 KiB

  1. #! /usr/bin/python3
  2. # coding=utf-8
  3. import time
  4. import paramiko
  5. import MySQLdb
  6. import json
  7. from SetupMinersClass import SetupMiner
  8. q1c = "SELECT REPLACE(hw_addr, ':','') as hw_addr, " \
  9. "serial, " \
  10. "net_num " \
  11. "FROM 1c_import " \
  12. "where imported = 0;"
  13. qleases4 = "SELECT INET_NTOA(address) as ip4, " \
  14. "HEX(hwaddr)as hw_addr, hostname, " \
  15. "expire, " \
  16. "valid_lifetime " \
  17. "FROM lease4 " \
  18. "where INET_NTOA(address) like '10.{}.0%';"
  19. qhosts_ip = "SELECT " \
  20. "INET_NTOA(ipv4_address) AS ipv4_address " \
  21. "FROM dhcp4.hosts;"
  22. qinsert_hosts = "START TRANSACTION; " \
  23. "SET @ipv4_reservation='%s'; " \
  24. "SET @hostname = '%s'; " \
  25. "SET @identifier_type='hw-address'; " \
  26. "SET @identifier_value='%s'; " \
  27. "SET @dhcp4_subnet_id=1024; " \
  28. "INSERT INTO hosts ( dhcp_identifier, " \
  29. " dhcp_identifier_type, " \
  30. " dhcp4_subnet_id, " \
  31. " ipv4_address, " \
  32. " hostname) " \
  33. "VALUES ( " \
  34. "UNHEX(@identifier_value)," \
  35. " (SELECT type FROM host_identifier_type WHERE name=@identifier_type)," \
  36. " @dhcp4_subnet_id," \
  37. " INET_ATON(@ipv4_reservation)," \
  38. " @hostname); " \
  39. "COMMIT;"
  40. qupdate_1c = "update 1c_import set imported = 1 where serial = '%s';"
  41. def read_table(sql, dbhost, dbuser, dbpass, dbbase):
  42. try:
  43. conn = MySQLdb.connect(host=dbhost, user=dbuser,
  44. passwd=dbpass, db=dbbase)
  45. except MySQLdb.Error as err:
  46. print("Connection error: {}".format(err))
  47. conn.close()
  48. try:
  49. cur = conn.cursor(MySQLdb.cursors.DictCursor)
  50. cur.execute(sql)
  51. data = cur.fetchall()
  52. except MySQLdb.Error as err:
  53. print("Query error: {}".format(err))
  54. conn.close()
  55. return data
  56. def first_free_ip(ips, ip_pool, octet1, octet2, octet3):
  57. locked_ip = []
  58. octet4 = ''
  59. set_octets = False
  60. for ip in ips:
  61. octets = ip['ipv4_address'].split('.')
  62. if not set_octets:
  63. octet1 = octets[0]
  64. octet2 = octets[1]
  65. set_octets = True
  66. if octets[2] == str(octet3):
  67. locked_ip.append(octets[3])
  68. i = int(ip_pool[0])
  69. while i < int(ip_pool[1]):
  70. if not str(i) in locked_ip:
  71. octet4 = str(i)
  72. break
  73. i = i + 1
  74. if octet4 == '':
  75. return ''
  76. else:
  77. return "%s.%s.%s.%s" % (octet1, octet2, octet3, octet4)
  78. def make_hosts(sql, ip, hostname, hw_addr, dbhost, dbuser, dbpass, dbbase):
  79. try:
  80. conn = MySQLdb.connect(host=dbhost, user=dbuser,
  81. passwd=dbpass, db=dbbase)
  82. except MySQLdb.Error as err:
  83. print("Connection error: {}".format(err))
  84. conn.close()
  85. try:
  86. cur = conn.cursor(MySQLdb.cursors.DictCursor)
  87. cur.execute(sql % (ip, hostname, hw_addr))
  88. data = cur.fetchall()
  89. cur.close()
  90. except MySQLdb.Error as err:
  91. print("Query error: {}".format(err))
  92. try:
  93. cur = conn.cursor(MySQLdb.cursors.DictCursor)
  94. print(qupdate_1c % hostname)
  95. cur.execute(qupdate_1c % hostname)
  96. data = cur.fetchall()
  97. cur.close()
  98. except MySQLdb.Error as err:
  99. print("Query error: {}".format(err))
  100. conn.commit()
  101. conn.close()
  102. return data
  103. def read_conf(file):
  104. with open(file) as f:
  105. conf = json.load(f)
  106. return conf
  107. def main():
  108. conf = read_conf('config.json')
  109. sshs = read_conf('sshs.json')
  110. telnets = read_conf('telnets.json')
  111. print(sshs)
  112. print(telnets)
  113. telnets = read_conf('telnets.json')
  114. minerconf = {"sshuser": conf["sshuser"],
  115. "sshpass": conf["sshpass"],
  116. "sshport": conf["sshport"],
  117. "telnetuser": conf["telnetuser"],
  118. "telnetpass": conf["telnetpass"],
  119. "telnetport": conf["telnetport"]}
  120. dbconf = [conf['dbhost'], conf['dbuser'], conf['dbpass'], conf['dbbase']]
  121. data_1c = read_table(q1c, *dbconf)
  122. data_leases = read_table(qleases4.format(conf['ip_oct2']), *dbconf)
  123. for line in data_1c:
  124. set_ip = first_free_ip(read_table(qhosts_ip, *dbconf),
  125. conf['ippool'], conf['ip_oct1'], conf['ip_oct2'], line['net_num'])
  126. set_hw_addr = line['hw_addr']
  127. set_host = line['serial']
  128. make_hosts(qinsert_hosts, set_ip, set_host, set_hw_addr,
  129. *dbconf)
  130. print('host built name %s, mac %s, ip %s' % (set_host, set_hw_addr, set_ip))
  131. for line in data_1c:
  132. for lease in data_leases:
  133. if line['hw_addr'] == lease['hw_addr']:
  134. print('rebooting %s' % lease['ip4'])
  135. SetupMiner(lease['ip4'], minerconf, telnets=telnets, sshs=sshs)
  136. if __name__ == '__main__':
  137. main()

Powered by TurnKey Linux.