Example #1
0
 def get_context_data(self, **kwargs):
     context = super(RecentChangesView, self).get_context_data(**kwargs)
     pg_collector = CollectorRun.objects.get(collector='parameter_group')
     dbi_collector = CollectorRun.objects.get(collector='db_instance')
     cf_collector = CollectorRun.objects.get(collector='config_file')
     pgs = ParameterGroup.objects.filter(run_time=pg_collector.last_run)
     dbis = DBInstance.objects.filter(run_time=dbi_collector.last_run)
     cfs = ConfigFile.objects.filter(run_time=cf_collector.last_run)
     dbi_query = DBInstance.objects.find_versions('db_instance', txn='latest')
     pgs_dict = get_sorted_dict(pgs)
     dbis_dict = get_sorted_dict(dbis)
     cfs_dict = get_sorted_dict(cfs)
     needs_restart = get_needs_restart(dbis)
     context['pgs_dict'] = pgs_dict
     context['dbis_dict'] = dbis_dict
     context['cfs_dict'] = cfs_dict
     context['needs_restart'] = get_needs_restart(dbi_query)
     return context
Example #2
0
 def get_context_data(self, **kwargs):
     context = super(RecentChangesView, self).get_context_data(**kwargs)
     pg_collector = CollectorRun.objects.get(collector='parameter_group')
     dbi_collector = CollectorRun.objects.get(collector='db_instance')
     cf_collector = CollectorRun.objects.get(collector='config_file')
     pgs = ParameterGroup.objects.filter(run_time=pg_collector.last_run)
     dbis = DBInstance.objects.filter(run_time=dbi_collector.last_run)
     cfs = ConfigFile.objects.filter(run_time=cf_collector.last_run)
     dbi_query = DBInstance.objects.find_versions('db_instance',
                                                  txn='latest')
     pgs_dict = get_sorted_dict(pgs)
     dbis_dict = get_sorted_dict(dbis)
     cfs_dict = get_sorted_dict(cfs)
     needs_restart = get_needs_restart(dbis)
     context['pgs_dict'] = pgs_dict
     context['dbis_dict'] = dbis_dict
     context['cfs_dict'] = cfs_dict
     context['needs_restart'] = get_needs_restart(dbi_query)
     return context
    def handle(self, *args, **options):
        try:
            pg_collector = CollectorRun.objects.get(
                collector='parameter_group')
            dbi_collector = CollectorRun.objects.get(collector='db_instance')
            cf_collector = CollectorRun.objects.get(collector='config_file')
            pgs = ParameterGroup.objects.filter(run_time=pg_collector.last_run)
            dbis = DBInstance.objects.filter(run_time=dbi_collector.last_run)
            cfs = ConfigFile.objects.filter(run_time=cf_collector.last_run)
            dbi_query = DBInstance.objects.find_versions('db_instance',
                                                         txn='latest')
            pgs_dict = get_sorted_dict(pgs)
            dbis_dict = get_sorted_dict(dbis)
            cfs_dict = get_sorted_dict(cfs)
            needs_restart = get_needs_restart(dbi_query)
            res = []

            res.append('Parameter Groups:')
            res.append('')
            res.append('New:')
            new_pgs = pgs_dict.get('new', [])
            if len(new_pgs) == 0:
                res.append('No new parameter groups.')
            else:
                for i, pg in enumerate(new_pgs):
                    res.append('%d. Family: %s Name: %s' %
                               ((i + 1), pg.family, pg.name))
            res.append('')
            res.append('Deleted:')
            deleted_pgs = pgs_dict.get('deleted', [])
            if len(deleted_pgs) == 0:
                res.append('No deleted parameter groups.')
            else:
                for i, pg in enumerate(deleted_pgs):
                    res.append('%d. Family: %s Name: %s' %
                               ((i + 1), pg.family, pg.name))
            res.append('')
            res.append('Changed:')
            changed_pgs = pgs_dict.get('changed', [])
            if len(changed_pgs) == 0:
                res.append('No changed parameter groups.')
            else:
                for i, pg in enumerate(changed_pgs):
                    prev = ParameterGroup.objects.previous_version(pg)
                    res.append('%d. Family: %s Name: %s' %
                               ((i + 1), pg.family, pg.name))
                    res.append('\tOLD ID: %d, NEW ID: %d' % (prev.id, pg.id))
                    res.append('\tChanged Parameters:')
                    changed_params = ParameterGroup.objects.get_changed_parameters(
                        prev, pg)
                    for param in changed_params:
                        res.append("\t- %s: %s -> %s" %
                                   (param.get('key'), param.get('old_val'),
                                    param.get('new_val')))
            res.append('')

            res.append('DB Instances:')
            res.append('')
            res.append('New:')
            new_dbis = dbis_dict.get('new', [])
            if len(new_dbis) == 0:
                res.append('No new database instances.')
            else:
                for i, dbi in enumerate(new_dbis):
                    res.append(
                        '%d. Region: %s Name: %s Endpoint: %s Port: %s' %
                        ((i + 1), dbi.region, dbi.name, dbi.endpoint,
                         dbi.port))
            res.append('')
            res.append('Deleted:')
            deleted_dbis = dbis_dict.get('deleted', [])
            if len(deleted_dbis) == 0:
                res.append('No deleted database instances.')
            else:
                for i, dbi in enumerate(deleted_dbis):
                    res.append(
                        '%d. Region: %s Name: %s Endpoint: %s Port: %s' %
                        ((i + 1), dbi.region, dbi.name, dbi.endpoint,
                         dbi.port))
            res.append('')
            res.append('Changed:')
            changed_dbis = dbis_dict.get('changed', [])
            if len(changed_dbis) == 0:
                res.append('No changed database instances.')
            else:
                for i, dbi in enumerate(changed_dbis):
                    prev = DBInstance.objects.previous_version(dbi)
                    res.append(
                        '%d. Region: %s Name: %s Endpoint: %s Port: %s' %
                        ((i + 1), dbi.region, dbi.name, dbi.endpoint,
                         dbi.port))
                    res.append('\tOLD ID: %d, NEW ID: %d' % (prev.id, dbi.id))
                    res.append('\tChanged Parameters:')
                    changed_params = DBInstance.objects.get_changed_parameters(
                        prev, dbi)
                    for param in changed_params:
                        res.append("\t- %s: %s -> %s" %
                                   (param.get('key'), param.get('old_val'),
                                    param.get('new_val')))
            res.append('')

            res.append('The following instances may need to be restarted.')
            if len(needs_restart) > 0:
                for i, dbi_tuple in enumerate(needs_restart):
                    dbi = dbi_tuple[0]
                    diff = dbi_tuple[1]
                    res.append(
                        '%d. Region: %s Name: %s Endpoint: %s Port: %s Parameter Group: %s'
                        % ((i + 1), dbi.region, dbi.name, dbi.endpoint,
                           dbi.port, dbi.parameter_group_name))
                    res.append('\tParameter Differences:')
                    for param in diff:
                        res.append(
                            "\t- %s: Parameter Group/Config File Value: %s, DB Instance Value: %s"
                            % (param.get('key'), param.get('val'),
                               param.get('dbi_val')))
            else:
                res.append('No instance needs to be restarted.')
            res.append('')

            res.append('Config Files:')
            res.append('')
            res.append('New:')
            new_cfs = cfs_dict.get('new', [])
            if len(new_cfs) == 0:
                res.append('No new config files.')
            else:
                for i, cf in enumerate(new_cfs):
                    res.append('%d. Name: %s' % ((i + 1), cf.name))
            res.append('')
            res.append('Deleted:')
            deleted_cfs = cfs_dict.get('deleted', [])
            if len(deleted_cfs) == 0:
                res.append('No deleted config files.')
            else:
                for i, cf in enumerate(deleted_cfs):
                    res.append('%d. Name: %s' % ((i + 1), cf.name))
            res.append('')
            res.append('Changed:')
            changed_cfs = cfs_dict.get('changed', [])
            if len(changed_cfs) == 0:
                res.append('No changed config files.')
            else:
                for i, cf in enumerate(changed_cfs):
                    prev = ConfigFile.objects.previous_version(cf)
                    res.append('%d. Name: %s' % ((i + 1), cf.name))
                    res.append('\tOLD ID: %d, NEW ID: %d' % (prev.id, cf.id))
                    res.append('\tChanged Parameters:')
                    changed_params = ConfigFile.objects.get_changed_parameters(
                        prev, cf)
                    for param in changed_params:
                        res.append("\t- %s: %s -> %s" %
                                   (param.get('key'), param.get('old_val'),
                                    param.get('new_val')))
            res.append('')

            subject = '%s Change Alert' % (settings.EMAIL_SUBJECT_PREFIX)
            body = '\n'.join(res)
            from_email = settings.DEFAULT_FROM_EMAIL
            to_emails = []
            for admin in settings.ADMINS:
                to_emails.append(admin[1])
            send_mail(subject,
                      body,
                      from_email,
                      to_emails,
                      fail_silently=False)
        except Exception, e:
            tb = traceback.format_exc()
            logger.error(tb)
 def handle(self, *args, **options):
     try:
         pg_collector = CollectorRun.objects.get(collector='parameter_group')
         dbi_collector = CollectorRun.objects.get(collector='db_instance')
         cf_collector = CollectorRun.objects.get(collector='config_file')
         pgs = ParameterGroup.objects.filter(run_time=pg_collector.last_run)
         dbis = DBInstance.objects.filter(run_time=dbi_collector.last_run)
         cfs = ConfigFile.objects.filter(run_time=cf_collector.last_run)
         dbi_query = DBInstance.objects.find_versions('db_instance', txn='latest')
         pgs_dict = get_sorted_dict(pgs)
         dbis_dict = get_sorted_dict(dbis)
         cfs_dict = get_sorted_dict(cfs)
         needs_restart = get_needs_restart(dbi_query)
         res = []
                 
         res.append('Parameter Groups:')
         res.append('')
         res.append('New:')
         new_pgs = pgs_dict.get('new', [])
         if len(new_pgs) == 0:
             res.append('No new parameter groups.')
         else:
             for i,pg in enumerate(new_pgs):
                 res.append('%d. Family: %s Name: %s' % ((i+1), pg.family, pg.name))
         res.append('')
         res.append('Deleted:')
         deleted_pgs = pgs_dict.get('deleted', [])
         if len(deleted_pgs) == 0:
             res.append('No deleted parameter groups.')
         else:
             for i,pg in enumerate(deleted_pgs):
                 res.append('%d. Family: %s Name: %s' % ((i+1), pg.family, pg.name))
         res.append('')
         res.append('Changed:')
         changed_pgs = pgs_dict.get('changed', [])
         if len(changed_pgs) == 0:
             res.append('No changed parameter groups.')
         else:
             for i,pg in enumerate(changed_pgs):
                 prev = ParameterGroup.objects.previous_version(pg)
                 res.append('%d. Family: %s Name: %s' % ((i+1), pg.family, pg.name))
                 res.append('\tOLD ID: %d, NEW ID: %d' % (prev.id, pg.id))
                 res.append('\tChanged Parameters:')
                 changed_params = ParameterGroup.objects.get_changed_parameters(prev, pg)
                 for param in changed_params:
                     res.append("\t- %s: %s -> %s" % (param.get('key'), param.get('old_val'), param.get('new_val')))
         res.append('')            
         
         res.append('DB Instances:')
         res.append('')
         res.append('New:')
         new_dbis = dbis_dict.get('new', [])
         if len(new_dbis) == 0:
             res.append('No new database instances.')
         else:
             for i,dbi in enumerate(new_dbis):
                 res.append('%d. Region: %s Name: %s Endpoint: %s Port: %s' % ((i+1), dbi.region, dbi.name, dbi.endpoint, dbi.port))
         res.append('')
         res.append('Deleted:')
         deleted_dbis = dbis_dict.get('deleted', [])
         if len(deleted_dbis) == 0:
             res.append('No deleted database instances.')
         else:
             for i,dbi in enumerate(deleted_dbis):
                 res.append('%d. Region: %s Name: %s Endpoint: %s Port: %s' % ((i+1), dbi.region, dbi.name, dbi.endpoint, dbi.port))
         res.append('')
         res.append('Changed:')
         changed_dbis = dbis_dict.get('changed', [])
         if len(changed_dbis) == 0:
             res.append('No changed database instances.')
         else:
             for i,dbi in enumerate(changed_dbis):
                 prev = DBInstance.objects.previous_version(dbi)
                 res.append('%d. Region: %s Name: %s Endpoint: %s Port: %s' % ((i+1), dbi.region, dbi.name, dbi.endpoint, dbi.port))
                 res.append('\tOLD ID: %d, NEW ID: %d' % (prev.id, dbi.id))
                 res.append('\tChanged Parameters:')
                 changed_params = DBInstance.objects.get_changed_parameters(prev, dbi)
                 for param in changed_params:
                     res.append("\t- %s: %s -> %s" % (param.get('key'), param.get('old_val'), param.get('new_val')))
         res.append('')
         
         res.append('The following instances may need to be restarted.')
         if len(needs_restart) > 0:
             for i,dbi_tuple in enumerate(needs_restart):
                 dbi = dbi_tuple[0]
                 diff = dbi_tuple[1]
                 res.append('%d. Region: %s Name: %s Endpoint: %s Port: %s Parameter Group: %s' % ((i+1), 
                             dbi.region, dbi.name, dbi.endpoint, dbi.port, dbi.parameter_group_name))
                 res.append('\tParameter Differences:')
                 for param in diff:
                     res.append("\t- %s: Parameter Group/Config File Value: %s, DB Instance Value: %s" % (param.get('key'), param.get('val'), param.get('dbi_val')))
         else:
             res.append('No instance needs to be restarted.')
         res.append('')
         
         res.append('Config Files:')
         res.append('')
         res.append('New:')
         new_cfs = cfs_dict.get('new', [])
         if len(new_cfs) == 0:
             res.append('No new config files.')
         else:
             for i,cf in enumerate(new_cfs):
                 res.append('%d. Name: %s' % ((i+1), cf.name))
         res.append('')
         res.append('Deleted:')
         deleted_cfs = cfs_dict.get('deleted', [])
         if len(deleted_cfs) == 0:
             res.append('No deleted config files.')
         else:
             for i,cf in enumerate(deleted_cfs):
                 res.append('%d. Name: %s' % ((i+1), cf.name))
         res.append('')
         res.append('Changed:')
         changed_cfs = cfs_dict.get('changed', [])
         if len(changed_cfs) == 0:
             res.append('No changed config files.')
         else:
             for i,cf in enumerate(changed_cfs):
                 prev = ConfigFile.objects.previous_version(cf)
                 res.append('%d. Name: %s' % ((i+1), cf.name))
                 res.append('\tOLD ID: %d, NEW ID: %d' % (prev.id, cf.id))
                 res.append('\tChanged Parameters:')
                 changed_params = ConfigFile.objects.get_changed_parameters(prev, cf)
                 for param in changed_params:
                     res.append("\t- %s: %s -> %s" % (param.get('key'), param.get('old_val'), param.get('new_val')))
         res.append('')            
         
         subject = '%s Change Alert' % (settings.EMAIL_SUBJECT_PREFIX)
         body = '\n'.join(res)
         from_email = settings.DEFAULT_FROM_EMAIL
         to_emails = []
         for admin in settings.ADMINS:
             to_emails.append(admin[1])
         send_mail(subject, body, from_email, to_emails, fail_silently=False)
     except Exception, e:
         tb = traceback.format_exc()
         logger.error(tb)
    def handle(self, *args, **options):
        if options.get('list_stats'):
            print 'Available Statistics:'
            collector_runs = CollectorRun.objects.all()
            for i, collector_run in enumerate(collector_runs):
                print '%d. %s' % (i + 1, collector_run.collector)
            sys.exit(0)

        find_type = 'normal'
        sql_conditions = {}
        try:
            stat = options.get('stat')
            stats = CollectorRun.objects.all().values_list('collector',
                                                           flat=True)
            output = options.get('output')

            since_regex = re.search('(\d+(?:\.?\d+)?)([hdwm])?',
                                    options.get('since', ''))
            if options.get('since') == 'last':
                find_type = 'last'
            elif since_regex is not None:
                num, unit = since_regex.groups()
                num = float(num)
                if unit == 'h':
                    time = datetime.now() - timedelta(hours=num)
                elif unit == 'd':
                    time = datetime.now() - timedelta(days=num)
                elif unit == 'w':
                    time = datetime.now() - timedelta(weeks=num)
                elif unit == 'm':
                    time = datetime.now() - timedelta(minutes=num)
                else:
                    time = datetime.now() - timedelta(seconds=num)
                sql_conditions['since'] = time

            if find_type == 'normal':
                pg_query = ParameterGroup.objects.all()
                dbi_query = DBInstance.objects.all()
                cf_query = ConfigFile.objects.all()
            else:
                pg_query = ParameterGroup.objects.find_versions(
                    'parameter_group', txn='latest')
                dbi_query = DBInstance.objects.find_versions('db_instance',
                                                             txn='latest')
                cf_query = ConfigFile.objects.find_versions('config_file',
                                                            txn='latest')

            if sql_conditions.get('since') is not None:
                pg_query = pg_query.filter(
                    run_time__gte=sql_conditions.get('since'))
                dbi_query = dbi_query.filter(
                    run_time__gte=sql_conditions.get('since'))
                cf_query = cf_query.filter(
                    run_time__gte=sql_conditions.get('since'))

            pg_query = pg_query.order_by('-run_time')
            dbi_query = dbi_query.order_by('-run_time')
            cf_query = cf_query.order_by('-run_time')

            if output in (
                    'text',
                    'email',
            ):
                lines = []
                if stat is None:
                    lines = self.get_lines(pg_query=pg_query,
                                           dbi_query=dbi_query,
                                           cf_query=cf_query,
                                           output=output)
                elif stat == 'parameter_group':
                    lines = self.get_lines(pg_query=pg_query, output=output)
                elif stat == 'db_instance':
                    lines = self.get_lines(dbi_query=dbi_query, output=output)
                elif stat == 'config_file':
                    lines = self.get_lines(cf_query=cf_query, output=output)

                res = '\n'.join(lines)
                if output == 'text':
                    print res
                elif output == 'email':
                    subject = '%s Report' % (settings.EMAIL_SUBJECT_PREFIX)
                    body = res
                    from_email = settings.DEFAULT_FROM_EMAIL
                    to_emails = []
                    for admin in settings.ADMINS:
                        to_emails.append(admin[1])
                    send_mail(subject,
                              body,
                              from_email,
                              to_emails,
                              fail_silently=False)
                sys.exit(0)
            if output == 'nagios':
                dbi_query = DBInstance.objects.find_versions('db_instance',
                                                             txn='latest')
                needs_restart = get_needs_restart(dbi_query)
                res = []
                if len(needs_restart) > 0:
                    res.append(
                        'The following instances may need to be restarted.')
                    for i, dbi_tuple in enumerate(needs_restart):
                        dbi = dbi_tuple[0]
                        diff = dbi_tuple[1]
                        res.append(
                            '%d. Region: %s Name: %s Endpoint: %s Port: %s Parameter Group: %s'
                            % ((i + 1), dbi.region, dbi.name, dbi.endpoint,
                               dbi.port, dbi.parameter_group_name))
                        res.append('\tParameter Differences:')
                        for param in diff:
                            res.append(
                                "\t- %s: Parameter Group/Config File Value: %s, DB Instance Value: %s"
                                % (param.get('key'), param.get('val'),
                                   param.get('dbi_val')))
                    print '\n'.join(res)
                    sys.exit(1)  #Nagios WARNING
                else:
                    res.append('OK')
                    print '\n'.join(res)
                    sys.exit(0)  #Nagios OK
        except Exception, e:
            tb = traceback.format_exc()
            logger.error(tb)
 def handle(self, *args, **options):
     if options.get('list_stats'):
         print 'Available Statistics:'
         collector_runs = CollectorRun.objects.all()
         for i,collector_run in enumerate(collector_runs):
            print '%d. %s' % (i+1, collector_run.collector)
         sys.exit(0)
 
     find_type = 'normal'
     sql_conditions = {}
     try:
         stat = options.get('stat')
         stats = CollectorRun.objects.all().values_list('collector', flat=True)
         output = options.get('output')
         
         since_regex = re.search('(\d+(?:\.?\d+)?)([hdwm])?', options.get('since', ''))
         if options.get('since') == 'last':
             find_type = 'last'
         elif since_regex is not None:
             num, unit = since_regex.groups()
             num = float(num)
             if unit == 'h':
                 time = datetime.now() - timedelta(hours=num)
             elif unit == 'd':
                 time = datetime.now() - timedelta(days=num)
             elif unit == 'w':
                 time = datetime.now() - timedelta(weeks=num)
             elif unit == 'm':
                 time = datetime.now() - timedelta(minutes=num)
             else:
                 time = datetime.now() - timedelta(seconds=num)
             sql_conditions['since'] = time
             
         if find_type == 'normal':
             pg_query = ParameterGroup.objects.all()
             dbi_query = DBInstance.objects.all()
             cf_query = ConfigFile.objects.all()
         else:
             pg_query = ParameterGroup.objects.find_versions('parameter_group', txn='latest')
             dbi_query = DBInstance.objects.find_versions('db_instance', txn='latest')
             cf_query = ConfigFile.objects.find_versions('config_file', txn='latest')
             
         if sql_conditions.get('since') is not None:
             pg_query = pg_query.filter(run_time__gte=sql_conditions.get('since'))
             dbi_query = dbi_query.filter(run_time__gte=sql_conditions.get('since'))
             cf_query = cf_query.filter(run_time__gte=sql_conditions.get('since'))
         
         pg_query = pg_query.order_by('-run_time')
         dbi_query = dbi_query.order_by('-run_time')
         cf_query = cf_query.order_by('-run_time')
         
         if output in ('text', 'email',):
             lines = []    
             if stat is None:
                 lines = self.get_lines(pg_query=pg_query, dbi_query=dbi_query, cf_query=cf_query, output=output)
             elif stat == 'parameter_group':
                 lines = self.get_lines(pg_query=pg_query, output=output)
             elif stat == 'db_instance':
                 lines = self.get_lines(dbi_query=dbi_query, output=output)
             elif stat == 'config_file':
                 lines = self.get_lines(cf_query=cf_query, output=output)
             
             res = '\n'.join(lines)    
             if output == 'text':
                 print res
             elif output == 'email':
                 subject = '%s Report' % (settings.EMAIL_SUBJECT_PREFIX)
                 body = res
                 from_email = settings.DEFAULT_FROM_EMAIL
                 to_emails = []
                 for admin in settings.ADMINS:
                     to_emails.append(admin[1])
                 send_mail(subject, body, from_email, to_emails, fail_silently=False)
             sys.exit(0)
         if output == 'nagios':
             dbi_query = DBInstance.objects.find_versions('db_instance', txn='latest')
             needs_restart = get_needs_restart(dbi_query)
             res = []
             if len(needs_restart) > 0:
                 res.append('The following instances may need to be restarted.')
                 for i,dbi_tuple in enumerate(needs_restart):
                     dbi = dbi_tuple[0]
                     diff = dbi_tuple[1]
                     res.append('%d. Region: %s Name: %s Endpoint: %s Port: %s Parameter Group: %s' % ((i+1), 
                                 dbi.region, dbi.name, dbi.endpoint, dbi.port, dbi.parameter_group_name))
                     res.append('\tParameter Differences:')
                     for param in diff:
                         res.append("\t- %s: Parameter Group/Config File Value: %s, DB Instance Value: %s" % (param.get('key'), param.get('val'), param.get('dbi_val')))
                 print '\n'.join(res)
                 sys.exit(1)     #Nagios WARNING
             else:
                 res.append('OK')
                 print '\n'.join(res)
                 sys.exit(0)     #Nagios OK
     except Exception, e:
         tb = traceback.format_exc()
         logger.error(tb)