Browse Source

BF: Thanks to insights from Rogerio -- handle both aInfo and cInfo and replicate cmds if no key provided

_tent/ipv6_via_aInfo
Yaroslav Halchenko 14 years ago
parent
commit
b14257f27f
  1. 54
      server/action.py

54
server/action.py

@ -81,13 +81,13 @@ class Action:
# @param value the property value # @param value the property value
def setCInfo(self, key, value): def setCInfo(self, key, value):
if '/' in value: if '/' in key:
logSys.debug("Evaluating the value to dict") logSys.debug("Evaluating the value to dict")
try: try:
value = eval("dict(%s)" % value) value = eval("dict(%s)" % value)
except Exception, e: except Exception, e:
logSys.error("Failed to evaluate value %r for %s as dict" logSys.error("Failed to evaluate value dict(%s) for %s "
% (value, key)) "as dict due to %r" % (value, key, e))
logSys.debug("Set cinfo %s = %r" % (key, value)) logSys.debug("Set cinfo %s = %r" % (key, value))
self.__cInfo[key] = value self.__cInfo[key] = value
@ -247,28 +247,36 @@ class Action:
for tag in aInfo: for tag in aInfo:
# simple replacement string or a dictionary # simple replacement string or a dictionary
val = aInfo[tag] val = aInfo[tag]
subs = [(tag, val)] # by default just 1 substitution pair
if '/' in tag: if '/' in tag:
# dict Info and we should take after '/' as the key # dict Info and we should take after '/' as the key
# which would determine which actual tag to take from # which would determine which actual tag to take from
# aInfo # aInfo
tag_, key_tag = tag.split('/', 1) tag_, key_tag = tag.split('/', 1)
if not key_tag in aInfo:
logSys.error(
"Failed to find information for key tag %s among %s. "
"Tag %s was ignored" % (key_tag, aInfo.keys(), tag))
continue
if not isinstance(val, dict): if not isinstance(val, dict):
logSys.error("Tags defined as X/Y must contain dictionary " logSys.error("Tags defined as X/Y must contain dictionary "
"entries. Got %r. Tag %s was ignored" "entries. Got %r. Tag %s was ignored"
% (val, tag)) % (val, tag))
continue continue
if not aInfo[key_tag] in val: if not key_tag in aInfo:
logSys.error("There is no %s in %r. Tag %s was ignored" # Need to duplicate for all known and unique
% (aInfo[key_tag], val, tag)) logSys.debug(
continue "No information for key tag %s among %s. "
tag = tag_ # TODO: pylint would scream here I guess "Duplicating the string for all keys"
val = aInfo[tag][aInfo[key_tag]] % (key_tag, aInfo.keys()))
string = string.replace('<' + tag + '>', str(val)) subs = [(tag_, v) for v in val.itervalues()]
else:
# There is a key
if not aInfo[key_tag] in val:
logSys.error("There is no value for %s in %r. Tag %s was ignored"
% (aInfo[key_tag], val, tag))
continue
subs = [(tag_, val[aInfo[key_tag]])]
strings = [string.replace('<' + t + '>', str(v)) for t,v in subs]
# only unique, so we do not run the same command multiple times,
# if that tag wasn't even in place. anyways order of them is arbitrary
# due to arbitrary order of keys in a val dict above
string = '; '.join(list(set(strings)))
# New line # New line
string = string.replace("<br>", '\n') string = string.replace("<br>", '\n')
return string return string
@ -305,15 +313,15 @@ class Action:
if not Action.executeCmd(checkCmd): if not Action.executeCmd(checkCmd):
logSys.fatal("Unable to restore environment") logSys.fatal("Unable to restore environment")
return False return False
# Replace tags
if not aInfo == None:
realCmd = Action.replaceTag(cmd, aInfo)
else:
realCmd = cmd
# Replace static fields # Compose ultimate untagging dictionary with aInfo overriding
realCmd = Action.replaceTag(realCmd, self.__cInfo) # present in cInfo
allInfo = self.__cInfo.copy()
if aInfo:
allInfo.update(aInfo)
# Replace tags
realCmd = Action.replaceTag(cmd, allInfo)
return Action.executeCmd(realCmd) return Action.executeCmd(realCmd)

Loading…
Cancel
Save