diff options
author | Rob Crittenden <rcritten@redhat.com> | 2009-11-04 15:56:43 -0500 |
---|---|---|
committer | Jason Gerard DeRose <jderose@redhat.com> | 2009-11-17 09:40:56 -0700 |
commit | 55c62ac79af235b75f969434aba775c4a8c30274 (patch) | |
tree | 381c3afe13d0045f932252e5fcf294ca2384b241 /ipalib/frontend.py | |
parent | 680bf7c54863452263b9cd324ede444fd438436d (diff) | |
download | freeipa-55c62ac79af235b75f969434aba775c4a8c30274.tar.gz freeipa-55c62ac79af235b75f969434aba775c4a8c30274.tar.xz freeipa-55c62ac79af235b75f969434aba775c4a8c30274.zip |
Add support for setting/adding arbitrary attributes
This introduces 2 new params: --setattr and --addattr
Both take a name/value pair, ala:
ipa user-mod --setattr=postalcode=20601 jsmith
--setattr replaces or sets the current attribute to the value
--addattr adds the value to an attribute (or sets a new attribute)
OptionsParser allows multiple versions of this, so you can have multiple
setattr and addattr, either for the same attribute or for different
attributes.
ipa user-mod --addattr=postalcode=20601 --addattr=postalcode=30330 jsmith
Values are silent dropped if either of these on an existing param:
ipa user-mod --setattr=givenname=Jerry jsmith
Is a no-op.
Diffstat (limited to 'ipalib/frontend.py')
-rw-r--r-- | ipalib/frontend.py | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/ipalib/frontend.py b/ipalib/frontend.py index b13ffed42..e257a0a25 100644 --- a/ipalib/frontend.py +++ b/ipalib/frontend.py @@ -473,6 +473,34 @@ class Command(HasParam): kw = self.args_options_2_params(*args, **options) return dict(self.__attributes_2_entry(kw)) + def __convert_2_dict(self, attrs, append=True): + """ + Convert a string in the form of name/value pairs into + a dictionary. The incoming attribute may be a string or + a list. + + Any attribute found that is also a param is silently dropped. + + append controls whether this returns a list of values or a single + value. + """ + newdict = {} + if not type(attrs) in (list, tuple): + attrs = [attrs] + for a in attrs: + m = re.match("\s*(.*?)\s*=\s*(.*?)\s*$", a) + attr = str(m.group(1)).lower() + value = m.group(2) + if len(value) == 0: + # None means "delete this attribute" + value = None + if attr not in self.params: + if append and attr in newdict: + newdict[attr].append(value) + else: + newdict[attr] = [value] + return newdict + def __attributes_2_entry(self, kw): for name in self.params: if self.params[name].attribute and name in kw: @@ -482,6 +510,23 @@ class Command(HasParam): else: yield (name, kw[name]) + adddict = {} + if 'setattr' in kw: + adddict = self.__convert_2_dict(kw['setattr'], append=False) + + if 'addattr' in kw: + adddict.update(self.__convert_2_dict(kw['addattr'])) + + for name in adddict: + value = adddict[name] + if isinstance(value, list): + if len(value) == 1: + yield (name, value[0]) + else: + yield (name, [v for v in value]) + else: + yield (name, value) + def params_2_args_options(self, **params): """ Split params into (args, options). |