def run_zfs_remote_replication(remote_replication_id):
    try:
        rr, err = remote_replication.get_remote_replications(
            remote_replication_id)
        if err:
            raise Exception('Could not fetch replication details: %s' % err)
        replication = rr[0]
        mode = replication['mode']
        if mode == 'zfs':
            now_local_epoch, err = datetime_utils.get_epoch(when='now')
            if err:
                raise Exception(err)
            now_local_str, err = datetime_utils.convert_from_epoch(
                now_local_epoch, return_format='str', str_format='%Y%m%d%H%M', to='local')
            if err:
                raise Exception(err)

            source_dataset = replication['zfs'][0]['source_dataset']
            ret, err = zfs.create_snapshot(
                source_dataset, 'zrr_%s_%s' % (remote_replication_id, now_local_str))
            if err:
                raise Exception(err)
            ret, err = remote_replication.run_zfs_remote_replication(
                remote_replication_id)
            if err:
                raise Exception(err)
        else:
            raise Exception('Invalid remote replication mode')

    except Exception, e:
        return False, 'Error adding ZFS remote replication task : %s' % e
Esempio n. 2
0
def _get_repeat_entry(alert_dict, past_x_seconds=900):
    """Check the db to see if the passed alert is a repeat of an existing alert entry in the past x seconds

    """
    result = None
    try:
        db_path, err = config.get_db_path()
        if err:
            raise Exception(err)
        now, err = datetime_utils.get_epoch(when='now', num_previous_days=0)
        if alert_dict['component']:
            query = "select * from alerts where severity_type_id = '%d' and subsystem_type_id = '%d' and component = '%s' and alert_str=\"%s\" and  first_alert_time >= %d;" % (
                alert_dict['severity_type_id'],
                alert_dict['subsystem_type_id'], alert_dict['component'],
                alert_dict['alert_str'], now - past_x_seconds)
        else:
            query = "select * from alerts where severity_type_id = '%d' and subsystem_type_id = '%d' and alert_str=\"%s\" and  first_alert_time >= %d);" % (
                alert_dict['severity_type_id'],
                alert_dict['subsystem_type_id'], alert_dict['alert_str'],
                now - past_x_seconds)
        # print query
        result, err = db.get_single_row(db_path, query)
        if err:
            raise Exception(err)
        # print result, err
    except Exception, e:
        return None, 'Error checking for repeats : %s' % str(e)
def run_zfs_remote_replication(remote_replication_id):
    try:
        rr, err = remote_replication.get_remote_replications(
            remote_replication_id)
        if err:
            raise Exception('Could not fetch replication details: %s' % err)
        replication = rr[0]
        mode = replication['mode']
        if mode == 'zfs':
            now_local_epoch, err = datetime_utils.get_epoch(when='now')
            if err:
                raise Exception(err)
            now_local_str, err = datetime_utils.convert_from_epoch(
                now_local_epoch,
                return_format='str',
                str_format='%Y%m%d%H%M',
                to='local')
            if err:
                raise Exception(err)

            source_dataset = replication['zfs'][0]['source_dataset']
            ret, err = zfs.create_snapshot(
                source_dataset,
                'zrr_%s_%s' % (remote_replication_id, now_local_str))
            if err:
                raise Exception(err)
            ret, err = remote_replication.run_zfs_remote_replication(
                remote_replication_id)
            if err:
                raise Exception(err)
        else:
            raise Exception('Invalid remote replication mode')

    except Exception, e:
        return False, 'Error adding ZFS remote replication task : %s' % e
def remove_old_files(lg=None, older_than_days=7):
    try:
        lck, err = lock.get_lock('remove_old_files')
        if err:
            raise Exception(err)
        if not lck:
            raise Exception('Could not acquire lock.')
        exported_logs_dir, err = config.get_exported_logs_dir_path()
        if err:
            raise Exception(err)
        status_report_dir, err = config.get_status_reports_dir_path()
        if err:
            raise Exception(err)
        patterns = [exported_logs_dir + '/alerts_*', status_report_dir + '/*']
        now, err = datetime_utils.get_epoch()
        # print now
        for pattern in patterns:
            list = glob.glob(pattern)
            for f in list:
                # print f
                ctime = os.path.getctime(f)
                # print os.path.getctime(f)
                if (now - ctime) > (60 * 60 * 24 * older_than_days):
                    # print 'removing %s'%f
                    os.remove(f)
                else:
                    # print 'not removing %s'%f
                    pass
    except Exception, e:
        logger.log_or_print('Error removing old files: %s' %
                            e, lg, level='critical')
        lock.release_lock('remove_old_files')
        return -1,  str(e)
Esempio n. 5
0
def remove_old_files(lg=None, older_than_days=7):
    try:
        lck, err = lock.get_lock('remove_old_files')
        if err:
            raise Exception(err)
        if not lck:
            raise Exception('Could not acquire lock.')
        exported_logs_dir, err = config.get_exported_logs_dir_path()
        if err:
            raise Exception(err)
        status_report_dir, err = config.get_status_reports_dir_path()
        if err:
            raise Exception(err)
        patterns = [exported_logs_dir + '/alerts_*', status_report_dir + '/*']
        now, err = datetime_utils.get_epoch()
        # print now
        for pattern in patterns:
            list = glob.glob(pattern)
            for f in list:
                # print f
                ctime = os.path.getctime(f)
                # print os.path.getctime(f)
                if (now - ctime) > (60 * 60 * 24 * older_than_days):
                    # print 'removing %s'%f
                    os.remove(f)
                else:
                    # print 'not removing %s'%f
                    pass
    except Exception, e:
        logger.log_or_print('Error removing old files: %s' % e,
                            lg,
                            level='critical')
        lock.release_lock('remove_old_files')
        return -1, str(e)
Esempio n. 6
0
def record_alerts(alerts_list):
    """Record a set of passed list containing alert dictionaries into the DB."""
    try:
        db_path, err = config.get_db_path()
        if err:
            raise Exception(err)
        if alerts_list:
            now, err = datetime_utils.get_epoch(
                when='now', num_previous_days=0)
            if err:
                raise Exception(er)
            for alert in alerts_list:
                # print alert
                command_list = []
                result, err = _get_repeat_entry(alert)
                # print 'repeat', result, err
                if err:
                    raise Exception(err)
                update_alert_id = None
                if result:
                    cmd = ['update alerts set repeat_count=%d, last_update_time="%d" where alert_id=%d' % (
                        int(result['repeat_count']) + 1, now, result['alert_id'])]
                    update_alert_id = result['alert_id']
                    # print 'updating!', cmd
                else:
                    if 'component' not in alert or (not alert['component']):
                        cmd = [
                            'insert into alerts(first_alert_time, last_update_time, severity_type_id, subsystem_type_id, alert_str) values (?,?,?,?,?)', (now, now, alert['severity_type_id'], alert['subsystem_type_id'], alert['alert_str'],)]
                    else:
                        cmd = [
                            'insert into alerts(first_alert_time, last_update_time, severity_type_id, subsystem_type_id, component, alert_str) values (?,?,?,?,?,?)', (now, now, alert['severity_type_id'], alert['subsystem_type_id'], alert['component'], alert['alert_str'],)]
                command_list.append(cmd)
                # print command_list
                rowid, err = db.execute_iud(
                    db_path, command_list, get_rowid=True)
                if err:
                    raise Exception(err)
                if update_alert_id:
                    alert_id = update_alert_id
                else:
                    alert_id = rowid

                ret, err = event_notifications.record_event_notification_holding(
                    event_id=alert_id, event_type_id=1, subsystem_type_id=alert['subsystem_type_id'], severity_type_id=alert['severity_type_id'])
                # print ret, err
                if err:
                    raise Exception(err)
    except Exception, e:
        # print str(e)
        return False, 'Error recording alerts : %s' % str(e)
Esempio n. 7
0
def main():
    lg = None
    try:
        scripts_log, err = config.get_scripts_log_path()
        if err:
            raise Exception(err)
        lg, err = logger.get_script_logger(
            'Current logs archive generation', scripts_log, level=logging.DEBUG)
        logs_archives_dir, err = config.get_logs_archives_dir_path()
        if err:
            raise Exception(err)

        lck, err = lock.get_lock('generate_current_logs_archive')
        if err:
            raise Exception(err)
        if not lck:
            raise Exception('Could not acquire lock.')

        logger.log_or_print(
            'Current logs archive generation initiated.', lg, level='info')

        now_local_epoch, err = datetime_utils.get_epoch(when='now')
        if err:
            raise Exception(err)
        now_local_str, err = datetime_utils.convert_from_epoch(
            now_local_epoch, return_format='str', str_format='%Y_%m_%d_%H_%M', to='local')
        if err:
            raise Exception(err)

        zf_name = 'IntegralSTOR_system_logs_%s.zip' % now_local_str
        try:
            os.makedirs(logs_archives_dir)
        except:
            pass

        zf = zipfile.ZipFile('%s/%s' % (logs_archives_dir, zf_name), 'w')
        for root, dirs, files in os.walk('/var/log/integralstor'):
            if root.startswith('/var/log/integralstor/archives'):
                continue
            for file in files:
                # print '%s/%s'%(root[len('/var/log/integralstor/'):], file)
                zf.write(os.path.join(root, file), '%s/%s' %
                         (root[len('/var/log/integralstor/'):], file))
        zf.close()
    except Exception, e:
        # print str(e)
        lock.release_lock('generate_current_logs_archive')
        logger.log_or_print('Error generating current logs archive : %s' %
                            e, lg, level='critical')
        return -1,  'Error generating current logs archive: %s' % e
Esempio n. 8
0
def purge_email_queue(older_than_days):
    try:
        cutoff_seconds, err = datetime_utils.get_epoch(
            when='now', num_previous_days=older_than_days)
        if err:
            raise Exception(err)
        db_path, err = config.get_db_path()
        if err:
            raise Exception(err)
        delete_command_list = [
            ["delete from email_queue where create_time < %d;" % cutoff_seconds]]
        ret, err = db.execute_iud(db_path, delete_command_list)
        if err:
            raise Exception(err)
    except Exception, e:
        return False, 'Error purging email queue database: %s' % str(e)
Esempio n. 9
0
def process_email_queue():
    """Send out all the mails that are pending in the email_queue table and update the status accordingly.

    """
    try:
        d, err = load_email_settings()
        if err:
            raise Exception(err)
        if d:
            eq_list, err = get_queued_emails()
            # print eq_list, err
            if err:
                raise Exception(err)
            if eq_list:
                db_path, err = config.get_db_path()
                if err:
                    raise Exception(err)
                now, err = datetime_utils.get_epoch(
                    when='now', num_previous_days=0)
                if err:
                    raise Exception(er)
                for eq_entry in eq_list:
                    if 'attachment_file_location' in eq_entry and eq_entry['attachment_file_location']:
                        attachment_file_list = [
                            eq_entry['attachment_file_location']]
                    else:
                        attachment_file_list = None
                    result, err = send_mail(d['server'], d['port'], d['username'], d['pswd'], d['tls'],
                                            eq_entry['recipients'], eq_entry['subject'], eq_entry['body'], attachment_file_list)
                    if err:
                        if eq_entry['attempts'] == 2:
                            # Failed
                            cmd = ['update email_queue set attempts=2, status=3, last_attempt_time="%s", error_message="%s" where eq_id=%d' % (
                                now, err, eq_entry['eq_id'])]
                        else:
                            # Retry once more
                            cmd = ['update email_queue set attempts=%d, status=2, last_attempt_time="%s", error_message="%s" where eq_id=%d' % (
                                ((int)(eq_entry['attempts']) + 1), now, err, eq_entry['eq_id'])]
                    else:
                        # Success
                        cmd = ['update email_queue set status=0, last_attempt_time="%s" where eq_id=%d' % (
                            now, eq_entry['eq_id'])]
                    ret, err = db.execute_iud(db_path, [cmd])
                    if err:
                        raise Exception(err)
    except Exception, e:
        return False, 'Error processing email queue: %s' % str(e)
Esempio n. 10
0
def update_last_view_time(request):
    """Called to update the last time a particular user opened their alerts..

    """
    try:
        db_path, err = config.get_db_path()
        if err:
            raise Exception(err)
        now, err = datetime_utils.get_epoch(when='now', num_previous_days=0)
        if err:
            raise Exception(er)
        cmd_list = []
        cmd = ["INSERT OR REPLACE INTO admin_alerts (user, last_refresh_time) values (?,?);", (
            request.user.username, now)]
        cmd_list.append(cmd)
        test, err = db.execute_iud(db_path, cmd_list)
        if err:
            raise Exception(err)
    except Exception, e:
        return False, 'Error updating last view time for alerts : %s' % str(e)
Esempio n. 11
0
def update_last_view_time(request):
    """Called to update the last time a particular user opened their alerts..

    """
    try:
        db_path, err = config.get_db_path()
        if err:
            raise Exception(err)
        now, err = datetime_utils.get_epoch(when='now', num_previous_days=0)
        if err:
            raise Exception(er)
        cmd_list = []
        cmd = [
            "INSERT OR REPLACE INTO admin_alerts (user, last_refresh_time) values (?,?);",
            (request.user.username, now)
        ]
        cmd_list.append(cmd)
        test, err = db.execute_iud(db_path, cmd_list)
        if err:
            raise Exception(err)
    except Exception, e:
        return False, 'Error updating last view time for alerts : %s' % str(e)
Esempio n. 12
0
def _get_repeat_entry(alert_dict, past_x_seconds=900):
    """Check the db to see if the passed alert is a repeat of an existing alert entry in the past x seconds

    """
    result = None
    try:
        db_path, err = config.get_db_path()
        if err:
            raise Exception(err)
        now, err = datetime_utils.get_epoch(when='now', num_previous_days=0)
        if alert_dict['component']:
            query = "select * from alerts where severity_type_id = '%d' and subsystem_type_id = '%d' and component = '%s' and alert_str=\"%s\" and  first_alert_time >= %d;" % (
                alert_dict['severity_type_id'], alert_dict['subsystem_type_id'], alert_dict['component'], alert_dict['alert_str'], now - past_x_seconds)
        else:
            query = "select * from alerts where severity_type_id = '%d' and subsystem_type_id = '%d' and alert_str=\"%s\" and  first_alert_time >= %d);" % (
                alert_dict['severity_type_id'], alert_dict['subsystem_type_id'], alert_dict['alert_str'], now - past_x_seconds)
        # print query
        result, err = db.get_single_row(db_path, query)
        if err:
            raise Exception(err)
        # print result, err
    except Exception, e:
        return None, 'Error checking for repeats : %s' % str(e)
Esempio n. 13
0
def audit(audit_code, audit_str, request, system_initiated=False):
    """Record an audit entry in the db

    """
    try:
        db_path, err = config.get_db_path()
        if err:
            raise Exception(err)
        if system_initiated is False:
            ip, err = networking.get_client_ip(request.META)
            if err:
                raise Exception(err)
        now, err = datetime_utils.get_epoch(when='now', num_previous_days=0)
        if err:
            raise Exception(er)
        if system_initiated:
            username = '******'
            source_ip = 'System'
        else:
            username = request.user.username
            source_ip, err = networking.get_client_ip(request.META)
            if err:
                raise Exception(err)
        command_list = []
        cmd = [
            'insert into audit(audit_time, username, source_ip, audit_code, audit_str) values (?,?,?,?,?)', (now, username, source_ip, audit_code, audit_str,)]
        command_list.append(cmd)
        audit_id, err = db.execute_iud(db_path, command_list, get_rowid=True)
        if err:
            raise Exception(err)
        ret, err = event_notifications.record_event_notification_holding(
            event_id=audit_id, event_type_id=2)
        if err:
            raise Exception(err)

    except Exception, e:
        return False, 'Error performing an audit operation : %s' % str(e)
Esempio n. 14
0
def process_tasks(node=socket.getfqdn()):
    """When called, processes/runs subtasks of each entry from tasks table if they satisfy/pass the required checks like status, last_run_time, retries, etc."""
    '''
    TODO
        - Needs a better docstring comment beriefly explaning what the function does
    '''
    try:
        error_list = []

        db_path, err = config.get_db_path()
        if err:
            raise Exception(err)

        # now = int(time.time())
        now, err = datetime_utils.get_epoch(when='now')
        if err:
            raise Exception(err)

        tasks_query = "select * from tasks where node == '" + node + \
            "' and (status == 'error-retrying' or status == 'queued') and (initiate_time <= '%d');" % (now)
        tasks_to_process, err = db.get_multiple_rows(db_path, tasks_query)
        if err:
            raise Exception(err)

        if tasks_to_process is not None:
            for task in tasks_to_process:
                ret, err = run_task(task['task_id'])
                if err:
                    error_list.append(str(err))

        if error_list:
            raise Exception(str(error_list))

    except Exception as e:
        return False, 'Error processing tasks: %s' % e
    else:
        return True, None
def process_tasks(node=socket.getfqdn()):
    """When called, processes/runs subtasks of each entry from tasks table if they satisfy/pass the required checks like status, last_run_time, retries, etc."""
    '''
    TODO
        - Needs a better docstring comment beriefly explaning what the function does
    '''
    try:
        error_list = []

        db_path, err = config.get_db_path()
        if err:
            raise Exception(err)

        # now = int(time.time())
        now, err = datetime_utils.get_epoch(when='now')
        if err:
            raise Exception(err)

        tasks_query = "select * from tasks where node == '" + node + \
            "' and (status == 'error-retrying' or status == 'queued') and (initiate_time <= '%d');" % (now)
        tasks_to_process, err = db.get_multiple_rows(db_path, tasks_query)
        if err:
            raise Exception(err)

        if tasks_to_process is not None:
            for task in tasks_to_process:
                ret, err = run_task(task['task_id'])
                if err:
                    error_list.append(str(err))

        if error_list:
            raise Exception(str(error_list))

    except Exception as e:
        return False, 'Error processing tasks: %s' % e
    else:
        return True, None
Esempio n. 16
0
def audit(audit_code, audit_str, request, system_initiated=False):
    """Record an audit entry in the db

    """
    try:
        db_path, err = config.get_db_path()
        if err:
            raise Exception(err)
        if system_initiated is False:
            ip, err = networking.get_client_ip(request.META)
            if err:
                raise Exception(err)
        now, err = datetime_utils.get_epoch(when='now', num_previous_days=0)
        if err:
            raise Exception(er)
        if system_initiated:
            username = '******'
            source_ip = 'System'
        else:
            username = request.user.username
            source_ip, err = networking.get_client_ip(request.META)
            if err:
                raise Exception(err)
        command_list = []
        cmd = [
            'insert into audit(audit_time, username, source_ip, audit_code, audit_str) values (?,?,?,?,?)', (now, username, source_ip, audit_code, audit_str,)]
        command_list.append(cmd)
        audit_id, err = db.execute_iud(db_path, command_list, get_rowid=True)
        if err:
            raise Exception(err)
        ret, err = event_notifications.record_event_notification_holding(
            event_id=audit_id, event_type_id=2)
        if err:
            raise Exception(err)

    except Exception, e:
        return False, 'Error performing an audit operation : %s' % str(e)
Esempio n. 17
0
def enqueue(recipients, subject, body, attachment_file_location=None, delete_attachment_file=True):
    """Enter an entry into the email queue table

    """
    try:
        db_path, err = config.get_db_path()
        if err:
            raise Exception(err)
        now, err = datetime_utils.get_epoch(when='now', num_previous_days=0)
        if err:
            raise Exception(er)
        command_list = []
        if attachment_file_location:
            cmd = [
                'insert into email_queue(recipients, subject, body, attachment_file_location, delete_attachment_file, create_time, status) values (?,?,?,?,?,?,?)', (recipients, subject, body, attachment_file_location, delete_attachment_file, now, 1,)]
        else:
            cmd = [
                'insert into email_queue(recipients, subject, body, create_time, status) values (?,?,?,?,?)', (recipients, subject, body, now, 1,)]
        command_list.append(cmd)
        ret, err = db.execute_iud(db_path, command_list)
        if err:
            raise Exception(err)
    except Exception, e:
        return False, 'Error enqueuing email: %s' % str(e)
Esempio n. 18
0
def _record_pool_usage_stats():
    try:
        pool_list, err = zfs.get_pools()
        if err:
            raise Exception(err)
        if pool_list:
            midnight, err = datetime_utils.get_epoch(when='midnight')
            if err:
                raise Exception(err)
            db_path, err = config.get_db_path()
            if err:
                raise Exception(err)
            for pool_info in pool_list:
                cmd_list = []
                cmd_list.append(["insert into pool_usage_stats(pool_name, date, used_bytes, available_bytes) values (?,?,?,?)", (
                    pool_info['pool_name'], midnight, pool_info['usage']['total_space_used_bytes'], pool_info['usage']['total_space_avail_bytes'],)])
                # Run multiple times as a duplicate entry will cause other
                # inserts to fail otherwise..
                ret, err = db.execute_iud(db_path, cmd_list)
            # Best effort.. continue if duplicate dates cause a problem when rerunning
            # print ret, err
    except Exception, e:
        # print str(e)
        return False, "Error recording ZFS pool usage statistics : %s" % str(e)
def main():
    lg = None
    try:
        scripts_log, err = config.get_scripts_log_path()
        if err:
            raise Exception(err)
        lg, err = logger.get_script_logger(
            'Current configuration archive generation',
            scripts_log,
            level=logging.DEBUG)
        config_archives_dir, err = config.get_config_archives_dir_path()
        if err:
            raise Exception(err)

        lck, err = lock.get_lock('generate_current_config_archive')
        if err:
            raise Exception(err)
        if not lck:
            raise Exception('Could not acquire lock.')

        logger.log_or_print('Current config archive generation initiated.',
                            lg,
                            level='info')
        db_path, err = config.get_db_path()
        if err:
            raise Exception(err)
        pki_dir, err = config.get_pki_dir()
        if err:
            raise Exception(err)
        config_file_list = [('/etc/samba/smb.conf', 'smb.conf'),
                            ('/etc/krb5.conf', 'krb5.conf'),
                            (db_path, 'integral_view_config.db'),
                            ('/etc/exports', 'exports'),
                            ('/etc/vsftpd/vsftpd.conf', 'vsftpd.conf'),
                            ('/etc/tgt/targets.conf', 'targets.conf'),
                            ('/etc/resolv.conf', 'resolv.conf'),
                            ('/etc/hosts', 'hosts'), ('/etc/passwd', 'passwd'),
                            ('/etc/group', 'group')]
        config_dir_list = [(pki_dir, 'pki')]

        now_local_epoch, err = datetime_utils.get_epoch(when='now')
        if err:
            raise Exception(err)
        now_local_str, err = datetime_utils.convert_from_epoch(
            now_local_epoch,
            return_format='str',
            str_format='%Y_%m_%d_%H_%M',
            to='local')
        if err:
            raise Exception(err)

        zf_name = 'IntegralSTOR_system_configuration_%s.zip' % now_local_str
        try:
            os.makedirs(config_archives_dir)
        except:
            pass

        try:
            zf = zipfile.ZipFile('%s/%s' % (config_archives_dir, zf_name), 'w')
            for entry in config_file_list:
                if os.path.exists(entry[0]):
                    zf.write(entry[0], arcname=entry[1])
            for entry in config_dir_list:
                if os.path.exists(entry[0]):
                    if entry[0][-1] == '/':
                        path = entry[0][:-1]
                    else:
                        path = entry[0]
                    for root, dirs, files in os.walk(path):
                        base = root[len(path) + 1:]
                        for file in files:
                            if base:
                                zf.write(os.path.join(root, file),
                                         '%s/%s/%s' % (entry[1], base, file))
                            else:
                                zf.write(os.path.join(root, file),
                                         '%s/%s' % (entry[1], file))
            zf.close()
        except Exception as e:
            raise Exception("Error compressing log file : %s" % str(e))
    except Exception, e:
        # print str(e)
        lock.release_lock('generate_current_config_archive')
        logger.log_or_print('Error generating current config archive : %s' % e,
                            lg,
                            level='critical')
        return -1, 'Error generating current config archive: %s' % e
def generate_global_header(f):
    try:
        ep, err = datetime_utils.get_epoch(when='now')
        if err:
            raise Exception(err)
        date_str, err = datetime_utils.convert_from_epoch(
            ep, return_format='str', str_format='%Y/%m/%d %H:%M', to='local')
        if err:
            raise Exception(err)
        ver, err = config.get_version()
        if err:
            raise Exception(err)
        uuid, err = system_info.get_integralstor_uuid()
        if err:
            raise Exception(err)
        org_info, err = system_info.get_org_info()
        if err:
            raise Exception(err)
        f.write('\n\n')
        f.write(
            '################### IntegralSTOR system status report ####################\n\n'
        )
        f.write(
            '                    IntegralSTOR version : %s                                 \n\n'
            % ver)
        f.write(
            '                    Hostname             : %s                                 \n\n'
            % socket.getfqdn())
        f.write(
            '                    Report generated at  : %s                                 \n\n'
            % date_str)
        if org_info:
            if 'org_name' in org_info:
                f.write(
                    '                    Organization name : %s                                 \n\n'
                    % org_info['org_name'])
            if 'unit_name' in org_info:
                f.write(
                    '                    Unit name : %s                                 \n\n'
                    % org_info['unit_name'])
            if 'unit_id' in org_info:
                f.write(
                    '                    Unit ID : %s                                 \n\n'
                    % org_info['unit_id'])
            if 'subunit_name' in org_info:
                f.write(
                    '                    Subunit name : %s                                 \n\n'
                    % org_info['subunit_name'])
            if 'subunit_id' in org_info:
                f.write(
                    '                    Subunit ID : %s                                 \n\n'
                    % org_info['subunit_id'])
        if uuid:
            f.write(
                '                    Installation ID : %s                                 \n\n'
                % uuid['uuid_str'])
        f.write(
            '##########################################################################\n\n'
        )
        f.write('\n\n')
    except Exception, e:
        return False, 'Error generating global header : %s' % str(e)
def main():
    lg = None
    try:
        scripts_log, err = config.get_scripts_log_path()
        if err:
            raise Exception(err)
        lg, err = logger.get_script_logger('System status report generation',
                                           scripts_log,
                                           level=logging.DEBUG)
        status_reports_dir, err = config.get_staus_reports_dir_path()
        if err:
            raise Exception(err)

        lck, err = lock.get_lock('generate_system_status_report')
        if err:
            raise Exception(err)
        if not lck:
            raise Exception('Could not acquire lock.')

        logger.log_or_print('System status report generation initiated.',
                            lg,
                            level='info')
        if len(sys.argv) != 2:
            raise Exception(
                'Usage : python generate_system_status_report.py <past_x_days>'
            )
        past_x_days = int(sys.argv[1])
        start_time, err = datetime_utils.get_epoch(
            when='midnight', num_previous_days=past_x_days)
        if err:
            raise Exception(err)
        now, err = datetime_utils.get_epoch(when='now')
        if err:
            raise Exception(err)
        now_local_str, err = datetime_utils.convert_from_epoch(
            now, return_format='str', str_format='%Y_%m_%d_%H_%M', to='local')
        if err:
            raise Exception(err)
        tmp_file_name = 'integralstor_status_%s' % now_local_str
        tmp_file_name_with_path = '/tmp/%s' % tmp_file_name
        with open(tmp_file_name_with_path, 'w') as f:
            ret, err = generate_global_header(f)
            # print ret, err
            f.write('\n')
            ret, err = generate_dmidecode_section(f)
            # print ret, err
            f.write('\n\n')
            ret, err = generate_cpu_section(f)
            # print ret, err
            f.write('\n\n')
            ret, err = generate_memory_section(f)
            # print ret, err
            f.write('\n\n')
            ret, err = generate_command_based_section(
                f, 'nmcli con', 'Networking connections')
            # print ret, err
            f.write('\n\n')
            ret, err = generate_command_based_section(f, 'ip addr',
                                                      'IP addresses')
            # print ret, err
            f.write('\n\n')
            hw_platform, err = config.get_hardware_platform()
            # print ret, err
            if hw_platform:
                if hw_platform == 'dell':
                    ret, err = generate_dell_hw_status(f)
                    # print ret, err
                    f.write('\n\n')
            ret, err = generate_disks_status_section(f)
            # print ret, err
            f.write('\n\n')
            ret, err = generate_command_based_section(
                f,
                'df -HT --exclude-type=devtmpfs --exclude-type=tmpfs --exclude-type=zfs',
                'OS disk space usage')
            # print ret, err
            f.write('\n\n')
            ret, err = generate_zfs_info_section(f)
            # print ret, err
            f.write('\n\n')
            ret, err = generate_command_based_section(f, 'zpool list',
                                                      'ZFS pool space usage')
            # print ret, err
            f.write('\n\n')
            ret, err = generate_command_based_section(
                f,
                'zfs list -t filesystem -o name,used,avail,refer,mountpoint,dedup,compression,quota,xattr,recordsize,acltype',
                'ZFS datasets')
            # print ret, err
            f.write('\n\n')
            ret, err = generate_command_based_section(
                f,
                'zfs list -t volume -o name,used,avail,refer,mountpoint,dedup,compression,volsize,volblocksize',
                'ZFS zvols')
            # print ret, err
            f.write('\n\n')
            ret, err = generate_command_based_section(f, 'zpool status -v',
                                                      'ZFS pool status')
            # print ret, err
            f.write('\n\n')
            ret, err = generate_audits_section(f, start_time, past_x_days)
            # print ret, err
            f.write('\n\n')
            ret, err = generate_alerts_section(f, start_time, past_x_days)
            # print ret, err
            f.write('\n\n')
        try:
            os.makedirs(status_reports_dir)
        except:
            pass
        final_file_name_with_path = '%s/%s' % (status_reports_dir,
                                               tmp_file_name)
        shutil.move(tmp_file_name_with_path, final_file_name_with_path)
        d, err = mail.load_email_settings()
        if not err and d and 'support_email_addresses' in d and d[
                'support_email_addresses']:
            # Email settings present so send it out to the support email
            # address
            email_header = '%s - IntegralSTOR system status report' % socket.getfqdn(
            )
            email_body = 'Please find the latest IntegralSTOR system status report'
            processed_successfully, err = mail.enqueue(
                d['support_email_addresses'],
                email_header,
                email_body,
                attachment_file_location=final_file_name_with_path,
                delete_attachment_file=False)
            if err:
                raise Exception(err)

    except Exception, e:
        # print str(e)
        lock.release_lock('generate_system_status_report')
        logger.log_or_print('Error generating system status report : %s' % e,
                            lg,
                            level='critical')
        return -1, 'Error generating system status report : %s' % e
Esempio n. 22
0
def export_old_audits(min_to_export=1000, export_count=500):
    """Export the oldest export_count audits if the total number of audits exceeds min_to_export

    """
    try:
        # print min_to_export, export_count
        db_path, err = config.get_db_path()
        if err:
            raise Exception(err)
        ret, err = db.get_single_row(
            db_path, 'select count(*) as count from audit')
        if err:
            raise Exception(err)
        if ret['count'] > int(min_to_export):
            query = "select * from audit order by audit_id limit %d;" % int(
                export_count)
            full_audit_list, err = db.get_multiple_rows(db_path, query)
            if err:
                raise Exception(err)
            # print full_audit_list
            audit_list = []
            for a in full_audit_list:
                # If it is still in the holding table then skip it so it can
                # get processed..
                query = "select * from event_notifications_holding where event_id=%d;" % int(
                    a['audit_id'])
                ret, err = db.get_single_row(db_path, query)
                # print ret, err
                if err:
                    raise Exception(err)
                if not ret:
                    audit_list.append(a)

            # print audit_list
            if audit_list:
                delete_commands = []
                export_dir_name, err = config.get_exported_logs_dir_path()
                if not os.path.exists(export_dir_name):
                    os.makedirs(export_dir_name)
                now, err = datetime_utils.get_epoch(
                    when='now', num_previous_days=0)
                if err:
                    raise Exception(err)
                now_str, err = datetime_utils.convert_from_epoch(
                    now, return_format='str', str_format='%Y_%m_%d_%H_%M', to='local')
                export_filename = 'audits_%s' % now_str
                with open('%s/%s' % (export_dir_name, export_filename), 'w') as f:
                    f.write(
                        'Audit time(UTC)  |  Audit type | Performed by | Performed from | Audit message\n')
                    f.write(
                        '-------------------------------------------------------------------------------------------\n')
                    for entry in audit_list:
                        # print entry
                        aud, err = _parse_audit_entry(entry)
                        if err:
                            raise Exception(err)
                        # print aud, err
                        f.write('%s | %s | %s | %s | %s\n\n' % (
                            aud['time'], aud['action'], aud['username'], aud['ip'], aud['action_str']))
                        delete_commands.append(
                            ['delete from audit where audit_id="%d"' % int(aud['audit_id'])])
                # print delete_commands
                ret, err = db.execute_iud(db_path, delete_commands)
                if err:
                    raise Exception(err)

    except Exception, e:
        return False, 'Error exporting old audits : %s' % str(e)
def view_system_info(request):
    return_dict = {}
    try:
        if "ack" in request.GET:
            if request.GET["ack"] == "system_time_set":
                return_dict['ack_message'] = "Time successfully updated"
            elif request.GET["ack"] == "system_date_set":
                return_dict['ack_message'] = "Date successfully updated"
            elif request.GET["ack"] == "system_datetime_set":
                return_dict[
                    'ack_message'] = "Date and time successfully updated"
            elif request.GET["ack"] == 'system_timezone_set':
                return_dict['ack_message'] = "Timezone successfully updated"
            elif request.GET['ack'] == 'system_date_timezone_set':
                return_dict[
                    'ack_message'] = 'Date and timezone successfully updated'
            elif request.GET['ack'] == 'system_time_timezone_set':
                return_dict[
                    'ack_message'] = 'Time and timezone successfully updated'
            elif request.GET['ack'] == 'system_datetimetz_set':
                return_dict[
                    'ack_message'] = 'Date, time and timezone successfully updated'
            elif request.GET['ack'] == 'config_uploaded':
                return_dict[
                    'ack_message'] = 'Configuration information successfully uploaded'
            elif request.GET['ack'] == 'update_org_info_ok':
                return_dict[
                    'ack_message'] = 'Updated orgnazation information successfully'

        si, err = system_info.load_system_config()
        if err:
            raise Exception(err)
        org_info, err = system_info.get_org_info()
        if err:
            raise Exception(err)
        return_dict['org_info'] = org_info

        now_epoch, err = datetime_utils.get_epoch(when='now',
                                                  num_previous_days=0)
        if err:
            raise Exception(err)
        now, err = datetime_utils.convert_from_epoch(now_epoch,
                                                     return_format='datetime',
                                                     to='local')
        if err:
            raise Exception(err)
        milliseconds = int(now_epoch * 1000)
        if err:
            raise Exception(err)
        system_timezone, err = datetime_utils.get_system_timezone()
        if err:
            raise Exception(err)
        return_dict['date_str'] = now.strftime("%A %d %B %Y")
        return_dict['time'] = now
        return_dict['milliseconds'] = milliseconds
        return_dict['system_timezone'] = system_timezone['system_timezone']
        # print return_dict['system_timezone']
        return_dict['system_info'] = si
        if "from" in request.GET:
            frm = request.GET["from"]
            return_dict['frm'] = frm
        return_dict['node'] = si
        return django.shortcuts.render_to_response(
            "view_system_info.html",
            return_dict,
            context_instance=django.template.context.RequestContext(request))
    except Exception, e:
        return_dict['base_template'] = "system_base.html"
        return_dict["page_title"] = 'System configuration'
        return_dict['tab'] = 'node_info_tab'
        return_dict["error"] = 'Error loading system configuration'
        return_dict["error_details"] = str(e)
        return django.shortcuts.render_to_response(
            'logged_in_error.html',
            return_dict,
            context_instance=django.template.context.RequestContext(request))
Esempio n. 24
0
def run_task(task_id):
    try:
        task, err = get_task(task_id)
        if err:
            raise Exception(err)
        now, err = datetime_utils.get_epoch(when='now')
        if err:
            raise Exception(err)
        db_path, err = config.get_db_path()
        if err:
            raise Exception(err)

        if task['last_run_time']:
            seconds_since_last_run = (now - task['last_run_time'])
            # retry_interval is in minutes!
            if seconds_since_last_run < task['retry_interval'] * 60:
                raise Exception("Too young to attempt")

        # Mark the task as running
        cmd = "update tasks set status = 'running', last_run_time=%d where task_id = '%d'" % (
            now, task['task_id'])
        status, err = db.execute_iud(db_path, [
            [cmd],
        ], get_rowid=True)
        if err:
            raise Exception(err)

        audit_str = "%s" % task['description']
        audit.audit("task_start", audit_str, None, system_initiated=True)

        attempts = task['attempts']
        run_as_user_name = task['run_as_user_name']

        # Now process subtasks for the task
        subtasks_query = "select * from subtasks where task_id == '%d' and (status == 'error-retrying' or status == 'queued') order by subtask_id" % task[
            'task_id']
        subtasks, err = db.get_multiple_rows(db_path, subtasks_query)
        if err:
            raise Exception(err)

        # Assume task is complete unless proven otherwise
        task_completed = True

        # Iteriate through all the unfinished subtasks related to the
        # task
        for subtask in subtasks:

            subtask_id = subtask["subtask_id"]

            status_update = "update subtasks set status = 'running' where subtask_id = '%d' and status is not 'cancelled'" % subtask_id
            status, err = db.execute_iud(db_path, [
                [status_update],
            ],
                                         get_rowid=True)
            if err:
                task_completed = False
                break

            # Now actually execute the command
            # This task is not meant to be executed by the current user
            # so switch to that user
            (out, return_code), err = command.execute_with_rc(
                subtask["command"],
                shell=True,
                run_as_user_name=run_as_user_name)

            if out[0]:
                output = re.sub("'", "", ''.join(out[0]))
            else:
                output = None
            if out[1]:
                error = re.sub("'", "", ''.join(out[1]))
            else:
                error = None

            if return_code == 0:
                # This means the command was successful. So update to
                # completed
                status_update = "update subtasks set status = 'completed', return_code='%d' where subtask_id = '%d' and status is not 'cancelled';" % (
                    return_code, subtask_id)
                status, err = db.execute_iud(db_path, [
                    [status_update],
                ],
                                             get_rowid=True)
                if err:
                    task_completed = False
                    break
                else:
                    continue
            else:
                # Subtask command failed
                if attempts > 1 or attempts == -2:
                    status_update = 'update subtasks set status = "error-retrying", return_code="%d" where subtask_id = "%d" and status is not "cancelled";' % (
                        return_code, subtask_id)
                elif attempts in [0, 1]:
                    status_update = 'update subtasks set status = "failed", return_code="%d" where subtask_id = "%d" and status is not "cancelled";' % (
                        return_code, subtask_id)
                execute, err = db.execute_iud(db_path, [
                    [status_update],
                ],
                                              get_rowid=True)
                task_completed = False
                break

        # Capture end time
        end_time, err = datetime_utils.get_epoch(when='now')
        if err:
            raise Exception(err)

        # Update status
        if task_completed:
            status_update = "update tasks set status = 'completed' where task_id = '%d'" % task[
                'task_id']
        else:
            if attempts > 1:
                status_update = "update tasks set status = 'error-retrying', attempts = %d where task_id = '%d' and status is not 'cancelled'" % (
                    attempts - 1, task['task_id'])
            elif attempts == -2:
                status_update = "update tasks set status = 'error-retrying', attempts = %d where task_id = '%d' and status is not 'cancelled'" % (
                    -2, task['task_id'])
            else:
                status_update = "update tasks set status = 'failed', attempts = '%d' where task_id = '%d' and status is not 'cancelled'" % (
                    0, task['task_id'])
        status, err = db.execute_iud(db_path, [
            [status_update],
        ],
                                     get_rowid=True)
        if err:
            raise Exception(err)

        # Update task's end time
        end_time_update = "update tasks set end_time=%d where task_id = '%d'" % (
            end_time, task['task_id'])
        ret, err = db.execute_iud(db_path, [
            [end_time_update],
        ],
                                  get_rowid=True)
        if err:
            pass
            # raise Exception(err)

        if task_completed:
            audit.audit("task_complete",
                        audit_str,
                        None,
                        system_initiated=True)
        else:
            audit.audit("task_fail", audit_str, None, system_initiated=True)

    except Exception as e:
        return False, 'Error processing task: %s' % e
    else:
        return True, None
Esempio n. 25
0
def export_old_audits(min_to_export=1000, export_count=500):
    """Export the oldest export_count audits if the total number of audits exceeds min_to_export

    """
    try:
        # print min_to_export, export_count
        db_path, err = config.get_db_path()
        if err:
            raise Exception(err)
        ret, err = db.get_single_row(
            db_path, 'select count(*) as count from audit')
        if err:
            raise Exception(err)
        if ret['count'] > int(min_to_export):
            query = "select * from audit order by audit_id limit %d;" % int(
                export_count)
            full_audit_list, err = db.get_multiple_rows(db_path, query)
            if err:
                raise Exception(err)
            # print full_audit_list
            audit_list = []
            for a in full_audit_list:
                # If it is still in the holding table then skip it so it can
                # get processed..
                query = "select * from event_notifications_holding where event_id=%d;" % int(
                    a['audit_id'])
                ret, err = db.get_single_row(db_path, query)
                # print ret, err
                if err:
                    raise Exception(err)
                if not ret:
                    audit_list.append(a)

            # print audit_list
            if audit_list:
                delete_commands = []
                export_dir_name, err = config.get_exported_logs_dir_path()
                if not os.path.exists(export_dir_name):
                    os.makedirs(export_dir_name)
                now, err = datetime_utils.get_epoch(
                    when='now', num_previous_days=0)
                if err:
                    raise Exception(err)
                now_str, err = datetime_utils.convert_from_epoch(
                    now, return_format='str', str_format='%Y_%m_%d_%H_%M', to='local')
                export_filename = 'audits_%s' % now_str
                with open('%s/%s' % (export_dir_name, export_filename), 'w') as f:
                    f.write(
                        'Audit time(UTC)  |  Audit type | Performed by | Performed from | Audit message\n')
                    f.write(
                        '-------------------------------------------------------------------------------------------\n')
                    for entry in audit_list:
                        # print entry
                        aud, err = _parse_audit_entry(entry)
                        if err:
                            raise Exception(err)
                        # print aud, err
                        f.write('%s | %s | %s | %s | %s\n\n' % (
                            aud['time'], aud['action'], aud['username'], aud['ip'], aud['action_str']))
                        delete_commands.append(
                            ['delete from audit where audit_id="%d"' % int(aud['audit_id'])])
                # print delete_commands
                ret, err = db.execute_iud(db_path, delete_commands)
                if err:
                    raise Exception(err)

    except Exception, e:
        return False, 'Error exporting old audits : %s' % str(e)
Esempio n. 26
0
def export_old_alerts(older_than_days=1):
    """Move all alerts older than the older_than_days into a file in
    /var/log/integralstor/logs/exported dir

    """
    try:
        cutoff_seconds, err = datetime_utils.get_epoch(
            when='now', num_previous_days=older_than_days)
        if err:
            raise Exception(err)
        #query = "select * from alerts where last_update_time < Datetime('now', '-%d days') order by alert_id;"%older_than_days
        query = "select * from alerts where last_update_time < %d order by alert_id;" % cutoff_seconds
        full_alerts_list, err = _get_and_parse_alerts(query)
        if err:
            raise Exception(err)
        alerts_list = []
        # print 'full', full_alerts_list
        db_path, err = config.get_db_path()
        if err:
            raise Exception(err)
        for a in full_alerts_list:
            # If it is still in the holding table then skip it so it can get
            # processed..
            query = "select * from event_notifications_holding where event_id=%d;" % int(
                a['alert_id'])
            ret, err = db.get_single_row(db_path, query)
            # print ret, err
            if err:
                raise Exception(err)
            if not ret:
                alerts_list.append(a)
        # print 'to export', alerts_list
        if alerts_list:
            delete_commands = []
            export_dir_name, err = config.get_exported_logs_dir_path()
            if err:
                raise Exception(err)
            if not os.path.exists(export_dir_name):
                os.makedirs(export_dir_name)
            now, err = datetime_utils.get_epoch(when='now',
                                                num_previous_days=0)
            if err:
                raise Exception(err)
            now_str, err = datetime_utils.convert_from_epoch(
                now,
                return_format='str',
                str_format='%Y_%m_%d_%H_%M',
                to='local')
            export_filename = 'alerts_%s' % now_str
            # print export_filename
            with open('%s/%s' % (export_dir_name, export_filename), 'w') as f:
                f.write(
                    'First alert time(UTC)  |  Last update time(UTC) | Repeat count | Subsystem | Severity | Alert message\n'
                )
                f.write(
                    '-------------------------------------------------------------------------------------------\n'
                )
                for al in alerts_list:
                    f.write('%s | %s | %d | %s | %s | %s\n\n' %
                            (al['first_alert_time'], al['last_update_time'],
                             al['repeat_count'], al['subsystem'],
                             al['severity'], al['alert_str']))
                    delete_commands.append([
                        'delete from alerts where alert_id="%d"' %
                        int(al['alert_id'])
                    ])
            # print delete_commands
            db_path, err = config.get_db_path()
            if err:
                raise Exception(err)
            ret, err = db.execute_iud(db_path, delete_commands)
            if err:
                raise Exception(err)

    except Exception, e:
        return False, 'Error exporting old alerts : %s' % str(e)
def view_system_info(request):
    return_dict = {}
    try:
        if "ack" in request.GET:
            if request.GET["ack"] == "system_time_set":
                return_dict['ack_message'] = "Time successfully updated"
            elif request.GET["ack"] == "system_date_set":
                return_dict['ack_message'] = "Date successfully updated"
            elif request.GET["ack"] == "system_datetime_set":
                return_dict['ack_message'] = "Date and time successfully updated"
            elif request.GET["ack"] == 'system_timezone_set':
                return_dict['ack_message'] = "Timezone successfully updated"
            elif request.GET['ack'] == 'system_date_timezone_set':
                return_dict['ack_message'] = 'Date and timezone successfully updated'
            elif request.GET['ack'] == 'system_time_timezone_set':
                return_dict['ack_message'] = 'Time and timezone successfully updated'
            elif request.GET['ack'] == 'system_datetimetz_set':
                return_dict['ack_message'] = 'Date, time and timezone successfully updated'
            elif request.GET['ack'] == 'config_uploaded':
                return_dict['ack_message'] = 'Configuration information successfully uploaded'
            elif request.GET['ack'] == 'update_org_info_ok':
                return_dict['ack_message'] = 'Updated orgnazation information successfully'

        si, err = system_info.load_system_config()
        if err:
            raise Exception(err)
        org_info, err = system_info.get_org_info()
        if err:
            raise Exception(err)
        return_dict['org_info'] = org_info

        now_epoch, err = datetime_utils.get_epoch(
            when='now', num_previous_days=0)
        if err:
            raise Exception(err)
        now, err = datetime_utils.convert_from_epoch(
            now_epoch, return_format='datetime', to='local')
        if err:
            raise Exception(err)
        milliseconds = int(now_epoch * 1000)
        if err:
            raise Exception(err)
        system_timezone, err = datetime_utils.get_system_timezone()
        if err:
            raise Exception(err)
        return_dict['date_str'] = now.strftime("%A %d %B %Y")
        return_dict['time'] = now
        return_dict['milliseconds'] = milliseconds
        return_dict['system_timezone'] = system_timezone['system_timezone']
        # print return_dict['system_timezone']
        return_dict['system_info'] = si
        if "from" in request.GET:
            frm = request.GET["from"]
            return_dict['frm'] = frm
        return_dict['node'] = si
        return django.shortcuts.render_to_response("view_system_info.html", return_dict, context_instance=django.template.context.RequestContext(request))
    except Exception, e:
        return_dict['base_template'] = "system_base.html"
        return_dict["page_title"] = 'System configuration'
        return_dict['tab'] = 'node_info_tab'
        return_dict["error"] = 'Error loading system configuration'
        return_dict["error_details"] = str(e)
        return django.shortcuts.render_to_response('logged_in_error.html', return_dict, context_instance=django.template.context.RequestContext(request))
Esempio n. 28
0
def export_old_alerts(older_than_days=1):
    """Move all alerts older than the older_than_days into a file in
    /var/log/integralstor/logs/exported dir

    """
    try:
        cutoff_seconds, err = datetime_utils.get_epoch(
            when='now', num_previous_days=older_than_days)
        if err:
            raise Exception(err)
        #query = "select * from alerts where last_update_time < Datetime('now', '-%d days') order by alert_id;"%older_than_days
        query = "select * from alerts where last_update_time < %d order by alert_id;" % cutoff_seconds
        full_alerts_list, err = _get_and_parse_alerts(query)
        if err:
            raise Exception(err)
        alerts_list = []
        # print 'full', full_alerts_list
        db_path, err = config.get_db_path()
        if err:
            raise Exception(err)
        for a in full_alerts_list:
            # If it is still in the holding table then skip it so it can get
            # processed..
            query = "select * from event_notifications_holding where event_id=%d;" % int(
                a['alert_id'])
            ret, err = db.get_single_row(db_path, query)
            # print ret, err
            if err:
                raise Exception(err)
            if not ret:
                alerts_list.append(a)
        # print 'to export', alerts_list
        if alerts_list:
            delete_commands = []
            export_dir_name, err = config.get_exported_logs_dir_path()
            if err:
                raise Exception(err)
            if not os.path.exists(export_dir_name):
                os.makedirs(export_dir_name)
            now, err = datetime_utils.get_epoch(
                when='now', num_previous_days=0)
            if err:
                raise Exception(err)
            now_str, err = datetime_utils.convert_from_epoch(
                now, return_format='str', str_format='%Y_%m_%d_%H_%M', to='local')
            export_filename = 'alerts_%s' % now_str
            # print export_filename
            with open('%s/%s' % (export_dir_name, export_filename), 'w') as f:
                f.write(
                    'First alert time(UTC)  |  Last update time(UTC) | Repeat count | Subsystem | Severity | Alert message\n')
                f.write(
                    '-------------------------------------------------------------------------------------------\n')
                for al in alerts_list:
                    f.write('%s | %s | %d | %s | %s | %s\n\n' % (
                        al['first_alert_time'], al['last_update_time'], al['repeat_count'], al['subsystem'], al['severity'], al['alert_str']))
                    delete_commands.append(
                        ['delete from alerts where alert_id="%d"' % int(al['alert_id'])])
            # print delete_commands
            db_path, err = config.get_db_path()
            if err:
                raise Exception(err)
            ret, err = db.execute_iud(db_path, delete_commands)
            if err:
                raise Exception(err)

    except Exception, e:
        return False, 'Error exporting old alerts : %s' % str(e)
Esempio n. 29
0
def record_alerts(alerts_list):
    """Record a set of passed list containing alert dictionaries into the DB."""
    try:
        db_path, err = config.get_db_path()
        if err:
            raise Exception(err)
        if alerts_list:
            now, err = datetime_utils.get_epoch(when='now',
                                                num_previous_days=0)
            if err:
                raise Exception(er)
            for alert in alerts_list:
                # print alert
                command_list = []
                result, err = _get_repeat_entry(alert)
                # print 'repeat', result, err
                if err:
                    raise Exception(err)
                update_alert_id = None
                if result:
                    cmd = [
                        'update alerts set repeat_count=%d, last_update_time="%d" where alert_id=%d'
                        % (int(result['repeat_count']) + 1, now,
                           result['alert_id'])
                    ]
                    update_alert_id = result['alert_id']
                    # print 'updating!', cmd
                else:
                    if 'component' not in alert or (not alert['component']):
                        cmd = [
                            'insert into alerts(first_alert_time, last_update_time, severity_type_id, subsystem_type_id, alert_str) values (?,?,?,?,?)',
                            (
                                now,
                                now,
                                alert['severity_type_id'],
                                alert['subsystem_type_id'],
                                alert['alert_str'],
                            )
                        ]
                    else:
                        cmd = [
                            'insert into alerts(first_alert_time, last_update_time, severity_type_id, subsystem_type_id, component, alert_str) values (?,?,?,?,?,?)',
                            (
                                now,
                                now,
                                alert['severity_type_id'],
                                alert['subsystem_type_id'],
                                alert['component'],
                                alert['alert_str'],
                            )
                        ]
                command_list.append(cmd)
                # print command_list
                rowid, err = db.execute_iud(db_path,
                                            command_list,
                                            get_rowid=True)
                if err:
                    raise Exception(err)
                if update_alert_id:
                    alert_id = update_alert_id
                else:
                    alert_id = rowid

                ret, err = event_notifications.record_event_notification_holding(
                    event_id=alert_id,
                    event_type_id=1,
                    subsystem_type_id=alert['subsystem_type_id'],
                    severity_type_id=alert['severity_type_id'])
                # print ret, err
                if err:
                    raise Exception(err)
    except Exception, e:
        # print str(e)
        return False, 'Error recording alerts : %s' % str(e)
Esempio n. 30
0
def view_dashboard(request, page = None):
    return_dict = {}
    try:
        return_dict["page_title"] = 'Overall system health'
        return_dict['tab'] = 'system_health_tab'
        return_dict["error"] = 'Error loading system health data'

        if request.method != 'GET':
            raise Exception('Invalid access method. Please use the menus')

        si, err = system_info.load_system_config()
        if err:
            raise Exception(err)
        if not si:
            raise Exception('Error loading system configuration')

        #node_name = si.keys()[0]
        #node = si[node_name]
        return_dict['node'] = si
        # print node.keys()

        # By default show error page
        template = "logged_in_error.html"

        # Chart specific declarations
        # will return 02, instead of 2.
        end_epoch, err = datetime_utils.get_epoch(when='now')
        if err:
            raise Exception(err)
        start_epoch = end_epoch - 3 * 60 * 60
        start, err = datetime_utils.convert_from_epoch(
            start_epoch, return_format='str', str_format='%H:%M:%S', to='local')
        if err:
            raise Exception(err)
        end, err = datetime_utils.convert_from_epoch(
            end_epoch, return_format='str', str_format='%H:%M:%S', to='local')
        if err:
            raise Exception(err)

        todays_date = (datetime.date.today()).strftime('%02d')

        value_list = []
        time_list = []

        num_bad_disks = 0
        num_hw_raid_bad_disks = 0
        num_hw_raid_ctrl_disks = 0
        num_smart_ctrl_disks = 0
        num_disks = len(si['disks'])
        disks_ok = True
        for sn, disk in si['disks'].items():
            if 'status' in disk:
                if 'hw_raid' in disk:
                    if not disk['hw_raid']:
                        num_smart_ctrl_disks += 1
                        if (disk['status'] is not None and disk['status'].upper() not in ['PASSED', 'OK']):
                            num_bad_disks += 1
                            disks_ok = False
                    else:
                        num_hw_raid_ctrl_disks += 1
                        if (disk['status'] is not None and disk['status'].upper() != 'OK'):
                            num_hw_raid_bad_disks += 1
                            disks_ok = False
                else:
                    # Assume its a non raid disk
                    num_smart_ctrl_disks += 1
                    if (disk['status'] is not None and disk['status'].upper() not in ['PASSED', 'OK']):
                        num_bad_disks += 1
                        disks_ok = False

        return_dict['num_disks'] = num_disks
        return_dict['num_bad_disks'] = num_bad_disks
        return_dict['disks_ok'] = disks_ok
        return_dict['num_hw_raid_bad_disks'] = num_hw_raid_bad_disks
        return_dict['num_hw_raid_ctrl_disks'] = num_hw_raid_ctrl_disks
        return_dict['num_smart_ctrl_disks'] = num_smart_ctrl_disks

        if 'ipmi_status' in si:
            num_sensors = len(si['ipmi_status'])
            num_bad_sensors = 0
            ipmi_ok = True
            for sensor in si['ipmi_status']:
                if sensor['status'] in ['ok', 'nr', 'na']:
                    continue
                else:
                    num_bad_sensors += 1
                    ipmi_ok = False
            return_dict['num_sensors'] = num_sensors
            return_dict['num_bad_sensors'] = num_bad_sensors
            return_dict['ipmi_ok'] = ipmi_ok

        services_dict, err = services_management.get_sysd_services_status()
        if err:
            raise Exception(err)

        num_services = len(services_dict)
        num_failed_services = 0
        num_active_services = 0
        num_inactive_services = 0
        services_ok = True

        if services_dict:
            for service, service_d in services_dict.items():
                if service_d["info"]["status"]["status_str"] == "Active":
                    num_active_services += 1
                elif service_d["info"]["status"]["status_str"] == "Inactive":
                    num_inactive_services += 1
                elif service_d["info"]["status"]["status_str"] == "Failed":
                    num_failed_services += 1
                    services_ok = False
                elif service_d["info"]["status"]["status_str"] == "Unknown State":
                    num_failed_services += 1
                    services_ok = False
            return_dict['num_services'] = num_services
            return_dict['num_active_services'] = num_active_services
            return_dict['num_inactive_services'] = num_inactive_services
            return_dict['num_failed_services'] = num_failed_services
            return_dict['services_ok'] = services_ok
        else:
            raise Exception('Error retrieving services status')

        pools, err = zfs.get_pools()
        if err:
            raise Exception(err)

        num_pools = len(pools)
        num_bad_pools = 0
        num_degraded_pools = 0
        num_high_usage_pools = 0
        for pool in pools:
            if pool['usage']['used_percent'] > 75:
                num_high_usage_pools += 1
            if pool['config']['pool']['root']['status']['state'] == 'ONLINE':
                pass
            elif pool['config']['pool']['root']['status']['state'] == 'DEGRADED':
                num_degraded_pools += 1
            else:
                num_bad_pools += 1
        return_dict['num_pools'] = num_pools
        return_dict['num_bad_pools'] = num_bad_pools
        return_dict['num_degraded_pools'] = num_degraded_pools
        return_dict['num_high_usage_pools'] = num_high_usage_pools

        load_avg_ok = True
        if (si["load_avg"]["5_min"] > si["load_avg"]["cpu_cores"]) or (si["load_avg"]["15_min"] > si["load_avg"]["cpu_cores"]):
            load_avg_ok = False
        return_dict['load_avg_ok'] = load_avg_ok

        shares_list, err = cifs.get_shares_list()
        if err:
            raise Exception(err)
        return_dict['num_cifs_shares'] = len(shares_list)

        exports_list, err = nfs.load_exports_list()
        if err:
            raise Exception(err)
        return_dict['num_nfs_exports'] = len(exports_list)

        target_list, err = iscsi_stgt.get_targets()
        if err:
            raise Exception(err)
        return_dict['num_iscsi_targets'] = len(target_list)

        with open('/proc/uptime', 'r') as f:
            uptime_seconds = float(f.readline().split()[0])
            uptime_str = '%s hours' % (
                ':'.join(str(datetime.timedelta(seconds=uptime_seconds)).split(':')[:2]))
            return_dict['uptime_str'] = uptime_str

        # CPU status
        if not page:
            page = "sys_health"
        if page == "cpu":
            return_dict["page_title"] = 'CPU statistics'
            return_dict['tab'] = 'cpu_tab'
            return_dict["error"] = 'Error loading CPU statistics'
            cpu, err = stats.get_system_stats(todays_date, start, end, "cpu")
            if err:
                raise Exception(err)
            value_dict = {}
            if cpu:
                for key in cpu.keys():
                    value_list = []
                    time_list = []
                    if key == "date":
                        pass
                    else:
                        if cpu[key]:
                            for a in cpu[key]:
                                time_list.append(a[0])
                                value_list.append(a[1])
                        value_dict[key] = value_list
            return_dict["data_dict"] = value_dict
            queue, err = stats.get_system_stats(
                todays_date, start, end, "queue")
            if err:
                raise Exception(err)
            value_dict = {}
            if queue:
                for key in queue.keys():
                    value_list = []
                    time_list = []
                    if key == "date":
                        pass
                    else:
                        for a in queue[key]:
                            time_list.append(a[0])
                            value_list.append(a[1])
                        value_dict[key] = value_list
            return_dict["data_dict_queue"] = value_dict
            return_dict['node'] = si
            d = {}
            template = "view_cpu_stats.html"
        elif page == "sys_health":
            return_dict["page_title"] = 'Overall system health'
            return_dict['tab'] = 'system_health_tab'
            return_dict["error"] = 'Error loading system health data'
            template = "view_dashboard.html"
            hw_platform, err = config.get_hardware_platform()
            if hw_platform:
                return_dict['hw_platform'] = hw_platform
                if hw_platform == 'dell':
                    from integralstor.platforms import dell
                    idrac_url, err = dell.get_idrac_addr()
                    if idrac_url:
                        return_dict['idrac_url'] = idrac_url
        # Memory
        elif page == "memory":
            return_dict["page_title"] = 'Memory statistics'
            return_dict['tab'] = 'memory_tab'
            return_dict["error"] = 'Error loading memory statistics'
            mem, err = stats.get_system_stats(
                todays_date, start, end, "memory")
            if err:
                raise Exception(err)
            if mem:
                for a in mem["memused"]:
                    time_list.append(a[0])
                    value_list.append((a[1] / (1024 * 1024)))
            return_dict['memory_status'] = si['memory']
            template = "view_memory_stats.html"
        # Network
        elif page == "network":
            return_dict["page_title"] = 'Network statistics'
            return_dict['tab'] = 'network_tab'
            return_dict["error"] = 'Error loading Network statistics'
            network, err = stats.get_system_stats(
                todays_date, start, end, "network")
            if err:
                raise Exception(err)
            value_dict = {}
            if network:
                for key in network.keys():
                    value_list = []
                    time_list = []
                    if key == "date" or key == "lo":
                        pass
                    else:
                        for a in network[key]["ifutil-percent"]:
                            time_list.append(a[0])
                            value_list.append(a[1])
                        value_dict[key] = value_list

            return_dict["data_dict"] = value_dict
            return_dict["network_status"] = si['interfaces']
            template = "view_network_stats.html"
        return_dict["labels"] = time_list
        return_dict["data"] = value_list
        return django.shortcuts.render_to_response(template, return_dict, context_instance=django.template.context.RequestContext(request))
    except Exception, e:
        return_dict['base_template'] = "monitoring_base.html"
        return_dict["error_details"] = str(e)
        return django.shortcuts.render_to_response("logged_in_error.html", return_dict, context_instance=django.template.context.RequestContext(request))
def download_log(request):
    """ Download the system log of the type specified in log_type POST param 
    This calls the /sys_log via an http request on that node to get the info"""

    return_dict = {}
    try:
        hw_platform, err = config.get_hardware_platform()
        if err:
            raise Exception(err)
        if hw_platform and hw_platform != 'dell':
            raise Exception('Unknown hardware platform')
        return_dict['hw_platform'] = hw_platform

        form = log_management_forms.DownloadLogsForm(request.POST or None)

        if request.method == 'POST':
            if form.is_valid():
                cd = form.cleaned_data
                log_type = cd['log_type']

                if log_type in ['alerts', 'audit', 'hardware']:
                    response = django.http.HttpResponse()
                    if log_type == 'alerts':
                        response['Content-disposition'] = 'attachment; filename=alerts_log.txt'
                        all_alerts, err = alerts.get_alerts()
                        if err:
                            raise Exception(err)
                        for alert in all_alerts:
                            if int(alert['repeat_count']) > 1:
                                response.write('Last alert time %s\nAlert message: %s\nRepeated count: %d\n\n' %
                                               (alert['last_update_time'], alert['alert_str'], int(alert['repeat_count'])))
                            else:
                                response.write('Last alert time %s\nAlert message: %s\n\n' %
                                               (alert['last_update_time'], alert['alert_str']))
                            response.flush()
                    elif log_type == 'audit':
                        response['Content-disposition'] = 'attachment; filename=audit_log.txt'
                        all_audits, err = audit.get_entries()
                        if err:
                            raise Exception(err)
                        for audit_info in all_audits:
                            response.write('Time : %s \n' % audit_info['time'])
                            response.write('Source IP : %s \n' %
                                           audit_info['ip'])
                            response.write('Action : %s \n' %
                                           audit_info['action_str'])
                            response.write('\n')
                            response.flush()
                    elif log_type == 'hardware':
                        response['Content-disposition'] = 'attachment; filename=hardware_logs.txt'
                        hw_platform, err = config.get_hardware_platform()
                        if not hw_platform or hw_platform != 'dell':
                            raise Exception('Unknown hardware platform')
                        if hw_platform == 'dell':
                            from integralstor.platforms import dell
                            logs_dict, err = dell.get_alert_logs()
                            if err:
                                raise Exception(err)
                            if not logs_dict:
                                raise Exception('No logs detected!')
                            for timestamp, log_list in logs_dict.items():
                                for log in log_list:
                                    response.write('Time : %s\n' %
                                                   log['date_time'])
                                    response.write(
                                        'Severity : %s\n' % log['Severity'])
                                    response.write(
                                        'Description : %s\n' % log['description'])
                                    response.write('\n')
                                    response.flush()
                        else:
                            raise Exception('Unknown platform')
                else:
                    scripts_log, err = config.get_scripts_log_path()
                    if err:
                        raise Exception(err)

                    system_logs = [('/var/log/boot.log', 'boot.log'), ('/var/log/dmesg', 'dmesg'), ('/var/log/messages', 'messages'),
                                   ('/var/log/smblog.vfs', 'samba'), ('/var/log/samba/log.winbindd', 'winbind'), (scripts_log, 'scripts')]

                    now_local_epoch, err = datetime_utils.get_epoch(when='now')
                    if err:
                        raise Exception(err)
                    now_local_str, err = datetime_utils.convert_from_epoch(
                        now_local_epoch, return_format='str', str_format='%Y_%m_%d_%H_%M', to='local')
                    if err:
                        raise Exception(err)

                    zf_name = 'IntegralSTOR_system_logs_%s.zip' % now_local_str

                    try:
                        out = io.BytesIO()
                        zf = zipfile.ZipFile(out, 'w')
                        for entry in system_logs:
                            zf.write(entry[0], arcname=entry[1])
                            #zf.write(file_name, arcname=display_name)
                        zf.close()
                    except Exception as e:
                        raise Exception(
                            "Error compressing log file : %s" % str(e))

                    response = django.http.HttpResponse(
                        out.getvalue(), content_type='application/x-compressed')
                    response['Content-disposition'] = 'attachment; filename=%s' % (
                        zf_name)

                return response

        # either a get or an invalid form so send back form
        return_dict['form'] = form
        return django.shortcuts.render_to_response('download_log_form.html', return_dict, context_instance=django.template.context.RequestContext(request))
    except Exception, e:
        return_dict['base_template'] = "system_base.html"
        return_dict["page_title"] = 'Download system logs'
        return_dict['tab'] = 'logs_tab'
        return_dict["error"] = 'Error downloading system logs'
        return_dict["error_details"] = str(e)
        return django.shortcuts.render_to_response("logged_in_error.html", return_dict, context_instance=django.template.context.RequestContext(request))
def run_task(task_id):
    try:
        task, err = get_task(task_id)
        if err:
            raise Exception(err)
        now, err = datetime_utils.get_epoch(when='now')
        if err:
            raise Exception(err)
        db_path, err = config.get_db_path()
        if err:
            raise Exception(err)


        if task['last_run_time']:
            seconds_since_last_run = (now - task['last_run_time'])
            # retry_interval is in minutes!
            if seconds_since_last_run < task['retry_interval'] * 60:
                raise Exception("Too young to attempt")

        # Mark the task as running
        cmd = "update tasks set status = 'running', last_run_time=%d where task_id = '%d'" % (
            now, task['task_id'])
        status, err = db.execute_iud(
            db_path, [[cmd], ], get_rowid=True)
        if err:
            raise Exception(err)

        audit_str = "%s" % task['description']
        audit.audit("task_start", audit_str,
                    None, system_initiated=True)

        attempts = task['attempts']
        run_as_user_name = task['run_as_user_name']

        # Now process subtasks for the task
        subtasks_query = "select * from subtasks where task_id == '%d' and (status == 'error-retrying' or status == 'queued') order by subtask_id" % task[
            'task_id']
        subtasks, err = db.get_multiple_rows(db_path, subtasks_query)
        if err:
            raise Exception(err)

        # Assume task is complete unless proven otherwise
        task_completed = True

        # Iteriate through all the unfinished subtasks related to the
        # task
        for subtask in subtasks:

            subtask_id = subtask["subtask_id"]

            status_update = "update subtasks set status = 'running' where subtask_id = '%d' and status is not 'cancelled'" % subtask_id
            status, err = db.execute_iud(
                db_path, [[status_update], ], get_rowid=True)
            if err:
                task_completed = False
                break

            # Now actually execute the command
            # This task is not meant to be executed by the current user
            # so switch to that user
            (out, return_code), err = command.execute_with_rc(
                subtask["command"], shell=True, run_as_user_name=run_as_user_name)

            if out[0]:
                output = re.sub("'", "", ''.join(out[0]))
            else:
                output = None
            if out[1]:
                error = re.sub("'", "", ''.join(out[1]))
            else:
                error = None

            if return_code == 0:
                # This means the command was successful. So update to
                # completed
                status_update = "update subtasks set status = 'completed', return_code='%d' where subtask_id = '%d' and status is not 'cancelled';" % (
                    return_code, subtask_id)
                status, err = db.execute_iud(
                    db_path, [[status_update], ], get_rowid=True)
                if err:
                    task_completed = False
                    break
                else:
                    continue
            else:
                # Subtask command failed
                if attempts > 1 or attempts == -2:
                    status_update = 'update subtasks set status = "error-retrying", return_code="%d" where subtask_id = "%d" and status is not "cancelled";' % (
                        return_code, subtask_id)
                elif attempts in [0, 1]:
                    status_update = 'update subtasks set status = "failed", return_code="%d" where subtask_id = "%d" and status is not "cancelled";' % (
                        return_code, subtask_id)
                execute, err = db.execute_iud(
                    db_path, [[status_update], ], get_rowid=True)
                task_completed = False
                break

        # Capture end time
        end_time, err = datetime_utils.get_epoch(when='now')
        if err:
            raise Exception(err)

        # Update status
        if task_completed:
            status_update = "update tasks set status = 'completed' where task_id = '%d'" % task[
                'task_id']
        else:
            if attempts > 1:
                status_update = "update tasks set status = 'error-retrying', attempts = %d where task_id = '%d' and status is not 'cancelled'" % (
                    attempts - 1, task['task_id'])
            elif attempts == -2:
                status_update = "update tasks set status = 'error-retrying', attempts = %d where task_id = '%d' and status is not 'cancelled'" % (
                    -2, task['task_id'])
            else:
                status_update = "update tasks set status = 'failed', attempts = '%d' where task_id = '%d' and status is not 'cancelled'" % (
                    0, task['task_id'])
        status, err = db.execute_iud(
            db_path, [[status_update], ], get_rowid=True)
        if err:
            raise Exception(err)

        # Update task's end time
        end_time_update = "update tasks set end_time=%d where task_id = '%d'" % (
            end_time, task['task_id'])
        ret, err = db.execute_iud(
            db_path, [[end_time_update], ], get_rowid=True)
        if err:
            pass
            # raise Exception(err)

        if task_completed:
            audit.audit("task_complete", audit_str,
                        None, system_initiated=True)
        else:
            audit.audit("task_fail", audit_str,
                        None, system_initiated=True)

    except Exception as e:
        return False, 'Error processing task: %s' % e
    else:
        return True, None