import os import base64 import string import sys import socket from sets import Set if __name__ == '__main__': sys.path.append("/opt/planetstack") os.environ.setdefault("DJANGO_SETTINGS_MODULE", "planetstack.settings") from planetstack.config import Config from core.models import Service from requestrouter.models import RequestRouterService, ServiceMap from util.logger import Logger, logging import rrlib_config logger = Logger(level=logging.INFO) ''' Conventions: 1) All dnsredir backend will listen at port 9000+ servicemap.pk ( where pk is the primary key generated in django model) ''' class RequestRouterLibrary: def __init__(self): pass def gen_slice_info(self, service=None): """generates sliver information from slice of request router """ if (service is None ): service = RequestRouterService.objects.get() mapping = {} #static mapping for demo purpose #mapping["node47.princeton.vicci.org"] = "128.112.171.112" mapping["node48.princeton.vicci.org"] = "128.112.171.114" '''for slice in service.service.all(): name = slice.name for sliver in slice.slivers.all(): mapping[sliver.name] = str(sliver.ip) ''' return mapping def gen_servicemap_slice_info(self, servicemap): """generates sliver information from slice of servicemap """ wzone = Set(['arizona', 'stanford', 'on.lab', 'housten']) # zone=1 in cooden.conf ezone = Set(['princeton', 'atlanta', 'new york', 'georgia tech']) # zone=2 in coodeen.conf mapping_zone = {} mapping_ip = {} slice = servicemap.slice name = slice.name for sliver in slice.slivers.all(): mapping_ip[sliver.node.name] = socket.gethostbyname(sliver.node.name) #print "sliver name "+sliver.name+str(sliver.ip)+"\n" site = sliver.node.site.name if(site.lower() in wzone): mapping_zone[sliver.node.name] = str(1) else: mapping_zone[sliver.node.name] = str(2) return mapping_ip, mapping_zone def gen_slice_file(self, service): """ generates host file for the slice information to be used by ansible to push configuration files """ mapping = self.gen_slice_info(service) fn = "/etc/ansible/requestrouter/dnsredir/hosts" f = open(fn, "w") for (k,v) in mapping.items(): f.write("%s\n" % k) fn = "/etc/ansible/requestrouter/dnsdemux/hosts" f = open(fn, "w") for (k,v) in mapping.items(): f.write("%s\n" % k) def get_servicemap_uid(self, servicemap): seq = ("service_", str(servicemap.pk)); return "".join(seq) def get_service_port(self, servicemap): return str(9000+servicemap.pk) def gen_dnsredir_serviceconf(self, servicemap): objname = self.get_servicemap_uid(servicemap) rr_mapping = self.gen_slice_info(None) #generate dnsredir.conf file parameters to be used in static file. mapping = {} mapping["port_listen"] = self.get_service_port(servicemap) mapping["configdir"] = rrlib_config.DNSREDIR_CONFIGDIR_PREFIX+objname+".d/" mapping["logdir"] = rrlib_config.DNSREDIR_LOGDIR_PREFIX+objname+".d" mapping["pidfile"] = rrlib_config.DNSREDIR_PIDFILE_PREFIX+objname+".pid" mapping["domain_name"] = servicemap.prefix mapping["heartbeat_port"] = rrlib_config.HEARTBEAT_PORT #generate dnsredir.conf file fn = "./temp_config/dnsredir/"+objname+".conf" f = open(fn, "w") for (k,v) in rr_mapping.items(): f.write(mapping["domain_name"]+". NS "+k+". "+v+" 3600 \n" % mapping) f.write(""" Default_TTL 30 Port %(port_listen)s ConfigDir %(configdir)s MapsDir maps.d HTTPPort %(heartbeat_port)d PidFile %(pidfile)s HttpRequestPort 8081 """ % mapping) #generate configdirectory os.mkdir("./temp_config/dnsredir/"+objname+".d") #geenrate codeen_nodes.conf mapping_ip, mapping_zone = self.gen_servicemap_slice_info(servicemap) codeen_name = "./temp_config/dnsredir/"+objname+".d/codeen_nodes.conf" f = open(codeen_name, "w") for (k,v) in mapping_zone.items(): f.write(k+" zone="+v+" \n") iptxt = "./temp_config/dnsredir/"+objname+".d/node-to-ip.txt" f = open(iptxt, "w") for (k,v) in mapping_ip.items(): f.write(k+" "+v+" \n") #generate maps directory os.mkdir("./temp_config/dnsredir/"+objname+".d/maps.d") # redirection map map = "./temp_config/dnsredir/"+objname+".d/maps.d/map.conf" f = open(map, "w") #hardcoded probable public IP masks from arizona and princeton region respectively f.write("prefix "+servicemap.prefix+" \n") f.write("map 150.135.211.252/32 zone 1 || zone 2 \n") f.write("map 128.112.171.112/24 zone 2 || zone 1 \n") f.write("map 0.0.0.0/0 zone 1 || zone 2 \n") def gen_dnsdemux_serviceconf(self, servicemap): ''' generates frontend service*.conf file for each of the service It assumes that there is a dnsdemux frontend running on the RR istallation and will just add a conf file for each service in /etc/dnsdemux/default ''' objname = self.get_servicemap_uid(servicemap) #generate dnsdemux.conf file parameters to be used in static file. port_listen = self.get_service_port(servicemap) domain_name = servicemap.prefix #generate service specific .conf file rr_mapping = self.gen_slice_info(None) fn = "./temp_config/dnsdemux/"+objname+".conf" f = open(fn, "w") for (k,v) in rr_mapping.items(): f.write("Forward "+v+" "+port_listen+" 8081 "+domain_name+".\n") def teardown_temp_configfiles(self, objname): if os.path.exists("./temp_config/dnsdemux/"+objname+".conf"): os.remove("./temp_config/dnsdemux/"+objname+".conf") if os.path.exists("./temp_config/dnsredir/"+objname+".d/maps.d/map.conf"): os.remove("./temp_config/dnsredir/"+objname+".d/maps.d/map.conf") if os.path.exists("./temp_config/dnsredir/"+objname+".d/maps.d"): os.rmdir("./temp_config/dnsredir/"+objname+".d/maps.d") if os.path.exists("./temp_config/dnsredir/"+objname+".d/node-to-ip.txt"): os.remove("./temp_config/dnsredir/"+objname+".d/node-to-ip.txt") if os.path.exists("./temp_config/dnsredir/"+objname+".d/codeen_nodes.conf"): os.remove("./temp_config/dnsredir/"+objname+".d/codeen_nodes.conf") if os.path.exists("./temp_config/dnsredir/"+objname+".d"): os.rmdir("./temp_config/dnsredir/"+objname+".d") if os.path.exists("./temp_config/dnsredir/"+objname+".conf"): os.remove("./temp_config/dnsredir/"+objname+".conf")