summaryrefslogtreecommitdiffstats
path: root/ipalib/frontend.py
diff options
context:
space:
mode:
authorRob Crittenden <rcritten@redhat.com>2009-11-04 15:56:43 -0500
committerJason Gerard DeRose <jderose@redhat.com>2009-11-17 09:40:56 -0700
commit55c62ac79af235b75f969434aba775c4a8c30274 (patch)
tree381c3afe13d0045f932252e5fcf294ca2384b241 /ipalib/frontend.py
parent680bf7c54863452263b9cd324ede444fd438436d (diff)
downloadfreeipa-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.py45
1 files changed, 45 insertions, 0 deletions
diff --git a/ipalib/frontend.py b/ipalib/frontend.py
index b13ffed4..e257a0a2 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).