Add the first version of a request caching module. More information in
[freeradius.git] / raddb / experimental.conf
1 #
2 #  This file contains the configuration for experimental modules.
3 #
4 #  By default, it is NOT included in the build.
5 #
6 #  $Id$
7 #
8
9         # Configuration for the Python module.
10         #
11         # Where radiusd is a Python module, radiusd.py, and the
12         # function 'authorize' is called.  Here is a dummy piece
13         # of code:
14         # 
15         #       def authorize(params):
16         #           print params
17         #           return (5, ('Reply-Message', 'banned'))
18         #
19         # The RADIUS value-pairs are passed as a tuple of tuple
20         # pairs as the first argument, e.g. (('attribute1',
21         # 'value1'), ('attribute2', 'value2'))
22         #
23         # The function return is a tuple with the first element
24         # being the return value of the function.
25         # The 5 corresponds to RLM_MODULE_USERLOCK. I plan to
26         # write the return values as Python symbols to avoid
27         # confusion.
28         #
29         # The remaining tuple members are the string form of
30         # value-pairs which are passed on to pairmake().
31         #
32         python {
33                 mod_instantiate = radiusd_test
34                 func_instantiate = instantiate
35
36                 mod_authorize = radiusd_test
37                 func_authorize = authorize
38
39                 mod_accounting = radiusd_test
40                 func_accounting = accounting
41
42                 mod_preacct = radiusd_test
43                 func_preacct = preacct
44
45                 mod_detach = radiusd_test
46                 func_detach = detach
47         }
48
49         
50         # Configuration for the example module.  Uncommenting it will cause it
51         # to get loaded and initialized, but should have no real effect as long
52         # it is not referencened in one of the autz/auth/preacct/acct sections
53         example {
54                 #  Boolean variable.
55                 # allowed values: {no, yes}
56                 boolean = yes
57
58                 #  An integer, of any value.
59                 integer = 16
60
61                 #  A string.
62                 string = "This is an example configuration string"
63
64                 # An IP address, either in dotted quad (1.2.3.4) or hostname
65                 # (example.com)
66                 ipaddr = 127.0.0.1
67
68                 # A subsection
69                 mysubsection {
70                         anotherinteger = 1000
71                         # They nest
72                         deeply nested {
73                                 string = "This is a different string"
74                         }
75                 }
76         }
77
78
79         #  This module is an SQL enabled version of the counter module.
80         #  
81         #  Rather than maintaining seperate (GDBM) databases of
82         #  accounting info for each counter, this module uses the data
83         #  stored in the raddacct table by the sql modules. This
84         #  module NEVER does any database INSERTs or UPDATEs.  It is
85         #  totally dependent on the SQL module to process Accounting
86         #  packets.
87         #
88         #  The 'sqlmod_inst' parameter holds the instance of the sql
89         #  module to use when querying the SQL database. Normally it
90         #  is just "sql".  If you define more and one SQL module
91         #  instance (usually for failover situations), you can
92         #  specify which module has access to the Accounting Data
93         #  (radacct table).
94         #
95         #  The 'reset' parameter defines when the counters are all
96         #  reset to zero.  It can be hourly, daily, weekly, monthly or
97         #  never.  It can also be user defined. It should be of the
98         #  form:
99         #       num[hdwm] where:
100         #       h: hours, d: days, w: weeks, m: months
101         #       If the letter is ommited days will be assumed. In example:
102         #       reset = 10h (reset every 10 hours)
103         #       reset = 12  (reset every 12 days)
104         #
105         #  The 'key' parameter specifies the unique identifier for the
106         #  counter records (usually 'User-Name').
107         #
108         #  The 'query' parameter specifies the SQL query used to get
109         #  the current Counter value from the database. There are 3
110         #  parameters that can be used in the query:
111         #               %k      'key' parameter
112         #               %b      unix time value of beginning of reset period 
113         #               %e      unix time value of end of reset period
114         #
115         #
116         #  The 'check-name' parameter is the name of the 'check'
117         #  attribute to use to access the counter in the 'users' file
118         #  or SQL radcheck or radcheckgroup tables.
119         #
120         #  DEFAULT  Max-Daily-Session > 3600, Auth-Type = Reject
121         #      Reply-Message = "You've used up more than one hour today"
122         #
123         sqlcounter dailycounter {
124                 counter-name = Daily-Session-Time
125                 check-name = Max-Daily-Session
126                 sqlmod-inst = sql
127                 key = User-Name
128                 reset = daily
129
130                 # This query properly handles calls that span from the
131                 # previous reset period into the current period but
132                 # involves more work for the SQL server than those
133                 # below
134                 query = "SELECT SUM(AcctSessionTime - GREATEST((%b - UNIX_TIMESTAMP(AcctStartTime)), 0)) FROM radacct WHERE UserName='%{%k}' AND UNIX_TIMESTAMP(AcctStartTime) + AcctSessionTime > '%b'"
135
136                 # This query ignores calls that started in a previous
137                 # reset period and continue into into this one. But it
138                 # is a little easier on the SQL server
139                 # query = "SELECT SUM(AcctSessionTime) FROM radacct WHERE UserName='%{%k}' AND AcctStartTime > FROM_UNIXTIME('%b')"
140
141                 # This query is the same as above, but demonstrates an
142                 # additional counter parameter '%e' which is the
143                 # timestamp for the end of the period
144                 # query = "SELECT SUM(AcctSessionTime) FROM radacct WHERE UserName='%{%k}' AND AcctStartTime BETWEEN FROM_UNIXTIME('%b') AND FROM_UNIXTIME('%e')"               
145         }
146
147         sqlcounter monthlycounter {
148                 counter-name = Monthly-Session-Time
149                 check-name = Max-Monthly-Session
150                 sqlmod-inst = sqlcca3
151                 key = User-Name
152                 reset = monthly
153
154                 # This query properly handles calls that span from the
155                 # previous reset period into the current period but
156                 # involves more work for the SQL server than those
157                 # below
158                 query = "SELECT SUM(AcctSessionTime - GREATEST((%b - UNIX_TIMESTAMP(AcctStartTime)), 0)) FROM radacct WHERE UserName='%{%k}' AND UNIX_TIMESTAMP(AcctStartTime) + AcctSessionTime > '%b'"
159
160                 # This query ignores calls that started in a previous
161                 # reset period and continue into into this one. But it
162                 # is a little easier on the SQL server
163                 # query = "SELECT SUM(AcctSessionTime) FROM radacct WHERE UserName='%{%k}' AND AcctStartTime > FROM_UNIXTIME('%b')"
164
165                 # This query is the same as above, but demonstrates an
166                 # additional counter parameter '%e' which is the
167                 # timestamp for the end of the period
168                 # query = "SELECT SUM(AcctSessionTime) FROM radacct WHERE UserName='%{%k}' AND AcctStartTime BETWEEN FROM_UNIXTIME('%b') AND FROM_UNIXTIME('%e')"               
169         }
170
171         #  To create a dbm users file, do:
172         #
173         #   cat test.users | rlm_dbm_parser -f /etc/raddb/users_db
174         #
175         #  Then add 'dbm' in 'authorize' section.
176         #
177         #  Note that even if the file has a ".db" or ".dbm" extension,
178         #  you may have to specify it here without that extension.  This
179         #  is because the DBM libraries "helpfully" add a ".db" to the
180         #  filename, but don't check if it's already there.
181         #
182         dbm {
183                 usersfile = ${raddbdir}/users_db
184         }
185
186         #
187         #  Persistent, embedded Perl interpreter.
188         #
189         perl {
190                 #
191                 #  The Perl script to execute on authorize, authenticate,
192                 #  accounting, xlat, etc.  This is very similar to using
193                 #  Exec-Program-Wait = "/path/foo.pl", but it is persistent,
194                 #  and therefore faster.
195                 #
196                 module = /path/to/your/perl_program
197
198                 #
199                 #  The following hashes are given to the module and
200                 #  filled with value-pairs (Attribute names and values)
201                 #
202                 #  %RAD_REPLY           Attributes to go into the reply
203                 #  %RAD_REQUEST         Attributes from the request
204                 #  %RAD_CHECK           Check items
205                 #
206                 #  Only the %RAD_REPLY hash can be modified.
207                 #  All of the other hashes are read only.
208                 #
209                 #  The return codes from functions in the perl_script
210                 #  are passed directly back to the server.  These
211                 #  codes are defined in doc/configurable_failover,
212                 #  src/include/modules.h (RLM_MODULE_REJECT, etc),
213                 #  and are pre-defined in the 'example.pl' program
214                 #  which is included.
215                 #               
216                 func_accounting = accounting
217                 func_authentication = authenticate
218                 func_preacct = preacct
219                 func_checksimul = checksimul
220                 func_xlat = xlat
221         }
222
223         #
224         #  Perform NT-Domain authentication.  This only works
225         #  with PAP authentication.  That is, Authentication-Request
226         #  packets containing a User-Password attribute.
227         #
228         #  To use it, add 'smb' into the 'authenticate' section,
229         #  and then in another module (usually the 'users' file),
230         #  set 'Auth-Type := SMB'
231         #
232         smb {
233                 server = ntdomain.server.example.com
234                 backup = backup.server.example.com
235                 domain = NTDOMAIN
236         }
237
238         # See doc/rlm_fastusers before using this
239         # module or changing these values.
240         #
241         fastusers {
242                 usersfile = ${confdir}/users_fast
243                 hashsize = 1000
244                 compat = no
245                 # Reload the hash every 600 seconds (10mins)
246                 hash_reload = 600
247         }
248
249         #
250         #  See also protocol_filter.conf
251         #
252         protocol_filter {
253                 #
254                 #  Location of the protocol filter configuration file.
255                 #
256                 filename = ${raddbdir}/protocol_filter.conf
257
258                 #
259                 #  The key to look up the section with filtering rules.
260                 #
261                 key = %{Realm:-DEFAULT}
262         }
263         # Caching module
264         #
265         # Should be added in the post-auth section (after all other modules)
266         # and in the authorize section (before any other modules)
267         #
268         # authorize {
269         #       caching {
270         #               ok = return
271         #       }
272         #       [... other modules ...]
273         # }
274         # post-auth {
275         #       [... other modules ...]
276         #       caching
277         # }
278         #
279         # The caching module will cache the Auth-Type and reply items and send them back
280         # on any subsequent requests for the same key
281         #
282         # Configuration:
283         #
284         # filename: The gdbm file to use for the cache database (can be memory mapped for
285         #               more speed)
286         # key: A string to xlat and use as a key. For instace, "%{Acct-Unique-Session-Id}"
287         # post-auth: If we find a cached entry, set the post-auth to that value
288         # cache-ttl: The time to cache the entry. The values from the counter module apply here
289         # cache-size: The gdbm cache size to request (default 1000)
290         # hit-ratio: If set to non-zero we print out statistical information after so many cache requests
291         # cache-rejects: Do we also cache rejects, or not? (default 'yes')
292         #
293         caching {
294                 filename = ${raddbdir}/db.cache
295                 cache-ttl = 1d
296                 hit-ratio = 1000
297                 key = "%{Acct-Unique-Session-Id}"
298                 #post-auth = ""
299                 # cache-size = 2000
300                 # cache-rejects = yes
301         }