/** * Descomprimimos el paquete para poder trabajar. * @param string $tmp_path Directorio temporal donde colocar la descompresion. * @return bool */ protected function descomprimir($tmp_path) { // Obtenemos el tipo de compresion para el paquete. $c_type = Update_Utils::mime2compresor(Update_Utils::get_mime($this->package)); // Cargamos el compresor. $c = Update_Compresion::get_instance($c_type); // Seteamos donde descomprimir. $c->set_temp_path($tmp_path); return $c->decompress($this->package); }
/** * Instalamos un nuevo tema. */ public function action_instalar_tema() { // Cargamos la vista. $vista = View::factory('admin/configuracion/instalar_tema'); // Valores por defecto. $vista->assign('error_carga', FALSE); if (Request::method() == 'POST') { $error = FALSE; // Verifico el envio correcto de datos. if (isset($_FILES['theme'])) { // Cargo los datos del archivo. $file = $_FILES['theme']; // Verifico el estado. if ($file['error'] !== UPLOAD_ERR_OK) { $error = TRUE; switch ($file['error']) { case UPLOAD_ERR_INI_SIZE: case UPLOAD_ERR_FORM_SIZE: $vista->assign('error_carga', 'El tamaño del archivo es incorrecto.'); break; case UPLOAD_ERR_PARTIAL: $vista->assign('error_carga', 'Los datos enviados están corruptos.'); break; case UPLOAD_ERR_NO_FILE: $vista->assign('error_carga', 'No has seleccionado un archivo.'); break; case UPLOAD_ERR_NO_TMP_DIR: case UPLOAD_ERR_CANT_WRITE: $vista->assign('error_carga', 'Error interno al cargar el archivo. Reintente. Si el error persiste contacte al administrador.'); break; case UPLOAD_ERR_EXTENSION: $vista->assign('error_carga', 'La configuración del servidor no permite archivo con esa extensión.'); break; } } else { // Cargo el mime. $file['type'] = Update_Utils::get_mime($file['tmp_name']); // Verifico esté dentro de los permitidos. if (!in_array(Update_Utils::mime2compresor($file['type']), Update_Compresion::get_list())) { $error = TRUE; $vista->assign('error_carga', 'El tipo de archivo no es soportado. Verifique la configuración del servidor.'); } } } else { $error = TRUE; $vista->assign('error_carga', 'No has seleccionado un archivo.'); } // Verifico el contenido de los datos. if (!$error) { // Armo directorio temporal para la descargar. $tmp_dir = TMP_PATH . uniqid('pkg_') . DS; mkdir($tmp_dir, 0777, TRUE); // Realizo la descompresión. $compresor = Update_Compresion::get_instance(Update_Utils::mime2compresor($file['type'])); $compresor->set_temp_path($tmp_dir); if (!$compresor->decompress($file['tmp_name'])) { // Limpio salidas. Update_Utils::unlink($file['tmp_name']); Update_Utils::unlink($tmp_dir); // Informo del error. $error = TRUE; $vista->assign('error_carga', 'No se pudo descomprimir el archivo. Compruebe que sea correcto.'); } else { // Verifico que sea correcto. if (is_dir($tmp_dir) && file_exists($tmp_dir . DS . 'theme.php') && file_exists($tmp_dir . DS . 'views') && $tmp_dir . DS . 'assets') { // Cargo configuraciones. $data = configuracion_obtener($tmp_dir . DS . 'theme.php'); // Verifico su contenido. if (is_array($data)) { if (isset($data['nombre']) && isset($data['author'])) { $theme_name = preg_replace('/(\\s|[^a-z0-9])/', '', strtolower($data['nombre'])); } } if (!isset($theme_name)) { // Limpio salidas. Update_Utils::unlink($file['tmp_name']); Update_Utils::unlink($tmp_dir); // Informo del error. $error = TRUE; $vista->assign('error_carga', 'El archivo de descripción del tema es inválido.'); } } else { // Limpio salidas. Update_Utils::unlink($file['tmp_name']); Update_Utils::unlink($tmp_dir); // Informo del error. $error = TRUE; $vista->assign('error_carga', 'No se trata de un tema válido.'); } } } // Genero directorios. if (!$error) { // Generamos el path donde se va a alojar. $target_path = APP_BASE . DS . VIEW_PATH . $theme_name . DS; // Verifico directorio donde alojar. if (!file_exists($target_path)) { // Creo el directorio del tema. if (!@mkdir($target_path, 0777, TRUE)) { // Limpio salidas. Update_Utils::unlink($target_path); Update_Utils::unlink($file['tmp_name']); Update_Utils::unlink($tmp_dir); // Informo del error. $vista->assign('error_carga', '1No se pudo alojar el tema en su lugar correspondiente. Verifica los permisos del directorio de temas.'); $error = TRUE; } } } // Realizo actualizacion. if (!$error) { // Realizo el movimiento. if (!Update_Utils::copyr($tmp_dir, $target_path)) { // Limpio salidas. Update_Utils::unlink($file['tmp_name']); Update_Utils::unlink($tmp_dir); Update_Utils::unlink($target_path); // Informo del error. $vista->assign('error_carga', 'No se pudo alojar el tema en su lugar correspondiente. Verifica los permisos del directorio de temas.'); } else { // Limpio directorios. Update_Utils::unlink($file['tmp_name']); Update_Utils::unlink($tmp_dir); // Informo resultado. $_SESSION['flash_success'] = 'El tema se instaló correctamente.'; // Redireccionamos. Request::redirect('/admin/configuracion/temas'); } } } // Seteamos el menu. $this->template->assign('master_bar', parent::base_menu('admin')); // Cargamos plantilla administracion. $admin_template = View::factory('admin/template'); $admin_template->assign('contenido', $vista->parse()); unset($portada); $admin_template->assign('top_bar', Controller_Admin_Home::submenu('configuracion_temas')); // Asignamos la vista a la plantilla base. $this->template->assign('contenido', $admin_template->parse()); }
/** * Instalamos o actualizamos un paquete. * @param string $hash Hash del paquete a instalar. * @param int $version Número de version a descargar e instalar. Si no se * especifica utilizamos la última. * @return bool */ public function install_package($hash, $version = NULL) { // Cliente para realizar las peticiones. $o_client = new Update_Client($this->server, $this->token); // Verificamos si hay versión especificada. if ($version === NULL) { // Obtenemos la última versión. $version = $o_client->get_last_version($hash); } // Obtenemos la compresion de descarga. (zip, tar, gz, bz2, etc) $compresion_list = $o_client->get_package_compresion_list($hash, $version); unset($o_client); if (!is_array($compresion_list)) { throw new Exception('Imposible obtener la lista de compresiones.'); return FALSE; } else { // Verificamos la lista de compatibles. $compresiones = array_intersect($compresion_list, Update_Compresion::get_list()); unset($compresion_list); if (count($compresiones) === 0) { throw new Exception('No hay una compresión compatible para utilizar.'); return FALSE; } } // Seleccionamos la primer compresion. $type = array_shift($compresiones); unset($compresiones); // Armamos directorio temporal de la descarga. $temp_file = TMP_PATH . uniqid('upd_file_'); // Descargamos el archivo. $rqs = new Update_Rest_Request($this->server); if (!$rqs->download("/paquete/get_update/{$this->token}/{$hash}/{$version}/{$type}", $temp_file)) { @unlink($temp_file); // No se pudo descargar. throw new Exception('No se pudo descargar el archivo.'); return FALSE; } // Cargamos el paquete. $pkg = new Update_Package($temp_file); // Realizamos la instalación. return $pkg->install(); }