linked-lists for driver info structs
[exim.git] / configs / config.samples / S002
1 From: John Jetmore <jetmore@cinergycom.com>
2 Date: Wed, 24 Sep 2003 13:12:58 -0500 (CDT)
3
4 I'm sure that everyone who's interested in something like this has already
5 come up with their own way to do this, but here's my solution:
6
7 When I moved from smail to exim I built a program that took individual
8 config pieces stripped all the comments and built a config file.  As a
9 bonus, it also runs exim -C <testfile> -bV on the new file and reports any
10 config errors before copying it over the old config.  In addition to just
11 being familiar in general w/ all the files being broken up according to
12 their major categories, I also got the benfit of being able to have config
13 pieces that were easily updatable (just replace the whole file and rebuild
14 the configure file).
15
16 The script has some site-specific stuff hard coded, but it's easily
17 fixable.  Essentially in my exim configd I have a directory called
18 subconfigure, which can contain directories named \d\d.\w+.  Mine
19 currently contains:
20 10.general/  30.routers/     50.retry/    70.authenticators/
21 20.acls/     40.transports/  60.rewrite/  80.local_scan/
22
23 Each of these directories can contain files in the form \d\d.\w+.  For
24 instance, my 30.routers contains:
25 00.begin              80.l_user_delivery_normal   _50.l_mx
26 10.r_forcepaths       _12.r_static_route_junk     _60.l_psp
27 15.r_stalemail        _17.r_internal_route        _72.l_aliases_list
28 33.r_mailrtrd_router  _20.r_conditionalforce      _74.l_aliases_isp
29 40.r_standard         _31.r_mailrtrd_bypass_spam  _76.l_aliases_mer
30 70.l_aliases          _39.r_smarthost             _80.l_user_delivery_isp
31
32 those files prefixed by "_" will not be used to build the live configure
33 file.  They are "turned off".  This allows me to keep a general list of
34 configure pieces that are easily updatable but not necessarily every rule
35 is used on every machine.  Not every file contains a single router - for
36 instance 60.l_psp is our virtual hosting solution and contains 10 routers.
37 They're just grouped by logical role.
38
39 All of these sub pieces are built in to the configure file w/ a shell
40 script called mkconfigure, inline below.  Again, my assumption is that
41 anyone who wants a system like this built it for themselves, but it
42 would be kind of fun to flesh this script out to be more generic.
43 Maybe post it and some samples on a webpage.  Or no one responds to this
44 and I shut up about it =).
45
46 This system is way overkill for some people (for instance, my home machine
47 uses a single configure file because I don't do that much special with
48 it), but it's useful in a larger system role.
49
50 --John
51
52 mkconfigure:
53
54 #!/bin/ksh
55
56 # I have found that our custom set up of exim's configure file is overly
57 # confusing.  To help alleviate this, I have broken the file out into its
58 # core pieces (general, tansports, directors, routers, retry, rewrite, and
59 # authentication), and then each of those into logical sub-pieces (SIS,
60 # for instance.  This program is to take all of those sub pieces and put
61 # them back together into the file that exim understands.
62
63 # No one should every touch the 'configure' file from now on, one should
64 # instead manipulate the files in the subconfigure directory and run this
65 # program
66
67 # jetmore 20011119
68
69 EXIMD=$1
70 CONFIGSUFF=$2
71
72 if [ "X$EXIMD" == "X" ] ; then
73   EXIMD=/local/exim
74 fi
75 if [ ! -d "$EXIMD" ] ; then
76   echo "$EXIMD is not a directory" >&2
77   exit 1
78 fi
79 ETCD=$EXIMD/etc
80 SUBCD=$ETCD/subconfigure$CONFIGSUFF
81 CONFIGF=$ETCD/configure$CONFIGSUFF
82
83 if [ ! -d $SUBCD ] ; then
84   echo "$SUBCD is not a directory" >&2
85   exit 1
86 fi
87
88 GREP=/bin/grep
89
90 # initialize the temporary config file in case some trash got left around
91 cat /dev/null > $CONFIGF.t
92
93 # print the banner to the temp config file
94 echo                                                             >> $CONFIGF.t
95 echo "#########################################################" >> $CONFIGF.t
96 echo "# DO NOT DIRECTLY MANIPULATE THIS FILE                   " >> $CONFIGF.t
97 echo "#                                                        " >> $CONFIGF.t
98 echo "# if you need to make configuration change, do so in     " >> $CONFIGF.t
99 echo "# $SUBCD and run the mkconfigure"                          >> $CONFIGF.t
100 echo "# command.  Changes made to this file will be lost       " >> $CONFIGF.t
101 echo "#                                                        " >> $CONFIGF.t
102 echo "# See jetmore w/ questions                               " >> $CONFIGF.t
103 echo "#########################################################" >> $CONFIGF.t
104 echo                                                             >> $CONFIGF.t
105
106 # get the major categories
107 for CAT in $SUBCD/[0-9]*
108 do
109     # print which category we're in
110     echo                                                         >> $CONFIGF.t
111     echo "## major category $CAT"                                >> $CONFIGF.t
112     echo                                                         >> $CONFIGF.t
113
114     # get the subcategories
115     for SUBCAT in $CAT/[0-9]*
116     do
117         # print which sub category we're in
118         echo "## sub category $SUBCAT"                           >> $CONFIGF.t
119         echo                                                     >> $CONFIGF.t
120
121         # place the contents of any non-comment line into the configure file
122         $GREP -v "^ *#" $SUBCAT                                  >> $CONFIGF.t
123         echo                                                     >> $CONFIGF.t
124     done
125 done
126
127 # check and make sure there aren't any typos in the new config file
128 $EXIMD/bin/exim -C $CONFIGF.t -bV > $CONFIGF.test 2>&1
129 if [ "$?" -eq "1" ] ; then
130     #/bin/rm $CONFIGF.t
131     echo
132     echo "There is a problem with the configure file.  "
133     echo "moving paniclog to paniclog.mkfail"
134     echo "$CONFIGF.test has details:"
135     echo
136     echo #####################################################################
137     cat $CONFIGF.test
138     echo #####################################################################
139     echo
140     echo "$CONFIGF not changed!"
141     /bin/mv -f /log/exim/paniclog /log/exim/paniclog.mkfail
142     exit 1
143 fi
144 /bin/rm $CONFIGF.test
145
146 /bin/mv $CONFIGF.t $CONFIGF
147 echo "$CONFIGF updated successfully."
148 echo "Don't forget to HUP the mail daemon"
149 exit 0
150