java webservice sdk virtualbox控制

	private static Logger log = Logger.getLogger(VBoxControlUtil.class);
	private IMachine machine;
	private VirtualBoxManager vbm;
	private ISession session;
	private String vboxName;

	public VBoxControlUtil(String vmname) {
		log.info("begin connect :"+ vmname);
		vboxName = vmname;
		vbm = VirtualBoxManager.createInstance(null);
		vbm.connect(SystemContent.VBOX_URL,"","");
		IVirtualBox vbox = vbm.getVBox();
		machine = vbox.findMachine(vmname);
		session = vbm.getSessionObject();
		log.info("conect sucess : " + vmname);
	}

	public synchronized void disconnect(VirtualBoxManager manager) {
		try {
			manager.disconnect();
		} catch (VBoxException e) {
		}
	}

	public synchronized boolean isConnected(VirtualBoxManager manager) {
		try {
			manager.getVBox().getVersion();
			return true;
		} catch (VBoxException e) {
			return false;
		}
	}

	@SuppressWarnings({ "unchecked", "rawtypes" })
	public synchronized long startVm() {
		if (null == machine) {
			log.error("Cannot find machine name is : " + vboxName);
			return -1;
		}
		MachineState state = machine.getState();
		if (MachineState.Running == state || MachineState.PoweredOff == state) {
			long rs = stopVm();
			if(rs == -1){
				return -1;
			}
		}
		IProgress progress;
		String env = "";
		long result = 0;
		try {
			progress = machine.launchVMProcess(session, "gui", env);
			if (!waitProgressCompletion(progress)) {
				log.warn("Cannot run Vbox!");
				return -1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			log.error(" start virtualbox is error : " + e.getMessage());
			return -1;
		}
		// 运行进程
		IConsole iCon = session.getConsole();
		IGuest iGuest = iCon.getGuest();
		IGuestSession igs = iGuest.createSession("Administrator", "mima",
				"", "");
		List lArgs = new ArrayList();
		lArgs.add("/K c:\\bin\\update.bat "+SystemContent.PROJECT_HOST+" "+SystemContent.SOCKET_PORT);
		List lFlags = new ArrayList();
		lFlags.add(ProcessCreateFlag.WaitForStdOut);
		lFlags.add(ProcessCreateFlag.WaitForStdErr);
		IGuestProcess igp = igs.processCreate("c:\\windows\\system32\\cmd.exe",
				lArgs, null, lFlags, (long) 120000);
		List lWaitFlags = new ArrayList();
		lWaitFlags.add(ProcessWaitForFlag.Start);
		ProcessWaitResult rlt = igp.waitForArray(lWaitFlags, (long) 120 * 1000);
		if (rlt == ProcessWaitResult.Start) {
			ProcessStatus ps = igp.getStatus();
			if (ps == ProcessStatus.Started) {
				log.info("runProcess is success");
			}
		}
		igs.close();
		return result;
	}

	public synchronized long stopVm() {
		if (null == machine) {
			log.error("Cannot find machine: " + vboxName);
			return -1;
		}
		long result = 0;
		MachineState state = machine.getState();
		try {
			if (MachineState.PoweredOff != state) {
				if(MachineState.Running == state){
					if(session.getState() == SessionState.Locked){
						session.unlockMachine();
					}
					machine.lockMachine(session, LockType.Shared);
				}
				IProgress progress = session.getConsole().powerDown();
				progress.waitForCompletion(10000);
				result = progress.getResultCode();
				if (0 != result) {
					log.error("machine " + vboxName + " error: "
							+ getVBProcessError(progress));
					return -1;
				} else {
					log.info("machine " + vboxName + " stopped");
				}
			}
			while(session.getState() == SessionState.Locked){
				Thread.sleep(500);
			}
			machine.lockMachine(session, LockType.Shared);
			ISnapshot iSnap = machine.getCurrentSnapshot();
			IConsole iCon = session.getConsole();
			IProgress iProg = iCon.restoreSnapshot(iSnap);
			if (!waitProgressCompletion(iProg)) {
				log.warn("Cannot restoreSnapshot VM!");
			}
			log.info("restoreSnapshot " + vboxName + "sucessed");
		} catch (Exception e) {
			e.printStackTrace();
			log.error("restoreSnapshot is error : " + e.getMessage());
			return -1;
		} finally {
			session.unlockMachine();
		}
		return result;
	}

	private String getVBProcessError(IProgress progress) {
		if (0 == progress.getResultCode()) {
			return "";
		}

		StringBuilder sb = new StringBuilder("");
		IVirtualBoxErrorInfo errInfo = progress.getErrorInfo();
		while (null != errInfo) {
			sb.append(errInfo.getText());
			sb.append("\n");
			errInfo = errInfo.getNext();
		}
		return sb.toString();
	}

	private boolean waitProgressCompletion(IProgress iProg) {
		iProg.waitForCompletion(10000); // give the process 10 secs
		if (iProg.getResultCode() != 0)
			return false;
		return true;
	}

 

 

你可能感兴趣的:(webservice)