/** * Query Asterisk for the supported formats * @param array $formats Previously supported formats * @return array Array of formats */ public static function supportedCodecs(&$formats) { if (!empty(self::$supported)) { return self::$supported; } $loc = fpbx_which("asterisk"); exec($loc . " -rx 'core show file formats'", $lines, $ret); foreach ($lines as $line) { if (preg_match('/([a-z0-9\\|]*)$/i', $line, $matches)) { $l = trim($matches[1]); $codecs = explode("|", $matches[1]); foreach ($codecs as $codec) { if (!in_array($codec, array('gsm', 'g722', 'alaw', 'ulaw', 'sln', 'wav16', 'WAV', 'sln12', 'sln16', 'sln24', 'sln32', 'sln44', 'sln48', 'sln96', 'sln192'))) { continue; } $formats["in"][$codec] = $codec; $formats["out"][$codec] = $codec; } } } $lines = null; exec($loc . " -rx 'g729 show licenses'", $lines, $ret); foreach ($lines as $line) { if (preg_match('/licensed channels are currently in use/', $line)) { $formats["in"]['g729'] = 'g729'; $formats["out"]['g729'] = 'g729'; } } $formats["out"]["wav"] = "wav"; $formats["out"]["WAV"] = "WAV"; $formats["in"]["wav"] = "wav"; $formats["in"]["WAV"] = "WAV"; self::$supported = $formats; return self::$supported; }
/** * Get Local routes * @return array Array of routes */ public function getRoutes() { // Return a list of routes the machine knows about. $route = fpbx_which('route'); if (empty($route)) { return array(); } exec("{$route} -nv", $output, $retcode); if ($retcode != 0 || empty($output)) { return array(); } // Drop the first two lines, which are just headers.. array_shift($output); array_shift($output); // Now loop through whatever's left $routes = array(); foreach ($output as $line) { $arr = preg_split('/\\s+/', $line); if (count($arr) < 3) { //some strange value we dont understand continue; } if ($arr[2] == "0.0.0.0" || $arr[2] == "255.255.255.255") { // Don't care about default or host routes continue; } if (substr($arr[0], 0, 7) == "169.254") { // Ignore ipv4 link-local addresses. See RFC3927 continue; } $cidr = 32 - log((ip2long($arr[2]) ^ 4294967295.0) + 1, 2); $routes[] = array($arr[0], $cidr); } return $routes; }
public static function installed() { $loc = fpbx_which("lame"); $process = new Process($loc . ' --version'); $process->run(); // executes after the command finishes if (!$process->isSuccessful()) { return false; } return true; }
public function __construct($debug = 0) { $this->defaults['server_cn'] = $this->getHostname(); if (is_int($debug)) { $this->debug = $debug; } else { $this->debug = 0; } if (function_exists('fpbx_which')) { $command = fpbx_which('openssl'); $this->openssl = !empty($command) ? $command : $this->openssl; } }
public static function installed() { $loc = fpbx_which("sox"); $process = new Process($loc . ' --version'); $process->run(); // executes after the command finishes $nt = \notifications::create(); if (!$process->isSuccessful()) { $nt->add_warning("FRAMEWORK", "MISSING_SOX", _("System is missing SOX"), _("To perform the minimal amount of file conversions for HTML5 support and conversion support you need to at least install SOX"), "http://wiki.freepbx.org/display/FOP/Installing+Media+Conversion+Libraries"); return false; } else { $nt->delete("FRAMEWORK", "MISSING_SOX"); } return true; }
/** * Get info on a tiff file. Require tiffinfo * @param string - absolute path to file * @param string - specifc option to receive * * @return mixed - if $opt & exists returns a string, else bool false, * otherwise an array of details */ function fax_tiffinfo($file, $opt = '') { //ensure file exists if (!is_file($file)) { return false; } $tiffinfo = fpbx_which('tiffinfo'); $info = array(); if (!$tiffinfo) { return false; } exec($tiffinfo . ' ' . $file, $output); if ($output && strpos($output[0], 'Not a TIFF or MDI file') === 0) { return false; } foreach ($output as $out) { $o = explode(':', $out, 2); $info[trim($o[0])] = isset($o[1]) ? trim($o[1]) : ''; } if (!$info) { return false; } //special case prossesing //Page Number: defualt format = 0-0. Use only first set of digits, increment by 1 $info['Page Number'] = explode('-', $info['Page Number']); $info['Page Number'] = $info['Page Number'][0] + 1; if ($opt) { return isset($info[$opt]) ? $info[$opt] : false; } return $info; }
//action actions switch ($var['action']) { case 'download': $var['restore_path'] = backup_restore_locate_file($var['id'], $var['restore_path']); $_SESSION['backup_restore_path'] = $var['restore_path']; download_file($var['restore_path']); break; case 'upload': //make sure our file was uploaded if (!is_uploaded_file($_FILES['upload']['tmp_name'])) { $message = _('Error uploading file!'); $var['action'] = ''; break; } //ensure uploaded file is a valid tar file exec(fpbx_which('tar') . ' -tf ' . $_FILES['upload']['tmp_name'], $array, $ret_code); if ($ret_code !== 0) { $message = _('Error verifying uploaded file!'); $var['action'] = ''; break; } $dest = $amp_conf['ASTSPOOLDIR'] . '/tmp/' . 'backuptmp-suser-' . time() . '-' . basename($_FILES['upload']['name']); move_uploaded_file($_FILES['upload']['tmp_name'], $dest); //$var['restore_path'] = $dest; $_SESSION['backup_restore_path'] = $dest; break; case 'list_dir': echo json_encode(backup_jstree_list_dir($var['id'], $var['path'])); exit; break; case 'backup_list':
unlink($path); // Now, if we're selected skipnat, restore everything we backed up // before the import. if ($skipnat) { backup_log(_('Restoring NAT settings')); $ss = FreePBX::create()->Sipsettings; $ss->setConfig('localnets', $backup['localnets']); $ss->setConfig('externip', $backup['externip']); } } } // How about ASTDB? if (isset($items['astdb']) || isset($items['settings']) && $items['settings'] == 'true') { if ($manifest['astdb'] != '') { backup_log(_('Restoring astDB...')); $cmd[] = fpbx_which('tar'); $cmd[] = 'zxOf'; $cmd[] = $vars['restore']; $cmd[] = './' . $manifest['astdb']; exec(implode(' ', $cmd), $file); astdb_put(unserialize($file[0]), array('RINGGROUP', 'BLKVM', 'FM', 'dundi')); unset($cmd); } backup_log(_('Restoring Settings complete')); } //dbug($file); //run hooks if (isset($manifest['hooks']['post_restore']) && $manifest['hooks']['post_restore']) { backup_log(_('Running post restore script...')); exec($manifest['hooks']['post_restore']); }
/** * Update AMI credentials in manager.conf * * @author Philippe Lindheimer * @pram mixed $user false means don't change * @pram mixed $pass password false means don't change * @pram mixed $writetimeout false means don't change * @returns boolean * * allows FreePBX to update the manager credentials primarily used by Advanced Settings and Backup and Restore. */ function fpbx_ami_update($user = false, $pass = false, $writetimeout = false) { global $amp_conf, $astman, $db, $bootstrap_settings; $conf_file = $amp_conf['ASTETCDIR'] . '/manager.conf'; $ret = $ret2 = $ret3 = 0; $output = array(); if (strpos($amp_conf['ASTETCDIR'], "..") === false && !file_exists($conf_file)) { return; } if ($user !== false && $user != '') { $sed_arg = escapeshellarg('s/\\s*\\[general\\].*$/TEMPCONTEXT/;s/\\[.*\\]/\\[' . $amp_conf['AMPMGRUSER'] . '\\]/;s/^TEMPCONTEXT$/\\[general\\]/'); exec("sed -i.bak {$sed_arg} {$conf_file}", $output, $ret); if ($ret) { freepbx_log(FPBX_LOG_ERROR, sprintf(_("Failed changing AMI user to [%s], internal failure details follow:"), $amp_conf['AMPMGRUSER'])); foreach ($output as $line) { freepbx_log(FPBX_LOG_ERROR, sprintf(_("AMI failure details:"), $line)); } } } if ($pass !== false && $pass != '') { unset($output); $sed_arg = escapeshellarg('s/secret\\s*=.*$/secret = ' . $amp_conf['AMPMGRPASS'] . '/'); exec("sed -i.bak {$sed_arg} {$conf_file}", $output2, $ret2); if ($ret2) { freepbx_log(FPBX_LOG_ERROR, sprintf(_("Failed changing AMI password to [%s], internal failure details follow:"), $amp_conf['AMPMGRPASS'])); foreach ($output as $line) { freepbx_log(FPBX_LOG_ERROR, sprintf(_("AMI failure details:"), $line)); } } // We've changed the password, let's update the notification // $nt = notifications::create($db); $freepbx_conf =& freepbx_conf::create(); if ($amp_conf['AMPMGRPASS'] == $freepbx_conf->get_conf_default_setting('AMPMGRPASS')) { if (!$nt->exists('core', 'AMPMGRPASS')) { $nt->add_warning('core', 'AMPMGRPASS', _("Default Asterisk Manager Password Used"), _("You are using the default Asterisk Manager password that is widely known, you should set a secure password")); } } else { $nt->delete('core', 'AMPMGRPASS'); } } //attempt to set writetimeout unset($output); if ($writetimeout) { $sed_arg = escapeshellarg('s/writetimeout\\s*=.*$/writetimeout = ' . $amp_conf['ASTMGRWRITETIMEOUT'] . '/'); exec("sed -i.bak {$sed_arg} {$conf_file}", $output3, $ret3); if ($ret3) { freepbx_log(FPBX_LOG_ERROR, sprintf(_("Failed changing AMI writetimout to [%s], internal failure details follow:"), $amp_conf['ASTMGRWRITETIMEOUT'])); foreach ($output as $line) { freepbx_log(FPBX_LOG_ERROR, sprintf(_("AMI failure details:"), $line)); } } } if ($ret || $ret2 || $ret3) { dbug("aborting early because previous errors"); return false; } if (is_object($astman) && method_exists($astman, "connected") && $astman->connected()) { $ast_ret = $astman->Command('module reload manager'); } else { unset($output); dbug("no astman connection so trying to force through linux command line"); exec(fpbx_which('asterisk') . " -rx 'module reload manager'", $output, $ret2); if ($ret2) { freepbx_log(FPBX_LOG_ERROR, _("Failed to reload AMI, manual reload will be necessary, try: [asterisk -rx 'module reload manager']")); } } if (is_object($astman) && method_exists($astman, "connected") && $astman->connected()) { $astman->disconnect(); } if (!is_object($astman) || !method_exists($astman, "connected")) { //astman isn't initiated so escape return true; } if (!($res = $astman->connect($amp_conf["ASTMANAGERHOST"] . ":" . $amp_conf["ASTMANAGERPORT"], $amp_conf["AMPMGRUSER"], $amp_conf["AMPMGRPASS"], $bootstrap_settings['astman_events']))) { // couldn't connect at all freepbx_log(FPBX_LOG_CRITICAL, "Connection attmempt to AMI failed"); } else { $bmo = FreePBX::create(); $bmo->astman = $astman; } return true; }
/** * Get last X lines of log file, with html tags to provide highlighting */ function logfiles_get_logfile($lines = 500, $file, $filter = false) { global $amp_conf; $files = logfiles_list(); $logfile = $amp_conf['ASTLOGDIR'] . '/' . $files[$file]; if (!file_exists($logfile) || !is_file($logfile)) { echo _('Error parsing log file or file not found!'); return; } $channels = array(); exec(fpbx_which('tail') . ' -n' . $lines . ' ' . $logfile, $log); if ($filter) { $regex_check = @preg_match('/' . $filter . '/', null); if ($regex_check !== 0) { echo _("Invalid pattern"); return; } else { $log = preg_grep('/' . $filter . '/', $log); } } //If we filter out all the things.... if (empty($log)) { echo _("No lines returned"); return; } foreach ($log as $l) { switch (true) { case strpos($l, 'INFO'): $l = '<span class="beige">' . htmlentities($l, ENT_COMPAT | ENT_HTML401, "UTF-8") . '</span>'; break; case strpos($l, 'WARNING'): $l = '<span class="orange">' . htmlentities($l, ENT_COMPAT | ENT_HTML401, "UTF-8") . '</span>'; break; case strpos($l, 'DEBUG'): $l = '<span class="green">' . htmlentities($l, ENT_COMPAT | ENT_HTML401, "UTF-8") . '</span>'; break; case strpos($l, 'UPDATE'): case strpos($l, 'NOTICE'): $l = '<span class="cyan">' . htmlentities($l, ENT_COMPAT | ENT_HTML401, "UTF-8") . '</span>'; break; case strpos($l, 'FATAL'): case strpos($l, 'CRITICAL'): case strpos($l, 'ERROR'): $l = '<span class="red">' . htmlentities($l, ENT_COMPAT | ENT_HTML401, "UTF-8") . '</span>'; break; default: $l = logfiles_highlight_asterisk(htmlentities($l, ENT_NOQUOTES, "UTF-8"), $channels); break; } echo $l . '<br />'; } }
function _process_archive($filename, $progress_callback = '') { global $amp_conf; if (is_readable($filename) !== TRUE) { return array(sprintf(_('Unable to save %s'), $filename)); } // invoke progress callback if (isset($progress_callback)) { if (!is_array($progress_callback) && function_exists($progress_callback)) { $progress_callback('untar', array('module' => $modulename, 'size' => filesize($filename))); } else { if (is_array($progress_callback) && method_exists($progress_callback[0], $progress_callback[1])) { $progress_callback[0]->{$progress_callback}[1]('untar', array('module' => $modulename, 'size' => filesize($filename))); } } } $temppath = $amp_conf['AMPWEBROOT'] . '/admin/modules/_cache/' . uniqid("upload"); if (!@mkdir($temppath)) { return array(sprintf(_("Error creating temporary directory: %s"), $temppath)); } $extension = pathinfo($filename, PATHINFO_EXTENSION); if (preg_match('/^(gpg)$/', $extension)) { try { if (!FreePBX::GPG()->verifyFile($filename)) { return array(sprintf(_('File Integrity failed for %s - aborting (GPG Verify File check failed)'), $filename)); } } catch (\Exception $e) { return array(sprintf(_('File Integrity failed for %s - aborting (Cause: %s)'), $filename, $e->getMessage())); } try { $filename = FreePBX::GPG()->getFile($filename); if (!file_exists($filename)) { return array(sprintf(_('Could not find extracted module: %s'), $filename)); } $extension = pathinfo($filename, PATHINFO_EXTENSION); } catch (\Exception $e) { return array(sprintf(_('Unable to work with GPG file, message was: %s'), $e->getMessage())); } } switch (true) { case preg_match('/^(tgz|tar)$/', $extension) || preg_match('/(tar\\.gz)$/', $filename): $err = exec("/usr/bin/env tar zxf " . escapeshellarg($filename) . " -C " . escapeshellarg($temppath), $output, $exitcode); if ($exitcode != 0) { return array(sprintf(_('Error from %s: %s'), 'tar', $err)); } break; case preg_match('/^(zip)$/', $extension): exec("/usr/bin/env unzip", $output, $exitcode); if ($exitcode != 0) { return array(_("The binary unzip is not installed. Unable to work with zip file")); } $err = exec("/usr/bin/env unzip " . escapeshellarg($filename) . " -d " . escapeshellarg($temppath), $output, $exitcode); if ($exitcode != 0) { return array(sprintf(_('Error from %s: %s'), 'unzip', $err)); } break; case preg_match('/^(bz2|bz|tbz2|tbz)$/', $extension): $err = exec("/usr/bin/env tar xjf " . escapeshellarg($filename) . " -C " . escapeshellarg($temppath), $output, $exitcode); if ($exitcode != 0) { return array(sprintf(_('Error from %s: %s'), 'tar', $err)); } break; default: return array(sprintf(_('Unknown file format of %s for %s, supported formats: tar,tgz,tar.gz,zip,bzip'), $extension, basename($filename))); break; } // since untarring was successful, remvove the tarball so they do not accumulate if (unlink($filename) === false) { freepbx_log(FPBX_LOG_WARNING, sprintf(_("failed to delete %s from cache directory after opening module archive."), $filename)); } if (!file_exists($temppath . '/module.xml')) { $dirs = glob($temppath . '/*', GLOB_ONLYDIR); if (count($dirs) > 1 || !count($dirs)) { return array(sprintf(_('Incorrect Number of Directories for %s'), $filename)); } $archivepath = $dirs[0]; } else { $archivepath = $temppath; } if (!file_exists($archivepath . '/module.xml')) { return array(sprintf(_('Missing module.xml in %s'), $filename)); } $xml = simplexml_load_file($archivepath . '/module.xml'); $modulename = (string) $xml->rawname; $this->downloadedRawname = !empty($modulename) ? $modulename : ""; if (empty($modulename)) { return array(sprintf(_('Module Name is blank in %s'), $filename)); } if (file_exists($amp_conf['AMPWEBROOT'] . "/admin/modules/" . $modulename)) { exec("rm -rf " . $amp_conf['AMPWEBROOT'] . "/admin/modules/" . $modulename, $output, $exitcode); if ($exitcode != 0) { return array(sprintf(_('Could not remove old module %s to install new version'), $amp_conf['AMPWEBROOT'] . '/admin/modules/' . $modulename)); } } //we just deleted it, if we cant recreate it then we have some serious issues going on if (!@mkdir($amp_conf['AMPWEBROOT'] . "/admin/modules/" . $modulename)) { return array(sprintf(_("Error creating module directory: %s"), $amp_conf['AMPWEBROOT'] . "/admin/modules/" . $modulename)); } $installBinary = fpbx_which("install"); exec(sprintf("%s -d -o %s -g %s %s %s", $installBinary, $amp_conf['AMPASTERISKWEBUSER'], $amp_conf['AMPASTERISKWEBGROUP'], $archivepath . "/*", $amp_conf['AMPWEBROOT'] . "/admin/modules/" . $modulename . "/"), $output, $exitcode); if ($exitcode != 0) { $output = ''; exec("cp -R " . $archivepath . "/* " . $amp_conf['AMPWEBROOT'] . "/admin/modules/" . $modulename . "/", $output, $exitcode); } if ($exitcode != 0) { exec("rm -Rf " . escapeshellarg($amp_conf['AMPWEBROOT'] . '/admin/modules/_cache/' . $time . '/')); if ($exitcode != 0) { return array(sprintf(_('Could not remove temp storage at %s'), $amp_conf['AMPWEBROOT'] . '/admin/modules/_cache/' . $time)); } return array(sprintf(_('Could not move %s to %s'), $amp_conf['AMPWEBROOT'] . "/admin/modules/_cache/" . $time . "/" . $modulename, $amp_conf['AMPWEBROOT'] . '/admin/modules/')); } exec("rm -rf {$temppath}", $output, $exitcode); if ($exitcode != 0) { return array(sprintf(_('Could not remove temporary location %s'), $temppath)); } // invoke progress_callback if (isset($progress_callback)) { if (!is_array($progress_callback) && function_exists($progress_callback)) { $progress_callback('done', array('module' => $modulename)); } else { if (is_array($progress_callback) && method_exists($progress_callback[0], $progress_callback[1])) { $progress_callback[0]->{$progress_callback}[1]('done', array('module' => $modulename)); } } } return true; }
/** * Check and/or update all certificates * * If a certificate can't be automatically updated add a notice in the interface * * @return [type] [description] */ public function checkUpdateCertificates() { $certs = $this->getAllManagedCertificates(); $messages = array(); foreach ($certs as $cert) { $cert = $this->getAdditionalCertDetails($cert); if (empty($cert['files'])) { //there are no files so delete this one $this->removeCertificate($cert['cid']); $messages[] = array('type' => 'danger', 'message' => sprintf(_('There were no files left for certificate "%s" so it was removed'), $cert['basename'])); continue; } $validTo = $cert['info']['crt']['validTo_time_t']; $renewafter = $validTo - 86400 * 30; $update = false; if (time() > $validTo) { if ($cert['type'] == 'le') { try { $this->updateLE($cert['info']['crt']['subject']['CN']); $messages[] = array('type' => 'success', 'message' => sprintf(_('Successfully updated certificate named "%s"'), $cert['basename'])); $this->FreePBX->astman->Reload(); //Until https://issues.asterisk.org/jira/browse/ASTERISK-25966 is fixed $a = fpbx_which("asterisk"); if (!empty($a)) { exec($a . " -rx 'dialplan reload'"); } $update = true; } catch (\Exception $e) { $messages[] = array('type' => 'danger', 'message' => sprintf(_('There was an error updating certificate "%s": %s'), $cert['basename'], $e->getMessage())); continue; } } else { $messages[] = array('type' => 'warning', 'message' => sprintf(_('Certificate named "%s" has expired. Please update this certificate in Certificate Manager'), $cert['basename'])); continue; } } elseif (time() > $renewafter) { if ($cert['type'] == 'le') { try { $this->updateLE($cert['info']['crt']['subject']['CN']); $messages[] = array('type' => 'success', 'message' => sprintf(_('Successfully updated certificate named "%s"'), $cert['basename'])); $this->FreePBX->astman->Reload(); //Until https://issues.asterisk.org/jira/browse/ASTERISK-25966 is fixed $a = fpbx_which("asterisk"); if (!empty($a)) { exec($a . " -rx 'dialplan reload'"); } $update = true; } catch (\Exception $e) { $messages[] = array('type' => 'danger', 'message' => sprintf(_('There was an error updating certificate "%s": %s'), $cert['basename'], $e->getMessage())); continue; } } else { $messages[] = array('type' => 'warning', 'message' => sprintf(_('Certificate named "%s" is going to expire in less than a month. Please update this certificate in Certificate Manager'), $cert['basename'])); continue; } } else { $messages[] = array('type' => 'success', 'message' => sprintf(_('Certificate named "%s" is valid'), $cert['basename'])); } //trigger hook $this->updateCertificate($cert, $cert['description']); } $nt = \notifications::create(); $notification = ''; foreach ($messages as $m) { switch ($m['type']) { case "warning": case "danger": $notification .= $m['message'] . "</br>"; break; } } if (!empty($notification)) { $nt->add_security("certman", "EXPIRINGCERTS", _("Some Certificates are expiring or have expired"), $notification, "config.php?display=certman", true, true); } if ($update) { $nt->add_security("certman", "UPDATEDCERTS", _("Updated Certificates"), _("Some SSL/TLS Certificates have been automatically updated. You may need to ensure all services have the correctly update certificate by restarting PBX services"), "", true, true); } return $messages; }
/** * Update AMI credentials in manager.conf * * @author Philippe Lindheimer * @pram mixed $user false means don't change * @pram mixed $pass password false means don't change * @pram mixed $writetimeout false means don't change * @returns boolean * * allows FreePBX to update the manager credentials primarily used by Advanced Settings and Backup and Restore. */ function fpbx_ami_update($user = false, $pass = false, $writetimeout = false) { global $amp_conf, $astman; $conf_file = $amp_conf['ASTETCDIR'] . '/manager.conf'; $ret = $ret2 = 0; $output = array(); if ($user !== false && $user != '') { exec('sed -i.bak "s/\\s*\\[general\\].*$/TEMPCONTEXT/;s/\\[.*\\]/\\[' . $amp_conf['AMPMGRUSER'] . '\\]/;s/^TEMPCONTEXT$/\\[general\\]/" ' . $conf_file, $output, $ret); if ($ret) { dbug($output); dbug($ret); freepbx_log(FPBX_LOG_ERROR, sprintf(_("Failed changing AMI user to [%s], internal failure details follow:"), $amp_conf['AMPMGRUSER'])); foreach ($output as $line) { freepbx_log(FPBX_LOG_ERROR, sprintf(_("AMI failure details:"), $line)); } } } if ($pass !== false && $pass != '') { unset($output); exec('sed -i.bak "s/secret\\s*=.*$/secret = ' . $amp_conf['AMPMGRPASS'] . '/" ' . $conf_file, $output, $ret2); if ($ret2) { dbug($output); dbug($ret2); freepbx_log(FPBX_LOG_ERROR, sprintf(_("Failed changing AMI password to [%s], internal failure details follow:"), $amp_conf['AMPMGRPASS'])); foreach ($output as $line) { freepbx_log(FPBX_LOG_ERROR, sprintf(_("AMI failure details:"), $line)); } } // We've changed the password, let's update the notification // $nt = notifications::create($db); $freepbx_conf =& freepbx_conf::create(); if ($amp_conf['AMPMGRPASS'] == $freepbx_conf->get_conf_default_setting('AMPMGRPASS')) { if (!$nt->exists('core', 'AMPMGRPASS')) { $nt->add_warning('core', 'AMPMGRPASS', _("Default Asterisk Manager Password Used"), _("You are using the default Asterisk Manager password that is widely known, you should set a secure password")); } } else { $nt->delete('core', 'AMPMGRPASS'); } } //attempt to set writetimeout unset($output); if ($writetimeout) { exec('sed -i.bak "s/writetimeout\\s*=.*$/writetimeout = ' . $amp_conf['ASTMGRWRITETIMEOUT'] . '/" ' . $conf_file, $output, $ret3); if ($ret3) { dbug($output); dbug($ret3); freepbx_log(FPBX_LOG_ERROR, sprintf(_("Failed changing AMI writetimout to [%s], internal failure details follow:"), $amp_conf['ASTMGRWRITETIMEOUT'])); foreach ($output as $line) { freepbx_log(FPBX_LOG_ERROR, sprintf(_("AMI failure details:"), $line)); } } } if ($ret || $ret2 || $ret3) { dbug("aborting early because previous errors"); return false; } if (!empty($astman)) { $ast_ret = $astman->Command('module reload manager'); } else { unset($output); dbug("no astman connection so trying to force through linux command line"); exec(fpbx_which('asterisk') . " -rx 'module reload manager'", $output, $ret2); if ($ret2) { dbug($output); dbug($ret2); freepbx_log(FPBX_LOG_ERROR, _("Failed to reload AMI, manual reload will be necessary, try: [asterisk -rx 'module reload manager']")); } } return true; }
// if ($freepbx_conf->conf_setting_exists('FOPPASSWORD')) { unset($set); $set['hidden'] = 0; $set['value'] = $freepbx_conf->get_conf_setting('FOPPASSWORD'); $freepbx_conf->define_conf_setting('FOPPASSWORD', $set); // comitted below } //move freepbx debug log if ($freepbx_conf->conf_setting_exists('FPBXDBUGFILE')) { $freepbx_conf->set_conf_values(array('FPBXDBUGFILE' => $amp_conf['ASTLOGDIR'] . '/freepbx_dbug'), true); } $outdated = array($amp_conf['AMPWEBROOT'] . '/admin/reports.php', $amp_conf['AMPWEBROOT'] . '/admin/assets/js/pbxlib.js.php', $amp_conf['AMPWEBROOT'] . '/admin/assets/css/jquery-ui-1.8.16.css', $amp_conf['AMPWEBROOT'] . '/admin/common/db_connect.php', $amp_conf['AMPWEBROOT'] . '/admin/common/json.inc.php', $amp_conf['AMPWEBROOT'] . '/admin/common/libfreepbx.javascripts.js', $amp_conf['AMPWEBROOT'] . '/admin/common/mainstyle-alternative.css', $amp_conf['AMPWEBROOT'] . '/admin/common/mainstyle.css', $amp_conf['AMPWEBROOT'] . '/admin/common/script.js.php', $amp_conf['AMPWEBROOT'] . '/admin/images/category1.png', $amp_conf['AMPWEBROOT'] . '/admin/images/freepbx_large.png', $amp_conf['AMPWEBROOT'] . '/admin/images/header-back.png', $amp_conf['AMPWEBROOT'] . '/admin/images/loading.gif', $amp_conf['AMPWEBROOT'] . '/admin/images/logo.png', $amp_conf['AMPWEBROOT'] . '/admin/images/modules1.png', $amp_conf['AMPWEBROOT'] . '/admin/images/shadow-side-background.png', $amp_conf['AMPWEBROOT'] . '/admin/images/tab-first-current.png', $amp_conf['AMPWEBROOT'] . '/admin/images/tab.png', $amp_conf['AMPWEBROOT'] . '/admin/images/watermark.png', $amp_conf['AMPWEBROOT'] . '/admin/views/freepbx_admin.php', $amp_conf['AMPWEBROOT'] . '/admin/views/loggedout.php'); out("Cleaning up deprecated or moved files:"); foreach ($outdated as $file) { outn("Checking {$file}.."); if (file_exists($file) || is_link($file)) { unlink($file) ? out("removed") : out("failed to remove"); } else { out("Not Required"); } } $rm_command = function_exists('fpbx_which') ? fpbx_which('rm') : 'rm'; $common_dir = $amp_conf['AMPWEBROOT'] . '/admin/common'; exec($rm_command . ' -rf ' . $common_dir . '/mstyle_autogen_*.css'); outn("Trying to remove dir {$common_dir}.."); if (is_dir($common_dir) && !is_link($common_dir)) { rmdir($common_dir) ? out("removed") : out("failed to remove, there may be left over files that need to be deleted"); } else { out("Not Required"); }
function backup_migrate_legacy($bu) { global $amp_conf; $legacy_name = ''; $name = pathinfo($bu, PATHINFO_BASENAME); if (substr($name, -7) != '.tar.gz') { return false; } //get legacy name based on the directory the legacy backup was origionally created in //were expcecting to see something like: /tmp/ampbackups.20110310.16.00.00/ //in the tarball $cmd[] = fpbx_which('tar'); $cmd[] = 'tf'; $cmd[] = $bu; exec(implode(' ', $cmd), $res); unset($cmd); foreach ($res as $r) { if (preg_match('/\\/tmp\\/ampbackups\\.([\\d]{8}(\\.[\\d]{2}){3})\\//', $r, $legacy_name)) { if (isset($legacy_name[1])) { $legacy_name = $legacy_name[1]; break; } } } if (!$legacy_name) { return false; } //create directory where tarball will be exctracted to $dir = $amp_conf['ASTSPOOLDIR'] . '/tmp/' . $legacy_name; mkdir($dir, 0755, true); $cmd[] = fpbx_which('tar'); $cmd[] = '-zxf'; $cmd[] = $bu; $cmd[] = ' -C ' . $dir; exec(implode(' ', $cmd)); unset($cmd); $dir2 = $dir . '/tmp/ampbackups.' . $legacy_name; //exctract sub tarballs foreach (scandir($dir2) as $file) { if (substr($file, -7) == '.tar.gz') { $cmd[] = fpbx_which('tar'); $cmd[] = '-zxf'; $cmd[] = $dir2 . '/' . $file; $cmd[] = ' -C ' . $dir2; exec(implode(' ', $cmd)); unset($cmd); unlink($dir2 . '/' . $file); } } //add files to manifest $ret['file_list'] = scandirr($dir2); $ret['file_count'] = count($ret['file_list'], COUNT_RECURSIVE); $ret['fpbx_db'] = ''; $ret['fpbx_cdrdb'] = ''; //format db's + add to manifest if (is_file($dir2 . '/astdb.dump')) { //rename file rename($dir2 . '/astdb.dump', $dir2 . '/astdb'); //remove it from the file_list unset($ret['file_list'][array_search('astdb.dump', $ret['file_list'])]); //set the manifest $ret['astdb'] = 'astdb'; } elseif (is_file($dir2 . '/tmp/ampbackups.' . $legacy_name . '/astdb.dump')) { rename($dir2 . '/tmp/ampbackups.' . $legacy_name . '/astdb.dump', $dir2 . '/astdb'); $ret['astdb'] = 'astdb'; } //serialize the astdb if (!empty($ret['astdb'])) { $astdb = array(); foreach (file($dir2 . '/astdb') as $line) { $line = explode('] [', trim($line, '[]/')); //chuck the bad values if ($line[1] == '<bad value>') { continue; } //expldoe the key list($family, $key) = explode('/', $line[0], 2); //add to astdb array $astdb[$family][$key] = trim(trim($line[1]), ']'); } file_put_contents($dir2 . '/astdb', serialize($astdb)); } //migrate mysql files to a format that we can restore from $src = $dir2 . '/asterisk.sql'; if (is_file($src)) { $dst = $dir2 . '/mysql-db.sql'; unset($ret['file_list'][array_search('asterisk.sql', $ret['file_list'])]); //remove from manifest $ret['fpbx_db'] = 'mysql-db'; $ret['mysql']['db'] = array('file' => 'mysql-db.sql'); // remove SET and comments that later break restores when using pear $cmd[] = fpbx_which('grep'); $cmd[] = "-v '^\\/\\*\\|^SET\\|^--'"; $cmd[] = $src; $cmd[] = ' > ' . $dst; exec(implode(' ', $cmd), $file, $status); if ($status) { // The grep failed, if there is a $dst file remove it and either way rename the $src freepbx_log(FPBX_LOG_ERROR, _("Failed converting asterisk.sql to proper format, renaming to mysql-db.sql in current state")); if (is_file($dst)) { unlink($dst); } rename($src, $dst); } else { unlink($src); } unset($cmd, $file); } $src = $dir2 . '/asteriskcdr.sql'; if (is_file($src)) { $dst = $dir2 . '/mysql-cdr.sql'; unset($ret['file_list'][array_search('asteriskcdr.sql', $ret['file_list'])]); //remove from manifest $ret['fpbx_cdrdb'] = 'mysql-cdr'; $ret['mysql']['cdr'] = array('file' => 'mysql-cdr.sql'); // remove SET and comments that later break restores when using pear $cmd[] = fpbx_which('grep'); $cmd[] = "-v '^\\/\\*\\|^SET\\|^--'"; $cmd[] = $src; $cmd[] = ' > ' . $dst; exec(implode(' ', $cmd), $file, $status); if ($status) { // The grep failed, if there is a $dst file remove it and either way rename the $src freepbx_log(FPBX_LOG_ERROR, _("Failed converting asteriskcdr.sql to proper format, renaming to mysql-cdr.sql in current state")); if (is_file($dst)) { unlink($dst); } rename($src, $dst); } else { unlink($src); } unset($cmd, $file); } $ret['mysql_count'] = $ret['mysql'] ? count($ret['mysql']) : 0; $ret['astdb_count'] = $ret['astdb'] ? count($ret['astdb']) : 0; //delete legacy's tmp dir system('rm -rf ' . $dir2 . '/tmp'); unset($ret['file_list']['tmp']); //store manifest file_put_contents($dir2 . '/manifest', serialize($ret)); //build new tarball $dest = $amp_conf['ASTSPOOLDIR'] . '/tmp/' . 'backuptmp-slegacy-' . time() . '-' . $legacy_name . '.tgz'; $cmd[] = fpbx_which('tar'); $cmd[] = '-zcf'; $cmd[] = $dest; $cmd[] = '-C ' . $dir2; $cmd[] = '.'; exec(implode(' ', $cmd)); unset($cmd); //remove tmp working dir system('rm -rf ' . $dir); return $dest; }
private function maintenance($type, $data, $handle = '') { if (!isset($this->b['delete_time']) && !isset($this->b['delete_amount'])) { return true; } $delete = $dir = $files = array(); //get file list switch ($type) { case 'local': $dir = scandir(backup__($data['path']) . '/' . $this->b['_dirname']); break; case 'ftp': $dir = ftp_nlist($handle, '.'); break; case 'ssh': $cmd[] = fpbx_which('ssh'); $cmd[] = '-o StrictHostKeyChecking=no -i'; $cmd[] = $data['key']; $cmd[] = $data['user'] . '\\@' . $data['host']; $cmd[] = '-p ' . $data['port']; $cmd[] = 'ls -1 ' . $data['path'] . '/' . $this->b['_dirname']; exec(implode(' ', $cmd), $dir); unset($cmd); break; case 'awss3': $contents = $handle->getBucket($data['bucket']); foreach ($contents as $file) { $dir[] = $file['name']; } break; } //sanitize file list foreach ($dir as $file) { //dont include the current backup or special items if (in_array($file, array('.', '..', $this->b['_file'])) || !preg_match("/\\d+-\\d+-\\d+(?:-[0-9.]+(?:alpha|beta|rc|RC)?(?:\\d+(?:\\.[^\\.]+)*))?-\\d+.tgz/", $file)) { continue; } $f = explode('-', $file); //remove file sufix $files[$f[2]] = $file; } //sort file list based on backup creation time ksort($files, SORT_NUMERIC); //create delete list based on creation time if (isset($this->b['delete_time']) && $this->b['delete_time']) { $cut_line = strtotime($this->b['delete_time'] . ' ' . $this->b['delete_time_type'] . ' ago'); foreach ($files as $epoch => $file) { if ($epoch < $cut_line) { $delete[$epoch] = $file; } } } //create delete list based on quantity of files if (isset($this->b['delete_amount']) && $this->b['delete_amount']) { for ($i = 0; $i < $this->b['delete_amount']; $i++) { array_pop($files); } $delete = array_merge($files, $delete); } //now delete the actual files foreach ($delete as $key => $file) { switch ($type) { case 'local': unlink(backup__($data['path']) . '/' . $this->b['_dirname'] . '/' . $file); unset($delete[$key]); break; case 'ftp': ftp_delete($handle, $file); unset($delete[$key]); break; case 'awss3': $handle->deleteObject($data['bucket'], baseName($file)); break; case 'ssh': $cmd[] = fpbx_which('ssh'); $cmd[] = '-o StrictHostKeyChecking=no -i'; $cmd[] = $data['key']; $cmd[] = $data['user'] . '\\@' . $data['host']; $cmd[] = '-p ' . $data['port']; $cmd[] = 'rm ' . $data['path'] . '/' . '/' . $this->b['_dirname'] . '/' . $file; exec(implode(' ', $cmd)); unset($delete[$key]); unset($cmd); break; } } }
/** * Get last X lines of log file, with html tags to provide highlighting */ function logfiles_get_logfile($lines = 500, $file) { global $amp_conf; $files = logfiles_list(); $logfile = $amp_conf['ASTLOGDIR'] . '/' . $files[$file]; if (!file_exists($logfile) || !is_file($logfile)) { echo _('Error parsing log file or file not found!'); return; } $channels = array(); exec(fpbx_which('tail') . ' -n' . $lines . ' ' . $logfile, $log); foreach ($log as $l) { switch (true) { case strpos($l, 'INFO'): $l = '<span class="beige">' . htmlentities($l) . '</span>'; break; case strpos($l, 'WARNING'): $l = '<span class="orange">' . htmlentities($l) . '</span>'; break; case strpos($l, 'DEBUG'): $l = '<span class="green">' . htmlentities($l) . '</span>'; break; case strpos($l, 'UPDATE'): case strpos($l, 'NOTICE'): $l = '<span class="cyan">' . htmlentities($l) . '</span>'; break; case strpos($l, 'FATAL'): case strpos($l, 'CRITICAL'): case strpos($l, 'ERROR'): $l = '<span class="red">' . htmlentities($l) . '</span>'; break; default: $l = logfiles_highlight_asterisk(htmlentities($l, ENT_NOQUOTES), $channels); break; } echo $l . '<br />'; } }
/** * Reload module(s) * * @link http://www.voip-info.org/wiki/view/Asterisk+Manager+API+Action+Reload * @param string $module * @param string $actionid */ function Reload($module = NULL, $actionid = NULL) { $parameters = array(); if ($actionid) { $parameters['ActionID'] = $actionid; } if ($module) { $parameters['Module'] = $module; return $this->send_request('Reload', $parameters); } else { //Until https://issues.asterisk.org/jira/browse/ASTERISK-25996 is fixed $a = function_exists("fpbx_which") ? fpbx_which("asterisk") : "asterisk"; if (!empty($a)) { return exec($a . " -rx 'core reload'"); } } }