TOMO 2 - Repositorio CISC

Anuncio
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 [email protected]
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 [email protected]
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
[email protected]
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.
[email protected]
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;
}
}
Descargar