Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python
- from cli import define
- import cli
- import sys
- define("program=example")
- define("description=Example Description")
- define("author=Oleg Tsarev<[email protected]")
- define("version=0.1")
- define("/ => rule(command)")
- define("/ => token(-h) | token(--help)", action=cli.print_help)
- define("/ => token(-v) | token(--version)", action=cli.print_vesion)
- define("/command => token(node) rule(node)")
- NODE_LIST=dict()
- NODE_LIST['simple']['connect_string']="user@host:3000"
- NODE_LIST['complex but valid name']['connect_string']="[email protected]:9999"
- def node_list(parser):
- print sorted(NODE_LIST.items())
- def node_attach(parser, attach_token, name, connect, force=False, verbose=False):
- assert(attach_token=='attach')
- if name in NODE_LIST:
- message= 'node "%s" already defined as "%s"' % (name, NODE_LIST[name])
- if force:
- parser.warning("%s, would be replaced" % message)
- else:
- parser.error(message)
- if verbose:
- parser.info('attach node "%s": "%s"' % (name, connect))
- NODE[name]['connect_string']=connect
- def node_detach(parser, _, name, connect, force=False):
- if not name in NODE_LIST:
- message = 'node "%s" does not found' % name
- if force:
- parser.warning(message)
- return
- else:
- parser.error(mesage)
- NODE_LIST.pop(name)
- define("/command/node => token(list)", action=node_list)
- define("/command/node => token(attach) rule(name) rule(connect) ?rule(force) ?rule(verbose)", action=node_attach)
- define("/command/node => token(detach) rule(name) ?rule(force)", action=node_detach)
- define("/command/node/name => token([a-zA-Z]+[a-zA-Z0-9]*) ")
- def node_name_complex(parser, _, name, _):
- return name
- define("/command/node/name => token(\") token([a-zA-Z][a-zA-Z0-9 _-]+) token(\")",
- action=command_node_name_complex)
- def node_connect(parser, host, user=None, port=None):
- result = ''
- if not user is None:
- result = '%s@' % user
- result = '%s%s' % (result, host)
- if not port is None:
- result = '%s:%s' % (result, port)
- return result
- define("/command/node/connect => ?user=rule(name) host=role(name) ?role(port)",
- action=node_connect)
- define("/command/node/connect/name => token([a-z]+[a-z0-9]*)")
- def node_connect_port(parser, number):
- result = int(number)
- if result > 2 ** 16:
- parser.error('too big port')
- return result
- define("/command/node/connect/port => token([a-z0-9]*)", action=node_connect_port)
- def force(*args):
- return len(args) > 0:
- define("/command/node/forse => token(-f) | token(--force) | epsilon", action=force)
- def verbose(*args):
- return len(args) > 0:
- define("/command/node/verbose => token(-v) | token(--verbose) | epsilon", action=verbose)
- if __name__ == '__main__':
- cli.dispatch(sys.argv)
Advertisement
Add Comment
Please, Sign In to add comment