Sunteți pe pagina 1din 45

Proyecto Integrador Sistema de Alerta de Estado de Servidores

Profesor: De La Cruz Berrospi, Javier

Integrantes: Mateo Caja, Emmanuel Alejandro Rodas Centeno, Jerson David Rubios Delgado, Oscar

Grupo: C6 - 5 - B 2011 I

Tabla de Contenido
Tabla de Contenido .................................................................................................................... 2 1. 2. 3. 4. 5. Introduccin: ...................................................................................................................... 4 Objetivo General:................................................................................................................ 4 Objetivos Especficos: ......................................................................................................... 4 Descripcin del Proyecto .................................................................................................... 5 MODELADO DE NEGOCIO ................................................................................................... 6 Diagrama de casos de uso del negocio (CUN) ........................................................................ 6 Diagrama de clases del negocio ............................................................................................. 6 Reglas de negocio ................................................................................................................... 6 Requerimientos Funcionales .................................................................................................. 7 Requerimientos No Funcionales ............................................................................................ 7 Diagrama de casos de uso de sistema (CUS) .......................................................................... 7 Especificacin de CUS ............................................................................................................. 7 Modelo de dominio ................................................................................................................ 8 Diagrama de clases de anlisis ............................................................................................... 9 Diagrama de secuencia de diseo ........................................................................................ 10 Modelo de datos .................................................................................................................. 13 6. Descripcin de Software a utilizar .................................................................................... 13 Eclipse ................................................................................................................................... 13 Android SDK: ........................................................................................................................ 13 7. Funcionamiento ................................................................................................................ 15 Diagrama de Flujo ................................................................................................................ 15 8. Descripcin de las Clases .................................................................................................. 17 Booteo.java .......................................................................................................................... 17 NotifyService: ....................................................................................................................... 18 Monitor.java ......................................................................................................................... 22 ServerInt.java ....................................................................................................................... 26 Settings.java ......................................................................................................................... 29 Registrar.java ........................................................................................................................ 30 2|Pgina

IpValidator.java .................................................................................................................... 31 Error1.java ............................................................................................................................ 32 Servicios.java ........................................................................................................................ 32 Result_1_1.java .................................................................................................................... 34 Commit_db.java ................................................................................................................... 35 Result_1.java ........................................................................................................................ 38 9. 10. Connectbot ....................................................................................................................... 39 Gestin .......................................................................................................................... 42

Criterio del VAN.................................................................................................................... 43 Criterio del TIR ...................................................................................................................... 43 ROI (Retorno de la inversin) ............................................................................................... 44 BENEFICIO COSTO ................................................................................................................ 44 11. Bibliografa .................................................................................................................... 45

3|Pgina

1. Introduccin:
En la actualidad el uso de servidores para la administracin de informacin y servicios ha crecido en gran manera, pero tambin han crecido las fallas que estos tienen. A pesar que (en la gran mayora de veces) es fcil diagnosticar las fallas y solucionarlas, aun es imposible predecir cundo sucedern. Es de vital importancia solucionar los problemas que se presenten lo ms rpido posible para no estancar la produccin, por lo que el presente proyecto trata de acortar el tiempo entre la falla y la reaccin del administrador del servidor con un sistema de alerta. Objetivos

2. Objetivo General:
Desarrollar una aplicacin que sea capaz de ayudar en gran manera en la administracin de servidores alertando sobre el estado de los mismos. Asimismo, para cumplir los requisitos laborales de la actualidad, la aplicacin debe de cumplir con todas las normas relacionadas a esta, como lo son ITIL y Code Conventions for the Java Programming Language, estndar de programacin en lenguaje Java.

3. Objetivos Especficos:
Desarrollar una aplicacin con el lenguaje de programacin java que funcione en celulares con la plataforma Android que permita mejorar la Administracin remota de servidores alertando sobre cambios en el estado de los mismos. Seguir la metodologa ITIL para la solucin eficaz de problemas que se puedan presentar en el manejo de la aplicacin. Cabe resaltar que el desarrollo de esta aplicacin es una accin preventiva fundamentada por la metodologa ITIL. Cumplir con las normas de programacin Code Conventions for the Java Programming Language que consisten en normas para regulan la forma como se nombra las clases, paquetes y objetos en la programacin JAVA. Esto para que no sea tan complicado encontrar rpidamente segmentos del cdigo que requieran de un reajuste.

4|Pgina

4. Descripcin del Proyecto


En el presente proyecto se implementara sobre Android un sistema que permita informar a los administradores de red va WiFi el estado de los servidores propuestos. Se implementar una aplicacin el cual ser instalada en cada servidor y cuando alguno de ellos se apague, o su respectivo servicio se vea interrumpido, deber informar a los administradores de dicha cada. Descripcin de la solucin La aplicacin ser implementada tanto en los servidores como en los celulares con Android. La comunicacin entre ambos ser mediante sockets, por el cual pueden intercambiar cualquier flujo de datos, generalmente de manera fiable y ordenada. La aplicacin instalada en el servidor (a la cual llamaremos Servidor) mantendr una comunicacin constante con la aplicacin en el celular con Android, a esta aplicacin la llamaremos Cliente). Esta comunicacin constante significa que el servidor est funcionando, al igual que los servicios que tiene. La aplicacin Cliente es la encargada de generar las respuestas en caso surgiera algn problema. La aplicacin Servidor es la encargada de permitir que haya una comunicacin con el Cliente sin que un firewall corte la comunicacin. Una vez que la seal (comunicacin ente las aplicaciones cliente-servidor) se corta, la aplicacin Cliente analiza si se cay un servicio o el servidor en s y a continuacin la misma aplicacin genera la alerta. En caso el servidor siga cado, la aplicacin cliente seguir tratando de entablar la comunicacin con el servidor. Una vez que el servidor o servicio sea levantado, la aplicacin Cliente reconocer esto e inmediatamente cambiara el estatus del servidor.

5|Pgina

5. MODELADO DE NEGOCIO
Diagrama de casos de uso del negocio (CUN)

Diagrama de clases del negocio

Reglas de negocio
Todos los servidores a monitoreara deben de estar registrados en la base de datos del equipo mvil, tambin a cada servidor se le registrar los servicios que queremos monitorear con la aplicacin. Cuando se tenga un nuevo servidor y este quiere ser monitoreado, este ser registrado en la base de datos del equipo mvil. El sistema permite eliminar registros de los servidores que ya no queramos monitorear. Para el registro de los servidores, se le dar un nombre y tambin se ingresar la direccin IP correspondiente.

6|Pgina

Desde el equipo mvil se debe permitir realizar una conexin SSH para poder gestionar los servicios que tenga el servidor.

Requerimientos Funcionales
RF01: Desarrollado para equipos mviles con sistema android. RF02: Soportar registrar y eliminacin de registros de servidores en la base de datos de la aplicacin. RF03: Ser configurado para realizar notificaciones al Administrador cuando ocurra un fallo con los servicios de los servidores. RF04: La aplicacin permite a los administradores ingresar por conexin SSH, ingresando con una cuenta de usuario y una contrasea al sistema. RF05: La aplicacin gestionar los servicios de los servidores a monitorear. RF06: La aplicacin permite configurar el tiempo de monitoreo de los servicios.

Requerimientos No Funcionales
RNF01: Las ventanas de la aplicacin debe tener iconos que permita un fcil entendimiento de lo sucede en el monitoreo, estos iconos tambin deben permitir registrar los servidores con sus respectivos servicios de una manera rpida. RNF02: Soportar monitoreo de varios servidores en simultaneo.

Diagrama de casos de uso de sistema (CUS)

Especificacin de CUS
Caso de uso: Actor: Gestin de Servidores Administrador 7|Pgina

Propsito: Caso de uso asociado: Resumen: Clasificacin: Requerimientos: Caso de uso: Actor: Propsito: Caso de uso asociado: Resumen:

Gestionar la servidores con sus respectivas direcciones IP Gestin de servicios El caso consiste en registrar o eliminar servidores a monitorear con la aplicacin. Primario RF02 Gestin de servicios Administrador Gestionar un grupo de servicios Gestin de Servidores El caso consiste en registrar los servicios a monitorear, indicando el nombre del servicio con su respectivo puerto a monitorear. Primario RF05 Configuracin del tiempo de monitoreo Administrador Configurar en la aplicacin el tiempo de monitoreo Gestin de servidores, Gestin de servicios El Administrador tiene la capacidad de configurar la frecuencia de monitoreo Primario RF06

Clasificacin: Requerimientos: Caso de uso: Actor: Propsito: Caso de uso asociado: Resumen: Clasificacin: Requerimientos:

Modelo de dominio

8|Pgina

Diagrama de clases de anlisis

Ilustracin: Diagrama de clase de anlisis de gestin de servidores

Ilustracin: Diagrama de clase de anlisis de gestin de servicios

Ilustracin: Diagrama de clase de anlisis de gestin de servicios con terminal SSH

9|Pgina

Diagrama de secuencia de diseo

Ilustracin. Diagrama de secuencia de diseo de gestin de servidores

10 | P g i n a

Ilustracin. Diagrama de secuencia de diseo de gestin de servicios

Ilustracin. Diagrama de secuencia de diseo de configuracin de tiempo de monitoreo

Modelo de datos

6. Descripcin de Software a utilizar


Eclipse
Eclipse es un entorno de desarrollo integrado de cdigo abierto multiplataforma para desarrollar lo que el proyecto llama "Aplicaciones de Cliente Enriquecido". Esta plataforma, tpicamente ha sido usada para desarrollar entornos de desarrollo integrados (del ingls IDE), como el IDE de Java llamado Java Development Toolkit (JDT) y el compilador (ECJ) que se entrega como parte de Eclipse (y que son usados tambin para desarrollar el mismo Eclipse). Sin embargo, tambin se puede usar para otros tipos de aplicaciones cliente, como BitTorrent o Azureus. Eclipse es tambin una comunidad de usuarios, extendiendo constantemente las reas de aplicacin cubiertas. Un ejemplo es el recientemente creado Eclipse Modeling Project, cubriendo casi todas las reas de Model Driven Engineering. Eclipse fue desarrollado originalmente por IBM como el sucesor de su familia de herramientas para VisualAge. Eclipse es ahora desarrollado por la Fundacin Eclipse, una organizacin independiente sin nimo de lucro que fomenta una comunidad de cdigo abierto y un conjunto de productos complementarios, capacidades y servicios.

Android SDK:
El kit de desarrollo de software o SDK (siglas en ingls de software development kit) es generalmente un conjunto de herramientas de desarrollo que le permite a un programador crear aplicaciones para un sistema concreto, en este caso, para Android. Es algo tan sencillo como una interfaz de programacin de aplicaciones o API (del ingls application programing interface) creada para permitir el uso de cierto lenguaje de programacin, o puede, tambin, incluir hardware sofisticado para comunicarse 13 | P g i n a

con un determinado sistema embebido. Las herramientas ms comunes incluyen soporte para la deteccin de errores de programacin como un entorno de desarrollo integrado o IDE (del ingls Integrated Development Environment) y otras utilidades. Los SDK frecuentemente incluyen, tambin, cdigos de ejemplo y notas tcnicas de soporte u otra documentacin de soporte para ayudar a clarificar ciertos puntos del material de referencia primario. Java: Java es un lenguaje de programacin orientado a objetos, desarrollado por Sun Microsystems a principios de los aos 90. El lenguaje en s mismo toma mucha de su sintaxis de C y C++, pero tiene un modelo de objetos ms simple y elimina herramientas de bajo nivel, que suelen inducir a muchos errores, como la manipulacin directa de punteros o memoria. Las aplicaciones Java estn tpicamente compiladas en un bytecode, aunque la compilacin en cdigo mquina nativo tambin es posible. En el tiempo de ejecucin, el bytecode es normalmente interpretado o compilado a cdigo nativo para la ejecucin, aunque la ejecucin directa por hardware del bytecode por un procesador Java tambin es posible. Cdigo Android Las aplicaciones para Android se escriben en lenguaje Java, pero tambin se cuenta con la ayuda de archivos xml para disear la interface grafica de la aplicacin. La implementacin en el presente proyecto se est realizando en el IDE Eclipse Helios con la ayuda del emulador de aplicaciones Android. Una vez que se ha terminado de programar se compila todos los archivos .java y .xml en un solo archivo con extensin .apk, el cual puede ser instalado en cualquier dispositivo con la plataforma Android.

14 | P g i n a

7. Funcionamiento
Diagrama de Flujo

15 | P g i n a

Explicacin del funcionamiento del proceso en background de la aplicacin: 1) Booteo: Es un Broadcastreceiver que emite una seal llamada intento al servicio cuando el dispositivo mvil termina de bootear para que comience a funcionar. 2) NotifyService: Es el servicio de la aplicacin. Lo que hace es leer el contenido de la tabla setconf para conocer la frecuencia con la que va a consultar a los servidores. Despues lee constantemente (dentro de los hilos) las ips y puertos de la tabla servers para establecer sockets. Si se pueden establecer los sockets, el servicio escribe que el estado es Online en la columna ll ama status. Si no se puede establecer el socket, escribe Offline. Explicacin del funcionamiento de las interfaces grficas: 1) Monitor: Es la interfaz o actividad principal. Lo que hace es leer cada cinco segundos el contenido de la tabla servers para mostrar al usuario el estado de los diversos servidores. Cuando se hace click o se presiona uno de los servidores de la lista, se inicia la actividad ServerInt. 2) ServerInt: Es una actividad con una funcin similar a Monitor, pues muestra en una lista los diversos servicios del servidor que se quiere ver con mayor detalle. 3) Settings: Es la actividad mediante la cual se modifica la frecuencia de consultas a los servidores. 4) Registrar: Es la actividad mediante la cual se inicia el proceso de registro de un servidor y sus servicios. En esta actividad se ingresan el nombre de la aplicacin y la ip. La ip es validada por la clase java IpValidator. 5) IpValidator: Es una clase que est enteramente dedicada validar la ip que es ingresada en la actividad Registrar. Si es un ip vlida retorna true, de lo contrario retorna false. 6) Error1: Es una actividad que se acciona solo si la ip no es vlida. Regresa a Registrar. 7) Servicios: Actividad en la que se ingresa el nombre del servicio del servidor y el puerto en el que corre. Adems registra todos los datos en la tabla temporal cache. 8) Result_1_1: Es una clase que te da la opcin de ingresar un nuevo servicio si se desea o continuar con el proceso de registro. 9) Commit_db: Clase que muestra al usuario todo lo ingresado en el proceso de registro. Si no le gusta lo que ingres, puede retroceder hasta la ventana de registro o guardar los cambios. Al hacer esto vaca el contenido de la tabla cache a la tabla servers. 10) Result_1: Presenta la pregunta al usuario de si le gustara agregar otro servidor, ya sea si termino satisfactoriamente con un registro como si cancel el proceso. 16 | P g i n a

Por ltimo, a travs del men de la actividad Monitor, se puede acceder a la interfaz terminal, que es la aplicacin connectbot pero modificada (ya que es cdigo libre) para que sea parte de nuestra aplicacin.

8. Descripcin de las Clases


Booteo.java
Esta clase sirve como una especie de gatillo que sirve para activar el servicio de consultas cuando el celular o dispositivo mvil est booteando. Es semejante a un script en lenguaje Shell o bash para ejecutar tareas programadas en Windows o Linux, con la diferencia de que forma parte de la aplicacin.
public class Booteo extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { Log.d("plop", "bien x mi"); ComponentName comp = new ComponentName(context.getPackageName(), NotifyService.class.getName()); ComponentName service = context.startService(new Intent() .setComponent(comp)); if (null == service) { Log.d("plop", "estas pia " + comp.toString()); } } else { Log.d("plop", reciviste otra cosa!!! " + intent.toString()); } } }

Para que el cdigo funcione apropiadamente se tiene que poner el permiso: android.permission.RECEIVE_BOOT_COMPLETED que le indica al sistema operativo que la aplicacin tiene permiso de ejecutar algo (en este caso el servicio) cuando termine de bootear.

17 | P g i n a

NotifyService:
Es un servicio que corre en background todo el tiempo mientras el celular est prendido. Hace las consultas mediante sockets a los servidores para saber si estn operativos y escribe los resultados en la tabla servers. En la Ilustracin 1 se puede apreciar el funcionamiento.

Ilustracin 1: Funcionamiento de Hilos

A continuacin una explicacin de los mtodos bsicos que tiene:


@Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); intent = new Intent(BROADCAST_ACTION); startdb(); } @Override public void onStart(Intent intent, int startId) { nm = (NotificationManager) getSystemService( NOTIFICATION_SERVICE); showNotification(); handler.removeCallbacks(sendUpdatesToUI); handler.postDelayed(sendUpdatesToUI, 1000); }

IBinder indica que el servicio recibe informacin de otras actividades (en este caso del booteo). El mtodo onCreate se ejecuta al crear el servicio en memoria. Ejecuta el mtodo startdb.

18 | P g i n a

El mtodo onStart se ejecuta al iniciar el servicio y se mantiene corriendo hasta que se apague el celular. En este mtodo se ejecuta el mtodo sendUpdatesToUI cada un segundo mediante un handler. Esto permite que se maneje el procesamiento mediante hilos en un proceso separado y no cuelgue la aplicacin. Antes de ejecutar se remueve la cola del handler (en caso haya quedado algo en memoria).
@Override public void onDestroy() { super.onDestroy(); handler.removeCallbacks(sendUpdatesToUI); nm.cancel(R.string.service_started); }

onDestroy indica las medidas que se toman cuando es servicio es destruido (porque se para o se apaga el dispositivo mvil). Se remueve la cola del handler y se cancela las notificaciones.

El mtodo startdb se encarga de abrir la base de datos, crear las tablas si no existen y vaciar la tabla que sirve como cach.
public void startdb() { DB = openOrCreateDatabase(APP_DATABASE_NAME, MODE_PRIVATE, null); DB.execSQL("CREATE TABLE IF NOT EXISTS " + DATA_TABLE+ " (name VARCHAR, ip VARCHAR, s_name VARCHAR, port INT(1), status VARCHAR);"); DB.execSQL("CREATE TABLE IF NOT EXISTS " + CACHE_TABLE + " (name VARCHAR, ip VARCHAR, s_name VARCHAR, port INT(1), status VARCHAR);"); DB.delete(CACHE_TABLE, null, null); }

Al iniciar el servicio, se extrae de la tabla setconf la frecuencia de consultas. Para poder realizar esto, se declara una variable INTEGER pblica llamada getTime con la que los hilos podrn ejecutarse cada cierto tiempo.
public int getTime() { try { DB.execSQL("CREATE TABLE IF NOT EXISTS " + SET_TABLE + " (time INT(3));"); Cursor c = DB.rawQuery("SELECT * FROM setconf;", null); int timeColumn = c.getColumnIndex("time"); if (c != null) {

19 | P g i n a

if (c.moveToFirst()) { int i = 0; do { i++; int time = c.getInt(timeColumn); Time = time; } while (c.moveToNext()); } } c.close(); } catch (SQLiteException se) { Log.e(getClass().getSimpleName(), "Could not create or Open the database"); } finally { } return Time; }

Posteriormente se declara un runnable que es el encargado de ejecutar los hilos mientras a la vez cada 60 segundos si es que la variable getTime est vaca (ver arriba) o el tiempo que haya elegido el usuario.
private Runnable sendUpdatesToUI = new Runnable() { public void run() { BackgroundThread bThread = new BackgroundThread(); bThread.start(); int freq = getTime(); if (freq > 0) { handler.postDelayed(this, freq * 1000); Log.d("freq", "time: " + freq + " seconds"); } else { handler.postDelayed(this, 60000); Log.d("plop", "time: 60 seconds"); } } };

BackgroundThread es el hilo del servicio. Lo que hace es leer la columna ip y puerto de la tabla servers y con esos datos trata de establecer un socket. Si la conexin resulta exitosa, el socket se cierra y se procede a escribir en la tabla servers que el estado es Online, de lo contrario escribe Offline y muestra una notificacin.
public class BackgroundThread extends Thread { @Override public void run() {

20 | P g i n a

Cursor d = DB.rawQuery("SELECT ip, port" + " FROM " + DATA_TABLE + ";", null); int hostColumn = d.getColumnIndex("ip"); int portColumn = d.getColumnIndex("port"); if (d != null) { if (d.moveToFirst()) { int i = 0; do { i++; String host = d.getString(hostColumn); int port = d.getInt(portColumn); try { Socket cliente = new Socket(host, port); if (cliente != null) { a = "Online"; DB.execSQL("UPDATE " + DATA_TABLE + " SET status='" + a + "' WHERE ip ='" + host + "' AND port ='" + port + "';"); Log.d("check", a + " " + host + " " + port); cliente.close(); } } catch (Exception e) { a = "Offline"; DB.execSQL("UPDATE " + DATA_TABLE + " SET status='" + a + "' WHERE ip ='" + host + "' AND port ='" + port + "';"); Log.d("check", a + " " + host + " " + port); showbadNoti(); } } while (d.moveToNext()); } } d.close(); } }

El mtodo showNotification se encarga de desplegar una notificacin al inicio del servicio. Si se hace un click sobre la notificacin inmediatamente lanza la actividad Monitor.java.
private void showNotification() { CharSequence text = getText(R.string.service_started); // declarar icono, texto a mostrar y fecha-hora Notification notification = new Notification(R.drawable.server, text,

21 | P g i n a

System.currentTimeMillis()); // Actividad que se lanza cuando se hace click a la notificacion PendingIntent contentIntent = PendingIntent. getActivity(this, 0, new Intent(this, Monitor.class), 0); // Informacion de la notificacion notification.setLatestEventInfo(this, getText(R.string.service_label), text, contentIntent); // Enviar Notificacion nm.notify(R.string.service_started, notification); }

El mtodo showbadNoti se encarga de desplegar una notificacin cuando el servicio detecta un servicio que no puede ser contactado. Si se hace un click sobre la notificacin inmediatamente lanza la actividad Monitor.java.
private void showbadNoti() { CharSequence text = getText(R.string.bad); // declarar icono, texto a mostrar y fecha-hora Notification notification = new Notification(R.drawable.icon_error, text, System.currentTimeMillis()); // Actividad que se lanza cuando se hace click a la notificacion PendingIntent contentIntent = PendingIntent. getActivity(this, 0, new Intent(this, Monitor.class), 0); // Informacion de la notificacion notification.setLatestEventInfo(this, getText(R.string.service_label2), text, contentIntent); // Enviar Notificacion nm.notify(R.string.service_started, notification); vib = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); vib.vibrate(500); }

Monitor.java
Es la actividad principal ya que a partir de ella se pueden accionar todas la dems actividades.

Es un ListActivity o actividad de tipo lista, por lo que no se necesita hacer un diseo grfico especial, solo se programa la lgica y que es lo que se va a mostrar en la lista. 22 | P g i n a

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); startService(new Intent(this, NotifyService.class)); handler.removeCallbacks(refresh); handler.postDelayed(refresh, 1000); }

Cuando se crea ejecuta un handler para que por medio de l se ejecute el mtodo refresh cada segundo.
private Runnable refresh = new Runnable() { public void run() { updateUI(); handler.postDelayed(this, 5000); // 5 seconds } };

Refresh es un runnable que ejecuta al mtodo updateUI cada cinco segundos en background para que no se cuelgue la interfaz grfica. El mtodo updateUI puebla la interfaz grfica con los datos que extrae de la tabla servers.
public void updateUI() { ArrayAdapter<String> plop = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, results); plop.clear(); try { DB = openOrCreateDatabase(APP_DATABASE_NAME, MODE_PRIVATE, null); Cursor f = DB.rawQuery("SELECT DISTINCT name," + " (SELECT DISTINCT MIN(status) FROM servers WHERE name = T.name) AS 'stat'" + " FROM servers AS 'T';", null); int nameColumn = f.getColumnIndex("name"); int statColumn = f.getColumnIndex("stat"); if (f != null) { if (f.moveToFirst()) { int i = 0; do { i++; String name = f.getString(nameColumn); String status = f.getString(statColumn); results.add(name + " >>> " + status); } while (f.moveToNext());

23 | P g i n a

} this.setListAdapter(plop); } f.close(); } catch (SQLiteException se) { Log.e(getClass().getSimpleName(), "Could not create or Open the database"); } finally { } } @Override public void onDestroy() { super.onDestroy(); handler.removeCallbacks(refresh); }

La actividad tambin presenta un men que aparece al hacer click en el botn men del celular.
@Override public boolean onCreateOptionsMenu(Menu menu) { menu.add(0, 1, 0, "Servidores"); menu.add(0, 2, 0, "Limpiar Lista"); menu.add(0, 3, 0, "Configurar"); menu.add(0, 4, 0, "Terminal"); return true; }

La lgica del men es la siguiente:


@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case 1: startActivity(new Intent(Monitor.this, Registrar.class)); return true; case 2: try { DB.delete(DATA_TABLE, null, null); } catch (SQLiteException se) { Log.e(getClass().getSimpleName(),

24 | P g i n a

"Could not create or Open the database"); } finally { } return true; case 3: startActivity(new Intent(Monitor.this, Settings.class)); return true; case 4: startActivity(new Intent(Monitor.this, org.connectbot.HostListActivity.class)); return true; } return false; }

Al presionar el cuarto botn (limpiar lista), se procede a borrar todos los registros de la tabla servers. Al hacer presionar los items que aparecen en la pantalla se inicia la actividad ServerInt.java con las especificaciones de dicho servidor.
@Override protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); Object o = this.getListAdapter().getItem(position); String keyword = o.toString(); Intent intent = new Intent(); intent.setClass(this, ServerInt.class); intent.putExtra("SERVER", keyword); startActivity(intent); }

25 | P g i n a

ServerInt.java
Es la actividad que recoge la informacin que es enviada por la actividad Monitor.java al momento en que se presiona sobre uno de los tems de la lista. El mtodo update es similar a lo que hace la actividad Monitor.java ya que extrae de la tabla server los servicios de cada servidor y muestra sus respectivos estados.
public void update() { Bundle bundle = getIntent().getExtras(); String nombre_serv = bundle.getString("SERVER"); int x = nombre_serv.indexOf(' '); String result = nombre_serv.substring(0, x); ListView lv = (ListView) findViewById(R.id.ppp); ArrayAdapter<String> plop = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, results); plop.clear(); try { DB = openOrCreateDatabase(APP_DATABASE_NAME, MODE_PRIVATE, null); Cursor c = DB.rawQuery("SELECT * FROM " + DATA_TABLE + " WHERE name = '" + result + "';", null); int snameColumn = c.getColumnIndex("s_name"); int portColumn = c.getColumnIndex("port"); int statColumn = c.getColumnIndex("status"); if (c != null) { if (c.moveToFirst()) { int i = 0; do { i++; String sname = c.getString(snameColumn); String port = c.getString(portColumn); String estatus = c.getString(statColumn); results.add(sname + " > " + port + " >>> " + estatus); } while (c.moveToNext()); } lv.setAdapter(plop); } } catch (SQLiteException se) { Log.e(getClass().getSimpleName(),

26 | P g i n a

"Could not create or Open the database"); } finally { } }

Tiene un runnable para que la interfaz grfica no se cuelgue.


private Runnable refresh = new Runnable() { public void run() { updateName(); update(); handler.postDelayed(this, 5000); // 5 seconds } };

El mtodo updateName muestra en la interfaz grfica el nombre del servidor, la ip y el promedio de los estados de sus servicios. Si todos los servicio estn prendidos, el promedio sera Online, pero si uno o ms de los servicios estn apagados, muestra Offline.
public void updateName() { TextView server_name = (TextView) findViewById(R.id. serv); TextView server_status = (TextView) findViewById(R.id. sta); TextView server_ip = (TextView) findViewById(R.id.showip); Bundle bundle = getIntent().getExtras(); String nombre_serv = bundle.getString("SERVER"); int x = nombre_serv.indexOf(' '); String result = nombre_serv.substring(0, x); server_name.setText(result); try { DB = openOrCreateDatabase(APP_DATABASE_NAME, MODE_PRIVATE, null); Cursor c = DB.rawQuery( "SELECT DISTINCT MIN(status) AS 'stat', (SELECT ip FROM servers WHERE name = '" + result + "') AS 'ipp' FROM servers WHERE name = '" + result + "';", null); int statColumn = c.getColumnIndex("stat"); int ippColumn = c.getColumnIndex("ipp"); if (c != null) { if (c.moveToFirst()) { int i = 0; do {

27 | P g i n a

i++; String estatus = c.getString(statColumn); String ippe = c.getString(ippColumn); server_status.setText(estatus); server_ip.setText(ippe); } while (c.moveToNext()); } } } catch (SQLiteException se) { Log.e(getClass().getSimpleName() + "1", "Could not create or Open the database"); } finally { DB.close(); } }

A diferencia de Monitor.java, ServerInt.java tambin tiene botones, uno que le permite borrar la informacin del servidor, y otro que le permite regresar a Monitor.java.
public void borrar(View botton) { Bundle bundle = getIntent().getExtras(); String nombre_serv = bundle.getString("SERVER"); int x = nombre_serv.indexOf(' '); String result = nombre_serv.substring(0, x); DB = openOrCreateDatabase(APP_DATABASE_NAME, MODE_PRIVATE, null); DB.execSQL("DELETE FROM " + DATA_TABLE + " WHERE name = '" + result + "';"); startActivity(new Intent(ServerInt.this, Monitor.class)); } public void regre(View botton) { startActivity(new Intent(ServerInt.this, Monitor.class)); }

28 | P g i n a

Settings.java
Es la actividad mediante la cual se configura la frecuencia de refresco de los servidores.
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.settings); stopService(new Intent(this, NotifyService.class)); getTime(); }

El mtodo getTime muestra el tiempo de refresco actual.


public void getTime() { TextView server = (TextView) findViewById(R.id. texto); try { DB = openOrCreateDatabase(APP_DATABASE_NAME, MODE_PRIVATE, null); Cursor c = DB.rawQuery("SELECT * FROM setconf;", null); int timeColumn = c.getColumnIndex("time"); if (c != null) { if (c.moveToFirst()) { int i = 0; do { i++; int time = c.getInt(timeColumn); server.setText("La frecuencia de refresco actual es de: " + time); } while (c.moveToNext()); } } } catch (SQLiteException se) { Log.e(getClass().getSimpleName(), "Could not create or Open the database"); } finally { } }

29 | P g i n a

El mtodo CheckClick2 se acciona cuando se presiona el botn de check. Hace que se guarde el nmero ingresado por el usuario.
public void onCheckClick2(View botton) { AutoCompleteTextView IP = (AutoCompleteTextView) findViewById(R.id.Nombo); String ip = IP.getText().toString(); try { DB = openOrCreateDatabase(APP_DATABASE_NAME, MODE_PRIVATE, null); DB.execSQL("CREATE TABLE IF NOT EXISTS " + SET_TABLE + " (time INT(3));"); DB.delete(SET_TABLE, null, null); DB.execSQL("INSERT INTO " + SET_TABLE + " (time)" + " VALUES ('" + ip + "');"); Log.d("plopo", " " + ip); } catch (SQLiteException se) { Log.e(getClass().getSimpleName(), "Could not create or Open the database"); } finally { this.finish(); startActivity(new Intent(Settings.this, Monitor.class)); } }

El mtodo onCancelClick2 se acciona cuando se presiona el botn con una x, esto hace que se acabe la actividad y se inicie Monitor.java.
public void onCancelClick2(View botton) { startActivity(new Intent(Settings.this, Monitor.class)); }

Registrar.java
Esta actividad es el inicio del proceso de registro de un servidor y sus servicios. Cuando se inicia la actividad, se detiene el servicio para que no haya problemas al escribir en la base de datos.
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.registrar); stopService(new Intent(this, NotifyService.class)); }

30 | P g i n a

El botn agregar servicio permite leer lo que hay en las casillas de Nombre e IP y enviar el contenido de IP a la clase IpValidator.java para verificar si la ip ingresada es vlida. Despus enva los datos ingresados mediante un intento a la siguiente actividad.
public void add(View botton){ AutoCompleteTextView Nombre = (AutoCompleteTextView) findViewById(R.id.Nomb); AutoCompleteTextView IP = (AutoCompleteTextView) findViewById(R.id. IP); String ip = IP.getText().toString(); IpValidator verif = new IpValidator(); boolean v = verif.validate(ip); if(v == true){ Intent intent = new Intent(); intent.setClass(this, Servicios.class); intent.putExtra("Nombre", Nombre.getText().toString()); intent.putExtra("IP", IP.getText().toString()); Log.d("enviado",ip); startActivity(intent); }else{ startActivity(new Intent(Registrar.this, Error1.class)); this.finish(); } }

El botn cancelar termina la presente actividad e inicia Monitor.java.


public void cancelar(View botton) { startActivity(new Intent(Registrar.this, Monitor.class)); }

IpValidator.java
Es una clase java que no tiene nada de lgica Android. Su nica funcin es validar la ip ingresada en la actividad registrar mediante un patrn de caracteres.
private static final String IPADDRESS_PATTERN = "^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." + "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." + "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." + "([01]?\\d\\d?|2[0-4]\\d|25[0-5])$"; public IpValidator() { pattern = Pattern.compile(IPADDRESS_PATTERN); } public boolean validate(final String ip) { matcher = pattern.matcher(ip);

31 | P g i n a

return matcher.matches(); }

Error1.java
Actividad que se inicia si es que la validacin de la ip en la actividad Registrar fue errnea.

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.error1); } public void regresar(View botton) { startActivity(new Intent(Error1.this, Registrar.class)); this.finish();

La lgica de la actividad establece que se muestre la plantilla grfica de la actividad y declara un botn que ejecuta el mtodo regresar, el cual termina la actividad y da inicio nuevamente a Registrar.java.

Servicios.java
En esta actividad se ingresan los nombres y puertos de los diversos servicios. Solo se puede llegar a esta actividad si los datos ingresados en la actividad registrar fueron correctos. Cuando se acciona el botn de check, se ejecuta el mtodo ok que lee lo ingresado en las casillas y junto con los datos ingresados en Registrar.java son registrados en la tabla cache, la cual es temporal. Ms adelante se explicar por qu. Termina la presente actividad y se inicia la actividad Result_1_1.java mediante un intento con los valores ingresados en la tabla cache.
public void ok(View botton) { Bundle bundle = getIntent().getExtras(); String Name = bundle.getString("Nombre");

32 | P g i n a

String IP = bundle.getString("IP"); AutoCompleteTextView Nombre = (AutoCompleteTextView) findViewById(R.id.nom); AutoCompleteTextView Puerto = (AutoCompleteTextView) findViewById(R.id.PORT); String nombre = Nombre.getText().toString(); String puerto = Puerto.getText().toString(); insertData(Name, IP, nombre, puerto); Intent intent = new Intent(); intent.setClass(this, Result_1_1.class); intent.putExtra("name", Name); intent.putExtra("s_name", nombre); intent.putExtra("IP", IP); startActivity(intent); } Cuando se cancela, se enva en un intento la palabra cancelar a la actividad Result_1_1.java. public void onCancelClick(View botton) { Intent intent = new Intent(); intent.setClass(this, Result_1_1.class); intent.putExtra("Cancelar", "Cancelar"); startActivity(intent); }

El mtodo insertData es convocado por el botn ok para insertar los datos en la tabla cache. public void insertData(String Nomb, String IP, String S_Name, String Puerto) { Log.d("res", Puerto); try { DB = openOrCreateDatabase(APP_DATABASE_NAME, MODE_PRIVATE, null); DB.execSQL("CREATE TABLE IF NOT EXISTS " + CACHE_TABLE + " (name VARCHAR, ip VARCHAR, s_name VARCHAR, port INT(1), status VARCHAR);"); DB.execSQL("INSERT INTO " + CACHE_TABLE + " (name, ip, s_name, port, status)" + " VALUES ('" + Nomb + "', '" + IP + "', '" + S_Name + "', '" + Puerto + "', 'Online');"); Log.d("guardado", Nomb + " " + IP + " " + S_Name + " " + Puerto); } catch (SQLiteException se) { Log.e(getClass().getSimpleName(),"Could not create or Open the database"); } finally { if (DB != null) { DB.close(); } }}

33 | P g i n a

Result_1_1.java
Muestra los resultados de las operaciones realizadas en la actividad Servicios.java. Si la actividad anterior mand un intento con la palabra cancelar, la actividad mostrar un mensaje de cancelacin, mientras que si manda los datos del servidor, mostrar un mensaje que se puede ver en la figura de abajo. Toda esta lgica se encuentra en el mtodo onCreate.

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.result_1); TextView resultText = (TextView) findViewById(R.id. resultText1); Bundle bundle = getIntent().getExtras(); if (bundle.getString("Cancelar") != null) { resultText.setText("Operacin cancelada" + "\n " + " \n " + (getString(R.string.pregunta1_1))); } else { String Name = bundle.getString("name"); String S_Name = bundle.getString("s_name"); String ip = bundle.getString("IP"); resultText .setText(getString(R.string.resultOK1) + " Servicio " + S_Name + " agregado al servidor " + Name + " (" + ip + ") " + "\n " + " \n " + (getString(R.string.pregunta1_1))); } } El mtodo retro se ejecuta cuando se desea ingresar ms servicios en la actividad Servicio.java. public void retro(View botton) { Bundle bundle = getIntent().getExtras(); String Name = bundle.getString("name"); String S_Name = bundle.getString("IP");

34 | P g i n a

Intent intent = new Intent(); intent.setClass(this, Servicios.class); intent.putExtra("Nombre", Name); intent.putExtra("IP", S_Name); startActivity(intent); } El mtodo salir se ejecuta cuando no se desea agregar ms servicios public void salir(View botton) { startActivity(new Intent(Result_1_1.this, Commit_db.class)); this.finish(); }

Commit_db.java
El mtodo onCreate es parecido a Monitor.java y la lista de ServerInt.java, ya que tambin llena una lista mediante una lectura de registros de la tabla cache, la cual fue llenada en la actividad Servicio.java.
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.commit); setdisplay(); ListView lv = (ListView) findViewById(R.id.listview); try { DB = openOrCreateDatabase(APP_DATABASE_NAME, MODE_PRIVATE, null); Cursor c = DB.rawQuery("SELECT * FROM " + CACHE_TABLE + ";", null); int nameColumn = c.getColumnIndex("s_name"); int statColumn = c.getColumnIndex("port"); if (c != null) { if (c.moveToFirst()) { int i = 0; do {

35 | P g i n a

i++; String name = c.getString(nameColumn); String status = c.getString(statColumn); results.add(name + " >>> " + status); } while (c.moveToNext()); } lv.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, results)); } } catch (SQLiteException se) { Log.e(getClass().getSimpleName(), "Could not create or Open the database"); } finally { DB.close(); } } El mtodo setdisplay extrae los datos del nombre e ip de la tabla cache public void setdisplay() { try { DB = openOrCreateDatabase(APP_DATABASE_NAME, MODE_PRIVATE, null); Cursor c = DB.rawQuery("SELECT DISTINCT name, ip FROM " + CACHE_TABLE + ";", null); int nameColumn = c.getColumnIndex("name"); int ipColumn = c.getColumnIndex("ip"); if (c != null) { if (c.moveToFirst()) { int i = 0; do { i++; String name = c.getString(nameColumn); String ip = c.getString(ipColumn); TextView resultText = (TextView) findViewById(R.id.nombretext); resultText.setText("Nombre: " + name + " . IP: " + ip); } while (c.moveToNext()); } } } catch (SQLiteException se) {

36 | P g i n a

Log.e(getClass().getSimpleName(), "Could not create or Open the database"); } finally { DB.close(); } } Lgica del botn guardar. Lo que hace es vaciar todo el contenido de la tabla cache a la tabla servers. Comienza la actividad Monitor.java. public void guardar(View botton) { try { DB = openOrCreateDatabase(APP_DATABASE_NAME, MODE_PRIVATE, null); DB.execSQL("CREATE TABLE IF NOT EXISTS " + CACHE_TABLE + " (name VARCHAR, ip VARCHAR, s_name VARCHAR, port INT(1), status VARCHAR);"); DB.execSQL("CREATE TABLE IF NOT EXISTS " + DATA_TABLE + " (name VARCHAR, ip VARCHAR, s_name VARCHAR, port INT(1), status VARCHAR);"); DB.execSQL("INSERT INTO servers (name, ip, s_name, port, status) SELECT name, ip, s_name, port, status FROM cache"); DB.delete(CACHE_TABLE, null, null); } catch (SQLiteException se) { Log.e(getClass().getSimpleName(), "Could not create or Open the database"); } finally { if (DB != null) { DB.close(); } } startActivity(new Intent(Commit_db.this, Monitor.class)); } El botn cancelar tambin hace que se borre la tabla cache, pero comienza la actividad Result_1.java con el valor cancelar. public void cancelar(View botton) { try { DB = openOrCreateDatabase(APP_DATABASE_NAME, MODE_PRIVATE, null); DB.delete(CACHE_TABLE, null, null); } catch (SQLiteException se) { Log.e(getClass().getSimpleName(), "Could not create or Open the database"); } finally { if (DB != null) {

37 | P g i n a

DB.close(); } } Intent intent = new Intent(); intent.setClass(this, Result_1.class); intent.putExtra("Cancelar", "Cancelar"); startActivity(intent); }

Result_1.java
Al igual que Result_1_1.java, la lgica que tiene nos permite elegir si es que queremos gregar un servidor ms despus de haber seguido todos los pasos de registro. @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.result_1); TextView resultText = (TextView) findViewById(R.id. resultText1); Bundle bundle = getIntent().getExtras(); if (bundle.getString("Cancelar") != null) { resultText.setText("Operacin cancelada" + "\n " + " \n " + (getString(R.string.pregunta1))); } else { resultText.setText(getString(R.string.resultOK1) + "Servidor Agregado" + "\n " + " \n " + (getString(R.string.pregunta1))); } } Tiene dos botones, s y no. Si inicia la actividad registrar y No, Monitor. public void retro(View botton) { startActivity(new Intent(Result_1.this, Registrar.class)); this.finish(); } public void salir(View botton) { startService(new Intent(this, NotifyService.class)); startActivity(new Intent(Result_1.this, Monitor.class)); this.finish(); }

38 | P g i n a

9. Connectbot
Connect Bot es un cliente de ssh / telnet fcil de usar que permite conectarse a equipos remotos. Herramienta casi imprescindible para un webmaster. Es rpido y no presenta problemas. Guarda el listado (editable, se pueden remover elementos) de equipos a los cuales se conecto (o intento conectar) generando una lista de atajos para tener rpido acceso. La consola que abre es color y soporta utf-8 permitiendo utilizar aplicaciones con sintaxis resaltada o el clsico "mc" (Midnight Commander). Soporta la utilizacin de llaves de ssh (el segundo video de youtube explica como usarlas) y el direccionamiento de puertos en forma esttica o dinmica utilizando socks. USO: 1) Se escoge primero porque medio nos vamos a conectar,(SSH, Telnet, Local), para este ejemplo nos conectaremos va SSH

39 | P g i n a

2) Enseguida colocamos el usuario y la IP del servidor al cual queremos conectarnos. Ejm:

3) Acto seguido el Connectbot intentar conectarse con el servidor, si los datos han sido ingresado correctamente tendremos xito. Pero antes nos preguntar si queremos conectarnos, le damos s.

40 | P g i n a

4) Luego nos pedir la clave para ingresar al servidor cuya IP es 192.168.1.100, entonces colocamos la clave.

5) Si todo sali bien entonces ya estaremos en el servidor.

41 | P g i n a

10.
INGRESOS

Gestin
2011 2012 2013 2014 2015

Ventas de Licencias Software Prestamos de Servicios Asterisk Consultora y Asesora

2100,00 150000,00 75000,00

2190,00 160000,00 45000,00

2000,00 140232,00 65000,00

1684,00 150201,00 55500,00

880,00 150100,00 60000,00

TOTAL INGRESOS

227100,00

207190,00

207232,00

207385,00

210980,00

GASTOS Ventas GASTOS Administracin GASTOS Financieros Costo Variables Costo Fijos

42000,00 63000,00 105000,00 2100,00 5210,00

38400,00 63400,00 101800,00 2000,00 210,00

36000,00 66200,00 102200,00 1950,00 210,00

36000,00 66200,00 102200,00 2020,00 210,00

36000,00 66300,00 102300,00 1950,00 210,00

TOTAL EGRESOS

217310,00

205810,00

206560,00

206630,00

206760,00

FLUJO ANUAL FLUJO ACUMULADO

9790,00 9790,00

1380,00 11170,00

672,00 11842,00

755,00 12597,00

4220,00 16817,00

Como podemos notar la Caja de Flujo proyectada para los prximos 5 aos, es favorable, por lo que las ganancias generadas por el desarrollo del aplicativo representan un ingreso mas para la empresa.

42 | P g i n a

Criterio del VAN


En donde el VAN se calcul de la siguiente manera:

VAN=2581.32

Periodo Flujo de fondos Inversin-2011 -8170 2011 9790 2012 1380 2013 672 2014 755 2015 4220

Tasa utilizada TIR VAN

25,00% 48,42% S/2.581,32

Criterio del TIR


Donde TIR= r

Periodo de recuperacin El periodo de recuperacin lo calculamos con una regla de tres


X% 100 % ---------> -----------> 8170 9790

x=10081709790=83.45%

43 | P g i n a

y das 180

---------> ----------->

83,45% 100%

y=83,45180100=150,21 das La inversin realizada para el desarrollo del proyecto se lograr recuperar en 5 meses

ROI (Retorno de la inversin)


El retorno de inversin es un indicador econmico que ROI=(sumatoria de los ingresos sumatoria de los egresos)/(inversin)=2.05

BENEFICIO COSTO

El valor de beneficio costo se logra calculando la sumatoria de todos los ingresos anuales divido entre la sumatoria de los egresos anuales B.C=227100+207190+207232+207385+210980217310+205810+206560+20 6630+206760 B.C=1.0163

44 | P g i n a

11.

Bibliografa

http://developer.android.com/ Pgina web de Android, documentacin completa. http://www.stackoverflow.com/ Pgina web de ayuda para lenguajes de programacin.
http://mobile.tutsplus.com/tutorials/android/java-tutorial/

Pgina web de ayuda para lenguajes de programacin en dispositivos mviles.


http://android-er.blogspot.com

Pgina web de ayuda para Android. http://www.coderanch.com/ Pgina web de ayuda para lenguajes de programacin. http://www.anddev.org/ Pgina web de ayuda para Android. http://download.oracle.com/javase/tutorial/ Pgina web de ayuda para lenguajes de programacin Java . http://android-coding.blogspot.com/ Pgina web de ayuda para Android. http://mindtherobot.com/ Pgina web de ayuda para Android. http://www.w3schools.com/ Pgina web de ayuda para lenguajes de programacin.

45 | P g i n a

S-ar putea să vă placă și