3 from __future__ import print_function
11 log.set_logger('gkeyldap')
12 from gkeys.log import logger
14 from gkeys.config import GKeysConfig, GKEY
15 from gkeys.seed import Seeds
16 from gkeyldap.search import (LdapSearch, UID, gkey2ldap_map, gkey2SEARCH)
19 # set debug level to min
30 def get_key_ids(key, info):
31 '''Small utility function to return only keyid (short)
34 @param key: string, the key lenght desired
35 @param info: list of keysid's to process
36 @return list of the desired key lengh id's
40 if x.startswith('0x'):
41 mylen = KEY_LEN[key] + 2
50 '''Main command line interface class'''
53 def __init__(self, root=None, config=None, print_results=True):
54 """ Main class init function.
56 @param root: string, root path to use
58 self.root = root or "/"
59 self.config = config or GKeysConfig(root=root)
60 self.print_results = print_results
65 def __call__(self, args=None):
67 self.run(self.parse_args(args))
69 self.run(self.parse_args(sys.argv[1:]))
72 def parse_args(self, args):
73 '''Parse a list of aruments
76 @returns argparse.Namespace object
78 #logger.debug('MAIN: parse_args; args: %s' % args)
79 actions = ['ldapsearch', 'updateseeds']
80 parser = argparse.ArgumentParser(
82 description='Gentoo-keys manager program',
83 epilog='''Caution: adding untrusted keys to these keyrings can
84 be hazardous to your system!''')
86 parser.add_argument('action', choices=actions, nargs='?',
87 default='ldapsearch', help='Search ldap or update the seed file')
89 parser.add_argument('-c', '--config', dest='config', default=None,
90 help='The path to an alternate config file')
91 parser.add_argument('-d', '--dest', dest='destination', default=None,
92 help='The destination db file path')
93 parser.add_argument('-N', '--name', dest='name', default=None,
94 help='The name to search for')
95 parser.add_argument('-n', '--nick', dest='nick', default=None,
96 help='The nick or user id (uid) to search for')
97 parser.add_argument('-m', '--mail', dest='mail', default=None,
98 help='The email address to search for')
99 parser.add_argument('-k', '--keyid', dest='keyid', default=None,
100 help='The gpg keyid to search for')
101 parser.add_argument('-f', '--fingerprint', dest='fingerprint', default=None,
102 help='The gpg fingerprint to search for')
103 parser.add_argument('-S', '--status', default=False,
104 help='The seedfile path to use')
105 parser.add_argument('-D', '--debug', default=0,
106 help='The logging level to use and report with')
108 return parser.parse_args(args)
112 '''Run the args passed in
114 @param args: list or argparse.Namespace object
117 logger.error("Main: run; invalid args argument passed in")
118 if isinstance(args, list):
119 args = self.parse_args(args)
121 logger.setLevel(int(args.debug))
122 logger.debug("MAIN: run; Found alternate debug setting: %s" % str(args.debug))
124 logger.debug("Main: run; Found alternate config request: %s"
126 self.config.defaults['config'] = args.config
127 # now make it load the config file
128 self.config.read_config()
130 func = getattr(self, '_action_%s' % args.action)
131 logger.debug('Main: run; Found action: %s' % args.action)
136 def _action_ldapsearch(self, args):
139 print("Aborting Search...Connection failed")
141 logger.debug("MAIN: _action_ldapsearch; args = %s" % str(args))
142 x, target, search_field = self.get_args(args)
143 results = l.search(target, search_field)
144 devs = l.result2dict(results, gkey2ldap_map[x])
145 for dev in sorted(devs):
146 print(dev, devs[dev])
147 print("============================================")
148 print("Total number of devs in results:", len(devs))
152 def _action_updateseeds(self, args):
153 print("Beginning ldap search...")
156 print("Aborting Update...Connection failed")
158 results = l.search('*', UID)
159 info = l.result2dict(results, 'uid')
161 "MAIN: _action_updateseeds; got results :) converted to info")
162 if not self.create_seedfile(info):
163 logger.error("Dev seed file update failure: "
164 "Original seed file is intact & untouched.")
165 old = self.config['dev-seedfile'] + '.old'
167 print("Backing up existing file...")
168 if os.path.exists(old):
170 "MAIN: _action_updateseeds; Removing 'old' seed file: %s"
173 if os.path.exists(self.config['dev-seedfile']):
175 "MAIN: _action_updateseeds; Renaming current seed file to: "
177 os.rename(self.config['dev-seedfile'], old)
179 "MAIN: _action_updateseeds; Renaming '.new' seed file to: %s"
180 % self.config['dev-seedfile'])
181 os.rename(self.config['dev-seedfile'] + '.new',
182 self.config['dev-seedfile'])
185 print("Developer Seed file updated")
189 def create_seedfile(self, devs):
190 print("Creating seeds from ldap data...")
191 filename = self.config['dev-seedfile'] + '.new'
192 self.seeds = Seeds(filename)
194 for dev in sorted(devs):
195 if devs[dev]['gentooStatus'][0] not in ['active']:
197 #logger.debug("create_seedfile, dev = "
198 # "%s, %s" % (str(dev), str(devs[dev])))
199 new_gkey = GKEY._make(self.build_gkeylist(devs[dev]))
200 self.seeds.add(new_gkey)
202 print("Total number of seeds created:", count)
203 print("Seeds created...saving file: %s" % filename)
204 return self.seeds.save()
209 for x in ['nick', 'name', 'gpgkey', 'fingerprint', 'status']:
211 target = getattr(args, x)
212 search_field = gkey2SEARCH[x]
214 return (x, target, search_field)
218 def build_gkeydict(info):
220 for x in GKEY._fields:
221 field = gkey2ldap_map[x]
226 if values and values in ['uid', 'cn' ]:
238 def build_gkeylist(info):
240 #logger.debug("MAIN: build_gkeylist; info = %s" % str(info))
241 for x in GKEY._fields:
242 field = gkey2ldap_map[x]
248 # strip errant line feeds
249 values = [x.strip('\n') for x in values]
250 if values and field in ['uid', 'cn' ]:
251 value = values[0].strip('\n')
252 # separate out short/long key id's
253 elif values and x in ['keyid', 'longkeyid']:
254 value = get_key_ids(x, values)
257 if 'undefined' in values:
258 logger.error('%s = "undefined" for %s, %s'
259 %(field, info['uid'][0], info['cn'][0]))
260 keyinfo.append(value)
262 logger.error("Missing %s (%s) for %s, %s"
263 %(field, x, info['uid'][0], info['cn'][0]))