/** * Toma como motor predefinido el mismo que el de la instalacion de toba */ function get_servidor_defecto() { $parametros = $this->instancia->get_parametros_db(); if (isset($parametros['base'])) { unset($parametros['base']); } return $parametros; }
/** * Muestra información de la instalación. * @gtk_icono info_chico.gif * @gtk_no_mostrar 1 * @gtk_separador 1 */ function opcion__info() { if (toba_modelo_instalacion::existe_info_basica()) { $this->consola->enter(); //VERSION $this->consola->lista(array(toba_modelo_instalacion::get_version_actual()->__toString()), "VERSION"); // INSTANCIAS $instancias = toba_modelo_instancia::get_lista(); if ($instancias) { $this->consola->lista($instancias, 'INSTANCIAS'); } else { $this->consola->enter(); $this->consola->mensaje('ATENCION: No existen INSTANCIAS definidas.'); } // BASES $this->mostrar_bases_definidas(); // ID de grupo de DESARROLLO $grupo = $this->get_instalacion()->get_id_grupo_desarrollo(); if (isset($grupo)) { $this->consola->lista(array($grupo), 'ID grupo desarrollo'); } else { $this->consola->enter(); $this->consola->mensaje('ATENCION: No esta definido el ID del GRUPO de DESARROLLO.'); } // PROYECTOS $proyectos = toba_modelo_proyecto::get_lista(); if ($proyectos) { $lista_proyectos = array(); foreach ($proyectos as $dir => $id) { $lista_proyectos[] = "{$id} ({$dir})"; } $this->consola->lista($lista_proyectos, 'PROYECTOS (sólo en la carpeta por defecto)'); } else { $this->consola->enter(); $this->consola->mensaje('ATENCION: No existen PROYECTOS definidos.'); } } else { $this->consola->enter(); $this->consola->mensaje('La INSTALACION no ha sido inicializada.'); } }
/** * Interface de seleccion de N usuarios */ protected function seleccionar_usuarios(toba_modelo_instancia $instancia) { // Decido que usuarios voy a vincular /* $this->consola->subtitulo( "Asociar USUARIOS" ); $opcion[0] = "Asociar el usuario 'toba'"; $opcion[1] = "Asociar TODOS los usuarios de la instancia"; $opcion[2] = "Mostrar una lista de usuario y SELECCIONAR"; $ok = $this->consola->dialogo_lista_opciones( $opcion, 'Asociar USUARIOS al proyecto. Seleccione una FORMA de CARGA', false ); */ $usuarios = array(); $ok = 1; if ($instancia->get_instalacion()->es_produccion()) { $datos = $instancia->get_usuarios_administradores($this->id_proyecto_actual); } else { $datos = $instancia->get_lista_usuarios(); } switch ($ok) { case 0: // Usuario toba (pero..existe?) break; case 1: // Todos foreach ($datos as $dato) { $usuarios[] = $dato['usuario']; } break; case 2: // Seleccionar usuarios de una lista break; } return $usuarios; }
/** * Ejecuta una instalacion completa del framework para desarrollar un nuevo proyecto * @consola_parametros Opcionales: [-d 'iddesarrollo'] [-t 0| 1] [-n 'nombre inst'] [-h 'ubicacion bd'] [-p 'puerto'] [-u 'usuario bd'] [-b nombre bd] [-c 'archivo clave bd'] [-k 'archivo clave usuario admin'] [--usuario-admin 'usuario admin'] * @gtk_icono instalacion.png */ function opcion__instalar() { $nombre_toba = 'toba_' . toba_modelo_instalacion::get_version_actual()->get_release('_'); $alias = '/' . 'toba_' . toba_modelo_instalacion::get_version_actual()->get_release(); //--- Verificar instalacion $param = $this->get_parametros(); //--- Borra la instalacion anterior?? if (toba_modelo_instalacion::existe_info_basica()) { toba_modelo_instalacion::borrar_directorio(); } //--- Crea la INSTALACION $id_desarrollo = $this->definir_id_grupo_desarrollo($param); $tipo_instalacion = $this->definir_tipo_instalacion_produccion($param); $nombre = $this->definir_nombre_instalacion($param); toba_modelo_instalacion::crear($id_desarrollo, $alias, $nombre, $tipo_instalacion); $id_instancia = $tipo_instalacion == '1' ? 'produccion' : $this->get_entorno_id_instancia(true); //--- Crea la definicion de bases $base = $nombre_toba; if (!$this->get_instalacion()->existe_base_datos_definida($base)) { $datos = array('motor' => 'postgres7', 'profile' => $this->definir_profile_motor($param), 'usuario' => $this->definir_usuario_motor($param), 'clave' => $this->definir_clave_motor($param), 'base' => $this->definir_base_motor($param), 'puerto' => $this->definir_puerto_motor($param), 'encoding' => 'LATIN1', 'schema' => $id_instancia); $this->get_instalacion()->agregar_db($base, $datos); } //--- Crea la instancia $proyectos = array(); toba_modelo_instancia::crear_instancia($id_instancia, $base, $proyectos); //-- Carga la instancia $instancia = $this->get_instancia($id_instancia); $instancia->cargar(true); //Si no es interactivo, crea siempre la BD //--- Pido el password para el usuario por defecto $pwd = $this->definir_clave_usuario_admin($param); $usr = $this->definir_usuario_admin($param); //--- Vincula un usuario a todos los proyectos y se instala el proyecto $instancia->agregar_usuario($usr, 'Usuario Administrador', $pwd); $instancia->exportar_local(); //--- Crea los nuevos alias $instancia->crear_alias_proyectos(); $release = toba_modelo_instalacion::get_version_actual()->get_release(); $instal_dir = toba_modelo_instalacion::dir_base(); if (toba_manejador_archivos::es_windows()) { if (isset($_SERVER['USERPROFILE'])) { $path = $_SERVER['USERPROFILE']; } else { $path = $instal_dir; } $path .= "\\entorno_toba_{$release}.bat"; $bat = "@echo off\n"; $bat .= "set TOBA_DIR=" . toba_dir() . "\n"; $bat .= "set TOBA_INSTANCIA={$id_instancia}\n"; $bat .= "set TOBA_INSTALACION_DIR={$instal_dir}\n"; $bat .= "set PATH=%PATH%;%TOBA_DIR%/bin\n"; $bat .= "echo Entorno cargado.\n"; $bat .= "echo Ejecute 'toba' para ver la lista de comandos disponibles.\n"; file_put_contents($path, $bat); } else { $path = $instal_dir; $path .= "/entorno_toba.env"; $bat = "export TOBA_DIR=" . toba_dir() . "\n"; $bat .= "export TOBA_INSTANCIA={$id_instancia}\n"; $bat .= "export TOBA_INSTALACION_DIR={$instal_dir}\n"; $bat .= 'export PATH="$TOBA_DIR/bin:$PATH"' . "\n"; $bat .= "echo \"Entorno cargado.\"\n"; $bat .= "echo \"Ejecute 'toba' para ver la lista de comandos disponibles.\"\n"; file_put_contents($path, $bat); chmod($path, 0755); } }
function crear_instancia($nombre_instancia, $datos_motor) { $nombre_toba = 'toba_' . toba_modelo_instalacion::get_version_actual()->get_string_partes(); //--- Agrega la fuente de datos de la instancia $datos_motor['base'] = $nombre_toba . '_' . $nombre_instancia; $confirmado = false; do { $this->get_instalacion()->agregar_db($nombre_instancia, $datos_motor); //--- Si la base existe, pregunta por un nombre alternativo, por si no quiere pisarla if ($this->get_instalacion()->existe_base_datos($nombre_instancia)) { $mensaje = "La base <b>{$datos_motor['base']}</b> ya está siendo utiliza en este servidor."; $confirmado = inst_fact::gtk()->confirmar_pisar_base($mensaje); if ($confirmado !== true) { $datos_motor['base'] = $confirmado; $confirmado = false; } } else { $confirmado = true; } } while ($confirmado === false); //--- Crea la instancia $proyectos = toba_modelo_proyecto::get_lista(); if (isset($proyectos['toba_testing'])) { //--- Elimina el proyecto toba_testing unset($proyectos['toba_testing']); } toba_modelo_instancia::crear_instancia($nombre_instancia, $nombre_instancia, $proyectos); $instancia = $this->get_instancia($nombre_instancia); $instancia->cargar(true); //--- Vincula un usuario a todos los proyectos $instancia->agregar_usuario('toba', 'Usuario Toba', 'toba'); foreach ($instancia->get_lista_proyectos_vinculados() as $id_proyecto) { $proyecto = $instancia->get_proyecto($id_proyecto); $grupo_acceso = $proyecto->get_grupo_acceso_admin(); $proyecto->vincular_usuario('toba', $grupo_acceso); } $instancia->exportar_local(); //--- Crea los nuevos alias $instancia->crear_alias_proyectos(); //--- Ejecuta instalaciones particulares de cada proyecto foreach ($instancia->get_lista_proyectos_vinculados() as $id_proyecto) { $instancia->get_proyecto($id_proyecto)->instalar(); } }
/** * 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; } }
function get_lista_instancias() { $instancias = toba_modelo_instancia::get_lista(); $datos = array(); $a = 0; foreach ($instancias as $x) { $datos[$a]['id'] = $x; $datos[$a]['desc'] = $x; $a++; } return $datos; }
function existe_instancia($id) { return toba_modelo_instancia::existe_carpeta_instancia($id); }
/** * La definición del archivo instancias.php se mueve hacia archivos y directorios * en el directorio instalacion dentro de $toba_dir */ function instalacion__construir_inis() { // Estos defines se necesitan aca porque no se incluye el archivo de funciones planas db.php define("apex_db_motor", 0); define("apex_db_profile", 1); // host-dsn define("apex_db_usuario", 2); define("apex_db_clave", 3); define("apex_db_base", 4); define("apex_db_con", 5); define("apex_db_link", 6); define("apex_db", 7); define("apex_db_link_id", 8); if (!is_file(toba_dir() . '/php/instancias.php')) { throw new toba_error("No existe el archivo 'instancias.php'. No es posible realizar la conversion."); } require_once 'instancias.php'; //*** 0) Creo la carpeta INSTALACION toba_modelo_instalacion::crear_directorio(); //*** 1) BASES $bases_registradas = array(); $this->manejador_interface->mensaje("Migrar la definicion de BASES. (php/instancias.php)"); if (!toba_modelo_instalacion::existe_info_bases()) { foreach ($instancia as $i => $datos) { $base['motor'] = $datos[apex_db_motor]; $base['profile'] = $datos[apex_db_profile]; $base['usuario'] = $datos[apex_db_usuario]; $base['clave'] = $datos[apex_db_clave]; $base['base'] = $datos[apex_db_base]; $bases_registradas[] = $i; $bases[$i] = $base; } toba_modelo_instalacion::crear_info_bases($bases); $this->manejador_interface->mensaje("la definicion de BASES se encuentra ahora en '" . toba_modelo_instalacion::archivo_info_bases() . "'"); } else { $this->manejador_interface->mensaje("ya existe una archivo '" . toba_modelo_instalacion::archivo_info_bases() . "'"); } // *** 2) CLAVES $this->manejador_interface->mensaje("Migrar la definicion de CLAVES. (php/instancias.php)"); if (!toba_modelo_instalacion::existe_info_basica()) { $this->manejador_interface->enter(); $id_grupo_desarrollo = self::definir_id_grupo_desarrollo(); toba_modelo_instalacion::crear_info_basica(apex_clave_get, apex_clave_db, $id_grupo_desarrollo); } else { $this->manejador_interface->mensaje("ya existe una archivo '" . toba_modelo_instalacion::archivo_info_basica() . "'"); } // *** 3) INSTANCIAS $this->manejador_interface->enter(); $this->manejador_interface->subtitulo("Migrar INSTANCIAS toba"); $this->manejador_interface->mensaje("Indique que BASES son INSTANCIAS toba"); //Busco la lista de proyectos de la instalacion $proyectos = toba_modelo_proyecto::get_lista(); if (!in_array('toba', $proyectos)) { $proyectos[] = 'toba'; } //Creo las instancias, preguntando en cada caso //Existe la opcion de conectarse a la base y preguntar si existe la tabla 'apex_objeto', //pero puede ser que por algun motivo la base no este online y sea una instancia foreach ($instancia as $i => $datos) { if ($datos[apex_db_motor] == 'postgres7') { $this->manejador_interface->separador("BASE: {$i}"); $this->manejador_interface->lista($datos, 'Parametros CONEXION'); $this->manejador_interface->enter(); if ($this->manejador_interface->dialogo_simple("La base '{$i}' corresponde a una INSTANCIA TOBA?")) { if (toba_modelo_instancia::existe_carpeta_instancia($i)) { $this->manejador_interface->error("No es posible crearla instancia '{$i}'"); $this->manejador_interface->mensaje("Ya exite una instancia: {$i}"); } else { toba_modelo_instancia::crear_instancia($i, $i, $proyectos); } } } } $this->manejador_interface->mensaje("Ya es posible borrar el archivo 'toba_dir/php/instancias.php'"); $this->manejador_interface->separador(""); }
function parsear_editores(toba_modelo_instancia $instancia) { toba_contexto_info::set_db($instancia->get_db()); //--- Se busca el CI asociado a cada clase $sql = "SELECT\n\t\t\t\t\tc.clase,\n\t\t\t\t \to.proyecto,\n\t\t\t\t\to.objeto\n\t\t\t\tFROM\n\t\t\t\t\tapex_clase c,\n\t\t\t\t\tapex_item_objeto io,\n\t\t\t\t\tapex_objeto o\n\t\t\t\tWHERE\n\t\t\t\t\tc.clase IN ('" . implode("','", toba_info_editores::get_lista_tipo_componentes()) . "')\tAND\n\t\t\t\t\tc.proyecto = 'toba' AND\n\t\t\t\t\tc.editor_item = io.item AND\t\t\t\t-- Se busca el item editor\n\t\t\t\t\tc.editor_proyecto = io.proyecto AND\n\t\t\t\t\tio.objeto = o.objeto AND\t\t\t\t-- Se busca el CI del item\n\t\t\t\t\tio.proyecto = o.proyecto AND\n\t\t\t\t\to.clase = 'toba_ci'"; $rs = $instancia->get_db()->consultar($sql); $clase_php = new toba_clase_datos("toba_datos_editores"); foreach ($rs as $datos) { //--- Se buscan las pantallas asociadas a un CI especifico $this->manejador_interface->mensaje("Procesando " . $datos['clase'] . "..."); $proyecto = $instancia->get_db()->quote($datos['proyecto']); $objeto = $instancia->get_db()->quote($datos['objeto']); $sql = "\n\t\t\t\tSELECT\n\t\t\t\t\tpant.identificador,\n\t\t\t\t\tpant.etiqueta,\n\t\t\t\t\tpant.imagen,\n\t\t\t\t\tpant.imagen_recurso_origen\n\t\t\t\tFROM\n\t\t\t\t\tapex_objeto_ci_pantalla pant\n\t\t\t\tWHERE\n\t\t\t\t\t\tpant.objeto_ci_proyecto = {$proyecto}\n\t\t\t\t\tAND pant.objeto_ci = {$objeto}\n\t\t\t\tORDER BY pant.orden\n\t\t\t"; $pantallas = $instancia->get_db()->consultar($sql); $clase_php->agregar_metodo_datos('get_pantallas_' . $datos['clase'], $pantallas); } $dir = toba_dir() . "/php/modelo/info"; $clase_php->guardar($dir . '/toba_datos_editores.php'); }
/** * Crea una instancia NUEVA. * * @gtk_icono nucleo/agregar.gif * @gtk_no_mostrar 1 */ function opcion__crear($datos = null) { if (isset($datos)) { list($id_instancia, $tipo, $base, $proyectos, $usuario) = $datos; } else { $id_instancia = $this->get_id_instancia_actual(); $tipo = $this->get_tipo_instancia(); $usuario = null; } $instalacion = $this->get_instalacion(); if (toba_modelo_instancia::existe_carpeta_instancia($id_instancia)) { throw new toba_error("Ya existe una INSTANCIA con el nombre '{$id_instancia}'"); } if (!$instalacion->hay_bases()) { throw new toba_error("Para crear una INSTANCIA, es necesario definir al menos una BASE. Utilice el comando 'toba base registrar'"); } $this->consola->titulo("Creando la INSTANCIA: {$id_instancia} TIPO: {$tipo}"); //---- A: Creo la definicion de la instancia $this->consola->enter(); if (!isset($base)) { $base = $this->seleccionar_base(); } if (!isset($proyectos)) { $proyectos = $this->seleccionar_proyectos(); } toba_modelo_instancia::crear_instancia($id_instancia, $base, $proyectos, $tipo); //---- B: Cargo la INSTANCIA en la BASE $instancia = $this->get_instancia($id_instancia); $metodo_carga = 'cargar'; /*if($tipo == 'mini') { $metodo_carga = 'cargar_tablas_minimas'; } else { $metodo_carga = 'cargar'; }*/ try { $instancia->{$metodo_carga}(); } catch (toba_error_modelo_preexiste $e) { $this->consola->error('ATENCION: Ya existe una instancia en la base de datos seleccionada'); $this->consola->lista($instancia->get_parametros_db(), 'BASE'); if ($this->consola->dialogo_simple('Desea ELIMINAR la instancia y luego CARGARLA (La informacion local previa se perdera!)?')) { $instancia->{$metodo_carga}(true); } else { return; } } catch (toba_error $e) { $this->consola->error('Ha ocurrido un error durante la importacion de la instancia.'); $this->consola->error($e->getMessage()); } //---- C: Actualizo la versión, Creo un USUARIO y lo asigno a los proyectos $instancia->set_version(toba_modelo_instalacion::get_version_actual()); $this->opcion__crear_usuario($usuario, false, $id_instancia); if ($tipo != 'mini') { //---- D: Exporto la informacion LOCAL $instancia->exportar_local(); //-- Agregar los alias $this->consola->enter(); $crear_alias = $this->consola->dialogo_simple("Desea crear automáticamente los alias de apache en el archivo toba.conf?", true); if ($crear_alias) { $instancia->crear_alias_proyectos(); } } //Creo el esquema basico de logs de Toba. //$instancia->crear_modelo_logs_toba(); }