def receive_command(self, clim, cmd): if cmd.startswith('ls'): parts = cmd.split(None, 1) if len(parts) == 1: idx = 0 for rtp_cluster in self.rtp_clusters: if idx > 0: clim.send('\n') clim.send('Cluster: #%d\n' % idx) clim.send(' name = %s\n' % rtp_cluster.name) clim.send(' address = %s\n' % str(rtp_cluster.address)) clim.send(' active members = %d\n' % len(rtp_cluster.active)) clim.send(' inactive members = %d\n' % len(rtp_cluster.pending)) idx += 1 else: rtp_cluster, idx = self.cluster_by_name(parts[1]) if rtp_cluster == None: clim.send('ERROR: %s: cluster not found\n' % parts[1]) return False clim.send('Active members of the cluster #%d:\n' % idx) ridx = 0 for rtpp in rtp_cluster.active: if ridx > 0: clim.send('\n') clim.send(' RTPproxy: #%d\n' % ridx) clim.send(' name = %s\n' % rtpp.name) clim.send(' address = %s\n' % str(rtpp.address)) if rtpp.wan_address != None: clim.send(' wan_address = %s\n' % rtpp.wan_address) if rtpp.lan_address != None: clim.send(' lan_address = %s\n' % rtpp.lan_address) if rtpp.cmd_out_address != None: clim.send(' cmd_out_address = %s\n' % rtpp.cmd_out_address) clim.send(' weight = %d\n' % rtpp.weight) clim.send(' capacity = %d\n' % rtpp.capacity) clim.send(' state = ') if rtpp.online: clim.send('online\n') clim.send(' active sessions = ') if rtpp.active_sessions == None: clim.send('UNKNOWN\n') else: clim.send('%d\n' % rtpp.active_sessions) clim.send(' capacity utilization = %f%%\n' % (rtpp.get_caputil() * 100.0)) clim.send(' average rtpc delay = %f sec\n' % rtpp.get_rtpc_delay()) else: clim.send('offline\n') clim.send(' status = %s\n' % rtpp.status) ridx += 1 clim.send('\nInactive members of the cluster #%d:\n' % idx) ridx = 0 for rtpp in rtp_cluster.pending: if ridx > 0: clim.send('\n') clim.send(' RTPproxy: #%d\n' % ridx) clim.send(' name = %s\n' % rtpp.name) clim.send(' address = %s\n' % str(rtpp.address)) if rtpp.wan_address != None: clim.send(' wan_address = %s\n' % rtpp.wan_address) if rtpp.lan_address != None: clim.send(' lan_address = %s\n' % rtpp.lan_address) if rtpp.cmd_out_address != None: clim.send(' cmd_out_address = %s\n' % rtpp.cmd_out_address) clim.send(' weight = %d\n' % rtpp.weight) clim.send(' capacity = %d\n' % rtpp.capacity) clim.send(' state = ') if rtpp.online: clim.send('online\n') else: clim.send('offline\n') ridx += 1 if ridx == 0: clim.send('\n') clim.send('OK\n') return False if cmd.startswith('modify'): parts = cmd.split(None, 4) rtp_cluster, idx = self.cluster_by_name(parts[1]) if rtp_cluster == None: clim.send('ERROR: %s: cluster not found\n' % parts[1]) return False if parts[2] == 'add': kvs = parts[3].split(',') rtpp_config = dict([x.split('=') for x in kvs]) rtpp, idx = rtp_cluster.rtpp_by_name(rtpp_config['name']) if rtpp != None: clim.send('ERROR: %s: RTPproxy already exists\n' % rtpp_config['name']) return False if rtpp_config['protocol'] not in ('unix', 'udp'): raise Exception( 'Unsupported RTPproxy protocol: "%s"' % rtpp_config['protocol']) if rtpp_config['protocol'] == 'udp': address = rtpp_config['address'].split(':', 1) if len(address) == 1: address.append(22222) else: address[1] = int(address[1]) address = tuple(address) else: address = rtpp_config['address'] if rtpp_config.has_key('cmd_out_address'): bind_address = rtpp_config['cmd_out_address'] else: bind_address = None rtpp = Rtp_cluster_member( rtpp_config['name'], global_config, address, bind_address) if rtpp_config.has_key('wan_address'): rtpp.wan_address = rtpp_config['wan_address'] if rtpp_config.has_key('lan_address'): rtpp.lan_address = rtpp_config['lan_address'] rtpp.weight = int(rtpp_config['weight']) rtpp.capacity = int(rtpp_config['capacity']) rtp_cluster.add_member(rtpp) clim.send('OK\n') return False if parts[2] in ('remove', 'delete', 'pause', 'resume'): rtpp, idx = rtp_cluster.rtpp_by_name(parts[3]) if rtpp == None: clim.send('ERROR: %s: RTPproxy not found\n' % parts[3]) return False if parts[2] in ('remove', 'delete'): rtp_cluster.bring_down(rtpp) elif parts[2] == 'pause': rtpp.status = 'SUSPENDED' elif parts[2] == 'resume': rtpp.status = 'ACTIVE' clim.send('OK\n') return False if cmd in ('h', 'help'): clim.send('Supported commands:\n' '\tls [CLUSTER_NAME]\n' '\tmodify CLUSTER_NAME [add|remove|delete|pause|resume] ARGS\n' '\treload\n' '\tquit\n') return False if cmd in ('q', 'quit', 'exit'): clim.close() return False if cmd.startswith('reload'): f = open(self.global_config['conffile']) config = read_cluster_config(self.global_config, f.read()) new_rtp_clusters = [] new_rtpps_count = 0 for c in config: rtp_cluster, idx = self.cluster_by_name(c['name']) if rtp_cluster == None: rtp_cluster = Rtp_cluster(global_config, c['name'], c['address'], dnconfig=c.get('dnconfig', None)) else: rtp_cluster.update_dnrelay(c.get('dnconfig', None)) rtp_cluster.capacity_limit_soft = c.get( 'capacity_limit_soft', True) new_rtpps = [] for rtpp_config in c['rtpproxies']: #Rtp_cluster_member('rtpproxy1', global_config, ('127.0.0.1', 22222)) if rtpp_config['protocol'] not in ('unix', 'udp'): raise Exception( 'Unsupported RTPproxy protocol: "%s"' % rtpp_config['protocol']) if rtpp_config['protocol'] == 'udp': address = rtpp_config['address'].split(':', 1) if len(address) == 1: address.append(22222) else: address[1] = int(address[1]) address = tuple(address) else: address = rtpp_config['address'] rtpp, idx = rtp_cluster.rtpp_by_name(rtpp_config['name']) if rtpp == None: if rtpp_config.has_key('cmd_out_address'): bind_address = rtpp_config['cmd_out_address'] else: bind_address = None rtpp = Rtp_cluster_member( rtpp_config['name'], global_config, address, bind_address) rtpp.weight = rtpp_config['weight'] rtpp.capacity = rtpp_config['capacity'] if rtpp_config.has_key('wan_address'): rtpp.wan_address = rtpp_config['wan_address'] if rtpp_config.has_key('lan_address'): rtpp.lan_address = rtpp_config['lan_address'] rtp_cluster.add_member(rtpp) else: if rtpp_config.has_key('cmd_out_address'): rtpp.cmd_out_address = rtpp_config['cmd_out_address'] else: rtpp.cmd_out_address = None rtpp.reconnect(address) rtpp.weight = rtpp_config['weight'] rtpp.capacity = rtpp_config['capacity'] if rtpp_config.has_key('wan_address'): rtpp.wan_address = rtpp_config['wan_address'] else: rtpp.wan_address = None if rtpp_config.has_key('lan_address'): rtpp.lan_address = rtpp_config['lan_address'] else: rtpp.lan_address = None new_rtpps.append(rtpp) new_rtpps_count += len(new_rtpps) for rtpp in [x for x in rtp_cluster.all_members() if x not in new_rtpps]: rtp_cluster.bring_down(rtpp) new_rtp_clusters.append(rtp_cluster) for rtp_cluster in [x for x in self.rtp_clusters if x not in new_rtp_clusters]: rtp_cluster.shutdown() self.rtp_clusters = new_rtp_clusters clim.send('Loaded %d clusters and %d RTP proxies\n' % (len(self.rtp_clusters), new_rtpps_count)) clim.send('OK\n') return False if cmd.startswith('objstats'): parts = cmd.split(None, 2) if len(parts) > 1: limit = int(parts[1]) else: limit = 20 stats = sorted(typestats().items(), key=operator.itemgetter(1), reverse=True) stats = stats[:limit] width = max(len(name) for name, count in stats) for name, count in stats[:limit]: clim.send('\t%s %d\n' % (name.ljust(width), count)) return False clim.send('ERROR: unknown command\n') return False
def receive_command(self, clim, cmd): if cmd.startswith('ls'): parts = cmd.split(None, 1) if len(parts) == 1: idx = 0 for rtp_cluster in self.rtp_clusters: nonline = len(rtp_cluster.active) nsuspended = len([ x for x in rtp_cluster.active if x.status == 'SUSPENDED' ]) ndraining = len([ x for x in rtp_cluster.active if x.status == 'DRAINING' ]) if idx > 0: clim.send('\n') clim.send('Cluster: #%d\n' % idx) clim.send(' name = %s\n' % rtp_cluster.name) clim.send(' address = %s\n' % str(rtp_cluster.address)) clim.send(' online members = %d (%d active, %d suspended, %d draining)\n' % \ (nonline, nonline - nsuspended - ndraining, nsuspended, \ ndraining)) clim.send(' offline members = %d\n' % len(rtp_cluster.pending)) idx += 1 else: rtp_cluster, idx = self.cluster_by_name(parts[1]) if rtp_cluster == None: clim.send('ERROR: %s: cluster not found\n' % parts[1]) return False clim.send('Online members of the cluster #%d:\n' % idx) ridx = 0 for rtpp in sorted(rtp_cluster.active, key=lambda x: x.name): if ridx > 0: clim.send('\n') clim.send(' RTPproxy: #%d\n' % ridx) clim.send(' name = %s\n' % rtpp.name) clim.send(' address = %s\n' % str(rtpp.address)) if rtpp.wan_address != None: clim.send(' wan_address = %s\n' % rtpp.wan_address) if rtpp.lan_address != None: clim.send(' lan_address = %s\n' % rtpp.lan_address) if rtpp.cmd_out_address != None: clim.send(' cmd_out_address = %s\n' % rtpp.cmd_out_address) clim.send(' weight = %d\n' % rtpp.weight) clim.send(' capacity = %d\n' % rtpp.capacity) clim.send(' state = ') if rtpp.online: clim.send('online\n') clim.send(' active sessions = ') if rtpp.active_sessions == None: clim.send('UNKNOWN\n') else: clim.send('%d\n' % rtpp.active_sessions) clim.send(' capacity utilization = %f%%\n' % (rtpp.get_caputil() * 100.0)) clim.send(' average rtpc delay = %f sec\n' % rtpp.get_rtpc_delay()) else: clim.send('offline\n') clim.send(' status = %s\n' % rtpp.status) ridx += 1 clim.send('\nOffline members of the cluster #%d:\n' % idx) ridx = 0 for rtpp in rtp_cluster.pending: if ridx > 0: clim.send('\n') clim.send(' RTPproxy: #%d\n' % ridx) clim.send(' name = %s\n' % rtpp.name) clim.send(' address = %s\n' % str(rtpp.address)) if rtpp.wan_address != None: clim.send(' wan_address = %s\n' % rtpp.wan_address) if rtpp.lan_address != None: clim.send(' lan_address = %s\n' % rtpp.lan_address) if rtpp.cmd_out_address != None: clim.send(' cmd_out_address = %s\n' % rtpp.cmd_out_address) clim.send(' weight = %d\n' % rtpp.weight) clim.send(' capacity = %d\n' % rtpp.capacity) clim.send(' state = ') if rtpp.online: clim.send('online\n') else: clim.send('offline\n') ridx += 1 if ridx == 0: clim.send('\n') clim.send('OK\n') return False if cmd.startswith('modify'): parts = cmd.split(None, 4) rtp_cluster, idx = self.cluster_by_name(parts[1]) if rtp_cluster == None: clim.send('ERROR: %s: cluster not found\n' % parts[1]) return False if parts[2] == 'add': kvs = parts[3].split(',') rtpp_config = dict([x.split('=') for x in kvs]) rtpp, idx = rtp_cluster.rtpp_by_name(rtpp_config['name']) if rtpp != None: clim.send('ERROR: %s: RTPproxy already exists\n' % rtpp_config['name']) return False if rtpp_config['protocol'] not in ('unix', 'udp', 'udp6'): raise Exception('Unsupported RTPproxy protocol: "%s"' % rtpp_config['protocol']) if rtpp_config['protocol'] in ('udp', 'udp6'): address = rtpp_config['address'].rsplit(':', 1) if len(address) == 1: address.append(22222) else: address[1] = int(address[1]) address = tuple(address) if rtpp_config['protocol'] == 'udp': family = AF_INET else: family = AF_INET6 else: address = rtpp_config['address'] family = AF_UNIX if rtpp_config.has_key('cmd_out_address'): bind_address = rtpp_config['cmd_out_address'] else: bind_address = None rtpp = Rtp_cluster_member(rtpp_config['name'], self.global_config, \ address, bind_address, family = family) if rtpp_config.has_key('wan_address'): rtpp.wan_address = rtpp_config['wan_address'] if rtpp_config.has_key('lan_address'): rtpp.lan_address = rtpp_config['lan_address'] rtpp.weight = int(rtpp_config['weight']) rtpp.capacity = int(rtpp_config['capacity']) rtp_cluster.add_member(rtpp) clim.send('OK\n') return False if parts[2] in ('remove', 'delete', 'pause', 'resume'): rtpp, idx = rtp_cluster.rtpp_by_name(parts[3]) if rtpp == None: clim.send('ERROR: %s: RTPproxy not found\n' % parts[3]) return False if parts[2] in ('remove', 'delete'): rtp_cluster.bring_down(rtpp) elif parts[2] == 'pause': rtpp.status = 'SUSPENDED' elif parts[2] == 'resume': rtpp.status = 'ACTIVE' clim.send('OK\n') return False if cmd in ('h', 'help'): clim.send('Supported commands:\n' \ '\tls [CLUSTER_NAME]\n' \ '\tmodify CLUSTER_NAME [add|remove|delete|pause|resume] ARGS\n' \ '\treload\n' \ '\tquit\n') return False if cmd in ('q', 'quit', 'exit'): clim.close() return False if cmd.startswith('reload'): f = open(self.global_config['conffile']) config = read_cluster_config(self.global_config, f.read()) new_rtp_clusters = [] new_rtpps_count = 0 for c in config: rtp_cluster, idx = self.cluster_by_name(c['name']) if rtp_cluster == None: rtp_cluster = Rtp_cluster(self.global_config, c['name'], c['address'], \ dnconfig = c.get('dnconfig', None)) else: rtp_cluster.update_dnrelay(c.get('dnconfig', None)) rtp_cluster.capacity_limit_soft = c.get( 'capacity_limit_soft', True) new_rtpps = [] for rtpp_config in c['rtpproxies']: #Rtp_cluster_member('rtpproxy1', self.global_config, ('127.0.0.1', 22222)) if rtpp_config['protocol'] not in ('unix', 'udp', 'udp6'): raise Exception('Unsupported RTPproxy protocol: "%s"' % rtpp_config['protocol']) if rtpp_config['protocol'] in ('udp', 'udp6'): address = rtpp_config['address'].rsplit(':', 1) if len(address) == 1: address.append(22222) else: address[1] = int(address[1]) address = tuple(address) if rtpp_config['protocol'] == 'udp': family = AF_INET else: family = AF_INET6 else: address = rtpp_config['address'] family = AF_UNIX rtpp, idx = rtp_cluster.rtpp_by_name(rtpp_config['name']) if rtpp == None: if rtpp_config.has_key('cmd_out_address'): bind_address = rtpp_config['cmd_out_address'] else: bind_address = None rtpp = Rtp_cluster_member(rtpp_config['name'], self.global_config, \ address, bind_address, family = family) rtpp.weight = rtpp_config['weight'] rtpp.capacity = rtpp_config['capacity'] if rtpp_config.has_key('wan_address'): rtpp.wan_address = rtpp_config['wan_address'] if rtpp_config.has_key('lan_address'): rtpp.lan_address = rtpp_config['lan_address'] rtpp.status = rtpp_config['status'].upper() rtp_cluster.add_member(rtpp) else: if rtpp_config.has_key('cmd_out_address'): rtpp.cmd_out_address = rtpp_config[ 'cmd_out_address'] else: rtpp.cmd_out_address = None rtpp.reconnect(address) rtpp.weight = rtpp_config['weight'] rtpp.capacity = rtpp_config['capacity'] if rtpp_config.has_key('wan_address'): rtpp.wan_address = rtpp_config['wan_address'] else: rtpp.wan_address = None if rtpp_config.has_key('lan_address'): rtpp.lan_address = rtpp_config['lan_address'] else: rtpp.lan_address = None rtpp.status = rtpp_config['status'].upper() new_rtpps.append(rtpp) new_rtpps_count += len(new_rtpps) for rtpp in [ x for x in rtp_cluster.all_members() if x not in new_rtpps ]: rtp_cluster.bring_down(rtpp) new_rtp_clusters.append(rtp_cluster) for rtp_cluster in [ x for x in self.rtp_clusters if x not in new_rtp_clusters ]: rtp_cluster.shutdown() self.rtp_clusters = new_rtp_clusters clim.send('Loaded %d clusters and %d RTP proxies\n' % (len(self.rtp_clusters), new_rtpps_count)) clim.send('OK\n') return False if cmd.startswith('objstats'): parts = cmd.split(None, 2) if len(parts) > 1: limit = int(parts[1]) else: limit = 20 stats = sorted(typestats().items(), key=operator.itemgetter(1), reverse=True) stats = stats[:limit] width = max(len(name) for name, count in stats) for name, count in stats[:limit]: clim.send('\t%s %d\n' % (name.ljust(width), count)) return False clim.send('ERROR: unknown command\n') return False