public long getFreeMemorySpace() throws JIException {
    System.gc();

    JIVariant results[] =
        service_dispatch.callMethodA(
            "ExecQuery",
            new Object[] {
              new JIString("select * from Win32_PerfRawData_PerfOS_Memory"),
              JIVariant.OPTIONAL_PARAM(),
              JIVariant.OPTIONAL_PARAM(),
              JIVariant.OPTIONAL_PARAM()
            });
    IJIDispatch wbemObjectSet_dispatch =
        (IJIDispatch) JIObjectFactory.narrowObject((results[0]).getObjectAsComObject());
    JIVariant variant = wbemObjectSet_dispatch.get("_NewEnum");
    IJIComObject object2 = variant.getObjectAsComObject();

    IJIEnumVariant enumVARIANT =
        (IJIEnumVariant) JIObjectFactory.narrowObject(object2.queryInterface(IJIEnumVariant.IID));
    if (wbemObjectSet_dispatch.get("Count").getObjectAsInt() != 1)
      return -1; // there should be 1 hint

    JIArray array = (JIArray) enumVARIANT.next(1)[0];
    JIVariant item = ((JIVariant[]) array.getArrayInstance())[0];
    IJIDispatch wbemObject_dispatch =
        (IJIDispatch) JIObjectFactory.narrowObject(item.getObjectAsComObject());
    return Long.parseLong(
        wbemObject_dispatch.get("AvailableKBytes").getObjectAsString().getString());
  }
  public LinkedList<IJIDispatch> getDiskDrives() throws JIException {
    System.gc();

    // get all local disks
    JIVariant results[] =
        service_dispatch.callMethodA(
            "ExecQuery",
            new Object[] {
              new JIString("select * from Win32_LogicalDisk where DriveType = 3"),
              JIVariant.OPTIONAL_PARAM(),
              JIVariant.OPTIONAL_PARAM(),
              JIVariant.OPTIONAL_PARAM()
            });
    IJIDispatch wbemObjectSet_dispatch =
        (IJIDispatch) JIObjectFactory.narrowObject((results[0]).getObjectAsComObject());
    JIVariant variant = wbemObjectSet_dispatch.get("_NewEnum");
    IJIComObject object2 = variant.getObjectAsComObject();

    IJIEnumVariant enumVARIANT =
        (IJIEnumVariant) JIObjectFactory.narrowObject(object2.queryInterface(IJIEnumVariant.IID));

    LinkedList<IJIDispatch> drives = new LinkedList<IJIDispatch>();

    int count = wbemObjectSet_dispatch.get("Count").getObjectAsInt();
    for (int i = 0; i < count; i++) {
      Object[] values = enumVARIANT.next(1);
      JIArray array = (JIArray) values[0];
      JIVariant[] variants = (JIVariant[]) array.getArrayInstance();
      for (JIVariant item : variants) {
        drives.add((IJIDispatch) JIObjectFactory.narrowObject(item.getObjectAsComObject()));
      }
    }
    return drives;
  }
  /**
   * Removes resources to an existing virtual computer system
   *
   * @param vmDispatch A reference to the computer system instance to which the resource is to be
   *     added.
   * @param resourceAllocationDispatch the resource allocation setting data reference to be removed.
   * @throws JIException
   */
  public void removeVirtualSystemResources(
      final IJIDispatch vmDispatch, final IJIDispatch resourceAllocationDispatch)
      throws JIException {
    // Getting the dispatcher of the VM Path
    IJIDispatch vmPathDispatcher =
        (IJIDispatch)
            JIObjectFactory.narrowObject(
                vmDispatch.get("Path_").getObjectAsComObject().queryInterface(IJIDispatch.IID));

    // Getting the virtual machine path
    String vmPath = vmPathDispatcher.get("Path").getObjectAsString2();

    // Getting the dispatcher of the resource path
    IJIDispatch resourcePathDispatcher =
        (IJIDispatch)
            JIObjectFactory.narrowObject(
                resourceAllocationDispatch
                    .get("Path_")
                    .getObjectAsComObject()
                    .queryInterface(IJIDispatch.IID));

    // Getting the virtual machine path
    String resourcePath = resourcePathDispatcher.get("Path").getObjectAsString2();

    JIVariant[] tmp =
        dispatch.callMethodA(
            "RemoveVirtualSystemResources",
            new Object[] {
              new JIString(vmPath),
              new JIArray(new JIString[] {new JIString(resourcePath)}),
              JIVariant.EMPTY_BYREF(),
              JIVariant.EMPTY_BYREF()
            });

    int result = tmp[0].getObjectAsInt();

    String name = resourceAllocationDispatch.get("ElementName").getObjectAsString2();

    if (result == 0) {
      logger.debug(name + " removed from " + vmPath);
    } else {
      if (result == 4096) {
        logger.debug("Removing resources...");
        String jobPath = tmp[2].getObjectAsVariant().getObjectAsString2();
        HyperVUtils.monitorJob(jobPath, service.getObjectDispatcher());
      } else {
        logger.error(name + " deleting to " + vmPath + " failed with error code " + result);
        throw new IllegalStateException(
            "Cannot remove resource "
                + name
                + " to "
                + vmDispatch.get("ElementName").getObjectAsString2());
      }
    }
  }
  public WindowsHealth(
      String address, String domain, String user, String passwd, int timeout, boolean verbose)
      throws JIException, UnknownHostException {
    if (verbose) System.out.print("Creating session... ");
    session = JISession.createSession(domain, user, passwd);
    session.useSessionSecurity(true);
    session.setGlobalSocketTimeout(timeout);

    if (verbose) {
      System.out.println("OK");
      System.out.print("Connecting to COMServer... ");
    }

    JIProgId progid = JIProgId.valueOf("WbemScripting.SWbemLocator");
    comStub = new JIComServer(progid, address, session);
    IJIComObject unknown = comStub.createInstance();
    comObject =
        (IJIComObject)
            unknown.queryInterface("76A6415B-CB41-11d1-8B02-00600806D9B6"); // ISWbemLocator

    if (verbose) {
      System.out.println("OK");
      System.out.print("Connecting to targethost... ");
    }

    dispatch =
        (IJIDispatch) JIObjectFactory.narrowObject(comObject.queryInterface(IJIDispatch.IID));
    service =
        dispatch
            .callMethodA(
                "ConnectServer",
                new Object[] {
                  new JIString(address),
                  JIVariant.OPTIONAL_PARAM(),
                  JIVariant.OPTIONAL_PARAM(),
                  JIVariant.OPTIONAL_PARAM(),
                  JIVariant.OPTIONAL_PARAM(),
                  JIVariant.OPTIONAL_PARAM(),
                  new Integer(0),
                  JIVariant.OPTIONAL_PARAM()
                })[0];

    service_dispatch = (IJIDispatch) JIObjectFactory.narrowObject(service.getObjectAsComObject());
    if (verbose) System.out.println("OK");

    percentprocessortime = -1;
    timestamp = -1;
  }
 /**
  * Destroys a virtual system in hyper-v
  *
  * @param vmDispatch TODO
  * @return the error code of
  */
 public int destroyVirtualSystem(final IJIDispatch vmDispatch) throws Exception {
   JIVariant tmp = vmDispatch.get("Path_");
   IJIDispatch dispatchTemp =
       (IJIDispatch)
           JIObjectFactory.narrowObject(
               tmp.getObjectAsComObject().queryInterface(IJIDispatch.IID));
   String virtualSystemPath = dispatchTemp.get("Path").getObjectAsString2();
   JIVariant[] results =
       dispatch.callMethodA(
           "DestroyVirtualSystem",
           new Object[] {
             new JIString(virtualSystemPath), JIVariant.EMPTY_BYREF(), JIVariant.EMPTY_BYREF()
           });
   int error = results[0].getObjectAsInt();
   if (results.length > 1) {
     if (error != 0) {
       if (error == 4096) {
         logger.debug("Destroying virtual system...");
         String jobPath = results[2].getObjectAsVariant().getObjectAsString2();
         HyperVUtils.monitorJob(jobPath, service.getObjectDispatcher());
       } else {
         String message = "The virtual system could no te destroyed " + virtualSystemPath;
         logger.error(message);
         throw new JIException(error, message);
       }
     }
   }
   return error;
 }
  /* FIXME: This code sometimes fails with an "org.jinterop.dcom.common.JIException: An internal error occurred. [0x8001FFFF]"
   * on Windows 2008 */
  public int getCPUUsage() throws JIException {
    System.gc();

    JIVariant results[] =
        service_dispatch.callMethodA(
            "Get",
            new Object[] {
              new JIString("Win32_PerfRawData_PerfOS_Processor.Name='_Total'"),
              new Integer(0),
              JIVariant.OPTIONAL_PARAM()
            });

    IJIDispatch wbemObject_dispatch =
        (IJIDispatch) JIObjectFactory.narrowObject((results[0]).getObjectAsComObject());
    long ppt =
        Long.parseLong(
            wbemObject_dispatch.get("PercentProcessorTime").getObjectAsString().getString());
    long tss =
        Long.parseLong(
            wbemObject_dispatch.get("TimeStamp_Sys100NS").getObjectAsString().getString());

    if (this.percentprocessortime == -1 && this.timestamp == -1) {
      this.percentprocessortime = ppt;
      this.timestamp = tss;
      return -1;
    }

    double load =
        (1 - ((double) (this.percentprocessortime - ppt) / (double) (this.timestamp - tss))) * 100;
    this.percentprocessortime = ppt;
    this.timestamp = tss;

    return (int) Math.round(load);
  }
Example #7
0
 public static WshScriptExec create(final JIVariant... variants) throws JIException {
   WshScriptExec exec = null;
   if ((variants != null) && (variants.length > 0)) {
     final IJIComObject comObject = variants[0].getObjectAsComObject();
     final IJIDispatch dispatch = (IJIDispatch) JIObjectFactory.narrowObject(comObject);
     exec = new WshScriptExec(dispatch);
   }
   return exec;
 }
Example #8
0
    /**
     * Initializes a new instance of the SWbemSetIterator class.
     *
     * @param objectDispatcher The underlying dispatch object used to communicate with the server.
     * @param service The service connection.
     * @throws JIException When an error occurs.
     */
    public SWbemSetIterator(final IJIDispatch objectDispatcher, final SWbemServices service)
        throws JIException {
      super(objectDispatcher, service);

      JIVariant jiCount = super.objectDispatcher.get("Count");
      this.count = jiCount.getObjectAsInt();

      JIVariant variant = super.objectDispatcher.get("_NewEnum");
      IJIComObject co = variant.getObjectAsComObject();
      co = co.queryInterface(IJIEnumVariant.IID);
      this.enumerator = (IJIEnumVariant) JIObjectFactory.narrowObject(co);
    }
  public LinkedList<IJIDispatch> getServices() throws JIException {
    System.gc();

    // get all services which should start automatically but are not running
    JIVariant results[] =
        service_dispatch.callMethodA(
            "ExecQuery",
            new Object[] {
              new JIString(
                  "select * from Win32_Service where StartMode = 'Auto' and Started = FALSE"),
              JIVariant.OPTIONAL_PARAM(),
              JIVariant.OPTIONAL_PARAM(),
              JIVariant.OPTIONAL_PARAM()
            });

    IJIDispatch wbemObjectSet_dispatch =
        (IJIDispatch) JIObjectFactory.narrowObject((results[0]).getObjectAsComObject());
    JIVariant variant = wbemObjectSet_dispatch.get("_NewEnum");
    IJIComObject object2 = variant.getObjectAsComObject();
    IJIEnumVariant enumVARIANT =
        (IJIEnumVariant) JIObjectFactory.narrowObject(object2.queryInterface(IJIEnumVariant.IID));

    LinkedList<IJIDispatch> services = new LinkedList<IJIDispatch>();

    int count = wbemObjectSet_dispatch.get("Count").getObjectAsInt();
    for (int i = 0; i < count; i++) {
      Object[] values = enumVARIANT.next(1);
      JIArray array = (JIArray) values[0];
      JIVariant[] variants = (JIVariant[]) array.getArrayInstance();
      for (JIVariant item : variants) {
        IJIDispatch wbemObject_dispatch =
            (IJIDispatch) JIObjectFactory.narrowObject(item.getObjectAsComObject());
        services.add(wbemObject_dispatch);
      }
    }
    return services;
  }
  /**
   * Modifies the settings for an existing virtual computer system.
   *
   * @param vmDispatch A reference to the virtual computer system to be modified.
   * @param systemSettingData describes the modified setting values for the virtual computer system.
   * @throws JIException
   */
  public void modifyVirtualSystem(final IJIDispatch vmDispatch, final IJIDispatch systemSettingData)
      throws JIException {
    // Getting the dispatcher of the VM Path
    IJIDispatch vmPathDispatcher =
        (IJIDispatch)
            JIObjectFactory.narrowObject(
                vmDispatch.get("Path_").getObjectAsComObject().queryInterface(IJIDispatch.IID));

    // Getting the virtual machine path
    String vmPath = vmPathDispatcher.get("Path").getObjectAsString2();

    // Getting the dispatcher of the resource path

    String resourceText =
        systemSettingData.callMethodA("GetText_", new Object[] {new Integer(1)})[0]
            .getObjectAsString2();

    JIVariant[] tmp =
        dispatch.callMethodA(
            "ModifyVirtualSystem",
            new Object[] {
              new JIString(vmPath),
              new JIArray(new JIString[] {new JIString(resourceText)}),
              JIVariant.EMPTY_BYREF(),
              JIVariant.EMPTY_BYREF()
            });

    int result = tmp[0].getObjectAsInt();

    String name = systemSettingData.get("ElementName").getObjectAsString2();
    if (result == 0) {
      logger.debug("Setting data properly modified" + vmPath);
    } else {
      if (result == 4096) {
        logger.debug("Modifying setting data...");
        String jobPath = tmp[1].getObjectAsVariant().getObjectAsString2();
        HyperVUtils.monitorJob(jobPath, service.getObjectDispatcher());
      } else {
        logger.error(name + " addition to " + vmPath + " failed with error code " + result);
        throw new IllegalStateException(
            "Setting data cannot be modified to"
                + vmDispatch.get("ElementName").getObjectAsString2());
      }
    }
  }
Example #11
0
    public T next() {
      try {
        if (hasNext()) {
          count--;
          Object[] values = this.enumerator.next(1);
          JIArray array = (JIArray) values[0];
          Object[] arrayObj = (Object[]) array.getArrayInstance();
          IJIComObject co = ((JIVariant) arrayObj[0]).getObjectAsComObject();
          IJIDispatch dispatch = (IJIDispatch) JIObjectFactory.narrowObject(co);

          // Create a new SWbemSetItem from the result.
          final Constructor<T> ctor = clazz.getConstructor(IJIDispatch.class, SWbemServices.class);
          final T item = ctor.newInstance(dispatch, this.service);
          return item;
        } else {
          throw new NoSuchElementException();
        }
      } catch (Exception ex) {
        return null;
      }
    }
Example #12
0
  /**
   * Gets an item of the set.
   *
   * @param itemName The name of the item to get.
   * @return The item with the specified name.
   * @throws Exception When an error occurs.
   */
  public T getItem(final String itemName) throws Exception {
    try {
      // Invoke the Item method.
      Object[] inParams = new Object[] {new JIString(itemName), new Integer(0)};
      final JIVariant[] results = super.objectDispatcher.callMethodA("Item", inParams);
      final IJIComObject prop = results[0].getObjectAsComObject();
      final IJIDispatch dispatch = (IJIDispatch) JIObjectFactory.narrowObject(prop);

      // Create a new SWbemSetItem from the result.
      final Constructor<T> ctor = this.clazz.getConstructor(IJIDispatch.class, SWbemServices.class);
      final T item = ctor.newInstance(dispatch, this.service);

      // Return the SWbemSetItem.
      return item;
    } catch (JIException e) {
      if (e.getErrorCode() == 0x80020009) {
        return null;
      } else {
        throw e;
      }
    }
  }
  /**
   * Destroys a virtual system in hyper-v
   *
   * @param vmDispatch A reference to the virtual computer system instance to be destroyed.
   */
  public void destroyVirtualSystem2(final IJIDispatch vmDispatch) throws Exception {
    if (this.destroyVirtualSystem == null) {
      for (final SWbemMethod m : super.getMethods()) {
        if (m.getName().equals("DestroyVirtualSystem")) {
          this.destroyVirtualSystem = m;
        }
      }
    }

    JIVariant tmp = vmDispatch.get("Path_");
    IJIDispatch dispatchTemp =
        (IJIDispatch)
            JIObjectFactory.narrowObject(
                tmp.getObjectAsComObject().queryInterface(IJIDispatch.IID));
    String virtualSystemPath = dispatchTemp.get("Path").getObjectAsString2();

    SWbemObject inParams = this.destroyVirtualSystem.getInParameters();

    inParams
        .getObjectDispatcher()
        .put("ComputerSystem", new JIVariant(new JIString(virtualSystemPath)));

    Object[] methodParams =
        new Object[] {
          new JIString("DestroyVirtualSystem"),
          new JIVariant(inParams.getObjectDispatcher()),
          new Integer(0),
          JIVariant.NULL(),
        };

    // Execute the method.
    super.objectDispatcher.callMethodA("ExecMethod_", methodParams);
    // JIVariant[] tmp =
    // dispatch.callMethodA("DefineVirtualSystem", new Object[] {
    // new JIString(globalSettingDataText), JIVariant.OPTIONAL_PARAM(),
    // JIVariant.OPTIONAL_PARAM(),});
    // int defRes = tmp[0].getObjectAsInt();
  }
  /**
   * Add resources to an existing virtual computer system
   *
   * @param vmDispatch A reference to the computer system instance to which the resource is to be
   *     added.
   * @param newResourceAllocationDispatch the new resource allocation setting data reference to be
   *     added.
   * @return the resource allocation setting data path of the added resource
   * @deprecated
   * @throws JIException
   */
  @Deprecated
  public String addVirtualSystemResources2(
      final IJIDispatch vmDispatch, final IJIDispatch newResourceAllocationDispatch)
      throws JIException {
    if (this.addVirtualSystemResources == null) {
      for (final SWbemMethod m : super.getMethods()) {
        if (m.getName().equals("AddVirtualSystemResources")) {
          this.addVirtualSystemResources = m;
        }
      }
    }

    // Getting the dispatcher of the VM Path
    IJIDispatch vmPathDispatcher =
        (IJIDispatch)
            JIObjectFactory.narrowObject(
                vmDispatch.get("Path_").getObjectAsComObject().queryInterface(IJIDispatch.IID));

    // Getting the virtual machine path
    String vmPath = vmPathDispatcher.get("Path").getObjectAsString2();

    // Getting the dispatcher of the resource path

    String resourceText =
        newResourceAllocationDispatch.callMethodA("GetText_", new Object[] {new Integer(1)})[0]
            .getObjectAsString2();

    SWbemObject inParams = this.addVirtualSystemResources.getInParameters();

    inParams.getObjectDispatcher().put("TargetSystem", new JIVariant(new JIString(vmPath)));

    inParams
        .getObjectDispatcher()
        .put(
            "ResourceSettingData",
            new JIVariant(new JIArray(new JIString[] {new JIString(resourceText)})));

    Object[] methodParams =
        new Object[] {
          new JIString("AddVirtualSystemResources"),
          new JIVariant(inParams.getObjectDispatcher()),
          new Integer(0),
          JIVariant.NULL(),
        };

    // Execute the method.
    JIVariant[] results = super.objectDispatcher.callMethodA("ExecMethod_", methodParams);

    // Get the out parameters.
    JIVariant outParamsVar = results[0];
    IJIComObject co = outParamsVar.getObjectAsComObject();
    IJIDispatch outParamsDisp = (IJIDispatch) JIObjectFactory.narrowObject(co);

    // Get the out parameter virtualSystemResources and convert it into an
    // array of JIVariants.
    JIVariant newResourcesVars = outParamsDisp.get("NewResources");
    JIArray newResourcesVarsJIArr = newResourcesVars.getObjectAsArray();
    JIVariant[] newResourcesVarsJIVarArr = (JIVariant[]) newResourcesVarsJIArr.getArrayInstance();

    String newResourceCoString = newResourcesVarsJIVarArr[0].getObjectAsString2();

    return newResourceCoString;
  }
  /**
   * Add resources to an existing virtual computer system
   *
   * @param vmDispatch A reference to the computer system instance to which the resource is to be
   *     added.
   * @param newResourceAllocationDispatch the new resource allocation setting data reference to be
   *     added.
   * @return the resource allocation setting data path of the added resource
   * @throws JIException
   */
  public String addVirtualSystemResources(
      final IJIDispatch vmDispatch, final IJIDispatch newResourceAllocationDispatch)
      throws JIException {
    // Getting the dispatcher of the VM Path
    IJIDispatch vmPathDispatcher =
        (IJIDispatch)
            JIObjectFactory.narrowObject(
                vmDispatch.get("Path_").getObjectAsComObject().queryInterface(IJIDispatch.IID));

    // Getting the virtual machine path
    String vmPath = vmPathDispatcher.get("Path").getObjectAsString2();

    // Getting the dispatcher of the resource path

    String resourceText =
        newResourceAllocationDispatch.callMethodA("GetText_", new Object[] {new Integer(1)})[0]
            .getObjectAsString2();

    JIVariant[] tmp =
        dispatch.callMethodA(
            "AddVirtualSystemResources",
            new Object[] {
              new JIString(vmPath),
              new JIArray(new JIString[] {new JIString(resourceText)}),
              JIVariant.EMPTY_BYREF(),
              JIVariant.EMPTY_BYREF()
            });

    int result = tmp[0].getObjectAsInt();

    JIVariant resultVariant = tmp[2];

    JIVariant variant2 = resultVariant.getObjectAsVariant();

    JIArray newResourcesArr = variant2.getObjectAsArray();

    if (newResourcesArr == null) {
      throw new JIException(32768, "The resource could not be added");
    }

    JIVariant[] newResourcesVarArr = (JIVariant[]) newResourcesArr.getArrayInstance();

    String newResourcePath = newResourcesVarArr[0].getObjectAsString2();

    String name = newResourceAllocationDispatch.get("ElementName").getObjectAsString2();
    if (result == 0) {
      logger.debug(name + " added to " + vmPath);
    } else {
      if (result == 4096) {
        logger.debug("Addind resources...");
        String jobPath = tmp[1].getObjectAsVariant().getObjectAsString2();
        HyperVUtils.monitorJob(jobPath, service.getObjectDispatcher());
      } else {
        logger.error(name + " addition to " + vmPath + " failed with error code " + result);
        throw new IllegalStateException(
            "Cannot add resource "
                + name
                + " to "
                + vmDispatch.get("ElementName").getObjectAsString2());
      }
    }

    return newResourcePath;
  }
Example #16
0
 public final InputTextStream getStderr() throws JIException {
   final JIVariant variant = dispatch.get("StdErr"); // i18n lib
   final IJIComObject comObject = variant.getObjectAsComObject();
   return new InputTextStream((IJIDispatch) JIObjectFactory.narrowObject(comObject));
 }