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)