From 6794db04a229153ceefdfb3d3b99ed6e691d5df6 Mon Sep 17 00:00:00 2001 From: Ken Raffenetti Date: Fri, 13 Oct 2006 16:49:41 +0000 Subject: adding functionality to hostbase command line tools git-svn-id: https://svn.mcs.anl.gov/repos/bcfg/trunk/bcfg2@2432 ce84e21b-d406-0410-9b95-82705330c041 --- tools/batchadd.py | 230 ++++++++++++++++++++++++++---------------------------- 1 file changed, 111 insertions(+), 119 deletions(-) (limited to 'tools/batchadd.py') diff --git a/tools/batchadd.py b/tools/batchadd.py index 728c5780d..77817f9f2 100755 --- a/tools/batchadd.py +++ b/tools/batchadd.py @@ -5,144 +5,136 @@ from datetime import date os.environ['DJANGO_SETTINGS_MODULE'] = 'Hostbase.settings' from Hostbase.hostbase.models import * from Hostbase.settings import DEFAULT_MX, PRIORITY +import Hostbase.regex host_attribs = ['hostname', 'whatami', 'netgroup', 'security_class', 'support', 'csi', 'printq', 'dhcp', 'outbound_smtp', 'primary_user', 'administrator', 'location', 'expiration_date', 'comments'] -def checkformat(values): - filelist = [] - for pair in values: - filelist.append(pair[0]) +def handle_error(field): + if '-f' in sys.argv: + return + print "Error: %s is already defined in hostbase" % field + if '-s' in sys.argv: + sys.exit(1) - lines = len(filelist) +def checkformat(values, indices): + """Ensures file contains all necessary attributes in order """ + filelist = [pair[0] for pair in values] - while True: - if filelist and not filelist[0:14] == host_attribs: +# lines = len(filelist) + + for index in indices: + filelist = filelist[index:] + if filelist[0:14] != host_attribs: # figure out what to do here - return 0 - sys.exit() - elif not filelist: - return 1 + return False else: - filelist = filelist[14:] - while True: - if filelist and filelist[0] == 'mac_addr': - filelist.pop(0) - if filelist and filelist[0] == 'hdwr_type': - filelist.pop(0) - while filelist and filelist[0] == 'ip_addr': - filelist.pop(0) - while filelist and filelist[0] == 'cname': - filelist.pop(0) - - if (filelist and filelist[0] == 'hostname') or not filelist: - break - -# argument handling for batchadd -try: - fd = open(sys.argv[1], 'r') -except (IndexError, IOError): - print "\nUsage: batchadd.py filename\n" - sys.exit() - -lines = fd.readlines() -info = [] -for line in lines: - if not line.lstrip(' ')[0] == '#' and not line == '\n': - info.append(line.split("->")) + # process rest of host attributes + try: + next = filelist[1:].index('hostname') + remaining = filelist[14:next+1] + except: + remaining = filelist[14:] + needfields = ['mac_addr', 'hdwr_type', 'ip_addr'] + if [item for item in needfields if item not in remaining]: + return False + return True + + +if __name__ == '__main__': + + # argument handling for batchadd + try: + fd = open(sys.argv[1], 'r') + except (IndexError, IOError): + print "\nUsage: batchadd.py filename\n" + sys.exit() + + lines = fd.readlines() + # splits and strips lines into (attribute, value) + info = [[item.strip() for item in line.split("->")] for line in lines + if line.lstrip(' ')[0] != '#' and line != '\n'] + + if info[0][0] == 'mx' and info[1][0] == 'priority': + mx, created = MX.objects.get_or_create(mx=info[0][1], priority=info[1][1]) + info = info[2:] -for x in range(0,len(info)): - if len(info[x]) > 1: - info[x][0] = info[x][0].strip() - info[x][1] = info[x][1].strip() else: - print "Error: file format" + mx, created = MX.objects.get_or_create(mx=DEFAULT_MX, priority=PRIORITY) + if created: + mx.save() -if info[0][0] == 'mx' and info[1][0] == 'priority': - mx, created = MX.objects.get_or_create(mx=info[0][1], priority=info[1][1]) - try: - info.pop(0) - info.pop(0) - except: + hostindices = [num for num in range(0, len(info)) if info[num][0] == 'hostname'] + + if not checkformat(info, hostindices): print "Error: file format" sys.exit() -else: - mx, created = MX.objects.get_or_create(mx=DEFAULT_MX, priority=PRIORITY) -if created: - mx.save() - -if not checkformat(info): - print "Error: file format" - sys.exit() - -while True: - blank = Host() - for attrib in host_attribs: + +################# + + for host in hostindices: try: - pair = info.pop(0) + host = Host.objects.get(hostname=info[host][1]) + handle_error(info[host][1]) except: - sys.exit() - if pair[0] == 'dhcp' or pair[0] == 'outbound_smtp': - if pair[1] == 'y': - blank.__dict__[pair[0]] = 1 - else: - blank.__dict__[pair[0]] = 0 - elif pair[0] == 'expiration_date': - (year, month, day) = pair[1].split("-") - blank.expiration_date = date(int(year), int(month), int(day)) - elif pair[0] in host_attribs: - blank.__dict__[pair[0]] = pair[1] + # do something here + pass - try: - host = Host.objects.get(hostname=blank.hostname) - print "Error: %s already exists in hostbase" % blank.hostname - sys.exit() - except: - pass - # do something here - blank.status = 'active' - blank.save() - newhostname = blank.hostname.split(".")[0] - newdomain = blank.hostname.split(".", 1)[1] - while True: + macindices = [num for num in range(0, len(info)) if info[num][0] == 'mac_addr'] + for mac_addr in macindices: try: - info[0] + host = Interface.objects.get(mac_addr=info[mac_addr][1]) + handle_error(info[mac_addr][1]) except: - sys.exit() - if info[0][0] == 'mac_addr': + # do something here + pass + + for host in hostindices: + blank = Host() + for attrib in host_attribs: pair = info.pop(0) - try: - Interface.get(mac_addr=pair[1]) - print "Error: %s already exists" % inter.mac_addr - sys.exit() - except: + if pair[0] == 'dhcp' or pair[0] == 'outbound_smtp': + if pair[1] == 'y': + blank.__dict__[pair[0]] = 1 + else: + blank.__dict__[pair[0]] = 0 + elif pair[0] == 'expiration_date': + (year, month, day) = pair[1].split("-") + blank.expiration_date = date(int(year), int(month), int(day)) + else: + blank.__dict__[pair[0]] = pair[1] + blank.status = 'active' + blank.save() + newhostname = blank.hostname.split(".")[0] + newdomain = blank.hostname.split(".", 1)[1] + while info and info[0][0] != 'hostname': + if info[0][0] == 'mac_addr': + pair = info.pop(0) inter = Interface.objects.create(host=blank, mac_addr=pair[1], hdwr_type='eth') inter.save() - elif info[0][0] == 'hdwr_type': - pair = info.pop(0) - inter.hdwr_type = pair[1] - inter.save() - elif info[0][0] == 'ip_addr': - pair = info.pop(0) - ip = IP.objects.create(interface=inter, ip_addr=pair[1], num=1) - hostnamenode = Name(ip=ip, name=blank.hostname, dns_view='global', only=False) - hostnamenode.save() - namenode = Name(ip=ip, name=".".join([newhostname + "-" + inter.hdwr_type, - newdomain]), - dns_view="global", only=False) - namenode.save() - subnetnode = Name(ip=ip, name=newhostname + "-" + - ip.ip_addr.split(".")[2] + "." + - newdomain, dns_view="global", only=False) - subnetnode.save() - hostnamenode.mxs.add(mx) - namenode.mxs.add(mx) - subnetnode.mxs.add(mx) - elif info[0][0] == 'cname': - pair = info.pop(0) - cname = CName.objects.create(name=hostnamenode, cname=pair[1]) - cname.save() - else: - break - + elif info[0][0] == 'hdwr_type': + pair = info.pop(0) + inter.hdwr_type = pair[1] + inter.save() + elif info[0][0] == 'ip_addr': + pair = info.pop(0) + ip = IP.objects.create(interface=inter, ip_addr=pair[1], num=1) + hostnamenode = Name(ip=ip, name=blank.hostname, dns_view='global', only=False) + hostnamenode.save() + namenode = Name(ip=ip, name=".".join([newhostname + "-" + inter.hdwr_type, + newdomain]), + dns_view="global", only=False) + namenode.save() + subnetnode = Name(ip=ip, name=newhostname + "-" + + ip.ip_addr.split(".")[2] + "." + + newdomain, dns_view="global", only=False) + subnetnode.save() + hostnamenode.mxs.add(mx) + namenode.mxs.add(mx) + subnetnode.mxs.add(mx) + elif info[0][0] == 'cname': + pair = info.pop(0) + cname = CName.objects.create(name=hostnamenode, cname=pair[1]) + cname.save() + -- cgit v1.2.3-1-g7c22