If you are writing for Asterisk PBX, you may feel the need to create a public telephone directory.
Today we’ve been putting together Phonebook, a web-based phonebook which pulls data from an asterisk server. We used JQTouch for the interface, with PHP to process data files. We also use a CSV file exported from our hosted gmail to ensure that people’s names are spelled correctly.
The configuration
Asterisk’s configuration files are INI-like, and you’ll find them in /etc/asterisk/ on most systems. Just one important thing though, asterisk lets you use brackets ( )
in caller-IDs, etc, which will cause PHP’s parse_ini_file() function to fizzle out and die due to an alleged syntax error.
To save yourself some trouble, use this little class I wrote, which will load INI data into an associative array:
class ns_ini_parser {
/* Mike's non-standard INI parser for asterisk files. https://mike42.me
Note that PHP's parse_ini_file will die with a syntax error on key = value (bracket), which is unacceptable */
function parse_string($string) {
$lines = explode("n", $string);
$section = "0";
$result = array();
foreach($lines as $line) {
$line = trim($line);
if($line == "" || substr($line, 0,1) == ";") {
/* Comment, no action */
} elseif(substr($line, 0,1) == "[") { /* [section] */
$l = strlen($line);
$line = trim(substr($line, 1, $l - 2)); /* Strip brackets */
$section = $line;
if(!isset($result[$section])) {
$result[$section] = array();
}
} else { /* key = val */
$parts = explode("=", $line);
$key = trim($parts[0]); /* The key is everything left of the equal */
unset($parts[0]); /* Got that, unset it */
$val = trim(join("=", $parts)); /* Value is everything on the righht */
$result[$section][$key] = $val;
}
}
return $result;
}
function parse_file($path) {
$string = file_get_contents($path);
return $this -> parse_string($string);
}
}
The example usage below will list user’s extensions next to their caller ID, which you could use for a web phonebook:
/* Example PHP code to parse asterisk configuration */
$config_parser = new ns_ini_parser;
$users = $config_parser -> parse_file("/etc/asterisk/users.conf");
foreach($users as $id => $user) {
if(is_numeric($id)) { /* Only show numbers, not other sections */
echo "<a href="tel:$id">$id</a> ".$user['fullname']."<br />";
}
}
I don’t think it gets easier than that! I’ll post the rest once you can manage the contacts as well.