2017-10-14 17:25:24 +02:00
|
|
|
from abc import ABCMeta, abstractmethod
|
|
|
|
|
import argparse
|
|
|
|
|
import os
|
|
|
|
|
import sys
|
|
|
|
|
import inspect
|
|
|
|
|
import re
|
2017-10-29 18:25:55 +01:00
|
|
|
import importlib
|
2017-10-14 17:25:24 +02:00
|
|
|
|
|
|
|
|
import Object
|
2017-10-16 12:23:24 +02:00
|
|
|
import log
|
2017-10-14 17:25:24 +02:00
|
|
|
|
|
|
|
|
class Cmd(Object.Object): # export
|
|
|
|
|
|
|
|
|
|
__metaclass__=ABCMeta
|
|
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
|
def run(self, args):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
def __init__(self, name, help):
|
|
|
|
|
self.name = name
|
|
|
|
|
self.help = help
|
|
|
|
|
|
|
|
|
|
def _run(self, args):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
def add_parser(self, parsers):
|
|
|
|
|
r = parsers.add_parser(self.name, help=self.help,
|
|
|
|
|
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
|
|
|
|
|
r.set_defaults(func=self.run)
|
|
|
|
|
return r
|
|
|
|
|
|
2017-10-29 18:25:55 +01:00
|
|
|
def run_sub_commands(description = '', filter = '^Cmd.*', modules=None): # export
|
2017-10-14 17:25:24 +02:00
|
|
|
|
|
|
|
|
parser = argparse.ArgumentParser(usage=os.path.basename(sys.argv[0]) + ' [command] [options]',
|
|
|
|
|
formatter_class=argparse.ArgumentDefaultsHelpFormatter, description=description)
|
|
|
|
|
parser.add_argument('--log-level', help='Log level', default='notice')
|
2017-10-25 10:06:29 +02:00
|
|
|
parser.add_argument('--log-flags', help='Log flags', default='stderr,position,prio,color')
|
2017-10-14 17:25:24 +02:00
|
|
|
subparsers = parser.add_subparsers(title='Available commands', metavar='')
|
|
|
|
|
|
2017-10-29 18:25:55 +01:00
|
|
|
if modules == None:
|
|
|
|
|
modules = [ '__main__' ]
|
|
|
|
|
for m in modules:
|
|
|
|
|
if m != '__main__':
|
|
|
|
|
importlib.import_module(m)
|
|
|
|
|
for name, c in inspect.getmembers(sys.modules[m], inspect.isclass):
|
|
|
|
|
if not re.match(filter, name):
|
|
|
|
|
continue
|
|
|
|
|
if inspect.isabstract(c):
|
|
|
|
|
continue
|
|
|
|
|
c().add_parser(subparsers)
|
|
|
|
|
args = parser.parse_args()
|
2017-10-16 12:23:24 +02:00
|
|
|
log.set_level(args.log_level)
|
2017-10-25 10:06:29 +02:00
|
|
|
log.set_flags(args.log_flags)
|
2017-10-29 18:25:55 +01:00
|
|
|
|
2017-10-14 17:25:24 +02:00
|
|
|
args.func(args)
|