예제 #1
0
 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
예제 #2
0
 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