I INDICE Pág. 1. INSTALACIÓN LINUX FEDORA CORE 6 1 2. CONFIGURACIÓN SERVIDOR 14 2.1 Dns 14 2.1.1 Archivo de Configuración named.conf 14 2.1.2 Archivo de zona 15 2.1.3 Archivo de zona inversa 16 2.2. Apache 16 2.2.1 Creación VirtualHost 16 2.2.2 Configuración del manejo del Ancho de Banda 17 2.2.3 Llamada a una página segura 18 2.3. Firewall 18 2.3.1 Archivo de configuración del Firewall 19 2.4. Correo Electrónico 20 2.4.1 Configuración del Sendmail 20 2.5 Antivirus 22 2.5.1 Instalación y configuración del MailScanner 22 2.5.2 Instalación del antivirus Panda 22 2.6 SFTP 23 2.7 Configuración de página segura 23 2.8 Configuración de DHCP 24 2.9 Activación Oc4j 24 2.10 Instalación de la Base de Datos 25 3. MANUAL DE USUARIO 26 3.1 Pantalla principal 27 3.2 Planes 27 4.3 Buscar dominio 28 3.4 Resultado de la búsqueda 29 3.5 Solicitud 29 3.5.1 Pantalla de pago 30 3.5.2 Pantalla de confirmación del pago 31 3.6. Pantalla de administración de usuario 31 3.6.1 Ingreso a la pantalla de administración 32 3.6.2 Opción de correo 33 3.6.2.1 Crear usuarios 34 3.6.2.2 Listar los usuarios creados 34 3.6.2.3 Cambio de clave de usuarios 35 3.6.2.4 Deshabilitar cuenta de correo 35 3.6.2.5 Habilitar cuenta de correo 36 3.6.2.6 Cambio de cuota 37 3.7 Archivo 37 3.8 Monitoreo del sitio 37 3.9 Cerrar sesión 38 3.10. Administración del servidor de hosting 38 3.10.1 Pantalla del administrador 38 3.10.2 Contrato 39 3.10.2.1 Pantalla finalizar contrato 39 3.10.2.2 Renovar contrato 40 3.10.3 Ancho de banda 41 3.10.4 Correo 42 3.10.4.1 Crear 42 3.10.4.2 Dominio 43 3.10.4.2.1 Deshabilitar 45 3.10.4.2.2 Habilitar 45 3.10.4.2.3 Cambio de clave 46 3.10.4.2.4 Cambio de cuota 47 3.10.5 Listado 47 3.10.6 Monitoreo 48 3.11 Misión 48 3.12 Visión 48 3.13 Autores 49 3.14 Plan abierto 50 4. CODIFICACION 51 4.1 Whois 51 4.2 Validar Clave 52 4.3 Actualizar la Base de dato 53 4.4 Visualizar datos de paginas intermedia 54 4.5 Insertar en la Base de dato 56 4.6 Seleccionar información de la Base de datos 58 4.7 Método Update 62 4.8 MetaAplicación 64 4.9 Aplicación 67 1 CAPITULO 1 INSTALACION DEL LINUX FEDORA CORE 6 El primer paso que se realiza es escribir la palabra linux expert luego le damos Enter. En esta pantalla vamos a presionar skip para comenzar a instalar. Esta es la pantalla para la instalación del Linux Fedora Core 6, a continuación presionamos en el botón next. 2 Escogemos la opción del teclado en español. En esta pantalla escogemos la opción spanish(español), para que todo el proceso de instalación se la realice en español. En esta opción vamos a elegir crear disposición personalizada 3 En esta parte empezaremos a crear las particiones necesarias para la implementación de nuestro proyecto. Como van a poder apreciar vamos a instalar el sistemas operativo en un disco de 81920MB, y elegimos 40000 para la partición /home que le vamos a crear Creamos una partición /tmp, que le hemos asignado 3000MB, con ext3 4 Creamos el swap, para poder aumentar la capacidad de memoria, que nos ayudara para el uso de las aplicaciones que utilizaremos y le asignamos 2000MB. Esta es la capacidad del disco que vamos utilizar con sus respectivas particiones creadas. 5 Una vez que ya hemos creados todas las particiones, nos aparecerá esta pantalla, y marcamos la opción El gestor de arranque GRUB, y damos clic a siguiente. A continuación marcamos la opción manualmente, y escribimos el nombre del host y el dominio en este caso será. Server.grouonine.com, y presionamos el botón siguiente. 6 Escogemos la opción guayaquil, y pulsamos siguiente. Ponemos la contraseña de acceso, en nuestro caso es server@2007#, y damos clic en siguiente. 7 En esta parte configuramos manualmente todo lo necesario para poder realizar nuestra aplicación, marcamos la opción personalizar ahora, y damos clic en siguiente. Seleccionamos todos los servidores, desarrollo, sistema base, aplicaciones, con un visto y siguiente. 8 Damos clic en siguiente para empezar la instalación del Linux Fedora Core 6 Este mensaje sale cuando ya termina la instalación y damos clic en reiniciar. 9 Aparecerá la pantalla de bienvenida de Linux Escogemos la opción aceptamos el Acuerdo de Licencia y siguiente: 10 Deshabilitamos el cortafuego y clic en siguiente, luego nos aparecerá una ventana informando que se sobrescribirán el archivo de firewall, aceptamos. Escogemos la opción obediente. 11 En esta parte configuramos la fecha y hora del sistema operativo. Creamos un usuario llamado hosting con su respectiva contraseña 12 Esta es la pantalla de ingreso al sistema operativo, para poder ingresar se debe ingresar su nombre de usuario. Ingresamos la clave del usuario antes ingresado 13 Este es el escritorio del sistema operativo Linux Fedora Core 6 14 CAPITULO 2 2. Configuración servidor 2.1 DNS El Domain Name System (DNS) o sistemas de nombres de dominios, que es una base de datos que almacena información asociada a nombres de dominio. Para nuestro uso realizaremos la asignación de nombres de dominio para que las páginas almacenadas en nuestra aplicación puedan se llamada, así como la utilización del servicio de correo electrónico de cada dominio. 2.1.1 Archivo de Configuración named.conf En este archivo realizaremos la configuración de cada uno de los dominios que van contratando nuestros servicios, el mismo que se encuentra en la siguiente ruta: /var/named/chroot/etc/named.conf Este archivo quedará configurado de la siguiente forma: options { directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; }; #Definición de zonas y zona inversa zone "groupninecisc.com" IN { type master; file "groupninecisc.com.zone"; 15 allow-update {192.168.2.0/24;}; }; zone "2.168.192.in-addr.arpa" IN { type master; file "2.168.192.in-addr.arpa.zone"; allow-update {192.168.2.0/24;}; }; 2.1.2 Archivo de zona Creamos en la ruta /var/named/chroot/var/named/, el archivo con el nombre del dominio, para el caso groupninecisc.com.zone, el mismo que editamos y configuramos de la siguiente forma: vi /var/named/chroot/var/named/groupninecisc.com.zone $TTL 86400 groupninecisc.com. IN SOA server.groupninecisc.com. root.groupninecisc.com. ( 2007070601 ; serial 3H ; refresh 15M ; retry 1W ; expiry 1D ) ; minimum IN NS server IN A 192.168.2.1 server IN A 192.168.2.1 www IN CNAME groupninecisc Este archive nos ayudará a resolver el nombre del dominio que hemos configurado, y deberá crearse un archivo por cada dominio que creemos. 16 2.1.3 Archivo de zona inversa Creamos en la ruta /var/named/chroot/var/named/, el archivo de zona inversa con el nombre de la dirección IP del servidor, para el caso 2.168.192.in-addr.arpa.zone, el mismo que editamos y configuramos de la siguiente forma: $TTL 86400 @ IN SOA server.groupninecisc.com. root.groupninecisc.com. ( 2007070601 ; serial 1 3H ; refresh 15M ; retry 1W ; expiry 1D ) ; minimum IN NS server. IN PTR groupninecis.com. Este archivo de configuración se crea una sola vez. 2.2. Apache La configuración del servidor Apache, nos permitirá implementar el protocolo HTTP y crear la noción de los sitios virtuales, que vamos a administrar. 2.2.1 Creación VrtualHost Por cada dominio contratado vamos a crear un VirtualHost en el archivo httpd.conf, que se encuentra en la siguiente ruta: /etc/httpd/conf/httpd.conf 17 Editando el archivo nos quedará de la siguiente forma para un dominio: <VirtualHost 192.168.2.1:80> ServerAdmin root@dominiofae.com DocumentRoot /home/dominiofae ServerName www.dominiofae.com </VirtualHost> 2.2.2 Configuración del manejo del Ancho de Banda Para poder realizar el control de ancho de banda de nuestros usuarios, lo realizamos en el archivo httpd.conf, en el que aumentamos las siguientes líneas: LoadModule cband_module modules/mod_cband.so CBandScoreFlushPeriod 1 CBandRandomPulse On <IfModule mod_cband.c> <Location /cband-status> SetHandler cband-status </Location> <Location /cband-status-me> SetHandler cband-status-me </Location> </IfModule> En el mismo archivo dentro del VirtualHost configuramos los valores de acuerdo al plan que fue seleccionado, quedando de la siguiente forma: 18 <VirtualHost 192.168.2.1:80> ServerAdmin root@dominiofae.com DocumentRoot /home/dominiofae ServerName www.dominiofae.com <Location /cband-status> SetHandler cband-status </Location> <Location /cband-status-me> SetHandler cband-status-me </Location> CBandLimit 128M CBandSpeed 64 10 10 CBandRemoteSpeed 10 3 3 CBandPeriod 4W </VirtualHost> Con esta configuración permitimos que se realice el monitoreo de cada dominio existente. 2.2.3 Llamada a una página segura Para que nuestro dominio sea seguro se realizará la configuración de página segura que se encuentra indicada en el capitulo 2.7, en el archivo httpd.conf solamente agregamos la siguiente línea en el VirtualHost: Redirect https://www.groupnineisc.com 2.3. Firewall La seguridad que implementemos en nuestro servidor nos permitirá asegurar que los recursos sean utilizados de la manera que hemos 19 decidido y que la información que se considera importante no sea fácil de acceder por cualquier persona que no se encuentre acreditada. 2.3.1 Archivo de configuración del Firewall Par la configuración de seguridades hemos implementado un script, el mismo que va a tener la siguiente configuración: #DAR ACCESO AL EQUIPO LOCAL iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT #DAR ACCESO A La ip LOCAL iptables -A INPUT -s 192.168.2.1 -j ACCEPT iptables -A OUTPUT -d 192.168.2.1 -j ACCEPT ## Empezamos a filtrar ## Nota: eth0 es el interfaz conectado al router y eth1 a la LAN # Al firewall tenemos acceso desde la red local iptables -A INPUT -s 192.168.2.0/24 -i eth1 -j ACCEPT # Ahora hacemos enmascaramiento de la red local # y activamos el BIT DE FORWARDING (imprescindible!!!!!) iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE # Con esto permitimos hacer forward de paquetes en el firewall, o sea # que otras máquinas puedan salir a través del firewall. echo 1 > /proc/sys/net/ipv4/ip_forward ## Y ahora cerramos los accesos indeseados del exterior: # Nota: 0.0.0.0/0 significa: cualquier red # Cerramos el rango de puerto bien conocido iptables -A INPUT -s 0.0.0.0/0 -p tcp --dport 1:1024 -j DROP iptables -A INPUT -s 0.0.0.0/0 -p udp --dport 1:1024 -j DROP # Cerramos un puerto de gestión: webmin iptables -A INPUT -s 0.0.0.0/0 -p tcp --dport 10000 -j DROP #echo " OK . Verifique que lo que se aplica con: iptables -L -n" 20 2.4. Correo Electrónico Dentro del servicio que se ofrece en el hosting es la asignación de cuentas de correo para los clientes que contraten un dominio, en esta parte cada usuario dispondrá de una cierta cantidad de cuentas de correo las mismas que pueden ser creadas por cada usuario. 2.4.1 Configuración del Sendmail La configuración del servicio de correo la realizamos en el archivo sendmail.mc que se encuentra en la siguiente ruta: /etc/mail/sendmail.mc Editamos las siguientes líneas en el archivo: DAEMON_OPTIONS(‘Port=smtp,Addr=127.0.0.1,Name=MTA’)dnl FEATURE(‘accept_unresolvable_domains’)dnl MASQUERADE_AS(‘example.com’)dnl FEATURE(‘masquerade_envelope’)dnl FEATURE(‘masquerade_entire_domains’)dnl cambiamos por: DAEMON_OPTIONS(`Port=smtp, Name=MTA')dnl dnl FEATURE(`accept_unresolvable_domains')dnl MASQUERADE_AS(`groupninecisc.com')dnl FEATURE(masquerade_envelope)dnl FEATURE(masquerade_entire_domain)dnl 21 Aumentamos lo siguiente: FEATURE(`genericstable', `hash -o /etc/mail/genericstable.db')dnl Cwgroupninecisc.com Grabamos el archivo con los cambios indicados anteriormente y accedemos a una terminal, para ejecutar los siguientes comandos: m4 /etc/mail/sendmail.mc> /etc/mail/sendmail.cf makemap hash /etc/mail/virtusertable.db < /etc/mail/virtusertable makemap hash /etc/mail/ genericstable.db < /etc/mail/genericstable De igual forma en el archivo de configuración local-host-name que se encuentra en la siguiente ruta: /etc/mail/ le agregamos estas líneas. /etc/mail/local-host-name groupninecisc.com mail.groupninecisc.com Para el resto de dominios se irán agregando según los contratados. Dentro del archivo genericstable que se encuentra en la siguiente ruta: /etc/mail/ le agregamos estas líneas. pepito pepito@groupninecisc.com Para el resto de usuario de correo que se creen de los diferentes dominios se van a ir agregando en este archivo. Dentro del archivo virtusertable que se encuentra en la siguiente ruta: /etc/mail/ le agregamos estas líneas. pepito@groupninecisc.com pepito 22 2.5 Antivirus Otro de los servicios que se ofrece es el de servidor de antivirus, el mismo que permitirá a los usuarios contar con una protección para los archivos que se manejen dentro de su espacio asignado. 2.5.1 Instalación y configuración del MailScanner Primero debemos de instalar el rpm del Mailscanner, la forma de ejecutar este paquete es la siguiente: rpm –hiv mailscanner-3.03-1.i386.rpm Editamos el archivo del mailscanner.conf, que se creo en la ruta: /usr/local/MailScanner/etc/mailscanner.conf Host name = the MailScanner Incoming Work Dir = /var/spool/MailScanner/incoming Quarantine Dir = /var/spool/MailScanner/quarantine Virus Scanning = yes Virus Scanner = panda Scan All Messages = yes Spam Checks = yes Spam Action = deliver Use SpamAssassin = yes Esta configuración nos permite tener un enlace con el antivirus a utilizar y el sendmail. 2.5.2 Instalación del antivirus Panda Instalar el rpm del panda antivirus, la forma de ejecutar este paquete es la siguiente: rpm –hiv pavcl_linux_i386.rpm 23 2.6 SFTP Para poder mantener una transferencia de archivo segura configuramos el fichero que se encuentra en: /etc/vsftpd/vsftpd.conf anonymous_enable=NO local_enable=YES write_enable=YES ftpd_banner=BIENVENIDO AL DOMINIO chroot_local_user=YES chroot_list_enable=YES chroot_list_file=/etc/vsftpd/vsftpd.chroot_list Luego de haber modificado este archivo abrimos una consola y ejecutamos el siguiente comando: touch /etc/vsftpd/ vsftpd/vsftpd.chroot_list 2.7 Configuración de página segura Para la utilización de las páginas segura tenemos que modificar el fichero que se encuentra en la ruta: /etc/httpd/conf.d/ssl.conf Listen 443 DocumentRoot "/var/www/html/groupninecisc" ServerName www.groupninecisc.com:443 SSLEngine on SSLCertificateFile /etc/pki/tls/certs/solicitud.crt SSLCertificateKeyFile /etc/pki/tls/private/clave.key Los archivos solicitud.crt y clave.key se generan ejecutando los siguientes comandos: 24 Openssl genrsa –out clave.key 1024 Openssl req –new –key clave.key –out clave.csr Openssl x509 –req –days 60 –in clave.csr –signkey clave.key –out solicitud.crt 2.8 Configuración de DHCP Para la asignación de direcciones dinámicas, realizamos la configuración del servidor de dhcp, para lo cual procedemos a editar el archivo dhcpd.conf que se encuentra dentro de: /etc/dhcpd.conf ddns-update-style interim; ddns-updates on; subnet 192.168.2.0 netmask 255.255.255.0 { range 192.168.2.21 192.168.2.254; default-lease-time 86400; max-lease-time 604800; option routers 192.168.2.1; option domain-name "groupninecisc.com"; option domain-name-servers 192.168.2.1; } 2.9 Activación Oc4j Para activar el Oc4j, tenemos que abrir una Terminal y dirigirnos a la ruta: /usr/local/ jdevstudio10132\jdev\bin y digitar el siguiente comando: 25 start_oc4j y presiona enter y espera hasta que cargue, para comprobrar que levanto el servicio en el browser digitamos: 192.168.2.1:8888. 3. Instalación de la base de dato. Los paquetes para poder utilizar la base de dato son los siguientes: mysql-5.0.22-2.1.i386.rpm mysql-server-5.0.22-2.1.i386.rpm Luego de instalar los paquetes, ejecutamos los siguientes comandos: /sbin/service mysqld start /sbin/chkconfig –level 345 mysqld on Para poder ingresar a la interfaces del mysql ejecutamos el comando mysql y nos pondrán en el prompt de mysql> , y podremos manipular la base de datos. 26 CAPITULO # 3 MANUAL DE USUARIO 27 3.1.- Pantalla principal El usuario podrá ingresar a este portal desde cualquier navegador digitando www.groupninecisc.com , que es la página principal del servicio de hosting. 3.2 Planes La opción planes mostrará los diferentes tipos de planes que ofrece nuestro servidor de hosting, se puede seleccionar un plan fijo o configurar uno de acuerdo a sus requerimientos presionando la opción CONFIGURABLE. 28 3.3 Buscar dominio En esta pantalla podremos consultar el dominio que seleccionamos, para ver si esta disponible o no. 29 3.4.- Resultado de la búsqueda La búsqueda del dominio nos mostrará la siguiente pantalla, en la cual nos indica si el dominio esta disponible o no se encuentra disponible. 3.5. Solicitud Una vez elegido el plan, se nos mostrará esta pantalla en la que el usuario podrá llenar la solicitud con todos sus datos personales. 30 3.5.1 Pantalla de pago Esta pantalla se mostrará una vez que se llene los datos de la solicitud, aquí eL solicitante tendrá que digitar su número de tarjeta de crédito, para proceder con el pago y su dominio sea registrado. 31 3.5.2 Pantalla de confirmación del pago Presenta el resultado de la transacción del pago. 3.6 Pantalla de administración de usuario Para poder acceder a la pantalla de administración el usuario tendrá que visitar nuestro Web Site y tendrá que ingresar el Username y el Password. 32 3.6.1 Ingreso a la pantalla de administración Se le presentara las diferentes opciones, en las cuales el usuario administrador podrá realizar lo siguiente: • Guía: que es un pequeño instructivo de las opciones a las que va a tener acceso. • Correo: para realizar todo lo concerniente cuentas de correo. • Archivo: para actualización de los archivos. • Monitoreo: para poder mantener un control de todo lo que respecta al sitio del cliente. • Cerrar sesión: vuelve a la página principal del sitio. 33 3.6.2 Opciones de correo El administrador tendrá las opciones de: • Crear: Crea una cuenta de correo para su dominio. • Cambio clave: de los usuarios de correo. • Deshabilitar: una determinada cuenta de correo. • Cambio cuota: asignarle un determinado espacio en disco para la cuenta de correo. • Habilitar: poner activa una cuenta que fue deshabilitada. • Listado: visualizar todos los usuarios de correo que han sido creados. 34 3.6.2.1 Crear usuarios Digitamos el nombre de la cuenta de correo del nuevo usuario, luego ingresamos la clave y por ultimo la cuota asignada a la cuenta de correo, la cuota deberá ser ingresada en valor entero no en decimales. 3.6.2.2 Listar los usuarios creados Mostrará a todos los usuarios creados en dicho dominio. 35 3.6.2.3 Cambio de clave de usuarios Mostrará el listado de las cuentas de correo, de allí se seleccionará la cuenta a la cual se desea cambiar la clave, se ingresara la clave anterior y luego se digitará la nueva clave, con su respectiva confirmación y se procede con la tecla modificación. 3.6.2.4 Deshabilitar cuenta de correo Mostrará el listado de las cuentas de correo, de allí se seleccionará la cuenta la cual se desea deshabilitar, se mostrará la pantalla de deshabilitar cuenta y se presiona la opción deshabilitar para proceder con la opción. 36 3.6.2.5 Habilitar cuenta de correo Mostrará el listado de las cuentas de correo, de allí se seleccionará la cuenta la cual se desea habilitar, se mostrará la pantalla de habilitar cuenta y se presiona la opción habilitar para proceder con la opción. 37 3.6.2.6 Cambio de cuota Muestra la pantalla de modificar cuota, en la cual deberá ingresar el nuevo valor de la cuota, que deberá ser escrito en cantidades enteras. 3.7 Archivo Con esta opción se podrá administrar los archivos de la pagina Web, para poder realizar las respectivas actualizaciones del sitio. 3.8 Monitoreo del sitio Esta opción permitirá visualizar información concerniente al portal, el número de visitas, monitorear al ancho el banda, y el espacio que estamos utilizando. 38 3.9 Cerrar sesión Esto nos permite terminar la sesión del usuario y retornar a la página principal del sitio. 3.10. Administración del servidor de hosting Para ingresar a la pantalla de administración de igual forma que para el usuario, se ingresará un user y password, para el caso admin admin. 3.10.1 Pantalla del administrador El usuario administrador del Hosting tendrá las siguientes opciones, para la administración: • Inicio: retorna a la página principal del administrador. • Contrato: para opciones de renovación y terminación. • Correo: para realizar todo lo concerniente cuentas de correo. • Monitoreo: para poder mantener un control de todos lo que respecta a los sitios de los clientes. 39 • Cerrar sesión: vuelve a la página principal del sitio. • Ancho de Banda 3.10.2 Contrato El administrador podrá finalizar o renovar un contrato. 3.10.2.1 Pantalla finalizar contrato Para dar por concluido un contrato se elige la opción Finalizar, y se presenta una pantalla con todos los dominios disponibles, seleccionamos el dominio que vayamos a dar por concluido el contrato. 40 Se mostrara una pantalla en la cual simplemente presionamos Finalizar. 3.10.2.2 Renovar contrato Para la renovación de un contrato elegimos la opción Renovar, se presentará una pantalla con todos los dominios que se encuentra alojados, seleccionamos el dominio al cual vamos a renovar el contrato. 41 Se mostrará una pantalla en la cual simplemente presionamos Renovar. 3.10.3 Ancho de banda En esta pantalla le vamos a poder modificar el ancho de banda a un determinado dominio. Solo debemos introducir el nuevo valor que le desee incrementar en valores enteros no debe ser escrito en números decimales. 42 3.10.4 Correo Presenta dos opciones las cuales son crear y dominios. 3.10.4.1 Crear Se muestran todos los dominios existentes, para lo cual seleccionamos el dominio donde vamos a crear cuentas de correo. 43 Se muestra la siguiente interfaz en la cual ingresamos el nombre de la cuenta de correo, la clave y la cuota de correo que se le asigna. 3.10.4.2 Dominio Muestra todos los dominios existentes 44 Se selecciona el dominio al cual se le va a ser las actualizaciones de la cuenta de correo, con sus respectivas opciones. 45 3.10.2.2.1 Deshabilitar En primera instancia se presenta la lista de todos los usuarios de las cuentas de correo perteneciente a dicho dominio, seleccionamos la cuenta que se quiere deshabilitar y presionamos la opción. 3.10.4.2.2 Habilitar De igual manera que en la opción anterior primero se muestra todos los usuario, y presionamos el nombre del 46 usuario al que vamos a habilitar y en la nueva pantalla elegimos la opción Habilitar. 3.10.42.2.3 Cambio de clave Elegimos al usuario y en nueva pantalla digitamos la clave anterior y posteriormente la nueva clave con su respectiva confirmación. 47 3.10.4.2.4 Cambio de cuota Continuando con los pasos anteriores elegimos el usuario al cual le vamos modificar su cuota de correo, en la pantalla que se nos presenta digitamos el nuevo valor de la cuota, el mismo que debe ser escrito en números enteros. 3.10.5 Listado Presenta todos los dominios que se encuentran alojado en el hosting. 48 3.10.6 Monitoreo Visualizar todo lo referente a nuestro sitio como es el uso del ancho de banda, espacio utilizado, etc. 3.11 MISION Presenta la Misión que tiene establecida la empresa. 3.12 VISION Presenta lo que la empresa quiere llegar a se. 49 3.13 AUTORES Muestra los integrantes del grupo del proyecto: Franklin Villao, Pedro Alvarado, Javier Bravo 50 3.14 Plan abierto Esta pantalla le permite al usuario poder elegir un plan de acuerdo a sus necesidades, el usuario podra elegir el tamaño de espacio para almacenar la pagina, el ancho de banda que requiera, y el espacio para la cuentas de correo. Pantalla de Pagos Pantalla de confirmación del pago . 51 CAPITULO 4 4. Codificación 4.1 Whois //permite buscar los dominios existentes en los servidores whois, en nuestro //caso se utiliza el predeterminado internic, si el dominio no es encontrado en el //servidor buscara en la base de datos. if (cont==1){ java.util.Hashtable pk=new java.util.Hashtable(); pk.put("estado", "A"); java.util.Vector dominios= com.prometeo.persistencia.Select.find( com.hostnine.host.beans.Dominio.class, "hos_dominio", pk, app); pageContext.setAttribute("dominios", dominios); for(i=0;i<dominios.size();i++){ com.hostnine.host.beans.Dominio dom=(com.hostnine.host.beans.Dominio) dominios.elementAt(i); if (dom.getNombre().compareTo(cadwhois)==0){ //System.err.println("esta en la base"); cont=0; break; } } } if (cont==1){ out.println("<response>OK</response>"); } else{ out.println("<response>ERROR</response>"); } pageContext.setAttribute("whois_response", cad); whois.disconnect(); } catch(java.io.IOException e) { System.err.println("Error I/O exception: " + e.getMessage()); return; } 52 4.2 Validar la clave de logon com.hostnine.seguridad.beans.Usuario u; u=(com.hostnine.seguridad.beans.Usuario)com.prometeo.persistencia .Select.byPrimaryKey( com.hostnine.seguridad.beans.Usuario.class, " SELECT * FROM seg_usuario "+ " WHERE id_usuario='"+txtUsuario+"'"+ " AND estado='A'", app); if(u==null || u.getIdUsuario()==null) { txtUsuario=null; session.setAttribute("error_login", "Usuario o Clave erronea"); } else if(u.getIdUsuario().equalsIgnoreCase(txtUsuario) && u.getClave()!=null && u.getClave().equals(txtClave)) { } else { txtUsuario=null; session.setAttribute("error_login", "Usuario o Clave erronea"); } if(txtUsuario!=null) { session.setAttribute("login_usuario", (""+txtUsuario).toUpperCase()); session.setAttribute("login_clave", txtClave); // buscar dominio com.hostnine.host.beans.Dominio d; d=(com.hostnine.host.beans.Dominio)com.prometeo.persistencia .Select.byPrimaryKey( com.hostnine.host.beans.Dominio.class, " select domi.* from hos_dominio domi, hos_contrato contra, hos_cliente clien"+ " where domi.id_contrato=contra.id_contrato"+ " and contra.id_cliente = clien.id_cliente"+ " AND clien.id_usuario='"+txtUsuario+"'"+ " AND clien.estado='A'"+ " AND domi.estado='A'"+ " AND contra.estado='A'", app); if(d!=null && d.getNombre()!=null) { session.setAttribute("login_dominio", d.getNombre()); 53 } } 4.3 Actualizar Base de Dato //Código para actualizar los datos y enviarlos a la base de datos, este se //encuentra en la página intermedia updatedata { String prometeo=request.getParameter("_PROMETEO_"); //System.out.println("prometeo:"+prometeo); String aLine=""; for(int i=0; i<=prometeo.length(); i++) { char cc='\n'; if(i<prometeo.length()) cc=prometeo.charAt(i); if(cc=='\n') { if(aLine.length()>0) { // actualizar objeto java.util.StringTokenizer java.util.StringTokenizer(aLine,","); int count=0; String[] args=new String[5]; while (st.hasMoreTokens() && count<5) { String text=st.nextToken(); args[count++]=text; } String object=args[0]; String scope=args[1]; String property=args[2]; String html=args[3]; String code=args[4]; st=new Object obj=null; if("session".equals(scope)) obj=session.getAttribute(object); else if("request".equals(scope)) obj=request.getAttribute(object); else if("application".equals(scope)) obj=application.getAttribute(object); System.out.println("inside:"+obj); if(obj!=null && property!=null) { String methodName=(""+property.charAt(0)).toUpperCase()+property.substring( 1); Class clazzObject=obj.getClass(); 54 java.lang.reflect.Method methodGet=clazzObject.getMethod("get"+methodName, new Class[0]); Class clazzValue=methodGet.getReturnType(); java.lang.reflect.Method methodSet=clazzObject.getMethod("set"+methodName, new Class[]{clazzValue}); String sValue=request.getParameter(html); Object value=null; if(clazzValue==java.lang.String.class) value=sValue; else if(clazzValue==java.lang.Long.class) value=Long.parseLong(sValue); else if(clazzValue==java.lang.Double.class) value=Double.parseDouble(sValue); else if(clazzValue==java.lang.Float.class) value=Float.parseFloat(sValue); else if(clazzValue==java.sql.Timestamp.class) { java.text.SimpleDateFormat sdf=new java.text.SimpleDateFormat("dd-MM-yyyy"); value=new java.sql.Timestamp(sdf.parse(sValue).getTime()); } methodSet.invoke(obj, new Object[]{value}); } } aLine=""; } else { aLine+=""+cc; } } } 4.4 Visualizar datos de paginas intermedia //Código para visualizar los datos, este se encuentra en la página intermedia //updateview { String method=(String)request.getAttribute("method"); java.util.Vector<java.util.Hashtable<String,String>> v=null; v=(java.util.Vector<java.util.Hashtable<String,String>>)request.getAttribu te("PROMETEO"); if(v==null) { v=new java.util.Vector<java.util.Hashtable<String,String>>(); 55 request.setAttribute("PROMETEO", v); } if("add".equals(method)) { java.util.Hashtable<String, String> view=new java.util.Hashtable<String,String>(); view.put("object", (String)request.getAttribute("object")); view.put("scope", (String)request.getAttribute("scope")); view.put("property", (String)request.getAttribute("property")); view.put("code", (String)request.getAttribute("code")); view.put("html", (String)request.getAttribute("html")); v.add(view); } else if("define".equals(method)) { // definir textarea, siempre dentro del form System.out.println("define ..."); String lines=""; for(int i=0; i<v.size();i++) { java.util.Hashtable<String,String> view=v.get(i); String aLine=""+ view.get("object")+ ","+view.get("scope")+ ","+view.get("property")+ ","+view.get("html")+ ","+view.get("code"); lines+="\n"+aLine; } out.println("<textarea name='_PROMETEO_' rows='5' cols='30' style='display:none'>"+lines+"</textarea>"); } else if("view".equals(method)) { // javascript para actualizar componentes input type=text ... } } 56 4.5 Insertar en la Base de Datos //Código para hacer inserciones a la base de datos, que se lo realiza con el método insert public class Insert { public Insert() { } public static void insert(Object object, String tableName, Aplicacion app) throws SQLException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { String sql = "INSERT INTO "+tableName; String sfields=""; String svalues=""; Class clazz=object.getClass(); Field[] fields=clazz.getDeclaredFields(); for (int i=0; i<fields.length; i++) { Class type=fields[i].getType(); if(type.getName().indexOf("com.")>=0 || type.getName().indexOf("java.util.")>=0) { continue; } String fieldName=fields[i].getName(); String columnName=""; for(int j=0; j<fieldName.length();j++) { char car=fieldName.charAt(j); if(car>='A' && car<='Z') columnName+="_"; columnName+=car; } columnName=columnName.toLowerCase(); if(columnName.equals("limitecuota")) continue; //if(sfields.indexOf(columnName+",")>=0) continue; Object value=null; fieldName=(""+fieldName.charAt(0)).toUpperCase()+ fieldName.substring(1); String methodName = "get"+fieldName; 57 Method m=null; try { m=clazz.getMethod(methodName, new Class[0]); } catch(Exception ex) { System.out.println(ex); } if(m==null) continue; value=m.invoke(object, new Object[0]); sfields+=","; svalues+=","; if(value==null) { sfields+=columnName; svalues+="null"; } else if(type==String.class) { sfields+=columnName; svalues+="'"+value+"'"; } else if(type==Double.class || type==Long.class) { sfields+=columnName; svalues+=value; } else if(type==Timestamp.class) { sfields+=columnName; java.text.SimpleDateFormat sdf=new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); svalues += "str_to_date('"+sdf.format(value)+"','%Y-%m-%d %T')"; } else { sfields+=columnName; svalues+="'"+value+"'"; } } if(sfields.length()>0) sfields=sfields.substring(1); if(svalues.length()>0) svalues=svalues.substring(1); sql += "("+sfields+") VALUES (" + svalues + ")"; 58 Connection c= app.getConnection(); java.sql.Statement st=c.createStatement(); st.execute(sql); st.close(); } 4.6 Seleccionar información de la Base de datos //Código para seleccionar información de la base de datos, que se lo realiza //con el método select public class Select { public Select() { } public static Object byPrimaryKey(Class clazz, String tableName, Hashtable<String, Object> cpk, Aplicacion app) throws SQLException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { Vector v=find(clazz, tableName, cpk, app); if(v.size()>0) return v.firstElement(); return clazz.newInstance(); } public static Vector find(Class clazz, String tableName, Hashtable<String, Object> cpk, Aplicacion app) throws SQLException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { return Select.find(clazz, tableName, cpk, null, app); } public static Vector find(Class clazz, String tableName, Hashtable<String, Object> cpk, String filtro, Aplicacion app) throws SQLException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { String sql = "SELECT * FROM "+tableName; String where=""; Enumeration<String> e=cpk.keys(); while (e.hasMoreElements()) { 59 String key=e.nextElement(); Object value=cpk.get(key); if(value instanceof String ) value="'"+value+"'"; where+= " AND "+ key+" = "+value; } if(where.length()>0) where = where.substring(" AND ".length()); if(where.length()>0) where = " WHERE "+where; if (filtro==null) filtro=""; sql += where+ " "+filtro; Connection c= app.getConnection(); java.sql.Statement st=c.createStatement(); java.sql.ResultSet rs=st.executeQuery(sql); Vector res=new Vector(); while(rs.next()) { Object o=clazz.newInstance(); for (int i = 1; i<=rs.getMetaData().getColumnCount(); i++) { Class[] pt = new Class[]{String.class}; int type=rs.getMetaData().getColumnType(i); Object value=null; if (type==Types.VARCHAR) value = rs.getString(i); else if(type==Types.INTEGER) value = rs.getLong(i); else if(type==Types.DOUBLE) value = rs.getDouble(i); else if(type==Types.TIMESTAMP) value = rs.getTimestamp(i); else value = rs.getString(i); if (type==Types.VARCHAR) pt[0]=String.class; else if(type==Types.INTEGER) pt[0]=Long.class; else if(type==Types.DOUBLE) pt[0]=Double.class; else if(type==Types.TIMESTAMP) pt[0]=Timestamp.class; else pt[0] = String.class; String columnName = rs.getMetaData().getColumnName(i); while (columnName.indexOf("_")>0) { columnName=columnName.substring(0, columnName.indexOf("_"))+ (""+columnName.substring(columnName.indexOf("_")+1).charAt(0)).toUp perCase()+ columnName.substring(columnName.indexOf("_")+2); } columnName=(""+columnName.charAt(0)).toUpperCase()+ columnName.substring(1); String methodName = "set"+columnName; Method m=clazz.getMethod(methodName, pt); 60 m.invoke(o, new Object[]{value}); } res.add(o); } rs.close(); st.close(); /* ResultSet rs=app.getConnection().getMetaData().getPrimaryKeys( app.getMeta().getCatalog(), app.getMeta().getSchema(), tableName); if(rs.next()) { } */ return res; } public static Object byPrimaryKey(Class clazz, String Query, Aplicacion app) throws SQLException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { Vector v=find(clazz, Query, app); if(v.size()>0) return v.firstElement(); return clazz.newInstance(); } public static Vector find(Class clazz, String Query, Aplicacion app) throws SQLException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { String sql = Query; System.out.println(sql); Connection c= app.getConnection(); java.sql.Statement st=c.createStatement(); java.sql.ResultSet rs=st.executeQuery(sql); Vector res=new Vector(); while(rs.next()) 61 { Object o=clazz.newInstance(); for (int i = 1; i<=rs.getMetaData().getColumnCount(); i++) { Class[] pt = new Class[]{String.class}; int type=rs.getMetaData().getColumnType(i); Object value=null; if (type==Types.VARCHAR) value = rs.getString(i); else if(type==Types.INTEGER) value = rs.getLong(i); else if(type==Types.DOUBLE) value = rs.getDouble(i); else if(type==Types.TIMESTAMP) value = rs.getTimestamp(i); else value = rs.getString(i); if (type==Types.VARCHAR) pt[0]=String.class; else if(type==Types.INTEGER) pt[0]=Long.class; else if(type==Types.DOUBLE) pt[0]=Double.class; else if(type==Types.TIMESTAMP) pt[0]=Timestamp.class; else pt[0] = String.class; String columnName = rs.getMetaData().getColumnName(i); while (columnName.indexOf("_")>0) { columnName=columnName.substring(0, columnName.indexOf("_"))+ (""+columnName.substring(columnName.indexOf("_")+1).charAt(0)).toUp perCase()+ columnName.substring(columnName.indexOf("_")+2); } columnName=(""+columnName.charAt(0)).toUpperCase()+ columnName.substring(1); String methodName = "set"+columnName; Method m=clazz.getMethod(methodName, pt); m.invoke(o, new Object[]{value}); } res.add(o); } rs.close(); st.close(); return res; } 62 4.7 Método Update //Código para realizar las actualizaciones, para la cúal se utiliza el método //Update public class Update { public Update() { } public static void save(Object object, String tableName, Hashtable<String, Object> cpk, Aplicacion app) throws SQLException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { Hashtable htCol=new Hashtable(); java.sql.ResultSet rsc=app.getConnection().getMetaData().getColumns("","",tableName,null ); while(rsc.next()) { htCol.put(rsc.getString(4), rsc.getString(4)); } String sql = "UPDATE "+tableName; String where=""; Enumeration<String> e=cpk.keys(); while (e.hasMoreElements()) { String key=e.nextElement(); Object value=cpk.get(key); if(value instanceof String ) value="'"+value+"'"; where+= " AND "+ key+" = "+value; } if(where.length()>0) where = where.substring(" AND ".length()); if(where.length()>0) where = " WHERE "+where; String set=""; Class clazz=object.getClass(); Field[] fields=clazz.getDeclaredFields(); for (int i=0; i<fields.length; i++) { Class type=fields[i].getType(); if(type.getName().indexOf("java")<0) continue; if(type.getName().indexOf("Vector")>0) continue; String fieldName=fields[i].getName(); 63 String columnName=""; for(int j=0; j<fieldName.length();j++) { char car=fieldName.charAt(j); if(car>='A' && car<='Z') columnName+="_"; columnName+=car; } columnName=columnName.toLowerCase(); if(htCol.get(columnName)==null) continue; Object value=null; fieldName=(""+fieldName.charAt(0)).toUpperCase()+ fieldName.substring(1); String methodName = "get"+fieldName; Method m=null; try { m=clazz.getMethod(methodName, new Class[0]); } catch (Exception ex) { System.out.println(ex); } if(m==null) continue; value=m.invoke(object, new Object[0]); set+=","; if(value==null) { set += columnName+"=null"; } else if(type==String.class) { set += columnName+"='"+value+"'"; } else if(type==Double.class || type==Long.class) { set += columnName+"="+value; } else if(type==Timestamp.class) { java.text.SimpleDateFormat sdf=new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); set += columnName+"=str_to_date('"+sdf.format(value)+"','%Y%m-%d %T')"; } else 64 { set += columnName+"='"+value.toString()+"'"; } } if(set.length()>0) set=set.substring(1); set=" SET "+set; sql += set + where; Connection c= app.getConnection(); java.sql.Statement st=c.createStatement(); st.execute(sql); st.close(); } public static void save(String sql, Aplicacion app) throws SQLException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { Connection c= app.getConnection(); java.sql.Statement st=c.createStatement(); st.execute(sql); st.close(); } } 4.8 MetaAplicación //El archivo de la MetaAplicación que es donde se controlan todas las conexiones. public class Update { public Update() { } public static void save(Object object, String tableName, Hashtable<String, Object> cpk, Aplicacion app) throws SQLException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { Hashtable htCol=new Hashtable(); 65 java.sql.ResultSet rsc=app.getConnection().getMetaData().getColumns("","",tableName,null ); while(rsc.next()) { htCol.put(rsc.getString(4), rsc.getString(4)); } String sql = "UPDATE "+tableName; String where=""; Enumeration<String> e=cpk.keys(); while (e.hasMoreElements()) { String key=e.nextElement(); Object value=cpk.get(key); if(value instanceof String ) value="'"+value+"'"; where+= " AND "+ key+" = "+value; } if(where.length()>0) where = where.substring(" AND ".length()); if(where.length()>0) where = " WHERE "+where; String set=""; Class clazz=object.getClass(); Field[] fields=clazz.getDeclaredFields(); for (int i=0; i<fields.length; i++) { Class type=fields[i].getType(); if(type.getName().indexOf("java")<0) continue; if(type.getName().indexOf("Vector")>0) continue; String fieldName=fields[i].getName(); String columnName=""; for(int j=0; j<fieldName.length();j++) { char car=fieldName.charAt(j); if(car>='A' && car<='Z') columnName+="_"; columnName+=car; } columnName=columnName.toLowerCase(); if(htCol.get(columnName)==null) continue; Object value=null; fieldName=(""+fieldName.charAt(0)).toUpperCase()+ fieldName.substring(1); String methodName = "get"+fieldName; Method m=null; 66 try { m=clazz.getMethod(methodName, new Class[0]); } catch (Exception ex) { System.out.println(ex); } if(m==null) continue; value=m.invoke(object, new Object[0]); set+=","; if(value==null) { set += columnName+"=null"; } else if(type==String.class) { set += columnName+"='"+value+"'"; } else if(type==Double.class || type==Long.class) { set += columnName+"="+value; } else if(type==Timestamp.class) { java.text.SimpleDateFormat sdf=new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); set += columnName+"=str_to_date('"+sdf.format(value)+"','%Y%m-%d %T')"; } else { set += columnName+"='"+value.toString()+"'"; } } if(set.length()>0) set=set.substring(1); set=" SET "+set; sql += set + where; Connection c= app.getConnection(); java.sql.Statement st=c.createStatement(); st.execute(sql); st.close(); } 67 public static void save(String sql, Aplicacion app) throws SQLException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { Connection c= app.getConnection(); java.sql.Statement st=c.createStatement(); st.execute(sql); st.close(); } } 4.9 Aplicación //El archivo aplicación, que es donde se encuentra el código para manejar //una sola conexión mientras se ejecuta la aplicación. public class Aplicacion { private Connection connection; private String idUsuarioSistema; private MetaAplicacion meta; public Aplicacion() { } public Connection getConnection() throws SQLException { if(connection==null || connection.isClosed()) { connection=meta.getConnection(); } return connection; } public String getIdUsuarioSistema() { return idUsuarioSistema; } public void setIdUsuarioSistema(String idUsuarioSistema) { this.idUsuarioSistema = idUsuarioSistema; } public MetaAplicacion getMeta() { return meta; } public void setMeta(MetaAplicacion meta) { this.meta = meta; } 68 public Long getSecuencia(String id_secuencia) throws SQLException { Long ultimo_valor=-1L; String sql="SELECT * FROM seg_secuencia "+ " WHERE id_secuencia='"+id_secuencia+"'"+ " FOR UPDATE "; Connection c=this.getConnection(); Statement st=c.createStatement(); ResultSet rs=st.executeQuery(sql); if(rs.next()) { ultimo_valor=rs.getLong("ultimo_valor"); Long incremento=rs.getLong("incremento"); ultimo_valor+=incremento; sql="UPDATE seg_secuencia SET ultimo_valor="+ultimo_valor+ " WHERE id_secuencia='"+id_secuencia+"'"; st.execute(sql); } else { ultimo_valor=-1L; } st.close(); this.commit(); return ultimo_valor; } public String commit() { String err=null; try { Connection c=this.getConnection(); c.commit(); } catch (Exception ex) { err=ex.toString(); ex.printStackTrace(); } return err; } public String rollback() { String err=null; try { 69 Connection c=this.getConnection(); c.rollback(); } catch (Exception ex) { err=ex.toString(); ex.printStackTrace(); } return err; } }