Docs: example complex expansion for router domains condition
authorJeremy Harris <jgh146exb@wizmail.org>
Thu, 7 Sep 2023 15:40:39 +0000 (16:40 +0100)
committerJeremy Harris <jgh146exb@wizmail.org>
Thu, 7 Sep 2023 15:40:39 +0000 (16:40 +0100)
doc/doc-docbook/spec.xfpt
test/aux-fixed/0403.accountfile [new file with mode: 0644]
test/confs/0403
test/log/0403
test/scripts/0000-Basic/0403
test/stderr/0403

index 04f2387cfb4e94371fa7eb655c82f952bb0dabb2..6ff06f3a47f97b39e3936b3bd084de71d51f159d 100644 (file)
@@ -19181,12 +19181,25 @@ This applies to all of the SRV, MX, AAAA, A lookup sequence.
 .cindex "router" "restricting to specific domains"
 .vindex "&$domain_data$&"
 If this option is set, the router is skipped unless the current domain matches
-the list. If the match is achieved by means of a file lookup, the data that the
-lookup returned for the domain is placed in &$domain_data$& for use in string
+the list.
+The data returned by the list check
+is placed in &$domain_data$& for use in string
 expansions of the driver's private options and in the transport.
 See section &<<SECTrouprecon>>& for
 a list of the order in which preconditions are evaluated.
 
+A complex example, using a file like:
+.code
+alice@dom1
+bill@dom1
+maggie@dom1
+.endd
+and checking both domain and local_part
+.code
+domains =         ${domain:${lookup {$local_part@$domain} lseach,ret=key {/path/to/accountsfile}}}
+local_parts = ${local_part:${lookup {$local_part@$domain} lseach,ret=key {/path/to/accountsfile}}}
+.endd
+
 
 
 .option driver routers string unset
@@ -19550,7 +19563,7 @@ example:
 local_parts = dbm;/usr/local/specials/$domain_data
 .endd
 .vindex "&$local_part_data$&"
-If the match is achieved by a lookup, the data that the lookup returned
+the data returned by the list check
 for the local part is placed in the variable &$local_part_data$& for use in
 expansions of the router's private options or in the transport.
 You might use this option, for
diff --git a/test/aux-fixed/0403.accountfile b/test/aux-fixed/0403.accountfile
new file mode 100644 (file)
index 0000000..8bfe645
--- /dev/null
@@ -0,0 +1,3 @@
+alice@dom1.ain
+bob@dom2.ain
+charlie@dom1.ain
index 26d1cd6fe99601711bc0202e913379889a93f3a4..4fe478b0915e5ee3a68ad619828680f1a9088c27 100644 (file)
@@ -14,13 +14,23 @@ qualify_domain = test.ex
 begin routers
 
 r1:
-  driver = redirect
-  domains = lsearch;DIR/aux-fixed/TESTNUM.data
-  local_parts = lsearch;DIR/aux-fixed/TESTNUM.data
-  address_data = ADDRESSDATA
-  file_transport = t1
-  data = DIR/test-mail/junk
-  router_home_directory = /usr
+  driver =             redirect
+  domains =                ${domain:${lookup {$local_part@$domain} lsearch,ret=key {DIR/aux-fixed/TESTNUM.accountfile}}}
+  local_parts =                ${local_part:${lookup {$local_part@$domain} lsearch,ret=key {DIR/aux-fixed/TESTNUM.accountfile}}}
+  file_transport =     t1
+  data =               DIR/test-mail/junk
+  debug_print = +++ROUTER:\n\
+                +++domain_data=$domain_data\n\
+                +++local_part_data=$local_part_data
+
+r2:
+  driver =             redirect
+  domains =            lsearch;DIR/aux-fixed/TESTNUM.data
+  local_parts =                lsearch;DIR/aux-fixed/TESTNUM.data
+  address_data =       ADDRESSDATA
+  file_transport =     t1
+  data =               DIR/test-mail/junk
+  router_home_directory =      /usr
   debug_print = +++ROUTER:\n\
                 +++domain_data=$domain_data\n\
                 +++local_part_data=$local_part_data\n\
index d4cb8b67cef49c3b6dbd3a63d7cd08e0a1501a5e..700cade6988db5877ba33aba535b74ab8136db57 100644 (file)
@@ -1,3 +1,6 @@
 1999-03-02 09:44:33 10HmaX-000000005vi-0000 <= CALLER@test.ex U=CALLER P=local S=sss
-1999-03-02 09:44:33 10HmaX-000000005vi-0000 *> TESTSUITE/test-mail/junk <userx@test.ex> R=r1 T=t1
+1999-03-02 09:44:33 10HmaX-000000005vi-0000 *> TESTSUITE/test-mail/junk <userx@test.ex> R=r2 T=t1
 1999-03-02 09:44:33 10HmaX-000000005vi-0000 Completed
+1999-03-02 09:44:33 10HmaY-000000005vi-0000 <= CALLER@test.ex U=CALLER P=local S=sss
+1999-03-02 09:44:33 10HmaY-000000005vi-0000 *> TESTSUITE/test-mail/junk <charlie@dom1.ain> R=r1 T=t1
+1999-03-02 09:44:33 10HmaY-000000005vi-0000 Completed
index b6b3b6d472e427fd6a007eb3229cc8bee302f22e..749ff087c4e02d17fb487448cfab6e25262945f7 100644 (file)
@@ -1,4 +1,10 @@
 # domain_data and local_part_data for redirection to file
 exim -N -odi -d userx@test.ex
 ****
+#
+#
+### _data from a multi-step expansion
+exim -N -odi -d charlie@dom1.ain
+****
+#
 no_message_check
index d231bffc38f2f20f427a1f26d5b6b7859da53ac8..ae038834744a66dc180d7cac4b949ba08874e526 100644 (file)
@@ -86,6 +86,24 @@ userx@test.ex: queued for routing
 routing userx@test.ex
 --------> r1 router <--------
 local_part=userx domain=test.ex
+checking domains
+  search_open: lsearch "TESTSUITE/aux-fixed/0403.accountfile"
+  search_find: file="TESTSUITE/aux-fixed/0403.accountfile"
+    key="userx@test.ex" partial=-1 affix=NULL starflags=0 opts="ret=key"
+  LRU list:
+    0TESTSUITE/aux-fixed/0403.accountfile
+    End
+  internal_search_find: file="TESTSUITE/aux-fixed/0403.accountfile"
+    type=lsearch key="userx@test.ex" opts=NULL
+  file lookup required for userx@test.ex
+    in TESTSUITE/aux-fixed/0403.accountfile
+  creating new cache entry
+  lookup failed
+test.ex in ""?
+test.ex in ""? no (end of list)
+r1 router skipped: domains mismatch
+--------> r2 router <--------
+local_part=userx domain=test.ex
 checking domains
 test.ex in "lsearch;TESTSUITE/aux-fixed/0403.data"?
  list element: lsearch;TESTSUITE/aux-fixed/0403.data
@@ -94,6 +112,7 @@ test.ex in "lsearch;TESTSUITE/aux-fixed/0403.data"?
    key="test.ex" partial=-1 affix=NULL starflags=0 opts=NULL
  LRU list:
    0TESTSUITE/aux-fixed/0403.data
+   0TESTSUITE/aux-fixed/0403.accountfile
    End
  internal_search_find: file="TESTSUITE/aux-fixed/0403.data"
    type=lsearch key="test.ex" opts=NULL
@@ -111,6 +130,7 @@ userx in "lsearch;TESTSUITE/aux-fixed/0403.data"?
    key="userx" partial=-1 affix=NULL starflags=0 opts=NULL
  LRU list:
    0TESTSUITE/aux-fixed/0403.data
+   0TESTSUITE/aux-fixed/0403.accountfile
    End
  internal_search_find: file="TESTSUITE/aux-fixed/0403.data"
    type=lsearch key="userx" opts=NULL
@@ -125,18 +145,18 @@ userx in "lsearch;TESTSUITE/aux-fixed/0403.data"?
 +++address_data=
 +++home=/usr
 processing address_data
-calling r1 router
+calling r2 router
 rda_interpret (string): 'TESTSUITE/test-mail/junk'
 expanded: 'TESTSUITE/test-mail/junk'
 file is not a filter file
 parse_forward_list: TESTSUITE/test-mail/junk
 extract item: TESTSUITE/test-mail/junk
 set transport t1
-r1 router generated TESTSUITE/test-mail/junk
+r2 router generated TESTSUITE/test-mail/junk
   pipe, file, or autoreply
   errors_to=NULL transport=t1
   uid=unset gid=unset home=/usr
-routed by r1 router
+routed by r2 router
   envelope to: userx@test.ex
   transport: <none>
  locking TESTSUITE/spool/db/retry.lockfile
@@ -190,12 +210,12 @@ post-process TESTSUITE/test-mail/junk (0)
 TESTSUITE/test-mail/junk delivered
 userx@test.ex: children all complete
 LOG: MAIN
-  *> TESTSUITE/test-mail/junk <userx@test.ex> R=r1 T=t1
+  *> TESTSUITE/test-mail/junk <userx@test.ex> R=r2 T=t1
 >>>>>>>>>>>>>>>> deliveries are done >>>>>>>>>>>>>>>>
 changed uid/gid: post-delivery tidying
   uid=EXIM_UID gid=EXIM_GID pid=p1235
 set_process_info: pppp tidying up after delivering 10HmaX-000000005vi-0000
-DSN: processing router : r1
+DSN: processing router : r2
 DSN: processing successful delivery address: TESTSUITE/test-mail/junk
 DSN: Sender_address: CALLER@test.ex
 DSN: orcpt: NULL  flags: 0x0
@@ -203,7 +223,7 @@ DSN: envid: NULL  ret: 0
 DSN: Final recipient: TESTSUITE/test-mail/junk
 DSN: Remote SMTP server supports DSN: 0
 DSN: not sending DSN success message
-DSN: processing router : r1
+DSN: processing router : r2
 DSN: processing successful delivery address: userx@test.ex
 DSN: Sender_address: CALLER@test.ex
 DSN: orcpt: NULL  flags: 0x0
@@ -219,3 +239,223 @@ search_tidyup called
 >>>>>>>>>>>>>>>> Exim pid=p1235 (local-accept-delivery) terminating with rc=0 >>>>>>>>>>>>>>>>
 search_tidyup called
 >>>>>>>>>>>>>>>> Exim pid=p1234 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
+### _data from a multi-step expansion
+Exim version x.yz ....
+changed uid/gid: forcing real = effective
+  uid=uuuu gid=CALLER_GID pid=p1237
+configuration file is TESTSUITE/test-config
+admin user
+changed uid/gid: privilege not needed
+  uid=EXIM_UID gid=EXIM_GID pid=p1237
+seeking password data for user "CALLER": cache not available
+getpwnam() succeeded uid=CALLER_UID gid=CALLER_GID
+originator: uid=CALLER_UID gid=CALLER_GID login=CALLER name=CALLER_NAME
+sender address = CALLER@test.ex
+set_process_info: pppp accepting a local non-SMTP message from <CALLER@test.ex>
+spool directory space = nnnnnK inodes = nnnnn check_space = 10240K inodes = 100 msg_size = 0
+log directory space = nnnnnK inodes = nnnnn check_space = 10240K inodes = 100
+Sender: CALLER@test.ex
+Recipients:
+  charlie@dom1.ain
+search_tidyup called
+>>Headers received:
+
+qualify & rewrite recipients list
+global rewrite rules
+rewrite headers
+ rewrite_one_header: type=F:
+   From: CALLER_NAME <CALLER@test.ex>
+search_tidyup called
+>>Headers after rewriting and local additions:
+I Message-Id: <E10HmaY-000000005vi-0000@mail.test.ex>
+F From: CALLER_NAME <CALLER@test.ex>
+  Date: Tue, 2 Mar 1999 09:44:33 +0000
+
+Data file name: TESTSUITE/spool//input//10HmaY-000000005vi-0000-D
+Data file written for message 10HmaY-000000005vi-0000
+>>Generated Received: header line
+P Received: from CALLER by mail.test.ex with local (Exim x.yz)
+       (envelope-from <CALLER@test.ex>)
+       id 10HmaY-000000005vi-0000
+       for charlie@dom1.ain;
+       Tue, 2 Mar 1999 09:44:33 +0000
+Writing spool header file: TESTSUITE/spool//input//hdr.10HmaY-000000005vi-0000
+DSN: **** SPOOL_OUT - address: <charlie@dom1.ain> errorsto: <NULL> orcpt: <NULL> dsn_flags: 0x0
+Renaming spool header file: TESTSUITE/spool//input//10HmaY-000000005vi-0000-H
+Size of headers = sss
+LOG: MAIN
+  <= CALLER@test.ex U=CALLER P=local S=sss
+search_tidyup called
+exec TESTSUITE/eximdir/exim -DEXIM_PATH=TESTSUITE/eximdir/exim -C TESTSUITE/test-config -d=0xf7715cfd -MCd local-accept-delivery -N -odi -Mc 10HmaY-000000005vi-0000
+Exim version x.yz ....
+changed uid/gid: forcing real = effective
+  uid=uuuu gid=EXIM_GID pid=p1238
+configuration file is TESTSUITE/test-config
+trusted user
+admin user
+dropping to exim gid; retaining priv uid
+seeking password data for user "CALLER": cache not available
+getpwnam() succeeded uid=CALLER_UID gid=CALLER_GID
+set_process_info: pppp delivering specified messages
+set_process_info: pppp delivering 10HmaY-000000005vi-0000
+Trying spool file TESTSUITE/spool//input//10HmaY-000000005vi-0000-D
+reading spool file 10HmaY-000000005vi-0000-H
+user=CALLER uid=CALLER_UID gid=CALLER_GID sender=CALLER@test.ex
+sender_local=1 ident=CALLER
+Non-recipients:
+ Empty Tree
+---- End of tree ----
+recipients_count=1
+**** SPOOL_IN - No additional fields
+body_linecount=0 message_linecount=8
+DSN: set orcpt:   flags: 0x0
+Delivery address list:
+  charlie@dom1.ain 
+ locking TESTSUITE/spool/db/retry.lockfile
+ locked  TESTSUITE/spool/db/retry.lockfile
+ EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
+ returned from EXIM_DBOPEN: (nil)
+ failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
+no retry data available
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+Considering: charlie@dom1.ain
+unique = charlie@dom1.ain
+no   domain  retry record
+no   address retry record
+charlie@dom1.ain: queued for routing
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+routing charlie@dom1.ain
+--------> r1 router <--------
+local_part=charlie domain=dom1.ain
+checking domains
+  search_open: lsearch "TESTSUITE/aux-fixed/0403.accountfile"
+  search_find: file="TESTSUITE/aux-fixed/0403.accountfile"
+    key="charlie@dom1.ain" partial=-1 affix=NULL starflags=0 opts="ret=key"
+  LRU list:
+    0TESTSUITE/aux-fixed/0403.accountfile
+    End
+  internal_search_find: file="TESTSUITE/aux-fixed/0403.accountfile"
+    type=lsearch key="charlie@dom1.ain" opts=NULL
+  file lookup required for charlie@dom1.ain
+    in TESTSUITE/aux-fixed/0403.accountfile
+  creating new cache entry
+  lookup yielded: 
+dom1.ain in "dom1.ain"?
+ list element: dom1.ain
+ dom1.ain in "dom1.ain"? yes (matched "dom1.ain")
+checking local_parts
+  search_open: lsearch "TESTSUITE/aux-fixed/0403.accountfile"
+    cached open
+  search_find: file="TESTSUITE/aux-fixed/0403.accountfile"
+    key="charlie@dom1.ain" partial=-1 affix=NULL starflags=0 opts="ret=key"
+  LRU list:
+    0TESTSUITE/aux-fixed/0403.accountfile
+    End
+  internal_search_find: file="TESTSUITE/aux-fixed/0403.accountfile"
+    type=lsearch key="charlie@dom1.ain" opts=NULL
+  cached data used for lookup of charlie@dom1.ain
+    in TESTSUITE/aux-fixed/0403.accountfile
+  lookup yielded: 
+charlie in "charlie"?
+ list element: charlie
+ charlie in "charlie"? yes (matched "charlie")
++++ROUTER:
++++domain_data=dom1.ain
++++local_part_data=charlie
+calling r1 router
+rda_interpret (string): 'TESTSUITE/test-mail/junk'
+expanded: 'TESTSUITE/test-mail/junk'
+file is not a filter file
+parse_forward_list: TESTSUITE/test-mail/junk
+extract item: TESTSUITE/test-mail/junk
+set transport t1
+r1 router generated TESTSUITE/test-mail/junk
+  pipe, file, or autoreply
+  errors_to=NULL transport=t1
+  uid=unset gid=unset home=NULL
+routed by r1 router
+  envelope to: charlie@dom1.ain
+  transport: <none>
+ locking TESTSUITE/spool/db/retry.lockfile
+ locked  TESTSUITE/spool/db/retry.lockfile
+ EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
+ returned from EXIM_DBOPEN: (nil)
+ failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
+no retry data available
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+Considering: TESTSUITE/test-mail/junk
+unique = TESTSUITE/test-mail/junk:charlie@dom1.ain
+queued for t1 transport
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+After routing:
+  Local deliveries:
+    TESTSUITE/test-mail/junk
+  Remote deliveries:
+  Failed addresses:
+  Deferred addresses:
+search_tidyup called
+>>>>>>>>>>>>>>>> Local deliveries >>>>>>>>>>>>>>>>
+--------> TESTSUITE/test-mail/junk <--------
+ locking TESTSUITE/spool/db/retry.lockfile
+ locked  TESTSUITE/spool/db/retry.lockfile
+ EXIM_DBOPEN: file <TESTSUITE/spool/db/retry> dir <TESTSUITE/spool/db> flags=O_RDONLY
+ returned from EXIM_DBOPEN: (nil)
+ failed to open DB file TESTSUITE/spool/db/retry: No such file or directory
+no retry data available
+search_tidyup called
+changed uid/gid: local delivery to TESTSUITE/test-mail/junk <TESTSUITE/test-mail/junk> transport=t1
+  uid=CALLER_UID gid=CALLER_GID pid=p1239
+  home=NULL current=/
+set_process_info: pppp delivering 10HmaY-000000005vi-0000 to TESTSUITE/test-mail/junk using t1
++++TRANSPORT:
++++domain_data=dom1.ain
++++local_part_data=charlie
++++address_data=
++++home=
+appendfile transport entered
+appendfile: mode=600 notify_comsat=0 quota=0 warning=0
+  file=TESTSUITE/test-mail/junk format=unix
+  message_prefix=From ${if def:return_path{$return_path}{MAILER-DAEMON}} ${tod_bsdinbox}\n
+  message_suffix=\n
+  maildir_use_size_file=no
+  locking by lockfile fcntl 
+*** delivery by t1 transport bypassed by -N option
+search_tidyup called
+journalling TESTSUITE/test-mail/junk:charlie@dom1.ain
+t1 transport returned OK for TESTSUITE/test-mail/junk
+post-process TESTSUITE/test-mail/junk (0)
+TESTSUITE/test-mail/junk delivered
+charlie@dom1.ain: children all complete
+LOG: MAIN
+  *> TESTSUITE/test-mail/junk <charlie@dom1.ain> R=r1 T=t1
+>>>>>>>>>>>>>>>> deliveries are done >>>>>>>>>>>>>>>>
+changed uid/gid: post-delivery tidying
+  uid=EXIM_UID gid=EXIM_GID pid=p1238
+set_process_info: pppp tidying up after delivering 10HmaY-000000005vi-0000
+DSN: processing router : r1
+DSN: processing successful delivery address: TESTSUITE/test-mail/junk
+DSN: Sender_address: CALLER@test.ex
+DSN: orcpt: NULL  flags: 0x0
+DSN: envid: NULL  ret: 0
+DSN: Final recipient: TESTSUITE/test-mail/junk
+DSN: Remote SMTP server supports DSN: 0
+DSN: not sending DSN success message
+DSN: processing router : r1
+DSN: processing successful delivery address: charlie@dom1.ain
+DSN: Sender_address: CALLER@test.ex
+DSN: orcpt: NULL  flags: 0x0
+DSN: envid: NULL  ret: 0
+DSN: Final recipient: charlie@dom1.ain
+DSN: Remote SMTP server supports DSN: 0
+DSN: not sending DSN success message
+LOG: MAIN
+  Completed
+end delivery of 10HmaY-000000005vi-0000
+search_tidyup called
+search_tidyup called
+>>>>>>>>>>>>>>>> Exim pid=p1238 (local-accept-delivery) terminating with rc=0 >>>>>>>>>>>>>>>>
+search_tidyup called
+>>>>>>>>>>>>>>>> Exim pid=p1237 (fresh-exec) terminating with rc=0 >>>>>>>>>>>>>>>>
+
+******** SERVER ********
+### _data from a multi-step expansion