aboutsummaryrefslogtreecommitdiffstats
path: root/doc/tex/cdrdriver.tex
blob: 7865958c19bc0ac7ca61f20523329e10678e2f5f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
Call data records can be stored in many different databases or even CSV text.

\section{MSSQL}

	Asterisk can currently store CDRs into an MSSQL database in
	two different ways:  cdr\_odbc or cdr\_tds
	
	Call Data Records can be stored using unixODBC (which requires
	the FreeTDS package) [cdr\_odbc] or directly by using just the
	FreeTDS package [cdr\_tds]  The following provide some
	examples known to get asterisk working with mssql.

	NOTE:  Only choose one db connector.

\subsection{ODBC using cdr\_odbc}
	Compile, configure, and install the latest unixODBC package:
\begin{astlisting}
\begin{verbatim}
	tar -zxvf unixODBC-2.2.9.tar.gz &&
	cd unixODBC-2.2.9 &&
	./configure --sysconfdir=/etc --prefix=/usr --disable-gui &&
	make &&
	make install
\end{verbatim}
\end{astlisting}

	Compile, configure, and install the latest FreeTDS package:
\begin{astlisting}
\begin{verbatim}
	tar -zxvf freetds-0.62.4.tar.gz &&
	cd freetds-0.62.4 &&
	./configure --prefix=/usr --with-tdsver=7.0 \
                 --with-unixodbc=/usr/lib &&
	make && make install
\end{verbatim}
\end{astlisting}

	Compile, or recompile, asterisk so that it will now add support
	for cdr\_odbc.
\begin{astlisting}
\begin{verbatim}
	make clean && ./configure --with-odbc &&
	make update &&
	make &&
	make install
\end{verbatim}
\end{astlisting}

	Setup odbc configuration files.  These are working examples
	from my system.  You will need to modify for your setup.
	You are not required to store usernames or passwords here.
\begin{astlisting}
\begin{verbatim}
	/etc/odbcinst.ini
	   [FreeTDS]
	   Description    = FreeTDS ODBC driver for MSSQL
	   Driver         = /usr/lib/libtdsodbc.so
	   Setup          = /usr/lib/libtdsS.so
	   FileUsage      = 1

	/etc/odbc.ini
	   [MSSQL-asterisk]
	   description         = Asterisk ODBC for MSSQL
	   driver              = FreeTDS
	   server              = 192.168.1.25
	   port                = 1433
	   database            = voipdb
	   tds_version         = 7.0
	   language            = us_english
\end{verbatim}
\end{astlisting}

		Only install one database connector.  Do not confuse asterisk
		by using both ODBC (cdr\_odbc) and FreeTDS (cdr\_tds).
		This command will erase the contents of cdr\_tds.conf
\begin{astlisting}
\begin{verbatim}
		[ -f /etc/asterisk/cdr_tds.conf ] > /etc/asterisk/cdr_tds.conf
\end{verbatim}
\end{astlisting}
		NOTE:  unixODBC requires the freeTDS package, but asterisk does
		not call freeTDS directly.

		Now set up cdr\_odbc configuration files.  These are working samples
		from my system.  You will need to modify for your setup. Define
		your usernames and passwords here, secure file as well.
\begin{astlisting}
\begin{verbatim}
		/etc/asterisk/cdr_odbc.conf
		   [global]
		   dsn=MSSQL-asterisk
		   username=voipdbuser
		   password=voipdbpass
		   loguniqueid=yes
\end{verbatim}
\end{astlisting}
		And finally, create the 'cdr' table in your mssql database.
\begin{astlisting}
\begin{verbatim}
		CREATE TABLE cdr (
		        [calldate]      [datetime]              NOT NULL ,
		        [clid]          [varchar] (80)          NOT NULL ,
		        [src]           [varchar] (80)          NOT NULL ,
		        [dst]           [varchar] (80)          NOT NULL ,
		        [dcontext]      [varchar] (80)          NOT NULL ,
		        [channel]       [varchar] (80)          NOT NULL ,
		        [dstchannel]    [varchar] (80)          NOT NULL ,
		        [lastapp]       [varchar] (80)          NOT NULL ,
		        [lastdata]      [varchar] (80)          NOT NULL ,
		        [duration]      [int]                   NOT NULL ,
		        [billsec]       [int]                   NOT NULL ,
		        [disposition]   [varchar] (45)          NOT NULL ,
		        [amaflags]      [int]                   NOT NULL ,
		        [accountcode]   [varchar] (20)          NOT NULL ,
		        [uniqueid]      [varchar] (32)          NOT NULL ,
		        [userfield]     [varchar] (255)         NOT NULL
		)
\end{verbatim}
\end{astlisting}
		Start asterisk in verbose mode, you should see that asterisk
		logs a connection to the database and will now record every
		call to the database when it's complete.

\subsection{TDS, using cdr\_tds}
		Compile, configure, and install the latest FreeTDS package:
\begin{astlisting}
\begin{verbatim}
		   tar -zxvf freetds-0.62.4.tar.gz &&
		   cd freetds-0.62.4 &&
		   ./configure --prefix=/usr --with-tdsver=7.0
		   make &&
		   make install
\end{verbatim}
\end{astlisting}
                Compile, or recompile, asterisk so that it will now add support
                for cdr\_tds.
\begin{astlisting}
\begin{verbatim}
                   make clean && ./configure --with-tds &&
                   make update &&
                   make &&
                   make install
\end{verbatim}
\end{astlisting}
                Only install one database connector.  Do not confuse asterisk
                by using both ODBC (cdr\_odbc) and FreeTDS (cdr\_tds).
                This command will erase the contents of cdr\_odbc.conf
\begin{astlisting}
\begin{verbatim}
		[ -f /etc/asterisk/cdr_odbc.conf ] > /etc/asterisk/cdr_odbc.conf
\end{verbatim}
\end{astlisting}
                Setup cdr\_tds configuration files.  These are working samples
                from my system.  You will need to modify for your setup. Define
                your usernames and passwords here, secure file as well.
\begin{astlisting}
\begin{verbatim}
                /etc/asterisk/cdr_tds.conf
		   [global]
		   hostname=192.168.1.25
		   port=1433
		   dbname=voipdb
		   user=voipdbuser
		   password=voipdpass
		   charset=BIG5
\end{verbatim}
\end{astlisting}
                And finally, create the 'cdr' table in your mssql database.
\begin{astlisting}
\begin{verbatim}
		CREATE TABLE cdr (
		        [accountcode]   [varchar] (20)          NULL ,
		        [src]           [varchar] (80)          NULL ,
		        [dst]           [varchar] (80)          NULL ,
		        [dcontext]      [varchar] (80)          NULL ,
		        [clid]          [varchar] (80)          NULL ,
		        [channel]       [varchar] (80)          NULL ,
		        [dstchannel]    [varchar] (80)          NULL ,
		        [lastapp]       [varchar] (80)          NULL ,
		        [lastdata]      [varchar] (80)          NULL ,
		        [start]         [datetime]              NULL ,
		        [answer]        [datetime]              NULL ,
		        [end]           [datetime]              NULL ,
		        [duration]      [int]                   NULL ,
		        [billsec]       [int]                   NULL ,
		        [disposition]   [varchar] (20)          NULL ,
		        [amaflags]      [varchar] (16)          NULL ,
		        [uniqueid]      [varchar] (32)          NULL ,
		        [userfield]     [varchar] (256)         NULL
		)
\end{verbatim}
\end{astlisting}
                Start asterisk in verbose mode, you should see that asterisk
                logs a connection to the database and will now record every
                call to the database when it's complete.


\section{MYSQL}

Using MySQL for CDR records is supported by using ODBC and the cdr\_odbc module.

\section{PGSQL}
        If you want to go directly to postgresql database, and have the cdr\_pgsql.so
        compiled you can use the following sample setup.
        On Debian, before compiling asterisk, just install libpqxx-dev.
        Other distros will likely have a similiar package.

        Once you have the compile done,
        copy the sample cdr\_pgsql.conf file or create your own.

        Here is a sample:
\begin{astlisting}
\begin{verbatim}
        /etc/asterisk/cdr_pgsql.conf
          ; Sample Asterisk config file for CDR logging to PostgresSQL
          [global]
          hostname=localhost
          port=5432
          dbname=asterisk
          password=password
          user=postgres
          table=cdr
\end{verbatim}
\end{astlisting}
        Now create a table in postgresql for your cdrs
\begin{astlisting}
\begin{verbatim}
        CREATE TABLE cdr (
                calldate      time               NOT NULL ,
                clid          varchar (80)          NOT NULL ,
                src           varchar (80)          NOT NULL ,
                dst           varchar (80)          NOT NULL ,
                dcontext      varchar (80)          NOT NULL ,
                channel       varchar (80)          NOT NULL ,
                dstchannel    varchar (80)          NOT NULL ,
                lastapp       varchar (80)          NOT NULL ,
                lastdata      varchar (80)          NOT NULL ,
                duration      int                   NOT NULL ,
                billsec       int                   NOT NULL ,
                disposition   varchar (45)          NOT NULL ,
                amaflags      int                   NOT NULL ,
                accountcode   varchar (20)          NOT NULL ,
                uniqueid      varchar (32)          NOT NULL ,
                userfield     varchar (255)         NOT NULL
        );
\end{verbatim}
\end{astlisting}

\section{SQLLITE}

SQLite version 2 is supported in cdr\_sqlite.

\section{RADIUS}

\subsection{What is needed}

\begin{itemize}
	\item FreeRADIUS server
	\item Radiusclient-ng library
	\item Asterisk PBX
\end{itemize}

\begin{verbatim}
	+--------------------+
	|    Asterisk PBX    |
	|                    |
	|********************|
	|                    |        +---------------+
	|    RADIUS client   |------->| RADIUS server |
	|                    |<-------| (FreeRADIUS)  |
	+--------------------+        +---------------+
\end{verbatim}



\subsection{Steps to follow in order to have RADIUS support}

\subsubsection{Installation of the Radiusclient library}

	Download the sources from	
	\url{http://developer.berlios.de/projects/radiusclient-ng/}
		
	Untar the source tarball:

\begin{verbatim}
	root@localhost:/usr/local/src# tar xvfz radiusclient-ng-0.5.2.tar.gz
\end{verbatim}

	Compile and install the library:

\begin{verbatim}
	root@localhost:/usr/local/src# cd radiusclient-ng-0.5.2
	root@localhost:/usr/local/src/radiusclient-ng-0.5.2# ./configure
	root@localhost:/usr/local/src/radiusclient-ng-0.5.2# make
	root@localhost:/usr/local/src/radiusclient-ng-0.5.2# make install
\end{verbatim}

\subsubsection{Configuration of the Radiusclient library}
	
	By default all the configuration files of the radiusclient library will
	be in \path{/usr/local/etc/radiusclient-ng} directory.
		
	File "radiusclient.conf"
		Open the file and find lines containing the following:

			authserver      localhost
	
	This is the hostname or IP address of the RADIUS server used for
	authentication. You will have to change this unless the server is
	running on the same host as your Asterisk PBX.

			acctserver      localhost

	This is the hostname or IP address of the RADIUS server used for
	accounting. You will have to change this unless the server is running
	on the same host as your Asterisk PBX.

	\textbf{File "servers"}
		
	RADIUS protocol uses simple access control mechanism based on shared
	secrets that allows RADIUS servers to limit access from RADIUS clients.
		
	A RADIUS server is configured with a secret string and only RADIUS
	clients that have the same secret will be accepted.

	You need to configure a shared secret for each server you have
	configured in radiusclient.conf file in the previous step. The shared
	secrets are stored in \path{/usr/local/etc/radiusclient-ng/servers} file.

	Each line contains hostname of a RADIUS server and shared secret
	used in communication with that server. The two values are separated
	by white spaces. Configure shared secrets for every RADIUS server you
	are going to use.

	\textbf{File "dictionary"}
			
	Asterisk uses some attributes that are not included in the
	dictionary of radiusclient library, therefore it is necessary to add
	them. A file called dictionary.digium (kept in the contrib dir)
	was created to list all new attributes used by Asterisk.
	Add to the end of the main dictionary file
	\path{/usr/local/etc/radiusclient-ng/dictionary} the line:

		\$INCLUDE /path/to/dictionary.digium

\subsubsection{Install FreeRADIUS Server (Version 1.1.1)}

	Download sources tarball from:

		\url{http://freeradius.org/}
			
	Untar, configure, build, and install the server:

\begin{verbatim}
	root@localhost:/usr/local/src# tar xvfz freeradius-1.1.1.tar.gz
	root@localhost:/usr/local/src# cd freeradius-1.1.1
	root@localhost"/usr/local/src/freeradius-1.1.1# ./configure
	root@localhost"/usr/local/src/freeradius-1.1.1# make
	root@localhost"/usr/local/src/freeradius-1.1.1# make install
\end{verbatim}

	All the configuration files of FreeRADIUS server will be in
	/usr/local/etc/raddb directory.
		

\subsubsection{Configuration of the FreeRADIUS Server}
			
	There are several files that have to be modified to configure the
	RADIUS server. These are presented next.

	File "clients.conf"
			
	File \path{/usr/local/etc/raddb/clients.conf} contains description of
	RADIUS clients that are allowed to use the server. For each of the
	clients you need to specify its hostname or IP address and also a
	shared secret. The shared secret must be the same string you configured
	in radiusclient library.

	Example:
\begin{verbatim}
		client myhost {
		    secret = mysecret
		    shortname = foo
		}
\end{verbatim}	

	This fragment allows access from RADIUS clients on "myhost" if they use
	"mysecret" as the shared secret.	
	The file already contains an entry for localhost (127.0.0.1), so if you
	are running the RADIUS server on the same host as your Asterisk server,
	then modify the existing entry instead, replacing the default password.
		
	File "dictionary"
		
	Note: as of version 1.1.2, the dictionary.digium file ships with FreeRADIUS.
	The following procedure brings the dictionary.digium file to previous versions
	of FreeRADIUS.
	
	File \path{/usr/local/etc/raddb/dictionary} contains the dictionary of
	FreeRADIUS server. You have to add the same dictionary file
	(dictionary.digium), which you added to the dictionary of radiusclient-ng
	library. You can include it into the main file, adding the following line at the
	end of file \path{/usr/local/etc/raddb/dictionary}:
		
	\$INCLUDE /path/to/dictionary.digium

	That will include the same new attribute definitions that are used
	in radiusclient-ng library so the client and server will understand each
	other.


\subsubsection{Asterisk Accounting Configuration}

	Compilation and installation:

        The module will be compiled as long as the radiusclient-ng
        library has been detected on your system.
	
	By default FreeRADIUS server will log all accounting requests into
	\path{/usr/local/var/log/radius/radacct} directory in form of plain text files.
	The server will create one file for each hostname in the directory. The
	following example shows how the log files look like.

	Asterisk now generates Call Detail Records. See \path{/include/asterisk/cdr.h}
	for all the fields which are recorded. By default, records in comma
	separated values will be created in \path{/var/log/asterisk/cdr-csv}.

	The configuration file for cdr\_radius.so module is \path{/etc/asterisk/cdr.conf}
	
	This is where you can set CDR related parameters as well as the path to
	the radiusclient-ng library configuration file.


\section{Logged Values}
\begin{verbatim}
  "Asterisk-Acc-Code",          The account name of detail records
  "Asterisk-Src",
  "Asterisk-Dst",
  "Asterisk-Dst-Ctx",           The destination context
  "Asterisk-Clid",
  "Asterisk-Chan",              The channel
  "Asterisk-Dst-Chan",	        (if applicable)
  "Asterisk-Last-App",	        Last application run on the channel
  "Asterisk-Last-Data",         Argument to the last channel
  "Asterisk-Start-Time",
  "Asterisk-Answer-Time",
  "Asterisk-End-Time",
  "Asterisk-Duration",          Duration is the whole length that the entire
                                call lasted. ie. call rx'd to hangup
                                "end time" minus "start time"
  "Asterisk-Bill-Sec", 	        The duration that a call was up after other
                                end answered which will be <= to duration
                                "end time" minus "answer time"
  "Asterisk-Disposition",    	  ANSWERED, NO ANSWER, BUSY
  "Asterisk-AMA-Flags",       	DOCUMENTATION, BILL, IGNORE etc, specified on
                                a per channel basis like accountcode.
  "Asterisk-Unique-ID",         Unique call identifier
  "Asterisk-User-Field"	        User field set via SetCDRUserField
\end{verbatim}