def remove_corrupt_counters(self):
        '''
        Remove counters which return an error.
        '''
        LOG.debug('Performing check for corrupt counters')
        dsconf0 = self.config.datasources[0]
        winrs = create_single_shot_command(createConnectionInfo(dsconf0))

        counter_list = sorted(
            set(self.ps_counter_map.keys())-set(CORRUPT_COUNTERS[dsconf0.device]))
        corrupt_counters = yield self.search_corrupt_counters(winrs, counter_list, [])

        # Add newly found corrupt counters to the previously checked ones.
        if corrupt_counters:
            CORRUPT_COUNTERS[dsconf0.device].extend(corrupt_counters)

        # Remove the error counters from the counter map.
        for counter in CORRUPT_COUNTERS[dsconf0.device]:
            if self.ps_counter_map.get(counter):
                LOG.debug("Counter '{0}' not found. Removing".format(counter))
                del self.ps_counter_map[counter]

        # Rebuild the command.
        self._build_commandlines()

        defer.returnValue(None)
Ejemplo n.º 2
0
    def remove_corrupt_counters(self):
        '''
        Remove counters which return an error.
        '''
        LOG.debug('Performing check for corrupt counters')
        dsconf0 = self.config.datasources[0]
        winrs = create_single_shot_command(createConnectionInfo(dsconf0))

        counter_list = sorted(
            set(self.ps_counter_map.keys()) -
            set(CORRUPT_COUNTERS[dsconf0.device]))
        corrupt_counters = yield self.search_corrupt_counters(
            winrs, counter_list, [])

        # Add newly found corrupt counters to the previously checked ones.
        if corrupt_counters:
            CORRUPT_COUNTERS[dsconf0.device].extend(corrupt_counters)

        # Remove the error counters from the counter map.
        for counter in CORRUPT_COUNTERS[dsconf0.device]:
            if self.ps_counter_map.get(counter):
                LOG.debug("Counter '{0}' not found. Removing".format(counter))
                del self.ps_counter_map[counter]

        # Rebuild the command.
        self._build_commandlines()

        defer.returnValue(None)
    def _execute_command(self, device, command):
        """
        Create WinRS client and run the command remotely.
        """
        winrs = create_single_shot_command(self._conn_info(device))
        result = winrs.run_command(str(command))

        result.addCallback(lambda res: self._on_success(device, res, command))
        result.addErrback(lambda err: self._on_error(device, err))
Ejemplo n.º 4
0
    def _execute_command(self, device, command):
        """
        Create WinRS client and run the command remotely.
        """
        winrs = create_single_shot_command(self._conn_info(device))
        result = winrs.run_command(str(command))

        result.addCallback(lambda res: self._on_success(device, res, command))
        result.addErrback(lambda err: self._on_error(device, err))
 def __init__(self, conn_info):
     self.winrs = create_single_shot_command(conn_info)
Ejemplo n.º 6
0
    def collect(self, device, log):

        maps = {}

        conn_info = self.conn_info(device)
        winrs = create_single_shot_command(conn_info)

        # Collection for cluster nodes
        pscommand = "powershell -NoLogo -NonInteractive -NoProfile " \
            "-OutputFormat TEXT -Command "

        psClusterCommands = []
        psClusterCommands.append("import-module failoverclusters;")

        psClusterHosts = []
        psClusterHosts.append(
            "$domain='.' + (gwmi WIN32_ComputerSystem).Domain;")
        psClusterHosts.append("get-clusternode | foreach {$_.Name + $domain};")

        command = "{0} \"& {{{1}}}\"".format(
            pscommand, ''.join(psClusterCommands + psClusterHosts))

        clusternodes = winrs.run_command(command)
        clusternode = yield clusternodes

        # Collection for cluster groups
        psResources = []
        clustergroupitems = ('$_.Name', '$_.IsCoreGroup', '$_.OwnerNode',
                             '$_.State', '$_.Description', '$_.Id',
                             '$_.Priority')

        psResources.append('get-clustergroup | foreach {{{0}}};'.format(
            " + '|' + ".join(clustergroupitems)))

        command = "{0} \"& {{{1}}}\"".format(
            pscommand, ''.join(psClusterCommands + psResources))

        resources = winrs.run_command(command)
        resource = yield resources

        # Collection for cluster applications

        psApplications = []
        clusterappitems = ('$_.Name', '$_.OwnerGroup', '$_.OwnerNode',
                           '$_.State', '$_.Description')
        # For some reason if I add the $_.Id the data is returned corrupted.

        psApplications.append('get-clusterresource | foreach {{{0}}};'.format(
            " + '|' + ".join(clusterappitems)))

        command = "{0} \"& {{{1}}}\"".format(
            pscommand, ''.join(psClusterCommands + psApplications))

        clusterapps = winrs.run_command(command)
        clusterapp = yield clusterapps

        maps['apps'] = clusterapp.stdout
        maps['resources'] = resource.stdout
        maps['nodes'] = clusternode.stdout

        defer.returnValue(maps)
 def __init__(self, conn_info):
     self.winrs = create_single_shot_command(conn_info)
Ejemplo n.º 8
0
    def collect(self, device, log):

        # Sample data for zDBInstanceLogin
        # MSSQLSERVER;ZenossInstance2
        # Sample data for zDBInstancePassword
        # sa:Sup3rPa$$;sa:WRAAgf4234@#$

        dbinstance = device.zDBInstances
        dbinstancepassword = device.zDBInstancesPassword
        password = device.zWinRMPassword

        dblogins = {}
        eventmessage = 'Error parsing zDBInstances or zDBInstancesPassword'
        try:
            if len(dbinstance) > 0 and len(dbinstancepassword) > 0:
                arrInstance = dbinstance.split(';')
                arrPassword = dbinstancepassword.split(';')
                i = 0
                for instance in arrInstance:
                    dbuser, dbpass = arrPassword[i].split(':', 1)
                    i = i + 1
                    dblogins[instance] = {
                        'username': dbuser,
                        'password': dbpass
                    }
            else:
                arrInstance = dbinstance.split(';')
                for instance in arrInstance:
                    dblogins[instance] = {
                        'username': '******',
                        'password': password
                    }
                    results = {'clear': eventmessage}

        except (IndexError, ValueError):
            # Error with dbinstance names or password
            results = {'error': eventmessage}
            defer.returnValue(results)

        conn_info = self.conn_info(device)
        winrs = create_single_shot_command(conn_info)

        #sqlserver = 'SQL1\ZENOSSINSTANCE2'
        #sqlusername = '******'
        #sqlpassword = '******'

        # Base command line setup for powershell
        pscommand = "powershell -NoLogo -NonInteractive -NoProfile " \
            "-OutputFormat TEXT -Command "

        psInstances = []

        psInstances.append("$hostname=hostname;")

        # Get registry key for instances
        # 32/64 Bit 2008
        psInstances.append(
            "if (get-itemproperty \'HKLM:\Software\Wow6432Node\Microsoft\Microsoft SQL Server\')"
        )
        psInstances.append(
            "{$instances = get-itemproperty \'HKLM:\Software\Wow6432Node\Microsoft\Microsoft SQL Server\';}"
        )

        # 2003
        psInstances.append(
            "if (get-itemproperty \'HKLM:\Software\Microsoft\Microsoft SQL Server\')"
        )
        psInstances.append(
            "{$instances = get-itemproperty \'HKLM:\Software\Microsoft\Microsoft SQL Server\';}"
        )

        psInstances.append(
            "$instances.InstalledInstances | foreach {write-host \"instances:\"$_};"
        )
        psInstances.append("write-host \"hostname:\"$hostname;")

        command = "{0} \"& {{{1}}}\"".format(pscommand, ''.join(psInstances))

        dbinstances = winrs.run_command(command)
        instances = yield dbinstances
        maps = {}
        instance_oms = []
        database_oms = []
        backup_oms = []
        jobs_oms = []
        server_config = {}
        sqlhostname = ''

        for serverconfig in instances.stdout:
            key, value = serverconfig.split(':', 1)
            serverlist = []
            if key in server_config:
                serverlist = server_config[key]
                serverlist.append(value.strip())
                server_config[key] = serverlist
            else:
                serverlist.append(value.strip())
                server_config[key] = serverlist

        if server_config['instances'][0] == '':
            eventmessage = 'No MSSQL Servers are installed but modeler is enabled'
            results = {'error': eventmessage}
            defer.returnValue(results)

        sqlhostname = server_config['hostname'][0]
        for instance in server_config['instances']:

            if instance not in dblogins:
                log.info(
                    "DB Instance {0} found but was not set in zDBInstances".
                    format(instance))
                continue

            om_instance = ObjectMap()
            om_instance.id = self.prepId(instance)
            om_instance.title = instance
            om_instance.instancename = instance
            instance_oms.append(om_instance)
            if instance in dblogins:
                sqlConnection = []

                if instance == 'MSSQLSERVER':
                    sqlserver = sqlhostname
                else:
                    sqlserver = '{0}\{1}'.format(sqlhostname, instance)

                sqlusername = dblogins[instance]['username']
                sqlpassword = dblogins[instance]['password']

                # DB Connection Object
                sqlConnection.append("$con = new-object " \
                    "('Microsoft.SqlServer.Management.Common.ServerConnection')" \
                    "'{0}', '{1}', '{2}';".format(sqlserver, sqlusername, sqlpassword))

                sqlConnection.append("$con.Connect();")

                # Connect to Database Server
                sqlConnection.append("$server = new-object " \
                    "('Microsoft.SqlServer.Management.Smo.Server') $con;")

                db_sqlConnection = []
                # Get database information
                db_sqlConnection.append('$server.Databases | foreach {' \
                    'write-host \"Name---\" $_,' \
                    '\"`tVersion---\" $_.Version,' \
                    '\"`tIsAccessible---\" $_.IsAccessible,' \
                    '\"`tID---\" $_.ID,' \
                    '\"`tOwner---\" $_.Owner,' \
                    '\"`tLastBackupDate---\" $_.LastBackupDate,'\
                    '\"`tCollation---\" $_.Collation,'\
                    '\"`tCreateDate---\" $_.CreateDate,'\
                    '\"`tDefaultFileGroup---\" $_.DefaultFileGroup,'\
                    '\"`tPrimaryFilePath---\" $_.PrimaryFilePath,'\
                    '\"`tLastLogBackupDate---\" $_.LastLogBackupDate' \
                    '};')

                command = "{0} \"& {{{1}}}\"".format(
                    pscommand, ''.join(getSQLAssembly() + sqlConnection +
                                       db_sqlConnection))
                instancedatabases = winrs.run_command(command)
                databases = yield instancedatabases
                for dbobj in databases.stdout:
                    db = dbobj.split('\t')
                    dbdict = {}

                    for dbitem in db:
                        try:
                            key, value = dbitem.split('---')
                            dbdict[key.lower()] = value.strip()
                        except (ValueError):
                            log.info(
                                'Error parsing returned values : {0}'.format(
                                    dbitem))

                    if dbdict['lastlogbackupdate'][:8] == '1/1/0001':
                        lastlogbackupdate = None
                    else:
                        lastlogbackupdate = dbdict['lastlogbackupdate']

                    if dbdict['lastbackupdate'][:8] == '1/1/0001':
                        lastbackupdate = None
                    else:
                        lastbackupdate = dbdict['lastbackupdate']

                    om_database = ObjectMap()
                    om_database.id = self.prepId(instance + dbdict['id'])
                    om_database.title = dbdict['name'][1:-1]
                    om_database.instancename = om_instance.id
                    om_database.version = dbdict['version']
                    om_database.owner = dbdict['owner']
                    om_database.lastbackupdate = lastbackupdate
                    om_database.lastlogbackupdate = lastlogbackupdate
                    om_database.isaccessible = dbdict['isaccessible']
                    om_database.collation = dbdict['collation']
                    om_database.createdate = str(dbdict['createdate'])
                    om_database.defaultfilegroup = dbdict['defaultfilegroup']
                    om_database.primaryfilepath = dbdict['primaryfilepath']

                    database_oms.append(om_database)

                # Get SQL Backup Jobs information
                backup_sqlConnection = []
                # Get database information
                backup_sqlConnection.append('$server.BackupDevices | foreach {' \
                    'write-host \"Name---\" $_.Name,' \
                    '\"`tDeviceType---\" $_.BackupDeviceType,' \
                    '\"`tPhysicalLocation---\" $_.PhysicalLocation,' \
                    '\"`tStatus---\" $_.State' \
                    '};')

                command = "{0} \"& {{{1}}}\"".format(
                    pscommand, ''.join(getSQLAssembly() + sqlConnection +
                                       backup_sqlConnection))

                backuplist = winrs.run_command(command)
                backups = yield backuplist
                for backupobj in backups.stdout:
                    backup = backupobj.split('\t')
                    backupdict = {}

                    for backupitem in backup:
                        key, value = backupitem.split('---')
                        backupdict[key.lower()] = value.strip()

                    om_backup = ObjectMap()
                    om_backup.id = self.prepId(instance + backupdict['name'])
                    om_backup.title = backupdict['name']
                    om_backup.devicetype = backupdict['devicetype']
                    om_backup.physicallocation = backupdict['physicallocation']
                    om_backup.status = backupdict['status']
                    om_backup.instancename = om_instance.id
                    backup_oms.append(om_backup)

                # Get SQL Jobs information
                jobsquery = "select s.name as jobname, s.job_id as jobid, " \
                "s.enabled as enabled, s.date_created as datecreated, " \
                "s.description as description, l.name as username from " \
                "msdb..sysjobs s left join master.sys.syslogins l on s.owner_sid = l.sid"

                job_sqlConnection = []
                job_sqlConnection.append("$db = $server.Databases[0];")
                job_sqlConnection.append(
                    "$ds = $db.ExecuteWithResults('{0}');".format(jobsquery))
                job_sqlConnection.append('$ds.Tables | Format-List;')

                command = "{0} \"& {{{1}}}\"".format(
                    pscommand, ''.join(getSQLAssembly() + sqlConnection +
                                       job_sqlConnection))

                jobslist = winrs.run_command(command)
                jobs = yield jobslist
                for job in jobs.stdout:
                    key, value = job.split(':', 1)
                    if key.strip() == 'jobname':
                        #New Job Record
                        om_jobs = ObjectMap()
                        om_jobs.instancename = om_instance.id
                        om_jobs.title = value.strip()
                    else:
                        if key.strip() == 'jobid':
                            om_jobs.jobid = value.strip()
                            om_jobs.id = self.prepId(om_jobs.jobid)
                        elif key.strip() == 'enabled':
                            om_jobs.enabled = value.strip()
                        elif key.strip() == 'description':
                            om_jobs.description = value.strip()
                        elif key.strip() == 'datecreated':
                            om_jobs.datecreated = str(value)
                        elif key.strip() == 'username':
                            om_jobs.username = value.strip()
                            jobs_oms.append(om_jobs)

        maps['clear'] = eventmessage
        maps['databases'] = database_oms
        maps['instances'] = instance_oms
        maps['backups'] = backup_oms
        maps['jobs'] = jobs_oms

        defer.returnValue(maps)
    def collect(self, config):
        dsconf0 = config.datasources[0]
        conn_info = createConnectionInfo(dsconf0)

        strategy = queryUtility(IStrategy, dsconf0.params['strategy'])

        if not strategy:
            raise WindowsShellException("No strategy chosen for {0}".format(
                dsconf0.datasource))

        counters = [dsconf.params['resource'] for dsconf in config.datasources]

        if dsconf0.params['strategy'] == 'powershell MSSQL':
            dbinstances = dsconf0.zDBInstances
            username = dsconf0.windows_user
            password = dsconf0.windows_password

            dblogins, login_as_user = parseDBUserNamePass(
                dbinstances, username, password)

            instance = dsconf0.params['instancename']
            dbname = dsconf0.params['contexttitle']
            try:
                instance_login = dblogins[instance]
            except KeyError:
                raise WindowsShellException(
                    "zDBInstances don't contain credentials for %s" % instance)

            if instance == 'MSSQLSERVER':
                sqlserver = dsconf0.config_key
            else:
                sqlserver = '{0}\{1}'.format(dsconf0.sqlhostname, instance)

            # Use the owner node's hostname to get monitoring data for
            # databases of network instances for cluster devices.
            if dsconf0.cluster_node_server:
                owner_node, server = dsconf0.cluster_node_server.split('//')
                if owner_node:
                    conn_info = conn_info._replace(hostname=owner_node)
                    sqlserver = server

            command_line = strategy.build_command_line(
                counters,
                sqlserver=sqlserver,
                sqlusername=instance_login['username'],
                sqlpassword=instance_login['password'],
                database=dbname,
                login_as_user=login_as_user)

        elif dsconf0.params['strategy'] in ('powershell Cluster Services'
                                            'powershell Cluster Resources'):

            resource = dsconf0.params['contexttitle']
            if not resource:
                return
            componenttype = dsconf0.params['resource']
            command_line = strategy.build_command_line(resource, componenttype)

        elif dsconf0.params['strategy'] == 'Custom Command':
            check_datasource(dsconf0)
            script = dsconf0.params['script']
            usePowershell = dsconf0.params['usePowershell']
            command_line = strategy.build_command_line(script, usePowershell)

        else:
            command_line = strategy.build_command_line(counters)

        command = create_single_shot_command(conn_info)
        try:
            results = yield command.run_command(command_line)
        except UnauthorizedError:
            results = ShellResult()
        except Exception, e:
            if "Credentials cache file" in str(e):
                results = ShellResult()
                results.stderr = ['Credentials cache file not found']
            else:
                raise e
    def collect(self, device, log):

        maps = {}

        conn_info = self.conn_info(device)
        winrs = create_single_shot_command(conn_info)

        # Collection for cluster nodes
        pscommand = "powershell -NoLogo -NonInteractive -NoProfile " \
            "-OutputFormat TEXT -Command "

        psClusterCommands = []
        psClusterCommands.append("import-module failoverclusters;")

        psClusterHosts = []
        psClusterHosts.append("$domain='.' + (gwmi WIN32_ComputerSystem).Domain;")
        psClusterHosts.append("get-clusternode | foreach {$_.Name + $domain};")

        command = "{0} \"& {{{1}}}\"".format(
            pscommand,
            ''.join(psClusterCommands + psClusterHosts))

        clusternodes = winrs.run_command(command)
        clusternode = yield clusternodes

        # Collection for cluster groups
        psResources = []
        clustergroupitems = ('$_.Name', '$_.IsCoreGroup', '$_.OwnerNode', '$_.State',
            '$_.Description', '$_.Id', '$_.Priority')

        psResources.append('get-clustergroup | foreach {{{0}}};'.format(
            " + '|' + ".join(clustergroupitems)
            ))

        command = "{0} \"& {{{1}}}\"".format(
            pscommand,
            ''.join(psClusterCommands + psResources))

        resources = winrs.run_command(command)
        resource = yield resources

        # Collection for cluster applications

        psApplications = []
        clusterappitems = ('$_.Name', '$_.OwnerGroup', '$_.OwnerNode', '$_.State',
            '$_.Description')
        # For some reason if I add the $_.Id the data is returned corrupted.

        psApplications.append('get-clusterresource | foreach {{{0}}};'.format(
            " + '|' + ".join(clusterappitems)
            ))

        command = "{0} \"& {{{1}}}\"".format(
            pscommand,
            ''.join(psClusterCommands + psApplications))

        clusterapps = winrs.run_command(command)
        clusterapp = yield clusterapps

        maps['apps'] = clusterapp.stdout
        maps['resources'] = resource.stdout
        maps['nodes'] = clusternode.stdout

        defer.returnValue(maps)
    def collect(self, config):
        dsconf0 = config.datasources[0]
        conn_info = createConnectionInfo(dsconf0)

        strategy = queryUtility(IStrategy, dsconf0.params['strategy'])

        if not strategy:
            raise WindowsShellException(
                "No strategy chosen for {0}".format(dsconf0.datasource)
            )

        counters = [dsconf.params['resource'] for dsconf in config.datasources]

        if dsconf0.params['strategy'] == 'powershell MSSQL':
            dbinstances = dsconf0.zDBInstances
            username = dsconf0.windows_user
            password = dsconf0.windows_password
            dblogins = parseDBUserNamePass(
                dbinstances, username, password
            )

            instance = dsconf0.params['instancename']
            try:
                instance_login = dblogins[instance]
            except KeyError:
                log.debug("zDBInstances does not contain credentials for %s.  " \
                          "Using default credentials" % instance
                )
                try:
                    instance_login = dblogins['MSSQLSERVER']
                except KeyError:
                    instance_login = {'username':dsconf0.windows_user, \
                                      'password':dsconf0.windows_password,
                                      'login_as_user':True}
                 
            if instance == 'MSSQLSERVER':
                instance_name = dsconf0.sqlhostname
            else:
                instance_name = '{0}\{1}'.format(dsconf0.sqlhostname, instance)

            if dsconf0.cluster_node_server:
                owner_node, server = dsconf.cluster_node_server.split('//')
                if owner_node:
                    conn_info = conn_info._replace(hostname=owner_node)
                    instance_name = server
                else:
                    if instance == 'MSSQLSERVER':
                        instance_name = dsconf0.sqlhostname
                    else:
                        instance_name = '{0}\{1}'.format(dsconf0.sqlhostname, instance)

            command_line = strategy.build_command_line(
                instance=instance_name,
                sqlusername=instance_login['username'],
                sqlpassword=instance_login['password'],
                login_as_user=instance_login['login_as_user'],
                is_cluster=True if owner_node else False)


        elif dsconf0.params['strategy'] in ('powershell Cluster Services'
                'powershell Cluster Resources'):

            resource = dsconf0.params['contexttitle']
            if not resource:
                return
            componenttype = dsconf0.params['resource']
            command_line = strategy.build_command_line(resource, componenttype)

        elif dsconf0.params['strategy'] == 'Custom Command':
            check_datasource(dsconf0)
            script = dsconf0.params['script']
            usePowershell = dsconf0.params['usePowershell']
            command_line = strategy.build_command_line(script, usePowershell)
        elif dsconf0.params['strategy'] == 'DCDiag':
            testparms = [dsconf.params['script'] for dsconf in config.datasources if dsconf.params['script']]
            command_line = strategy.build_command_line(counters, testparms)
        else:
            command_line = strategy.build_command_line(counters)

        command = create_single_shot_command(conn_info)
        try:
            results = yield command.run_command(command_line)
        except UnauthorizedError:
            results = ShellResult()
        except Exception, e:
            if "Credentials cache file" in str(e):
                results = ShellResult()
                results.stderr = ['Credentials cache file not found']
            else:
                raise e
    def collect(self, device, log):

        # Sample data for zDBInstanceLogin
        # MSSQLSERVER;ZenossInstance2
        # Sample data for zDBInstancePassword
        # sa:Sup3rPa$$;sa:WRAAgf4234@#$

        dbinstance = device.zDBInstances
        dbinstancepassword = device.zDBInstancesPassword
        password = device.zWinRMPassword

        dblogins = {}
        eventmessage = 'Error parsing zDBInstances or zDBInstancesPassword'
        try:
            if len(dbinstance) > 0 and len(dbinstancepassword) > 0:
                arrInstance = dbinstance.split(';')
                arrPassword = dbinstancepassword.split(';')
                i = 0
                for instance in arrInstance:
                    dbuser, dbpass = arrPassword[i].split(':', 1)
                    i = i + 1
                    dblogins[instance] = {'username': dbuser, 'password': dbpass}
            else:
                arrInstance = dbinstance.split(';')
                for instance in arrInstance:
                    dblogins[instance] = {'username': '******', 'password': password}
                    results = {'clear': eventmessage}

        except (IndexError, ValueError):
            # Error with dbinstance names or password
            results = {'error': eventmessage}
            defer.returnValue(results)

        conn_info = self.conn_info(device)
        winrs = create_single_shot_command(conn_info)

        #sqlserver = 'SQL1\ZENOSSINSTANCE2'
        #sqlusername = '******'
        #sqlpassword = '******'

        # Base command line setup for powershell
        pscommand = "powershell -NoLogo -NonInteractive -NoProfile " \
            "-OutputFormat TEXT -Command "

        psInstances = []

        psInstances.append("$hostname=hostname;")

        # Get registry key for instances
        # 32/64 Bit 2008
        psInstances.append("if (get-itemproperty \'HKLM:\Software\Wow6432Node\Microsoft\Microsoft SQL Server\')")
        psInstances.append("{$instances = get-itemproperty \'HKLM:\Software\Wow6432Node\Microsoft\Microsoft SQL Server\';}")

        # 2003
        psInstances.append("if (get-itemproperty \'HKLM:\Software\Microsoft\Microsoft SQL Server\')")
        psInstances.append("{$instances = get-itemproperty \'HKLM:\Software\Microsoft\Microsoft SQL Server\';}")

        psInstances.append("$instances.InstalledInstances | foreach {write-host \"instances:\"$_};")
        psInstances.append("write-host \"hostname:\"$hostname;")

        command = "{0} \"& {{{1}}}\"".format(
            pscommand,
            ''.join(psInstances))

        dbinstances = winrs.run_command(command)
        instances = yield dbinstances
        maps = {}
        instance_oms = []
        database_oms = []
        backup_oms = []
        jobs_oms = []
        server_config = {}
        sqlhostname = ''

        for serverconfig in instances.stdout:
            key, value = serverconfig.split(':', 1)
            serverlist = []
            if key in server_config:
                serverlist = server_config[key]
                serverlist.append(value.strip())
                server_config[key] = serverlist
            else:
                serverlist.append(value.strip())
                server_config[key] = serverlist

        if server_config['instances'][0] == '':
            eventmessage = 'No MSSQL Servers are installed but modeler is enabled'
            results = {'error': eventmessage}
            defer.returnValue(results)

        sqlhostname = server_config['hostname'][0]
        for instance in server_config['instances']:

            if instance not in dblogins:
                log.info("DB Instance {0} found but was not set in zDBInstances".format(
                    instance))
                continue

            om_instance = ObjectMap()
            om_instance.id = self.prepId(instance)
            om_instance.title = instance
            om_instance.instancename = instance
            instance_oms.append(om_instance)
            if instance in dblogins:
                sqlConnection = []

                if instance == 'MSSQLSERVER':
                    sqlserver = sqlhostname
                else:
                    sqlserver = '{0}\{1}'.format(sqlhostname, instance)

                sqlusername = dblogins[instance]['username']
                sqlpassword = dblogins[instance]['password']

                # DB Connection Object
                sqlConnection.append("$con = new-object " \
                    "('Microsoft.SqlServer.Management.Common.ServerConnection')" \
                    "'{0}', '{1}', '{2}';".format(sqlserver, sqlusername, sqlpassword))

                sqlConnection.append("$con.Connect();")

                # Connect to Database Server
                sqlConnection.append("$server = new-object " \
                    "('Microsoft.SqlServer.Management.Smo.Server') $con;")

                db_sqlConnection = []
                # Get database information
                db_sqlConnection.append('$server.Databases | foreach {' \
                    'write-host \"Name---\" $_,' \
                    '\"`tVersion---\" $_.Version,' \
                    '\"`tIsAccessible---\" $_.IsAccessible,' \
                    '\"`tID---\" $_.ID,' \
                    '\"`tOwner---\" $_.Owner,' \
                    '\"`tLastBackupDate---\" $_.LastBackupDate,'\
                    '\"`tCollation---\" $_.Collation,'\
                    '\"`tCreateDate---\" $_.CreateDate,'\
                    '\"`tDefaultFileGroup---\" $_.DefaultFileGroup,'\
                    '\"`tPrimaryFilePath---\" $_.PrimaryFilePath,'\
                    '\"`tLastLogBackupDate---\" $_.LastLogBackupDate' \
                    '};')

                command = "{0} \"& {{{1}}}\"".format(
                    pscommand,
                    ''.join(getSQLAssembly() + sqlConnection + db_sqlConnection))
                instancedatabases = winrs.run_command(command)
                databases = yield instancedatabases
                for dbobj in databases.stdout:
                    db = dbobj.split('\t')
                    dbdict = {}

                    for dbitem in db:
                        try:
                            key, value = dbitem.split('---')
                            dbdict[key.lower()] = value.strip()
                        except (ValueError):
                            log.info('Error parsing returned values : {0}'.format(
                                dbitem))

                    if dbdict['lastlogbackupdate'][:8] == '1/1/0001':
                        lastlogbackupdate = None
                    else:
                        lastlogbackupdate = dbdict['lastlogbackupdate']

                    if dbdict['lastbackupdate'][:8] == '1/1/0001':
                        lastbackupdate = None
                    else:
                        lastbackupdate = dbdict['lastbackupdate']

                    om_database = ObjectMap()
                    om_database.id = self.prepId(instance + dbdict['id'])
                    om_database.title = dbdict['name'][1:-1]
                    om_database.instancename = om_instance.id
                    om_database.version = dbdict['version']
                    om_database.owner = dbdict['owner']
                    om_database.lastbackupdate = lastbackupdate
                    om_database.lastlogbackupdate = lastlogbackupdate
                    om_database.isaccessible = dbdict['isaccessible']
                    om_database.collation = dbdict['collation']
                    om_database.createdate = str(dbdict['createdate'])
                    om_database.defaultfilegroup = dbdict['defaultfilegroup']
                    om_database.primaryfilepath = dbdict['primaryfilepath']

                    database_oms.append(om_database)

                # Get SQL Backup Jobs information
                backup_sqlConnection = []
                # Get database information
                backup_sqlConnection.append('$server.BackupDevices | foreach {' \
                    'write-host \"Name---\" $_.Name,' \
                    '\"`tDeviceType---\" $_.BackupDeviceType,' \
                    '\"`tPhysicalLocation---\" $_.PhysicalLocation,' \
                    '\"`tStatus---\" $_.State' \
                    '};')

                command = "{0} \"& {{{1}}}\"".format(
                    pscommand,
                    ''.join(getSQLAssembly() + sqlConnection + backup_sqlConnection))

                backuplist = winrs.run_command(command)
                backups = yield backuplist
                for backupobj in backups.stdout:
                    backup = backupobj.split('\t')
                    backupdict = {}

                    for backupitem in backup:
                        key, value = backupitem.split('---')
                        backupdict[key.lower()] = value.strip()

                    om_backup = ObjectMap()
                    om_backup.id = self.prepId(instance + backupdict['name'])
                    om_backup.title = backupdict['name']
                    om_backup.devicetype = backupdict['devicetype']
                    om_backup.physicallocation = backupdict['physicallocation']
                    om_backup.status = backupdict['status']
                    om_backup.instancename = om_instance.id
                    backup_oms.append(om_backup)

                # Get SQL Jobs information
                jobsquery = "select s.name as jobname, s.job_id as jobid, " \
                "s.enabled as enabled, s.date_created as datecreated, " \
                "s.description as description, l.name as username from " \
                "msdb..sysjobs s left join master.sys.syslogins l on s.owner_sid = l.sid"

                job_sqlConnection = []
                job_sqlConnection.append("$db = $server.Databases[0];")
                job_sqlConnection.append("$ds = $db.ExecuteWithResults('{0}');".format(jobsquery))
                job_sqlConnection.append('$ds.Tables | Format-List;')

                command = "{0} \"& {{{1}}}\"".format(
                    pscommand,
                    ''.join(getSQLAssembly() + sqlConnection + job_sqlConnection))

                jobslist = winrs.run_command(command)
                jobs = yield jobslist
                for job in jobs.stdout:
                    key, value = job.split(':', 1)
                    if key.strip() == 'jobname':
                        #New Job Record
                        om_jobs = ObjectMap()
                        om_jobs.instancename = om_instance.id
                        om_jobs.title = value.strip()
                    else:
                        if key.strip() == 'jobid':
                            om_jobs.jobid = value.strip()
                            om_jobs.id = self.prepId(om_jobs.jobid)
                        elif key.strip() == 'enabled':
                            om_jobs.enabled = value.strip()
                        elif key.strip() == 'description':
                            om_jobs.description = value.strip()
                        elif key.strip() == 'datecreated':
                            om_jobs.datecreated = str(value)
                        elif key.strip() == 'username':
                            om_jobs.username = value.strip()
                            jobs_oms.append(om_jobs)

        maps['clear'] = eventmessage
        maps['databases'] = database_oms
        maps['instances'] = instance_oms
        maps['backups'] = backup_oms
        maps['jobs'] = jobs_oms

        defer.returnValue(maps)