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.
 
 

185 lines
5.9 KiB

#! /usr/bin/python3
# coding=utf-8
import MySQLdb
import json
from SetupMinersClass import SetupMiner
q1c = "SELECT REPLACE(hw_addr, ':','') as hw_addr, " \
"serial, " \
"net_num " \
"FROM 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.{}.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';"
class ConfigClass:
def __init__(self):
self.conffile = 'config.json'
self.sshsfile = 'commands/sshs.json'
self.telnetsfile = 'commands/telnets.json'
self.config = list
self.minerconf = dict
self.dbconf = dict
self.sshs = list
self.telnets = list
def read_json(self, file):
with open(file) as f:
conf = json.load(f)
return conf
def readall(self):
conf = self.read_json(self.conffile)
self.sshs = self.read_json(self.sshsfile)
self.telnets = read_conf(self.telnetsfile)
self.minerconf = {"sshuser": conf["sshuser"],
"sshpass": conf["sshpass"],
"sshport": conf["sshport"],
"telnetuser": conf["telnetuser"],
"telnetpass": conf["telnetpass"],
"telnetport": conf["telnetport"]}
self.dbconf = {"dbhost": conf['dbhost'],
"dbuser": conf['dbuser'],
"dbpass": conf['dbpass'],
"dbbase": conf['dbbase']}
def read_table(sql, dbhost, dbuser, dbpass, dbbase):
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, octet1, octet2, octet3):
locked_ip = []
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(octet3):
locked_ip.append(octets[3])
i = int(ip_pool[0])
while i < int(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, dbhost, dbuser, dbpass, dbbase):
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 read_conf(file):
with open(file) as f:
conf = json.load(f)
return conf
def main():
conf = read_conf('config.json')
sshs = read_conf('commands/sshs.json')
telnets = read_conf('commands/telnets.json')
minerconf = {"sshuser": conf["sshuser"],
"sshpass": conf["sshpass"],
"sshport": conf["sshport"],
"telnetuser": conf["telnetuser"],
"telnetpass": conf["telnetpass"],
"telnetport": conf["telnetport"]}
dbconf = [conf['dbhost'], conf['dbuser'], conf['dbpass'], conf['dbbase']]
data_1c = read_table(q1c, *dbconf)
data_leases = read_table(qleases4.format(conf['ip_oct2']), *dbconf)
for line in data_1c:
set_ip = first_free_ip(read_table(qhosts_ip, *dbconf),
conf['ippool'], conf['ip_oct1'], conf['ip_oct2'], line['net_num'])
set_hw_addr = line['hw_addr']
set_host = line['serial']
make_hosts(qinsert_hosts, set_ip, set_host, set_hw_addr,
*dbconf)
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']:
print('rebooting %s' % lease['ip4'])
SetupMiner(lease['ip4'], minerconf, telnets=telnets, sshs=sshs)
if __name__ == '__main__':
main()

Powered by TurnKey Linux.