function voicemail_saveVoicemail($vmconf) { global $amp_conf; // just in case someone tries to be sneaky and not call getVoicemail() first.. if ($vmconf == null) { die_freepbx('Error: Trying to write null voicemail file! I refuse to contiune!'); } // yes, this is hardcoded.. is this a bad thing? write_voicemailconf(rtrim($amp_conf["ASTETCDIR"], "/") . "/voicemail.conf", $vmconf, $section); }
/** Write the voicemail.conf file * This is called by saveVoicemail() * It's important to make a copy of $vmconf before passing it. Since this is a recursive function, has to * pass by reference. At the same time, it removes entries as it writes them to the file, so if you don't have * a copy, by the time it's done $vmconf will be empty. */ function write_voicemailconf($filename, &$vmconf, &$section, $iteration = 0) { global $amp_conf; if ($iteration == 0) { $section = null; } $output = array(); // if the file does not, copy if from the template. // TODO: is this logical? if (!file_exists($filename)) { if (!copy(rtrim($amp_conf["ASTETCDIR"], "/") . "/voicemail.conf.template", $filename)) { return; } } $fd = fopen($filename, "r"); while ($line = fgets($fd, 1024)) { if (preg_match("/^(\\s*)(\\d+)(\\s*)=>(\\s*)(\\d*),(.*),(.*),(.*),(.*)(\\s*[;#].*)?\$/", $line, $matches)) { // "mailbox=>password,name,email,pager,options" // this is a voicemail line //DEBUG echo "\nmailbox"; // make sure we have something as a comment if (!isset($matches[10])) { $matches[10] = ""; } // $matches[1] [3] and [4] are to preserve indents/whitespace, we add these back in if (isset($vmconf[$section][$matches[2]])) { // we have this one loaded // repopulate from our version $temp =& $vmconf[$section][$matches[2]]; $options = array(); foreach ($temp["options"] as $key => $value) { $options[] = $key . "=" . $value; } $output[] = $matches[1] . $temp["mailbox"] . $matches[3] . "=>" . $matches[4] . $temp["pwd"] . "," . $temp["name"] . "," . $temp["email"] . "," . $temp["pager"] . "," . implode("|", $options) . $matches[10]; // remove this one from $vmconf unset($vmconf[$section][$matches[2]]); } else { // we don't know about this mailbox, so it must be deleted // (and hopefully not JUST added since we did read_voiceamilconf) // do nothing } } else { if (preg_match('/^(\\s*)#include(\\s+)["\']{0,1}([^"\']*)["\']{0,1}(\\s*[;#].*)?$/', $line, $matches)) { // include another file //DEBUG echo "\ninclude ".$matches[3]."<blockquote>"; // make sure we have something as a comment if (!isset($matches[4])) { $matches[4] = ""; } if ($matches[3][0] == "/") { // absolute path $include_filename = trim($matches[3]); } else { // relative path $include_filename = dirname($filename) . "/" . trim($matches[3]); } $output[] = trim($matches[0]); write_voicemailconf($include_filename, $vmconf, $section, $iteration + 1); //DEBUG echo "</blockquote>"; } else { if (preg_match("/^(\\s*)\\[(.+)\\](\\s*[;#].*)?\$/", $line, $matches)) { // section name //DEBUG echo "\nsection"; // make sure we have something as a comment if (!isset($matches[3])) { $matches[3] = ""; } // check if this is the first run (section is null) if ($section !== null) { // we need to add any new entries here, before the section changes //DEBUG echo "<blockquote><i>"; //DEBUG var_dump($vmconf[$section]); if (isset($vmconf[$section])) { //need this, or we get an error if we unset the last items in this section - should probably automatically remove the section/context from voicemail.conf foreach ($vmconf[$section] as $key => $value) { if (is_array($value)) { // mailbox line $temp =& $vmconf[$section][$key]; $options = array(); foreach ($temp["options"] as $key1 => $value) { $options[] = $key1 . "=" . $value; } $output[] = $temp["mailbox"] . " => " . $temp["pwd"] . "," . $temp["name"] . "," . $temp["email"] . "," . $temp["pager"] . "," . implode("|", $options); // remove this one from $vmconf unset($vmconf[$section][$key]); } else { // option line $output[] = $key . "=" . $vmconf[$section][$key]; // remove this one from $vmconf unset($vmconf[$section][$key]); } } } //DEBUG echo "</i></blockquote>"; } $section = strtolower($matches[2]); $output[] = $matches[1] . "[" . $section . "]" . $matches[3]; $existing_sections[] = $section; //remember that this section exists } else { if (preg_match("/^(\\s*)([a-zA-Z0-9-_]+)(\\s*)=(\\s*)(.*?)(\\s*[;#].*)?\$/", $line, $matches)) { // name = value // option line //DEBUG echo "\noption line"; // make sure we have something as a comment if (!isset($matches[6])) { $matches[6] = ""; } if (isset($vmconf[$section][$matches[2]])) { $output[] = $matches[1] . $matches[2] . $matches[3] . "=" . $matches[4] . $vmconf[$section][$matches[2]] . $matches[6]; // remove this one from $vmconf unset($vmconf[$section][$matches[2]]); } // else it's been deleted, so we don't write it in } else { // unknown other line -- probably a comment or whitespace //DEBUG echo "\nother: ".$line; $output[] = str_replace(array("\n", "\r"), "", $line); // str_replace so we don't double-space } } } } } if ($iteration == 0 && is_array($vmconf)) { // we need to add any new entries here, since it's the end of the file //DEBUG echo "END OF FILE!! <blockquote><i>"; //DEBUG var_dump($vmconf); foreach (array_keys($vmconf) as $section) { if (!in_array($section, $existing_sections)) { // If this is a new section, write the context label $output[] = "[" . $section . "]"; } foreach ($vmconf[$section] as $key => $value) { if (is_array($value)) { // mailbox line $temp =& $vmconf[$section][$key]; $options = array(); foreach ($temp["options"] as $key => $value) { $options[] = $key . "=" . $value; } $output[] = $temp["mailbox"] . " => " . $temp["pwd"] . "," . $temp["name"] . "," . $temp["email"] . "," . $temp["pager"] . "," . implode("|", $options); // remove this one from $vmconf unset($vmconf[$section][$key]); } else { // option line $output[] = $key . "=" . $vmconf[$section][$key]; // remove this one from $vmconf unset($vmconf[$section][$key]); } } } //DEBUG echo "</i></blockquote>"; } fclose($fd); //DEBUG echo "\n\nwriting ".$filename; //DEBUG echo "\n-----------\n"; //DEBUG echo implode("\n",$output); //DEBUG echo "\n-----------\n"; // write this file back out if ($fd = fopen($filename, "w")) { fwrite($fd, implode("\n", $output) . "\n"); fclose($fd); } }
function saveVoicemail($vmconf) { // yes, this is hardcoded.. is this a bad thing? write_voicemailconf("/etc/asterisk/voicemail.conf", $vmconf, $section); }