def setup_masquerade_rule(config, loop): # Figure out right egress device for the rule. if config.get('setup_type') == 'LTE': enable_nat = config['enable_nat'] if enable_nat is False: add_dev = config.get('uplink_bridge', UPLINK_OVS_BRIDGE_NAME) del_dev = config['nat_iface'] else: add_dev = config['nat_iface'] del_dev = config.get('uplink_bridge', UPLINK_OVS_BRIDGE_NAME) else: add_dev = config['nat_iface'] del_dev = None # update iptable rules def callback(returncode): if returncode != 0: logging.error( "Failed to set MASQUERADE: %d", returncode, ) if del_dev: ip_table_rule_del = 'POSTROUTING -o %s -j MASQUERADE' % del_dev rule_del = 'iptables -t nat -D %s || true' % ip_table_rule_del logging.debug("Del Masquerade rule: %s", rule_del) call_process(rule_del, callback, loop) ip_table_rule = 'POSTROUTING -o %s -j MASQUERADE' % add_dev check_and_add = 'iptables -t nat -C %s || iptables -t nat -A %s' % \ (ip_table_rule, ip_table_rule) logging.debug("Add Masquerade rule: %s", check_and_add) call_process(check_and_add, callback, loop)
def callback(returncode): if returncode != 0: logging.error("Apt-get update failed with code: %d", returncode) return logging.info("apt-get update completed") call_process( get_autoupgrade_command(target_version, dry_run=True), _get_upgrade_dry_run_complete_callback(target_version, loop), loop)
def callback(returncode): if returncode != 0: logging.error("Magma Upgrade dry-run failed with code: %d", returncode) return logging.info("Magma upgrade dry-run completed") call_process(get_autoupgrade_command(target_version, dry_run=False), _upgrade_completed, loop)
def main(): """ Loads the Ryu apps we want to run from the config file. This should exit on keyboard interrupt. """ # Run asyncio loop in a greenthread so we can evaluate other eventlets # TODO: Remove once Ryu migrates to asyncio asyncio.set_event_loop_policy(aioeventlet.EventLoopPolicy()) service = MagmaService('pipelined') service_config = service.config if environment.is_dev_mode(): of_rest_server.configure(service_config) # Set Ryu config params cfg.CONF.ofp_listen_host = "127.0.0.1" # Load the ryu apps service_manager = ServiceManager(service) service_manager.load() def callback(returncode): if returncode != 0: logging.error( "Failed to set MASQUERADE: %d", returncode ) if service.mconfig.nat_enabled: call_process('iptables -t nat -A POSTROUTING -o %s -j MASQUERADE' % service.config['nat_iface'], callback, service.loop ) service.loop.create_task(monitor_ifaces( service.config['monitored_ifaces'], service.loop), ) manager = AppManager.get_instance() # Add pipelined rpc servicer pipelined_srv = PipelinedRpcServicer( service.loop, manager.applications.get('MeterStatsController', None), manager.applications.get('EnforcementController', None), manager.applications.get('EnforcementStatsController', None), manager.applications.get('DPIController', None), service_manager) pipelined_srv.add_to_server(service.rpc_server) # Run the service loop service.run() # Cleanup the service service.close()
def perform_upgrade_if_necessary(self, target_version): if compare_package_versions(self.cur_version, target_version) > 0: logging.info( 'Upgrading magma to version %s', target_version, ) call_process( 'apt-get update', _get_apt_update_complete_callback(target_version, self.loop), self.loop) else: logging.info( 'Service is currently on package version %s, ' 'ignoring upgrade to %s because it is either ' 'equal or behind.', self.cur_version, target_version)
def setup_sgi_tunnel(config, loop): def callback(returncode): if returncode != 0: logging.error( "Failed to setup wg-dev: %d", returncode, ) sgi_tunnel = config.get('sgi_tunnel', None) if sgi_tunnel is None or sgi_tunnel.get('enabled', False) is False: wg_del = 'wg-quick down %s || true' % wg_dev logging.debug("sgi tunnel: del: %s", wg_del) call_process(wg_del, callback, loop) return tun_type = sgi_tunnel.get('type', 'wg') if tun_type != 'wg': logging.error("sgi tunnel : %s not supported", tun_type) return enable_default_route = sgi_tunnel.get('enable_default_route', False) tunnels = sgi_tunnel.get('tunnels', None) if tunnels is None: return # TODO: handle multiple tunnels. wg_local_ip = tunnels[0].get('wg_local_ip', None) peer_pub_key = tunnels[0].get('peer_pub_key', None) peer_pub_ip = tunnels[0].get('peer_pub_ip', None) if wg_local_ip is None or peer_pub_ip is None or peer_pub_key is None: logging.error("sgi tunnel: Missing config") return if enable_default_route: allowed_ips = '0.0.0.0/0' else: allowed_ips = wg_local_ip wg_add = "%s %s %s %s %s %s|| true" % \ ( wg_setup_utility, wg_key_dir, allowed_ips, wg_local_ip, peer_pub_key, peer_pub_ip, ) logging.info("sgi tunnel: add: %s", wg_add) call_process(wg_add, callback, loop)
def main(): """ Loads the Ryu apps we want to run from the config file. This should exit on keyboard interrupt. """ # Run asyncio loop in a greenthread so we can evaluate other eventlets # TODO: Remove once Ryu migrates to asyncio asyncio.set_event_loop_policy(aioeventlet.EventLoopPolicy()) service = MagmaService('pipelined', mconfigs_pb2.PipelineD()) # Optionally pipe errors to Sentry sentry_init(service_name=service.name) service_config = service.config if environment.is_dev_mode(): of_rest_server.configure(service_config) # Set Ryu config params cfg.CONF.ofp_listen_host = "127.0.0.1" # override mconfig using local config. # TODO: move config compilation to separate module. enable_nat = service.config.get('enable_nat', service.mconfig.nat_enabled) service.config['enable_nat'] = enable_nat logging.info("Nat: %s", enable_nat) vlan_tag = service.config.get( 'sgi_management_iface_vlan', service.mconfig.sgi_management_iface_vlan, ) service.config['sgi_management_iface_vlan'] = vlan_tag sgi_ip = service.config.get( 'sgi_management_iface_ip_addr', service.mconfig.sgi_management_iface_ip_addr, ) service.config['sgi_management_iface_ip_addr'] = sgi_ip sgi_gateway_ip = service.config.get( 'sgi_management_iface_gw', service.mconfig.sgi_management_iface_gw, ) service.config['sgi_management_iface_gw'] = sgi_gateway_ip # Keep router mode off for smooth upgrade path service.config['dp_router_enabled'] = service.config.get( 'dp_router_enabled', False, ) if 'virtual_mac' not in service.config: if service.config['dp_router_enabled']: up_bridge_name = service.config.get( 'uplink_bridge', UPLINK_OVS_BRIDGE_NAME, ) mac_addr = get_if_hwaddr(up_bridge_name) else: mac_addr = get_if_hwaddr(service.config.get('bridge_name')) service.config['virtual_mac'] = mac_addr # this is not read from yml file. service.config['uplink_port'] = OFPP_LOCAL uplink_port_name = service.config.get('ovs_uplink_port_name', None) if enable_nat is False and uplink_port_name is not None: service.config['uplink_port'] = BridgeTools.get_ofport( uplink_port_name, ) # header enrichment related configuration. service.config['proxy_port_name'] = PROXY_PORT_NAME he_enabled_flag = False if service.mconfig.he_config: he_enabled_flag = service.mconfig.he_config.enable_header_enrichment he_enabled = service.config.get('he_enabled', he_enabled_flag) service.config['he_enabled'] = he_enabled # monitoring related configuration mtr_interface = service.config.get('mtr_interface', None) if mtr_interface: mtr_ip = get_ip_from_if(mtr_interface) service.config['mtr_ip'] = mtr_ip # Load the ryu apps service_manager = ServiceManager(service) service_manager.load() def callback(returncode): if returncode != 0: logging.error( "Failed to set MASQUERADE: %d", returncode, ) # TODO fix this hack for XWF if enable_nat is True or service.config.get('setup_type') == 'XWF': call_process( 'iptables -t nat -A POSTROUTING -o %s -j MASQUERADE' % service.config['nat_iface'], callback, service.loop, ) service.loop.create_task( monitor_ifaces( service.config['monitored_ifaces'], ), ) manager = AppManager.get_instance() # Add pipelined rpc servicer pipelined_srv = PipelinedRpcServicer( service.loop, manager.applications.get('GYController', None), manager.applications.get('EnforcementController', None), manager.applications.get('EnforcementStatsController', None), manager.applications.get('DPIController', None), manager.applications.get('UEMacAddressController', None), manager.applications.get('CheckQuotaController', None), manager.applications.get('IPFIXController', None), manager.applications.get('VlanLearnController', None), manager.applications.get('TunnelLearnController', None), manager.applications.get('Classifier', None), manager.applications.get('InOutController', None), manager.applications.get('NGServiceController', None), service.config, service_manager, ) pipelined_srv.add_to_server(service.rpc_server) if service.config['setup_type'] == 'CWF': bridge_ip = service.config['bridge_ip_address'] has_quota_port = service.config['has_quota_port'] no_quota_port = service.config['no_quota_port'] def on_exit_server_thread(): service.StopService(None, None) # For CWF start quota check servers start_check_quota_server( run_flask, bridge_ip, has_quota_port, True, on_exit_server_thread, ) start_check_quota_server( run_flask, bridge_ip, no_quota_port, False, on_exit_server_thread, ) if service.config['setup_type'] == 'LTE': polling_interval = service.config.get( 'ovs_gtp_stats_polling_interval', MIN_OVSDB_DUMP_POLLING_INTERVAL, ) collector = GTPStatsCollector( polling_interval, service.loop, ) collector.start() # Run the service loop service.run() # Cleanup the service service.close()
def main(): """ Loads the Ryu apps we want to run from the config file. This should exit on keyboard interrupt. """ # Run asyncio loop in a greenthread so we can evaluate other eventlets # TODO: Remove once Ryu migrates to asyncio asyncio.set_event_loop_policy(aioeventlet.EventLoopPolicy()) service = MagmaService('pipelined', mconfigs_pb2.PipelineD()) service_config = service.config if environment.is_dev_mode(): of_rest_server.configure(service_config) # Set Ryu config params cfg.CONF.ofp_listen_host = "127.0.0.1" # Load the ryu apps service_manager = ServiceManager(service) service_manager.load() def callback(returncode): if returncode != 0: logging.error( "Failed to set MASQUERADE: %d", returncode ) if service.mconfig.nat_enabled: call_process('iptables -t nat -A POSTROUTING -o %s -j MASQUERADE' % service.config['nat_iface'], callback, service.loop ) service.loop.create_task(monitor_ifaces( service.config['monitored_ifaces'], service.loop), ) manager = AppManager.get_instance() # Add pipelined rpc servicer pipelined_srv = PipelinedRpcServicer( service.loop, manager.applications.get('MeterStatsController', None), manager.applications.get('EnforcementController', None), manager.applications.get('EnforcementStatsController', None), manager.applications.get('DPIController', None), manager.applications.get('UEMacAddressController', None), manager.applications.get('CheckQuotaController', None), service_manager) pipelined_srv.add_to_server(service.rpc_server) if service.config['setup_type'] == 'CWF': bridge_ip = service.config['bridge_ip_address'] has_quota_port = service.config['has_quota_port'] no_quota_port = service.config['no_quota_port'] def on_exit_server_thread(): service.StopService(None, None) # For CWF start quota check servers start_check_quota_server(run_flask, bridge_ip, has_quota_port, True, on_exit_server_thread) start_check_quota_server(run_flask, bridge_ip, no_quota_port, False, on_exit_server_thread) # Run the service loop service.run() # Cleanup the service service.close()
def main(): """ Loads the Ryu apps we want to run from the config file. This should exit on keyboard interrupt. """ # Run asyncio loop in a greenthread so we can evaluate other eventlets # TODO: Remove once Ryu migrates to asyncio asyncio.set_event_loop_policy(aioeventlet.EventLoopPolicy()) service = MagmaService('pipelined', mconfigs_pb2.PipelineD()) service_config = service.config if environment.is_dev_mode(): of_rest_server.configure(service_config) # Set Ryu config params cfg.CONF.ofp_listen_host = "127.0.0.1" # override mconfig using local config. # TODO: move config compilation to separate module. enable_nat = service.config.get('enable_nat', service.mconfig.nat_enabled) service.config['enable_nat'] = enable_nat logging.info("Nat: %s", enable_nat) vlan_tag = service.config.get('sgi_management_iface_vlan', service.mconfig.sgi_management_iface_vlan) service.config['sgi_management_iface_vlan'] = vlan_tag sgi_ip = service.config.get('sgi_management_iface_ip_addr', service.mconfig.sgi_management_iface_ip_addr) service.config['sgi_management_iface_ip_addr'] = sgi_ip if 'virtual_mac' not in service.config: service.config['virtual_mac'] = get_if_hwaddr( service.config.get('bridge_name')) # Load the ryu apps service_manager = ServiceManager(service) service_manager.load() def callback(returncode): if returncode != 0: logging.error("Failed to set MASQUERADE: %d", returncode) # TODO fix this hack for XWF if enable_nat is True or service.config.get('setup_type') == 'XWF': call_process( 'iptables -t nat -A POSTROUTING -o %s -j MASQUERADE' % service.config['nat_iface'], callback, service.loop) service.loop.create_task( monitor_ifaces(service.config['monitored_ifaces'], service.loop), ) manager = AppManager.get_instance() # Add pipelined rpc servicer pipelined_srv = PipelinedRpcServicer( service.loop, manager.applications.get('GYController', None), manager.applications.get('EnforcementController', None), manager.applications.get('EnforcementStatsController', None), manager.applications.get('DPIController', None), manager.applications.get('UEMacAddressController', None), manager.applications.get('CheckQuotaController', None), manager.applications.get('IPFIXController', None), manager.applications.get('VlanLearnController', None), manager.applications.get('TunnelLearnController', None), service_manager) pipelined_srv.add_to_server(service.rpc_server) if service.config['setup_type'] == 'CWF': bridge_ip = service.config['bridge_ip_address'] has_quota_port = service.config['has_quota_port'] no_quota_port = service.config['no_quota_port'] def on_exit_server_thread(): service.StopService(None, None) # For CWF start quota check servers start_check_quota_server(run_flask, bridge_ip, has_quota_port, True, on_exit_server_thread) start_check_quota_server(run_flask, bridge_ip, no_quota_port, False, on_exit_server_thread) if service.config['setup_type'] == 'LTE': polling_interval = service.config.get('ovs_gtp_stats_polling_interval', MIN_OVSDB_DUMP_POLLING_INTERVAL) collector = GTPStatsCollector(polling_interval, service.loop) collector.start() # Run the service loop service.run() # Cleanup the service service.close()