Move some ticket-independent tag replacements from ActionInfo to ADD_REPL_TAGS (will be wrapped in replaceTag into calling map).

Thus tags `<fq-hostname>` and `<sh-hostname>` could be used without ticket (a. g. in `actionstart` etc.).
Closes gh-1859.
pull/1866/head
sebres 7 years ago
parent 28076618fd
commit d1de20dd41

@ -33,7 +33,7 @@ from abc import ABCMeta
from collections import MutableMapping from collections import MutableMapping
from .failregex import mapTag2Opt from .failregex import mapTag2Opt
from .ipdns import asip from .ipdns import asip, DNSUtils
from .mytime import MyTime from .mytime import MyTime
from .utils import Utils from .utils import Utils
from ..helpers import getLogger, _merge_copy_dicts, substituteRecursiveTags, TAG_CRE, MAX_TAG_REPLACE_COUNT from ..helpers import getLogger, _merge_copy_dicts, substituteRecursiveTags, TAG_CRE, MAX_TAG_REPLACE_COUNT
@ -52,11 +52,18 @@ FCUSTAG_CRE = re.compile(r'<F-([A-Z0-9_\-]+)>'); # currently uppercase only
CONDITIONAL_FAM_RE = re.compile(r"^(\w+)\?(family)=") CONDITIONAL_FAM_RE = re.compile(r"^(\w+)\?(family)=")
# Special tags:
DYN_REPL_TAGS = {
# System-information:
"fq-hostname": lambda: str(DNSUtils.getHostname(fqdn=True)),
"sh-hostname": lambda: str(DNSUtils.getHostname(fqdn=False))
}
# New line, space # New line, space
ADD_REPL_TAGS = { ADD_REPL_TAGS = {
"br": "\n", "br": "\n",
"sp": " " "sp": " "
} }
ADD_REPL_TAGS.update(DYN_REPL_TAGS)
class CallingMap(MutableMapping, object): class CallingMap(MutableMapping, object):
@ -571,6 +578,8 @@ class CommandAction(ActionBase):
if csubkey is not None: if csubkey is not None:
cache[csubkey] = subInfo cache[csubkey] = subInfo
# additional replacement as calling map:
ADD_REPL_TAGS_CM = CallingMap(ADD_REPL_TAGS)
# substitution callable, used by interpolation of each tag # substitution callable, used by interpolation of each tag
def substVal(m): def substVal(m):
tag = m.group(1) # tagname from match tag = m.group(1) # tagname from match
@ -581,7 +590,7 @@ class CommandAction(ActionBase):
value = subInfo.get(tag) value = subInfo.get(tag)
if value is None: if value is None:
# fallback (no or default replacement) # fallback (no or default replacement)
return ADD_REPL_TAGS.get(tag, m.group()) return ADD_REPL_TAGS_CM.get(tag, m.group())
value = str(value) # assure string value = str(value) # assure string
if tag in cls._escapedTags: if tag in cls._escapedTags:
# That one needs to be escaped since its content is # That one needs to be escaped since its content is
@ -651,6 +660,8 @@ class CommandAction(ActionBase):
# replacement for tag: # replacement for tag:
return value return value
# additional replacement as calling map:
ADD_REPL_TAGS_CM = CallingMap(ADD_REPL_TAGS)
# substitution callable, used by interpolation of each tag # substitution callable, used by interpolation of each tag
def substVal(m): def substVal(m):
tag = m.group(1) # tagname from match tag = m.group(1) # tagname from match
@ -658,7 +669,7 @@ class CommandAction(ActionBase):
value = aInfo[tag] value = aInfo[tag]
except KeyError: except KeyError:
# fallback (no or default replacement) # fallback (no or default replacement)
return ADD_REPL_TAGS.get(tag, m.group()) return ADD_REPL_TAGS_CM.get(tag, m.group())
value = str(value) # assure string value = str(value) # assure string
# replacement for tag: # replacement for tag:
return escapeVal(tag, value) return escapeVal(tag, value)

@ -35,7 +35,6 @@ except ImportError:
OrderedDict = dict OrderedDict = dict
from .banmanager import BanManager from .banmanager import BanManager
from .ipdns import DNSUtils
from .jailthread import JailThread from .jailthread import JailThread
from .action import ActionBase, CommandAction, CallingMap from .action import ActionBase, CommandAction, CallingMap
from .mytime import MyTime from .mytime import MyTime
@ -306,10 +305,7 @@ class Actions(JailThread, Mapping):
"ipmatches": lambda self: "\n".join(self._mi4ip(True).getMatches()), "ipmatches": lambda self: "\n".join(self._mi4ip(True).getMatches()),
"ipjailmatches": lambda self: "\n".join(self._mi4ip().getMatches()), "ipjailmatches": lambda self: "\n".join(self._mi4ip().getMatches()),
"ipfailures": lambda self: self._mi4ip(True).getAttempt(), "ipfailures": lambda self: self._mi4ip(True).getAttempt(),
"ipjailfailures": lambda self: self._mi4ip().getAttempt(), "ipjailfailures": lambda self: self._mi4ip().getAttempt()
# system-information:
"fq-hostname": lambda self: DNSUtils.getHostname(fqdn=True),
"sh-hostname": lambda self: DNSUtils.getHostname(fqdn=False)
} }
__slots__ = CallingMap.__slots__ + ('__ticket', '__jail', '__mi4ip') __slots__ = CallingMap.__slots__ + ('__ticket', '__jail', '__mi4ip')
@ -368,7 +364,6 @@ class Actions(JailThread, Mapping):
def __getActionInfo(self, ticket): def __getActionInfo(self, ticket):
ip = ticket.getIP()
aInfo = Actions.ActionInfo(ticket, self._jail) aInfo = Actions.ActionInfo(ticket, self._jail)
return aInfo return aInfo

Loading…
Cancel
Save