function __construct($toba_instalador) { $this->toba_instalador = $toba_instalador; $archivo = dirname(__FILE__) . '/toba.glade'; $glade = new GladeXML($archivo, 'dlg_crear_instancia'); foreach (self::$comp_req as $comp) { $this->comp[$comp] = $glade->get_widget($comp); } $glade->signal_autoconnect_instance($this); //---Bases disponibles $store = new GtkListStore(Gtk::TYPE_STRING); $instalacion = $this->toba_instalador->get_instalacion(); foreach ($instalacion->get_lista_bases() as $db) { $param = $instalacion->get_parametros_base($db); $store->append(array($db)); } $this->comp['combo_base']->set_model($store); $cellRenderer = new GtkCellRendererText(); $this->comp['combo_base']->pack_start($cellRenderer); $this->comp['combo_base']->set_active(0); //--- Pone los proyectos $proyectos = toba_modelo_proyecto::get_lista(); foreach ($proyectos as $path => $id) { $label = $path == $id ? $id : "{$id} (Directorio {$path})"; $check = new GtkCheckButton($label); $check->set_use_underline(false); $this->check_proyectos[] = array($id, $path, $check); $check->show(); $this->comp['box_proyectos']->pack_start($check); } }
protected function generar_schema_diff() { $schema_o = $this->get_schema_original(); $schema_logs_o = $schema_o . '_logs'; $schema_t = $this->get_schema_personalizacion(); $schema_logs_t = $schema_t . '_logs'; $this->get_db()->abrir_transaccion(); try { //1.- Renombrar el schema actual, al schema personalizado para que no rompa luego $this->get_db()->renombrar_schema($schema_logs_o, $schema_logs_t); $this->get_db()->renombrar_schema($schema_o, $schema_t); //2.- Indicarle al proyecto cual es el directorio de carga de los metadatos que debe usar $this->get_proyecto()->get_instancia()->set_dir_carga_proyecto($this->proyecto->get_id(), self::dir_metadatos_originales); //3.- Realizar la carga de la instancia, re-creando previamente el schema original que consta en bases.ini $this->get_proyecto()->get_instancia()->crear_schema(); $this->get_db()->retrazar_constraints(); $this->get_proyecto()->get_instancia()->cargar_autonomo(); $this->get_db()->cerrar_transaccion(); $this->get_db()->set_schema($schema_o); } catch (toba_error_db $e) { $this->get_db()->abortar_transaccion(); toba_logger::instancia()->error($e->getMessage()); throw new toba_error_usuario('Hubo un inconveniente al intentar exportar la personalización, revise el log'); } }
/** * Devuelve una referencia a un PROYECTO * @return toba_modelo_proyecto */ function get_proyecto($id_instancia, $id_proyecto, $manejador_interface = null) { $instancia = $this->get_instancia($id_instancia, $manejador_interface); $archivo_proy = $instancia->get_path_proyecto($id_proyecto) . "/php/extension_toba/modelo_{$id_proyecto}.php"; if (file_exists($archivo_proy)) { require_once $archivo_proy; $clase = 'modelo_' . $id_proyecto; $proyecto = new $clase($instancia, $id_proyecto); } else { $proyecto = new toba_modelo_proyecto($instancia, $id_proyecto); } if (!isset($manejador_interface)) { $manejador_interface = new toba_mock_proceso_gui(); } $proyecto->set_manejador_interface($manejador_interface); return $proyecto; }
/** * Shortcut para crear el punto de montaje de la personalización de un proyecto */ function crear_pm_personalizacion() { $id_proyecto = $this->proyecto->get_id(); $punto = new toba_punto_montaje_pers(); $punto->set_etiqueta(toba_modelo_pms::pm_pers); $punto->set_proyecto($id_proyecto); $punto->set_proyecto_referenciado($id_proyecto); $punto->set_descripcion('Punto de montaje por defecto de la personalización de todos los proyectos de toba'); $punto->set_path('personalizacion/php'); $this->guardar($punto); }
function conf__inicial() { require_once 'admin_util.php'; //********* FRAMES entorno EDICION ************ //-- FRAME control define('apex_frame_control', 'frame_control'); //-- FRAME lista define('apex_frame_lista', 'frame_lista'); //-- FRAME central define('apex_frame_centro', 'frame_centro'); // Emular el contexto en el consumo por consola. if (php_sapi_name() === 'cli') { toba_editor::iniciar(toba::instancia()->get_id(), toba_editor::get_id()); toba_editor::referenciar_memoria(); } toba_zona::set_modo_url(true); $clases = array('ci_editores_toba'); toba_modelo_proyecto::set_clases_excluidas_autoload($clases); }
function migrar_auditoria_2_4($tablas = array(), $prefijo_tablas = null) { $fuentes = $this->proyecto->get_indice_fuentes(); if (empty($fuentes)) { return; } $base = $this->proyecto->get_db_negocio(); $auditoria = $base->get_manejador_auditoria($this->schema_modelo, $this->schema_auditoria, $this->schema_toba); if (is_null($auditoria)) { //No existe manejador para el motor en cuestion return; } if (empty($tablas)) { $auditoria->agregar_tablas($prefijo_tablas); } else { foreach ($tablas as $tabla) { $auditoria->agregar_tabla($tabla); } } $auditoria->migrar_estructura_campos_toba_2_4(); }
function __construct($toba_instalador, $param_comando) { $this->param_comando = $param_comando; $this->toba_instalador = $toba_instalador; $archivo = dirname(__FILE__) . '/toba.glade'; $glade = new GladeXML($archivo, 'dlg_cargar_proyecto'); foreach (self::$comp_req as $comp) { $this->comp[$comp] = $glade->get_widget($comp); } $glade->signal_autoconnect_instance($this); $modelo = new GtkListStore(Gtk::TYPE_STRING, Gtk::TYPE_STRING); $opciones = toba_modelo_proyecto::get_lista(); print_r($opciones); $iter = $modelo->append(array($this->label_otro, null)); foreach ($opciones as $path => $id) { $label = $id == $path ? $id : "{$id} ({$path})"; $modelo->append(array($label, $id)); } $this->comp['combo_proyecto']->set_model($modelo); $this->comp['combo_proyecto']->set_active_iter($iter); $this->evt__cambio_proyecto(); }
/** * @param toba_modelo_proyecto $proyecto * @param $id_servicio * @return toba_ini */ static function get_ini_cliente(toba_modelo_proyecto $proyecto, $id_servicio) { $directorio = $proyecto->get_dir_instalacion_proyecto() . "/rest/{$id_servicio}"; $ini = new toba_ini($directorio . '/cliente.ini'); return $ini; }
static function extender_clases(toba_modelo_proyecto $proyecto, $consola, $de) { $seguir = true; if ($proyecto->tiene_clases_extendidas($de)) { $mensaje = "Las clases ya están extendidas. Si las reextiende se "; $mensaje .= "perderán todos los cambios que se introdujeron en las "; $mensaje .= "mismas. Desea reextender de cualquier manera?"; $seguir = $consola->dialogo_simple($mensaje); } if ($seguir) { $prefijo = $de == 'proyecto' ? '/personalizacion' : ''; $path = $proyecto->get_dir() . $prefijo . '/php/extension_toba/componentes'; util_modelo_proyecto::extender_componentes($proyecto, $path, $de); util_modelo_proyecto::marcar_clases_extendidas($proyecto, $de); } return $seguir; }
/** * 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.'); } }
function vincular_proyecto($proyecto, $path = null, $url = null) { if (isset($path) || toba_modelo_proyecto::existe($proyecto, false)) { $datos_ini = array(); $ini = $this->get_ini(); $datos = explode(',', $ini->get_datos_entrada('proyectos')); $proyectos_instancia = array(); foreach ($datos as $valor) { if (trim($valor) != '') { $proyectos_instancia[] = trim($valor); } } $existe_proyecto = in_array($proyecto, $proyectos_instancia); if (!$existe_proyecto) { //Si el proyecto no existe en la instancia lo agrego $proyectos_instancia[] = $proyecto; $ini->set_datos_entrada('proyectos', implode(', ', array_unique($proyectos_instancia))); } elseif ($ini->existe_entrada($proyecto)) { //Si ya estaba, levanto sus datos anteriores $datos_ini = $ini->get_datos_entrada($proyecto); } //Actualizo los datos del proyecto si se cambiaron if (isset($path)) { $datos_ini['path'] = $path; } elseif (is_null($path)) { $datos_ini['path'] = $this->get_path_proyecto($proyecto); toba_logger::instancia()->debug("El path elegido para el proyecto '{$proyecto}' es {$datos_ini['path']}"); } if (isset($url)) { $datos_ini['url'] = $url; } elseif (is_null($url)) { $datos_ini['url'] = $this->get_url_proyecto($proyecto); toba_logger::instancia()->debug("La url elegida para el proyecto '{$proyecto}' es {$datos_ini['url']}"); } $usar_perfiles_propios = $this->get_proyecto_usar_perfiles_propios($proyecto); if ($usar_perfiles_propios) { $datos_ini['usar_perfiles_propios'] = $usar_perfiles_propios; toba_logger::instancia()->debug("El proyecto '{$proyecto}' usa perfiles propios"); } if (!$ini->existe_entrada($proyecto)) { //Si no hay entrada previa para los datos del proyecto $ini->agregar_entrada($proyecto, $datos_ini); } else { $ini->set_datos_entrada($proyecto, $datos_ini); } $ini->guardar(); toba_logger::instancia()->debug("Vinculado el proyecto '{$proyecto}' a la instancia"); // Recargo la inicializacion de la instancia $this->cargar_info_ini(); //Genera .ini templates de rest $this->generar_ini_rest($proyecto); } else { throw new toba_error("El proyecto '{$proyecto}' no existe."); } }
/** * Interface de seleccion de PROYECTOS */ protected function seleccionar_proyectos($seleccion_multiple = true, $obligatorio = false) { $titulo = $seleccion_multiple ? "Seleccionar PROYECTOS" : "Seleccionar PROYECTO"; $proyectos = toba_modelo_proyecto::get_lista(); if (count($proyectos) > 0) { $sel = $this->consola->dialogo_lista_opciones($proyectos, $titulo, $seleccion_multiple, 'Nombre real del proyecto', $obligatorio, array_keys($proyectos), 'todos'); //--- Se valida que un proyecto no se incluya dos veces //--- Ademas se transpone la matriz, ya que ahora proyecto es una PK $seleccion = array(); if ($seleccion_multiple) { foreach ($sel as $path) { if (isset($seleccion[$proyectos[$path]])) { throw new toba_error('ERROR: Una instancia no soporta contener el mismo proyecto más de una vez'); } $seleccion[$proyectos[$path]] = $path; } } else { //--Arreglo id,path return array($proyectos[$sel], $sel); } return $seleccion; } else { if ($obligatorio) { throw new toba_error('No hay proyectos definidos'); } return array(); } }
/** * 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 crear_usuario_para_auditoria($db) { if ($this->definicion['tiene_auditoria'] == '1') { $usuario = toba::usuario()->get_id(); if (!isset($usuario)) { $usuario = 'publico'; } $id_solicitud = $db->quote(toba::instancia()->get_id_solicitud()); $usuario = $db->quote($usuario); $sql = 'CREATE TEMP TABLE tt_usuario ( usuario VARCHAR(60), id_solicitud INTEGER);'; if (isset($this->definicion['permisos_por_tabla']) && $this->definicion['permisos_por_tabla'] == '1') { $id_operacion = toba::memoria()->get_item_solicitado(); $rol_runtime = toba_modelo_proyecto::get_rol_prueba_db_basico($this->definicion['fuente_datos']); //Obtengo el rol basico de prueba $rol_operacion = toba_modelo_proyecto::get_rol_prueba_db($this->definicion['fuente_datos'], $id_operacion['1']); //Obtengo el particular para la operacion if ($db->existe_rol($rol_operacion)) { //Si existe el rol para la operacion entonces lo seteo como el apropiado $rol_runtime = $rol_operacion; } $sql .= "GRANT SELECT, INSERT ON tt_usuario TO {$rol_runtime} ;"; } $sql .= "INSERT INTO tt_usuario (usuario, id_solicitud) VALUES ({$usuario}, {$id_solicitud})"; $db->ejecutar($sql); } }
/** * Genera los archivos para los certificados del proyecto * @param toba_modelo_proyecto $proyecto * @param string $directorio * @throws toba_error_usuario */ static function generar_certificados(toba_modelo_proyecto $proyecto, $directorio = null) { //Si no se pasa directorio de salida, asigno por defecto el de instalacion del proyecto if (is_null($directorio)) { $directorio = $proyecto->get_dir_instalacion_proyecto(); } //Busco en el directorio de la instalacion de Toba el archivo de configuracion para openssl $dir_inst = $proyecto->get_instalacion()->get_dir(); if (!file_exists($dir_inst . '/openssl.ini')) { throw new toba_error_usuario("No existe el archivo '{$dir_inst}/openssl.ini'. Necesita copiarlo de la carpeta toba/php/modelo/var"); } $cmd = "openssl req -x509 -nodes -days 20000 -newkey rsa:1024 -keyout {$directorio}/privada.key.sign -config {$dir_inst}/openssl.ini -out {$directorio}/publica.crt"; $exito = toba_manejador_archivos::ejecutar($cmd, $stdout, $stderr); if ($exito != '0') { throw new toba_error_usuario($stderr . "\n Asegurese tener instalados los binarios de OpenSSL y disponibles en el path. Para comprobar ejecute 'openssl version'"); } $cmd = "openssl rsa -in {$directorio}/privada.key.sign -out {$directorio}/privada.key"; $exito = toba_manejador_archivos::ejecutar($cmd, $stdout, $stderr); if ($exito != '0') { throw new toba_error_usuario($stderr); } unlink("{$directorio}/privada.key.sign"); }
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. * @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'); } } }
/** * Devuelve la lista de proyectos existentes en la carpeta por defecto de la instalación * Es posible que existan proyectos en otros lugares del sistema de archivos y no se listen con este método * @return array Arreglo asociativo path relativo => id proyecto */ static function get_lista($usar_cache = true) { if (!isset(self::$lista_proyectos) || !$usar_cache) { $proyectos = array(); $directorio_proyectos = toba_dir() . '/proyectos'; if (is_dir($directorio_proyectos)) { if ($dir = opendir($directorio_proyectos)) { while (false !== ($archivo = readdir($dir))) { if (is_dir($directorio_proyectos . '/' . $archivo) && $archivo != '.' && $archivo != '..' && $archivo != '.svn') { $arch_nombre = $directorio_proyectos . '/' . $archivo . '/proyecto.ini'; $id = $archivo; //--- Si no se encuentra el archivo PROYECTO, se asume que dir=id if (file_exists($arch_nombre)) { $ini = new toba_ini($arch_nombre); $id = $ini->get('proyecto', 'id', null, true); } $proyectos[$archivo] = $id; } } closedir($dir); } } self::$lista_proyectos = $proyectos; } return self::$lista_proyectos; }