示例#1
0
    def collect(self, config):
        log.debug('{0}:Start Collection of IIS Sites'.format(config.id))
        ds0 = config.datasources[0]
        conn_info = createConnectionInfo(ds0)

        wql_iis6 = 'select name, ServerAutoStart from IIsWebServerSetting'.format(
            ds0.params['statusname'])

        wql_iis7 = 'select name, ServerAutoStart from Site'.format(
            ds0.params['statusname'])

        winrm = EnumerateClient(conn_info)
        queries = {
            create_enum_info(wql=wql_iis6, resource_uri=RESOURCE_URI_IIS6):
            'iis6',
            create_enum_info(wql=wql_iis7, resource_uri=RESOURCE_URI_IIS7):
            'iis7'
        }
        query_results = yield winrm.do_collect(queries.iterkeys())
        winrm_results = {}
        for info, data in query_results.iteritems():
            winrm_results[queries[info]] = data
        log.debug(queries)
        winrs = IISCommander(conn_info)
        winrs_results = yield winrs.get_app_pool_status()
        defer.returnValue((winrm_results, winrs_results))
    def collect(self, config):

        log.debug('{0}:Start Collection of Services'.format(config.id))

        WinRMQueries = [
            create_enum_info(
                'select name, state, status, displayname from Win32_Service')
        ]

        conn_info = createConnectionInfo(config.datasources[0])

        winrm = EnumerateClient(conn_info)
        results = yield winrm.do_collect(WinRMQueries)

        defer.returnValue(results)
示例#3
0
    def collect(self, config):

        ds0 = config.datasources[0]

        log.debug('{0}:Start WinRM connection test.'.format(config.id))

        conn_info = createConnectionInfo(ds0)

        WinRMQueries = [
            create_enum_info('select * from Win32_OperatingSystem')
        ]

        winrm = EnumerateClient(conn_info)
        results = yield winrm.do_collect(WinRMQueries)

        defer.returnValue(results)
    def collect(self, config):

        ds0 = config.datasources[0]

        log.debug('{0}:Start WinRM connection test.'.format(config.id))

        conn_info = createConnectionInfo(ds0)

        WinRMQueries = [
            create_enum_info(
                'select * from Win32_OperatingSystem'
            )
        ]

        winrm = EnumerateClient(conn_info)
        results = yield winrm.do_collect(WinRMQueries)

        defer.returnValue(results)
示例#5
0
    def collect(self, config):

        log.debug('{0}:Start Collection of Services'.format(config.id))

        WinRMQueries = [
            create_enum_info(
                'select name, state, status, displayname from Win32_Service'
            )
        ]

        conn_info = createConnectionInfo(config.datasources[0])

        winrm = EnumerateClient(conn_info)
        try:
            results = yield winrm.do_collect(WinRMQueries)
        except Exception as e:
            if 'referenced context has expired' in e.message:
                results = yield winrm.do_collect(WinRMQueries)
            else:
                raise

        defer.returnValue(results)
    def collect(self, config):
        conn_info = createConnectionInfo(config.datasources[0])
        client = EnumerateClient(conn_info)

        # Always query Win32_Process. This is where we get process
        # status and count.
        queries = [
            'SELECT Name, ExecutablePath, CommandLine, ProcessId '
            'FROM Win32_Process',
        ]

        # Query only for the superset of attributes needed to satisfy
        # the configured datapoints across all processes.
        perf_attrs = {p.id for s in config.datasources for p in s.points}
        if COUNT_DATAPOINT in perf_attrs:
            perf_attrs.remove(COUNT_DATAPOINT)

        # Remove invalid attributes from what we ask for. Warn the user.
        invalid_datapoints = perf_attrs.difference(VALID_DATAPOINTS)
        if invalid_datapoints:
            LOG.warn(
                "Removing invalid datapoints for %s: %s",
                config.id, ', '.join(invalid_datapoints))

            perf_attrs.difference_update(invalid_datapoints)

        # Only query Win32_PerfFormattedData_PerfProc_Process if its
        # necessary to satisfy the configured datapoints.
        if perf_attrs:
            queries.append(
                'SELECT IDProcess, {} '
                'FROM Win32_PerfFormattedData_PerfProc_Process'.format(
                    ', '.join(perf_attrs)))

        results = yield client.do_collect(
            map(txwinrm.collect.create_enum_info, queries))
        returnValue(results)
示例#7
0
    def collect(self, config):
        conn_info = createConnectionInfo(config.datasources[0])
        client = EnumerateClient(conn_info)

        # Always query Win32_Process. This is where we get process
        # status and count.
        queries = [
            'SELECT Name, ExecutablePath, CommandLine, ProcessId '
            'FROM Win32_Process',
        ]

        # Query only for the superset of attributes needed to satisfy
        # the configured datapoints across all processes.
        perf_attrs = {p.id for s in config.datasources for p in s.points}
        if COUNT_DATAPOINT in perf_attrs:
            perf_attrs.remove(COUNT_DATAPOINT)

        # Remove invalid attributes from what we ask for. Warn the user.
        invalid_datapoints = perf_attrs.difference(VALID_DATAPOINTS)
        if invalid_datapoints:
            LOG.warn("Removing invalid datapoints for %s: %s", config.id,
                     ', '.join(invalid_datapoints))

            perf_attrs.difference_update(invalid_datapoints)

        # Only query Win32_PerfFormattedData_PerfProc_Process if its
        # necessary to satisfy the configured datapoints.
        if perf_attrs:
            queries.append(
                'SELECT IDProcess, {} '
                'FROM Win32_PerfFormattedData_PerfProc_Process'.format(
                    ', '.join(perf_attrs)))

        results = yield client.do_collect(
            map(txwinrm.collect.create_enum_info, queries))
        returnValue(results)
示例#8
0
 def run_query(self, conn_info, wql, log):
     self.winrm = EnumerateClient(conn_info)
     wql = create_enum_info(wql=wql, resource_uri=self.uri)
     result = yield self.winrm.do_collect([wql])
     defer.returnValue(result)
示例#9
0
class IIS(WinRMPlugin):
    compname = 'os'
    relname = 'winrmiis'
    modname = 'ZenPacks.zenoss.Microsoft.Windows.WinIIS'

    winrm = None
    uri = 'http://schemas.microsoft.com/wbem/wsman/1/wmi/root/webadministration/*'

    queries = {
        'IIsWebServerSetting': {
            'query': "SELECT * FROM IIsWebServerSetting",
            'namespace': 'microsoftiisv2',
        },
        'IIsWebVirtualDirSetting': {
            'query': "SELECT * FROM IIsWebVirtualDirSetting",
            'namespace': 'microsoftiisv2',
        },
        'IIs7Site': {
            'query': "SELECT Name, Id, ServerAutoStart  FROM Site",
            'namespace': 'WebAdministration',
        },
    }

    iis_version = None
    powershell_commands = {
        "version":
        "$iisversion = get-itemproperty HKLM:\SOFTWARE\Microsoft\InetStp\ | select versionstring;"
        "Write-Host $iisversion.versionstring;"
    }

    @defer.inlineCallbacks
    def run_query(self, conn_info, wql, log):
        self.winrm = EnumerateClient(conn_info)
        wql = create_enum_info(wql=wql, resource_uri=self.uri)
        result = yield self.winrm.do_collect([wql])
        defer.returnValue(result)

    @defer.inlineCallbacks
    def collect(self, device, log):
        orig = WinRMPlugin()
        orig.queries = self.queries
        orig.powershell_commands = self.powershell_commands
        conn_info = self.conn_info(device)

        def send_event(msg, severity, summary=None):
            self._send_event(msg,
                             device.id,
                             severity,
                             eventClass='/Status/Winrm',
                             key='IISSites',
                             summary=summary)

        output = yield orig.collect(device, log)

        if hasattr(orig, 'error_occurred'):
            send_event(orig.error_occurred, ZenEventClasses.Error)
            defer.returnValue(None)
        else:
            msg = 'Collection completed for {}'.format(device.id)
            send_event(msg, ZenEventClasses.Clear)

        version_results = output.get('version')
        if version_results and version_results.stdout:
            # version should be in 'Version x.x' format
            # 7 and above use the same namespace/query
            try:
                self.iis_version = re.match('Version (\d\.*\d*).*',
                                            version_results.stdout[0]).group(1)
            except (IndexError, AttributeError):
                if version_results.stdout:
                    log.debug("Malformed version information on {}: {}".format(
                        device.id, version_results.stdout[0]))
                if version_results.stderr:
                    log.debug("Error retrieving IIS version on {}: {}".format(
                        device.id, version_results.stderr))

        IIs7Sites = output.get('IIs7Site', ())
        if not self.iis_version:
            if IIs7Sites:
                self.iis_version = '7'
            else:
                self.iis_version = '6'

        for iisSite in IIs7Sites:
            name = iisSite.Name
            query = 'ASSOCIATORS OF {Site.Name="%s"} WHERE ResultClass=Application' % name
            result = yield self.run_query(conn_info, query, log)
            try:
                apps = result.values()[0][0]
                pool = apps.ApplicationPool
            except IndexError:
                pool = 'Unknown'
            iisSite.ApplicationPool = pool
        if not output.get('IIs7Site') and not output.get(
                'IIsWebServerSetting'):
            msg = 'No IIS sites found on {}. Ensure that IIS Management Scripts'\
                ' and Tools have been installed.'.format(device.id)
            log.warn(msg)
            send_event(msg, ZenEventClasses.Warning, summary=msg)
        else:
            msg = "Found IIS sites on {}.".format(device.id)
            send_event(msg, ZenEventClasses.Clear)
        defer.returnValue(output)

    @save
    def process(self, device, results, log):
        log.info("Modeler %s processing data for device %s", self.name(),
                 device.id)

        device_om = ObjectMap()
        device_om.is_iis = False
        maps = [device_om]
        rm = self.relMap()
        if results.get('IIsWebServerSetting'):
            device_om.is_iis = True
            for iisSite in results.get('IIsWebServerSetting', ()):
                om = self.objectMap()
                om.id = self.prepId(iisSite.Name)
                if float(self.iis_version) == 6:
                    om.statusname = iisSite.Name
                else:
                    om.statusname = iisSite.ServerComment
                om.title = iisSite.ServerComment
                om.iis_version = self.iis_version
                om.sitename = iisSite.ServerComment  # Default Web Site
                if hasattr(
                        iisSite,
                        'AppPoolId'):  # ZPS-5407 Can't get DefaultAppPool name
                    om.apppool = iisSite.AppPoolId
                elif hasattr(iisSite, 'ApplicationPool'
                             ):  # ZPS-5407 Can't get DefaultAppPool name
                    om.apppool = iisSite.ApplicationPool

                for iisVirt in results.get('IIsWebVirtualDirSetting', ()):
                    if (iisVirt.Name == iisSite.Name +
                            "/ROOT") or (iisVirt.Name
                                         == iisSite.Name + "/root"):
                        if iisVirt.AppPoolId is not None and iisVirt.AppPoolId != 'None':  # ZPS-5407 Can't get DefaultAppPool name
                            om.apppool = iisVirt.AppPoolId

                rm.append(om)
        elif results.get('IIs7Site', False):
            device_om.is_iis = True
            for iisSite in results.get('IIs7Site', ()):
                try:
                    om = self.objectMap()
                    om.id = self.prepId(iisSite.Id)
                    om.title = om.statusname = om.sitename = iisSite.Name
                    om.iis_version = self.iis_version
                    om.apppool = iisSite.ApplicationPool
                    rm.append(om)
                except AttributeError:
                    pass

        maps.append(rm)
        return maps
 def run_query(self, conn_info, wql, log):
     self.winrm = EnumerateClient(conn_info)
     wql = create_enum_info(wql=wql, resource_uri=self.uri)
     result = yield self.winrm.do_collect([wql])
     defer.returnValue(result)
class IIS(WinRMPlugin):
    compname = 'os'
    relname = 'winrmiis'
    modname = 'ZenPacks.zenoss.Microsoft.Windows.WinIIS'

    winrm = None
    uri = 'http://schemas.microsoft.com/wbem/wsman/1/wmi/root/webadministration/*'

    queries = {
        'IIsWebServerSetting': {
            'query': "SELECT * FROM IIsWebServerSetting",
            'namespace': 'microsoftiisv2',
        },

        'IIsWebVirtualDirSetting': {
            'query': "SELECT * FROM IIsWebVirtualDirSetting",
            'namespace': 'microsoftiisv2',
        },

        'IIs7Site': {
            'query': "SELECT Name, Id, ServerAutoStart  FROM Site",
            'namespace': 'WebAdministration',
        },
    }

    iis_version = None
    powershell_commands = {"version": "$iisversion = get-itemproperty HKLM:\SOFTWARE\Microsoft\InetStp\ | select versionstring;"
                           "Write-Host $iisversion.versionstring;"}

    @defer.inlineCallbacks
    def run_query(self, conn_info, wql, log):
        self.winrm = EnumerateClient(conn_info)
        wql = create_enum_info(wql=wql, resource_uri=self.uri)
        result = yield self.winrm.do_collect([wql])
        defer.returnValue(result)

    @defer.inlineCallbacks
    def collect(self, device, log):
        orig = WinRMPlugin()
        orig.queries = self.queries
        orig.powershell_commands = self.powershell_commands
        conn_info = self.conn_info(device)

        def send_event(msg, severity, summary=None):
            self._send_event(msg,
                             device.id,
                             severity,
                             eventClass='/Status/Winrm',
                             key='IISSites',
                             summary=summary)

        output = yield orig.collect(device, log)

        if hasattr(orig, 'error_occurred'):
            send_event(orig.error_occurred, ZenEventClasses.Error)
            defer.returnValue(None)
        else:
            msg = 'Collection completed for {}'.format(device.id)
            send_event(msg, ZenEventClasses.Clear)

        version_results = output.get('version')
        if version_results and version_results.stdout:
            # version should be in 'Version x.x' format
            # 7 and above use the same namespace/query
            try:
                self.iis_version = re.match('Version (\d\.*\d*).*', version_results.stdout[0]).group(1)
            except (IndexError, AttributeError):
                if version_results.stdout:
                    log.debug("Malformed version information on {}: {}".format(device.id, version_results.stdout[0]))
                if version_results.stderr:
                    log.debug("Error retrieving IIS version on {}: {}".format(device.id, version_results.stderr))

        IIs7Sites = output.get('IIs7Site', ())
        if not self.iis_version:
            if IIs7Sites:
                self.iis_version = '7'
            else:
                self.iis_version = '6'

        for iisSite in IIs7Sites:
            name = iisSite.Name
            query = 'ASSOCIATORS OF {Site.Name="%s"} WHERE ResultClass=Application' % name
            result = yield self.run_query(conn_info, query, log)
            try:
                apps = result.values()[0][0]
                pool = apps.ApplicationPool
            except IndexError:
                pool = 'Unknown'
            iisSite.ApplicationPool = pool
        if not output.get('IIs7Site') and not output.get('IIsWebServerSetting'):
            msg = 'No IIS sites found on {}. Ensure that IIS Management Scripts'\
                ' and Tools have been installed.'.format(device.id)
            log.warn(msg)
            send_event(msg, ZenEventClasses.Warning, summary=msg)
        else:
            msg = "Found IIS sites on {}.".format(device.id)
            send_event(msg, ZenEventClasses.Clear)
        defer.returnValue(output)

    @save
    def process(self, device, results, log):
        log.info(
            "Modeler %s processing data for device %s",
            self.name(), device.id)

        device_om = ObjectMap()
        device_om.is_iis = False
        maps = [device_om]
        rm = self.relMap()
        if results.get('IIsWebServerSetting'):
            device_om.is_iis = True
            for iisSite in results.get('IIsWebServerSetting', ()):
                om = self.objectMap()
                om.id = self.prepId(iisSite.Name)
                if float(self.iis_version) == 6:
                    om.statusname = iisSite.Name
                else:
                    om.statusname = iisSite.ServerComment
                om.title = iisSite.ServerComment
                om.iis_version = self.iis_version
                om.sitename = iisSite.ServerComment  # Default Web Site
                if hasattr(iisSite, 'AppPoolId'):  # ZPS-5407 Can't get DefaultAppPool name
                    om.apppool = iisSite.AppPoolId
                elif hasattr(iisSite, 'ApplicationPool'): # ZPS-5407 Can't get DefaultAppPool name
                    om.apppool = iisSite.ApplicationPool

                for iisVirt in results.get('IIsWebVirtualDirSetting', ()):
                    if (iisVirt.Name == iisSite.Name + "/ROOT") or (iisVirt.Name == iisSite.Name + "/root"):
                        if iisVirt.AppPoolId is not None and iisVirt.AppPoolId != 'None': # ZPS-5407 Can't get DefaultAppPool name
                            om.apppool = iisVirt.AppPoolId

                rm.append(om)
        elif results.get('IIs7Site', False):
            device_om.is_iis = True
            for iisSite in results.get('IIs7Site', ()):
                try:
                    om = self.objectMap()
                    om.id = self.prepId(iisSite.Id)
                    om.title = om.statusname = om.sitename = iisSite.Name
                    om.iis_version = self.iis_version
                    om.apppool = iisSite.ApplicationPool
                    rm.append(om)
                except AttributeError:
                    pass

        maps.append(rm)
        return maps
 def client(self, conn_info=None):
     """Return an EnumerateClient if conn_info exists
     """
     if not conn_info:
         return txwinrm.collect.WinrmCollectClient()
     return EnumerateClient(conn_info)