/** * 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; } }
/** * 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'); } } }
/** * 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; } }