Skip to content
Snippets Groups Projects
InstallHandler.java 5.39 KiB
Newer Older
  • Learn to ignore specific revisions
  • Alfredo Chissotti's avatar
    Alfredo Chissotti committed
    package code;
    
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
    import java.io.IOException;
    
    A C's avatar
    A C committed
    import java.sql.SQLException;
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
    import java.util.ArrayList;
    import java.util.HashMap;
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
    import javax.net.ssl.HttpsURLConnection;
    
    
    A C's avatar
    A C committed
    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
    
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
    import com.sun.net.httpserver.HttpExchange;
    import com.sun.net.httpserver.HttpHandler;
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
    import com.sun.net.httpserver.HttpsExchange;
    
    import java.net.HttpURLConnection;
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
    
    import db.DBC;
    import db.Dominio;
    
    A C's avatar
    A C committed
    public class InstallHandler implements HttpHandler {
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
    
    	@Override
    
    A C's avatar
    A C committed
    	public void handle(HttpExchange hex) throws IOException {
    		HttpsExchange he = (HttpsExchange) hex;
    
    A C's avatar
    A C committed
    
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
    		String requestMethod = he.getRequestMethod();
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    		// System.out.println(requestMethod);
    
    A C's avatar
    A C committed
    
    
    		if (requestMethod.compareToIgnoreCase("options") == 0) {
    
    			Helper.sendCors(he, 200);
    
    		if (requestMethod.compareToIgnoreCase("POST") != 0) {
    			Helper.sendCors(he, 405);
    			return;
    		}
    		String body = Helper.readBody(he.getRequestBody());
    
    A C's avatar
    A C committed
    		// verifica user
    		String user = Helper.checkTokenGetUser(he);
    		if (user == null) {
    
    			Helper.sendCors(he, 401);
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
    			return;
    
    A C's avatar
    A C committed
    		}
    
    		JSONObject j = null;
    		try {
    			j = new JSONObject(body);
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    
    
    			String dm = j.getString("domain");
    			Dominio d = DBC.getDom(dm);
    			if (d != null) {
    				Helper.sendCors(he, 403);
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
    				return;
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
    			}
    
    A C's avatar
    A C committed
    
    
    		} catch (JSONException | SQLException e) {
    			e.printStackTrace();
    			return;
    		}
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
    
    
    		// inserisco i dati nel DB
    		try {
    			// qui leggo e parsifico i json nel body, inserisco tutti i campi nel db
    
    			String domain = j.getString("domain");
    			DBC.insertDom(domain);
    			// questa chiamata serve ad assicurarsi che l'utente che ha effettuato la
    			// chiamata sia anche amministratore del dominio
    			JSONArray arrUsers = j.getJSONArray("users");
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
    			DBC.insertAmministra(user, domain);
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    			int k = 0;
    			boolean didUserSetHimself = false;
    			while (k < arrUsers.length()) {
    				JSONObject userObj = arrUsers.getJSONObject(k);
    				k++;
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
    				if (user.equals(usr)) {//se l'utente e' colui che ha fatto la chiamata, l'ho gia' sistemato => passo al successivo
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    					didUserSetHimself = true;
    
    					if(!userObj.getString("role").equals("A")){//the user didn't set himself as an admin, we have to correct that
    						arrUsers.put(k-1, userObj.put("role","A"));//new JSONObject().put("user", usr).put("role", "A").put("passwd", userObj.getString("passwd")));
    					}
    
    				if (userObj.getString("role").equals("A")) {
    					DBC.insertAmministra(usr, domain);
    				} else if (userObj.getString("role").equals("U")) {
    					DBC.insertUsa(usr, domain);
    				} else
    					System.err.println(userObj.toString());
    
    A C's avatar
    A C committed
    			}
    
    			if(!didUserSetHimself){//l'utente non si e' settato lui stesso come amministratore, lo faccio io
    				arrUsers.put(new JSONObject().put("user", user).put("role", "A").put("passwd", user));
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    				j.put("users", arrUsers);
    			}
    
    			JSONArray arrServ = j.getJSONArray("services");// array con solo il nome dei servizi da installare
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    			// System.out.println("arrServ = "+arrServ);
    
    			ArrayList<String> moduleHosts = new ArrayList<String>();
    			for (int i = 0; i < arrServ.length(); i++) {
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    				String modul = arrServ.getString(i).replace("gpio","bbgpio").replace("arduino","AinDout_Arduino1wifi");
    
    				moduleHosts.addAll(DBC.insertService(domain, modul));
    			}
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    			// System.out.println("riga 105 moduleHost = " + moduleHosts);
    
    			// divido gli host in base al loro module
    			HashMap<String, ArrayList<String>> hostsMap = new HashMap<String, ArrayList<String>>();
    			for (String mh : moduleHosts) {
    				String[] mhSplit = mh.split("---");
    				String module = mhSplit[0];
    				String host = mhSplit[1];
    				ArrayList<String> hostsList;
    				if (hostsMap.containsKey(module)) {
    					hostsList = hostsMap.get(module);
    				} else {
    					hostsList = new ArrayList<String>();
    					hostsMap.put(module, hostsList);
    				}
    				hostsList.add(host);
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    				// System.out.println("riga 120  modulo = "+ module + "  host = "+ host);
    
    			}
    			// imposta correttamente l'array dei servizi
    			JSONArray arrServiziFinale = new JSONArray();
    			for (int i = 0; i < arrServ.length(); i++) {
    				JSONObject row = new JSONObject();
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    				String mod = arrServ.getString(i).replace("gpio","bbgpio").replace("arduino","AinDout_Arduino1wifi");
    
    				// System.out.println("mod = "+mod + "     indice = "+i);
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    				// System.out.println("      riga 131 ho = "+ho);
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
    					row.put("host", h.replace("BB1","luci"));
    					row.put("service", mod);
    
    					row.put("uri", DBC.getURI(mod));
    					arrServiziFinale.put(row);
    				}
    			}
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    			// System.out.println("riga 137 arrServiziFinale = "+arrServiziFinale);
    
    A C's avatar
    A C committed
    
    
    		} catch (SQLException | JSONException e) {
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
    			e.printStackTrace();
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    		} catch ( Exception e2) {
    			e2.printStackTrace();
    
    Alfredo Chissotti's avatar
    Alfredo Chissotti committed
    		}
    
    		// ora bisogna fare la chiamata al CloudApp, non prima!
    		// effettuo chiamata a CloudAppManager
    
    		// è una chiamata annidata nella risposta alla webapp
    		// -richiesta REST da webApp a /install
    		// -prendo da DB e poi chiamo CloudAppMng su /install
    		// -attendo risposta da CloudAppMng e chiudo
    		// -rispondo a webApp e chiudo
    		// EZ
    
    
    		HttpURLConnection con = Helper.sendMessageToCloudapp("install", j.toString());
    
    Elisa Giglio's avatar
    Elisa Giglio committed
    		
    
    		// String cloudappResponse = Helper.getResponseFromConnection(con);
    
    		con.disconnect();
    
    		// finita chiamata a CloudApp
    		Helper.sendCors(he, status);