gkeys/config.py: Add keyid property to GKEY
[gentoo-keys.git] / gkeyldap / cli.py
1 #
2 #-*- coding:utf-8 -*-
3
4 from __future__ import print_function
5
6
7 import sys
8 import argparse
9
10 from gkeys import log
11 from gkeys.log import log_levels, set_logger
12
13 from gkeys import config
14 from gkeys import seed
15
16 from gkeys.config import GKeysConfig
17 from gkeyldap import search
18 from gkeyldap.actions import Actions, Available_Actions
19 logger = log.logger
20
21
22 class Main(object):
23     '''Main command line interface class'''
24
25
26     def __init__(self, root=None, config=None, print_results=True):
27         """ Main class init function.
28
29         @param root: string, root path to use
30         @param config: optional GKeysConfig instance, For API use
31         @param print_results: optional boolean, for API use
32         """
33         self.root = root or "/"
34         self.config = config or GKeysConfig(root=root)
35         self.print_results = print_results
36         self.args = None
37         self.seeds = None
38
39
40     def __call__(self, args=None):
41         """Main class call function
42
43         @param args: Optional list of argumanets to parse and action to run
44                      Defaults to sys.argv[1:]
45         """
46         if args:
47             self.run(self.parse_args(args))
48         else:
49             self.run(self.parse_args(sys.argv[1:]))
50
51
52     def parse_args(self, args):
53         '''Parse a list of aruments
54
55         @param args: list
56         @returns argparse.Namespace object
57         '''
58         #logger.debug('MAIN: parse_args; args: %s' % args)
59         actions = Available_Actions
60         parser = argparse.ArgumentParser(
61             prog='gkeys',
62             description='Gentoo-keys manager program',
63             epilog='''Caution: adding untrusted keys to these keyrings can
64                 be hazardous to your system!''')
65         # actions
66         parser.add_argument('action', choices=actions, nargs='?',
67             default='ldapsearch', help='Search ldap or update the seed file')
68         # options
69         parser.add_argument('-c', '--config', dest='config', default=None,
70             help='The path to an alternate config file')
71         parser.add_argument('-d', '--dest', dest='destination', default=None,
72             help='The destination db file path')
73         parser.add_argument('-N', '--name', dest='name', default=None,
74             help='The name to search for')
75         parser.add_argument('-n', '--nick', dest='nick', default=None,
76             help='The nick or user id (uid) to search for')
77         parser.add_argument('-m', '--mail', dest='mail', default=None,
78             help='The email address to search for')
79         parser.add_argument('-k', '--keyid', dest='keyid', default=None,
80             help='The gpg keyid to search for')
81         parser.add_argument('-f', '--fingerprint', dest='fingerprint', default=None,
82             help='The gpg fingerprint to search for')
83         parser.add_argument('-S', '--status', default=False,
84             help='The seedfile path to use')
85         parser.add_argument('-D', '--debug', default='DEBUG',
86             choices=list(log_levels),
87             help='The logging level to set for the logfile')
88
89         return parser.parse_args(args)
90
91
92     def run(self, args):
93         '''Run the args passed in
94
95         @param args: list or argparse.Namespace object
96         '''
97         global logger
98         message = None
99         if not args:
100             message = "Main: run; invalid args argument passed in"
101         if isinstance(args, list):
102             args = self.parse_args(args)
103         if args.config:
104             self.config.defaults['config'] = args.config
105         # now make it load the config file
106         self.config.read_config()
107
108         # establish our logger and update it in the imported files
109         logger = set_logger('gkeyldap', self.config['logdir'], args.debug)
110         config.logger = logger
111         seed.logger = logger
112         search.logger = logger
113
114         if message:
115             logger.error(message)
116
117         # now that we have a logger, record the alternate config setting
118         if args.config:
119             logger.debug("Main: run; Found alternate config request: %s"
120                 % args.config)
121
122         # establish our actions instance
123         self.actions = Actions(self.config, print, logger)
124
125         logger.info("Begin running action: %s" % args.action)
126
127         # run the action
128         func = getattr(self.actions, '%s' % args.action)
129
130         logger.debug('Main: run; Found action: %s' % args.action)
131         results = func(args)
132         return results
133
134