package backupclient.commons;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.ParseException;
import java.util.*;
import java.util.Random;
public class Machine {
public final String id;
private Version current_agent_version;
private Version current_updater_version;
public final Version selected_updater_version;
public final Version selected_agent_version;
public final boolean auto_update;
public final String server_ip;
public final String api_user;
public final String api_token;
public String agent_folder;
public String local_temp_folder;
public final String os_system;
public final String mysql_dump;
public final String downloads_client;
public final Boolean force_action;
public final Boolean run_install;
public long session;
public final Log log;
public final APIHandler apiHandler;
public Machine(Map<String, String> settings) throws ParseException {
this.server_ip = settings.get("server_ip");
this.id = settings.get("id");
this.api_user = settings.get("api_user");
this.api_token = settings.get("api_token");
this.os_system = settings.get("os_system");
this.downloads_client = settings.get("downloads_client");
this.mysql_dump = settings.get("mysql_dump");
this.agent_folder = settings.get("agent_folder");
this.local_temp_folder = settings.get("local_temp_folder");
this.session = (System.currentTimeMillis() / 1000) + new Random().nextInt(150);
apiHandler = new APIHandler(this.server_ip + "/api/", api_user, api_token);
if(! this.local_temp_folder.endsWith(System.getProperty("file.separator"))) {
this.local_temp_folder += System.getProperty("file.separator");
}
File f_temp = new File(this.local_temp_folder);
f_temp.mkdirs();
if(! this.agent_folder.endsWith(System.getProperty("file.separator"))) {
this.agent_folder += System.getProperty("file.separator");
}
File f_agent = new File(this.agent_folder);
f_agent.mkdirs();
this.force_action = settings.get("force_action").equals("1");
this.log = new Log(apiHandler, this.id);
List<JSONObject> obj = apiHandler.get_api_data("machines/"+this.id);
JSONObject data = (JSONObject)obj.get(0).get("machine");
this.current_agent_version = Version.buildFromJson((JSONObject) data.get("current_agent_version"), this); //(String) ((JSONObject) data.get("current_agent_version")).get("name");
this.selected_agent_version = Version.buildFromJson((JSONObject) data.get("selected_agent_version"), this);
this.current_updater_version = Version.buildFromJson((JSONObject) data.get("current_updater_version"), this);
this.selected_updater_version = Version.buildFromJson((JSONObject) data.get("selected_updater_version"), this);
this.auto_update = (Boolean) data.get("auto_update");
this.run_install = (Boolean) data.get("run_install");
this.set_machine_external_ip(this.getExternalIP());
//log_info("Current agent version: FocusBackup " + current_agent_version);
//log_info("Current updater version: FocusBackup " + current_updater_version);
//log_info("Current external ip: " + this.getExternalIP());
}
public boolean isBusy() {
List<JSONObject> obj = apiHandler.get_api_data("machines/"+this.id);
JSONObject data = (JSONObject)obj.get(0).get("machine");
return (Boolean) data.get("is_busy");
}
public String getExternalIP() {
String ipAddress ="";
try {
URL whatismyip = new URL(server_ip+"/api/ip");
BufferedReader in = new BufferedReader(new InputStreamReader(whatismyip.openStream()));
ipAddress = in.readLine();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return ipAddress;
}
public static Machine buildFromSettings(String settingsLocation) {
Map<String, String> settings = new HashMap<String, String>();
JSONParser parser = new JSONParser();
try {
Object obj = parser.parse(new FileReader(settingsLocation));
JSONObject jsonObject = (JSONObject) obj;
settings.put("id", (String) jsonObject.get("id"));
settings.put("server_ip", (String) jsonObject.get("server_ip"));
settings.put("api_user", (String) jsonObject.get("api_user"));
settings.put("api_token", (String) jsonObject.get("api_token"));
settings.put("force_action", (String) jsonObject.get("force_action"));
settings.put("local_temp_folder", (String) jsonObject.get("local_temp_folder"));
settings.put("mysql_dump", (String) jsonObject.get("mysql_dump"));
settings.put("agent_folder", (String) jsonObject.get("agent_folder"));
} catch (Exception e) {
e.printStackTrace();
}
try {
return new Machine(settings);
} catch (ParseException e) {
e.printStackTrace(); // TODO use a real local logger, like util.Logger
return null; // TODO dont return null here, throw it
}
}
public Version get_current_agent_version() {
return current_agent_version;
}
public Version get_current_updater_version() {
return current_updater_version;
}
public void set_machine_external_ip(String ipAddress) {
final String agent_url = "machines/" + id + "/set_machine_external_ip/" + ipAddress;
apiHandler.get_api_data(agent_url);
}
public boolean changesBusyStatus(boolean busy) {
String b = (busy ? "1" : "0");
final String agent_url = "machines/" + id + "/set_busy_updating/" + b + "/session/" + this.session + "/";
List<JSONObject> s = apiHandler.get_api_data(agent_url);
return (Boolean) s.get(0).get("changed_status");
}
public void set_current_agent_version(Version current_agent_version) {
this.current_agent_version = current_agent_version;
final String agent_url = "machines/" + id + "/set_agent_version/" + current_agent_version.id;
apiHandler.get_api_data(agent_url);
}
public void set_current_updater_version(Version current_updater_version) {
this.current_updater_version = current_updater_version;
final String updater_url = "machines/" + id + "/set_updater_version/" + current_updater_version.id;
apiHandler.get_api_data(updater_url);
}
public void log_info(String text) {
this.log.log_info(session + ": "+text);
}
public void log_error(String text) {
this.log.log_error(session + ": "+text);
}
public void log_warning(String text) {
this.log.log_warning(session + ": "+text);
}
public String get_local_temp_folder() {
return local_temp_folder;
}
public String get_agent_folder() {
return agent_folder;
}
}