예제 #1
0
        internal void UpdateEntry(CDatabaseEntry entry)
        {
            SQLiteDataReader  reader        = ExecuteParameterizedReader("SELECT * FROM ea_objects WHERE uid=@0", entry.Id);
            CDiscoveredConfig existingprops = new CDiscoveredConfig();

            while (reader.Read()) // read existing attributes
            {
                if (entry.Reference.ToStringNz() == "")
                {
                    entry.Reference = reader["ref"].ToStringNz();
                }
                if (entry.Created.ToStringNz() == "")
                {
                    entry.Created = reader["created"].ToStringNz();
                }
                if (entry.Accessed.ToStringNz() == "")
                {
                    entry.Accessed = reader["accessed"].ToStringNz();
                }
                if (entry.Type.ToStringNz() == "")
                {
                    entry.Type = reader["type"].ToStringNz();
                }
                existingprops = CDiscoveredConfig.Deserialize(reader["attributes"].ToStringNz());
            }
            if (existingprops.Attributes != null && existingprops.Attributes.Count() > 0)
            {
                CDiscoveredConfig newprops = CDiscoveredConfig.Deserialize(entry.Attributes);
                existingprops.Merge(newprops);
                entry.Attributes = existingprops.Serialize(CDiscoveredAttributes.SerializeAsShortJson);
                ExecuteParameterizedNonQuery("UPDATE ea_objects SET name=@1, ref=@2, type=@3, parent=@4, created=@5, accessed=@6, attributes=@7 WHERE uid=@0", entry.Id, entry.Name, entry.Reference, entry.Type, entry.Parent, entry.Created, entry.Accessed, entry.Attributes);
            }
        }
 private void AddGroupingInfo(CService server, CDiscoveredConfig oc)
 {
     if (server.Type == CServiceType.VCenterServer)
     {
         _AddGroupingInfo(server, server.Name, CDiscoveredTypes.VCenterServer, server.Id, server.Id);
         string dc   = oc.Attributes.Get(CAttributeType.Datacenter).ToStringNz();
         string cl   = oc.Attributes.Get(CAttributeType.Cluster).ToStringNz();
         string dcid = _AddGroupingInfo(server, dc, CDiscoveredTypes.VIDatacenter, server.Id);
         string clid = _AddGroupingInfo(server, cl, CDiscoveredTypes.VICluster, dcid);
     }
     if (server.Type == CServiceType.HYVServer)
     {
         string cl = oc.Attributes.Get(CAttributeType.Cluster).ToStringNz();
         if (cl.Length > 0)
         {
             string clid = _AddGroupingInfo(server, cl, CDiscoveredTypes.HVCluster, "", "");
         }
         else
         {
             string hostid = _AddGroupingInfo(server, server.Name, CDiscoveredTypes.HVHost, server.Id, server.Id);
         }
     }
     if (server.Type == CServiceType.ESXServer)
     {
         string hostid = _AddGroupingInfo(server, server.Name, CDiscoveredTypes.VIHost, server.Id, server.Id);
     }
     _AddGroupingInfo(server, oc.Site.ToStringNz(), CDiscoveredTypes.Site, server.Id);
 }
        public CDiscoveredConfig _UpdateGroupingInfo(CDiscoveredConfig group, CDiscoveredConfig oc)
        {
            if ((oc.Type == CDiscoveredTypes.VIHost) || (oc.Type == CDiscoveredTypes.HVHost))
            {
                group.Metrics.Increment(CMetricType.HostCpu, CMetricSubtype.Sockets, oc);
                group.Metrics.Increment(CMetricType.HostCpu, CMetricSubtype.Cores, oc);
                group.Metrics.Increment(CMetricType.HostMem, CMetricSubtype.Allocated, oc);
                group.Metrics.Increment(CMetricType.HostCount, 1);
            }
            else if ((oc.Type == CDiscoveredTypes.VIVM) || (oc.Type == CDiscoveredTypes.HVVM))
            {
                group.Metrics.Increment(CMetricType.VmCpu, CMetricSubtype.Sockets, oc);
                group.Metrics.Increment(CMetricType.VmCpu, CMetricSubtype.Cores, oc);
                group.Metrics.Increment(CMetricType.VmDisk, CMetricSubtype.Allocated, oc);
                group.Metrics.Increment(CMetricType.VmDisk, CMetricSubtype.Used, oc);
                group.Metrics.Increment(CMetricType.VmDisk, CMetricSubtype.Unshared, oc);
                group.Metrics.Increment(CMetricType.VmMem, CMetricSubtype.Allocated, oc);
                group.Metrics.Increment(CMetricType.VmCount, 1);
            }
            else if ((oc.Type == CDiscoveredTypes.VIDatastore) || (oc.Type == CDiscoveredTypes.HVDatastore))
            {
                group.Metrics.Increment(CMetricType.DsDisk, CMetricSubtype.Allocated, oc);
                group.Metrics.Increment(CMetricType.DsDisk, CMetricSubtype.Used, oc);
                group.Metrics.Increment(CMetricType.DsCount, 1);
            }

            oc = _UpdateObjectGroupingInfo(oc);

            return(oc);
        }
예제 #4
0
        private void OnDataCollectWorker_RemoveDuplicateServers()
        {
            List <CService> servers = new List <CService> {
            };

            servers.AddRange(DiscoveredServers.OfType <CService>());

            servers = servers.OrderBy(o => o.Name).ToList();

            string lastServerName = "";
            int    lastServerType = -1;

            for (int i = 0; i < servers.Count(); i++)
            {
                //Log.Write(servers[i].Name);
                if ((lastServerName.ToLower() == servers[i].Name.ToLower()) && (lastServerType == servers[i].Type))
                {
                    servers.RemoveAt(i); // same server name with same server type
                }
                else
                {
                    CQuery q = servers[i].Session.Queries[0];
                    for (int j = 0; j < q.Result.Count; j++)
                    {
                        CDiscoveredConfig sc = q.Result[j];
                        for (int k = 0; k < servers.Count(); k++)
                        {
                            // server already exists as another server's child
                            if (servers[k].Name.ToLower() == sc.Name.ToLower() && (servers[k].Id != servers[i].Id))
                            {
                                servers.RemoveAt(k);
                            }
                        }
                    }
                }

                if (i < servers.Count)
                {
                    lastServerName = servers[i].Name;
                    lastServerType = servers[i].Type;
                }
            }

            DiscoveredServers.Clear();
            DiscoveredServers.AddRange(servers);
        }
 private CDiscoveredConfig UpdateGroupingInfo(CService server, CDiscoveredConfig oc)
 {
     foreach (CDiscoveredConfig group in DiscoveredGroups.Values)
     {
         bool match = false;
         match = match || (group.Type == CDiscoveredTypes.VCenterServer && group.Name == server.Name);
         match = match || (group.Type == CDiscoveredTypes.SCVMMServer && group.Name == server.Name);
         match = match || (group.Type == CDiscoveredTypes.Site && group.Name == oc.Site.ToStringNz());
         match = match || (group.Type == CDiscoveredTypes.VIDatacenter && group.Name == oc.Attributes.Get(CAttributeType.Datacenter).ToStringNz());
         match = match || (group.Type == CDiscoveredTypes.VICluster && group.Name == oc.Attributes.Get(CAttributeType.Cluster).ToStringNz());
         match = match || (group.Type == CDiscoveredTypes.HVCluster && group.Name == oc.Attributes.Get(CAttributeType.Cluster).ToStringNz());
         match = match || (group.Type == CDiscoveredTypes.VIHost && oc.Owner.Contains(group.Id));
         match = match || (group.Type == CDiscoveredTypes.HVHost && oc.Owner.Contains(group.Id));
         if (match)
         {
             oc = _UpdateGroupingInfo(group, oc);
         }
     }
     return(oc);
 }
        public void ExportDiscoveredConfig(CDiscoveredConfig oc, CService server = null, bool rolluptotals = false)
        {
            if (oc.Attributes != null && oc.Name.Length > 0)
            {
                if (server != null && rolluptotals)
                {
                    // create grouping objects
                    AddGroupingInfo(server, oc);

                    // rollup totals by group and repair object parent properties
                    oc = UpdateGroupingInfo(server, oc);
                }
                CDatabaseEntry entry = new CDatabaseEntry();
                entry.Id         = oc.Id.ToString();
                entry.Reference  = oc.Attributes.Get(CAttributeType.Reference);
                entry.Created    = oc.Attributes.Get(CAttributeType.Created);
                entry.Accessed   = oc.Attributes.Get(CAttributeType.Accessed);
                entry.Name       = CFunctions.EscapeJson(oc.Name);
                entry.Type       = oc.Type.ToString();
                entry.Parent     = CFunctions.StringJoin(";", oc.Owner);
                entry.Attributes = oc.Serialize(CDiscoveredConfig.SerializeAsShortJson);
                if (!ExportedEntries.Contains(entry.Id))
                {
                    _DBConn.AddEntry(entry);
                    ExportedEntries.Add(entry.Id);
                }
                else
                {
                    _DBConn.UpdateEntry(entry);
                }
            }
            if (oc.ChildObjects != null)
            {
                foreach (CDiscoveredConfig obj in oc.ChildObjects)
                {
                    ExportDiscoveredConfig(obj, server, rolluptotals);
                }
            }
        }
        public CDiscoveredConfig _UpdateObjectGroupingInfo(CDiscoveredConfig oc)
        {
            if ((oc.Type == CDiscoveredTypes.VIHost) || (oc.Type == CDiscoveredTypes.HVHost))
            {
                CDiscoveredConfig cluster       = null;
                CDiscoveredConfig datacenter    = null;
                string            clusterstr    = oc.Attributes.Get(CAttributeType.Cluster);
                string            datacenterstr = oc.Attributes.Get(CAttributeType.Datacenter);

                if ((clusterstr != null) && (DiscoveredGroups.TryGetValue(clusterstr, out cluster)))
                {
                    oc.Owner = new List <string> {
                        cluster.Id
                    };
                }
                else if ((datacenterstr != null) && (DiscoveredGroups.TryGetValue(datacenterstr, out datacenter)))
                {
                    oc.Owner = new List <string> {
                        datacenter.Id
                    };
                }
            }
            return(oc);
        }
예제 #8
0
        internal List <CDiscoveredConfig> GetHosts(int queryid)
        {
            List <CDiscoveredConfig> HostsFound = new List <CDiscoveredConfig> {
            };
            IList <EntityViewBase> hosts        = null;

            // dont continue if not logged in
            if (HVClient == null)
            {
                return(HostsFound);
            }

            try { Log.Write("[HvApi] Querying hosts associated with: " + Server.Name.ToUpper()); hosts = HVClient.FindEntityViews(typeof(HostSystem)); }
            catch (Exception ex) { Log.Write("Error: Cannot query host information. Details: " + ex.TargetSite + ex.Message); }

            _SiteInfo = Server.Session.Queries[queryid].Sites;

            if (hosts != null)
            {
                Log.Write(CFunctions.StringReplace("Found hosts ({0}) associated with {1}", hosts.Count.ToString(), Server.Name.ToUpper()));
                foreach (HostSystem host in hosts)
                {
                    string cluster = "";
                    if (HVClient.HostType == HvHostType.Cluster)
                    {
                        cluster = HVClient._ClusterName;
                    }

                    CDiscoveredMetrics hostmetrics = new CDiscoveredMetrics();
                    hostmetrics.Set(CMetricType.HostCpu, CMetricSubtype.Sockets, host.Hardware.CpuInfo.NumCpuPackages);
                    hostmetrics.Set(CMetricType.HostCpu, CMetricSubtype.Cores, host.Hardware.CpuInfo.NumCpuCores);
                    hostmetrics.Set(CMetricType.HostMem, CMetricSubtype.Allocated, CFunctions.ConvertDataUnit(host.Hardware.MemorySize, CDataUnitType.Byte, CDataUnitType.MiB));
                    hostmetrics.Set(CMetricType.VmCount, CMetricSubtype.None, host.Vm.Count());
                    hostmetrics.Set(CMetricType.DsCount, CMetricSubtype.None, host.Datastore.Count());

                    CDiscoveredAttributes hostattribs = new CDiscoveredAttributes();
                    hostattribs.Set(CAttributeType.Reference, "HostSystem-" + host.Id.ToLower());
                    hostattribs.Set(CAttributeType.IP, host.IP.ToString());
                    hostattribs.Set(CAttributeType.OS, host.OS);
                    hostattribs.Set(CAttributeType.Cluster, cluster);
                    hostattribs.Set(CAttributeType.HardwareVersion, (host.Hardware.SystemInfo.Vendor + " " + host.Hardware.SystemInfo.Model).Replace(",", String.Empty));
                    hostattribs.Set(CAttributeType.PowerState, "poweredOn"); // silly but we will not get any data from powered off hosts
                    //hostattribs.Merge(GetObjectState(host))

                    CDiscoveredConfig hostinfo = new CDiscoveredConfig()
                    {
                        Type       = new CDiscoveredTypes(CDiscoveredTypes.HVHost),
                        Site       = CSite.Resolve(host.IP, _SiteInfo),
                        Name       = host.Name.ToString(),
                        Metrics    = hostmetrics,
                        Attributes = hostattribs,
                        Owner      = new List <string> {
                            Server.Id
                        }
                    };

                    if ((hosts.Count == 1) && (HVClient.HostType == HvHostType.Standalone))
                    {
                        hostinfo.Id = Server.Id;
                    }
                    StoreObjectUid(hostinfo.Name, hostinfo.Id);

                    Log.Write(hostinfo.ToString(), Log.Verbosity.Debug);

                    HostsFound.Add(hostinfo);
                }
                HostsFound = HostsFound.OrderBy(o => o.Name).ToList();
            }

            return(HostsFound);
        }
예제 #9
0
        internal List <CDiscoveredConfig> GetVms(int queryid)
        {
            List <CDiscoveredConfig> VMsFound = new List <CDiscoveredConfig> {
            };
            IList <EntityViewBase> vms        = null;

            // dont continue if not logged in
            if (HVClient == null)
            {
                return(VMsFound);
            }

            try { Log.Write("[HvApi] Querying virtual machines associated with: " + Server.Name.ToUpper()); vms = HVClient.FindEntityViews(typeof(VirtualMachine)); }
            catch (Exception ex) { Log.Write("Error: Cannot query virtual machine information. Details: " + ex.TargetSite + ex.Message); }

            _SiteInfo = Server.Session.Queries[queryid].Sites;

            if (vms != null)
            {
                // iterate through vms and get general information
                Log.Write(CFunctions.StringReplace("Found virtual machines ({0}) associated with {1}", vms.Count.ToString(), Server.Name.ToUpper()));
                foreach (EntityViewBase tmp in vms)
                {
                    VirtualMachine vm = (VirtualMachine)tmp;

                    if (vm.Name != null)
                    {
                        long storagealloc = CFunctions.ConvertDataUnit(vm.Storage.Allocated, CDataUnitType.Byte, CDataUnitType.MiB);
                        long storageused  = CFunctions.ConvertDataUnit(vm.Storage.Used, CDataUnitType.Byte, CDataUnitType.MiB);
                        //double storageunshared = CFunctions.ConvertDataUnit(vm.Storage.Unshared, CDataUnitType.Byte, CDataUnitType.MiB);

                        string owner = RetrieveObjectUid(vm.Host);

                        CDiscoveredMetrics guestusage = new CDiscoveredMetrics();
                        guestusage.Set(CMetricType.VmDisk, CMetricSubtype.Allocated, vm.Storage.Allocated);
                        guestusage.Set(CMetricType.VmDisk, CMetricSubtype.Used, vm.Storage.Used);
                        guestusage.Set(CMetricType.VmCpu, CMetricSubtype.Sockets, vm.Hardware.NumCPU);
                        guestusage.Set(CMetricType.VmCpu, CMetricSubtype.Cores, ((int)vm.Hardware.NumCPU * vm.Hardware.NumCoresPerSocket.GetValueOrDefault(1)));
                        guestusage.Set(CMetricType.VmMem, CMetricSubtype.Allocated, vm.Hardware.MemoryMB);
                        guestusage.Set(CMetricType.VmDisk, CMetricSubtype.Allocated, storagealloc);
                        guestusage.Set(CMetricType.VmDisk, CMetricSubtype.Used, storageused);

                        CDiscoveredAttributes guestattribs = new CDiscoveredAttributes();
                        guestattribs.Set(CAttributeType.Reference, "VirtualMachine-" + vm.Id.ToLower());
                        guestattribs.Set(CAttributeType.IP, vm.Guest.IP.ToString());
                        guestattribs.Set(CAttributeType.OS, vm.Guest.OS);
                        guestattribs.Set(CAttributeType.HardwareVersion, vm.Version);
                        guestattribs.Set(CAttributeType.ToolsVersion, vm.Guest.ToolsVersion.ToString());

                        guestattribs.Set(CAttributeType.Cluster, vm.Cluster);

                        //guestattribs.Merge(GetObjectState(vm))
                        string vmPowerState = "poweredOff";
                        if ((VmEnabledState)vm.State == VmEnabledState.Enabled)
                        {
                            vmPowerState = "poweredOn";
                        }
                        else if (((VmEnabledState)vm.State == VmEnabledState.Paused) || ((VmEnabledState)vm.State == VmEnabledState.Pausing) || ((VmEnabledState)vm.State == VmEnabledState.Suspended))
                        {
                            vmPowerState = "suspended";
                        }
                        guestattribs.Set(CAttributeType.PowerState, vmPowerState);
                        CDiscoveredConfig guestinfo = new CDiscoveredConfig
                        {
                            Type       = new CDiscoveredTypes(CDiscoveredTypes.HVVM),
                            Site       = CSite.Resolve(vm.Guest.IP, _SiteInfo),
                            Name       = vm.Name.ToString(),
                            Metrics    = guestusage,
                            Attributes = guestattribs,
                            Owner      = new List <string> {
                                owner
                            }
                        };

                        StoreObjectUid(guestinfo.Attributes.Get(CAttributeType.Reference), guestinfo.Id);
                        guestinfo.ChildObjects = GetVmDisks(queryid, vm);

                        Log.Write(guestinfo.ToString(), Log.Verbosity.Debug);

                        VMsFound.Add(guestinfo);
                    }
                }

                VMsFound = VMsFound.OrderBy(o => o.Name).ToList(); // sort alphabally

                // get additional details for thin vmdk files
                //VMsFound = UpdateVIVMDiskDatastoreInfo(queryid, VMsFound);
            }

            return(VMsFound);
        }
예제 #10
0
        internal List <CDiscoveredConfig> GetDatastores(int queryid)
        {
            List <CDiscoveredConfig> DatastoresFound = new List <CDiscoveredConfig> {
            };
            IList <EntityViewBase> datastores        = null;

            // dont continue if not logged in
            if (HVClient == null)
            {
                return(DatastoresFound);
            }

            try { Log.Write("[HvApi] Querying datastores associated with: " + Server.Name.ToUpper()); datastores = HVClient.FindEntityViews(typeof(Datastore)); }
            catch (Exception ex) { Log.Write("Error: Cannot query datastore information. Details: " + ex.TargetSite + ex.Message); }

            _SiteInfo = Server.Session.Queries[queryid].Sites;

            if (datastores != null)
            {
                // iterate through vms and get general information
                Log.Write(CFunctions.StringReplace("Found datastores ({0}) associated with {1}", datastores.Count.ToString(), Server.Name.ToUpper()));

                foreach (EntityViewBase tmp in datastores)
                {
                    Datastore ds = (Datastore)tmp;

                    if (ds.Name != null)
                    {
                        long storagealloc = CFunctions.ConvertDataUnit(ds.Capacity, CDataUnitType.Byte, CDataUnitType.MiB);
                        long storageused  = CFunctions.ConvertDataUnit(ds.Capacity - ds.FreeSpace, CDataUnitType.Byte, CDataUnitType.MiB);

                        List <string> owner = new List <string> {
                        };
                        foreach (string parent in ds.Host.Split(';'))
                        {
                            owner.Add(RetrieveObjectUid(parent));
                        }

                        CDiscoveredMetrics dsmetric = new CDiscoveredMetrics();
                        dsmetric.Set(CMetricType.DsDisk, CMetricSubtype.Allocated, storagealloc);
                        dsmetric.Set(CMetricType.DsDisk, CMetricSubtype.Used, storageused);

                        CDiscoveredAttributes dsattrib = new CDiscoveredAttributes();

                        string id = ds.ID.Split('{')[1].Split('}')[0];
                        dsattrib.Set(CAttributeType.Reference, "Datastore-" + id);
                        dsattrib.Set(CAttributeType.Format, ds.FileSystem);
                        dsattrib.Set(CAttributeType.Vendor, ds.Vendor);
                        dsattrib.Set(CAttributeType.Model, ds.Model);
                        dsattrib.Set(CAttributeType.Mode, ds.AccessMode);
                        dsattrib.Set(CAttributeType.Cluster, ds.Cluster);

                        bool islocal = true;
                        if ((ds.AccessMode.ToLower().Contains("iscsi")) || (ds.AccessMode.ToLower().Contains("fibre")))
                        {
                            islocal = false;
                        }
                        dsattrib.Set(CAttributeType.Local, islocal.ToString());

                        CDiscoveredConfig dsinfo = new CDiscoveredConfig();
                        dsinfo.Type       = new CDiscoveredTypes(CDiscoveredTypes.HVDatastore);
                        dsinfo.Name       = ds.Name;
                        dsinfo.Metrics    = dsmetric;
                        dsinfo.Attributes = dsattrib;
                        dsinfo.Owner      = owner;

                        StoreObjectUid(dsinfo.Attributes.Get(CAttributeType.Reference), dsinfo.Id);

                        Log.Write(dsinfo.ToString(), Log.Verbosity.Debug);

                        DatastoresFound.Add(dsinfo);
                    }
                }
                DatastoresFound = DatastoresFound.OrderBy(o => o.Name).ToList();
            }
            return(DatastoresFound);
        }