/** * Copyright (C) 2011 Adriano Monteiro Marques * * Author: Zubair Nabi <zn.zubairnabi@gmail.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package org.umit.icm.mobile.connectivity; import java.io.IOException; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.Calendar; import java.util.Iterator; import java.util.List; import org.umit.icm.mobile.aggregator.AggregatorRetrieve; import org.umit.icm.mobile.process.Constants; import org.umit.icm.mobile.process.Globals; import org.umit.icm.mobile.proto.MessageProtos.Event; import org.umit.icm.mobile.proto.MessageProtos.ICMReport; import org.umit.icm.mobile.proto.MessageProtos.Location; import org.umit.icm.mobile.proto.MessageProtos.SendServiceReport; import org.umit.icm.mobile.proto.MessageProtos.ServiceReport; import org.umit.icm.mobile.proto.MessageProtos.ServiceReportDetail; import org.umit.icm.mobile.proto.MessageProtos.Trace; import org.umit.icm.mobile.proto.MessageProtos.TraceRoute; import org.umit.icm.mobile.utils.SDCardReadWrite; import android.util.Log; /** * This is the ServiceConnectivity class which extends {@link AbstractConnectivity}. */ public class ServiceConnectivity extends AbstractConnectivity{ /** * scan method which overrides the {@link AbstractConnectivity#scan}. * Calls the scan method of each service. * @throws IOException * * */ @Override() public void scan() throws IOException { if(Constants.DEBUG_MODE) System.out.println("Inside Services scan() ---------------------------"); List<Class<? extends AbstractServiceTest>> servicesList = new ArrayList<Class<? extends AbstractServiceTest>>(); servicesList.add(ServiceHTTP.class); servicesList.add(ServiceHTTPS.class); servicesList.add(ServiceFTP.class); servicesList.add(ServicePOP3.class); servicesList.add(ServiceIMAP.class); servicesList.add(ServiceGtalk.class); servicesList.add(ServiceMSN.class); servicesList.add(ServiceSMTP.class); Iterator<Class<? extends AbstractServiceTest>> iterator = servicesList.iterator(); while(iterator.hasNext()) { connect(iterator.next()); } }; /** * Returns a {@link ServiceReport}. Uses the passed parameters to generate * {@link ICMReport}, {@link ServiceReportDetail} and * {@link ServiceReport} messages. * * @param service An object of the type {@link Service} * @param serviceContent An object of the type {@link String} * @param bytes An object of the type byte[] * pending list of checkTests to my hardcoded list. @return ServiceReport * @throws NoSuchAlgorithmException */ private ServiceReport clean(Service service, String serviceContent , byte[] bytes) { int statusCode = 0; if(serviceContent.equals("blocked")) statusCode = 1; if((bytes == null) && serviceContent.equals("blocked")) statusCode = 1; else if ((bytes != null) && serviceContent.equals("blocked")) statusCode = 1; ServiceReportDetail serviceReportDetail = ServiceReportDetail.newBuilder() .setServiceName(service.getName()) .setStatusCode(statusCode) .setPort(service.getPort()) .build(); String ip = "255.255.255.0"; Trace trace = Trace.newBuilder() .setHop(1) .setIp(ip) //TODO: fix .addPacketsTiming(1) .build(); TraceRoute traceRoute = TraceRoute.newBuilder() .setTarget(ip) //TODO: fix .setHops(1) .setPacketSize(1) .addTraces(trace) .build(); List<String> listNodes = new ArrayList<String>(); Calendar calendar = Calendar.getInstance(); listNodes.add(Globals.runtimeParameters.getAgentID()); long timeUTC = (calendar.getTimeInMillis()/1000); ICMReport icmReport = ICMReport.newBuilder() .setAgentID(Globals.runtimeParameters.getAgentID()) .setTestID(service.getTestID()) .setTimeZone(Calendar.ZONE_OFFSET) .setTimeUTC(timeUTC) .setTraceroute(traceRoute) .addAllPassedNode(listNodes) .build(); ServiceReport serviceReport = ServiceReport.newBuilder() .setReport(serviceReportDetail) .setHeader(icmReport) .build(); checkStatus(serviceReport); return serviceReport; } private void sendReport(Service service, String response, byte[] responseBytes) { try { ServiceReport serviceReport = (ServiceReport) clean(service, response, responseBytes); SDCardReadWrite.writeServiceReport(Constants.SERVICES_DIR, serviceReport); if(Constants.DEBUG_MODE) { Log.w("######Code", Integer.toString(serviceReport.getReport().getStatusCode())); Log.w("######name", serviceReport.getReport().getServiceName()); Log.w("######port", Integer.toString(service.getPort())); } SendServiceReport sendServiceReport = SendServiceReport.newBuilder() .setReport(serviceReport) .build(); if(Globals.aggregatorCommunication != false) { if(Constants.DEBUG_MODE) { System.out.println("Sending " + service.getName() + " SERVICE REPORT \n"); System.out.println("Sending Service Report : \n" + sendServiceReport.toString()); } AggregatorRetrieve.sendServiceReport(sendServiceReport); } } catch (Exception e) { e.printStackTrace(); } } private void connect(Class<? extends AbstractServiceTest> classObj) throws IOException { AbstractServiceTest service; try { service = classObj.newInstance(); String response = service.connect(); if(response != null) { byte[] serviceResponseBytes = null; Globals.tcpClientConnectivity.openConnection(service.getService().getIp(), service.getService().getPort()); Globals.tcpClientConnectivity.writeLine(ServicePackets.generatedRandomBytes(service.getServicePacket())); serviceResponseBytes = Globals.tcpClientConnectivity.readBytes(); if(Constants.DEBUG_MODE) { if(!serviceResponseBytes.equals(null)) Log.w("#####bytes", "bytes"); } Globals.tcpClientConnectivity.closeConnection(); sendReport(service.getService(), response, serviceResponseBytes); } } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private void checkStatus(ServiceReport serviceReport) { if(serviceReport.getReport().getStatusCode() == 1) { double lat = 0.0; double lon = 0.0; if(Globals.currentLocationGPS != null) { lat = Globals.currentLocationGPS.getLatitude(); lon = Globals.currentLocationGPS.getLongitude(); } else if(Globals.currentLocationNetwork != null) { lat = Globals.currentLocationNetwork.getLatitude(); lon = Globals.currentLocationNetwork.getLongitude(); } Location location = Location.newBuilder() .setLatitude(lat) .setLongitude(lon) .build(); Event event = Event.newBuilder() .setTestType("WEB") .setEventType("CENSOR") .setTimeUTC(serviceReport.getHeader().getTimeUTC()) .setSinceTimeUTC(serviceReport.getHeader().getTimeUTC()) .setServiceReport(serviceReport.getReport()) .addLocations(location) .build(); Globals.runtimeList.addEvent(event); } } }