Esempio n. 1
0
 /**
  *	Crea un proyecto NUEVO
  */
 static function crear(toba_modelo_instancia $instancia, $nombre, $usuarios_a_vincular)
 {
     //- 1 - Controles
     $dir_template = toba_dir() . self::template_proyecto;
     if ($nombre == 'toba') {
         throw new toba_error("INSTALACION: No es posible crear un proyecto con el nombre 'toba'");
     }
     if (self::existe($nombre)) {
         throw new toba_error("INSTALACION: Ya existe una carpeta con el nombre '{$nombre}' en la carpeta 'proyectos'");
     }
     try {
         //- 2 - Modificaciones en el sistema de archivos
         $dir_proyecto = $instancia->get_path_proyecto($nombre);
         $url_proyecto = $instancia->get_url_proyecto($nombre);
         // Creo la CARPETA del PROYECTO
         $excepciones = array();
         $excepciones[] = $dir_template . '/www/aplicacion.produccion.php';
         toba_manejador_archivos::copiar_directorio($dir_template, $dir_proyecto, $excepciones);
         // Modifico los archivos
         $editor = new toba_editor_archivos();
         $editor->agregar_sustitucion('|__proyecto__|', $nombre);
         $editor->agregar_sustitucion('|__instancia__|', $instancia->get_id());
         $editor->agregar_sustitucion('|__toba_dir__|', toba_manejador_archivos::path_a_unix(toba_dir()));
         $editor->agregar_sustitucion('|__version__|', '1.0.0');
         $editor->procesar_archivo($dir_proyecto . '/www/aplicacion.php');
         $modelo = $dir_proyecto . '/php/extension_toba/modelo.php';
         $comando = $dir_proyecto . '/php/extension_toba/comando.php';
         $editor->procesar_archivo($comando);
         $editor->procesar_archivo($modelo);
         $editor->procesar_archivo($dir_proyecto . '/www/rest.php');
         $editor->procesar_archivo($dir_proyecto . '/www/servicios.php');
         rename($modelo, str_replace('modelo.php', $nombre . '_modelo.php', $modelo));
         rename($comando, str_replace('comando.php', $nombre . '_comando.php', $comando));
         $ini = $dir_proyecto . '/proyecto.ini';
         $editor->procesar_archivo($ini);
         // Asocio el proyecto a la instancia
         $instancia->vincular_proyecto($nombre, null, $url_proyecto);
         //- 3 - Modificaciones en la BASE de datos
         $db = $instancia->get_db();
         try {
             $db->abrir_transaccion();
             $db->retrazar_constraints();
             $db->ejecutar(self::get_sql_metadatos_basicos($nombre));
             $sql_version = self::get_sql_actualizar_version(toba_modelo_instalacion::get_version_actual(), $nombre);
             $db->ejecutar($sql_version);
             foreach ($usuarios_a_vincular as $usuario) {
                 self::do_vincular_usuario($db, $nombre, $usuario, array('admin'));
             }
             $db->cerrar_transaccion();
         } catch (toba_error $e) {
             $db->abortar_transaccion();
             $txt = 'PROYECTO : Ha ocurrido un error durante la carga de METADATOS del PROYECTO. DETALLE: ' . $e->getMessage();
             throw new toba_error($txt);
         }
     } catch (toba_error $e) {
         // Borro la carpeta creada
         if (is_dir($dir_proyecto)) {
             $instancia->desvincular_proyecto($nombre);
             toba_manejador_archivos::eliminar_directorio($dir_proyecto);
         }
         throw $e;
     }
 }
Esempio n. 2
0
 /**
  * Crea un proyecto NUEVO.
  * @consola_parametros Opcional: [-x] Si se utiliza esta opción el proyecto creado será personalizable
  * @gtk_icono nucleo/agregar.gif 
  * @gtk_no_mostrar 1
  */
 function opcion__crear()
 {
     $id_instancia = $this->get_id_instancia_actual();
     $id_proyecto = $this->get_id_proyecto_actual();
     $instancia = $this->get_instancia($id_instancia);
     $params = $this->get_parametros();
     // --  Creo el proyecto
     $this->consola->mensaje("Creando el proyecto '{$id_proyecto}' en la instancia '{$id_instancia}'...", false);
     $usuarios = $this->seleccionar_usuarios($instancia);
     toba_modelo_proyecto::crear($instancia, $id_proyecto, $usuarios);
     $this->consola->progreso_fin();
     // Extendemos las clases de toba a clases del proyecto
     $proyecto = $this->get_proyecto($id_proyecto);
     $pms = $proyecto->get_pms();
     util_modelo_proyecto::extender_clases($proyecto, $this->consola, 'toba');
     $pms->crear_pm_proyecto();
     // -- Modifica el proyecto para que sea apto para personalizaciones
     if (isset($params['-x'])) {
         $this->hacer_personalizable(false);
     }
     $proyecto->generar_autoload($this->consola);
     // -- Asigno un nuevo item de login
     $proyecto->actualizar_login();
     // -- Exporto el proyecto creado
     $proyecto->exportar();
     if (isset($params['-d'])) {
         //Como necesita si o si, ser creado en el dir proyectos.. luego de creado lo muevo
         $origen = $proyecto->get_dir();
         // lo revinculo con el directorio nuevo y re-instancio el proyecto para que arme bien el alias
         $path = $params['-d'];
         $instancia->vincular_proyecto($id_proyecto, $path);
         toba_manejador_archivos::copiar_directorio($origen, $path);
         toba_manejador_archivos::eliminar_directorio($origen);
         $proyecto = $this->get_proyecto($id_proyecto);
     }
     $instancia->exportar_local();
     if (!$proyecto->esta_publicado()) {
         $this->consola->separador();
         $agregar = $this->consola->dialogo_simple("El proyecto ha sido creado. ¿Desea agregar el alias de apache al archivo toba.conf?", true);
         if ($agregar) {
             $proyecto->publicar();
             $this->consola->mensaje('OK. Debe reiniciar el servidor web para que los cambios tengan efecto');
         }
     }
 }
Esempio n. 3
0
 /**
  * Toma un proyecto de una instancia de un toba en un versión anterior e importa el mismo a esta versión
  * La instancia origen se debe llamar igual que la destino
  * @param string $id_instancia Instancia origen/destino de la migración
  * @param string $id_proyecto Proyecto origen/destino de la migración
  * @param string $dir_toba_viejo Directorio del toba que contiene la instancia/proyecto a migrar
  */
 function importar_migrar_proyecto($id_instancia, $id_proyecto, $dir_toba_viejo)
 {
     //$path_proyecto = toba_dir().'/proyectos/'.$id_proyecto;
     $excepcion = null;
     $url = null;
     try {
         $dir_original = $this->get_dir();
         $dir_backup = $dir_original . '.' . date('YmdHms');
         //--- Hacer un backup del directorio actual
         $this->manejador_interface->titulo("1.- Haciendo backup directorio instalacion del nuevo toba");
         if (file_exists($dir_original)) {
             if (!toba_manejador_archivos::copiar_directorio($dir_original, $dir_backup)) {
                 throw new toba_error("No es posible hacer una copia de seguridad de la carpeta '{$dir_original}'. Verifique los permisos de escritura del usuario actual");
             }
         }
         //--- Traer configuraciones de la instancia vieja
         $instancia = $this->get_instancia($id_instancia);
         $archivo_ini_bases = $dir_toba_viejo . '/instalacion/bases.ini';
         if (!file_exists($archivo_ini_bases)) {
             throw new toba_error("No se encuentra el archivo {$archivo_ini_bases}");
         }
         $archivo_instancia = $dir_toba_viejo . "/instalacion/i__{$id_instancia}/instancia.ini";
         if (!file_exists($archivo_instancia)) {
             throw new toba_error("No se encuentra el archivo {$archivo_instancia}");
         }
         $conf_instancia = parse_ini_file($archivo_instancia, true);
         $id_base_instancia = $instancia->get_ini_base();
         if (isset($conf_instancia['base'])) {
             $id_base_instancia = $conf_instancia['base'];
         }
         $bases_viejas = parse_ini_file($archivo_ini_bases, true);
         if (!isset($bases_viejas[$id_base_instancia])) {
             throw new toba_error("No se encuentra la definición de la instancia {$id_base_instancia} en el archivo {$archivo_ini_bases}");
         }
         //--- Incluir solo el proyecto a importar en la instancia
         $this->manejador_interface->titulo("2.- Apuntando la instancia nueva a la de la versión anterior");
         $proyectos_vinculados = $instancia->get_lista_proyectos_vinculados();
         $instancia->set_proyectos_vinculados(array($id_proyecto));
         $path_proyecto = $instancia->get_path_proyecto($id_proyecto);
         $instancia->vincular_proyecto($id_proyecto, $path_proyecto, $url);
         //--- Apuntar la instancia actual a la instancia externa
         $this->actualizar_db($instancia->get_ini_base(), $bases_viejas[$id_base_instancia]);
         $this->cargar_info_ini(true);
         //--- Migrar la instancia vieja
         $this->manejador_interface->titulo("3.- Migrando el proyecto de versión toba");
         $instancia->get_db()->destruir();
         $instancia->get_db(true);
         //Refresca la base
         $desde = $instancia->get_version_actual();
         $hasta = toba_modelo_instalacion::get_version_actual();
         $instancia->get_db()->abrir_transaccion();
         $instancia->migrar_rango_versiones($desde, $hasta, 1, false);
         $instancia->get_proyecto($id_proyecto)->exportar();
         $instancia->get_db()->abortar_transaccion();
         //Aborta la transaccion para que no afecte la instancia vieja
         $instancia->get_db()->destruir();
         //---Restaurar el backup
         if (file_exists($dir_backup)) {
             $this->manejador_interface->titulo("4.- Restaurando backup directorio instalacion del nuevo toba");
             if (file_exists($dir_original)) {
                 toba_manejador_archivos::eliminar_directorio($dir_original);
             }
             rename($dir_backup, $dir_original);
         } else {
             throw new toba_error('Imposible restaurar el estado previo a la migración');
         }
         //--- Agrega el proyecto a la instancia nueva (por si no estaba) y regenera la misma
         $this->manejador_interface->titulo("5.- Regenerando la instancia actual para tomar los cambios");
         $this->cargar_info_ini(true);
         $instancia->cargar_info_ini();
         $instancia->get_db(true);
         //Refresca la base
         //Si existe una entrada actual en el instancias.ini viejo, replicarla en el actual
         $instancia->vincular_proyecto($id_proyecto, $path_proyecto, $url);
         $proyecto = $instancia->get_proyecto($id_proyecto);
         $proyecto->regenerar();
     } catch (Exception $e) {
         $excepcion = $e;
         //---Restaurar el backup
         if (file_exists($dir_backup)) {
             $this->manejador_interface->titulo("Restaurando backup directorio instalacion del nuevo toba");
             if (file_exists($dir_original)) {
                 if (!toba_manejador_archivos::eliminar_directorio($dir_original)) {
                     throw new toba_error("Imposible restaurar backup desde '{$dir_backup}' hacia '{$dir_original}', deberá hacerlo manualmente.");
                 }
             }
             rename($dir_backup, $dir_original);
         }
         throw $excepcion;
     }
 }