}
);
+# -*- perl -*-
+
+push @ScripActions, (
+
+ { Name => 'Extract Custom Field Values', # loc
+ Description => 'extract cf-values out of a message', # loc
+ ExecModule => 'ExtractCustomFieldValues' },
+
+ { Name => 'Extract Custom Field Values With Code in Template', # loc
+ Description => 'extract cf-values out of a message with a Text::Template template', # loc
+ ExecModule => 'ExtractCustomFieldValuesWithCodeInTemplate' }
+
+);
+
+push @Templates, (
+ { Queue => '0',
+ Name => 'CustomFieldScannerExample', # loc
+ Description => 'Example Template for ExtractCustomFieldValues', # loc
+ Content => <<'EOTEXT'
+#### Syntax:
+# CF Name | Header name or "Body" | MatchString(re) | Postcmd | Options
+
+#### Allowed Options:
+
+# q - (quiet) Don't record a transaction for adding the custom field
+# value
+# * - (wildcard) The MatchString regex should contain _two_
+# capturing groups, the first of which is the CF name,
+# the second of which is the value. If this option is
+# given, the <cf-name> field is ignored.
+
+#### Examples:
+
+# 1. Put the content of the "X-MI-Test" header into the "testcf"
+# custom field:
+# testcf|X-MI-Test|.*
+
+# 2. Scan the body for Host:name and put name into the "bodycf" custom
+# field:
+# bodycf|Body|Host:\s*(\w+)
+
+# 3. Scan the "X-MI-IP" header for an IP-Adresse and get the hostname
+# by reverse-resolving it:
+# Hostname|X-MI-IP|\d+\.\d+\.\d+\.\d+|use Socket; ($value) = gethostbyaddr(inet_aton($value),AF_INET);
+
+# 4. scan the "CC" header for an many email addresses, and add them to
+# a custom field named "parsedCCs". If "parsedCCs" is a multivalue
+# CF, then this should yield separate values for all email adress
+# found.
+# parsedCCs|CC|.*|$value =~ s/^\s+//; $value =~ s/\s+$//;
+
+# 5. Looks for an "Email:" field in the body of the email, then loads
+# up that user and makes them privileged The blank first field
+# means the automatic CustomField setting is not invoked.
+# |Body|Email:\s*(.+)$|my $u = RT::User->new($RT::SystemUser); $u->LoadByEmail($value); $u->SetPrivileged(1)|
+
+# 6. Looks for any text of the form "Set CF Name: Value" in the body,
+# and sets the CF named "CF Name" to the given value, which may be
+# multi-line. The '*' option controls the wildcard nature of this
+# example.
+# Separator=!
+# !Body!^Set ([^\n:]*?):\s*((?s).*?)(?:\Z|\n\Z|\n\n)!!*
+
+# 7. Looks for the regex anywhere in the headers and stores the match
+# in the AllHeaderSearch CF
+# AllHeaderSearch|Headers|Site:\s*(\w+)
+
+# 8. If you need to dynamically build your matching, and want to trigger on headers and body
+# and invode some arbitrary code like example 5
+# Separator=~~
+# {
+# my $action = 'use My::Site; My::Site::SetSiteID( Ticket => $self->TicketObj, Site => $_ );';
+#
+# for my $regex (My::Site::ValidRegexps) {
+# for my $from ('headers', 'body') {
+# $OUT .= join '~~',
+# '', # CF name
+# $from,
+# $regex,
+# $action;
+# $OUT .= "\n";
+# }
+# }
+# }
+
+EOTEXT
+ }
+);
+
+1;