Exemple #1
0
def larch_server_cli():
    """command-line program to control larch XMLRPC server"""
    __version__ = 'version 2.2'
    usage = """usage: %prog [options] [start|stop|restart|next|status|report]

Commands:
   start       start server on specified port
   stop        stop server on specified port
   restart     restart server on specified port
   next        start server on next avaialable port (see also '-n' option)
   status      print a short status message: whether server is running on port
   report      print a multi-line status report
"""

    parser = OptionParser(usage=usage, prog="larch_server",
                          version="larch_server: %s" % __version__)
    parser.add_option("-p", "--port", dest="port", default='4966',
                      metavar='PORT', help="port number for server [4966]")
    parser.add_option("-q", "--quiet", dest="quiet", action="store_true",
                      default=False, help="suppress messaages [False]")
    parser.add_option("-n", "--next", dest="next", action="store_true",
                      default=False, help="show next available port, but do not start [False]")

    (options, args) = parser.parse_args()

    port = int(options.port)
    command = 'status'

    def smsg(port, txt):
        if not options.quiet:
            print('larch_server port=%i: %s' % (port, txt))

    if len(args) >  0:
        command = args[0].lower()

    if options.next:
        port = get_next_port(port=port)
        print("%i" % port)
        sys.exit(0)

    server_state = test_server(port=port)

    if command == 'start':
        if server_state == CONNECTED:
            smsg(port, 'already running')
        elif server_state == NOT_IN_USE:
            spawn_server(port=port)
            smsg(port, 'started')
        else:
            smsg(port, 'port is in use, cannot start')

    elif command == 'stop':
        if server_state == CONNECTED:
            ServerProxy('http://localhost:%d' % (port)).shutdown()
            smsg(port, 'stopped')

    elif command == 'next':
        port = get_next_port(port=port)
        spawn_server(port=port)
        smsg(port, 'started')

    elif command == 'restart':
        if server_state == CONNECTED:
            ServerProxy('http://localhost:%d' % (port)).shutdown()
            sleep(POLL_TIME)
        spawn_server(port=port)

    elif command == 'status':
        if server_state == CONNECTED:
            smsg(port, 'running')
            sys.exit(0)
        elif server_state == NOT_IN_USE:
            smsg(port, 'not running')
            sys.exit(1)
        else:
            smsg(port, 'port is in use by non-larch server')
    elif command == 'report':
        if server_state == CONNECTED:
            s = ServerProxy('http://localhost:%d' % (port))
            info = s.get_client_info()
            last_event = info.get('last_event', 0)
            last_used = ctime(last_event)
            serverid  = int(info.get('pid_server', 0))
            serverport= int(info.get('port', 0))
            procid    = int(info.get('pid', 0))
            appname   = info.get('app',     'unknown')
            machname  = info.get('machine', 'unknown')
            username  = info.get('user',    'unknown')
            keepalive_time = info.get('keepalive_time', -1)
            keepalive_time += (last_event - time())
            keepalive_units = 'seconds'
            if keepalive_time > 300:
                keepalive_time = keepalive_time/60.0
                keepalive_units = 'minutes'
            if keepalive_time > 300:
                keepalive_time = keepalive_time/60.0
                keepalive_units = 'hours'

            print('larch_server report:')
            print(' Client Machine Name = %s' % machname)
            print(' Client Process ID   = %s' % str(procid))
            print(' Client Application  = %s' % appname)
            print(' Client User Name    = %s' % username)
            print(' Client Last Used    = %s' % last_used)
            print(' Server Process ID   = %s' % serverid)
            print(' Server Port Number  = %s' % serverport)
            print(' Server will expire in  %i %s if not used.' % (keepalive_time,
                                                                  keepalive_units))

        elif server_state == NOT_IN_USE:
            smsg(port, 'not running')
            sys.exit(1)
        else:
            smsg(port, 'port is in use by non-larch server')

    else:
        print("larch_server: unknown command '%s'. Try -h" % command)