def show_bmc_if(self, brief = False): bmcnetwork = self._get_json()['bmcnetwork'] if not bool(bmcnetwork): return '' (NETWORK, PREFIX) = ("", "") try: net = Network(id = bmcnetwork.id, mongo_db = self._mongo_db) NETWORK = net.get('NETWORK') PREFIX = str(net.get('PREFIX')) except: pass if brief: return "[" +net.name + "]:"+ NETWORK + "/" + PREFIX return NETWORK + "/" + PREFIX
def show_if(self, interface, brief = False): interfaces = self._get_json()['interfaces'] try: params = interfaces[interface] except: self._logger.error("Interface '{}' does not exist".format(interface)) return "" (outstr, NETWORK, PREFIX) = ("", "", "") try: net = Network(id = params['network'].id, mongo_db = self._mongo_db) NETWORK = net.get('NETWORK') PREFIX = str(net.get('PREFIX')) except: pass if NETWORK: if brief: return "[" +net.name + "]:" + NETWORK + "/" + PREFIX outstr = "NETWORK=" + NETWORK + "\n" outstr += "PREFIX=" + PREFIX if params['params'] and not brief: outstr += "\n" + params['params'] return outstr.rstrip()
def boot_params(self): params = {} params['boot_if'] = None params['net_prefix'] = None osimage = OsImage(id=self.get('osimage').id, mongo_db=self._mongo_db) try: params['kernel_file'] = osimage.get('kernfile') except: params['kernel_file'] = "" try: params['initrd_file'] = osimage.get('initrdfile') except: params['initrd_file'] = "" try: params['kern_opts'] = osimage.get('kernopts') except: params['kern_opts'] = "" try: params['boot_if'] = self.get('boot_if') except: params['boot_if'] = "" params['net_prefix'] = "" return params interfaces = self._get_json()['interfaces'] try: if_params = interfaces[params['boot_if']] except: self._logger.error( "Boot interface '{}' does not present in configured interface list '{}'." .format(params['boot_if'], interfaces.keys())) params['boot_if'] = "" params['net_prefix'] = "" return params net = None try: if_net = if_params['network'] net = Network(id=if_net.id, mongo_db=self._mongo_db) except: pass if not bool(net): self._logger.error( "Boot interface '{}' has no network configured".format( params['boot_if'])) params['boot_if'] = "" params['net_prefix'] = "" return params params['net_prefix'] = net.get('PREFIX') return params
def _create_dhcp_config(self, no_ha): from luna.network import Network from bson.objectid import ObjectId from tornado import template import os, base64 c = {} conf_primary = {} conf_secondary = {} if self.is_ha() and not no_ha: cluster_ips = self.get_cluster_ips() conf_primary['my_addr'] = cluster_ips[0] conf_secondary['my_addr'] = cluster_ips[1] conf_primary['peer_addr'] = conf_secondary['my_addr'] conf_secondary['peer_addr'] = conf_primary['my_addr'] c['frontend_ip'] = self.get('frontend_address') c['dhcp_start'] = self.get('dhcp_range_start') c['dhcp_end'] = self.get('dhcp_range_end') c['frontend_port'] = self.get('frontend_port') netname = self.get('dhcp_net') objnet = Network(name=netname, mongo_db=self._mongo_db) c['NETMASK'] = objnet.get('NETMASK') c['NETWORK'] = objnet.get('NETWORK') c['hmac_key'] = str( base64.b64encode(bytearray(os.urandom(32))).decode()) tloader = template.Loader(self.get('path') + '/templates') if self.is_ha() and not no_ha: dhcpd_conf_primary = tloader.load('templ_dhcpd.cfg').generate( c=c, conf_primary=conf_primary, conf_secondary=None) dhcpd_conf_secondary = tloader.load('templ_dhcpd.cfg').generate( c=c, conf_primary=None, conf_secondary=conf_secondary) f1 = open('/etc/dhcp/dhcpd.conf', 'w') f2 = open('/etc/dhcp/dhcpd-secondary.conf', 'w') f1.write(dhcpd_conf_primary) f2.write(dhcpd_conf_secondary) f1.close() f2.close() else: dhcpd_conf = tloader.load('templ_dhcpd.cfg').generate( c=c, conf_primary=None, conf_secondary=None) f1 = open('/etc/dhcp/dhcpd.conf', 'w') f2 = open('/etc/dhcp/dhcpd-secondary.conf', 'w') f1.write(dhcpd_conf) f2.write(dhcpd_conf) f1.close() f2.close() return True
def _create_dhcp_config(self, no_ha): from luna.network import Network from bson.objectid import ObjectId from tornado import template import os, base64 c = {} conf_primary = {} conf_secondary = {} if self.is_ha() and not no_ha: cluster_ips = self.get_cluster_ips() conf_primary['my_addr'] = cluster_ips[0] conf_secondary['my_addr'] = cluster_ips[1] conf_primary['peer_addr'] = conf_secondary['my_addr'] conf_secondary['peer_addr'] = conf_primary['my_addr'] c['frontend_ip'] = self.get('frontend_address') c['dhcp_start'] = self.get('dhcp_range_start') c['dhcp_end'] = self.get('dhcp_range_end') c['frontend_port'] = self.get('frontend_port') netname = self.get('dhcp_net') objnet = Network(name = netname, mongo_db = self._mongo_db) c['NETMASK'] = objnet.get('NETMASK') c['NETWORK'] = objnet.get('NETWORK') c['hmac_key'] = str(base64.b64encode(bytearray(os.urandom(32))).decode()) tloader = template.Loader(self.get('path') + '/templates') if self.is_ha() and not no_ha: dhcpd_conf_primary = tloader.load('templ_dhcpd.cfg').generate(c = c, conf_primary = conf_primary, conf_secondary = None) dhcpd_conf_secondary = tloader.load('templ_dhcpd.cfg').generate(c = c, conf_primary = None, conf_secondary = conf_secondary) f1 = open('/etc/dhcp/dhcpd.conf', 'w') f2 = open('/etc/dhcp/dhcpd-secondary.conf', 'w') f1.write(dhcpd_conf_primary) f2.write(dhcpd_conf_secondary) f1.close() f2.close() else: dhcpd_conf = tloader.load('templ_dhcpd.cfg').generate(c = c, conf_primary = None, conf_secondary = None) f1 = open('/etc/dhcp/dhcpd.conf', 'w') f2 = open('/etc/dhcp/dhcpd-secondary.conf', 'w') f1.write(dhcpd_conf) f2.write(dhcpd_conf) f1.close() f2.close() return True
def boot_params(self): params = {} params['boot_if'] = None params['net_prefix'] = None osimage = OsImage(id = self.get('osimage').id, mongo_db = self._mongo_db) try: params['kernel_file'] = osimage.get('kernfile') except: params['kernel_file'] = "" try: params['initrd_file'] = osimage.get('initrdfile') except: params['initrd_file'] = "" try: params['kern_opts'] = osimage.get('kernopts') except: params['kern_opts'] = "" try: params['boot_if'] = self.get('boot_if') except: params['boot_if'] = "" params['net_prefix'] = "" return params interfaces = self._get_json()['interfaces'] try: if_params = interfaces[params['boot_if']] except: self._logger.error("Boot interface '{}' does not present in configured interface list '{}'.".format(params['boot_if'], interfaces.keys())) params['boot_if'] = "" params['net_prefix'] = "" return params net = None try: if_net = if_params['network'] net = Network(id = if_net.id, mongo_db = self._mongo_db) except: pass if not bool(net): self._logger.error("Boot interface '{}' has no network configured".format(params['boot_if'])) params['boot_if'] = "" params['net_prefix'] = "" return params params['net_prefix'] = net.get('PREFIX') return params
def makedns(self): from luna.network import Network from bson.objectid import ObjectId from tornado import template import pwd import grp import os # get network _id configured for cluster obj_json = self._get_json() try: rev_links = obj_json[usedby_key] except: self._logger.error("No IP addresses for network '{}' configured.".format(self.name)) return None netids = [] for elem in rev_links: if elem == 'network': for netid in rev_links[elem]: netids.extend([netid]) # fill network dictionary {'netname': {'ns_hostname': 'servername', 'ns_ip': 'IP', 'hosts' {'name': 'IP'}}} networks = {} for netid in netids: netobj = Network(id = ObjectId(netid)) networks[netobj.name] = {} master_ip = netobj.get('ns_ip') networks[netobj.name]['ns_hostname'] = netobj.get('ns_hostname') networks[netobj.name]['ns_ip'] = master_ip networks[netobj.name]['hosts'] = netobj.resolve_used_ips() # some inout for reverse zones # here is steps to figure out which octets in ipadresses are common for all ips in network. # we can not rely on mask here, as mask can not be devisible by 8 (/12, /15, /21, etc) arr1 = [int(elem) for elem in master_ip.split('.')] logical_arr1 = [True, True, True, True] for host in networks[netobj.name]['hosts']: ip = networks[netobj.name]['hosts'][host] arr2 = [int(elem) for elem in ip.split('.')] logical_arr = [ bool(arr1[n] == arr2[n]) for n in range(len(arr1))] logical_arr2 = [logical_arr[n] & logical_arr1[n] for n in range(len(logical_arr))] arr1 = arr2[:] logical_arr1 = logical_arr2[:] # get fist octet in ip adresses which is changing try: mutable_octet = [i for i in range(len(logical_arr1)) if not logical_arr1[i]][0] except IndexError: mutable_octet = 3 # generate zone file name revzonename = '.'.join(list(reversed(master_ip.split('.')[:mutable_octet]))) + ".in-addr.arpa" networks[netobj.name]['mutable_octet'] = mutable_octet networks[netobj.name]['rev_zone_name'] = revzonename # figure out paths includefile = self.get('named_include_file') zonedir = self.get('named_zone_dir') if not includefile: self._logger.error("named_include_file should be configured") return None if not zonedir: self._logger.error("named_zone_dir should be configured") return None # load templates tloader = template.Loader(self.get('path') + '/templates') # create include file for named.conf namedconffile = open(includefile, 'w') zonenames = [] for network in networks: zonenames.extend([network, networks[network]['rev_zone_name']]) namedconffile.write(tloader.load('templ_named_conf.cfg').generate(networks = zonenames)) namedconffile.close() nameduid = pwd.getpwnam("named").pw_uid namedgid = grp.getgrnam("named").gr_gid os.chown(includefile, 0, namedgid) self._logger.info("Created '{}'".format(includefile)) # remove zone files filelist = [ f for f in os.listdir(zonedir) if f.endswith(".luna.zone") ] for f in filelist: filepath = zonedir + "/" + f try: os.remove(filepath) self._logger.info("Removed old '{}'".format(filepath)) except: self._logger.info("Unable to remove '{}'".format(filepath)) # create zone files for network in networks: # create zone z = {} z['master_hostname'] = networks[network]['ns_hostname'] z['master_ip'] = networks[network]['ns_ip'] z['serial_num'] = 1 z['hosts'] = networks[network]['hosts'] zonefilepath = zonedir + "/" + network + ".luna.zone" zonefile = open(zonefilepath, 'w') zonefile.write(tloader.load('templ_zone.cfg').generate(z = z)) zonefile.close() os.chown(zonefilepath, nameduid, namedgid) self._logger.info("Created '{}'".format(zonefilepath)) revzonepath = zonedir + "/" + networks[network]['rev_zone_name'] + ".luna.zone" z['master_hostname'] = networks[network]['ns_hostname'] + "." + network z['hosts'] = {} for host in networks[network]['hosts']: hostname = host + "." + network iparr = [int(elem) for elem in networks[network]['hosts'][host].split('.')] reverseiplist = list(reversed(iparr[networks[network]['mutable_octet']:])) reverseip = '.'.join([str(elem) for elem in reverseiplist]) z['hosts'][hostname] = reverseip zonefile = open(revzonepath, 'w') zonefile.write(tloader.load('templ_zone_arpa.cfg').generate(z = z)) zonefile.close() os.chown(revzonepath, nameduid, namedgid) self._logger.info("Created '{}'".format(revzonepath)) return True
def makedhcp_config(self, net_name=None, start_ip=None, end_ip=None): from luna.network import Network if net_name and not (start_ip and end_ip): self.log.error("IP range should be specified.") return {} old_net_name = self.get('dhcp_net') if not (old_net_name or net_name): self.log.error("DHCP network should be specified.") return {} frontend_address = self.get('frontend_address') if not frontend_address: self.log.error("Frontend address should be set.") return {} net_obj = None start_ip_num, end_ip_num = None, None if net_name: net_obj = Network(name=net_name, mongo_db=self._mongo_db) if net_obj.version != 4: self.log.error("Only IPv4 networks are supported.") return {} start_ip_num = None frontend_address_num = None end_ip_num = None try: start_ip_num = utils.ip.atorel( start_ip, net_obj._json['NETWORK'], net_obj._json['PREFIX']) frontend_address_num = utils.ip.atorel( frontend_address, net_obj._json['NETWORK'], net_obj._json['PREFIX']) end_ip_num = utils.ip.atorel( end_ip, net_obj._json['NETWORK'], net_obj._json['PREFIX']) except RuntimeError: # utils.ip will print error messages pass if not start_ip_num: self.log.error( 'Start of the range does not belong to network.') return {} if not start_ip_num: self.log.error( 'End of the range does not belong to network.') return {} if not frontend_address_num: self.log.error( 'Frontend IP does not belong to network.') return {} if end_ip_num < start_ip_num: self.log.error( 'End IP of the range should be larger than start.') return {} old_net_obj = None old_start_ip = None old_end_ip = None if old_net_name and net_name: # release old range old_net_obj = Network(name=old_net_name, mongo_db=self._mongo_db) old_start_ip = self.get('dhcp_range_start') old_end_ip = self.get('dhcp_range_end') res = old_net_obj.release_ip(old_start_ip, old_end_ip) if not res: self.log.error('Unable to release old range.') return {} self.unlink(old_net_obj) if net_name: # now try to reserve new range net_obj = Network(name=net_name, mongo_db=self._mongo_db) res = net_obj.reserve_ip(start_ip_num, end_ip_num) if not res: if old_net_obj: # need to rolback old_net_obj.reserve_ip(old_start_ip, old_end_ip) self.log.error('Unable to reserve new range.') return {} super(Cluster, self).set('dhcp_net', str(net_obj.id)) super(Cluster, self).set('dhcp_range_start', start_ip_num) super(Cluster, self).set('dhcp_range_end', end_ip_num) self.link(net_obj) # get actual options c = {} if self.get('frontend_https'): c['protocol'] = 'https' else: c['protocol'] = 'http' c['frontend_ip'] = self.get('frontend_address') c['dhcp_start'] = self.get('dhcp_range_start') c['dhcp_end'] = self.get('dhcp_range_end') c['frontend_port'] = self.get('frontend_port') netname = self.get('dhcp_net') objnet = Network(name=netname, mongo_db=self._mongo_db) c['netmask'] = objnet.get('NETMASK') c['network'] = objnet.get('NETWORK') c['hmac_key'] = str( base64.b64encode(bytearray(os.urandom(32))).decode() ) c['reservations'] = objnet.get_ip_macs() return c
def install_params(self): params = {} params['prescript'] = self.get('prescript') params['partscript'] = self.get('partscript') params['postscript'] = self.get('postscript') try: params['boot_if'] = self.get('boot_if') except: params['boot_if'] = '' try: params['torrent_if'] = self.get('torrent_if') except: params['torrent_if'] = '' json = self._get_json() if bool(params['torrent_if']): try: net_dbref = json['interfaces'][params['torrent_if']]['network'] net = Network(id = net_dbref.id, mongo_db = self._mongo_db) params['torrent_if_net_prefix'] = str(net.get('PREFIX')) except: params['torrent_if'] = '' try: net_dbref = json['interfaces'][self.get('boot_if')]['network'] net = Network(id = net_dbref.id, mongo_db = self._mongo_db) params['domain'] = str(net.name) except: params['domain'] = "" params['interfaces'] = {} try: interfaces = json['interfaces'].keys() for interface in interfaces: params['interfaces'][str(interface)] = str(self.get_if_parms(interface)) except: pass try: interfaces = json['interfaces'].keys() except: interfaces = [] for interface in interfaces: net_dbref = json['interfaces'][interface]['network'] try: net = Network(id = net_dbref.id, mongo_db = self._mongo_db) net_prefix = "\n" + "PREFIX=" + str(net.get('PREFIX')) except: net_prefix = "" params['interfaces'][str(interface)] = params['interfaces'][str(interface)].strip() + net_prefix osimage = OsImage(id = self.get('osimage').id, mongo_db = self._mongo_db) try: params['torrent'] = osimage.get('torrent') + ".torrent" params['tarball'] = osimage.get('tarball') + ".tgz" except: params['torrent'] = "" params['tarball'] = "" params['kernver'] = osimage.get('kernver') params['kernopts'] = osimage.get('kernopts') params['bmcsetup'] = {} if self.get('bmcsetup'): bmcsetup = BMCSetup(id = self.get('bmcsetup').id, mongo_db = self._mongo_db) params['bmcsetup']['mgmtchannel'] = bmcsetup.get('mgmtchannel') or 1 params['bmcsetup']['netchannel'] = bmcsetup.get('netchannel') or 1 params['bmcsetup']['userid'] = bmcsetup.get('userid') or 3 params['bmcsetup']['user'] = bmcsetup.get('user') or "ladmin" params['bmcsetup']['password'] = bmcsetup.get('password') or "ladmin" try: net_dbref = json['bmcnetwork'] net = Network(id = net_dbref.id, mongo_db = self._mongo_db) params['bmcsetup']['netmask'] = net.get('NETMASK') except: params['bmcsetup']['netmask'] = '' return params