Errata

Asterisk: The Definitive Guide

Errata for Asterisk: The Definitive Guide

Submit your own errata for this product.

The errata list is a list of errors and their corrections that were found after the product was released. If the error was corrected in a later version or reprint the date of the correction will be displayed in the column titled "Date Corrected".

The following errata were submitted by our customers and approved as valid errors by the author or editor.

Color key: Serious technical mistake Minor technical mistake Language or formatting error Typo Question Note Update

Version Location Description Submitted By Date submitted Date corrected
Printed
Page 214f
AstDB counting example

the example shows how to use the AstDB for counting.
The SayNumber function included in this example should read the current count value to the caller - but it cannot without Answering the call in the first place.

In short:
The first lines of the full example should look like this:

exten => 678,1,Answer()
same => n,Set(COUNT=${DB(test/count)})
same => n,GotoIf($[${ISNULL(${COUNT})}]?:continue)

Note from the Author or Editor:
I have corrected this in rev 606183 within the 9781449332426 repository.

Marco Meklenburg  Mar 11, 2013 
Printed
Page 212
Figure 10-1

Figure 10-1 shows a slight different time delay for channel 3 as e.g. Table 10-1 does.

Table 10-1 -as well as the text itself - states, that channel 3 shall ring from timecode "15" till "30".
But Figure 10-1 states Channel 3 to ring from timecode 15 till something at 38 seconds.

Nothing serious, not more than a typo.

Note from the Author or Editor:
This figure shows channel 3 as extending from 15 seconds until about 38 seconds or so. The graphic should be updated to match the text, by showing a bar from 15 seconds to 30 seconds on channel 3 (third line). Thanks!

Marco Meklenburg  Mar 11, 2013 
Printed, ePub
Page 207
1st paragraph, VoiceMail / IF() example

the line

same => n,VoiceMail(${MACRO_EXTEN},${IF($[${DIALSTATUS} = BUSY]?b:u)})

is missing the voicemail context. Used with the examples shipped with the book it should read

same => n,VoiceMail(${MACRO_EXTEN}@default,${IF($[${DIALSTATUS} = BUSY]?b:u)})

Note from the Author or Editor:
I have committed a change in 606153 of the 9781449332426/current repo.

Marco Meklenburg  Mar 11, 2013 
233
Last foot note

"So far as we can tell, Polycom sets do not support multicast. We certainly were not able to find a way to
use it."

The Polycom's implement a multicast paging system in firmware version 4.0.0 and above. Works quite well. I implemented an install of ~80 phones using. Not sure if that is already in edition 4 or not but thought I would throw it out there.

Note from the Author or Editor:
Fixed in the 4th edition

Bryan Anderson  Jan 31, 2013 
199
very top

when using example:

exten => 123,1,Set(TEST=example)
same => n,SayNumber(${LEN(${TEST})})

I hear no audio, but watching the console out I see the audio played, same with the example shortly following playing a count down from the number 10.

http://forums.digium.com/viewtopic.php?f=1&t=80824

This forum posting points out to add

same => n,answer() so correction would be

exten => 123,1,Set(TEST=example)
same => n,Answer()
same => n,SayNumber(${LEN(${TEST})})

After doing this all works well, same goes with SayDigits()

Note from the Author or Editor:
Modified in svn for ATDG 4e.

Bryan Anderson  Jan 30, 2013 
Other Digital Version
Chapter 16 - 'Installing and configuring ODBC' section
In the section 'Installing and configuring ODBC' from the chapter 16 'Relational Database Integration'

The section shows how to install the ODBC module and how to configure it. But it never says that you have to add to the file /etc/asterisk/modules.conf the following lines:

preload => res_odbc.so
preload => res_config_odbc.so

under the lines:

[modules]
autoload=yes

at the top of the file

Note from the Author or Editor:
Fix in subversion in ATDG 4e

Javier Zanon  Nov 22, 2012 
Other Digital Version
Chapter 16 - 'Using Realtime' section
In the section "Using Realtime" of the Chapter 16. "Relational Database Integration"

When the section talks how we can tell asterisk wich configuration files we want to load from the database (or wich dyinamic realtime objects we want to load from the database) it never says we have to write [settings] at the top of the /etc/asterisk/extconfig.conf file
The section doesn't say

Note from the Author or Editor:
Fixed in subversion, 4th edition

Javier Zanon  Nov 22, 2012 
Printed
Page 317
Under section "Testing"

I believe that "jabber show connected" should read as "jabber show connections" in (2) places on this page. I tested using Asterisk 1.8 and the command as documented in the book produces the error: No such command 'jabber show connected'

Note from the Author or Editor:
Thanks for catching this. It's been fixed in this and future versions.

Tom Mazzotta  Sep 03, 2012 
Other Digital Version
1
[2. Asterisk Architecture][File Structure][The Spool]

"The spool is where Linux stores files..."
- Linux (or any other kernel) does not store anything there, user-space programs are the ones that do so.

From the FHS (Filesystem hierarchy Standard):
/var/spool : Application spool data

Note from the Author or Editor:
Fixed in the repository for the 4th edition, thanks!

Fedja Beader  Aug 29, 2012 
Other Digital Version
1
Online - table 2.5 Channel Drives

Table 2.5 (Channel Drives) row 2 - has a pipe character before chan_alsa in column 1.

Note from the Author or Editor:
pipe should be removed, already removed in repo for 4th edition

Anonymous  May 11, 2012 
Other Digital Version
1
Chapter 7. VoIP Connecting two Asterisk systems together with SIP

Examples show username=xxx but Asterisk 1.8 reports:
The 'username' field for sip peers has been deprecated in favor of the term 'defaultuser'

Examples just need updated. Thanks

Note from the Author or Editor:
Thanks for submitting errata! As this is deprecated functionality, but not broken in the 3rd edition, the change has not been made there. However, it has been made for the 4th edition. Thanks!

Anonymous  May 08, 2012 
Other Digital Version
XIIII
Under sla.conf under Key system example with Analog trunk

Should the template for the 4 station read type=station instead of type=trunk? For the example box just above section extensions.conf

Note from the Author or Editor:
This is going to be updated and fixed in the 4th edition as that section is going to be reviewed and fixed. No change required for the 3rd edition at this time.

Anonymous  Apr 26, 2012 
Other Digital Version
ch 3

Kindle version.

In section describing how to change the asteriskpbx environment to include specific paths - the file to be changed is NOT called .bash_profile.
It is called ".bashrc"

Note from the Author or Editor:
Fixed in subversion in the 3rd edition. Removed from 4th edition as it is not required for RHEL 6.x

Paul McGrath  Apr 10, 2012 
Other Digital Version
ch3

Kindle version.

Ubuntu community recommend use of admin group - rather than wheel.

sudo adduser asteriskpbx
sudo adduser asteriskpbx admin


Note from the Author or Editor:
Not an issue in the 4th edition.

Paul McGrath  Apr 10, 2012 
Printed,
Page 361
'start' extension of 'multirow_example_2' context in sample code.

The line:

same => n,GotoIf($["${ODBC_FETCH_RESULT}" = "FAILURE"]?cleanup,1)

Should read:

same => n,GotoIf($["${ODBC_FETCH_STATUS}" = "FAILURE"]?cleanup,1)

In the example given, if '1104' didn't exist in the database, the dialplan would go into an infinite loop. I believe that it would be better to check for the absence of a success rather than the presence of a failure - that way even with the broken example given, an infinite loop could not happen.

I propose that the line should therefore be:

same => n,GotoIf($["${ODBC_FETCH_STATUS}" != "SUCCESS"]?cleanup,1)

It may be worth while pointing out that infinite loops could occur without sufficient error checking and that it is never a good idea to run Asterisk in realtime mode when testing things like this!!

Note from the Author or Editor:
I have fixed this in subversion.

Nicholas Barnes  Feb 11, 2012 
Other Digital Version
321

SOURCE: http://www.asteriskdocs.org/en/3rd_Edition/asterisk-book-html/asterisk-book.html#DeviceStates_id36061103

- Chapter 14. Device States
-- Shared Line Appearances
--- sla.conf

[station](!)
type = trunk
trunk = line1
trunk = line2
--------------------------
the line
"type = trunk"
should read
"type = station"

- Mark Norman

Note from the Author or Editor:
Fix in subversion.

Anonymous  Jan 30, 2012 
341
Throughout Chapter 16

In chapter 16 on Relational Database Integration many of the readsql variables shown are vulnerable to sql injection.

To avoid SQLi an attempt to sanitize user inputs should be made. In this case we are expecting numeric input so that is the only input we should accept.

I've listed this as serious technical mistake because depending on implementation it could lead to a loss of confidentiality, integrity, and availability. Please re-classify as you see fit.

Paul Scott  Dec 20, 2011 
Printed, Other Digital Version
Page 155
Top example code

We're using the [internal] context, but it would make more sense to use [LocalSets].

Leif Madsen
Leif Madsen
 
Nov 28, 2011 
Printed, PDF
Page 249
2nd sentence of 2nd paragraph in box at bottom of page

Redundant phrase at beginning and end of sentence:

For those countries fortunate enough to have ENUM in produc-
tion, you can perform ENUM lookups directly to their e164.arpa zones of those coun-
tries fortunate enough to have ENUM in production.

Note from the Author or Editor:
Edit sentence to read:

For those countries fortunate enough to have ENUM in production, you can perform ENUM lookups directly to their e164.arpa zones.

C.J. Adams-Collier  Nov 17, 2011 
PDF,
Page 349
Content of /etc/odbc.ini on page bottom

On ubuntu 10.04, the line

UserName = asterisk

must be changed to

User = asterisk

otherwise the connectivity test

$ echo "select 1" | isql asterisk-connector -v

gives back:

[MYODBCUtilReadDataSource.c][243][ERROR] Unknown attribute (UserName).
[08S01][unixODBC][MySQL][ODBC 3.51 Driver]Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
[ISQL]ERROR: Could not SQLConnect

Hope this will be useful for improving the experience of future readers. (What I am looking at is the latest HTML/online content; it has been also confirmed to be the same in the PDF, 3rd edition.)

Note from the Author or Editor:
No change required. Use a newer version of Ubuntu.

Yassen Damyanov  Nov 05, 2011 
Printed
Page 311
Halfway down -- could please as a note or new paragraph

Since we are running Asterisk as the 'asterisk' user in this book, the instructions as described here for the OpenAIS stuff won't quite work. You'll run into the following error on the Asterisk console when loading res_ais.so:

*CLI> module load res_ais.so
ERROR[19593]: ais/clm.c:140 ast_ais_clm_load_module: Could not initialize cluster membership service: Unknown

To fix this, you need to add some permissions stuff to corosync. I ran into the same issue when trying to load res_ais stuff, and found the solution on this page (we should attribute him):

http://felimwhiteley.wordpress.com/2011/07/11/asterisk-invalid-ipc-credentials-or-how-no-interwebs-saved-the-day/#wpl-likebox

Solution:

cat > /etc/corosync/uidgid.d/asterisk
uidgid {
uid: asterisk
gid: asterisk
}
CTRL+D

Leif Madsen
Leif Madsen
 
Oct 22, 2011 
Other Digital Version
unknown
Chapter 24 configuring SNMP among others

The book contains "sudo cat > snmpd.conf" and other "sudo cat > somefile" examples.

This cannot work, as the user running the shell will be opening the file for output, sudo won't help you there.

One could fix it by doing this:
sudo sh -c 'cat > snmpd.conf'
Or one could tell the user to edit these config files as root (or the owner of the files).

Note from the Author or Editor:
Russell has also said another trick we can use would be something like:

$ cat | sudo tee -a foo.txt

Walter Doekes  Oct 04, 2011 
Printed, PDF, , Other Digital Version
Page AGI
United States

In the AGI section, under the heading: "Async AGI--AMI Controlled AGI", the syntax used to force Asterisk to execute AGI scripts asynchronously is written as:

AGI(async:agi)

When in reality, it is actually the other way around:

AGI(agi:async)

Thanks!

-Randall

Note from the Author or Editor:
Fixed in:

https://prod.oreilly.com/external/authors/books/9780596517342/branches/3rd_edition

Merged to

https://prod.oreilly.com/external/authors/books/9780596517342/current

Randall Degges  Sep 24, 2011 
Printed
Page 352
res_odbc.conf file

In the res_odbc.conf file the following line

limit => 0

stops asterisk connecting to the MySQL database. When using CLI the command 'odbc show' does not show the DSN asterisk-connector. The solution was to remove the line.

Note from the Author or Editor:
Updated to be limit => 1 so that we would open at least one connection.

Committed to 3rd edition repo and current.

David Hanna  Aug 09, 2011  Sep 23, 2011
PDF
Page 352
Example configuration of res_odbc.conf

If you enable the option "limit =>0" using the PostgreSQL database, Asterisk will can not connect to the database:

[asterisk]
enabled => yes
dsn => asterisk-connector
username => asterisk
password => welcome
pooling => no
limit => 0
pre-connect => yes

When you execute "odbc show" into the Asterisk CLI the output will look like:

ODBC DSN Settings
-----------------



You need to disable this option:

[asterisk]
enabled => yes
dsn => asterisk-connector
username => asterisk
password => welcome
pooling => no
; limit => 0 ---Disable this option using PostgreSQL database---
pre-connect => yes


After you disabled this option the output of the Asterisk CLI will look like:

ODBC DSN Settings
-----------------

Name: asterisk
DSN: asterisk-connector
Last connection attempt: 1969-12-31 19:00:00
Pooled: No
Connected: Yes

Note from the Author or Editor:
Fixed!

Juan Muriel  Aug 03, 2011 
PDF
Page 265
lower middle

The paragraph:

"We?ve included the Queues context in the LocalSets context so that our telephones can call the queues we?ve set up. In Chapter 15, we?ll define menu items that go to these queues. Save the changes to your extensidons.conf file, and reload the dialplan with the dialplan reload CLI command."

Said "extensidons.conf" and should be: extensions.conf:

"We?ve included the Queues context in the LocalSets context so that our telephones can call the queues we?ve set up. In Chapter 15, we?ll define menu items that go to these queues. Save the changes to your extensions.conf file, and reload the dialplan with the dialplan reload CLI command."

Note from the Author or Editor:
Should be corrected as noted.

Juan Muriel  Jul 07, 2011  Sep 23, 2011
PDF
Page 338,339
Subtitle "The Dialplan" - Example code

In the code for the department's extensions, fax extension, directory extension, operator extension and, invalid and timeout extension (1, 2, 3, #, 0, i, t), the line with the Verbose() application is incomplete:

exten => 1,1,Verbose(1, ; Sales Queue - see Chapter 13 for details
same => n,Goto(Queues,7002,1)

exten => 2,1,Verbose(1, ; Service Queue - see Chapter 13 for details
same => n,Goto(Queues,7001,1)

exten => 3,1,Verbose(1,
same => n,Background() ; Address and fax info
same => n,Goto(s,menuprompt) ; Take caller back to main menu prompt

exten => #,1,Verbose(1,
same => n,Directory() ;

exten => 0,1,Verbose(1, ; Operator extension/queue
same => n,Dial(SIP/operator)

exten => i,1,Verbose(1,
same => n,Playback(invalid)
same => n,Goto(s,menuprompt)

exten => t,1,Verbose(1,
same => n,Goto(0,1)



Could be something like:

exten => 1,1,Verbose(1,Call to the Sales Extension) ; Sales Queue
same => n,Goto(Queues,7002,1)

exten => 2,1,Verbose(1,Call to the Sales Service) ; Service Queue
same => n,Goto(Queues,7001,1)

exten => 3,1,Verbose(1,Call to the address and fax info Extension)
same => n,Background() ; Address and fax info
same => n,Goto(s,menuprompt) ; Take caller back to main menu prompt

exten => #,1,Verbose(1,Call to the Directory Service Extension)
same => n,Directory() ;

exten => 0,1,Verbose(1, Call to the Operator Extension) ; Operator extension/queue
same => n,Dial(SIP/operator)

exten => i,1,Verbose(1,Incoming call to invalid number)
same => n,Playback(invalid)
same => n,Goto(s,menuprompt)

exten => t,1,Verbose(1,the caller doesn?t give input in time)
same => n,Goto(0,1)

Note from the Author or Editor:
Updated and fixed. Committed to 3rd_edition repo and current.

Juan Muriel  Jul 06, 2011  Sep 23, 2011
Printed
Page 202
3rd paragraph

The syntax for the GotoIfTime() application is incomplete. It omits to show the 'false' path label, after a colon. This is inconsistent with what is show for GotoIf() on page 199.

The syntax definition should read:

GotoIfTime(times,days_of_week,days_of_month,months?destination1:destination2)

and then the following explanation should be modified that destination1 is used if the date and time match the criteria, and destination2 is used otherwise.

(what is actually described is, I believe, the Asterisk 1.6 behaviour).

Note from the Author or Editor:
We should change the syntax example from:

GotoIfTime(times,days_of_week,days_of_month,months?label)

to:

GotoIfTime(times,days_of_week,days_of_month,months?labeliftrue[:labeliffalse])

Bob Eager  Jul 03, 2011  Sep 23, 2011
Printed
Page 255
Paragraph commencing with "The magic..."

The [subFreenum] context at the top of the page starts with a call to Verbose().

However, the paragraph commencing "The magic..." (about two thirds of the page down) says, in the second sentence: "After the NoOp() on the first line...".

Clearly this should say something like "After the initial call to Verbose()...".

Note from the Author or Editor:
Fixed in 3rd_edition repo and current repo.

Bob Eager  Jun 12, 2011  Sep 23, 2011
Printed, PDF, , Other Digital Version
Page 272
Error in dialplan syntax

; Used for unpausing agents in all available queues
exten => *87,1,Verbose(2,UnPausing member in all queues)
same => n,GoSub(subSetupAvailableQueues,start,1())

; if we don't define a queue, then the member is unpaused from all queues
same => n,UnPauseQueueMember(,${MemberChanType}/${MemberChannel})
same => n,GotoIf($[${PQMSTATUS} = PAUSED]?agent_unpaused,1:agent_not_found,1)


In Unpause section of dialplan there is a variable error it should be like following

same => n,GotoIf($[${UPQMSTATUS} = UNPAUSED]?agent_unpaused,1:agent_not_found,1)

Note from the Author or Editor:
Fixed and committed to 3rd_edition and current repos

Satish Patel  May 27, 2011  Sep 23, 2011
Printed
Page 569-570
Configuration section - under [Definitions]

Four of the lines for 'failregex =' are in error.

They are functionally all the same in the example - the text after '<HOST>' in each case has been wrapped (no problem there) but has acquired a '#' symbol at the start of the continued line, thus making it into a comment. There are four occurrences of this - one at the bottom of page 569, and three more at the top of page 570.

Note from the Author or Editor:
Fixed and committed to 3rd_edition and current repo

Bob Eager  May 23, 2011  Sep 23, 2011
Printed
Page 440
First line under 'Using Festival with Asterisk'

"we need to module" should read "we need to modify".

Note from the Author or Editor:
Fixed and committed to 3rd_edition and current.

Bob Eager  May 22, 2011  Sep 23, 2011
Printed
Page 159
Halfway down

There is an error in the description of the 'maxsilence' option.

The relationship to the value of 'minsecs' is inverted; in other words, it should say that if 'maxsilence' is set greater than or equal to 'minsecs', a warning will be generated.

Note from the Author or Editor:
fixed and committed in 3rd edition and current branches

Bob Eager  May 19, 2011  Sep 23, 2011
Printed
Page 133
Second example block

The first exten => line under [general] has a minor error. It reads:

exten => _NXXNXXXXXX,1,Dial({LOCAL}/$EXTEN})

and should of course read:

exten => _NXXNXXXXXX,1,Dial({LOCAL}/${EXTEN})

(i.e. there is a missing { before EXTEN)

Note from the Author or Editor:
The $EXTEN} is incorrect, and should be changed to be ${EXTEN}.

Leif: I have changed this in subversion.

Bob Eager  May 19, 2011  Sep 23, 2011
Printed
Page 171
Immediately after Table 8-5

The text says "To allow users to dial 8500...". But the following dialplan example says:

exten => *98,....

which is not the same thing at all!

Note from the Author or Editor:
Change verbiage from "To allow users to dial 8500 to check their voicemail" to "To allow users to dial an extension to check their voicemail, you could add an extension to the dialplan like this:"

Bob Eager  May 17, 2011  Sep 23, 2011
2
3rd paragraph (The Zapata Telephony Project)

Public Switched Telephone Interface(PSTN) -> Public Switched Telephone Network(PSTN)

Note from the Author or Editor:
Public Switched Telephone Network

Leif: I have fixed this in subversion.

Kunimitsu Arai  May 16, 2011  Sep 23, 2011
PDF, Other Digital Version
Page 155
Several places

All of the examples using Goto() are incorrect. They all omit the priority field, e.g.:

exten => 911,Goto(dialsap,1)

should be:

exten => 911,1,Goto(dialpsap,1)

This is a consistent error in this section.

Note from the Author or Editor:
[emergency-services]
exten => 911,1,Goto(dialpsap,1)
exten => 9911,1,Goto(dialpsap,1) ; some people will dial '9' because
; they're used to doing that from the PBX
exten => 999,1,Goto(dialpsap,1)
exten => 112,1,Goto(dialpsap,1)

exten => dialpsap,1,Verbose(1,Call initiated to PSAP!)
same => n,Dial(${LOCAL}/911) ; REPLACE 911 HERE WITH WHATEVER
; IS APPROPRIATE TO YOUR AREA

[internal]
include => emergency-services ; you have to have this in any context
; that has users in it




[no-emergency-services]
exten => 911,1,Goto(nopsap,1)
exten => 9911,1,Goto(nopsap,1) ; for people who dial '9' before external calls
exten => 999,1,Goto(nopsap,1)
exten => 112,1,Goto(nopsap,1)

exten => nopsap,1,Verbose(1,Call initiated to PSAP!)
same => n,Playback(no-emerg-service) ; you'll need to record this prompt

[remote-users]
include => no-emergency-services

Bob Eager  May 16, 2011  Sep 23, 2011
PDF
Page 78
lower middle

The text says to copy the indications.conf.sample from /usr/src/asterisk-complete/1.8/configs/. However, if you're following the setup til this page you would actually copy from ~/src/asterisk-complete/asterisk/1.8/configs. Also, you might want to add sudo cp for those of us who are still learning Linux.

Note from the Author or Editor:
Throughout the book (chapters 3, 4, 6, 18, and 24) there is 1-2 instances of /usr/src/asterisk-complete/... which should be changed to ~/src/asterisk-complete/...

I've changed this in subversion and merged from the 3rd_edition repo to current.

PhilMDev  Apr 13, 2011  Sep 23, 2011
Printed
Page 61
Middle of the page

When attempting to follow the instructions regarding
menuselect. It appears that it was already setup for curses. Also, you
specify (for CentOS) sudo yum install libnewt-devel. It's actually sudo
yum install newt-devel.
(http://www.hikaro.com/linux/newt-library-libnewt-not-found.html)

And, once you have installed newt you have to go through the process to
clear out menuselect and create it again.

Note from the Author or Editor:
I have updated the sidebar in subversion to say "yum install newt-devel".

O'Reilly, you'll need to update 'CentOS: yum install libnewt-devel' to be 'CentOS: yum install newt-devel'.

This is in the sidebar in chapter 3.

Anonymous  Apr 13, 2011  Sep 23, 2011
Printed, PDF, , Other Digital Version
Page 223
findslot row in table

There is a broken cross reference in the findslot row of the table on page 223. It says:

"Configures the parking slot selection behavior. See ??? for more details."

"???" should be replaced with some text

Note from the Author or Editor:
I don't have access to the latest changes, but if this is true, it should be pretty obvious what needs to be updated :) If not, then let me know!

Leif: I have updated the 3rd_edition and current repositories. In chapter 11, in the table where findslot is documented, there is a link to findslot_details which has no text. I've added "Parking Lots" as the link text.

Anonymous  Apr 11, 2011