Пример #1
0
 function getDeviceFreePBX($dsn)
 {
     global $arrLang;
     $pDB = new paloDB($dsn);
     if ($pDB->connStatus) {
         return false;
     }
     $sqlPeticion = "select id, concat(description,' <',user,'>') label FROM devices WHERE tech = 'sip' ORDER BY id ASC;";
     $result = $pDB->fetchTable($sqlPeticion, true);
     //se consulta a la base asterisk
     $pDB->disconnect();
     $arrDevices = array();
     if (is_array($result) && count($result) > 0) {
         $arrDevices['unselected'] = "-- {$arrLang['Unselected']} --";
         foreach ($result as $key => $device) {
             $arrDevices[$device['id']] = $device['label'];
         }
     } else {
         $arrDevices['no_device'] = "-- {$arrLang['No Extensions']} --";
     }
     return $arrDevices;
 }
 private function _recogerPaquetesTransaccion($sContenido)
 {
     $lineas = explode("\n", $sContenido);
     $this->_estadoPaquete['progreso'] = array();
     $bReporte = FALSE;
     $sOperacion = NULL;
     $sLineaPrevia = '';
     foreach ($lineas as $sLinea) {
         $regs = NULL;
         if (!$bReporte && preg_match('/^\\s+Package\\s+Arch\\s+Version\\s+Repository\\s+Size/', $sLinea)) {
             $bReporte = TRUE;
         } elseif (strpos($sLinea, "Transaction Summary") !== FALSE) {
             $bReporte = FALSE;
         } elseif ($bReporte) {
             /* Si el nombre de paquete es muy largo, puede que el resto de la 
                información haya sido desplazada a la línea siguiente. Sin
                embargo, no se espera que hayan más de dos líneas. */
             $regs = NULL;
             $sLineaCompleta = ' ' . $sLineaPrevia . $sLinea;
             if (preg_match('/^\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+([0-9\\.\\,]+)\\s+[kM]?/', $sLineaCompleta, $regs)) {
                 $this->_estadoPaquete['progreso'][] = array('pkgaction' => $sOperacion, 'nombre' => $regs[1], 'arch' => $regs[2], 'version' => $regs[3], 'repo' => $regs[4], 'longitud' => $regs[5], 'rpmfile' => NULL, 'descargado' => '-', 'currstatus' => $sOperacion == 'remove' ? 'installed' : 'waiting', 'provides' => NULL, 'requires' => NULL);
                 $sLineaPrevia = '';
             } elseif (strpos($sLinea, 'Installing') === 0) {
                 $sOperacion = 'install';
                 $sLineaPrevia = '';
             } elseif (strpos($sLinea, 'Updating') === 0) {
                 $sOperacion = 'update';
                 $sLineaPrevia = '';
             } elseif (strpos($sLinea, 'Removing') === 0) {
                 $sOperacion = 'remove';
                 $sLineaPrevia = '';
             } else {
                 if (preg_match('/^\\s+(\\S+)\\s*$/', $sLinea)) {
                     $sLineaPrevia = $sLinea;
                 } else {
                     $sLineaPrevia = '';
                 }
             }
         }
         if (preg_match('/No package (\\S+) available/', $sLinea, $regs)) {
             $this->_estadoPaquete['status'] = 'error';
             $this->_estadoPaquete['errores'][] = "The following package is not available: " . $regs[1];
         }
     }
     if ($this->_estadoPaquete['status'] != 'error' && count($this->_estadoPaquete['progreso']) <= 0) {
         $this->_estadoPaquete['action'] = 'none';
         $this->_estadoPaquete['warning'][] = 'No packages to install or update';
     }
     /* La información de tamaño que proporciona yum es demasiado poco detallada
          para poder seguir la pista de la descarga con precisión de bytes. Por lo
          tanto, hay que abrir las bases SQLITE3 de yum y leer los datos de allí.
        */
     // Validar las rutas base de los repos
     $infoRepo = array();
     if ($this->_estadoPaquete['status'] != 'error') {
         $sRutaCache = $this->_cachedir;
         foreach ($this->_estadoPaquete['progreso'] as $paquete) {
             if (!isset($infoRepo[$paquete['repo']])) {
                 $sNombreRepo = $paquete['repo'];
                 if ($sNombreRepo == 'installed') {
                     continue;
                 }
                 if ($sNombreRepo[0] == '@') {
                     continue;
                 }
                 $sRutaRepo = $sRutaCache . '/' . $paquete['repo'] . '/';
                 $infoRepo[$sNombreRepo] = array('ruta' => $sRutaRepo);
                 if (!is_dir($sRutaRepo)) {
                     $this->_estadoPaquete['status'] = 'error';
                     $this->_estadoPaquete['errores'][] = "Unable to figure out cache directory for repo: {$sNombreRepo}";
                 } elseif (!is_readable($sRutaRepo . 'repomd.xml')) {
                     $this->_estadoPaquete['status'] = 'error';
                     $this->_estadoPaquete['errores'][] = "Unable to read file repomd.xml from repo: {$sNombreRepo}";
                 } else {
                     // El siguiente código require el módulo php-xml
                     $repomd = new SimpleXMLElement(file_get_contents($sRutaRepo . 'repomd.xml'));
                     foreach ($repomd->data as $dataObj) {
                         if ($dataObj['type'] == 'primary_db') {
                             $sRutaPrimary = $dataObj->location['href'];
                             $regs = NULL;
                             if (preg_match('|^(.*)/(\\S+)(\\.bz2)|', $sRutaPrimary, $regs)) {
                                 $sRutaPrimary = $regs[2];
                             }
                             $infoRepo[$sNombreRepo]['primary_db'] = $sRutaPrimary;
                         } elseif (!isset($infoRepo[$sNombreRepo]['primary_db']) && $dataObj['type'] == 'primary') {
                             $sRutaPrimary = $dataObj->location['href'];
                             $regs = NULL;
                             if (preg_match('|^(.*)/(\\S+)|', $sRutaPrimary, $regs)) {
                                 $sRutaPrimary = $regs[2];
                             }
                             // CentOS 5 usa $sRutaRepo/primary.xml.gz.sqlite
                             // Fedora 17 usa $sRutaRepo/gen/primary.xml.sqlite
                             if (file_exists($sRutaRepo . 'gen/' . basename($sRutaPrimary, '.gz') . '.sqlite')) {
                                 $infoRepo[$sNombreRepo]['primary_db'] = 'gen/' . basename($sRutaPrimary, '.gz') . '.sqlite';
                             } else {
                                 $infoRepo[$sNombreRepo]['primary_db'] = $sRutaPrimary . '.sqlite';
                             }
                         }
                     }
                     if (!isset($infoRepo[$sNombreRepo]['primary_db'])) {
                         $this->_estadoPaquete['status'] = 'error';
                         $this->_estadoPaquete['errores'][] = "Unable to locate primary_db from repo: {$sNombreRepo}";
                     } elseif (!is_readable($sRutaRepo . $infoRepo[$sNombreRepo]['primary_db'])) {
                         $this->_estadoPaquete['status'] = 'error';
                         $this->_estadoPaquete['errores'][] = "Unable to read primary_db from repo: {$sNombreRepo}";
                         unset($infoRepo[$sNombreRepo]['primary_db']);
                     }
                 }
             }
         }
     }
     // Para cada paquete, se abre el archivo primary_db de su correspondiente
     // repo y se consulta vía SQL el tamaño del paquete.
     if ($this->_estadoPaquete['status'] != 'error') {
         foreach ($this->_estadoPaquete['progreso'] as &$infoPaquete) {
             if ($infoPaquete['repo'] == 'installed') {
                 continue;
             }
             if ($infoPaquete['repo'][0] == '@') {
                 continue;
             }
             $repo =& $infoRepo[$infoPaquete['repo']];
             $regs = NULL;
             if (!preg_match('/^((\\S+):)?(\\S+)-(\\S+)$/', $infoPaquete['version'], $regs)) {
                 $this->_estadoPaquete['status'] = 'error';
                 $this->_estadoPaquete['errores'][] = "Unable to parse version string for package: " . $infoPaquete['nombre'];
             } else {
                 $sEpoch = $regs[2] == "" ? 0 : $regs[2];
                 $sVersion = $regs[3];
                 $sRelease = $regs[4];
                 // Abrir la conexión a la base de datos
                 $dsn = "sqlite3:///" . $repo['ruta'] . $repo['primary_db'];
                 $oDB = new paloDB($dsn);
                 if ($oDB->connStatus) {
                     $this->_estadoPaquete['status'] = 'error';
                     $this->_estadoPaquete['errores'][] = "Unable to open primary_db for package: " . $infoPaquete['nombre'];
                 } else {
                     $pkgKey = NULL;
                     // select size_package from packages where name = "pidgin" and arch = "x86_64" and epoch = "0" and version = "2.6.6" and release = "1.el5"
                     $sql = 'SELECT size_package, location_href, pkgKey FROM packages ' . 'WHERE name = ? AND arch = ? AND epoch = ? AND version = ? AND release = ?';
                     $recordset = $oDB->fetchTable($sql, FALSE, array($infoPaquete['nombre'], $infoPaquete['arch'], $sEpoch, $sVersion, $sRelease));
                     if (!is_array($recordset)) {
                         $this->_estadoPaquete['status'] = 'error';
                         $this->_estadoPaquete['errores'][] = "Unable to query primary_db for package: " . $infoPaquete['nombre'];
                     } elseif (count($recordset) <= 0) {
                         $this->_estadoPaquete['status'] = 'error';
                         $this->_estadoPaquete['errores'][] = "Unable to locate package in primary_db for package: " . $infoPaquete['nombre'] . " {$infoPaquete['arch']} {$sEpoch} {$sVersion} {$sRelease}";
                     } elseif (count($recordset) > 1) {
                         $this->_estadoPaquete['status'] = 'error';
                         $this->_estadoPaquete['errores'][] = "Duplicate package information in primary_db for package: " . $infoPaquete['nombre'];
                     } else {
                         $pkgKey = $recordset[0][2];
                         $infoPaquete['longitud'] = $recordset[0][0];
                         if ($infoPaquete['pkgaction'] != 'remove') {
                             $infoPaquete['descargado'] = 0;
                         }
                         $regs = NULL;
                         if (preg_match('|^((.*)/)?(\\S+\\.rpm)$|', $recordset[0][1], $regs)) {
                             $infoPaquete['rpmfile'] = $repo['ruta'] . 'packages/' . $regs[3];
                         } else {
                             $this->_estadoPaquete['status'] = 'error';
                             $this->_estadoPaquete['errores'][] = "Unable to discover RPM filename for package: " . $infoPaquete['nombre'];
                         }
                     }
                     // Leer los datos de lo que provee y lo que requiere
                     if (!is_null($pkgKey)) {
                         $infoPaquete['provides'] = $oDB->fetchTable('SELECT * FROM provides WHERE pkgKey = ?', TRUE, array($pkgKey));
                         $infoPaquete['requires'] = $oDB->fetchTable('SELECT * FROM requires WHERE pkgKey = ?', TRUE, array($pkgKey));
                     }
                     $oDB->disconnect();
                 }
             }
         }
     }
 }