package jfqemu;
/**
* Created : Apr 21, 2012
*
* @author pquiring
*/
import java.io.*;
import java.util.*;
import javaforce.*;
import javaforce.jbus.*;
public class Server {
public static void main(String args[]) {
new Server().start();
}
private JBusClient jbusClient;
private Vector<String> vmsFile = new Vector<String>();
private Vector<VM> vms = new Vector<VM>();
private String configFile = "/etc/jfqemu.lst";
private void start() {
JFLog.init("/var/log/jfqemu.log", true);
loadConfig();
jbusClient = new JBusClient("org.jflinux.service.jfqemu", new JBusMethods());
jbusClient.start();
}
private void loadConfig() {
try {
File config = new File(configFile);
if (!config.exists()) return;
FileInputStream fis = new FileInputStream(config);
String lst = new String(JF.readAll(fis));
fis.close();
String lns[] = lst.split("\n");
for(int a=0;a<lns.length;a++) {
File vmxml = new File(lns[a]);
String vmxmlfn = vmxml.getAbsolutePath();
if (!vmxml.exists()) continue; //exists?
if (vmsFile.contains(vmxmlfn)) continue; //dup file
if (!loadVM(vmxmlfn)) continue; //dup service ID
vmsFile.add(vmxmlfn);
_startVM(vmxmlfn);
}
} catch (Exception e) {
JFLog.log(e);
}
}
private boolean loadVM(String vmxml) {
try {
XML xml = new XML();
FileInputStream fis = new FileInputStream(vmxml);
xml.read(fis);
fis.close();
VM vm = new VM();
xml.writeClass(vm);
for(int a=0;a<vms.size();a++) {
if (vms.get(a).serviceID == vm.serviceID) return false; //dup serviceID
}
vms.add(vm);
return true;
} catch (Exception e) {
JFLog.log(e);
return false;
}
}
private void saveConfig() {
try {
StringBuilder sb = new StringBuilder();
for(int a=0;a<vmsFile.size();a++) {
sb.append(vmsFile.get(a));
sb.append("\n");
}
FileOutputStream fos = new FileOutputStream(configFile);
fos.write(sb.toString().getBytes());
fos.close();
} catch (Exception e) {
JFLog.log(e);
}
}
public void _startVM(String file) {
//refresh VM
_removeVM(file);
if (!_addVM(file)) return; //dup?
try {
XML xml = new XML();
FileInputStream fis = new FileInputStream(file);
xml.read(fis);
fis.close();
VM vm = new VM();
xml.writeClass(vm);
if (vm.serviceID == -1) throw new Exception("vm is not configured as a service:" + file);
String cmd[] = vm.getCMD(true);
Runtime.getRuntime().exec(cmd);
} catch (Exception e) {
JFLog.log(e);
}
}
public void _removeVM(String file) {
if (!vmsFile.contains(file)) return;
vmsFile.remove(file);
saveConfig();
}
public boolean _addVM(String file) {
if (vmsFile.contains(file)) return false; //dup file
if (!loadVM(file)) return false; //dup serviceID
vmsFile.add(file);
saveConfig();
return true;
}
public class JBusMethods {
//stanard service methods
public void stop() {
System.exit(0);
}
public void status(String pack) {
jbusClient.call(pack, "serviceStatus", "\"jQEMU running:" + JF.getPID() + "\"");
}
public void addVM(String file) {_addVM(file);}
public void removeVM(String file) {_removeVM(file);}
public void startVM(String file) {_startVM(file);}
}
}