コード例 #1
0
ファイル: system_views.py プロジェクト: stuhli/dfirtrack
def ips_save(request, system, lines):
    # iterate over lines
    for line in lines:
        # skip empty lines
        if line == '':
            # call logger
            warning_logger(str(request.user), ' SYSTEM_ADD_IP_EMPTY_LINE')
            messages.error(request, 'Empty line instead of IP was provided')
            continue
        # check line for ip
        try:
            ipaddress.ip_address(line)
        except ValueError:
            # call logger
            warning_logger(str(request.user), ' SYSTEM_ADD_IP_NO_IP')
            messages.error(request, 'Provided string was no IP')
            continue

        # create ip
        ip, created = Ip.objects.get_or_create(ip_ip=line)
        # call logger
        if created == True:
            ip.logger(str(request.user), ' SYSTEM_ADD_IP_CREATED')
            messages.success(request, 'IP created')
        else:
            messages.warning(request, 'IP already exists in database')

        # save ip for system
        system.ip.add(ip)
コード例 #2
0
def system_creator_async(request_post, request_user):
    """ function to create many systems at once """

    # call logger
    debug_logger(str(request_user), " SYSTEM_CREATOR_BEGIN")

    # exctract lines from systemlist (list results from request object via large text area)
    lines = request_post.get('systemlist').splitlines()

    # iterate over lines
    for line in lines:

        # skip emtpy lines
        if line == '':
            warning_logger(str(request_user), " SYSTEM_CREATOR_ROW_EMPTY")
            continue

        # check line for length of string
        if len(line) > 50:
            warning_logger(str(request_user), " SYSTEM_CREATOR_LONG_STRING")
            continue

        # check for existence of system
        system = System.objects.filter(system_name = line)
        if system.count() > 0:
            # call logger
            error_logger(str(request_user), " SYSTEM_CREATOR_SYSTEM_EXISTS " + "system_name:" + line)
            # leave this loop because system with this systemname already exists
            continue

        # create form with request data
        form = SystemCreatorForm(request_post)

        # create system
        if form.is_valid():

            # don't save form yet
            system = form.save(commit=False)

            # set system_name
            system.system_name = line

            # set auto values
            system.system_created_by_user_id = request_user
            system.system_modified_by_user_id = request_user
            system.system_modify_time = timezone.now()

            # save object
            system.save()

            # save manytomany
            form.save_m2m()

            # call logger
            system.logger(str(request_user), ' SYSTEM_CREATOR_EXECUTED')

    # call logger
    debug_logger(str(request_user), " SYSTEM_CREATOR_END")
コード例 #3
0
def check_and_create_ip(ip_ip, model, row_counter, request=None):
    """ check IPs for valid values """
    """ set username for logger """

    # if function was called from 'system_instant' and 'system_upload'
    if request:
        logger_username = str(request.user)
    # if function was called from 'system_cron'
    else:
        logger_username = model.csv_import_username.username
    """ perform checks """

    # value is an IP
    try:

        # check ip column for IP(s)
        ipaddress.ip_address(ip_ip)

        # create ip
        ip, created = Ip.objects.get_or_create(ip_ip=ip_ip)
        # IP was created
        if created:
            # call logger
            ip.logger(logger_username, ' SYSTEM_IMPORTER_FILE_CSV_IP_CREATED')

        # return IP to 'csv_attributes_add.add_many2many_attributes'
        return ip

    # value is not an IP
    except ValueError:

        # if function was called from 'system_instant' and 'system_upload'
        if request:
            # call message
            messages.warning(
                request,
                f'Value for IP address in row {row_counter} was not a valid IP address.'
            )

        # call logger
        warning_logger(
            logger_username,
            f' SYSTEM_IMPORTER_FILE_CSV_IP_COLUMN row_{row_counter}:invalid_ip'
        )

        # return nothing to 'csv_attributes_add.add_many2many_attributes'
        return None
コード例 #4
0
def check_and_create_ip(column_ip, request, row_counter):

    # check ip column for ip
    try:
        ipaddress.ip_address(column_ip)
    except ValueError:
        messages.error(request, "Value for ip address in row " + str(row_counter) + " was not a valid IP address.")
        # call logger
        warning_logger(str(request.user), " SYSTEM_IMPORTER_FILE_CSV_IP_COLUMN " + "row_" + str(row_counter) + ":invalid_ip")
        return None

    # create ip
    ip, created = Ip.objects.get_or_create(ip_ip=column_ip)
    if created == True:
        ip.logger(str(request.user), " SYSTEM_IMPORTER_FILE_CSV_IP_CREATED")

    return ip
コード例 #5
0
def read_or_create_mkdocs_yml(username, mkdconfpath):

    # open mkdocs.yml for reading
    try:
        mkdconffile = open(mkdconfpath)

        # read YAML to dict
        mkdconfdict = yaml.safe_load(mkdconffile)

        # close mkdocs.yml
        mkdconffile.close()

    except FileNotFoundError:
        # call logger
        warning_logger(username, " SYSTEM_EXPORTER_MARKDOWN no mkdocs.yml found")
        # set empty dummydict for non-existing file to make code work as usual (just for the first execution because afterwards 'mkdocs.yml' will be there)
        mkdconfdict = {'pages': [{'Systems': []}]}

    return mkdconfdict
コード例 #6
0
def check_row(request, row, row_counter, model):
    """ check some values of csv rows """

    # reset continue condition
    continue_system_importer_file_csv = False

    # check system column for empty string
    if not row[model.csv_column_system - 1]:
        messages.error(request, "Value for system in row " + str(row_counter) + " was an empty string. System not created.")
        # call logger
        warning_logger(str(request.user), " SYSTEM_IMPORTER_FILE_CSV_SYSTEM_COLUMN " + "row_" + str(row_counter) + ":empty_column")
        continue_system_importer_file_csv = True

    # check system column for length of string
    if len(row[model.csv_column_system - 1]) > 50:
        messages.error(request, "Value for system in row " + str(row_counter) + " was too long. System not created.")
        # call logger
        warning_logger(str(request.user), " SYSTEM_IMPORTER_FILE_CSV_SYSTEM_COLUMN " + "row_" + str(row_counter) + ":long_string")
        continue_system_importer_file_csv = True

    return continue_system_importer_file_csv
コード例 #7
0
def check_config(request, model):
    """ check variables of dfirtrack.config """

    # reset stop condition
    stop_system_importer_file_csv = False

    # check CSV_COLUMN_SYSTEM for value
    if not 1<= model.csv_column_system <= 256:
        messages.error(request, "`CSV_COLUMN_SYSTEM` is outside the allowed range. Check config!")
        # call logger
        warning_logger(str(request.user), " SYSTEM_IMPORTER_FILE_CSV variable CSV_COLUMN_SYSTEM out of range")
        stop_system_importer_file_csv = True

    # check CSV_COLUMN_IP for value
    if not 1<= model.csv_column_ip <= 256:
        messages.error(request, "`CSV_COLUMN_IP` is outside the allowed range. Check config!")
        # call logger
        warning_logger(str(request.user), " SYSTEM_IMPORTER_FILE_CSV variable CSV_COLUMN_IP out of range")
        stop_system_importer_file_csv = True

    # create final message and log
    if stop_system_importer_file_csv:
        messages.warning(request, "Nothing was changed.")
        # call logger
        warning_logger(str(request.user), " SYSTEM_IMPORTER_FILE_CSV_ENDED_WITH_ERRORS")

    return stop_system_importer_file_csv
コード例 #8
0
def check_config(request):
    """ check variables in config """

    # get config model
    model = SystemExporterMarkdownConfigModel.objects.get(
        system_exporter_markdown_config_name='SystemExporterMarkdownConfig')

    # reset stop condition
    stop_exporter_markdown = False

    # check MARKDOWN_PATH for empty string
    if not model.markdown_path:
        messages.error(
            request, "`MARKDOWN_PATH` contains an emtpy string. Check config!")
        # call logger
        warning_logger(
            str(request.user),
            " EXPORTER_MARKDOWN variable MARKDOWN_PATH empty string")
        stop_exporter_markdown = True

    # check MARKDOWN_PATH for existence in file system (check only if it actually is a non-empty string)
    if model.markdown_path:
        if not os.path.isdir(model.markdown_path):
            messages.error(
                request,
                "`MARKDOWN_PATH` does not exist in file system. Check config or filesystem!"
            )
            # call logger
            warning_logger(
                str(request.user),
                " EXPORTER_MARKDOWN path MARKDOWN_PATH not existing")
            stop_exporter_markdown = True

    # check MARKDOWN_PATH for write permission (check only if it actually is a non-empty string)
    if model.markdown_path:
        if not os.access(model.markdown_path, os.W_OK):
            messages.error(
                request,
                "`MARKDOWN_PATH` is not writeable. Check config or filesystem!"
            )
            # call logger
            warning_logger(
                str(request.user),
                " EXPORTER_MARKDOWN path MARKDOWN_PATH not writeable")
            stop_exporter_markdown = True

    return stop_exporter_markdown
コード例 #9
0
def add_fk_attributes(system, system_created, model, row, row_counter, request=None):
    """ add foreign key relationships to system """

    """ set username for logger """

    # if function was called from 'system_instant' and 'system_upload'
    if request:
        logger_username = str(request.user)
    # if function was called from 'system_cron'
    else:
        logger_username = model.csv_import_username.username

    """ systemstatus (tagfree is set with tags in 'csv_attributes_add.add_many2many_attributes()') """

    # set systemstatus for new system or change if remove old is set
    if system_created or (not system_created and model.csv_remove_systemstatus):

        # set default systemstatus for new system
        if system_created:
            # set systemstatus for new system
            system.systemstatus = model.csv_default_systemstatus
        # change systemstatus for existing system if not locked
        else:
            # get lockstatus
            tag_lock_systemstatus = Tag.objects.get(tag_name = model.csv_tag_lock_systemstatus)
            # check for lockstatus in all tags of system
            if tag_lock_systemstatus not in system.tag.all():
                # change to default systemstatus for existing system
                system.systemstatus = model.csv_default_systemstatus

    """ analysisstatus (tagfree is set with tags in 'csv_attributes_add.add_many2many_attributes()') """

    # set analysisstatus for new system or change if remove old is set
    if system_created or (not system_created and model.csv_remove_analysisstatus):

        # set default analysisstatus for new system
        if system_created:
            # set analysisstatus for new system
            system.analysisstatus = model.csv_default_analysisstatus
        # change analysisstatus for existing system if not locked
        else:
            # get lockstatus
            tag_lock_analysisstatus = Tag.objects.get(tag_name = model.csv_tag_lock_analysisstatus)
            # check for lockstatus in all tags of system
            if tag_lock_analysisstatus not in system.tag.all():
                # change to default analysisstatus for existing system
                system.analysisstatus = model.csv_default_analysisstatus

    """ dnsname """

    # set dnsname for new system or change if remove old is set
    if system_created or (not system_created and model.csv_remove_dnsname):
        # get dnsname from CSV
        if model.csv_choice_dnsname:
            # check for index error
            try:
                # get dnsname from CSV column
                dnsname_name = row[model.csv_column_dnsname - 1]
                # check for empty string
                if dnsname_name:
                    # value is valid
                    try:
                        # get or create dnsname
                        dnsname, created = Dnsname.objects.get_or_create(dnsname_name = dnsname_name)
                        # call logger if created
                        if created:
                            dnsname.logger(logger_username, ' SYSTEM_IMPORTER_FILE_CSV_DNSNAME_CREATED')
                    # value is not valid
                    except DataError:
                        # if function was called from 'system_instant' and 'system_upload'
                        if request:
                            # call message
                            messages.warning(request, f'Value for DNS name in row {row_counter} was not a valid value.')
                        # call logger
                        warning_logger(logger_username, f' SYSTEM_IMPORTER_FILE_CSV_DNSNAME_COLUMN row_{row_counter}:invalid_dnsname')
                        # set empty value
                        dnsname = None
                # string was empty
                else:
                    # set empty value (field is empty)
                    dnsname = None
            # index out of range
            except IndexError:
                # if function was called from 'system_instant' and 'system_upload'
                if request:
                    # call message
                    messages.warning(request, f'Index for DNS name in row {row_counter} was out of range.')
                # call logger
                warning_logger(logger_username, f' SYSTEM_IMPORTER_FILE_CSV_DNSNAME_COLUMN row_{row_counter}:out_of_range')
                # set empty value
                dnsname = None
        # get dnsname from DB
        elif model.csv_default_dnsname:
            dnsname = model.csv_default_dnsname
        # set empty value (removes for existing system if neither CSV nor DB is chosen, does nothing for new system)
        else:
            dnsname = None
        # set dnsname for system
        system.dnsname = dnsname

    """ domain """

    # set domain for new system or change if remove old is set
    if system_created or (not system_created and model.csv_remove_domain):
        # get domain from CSV
        if model.csv_choice_domain:
            # check for index error
            try:
                # get domain from CSV column
                domain_name = row[model.csv_column_domain - 1]
                # check for empty string and compare to system name (when queried with local account, hostname is returned under some circumstances depending on tool)
                if domain_name and domain_name != system.system_name:
                    # value is valid
                    try:
                        # get or create domain
                        domain, created = Domain.objects.get_or_create(domain_name = domain_name)
                        # call logger if created
                        if created:
                            domain.logger(logger_username, ' SYSTEM_IMPORTER_FILE_CSV_DOMAIN_CREATED')
                    # value is not valid
                    except DataError:
                        # if function was called from 'system_instant' and 'system_upload'
                        if request:
                            # call message
                            messages.warning(request, f'Value for domain in row {row_counter} was not a valid value.')
                        # call logger
                        warning_logger(logger_username, f' SYSTEM_IMPORTER_FILE_CSV_DOMAIN_COLUMN row_{row_counter}:invalid_domain')
                        # set empty value
                        domain = None
                # string was empty or same as system_name
                else:
                    # set empty value (field is empty)
                    domain = None
            # index out of range
            except IndexError:
                # if function was called from 'system_instant' and 'system_upload'
                if request:
                    # call message
                    messages.warning(request, f'Index for domain in row {row_counter} was out of range.')
                # call logger
                warning_logger(logger_username, f' SYSTEM_IMPORTER_FILE_CSV_DOMAIN_COLUMN row_{row_counter}:out_of_range')
                # set empty value
                domain = None
        # get domain from DB
        elif model.csv_default_domain:
            domain = model.csv_default_domain
        # set empty value (removes for existing system if neither CSV nor DB is chosen, does nothing for new system)
        else:
            domain = None
        # set domain for system
        system.domain = domain

    """ location """

    # set location for new system or change if remove old is set
    if system_created or (not system_created and model.csv_remove_location):
        # get location from CSV
        if model.csv_choice_location:
            # check for index error
            try:
                # get location from CSV column
                location_name = row[model.csv_column_location - 1]
                # check for empty string
                if location_name:
                    # value is valid
                    try:
                        # get or create location
                        location, created = Location.objects.get_or_create(location_name = location_name)
                        # call logger if created
                        if created:
                            location.logger(logger_username, ' SYSTEM_IMPORTER_FILE_CSV_LOCATION_CREATED')
                    # value is not valid
                    except DataError:
                        # if function was called from 'system_instant' and 'system_upload'
                        if request:
                            # call message
                            messages.warning(request, f'Value for location in row {row_counter} was not a valid value.')
                        # call logger
                        warning_logger(logger_username, f' SYSTEM_IMPORTER_FILE_CSV_LOCATION_COLUMN row_{row_counter}:invalid_location')
                        # set empty value
                        location = None
                # string was empty
                else:
                    # set empty value (field is empty)
                    location = None
            # index out of range
            except IndexError:
                # if function was called from 'system_instant' and 'system_upload'
                if request:
                    # call message
                    messages.warning(request, f'Index for location in row {row_counter} was out of range.')
                # call logger
                warning_logger(logger_username, f' SYSTEM_IMPORTER_FILE_CSV_LOCATION_COLUMN row_{row_counter}:out_of_range')
                # set empty value
                location = None
        # get location from DB
        elif model.csv_default_location:
            location = model.csv_default_location
        # set empty value (removes for existing system if neither CSV nor DB is chosen, does nothing for new system)
        else:
            location = None
        # set location for system
        system.location = location

    """ os """

    # set os for new system or change if remove old is set
    if system_created or (not system_created and model.csv_remove_os):
        # get os from CSV
        if model.csv_choice_os:
            # check for index error
            try:
                # get os from CSV column
                os_name = row[model.csv_column_os - 1]
                # check for empty string
                if os_name:
                    # value is valid
                    try:
                        # get or create os
                        os, created = Os.objects.get_or_create(os_name = os_name)
                        # call logger if created
                        if created:
                            os.logger(logger_username, ' SYSTEM_IMPORTER_FILE_CSV_OS_CREATED')
                    # value is not valid
                    except DataError:
                        # if function was called from 'system_instant' and 'system_upload'
                        if request:
                            # call message
                            messages.warning(request, f'Value for OS in row {row_counter} was not a valid value.')
                        # call logger
                        warning_logger(logger_username, f' SYSTEM_IMPORTER_FILE_CSV_OS_COLUMN row_{row_counter}:invalid_os')
                        # set empty value
                        os = None
                # string was empty
                else:
                    # set empty value (field is empty)
                    os = None
            # index out of range
            except IndexError:
                # if function was called from 'system_instant' and 'system_upload'
                if request:
                    # call message
                    messages.warning(request, f'Index for OS in row {row_counter} was out of range.')
                # call logger
                warning_logger(logger_username, f' SYSTEM_IMPORTER_FILE_CSV_OS_COLUMN row_{row_counter}:out_of_range')
                # set empty value
                os = None
        # get os from DB
        elif model.csv_default_os:
            os = model.csv_default_os
        # set empty value (removes for existing system if neither CSV nor DB is chosen, does nothing for new system)
        else:
            os = None
        # set os for system
        system.os = os

    """ reason """

    # set reason for new system or change if remove old is set
    if system_created or (not system_created and model.csv_remove_reason):
        # get reason from CSV
        if model.csv_choice_reason:
            # check for index error
            try:
                # get reason from CSV column
                reason_name = row[model.csv_column_reason - 1]
                # check for empty string
                if reason_name:
                    # value is valid
                    try:
                        # get or create reason
                        reason, created = Reason.objects.get_or_create(reason_name = reason_name)
                        # call logger if created
                        if created:
                            reason.logger(logger_username, ' SYSTEM_IMPORTER_FILE_CSV_REASON_CREATED')
                    # value is not valid
                    except DataError:
                        # if function was called from 'system_instant' and 'system_upload'
                        if request:
                            # call message
                            messages.warning(request, f'Value for reason in row {row_counter} was not a valid value.')
                        # call logger
                        warning_logger(logger_username, f' SYSTEM_IMPORTER_FILE_CSV_REASON_COLUMN row_{row_counter}:invalid_reason')
                        # set empty value
                        reason = None
                # string was empty
                else:
                    # set empty value (field is empty)
                    reason = None
            # index out of range
            except IndexError:
                # if function was called from 'system_instant' and 'system_upload'
                if request:
                    # call message
                    messages.warning(request, f'Index for reason in row {row_counter} was out of range.')
                # call logger
                warning_logger(logger_username, f' SYSTEM_IMPORTER_FILE_CSV_REASON_COLUMN row_{row_counter}:out_of_range')
                # set empty value
                reason = None
        # get reason from DB
        elif model.csv_default_reason:
            reason = model.csv_default_reason
        # set empty value (removes for existing system if neither CSV nor DB is chosen, does nothing for new system)
        else:
            reason = None
        # set reason for system
        system.reason = reason

    """ recommendation """

    # set recommendation for new system or change if remove old is set
    if system_created or (not system_created and model.csv_remove_recommendation):
        # get recommendation from CSV
        if model.csv_choice_recommendation:
            # check for index error
            try:
                # get recommendation from CSV column
                recommendation_name = row[model.csv_column_recommendation - 1]
                # check for empty string
                if recommendation_name:
                    # value is valid
                    try:
                        # get or create recommendation
                        recommendation, created = Recommendation.objects.get_or_create(recommendation_name = recommendation_name)
                        # call logger if created
                        if created:
                            recommendation.logger(logger_username, ' SYSTEM_IMPORTER_FILE_CSV_RECOMMENDATION_CREATED')
                    # value is not valid
                    except DataError:
                        # if function was called from 'system_instant' and 'system_upload'
                        if request:
                            # call message
                            messages.warning(request, f'Value for recommendation in row {row_counter} was not a valid value.')
                        # call logger
                        warning_logger(logger_username, f' SYSTEM_IMPORTER_FILE_CSV_RECOMMENDATION_COLUMN row_{row_counter}:invalid_recommendation')
                        # set empty value
                        recommendation = None
                # string was empty
                else:
                    # set empty value (field is empty)
                    recommendation = None
            # index out of range
            except IndexError:
                # if function was called from 'system_instant' and 'system_upload'
                if request:
                    # call message
                    messages.warning(request, f'Index for recommendation in row {row_counter} was out of range.')
                # call logger
                warning_logger(logger_username, f' SYSTEM_IMPORTER_FILE_CSV_RECOMMENDATION_COLUMN row_{row_counter}:out_of_range')
                # set empty value
                recommendation = None
        # get recommendation from DB
        elif model.csv_default_recommendation:
            recommendation = model.csv_default_recommendation
        # set empty value (removes for existing system if neither CSV nor DB is chosen, does nothing for new system)
        else:
            recommendation = None
        # set recommendation for system
        system.recommendation = recommendation

    """ serviceprovider """

    # set serviceprovider for new system or change if remove old is set
    if system_created or (not system_created and model.csv_remove_serviceprovider):
        # get serviceprovider from CSV
        if model.csv_choice_serviceprovider:
            # check for index error
            try:
                # get serviceprovider from CSV column
                serviceprovider_name = row[model.csv_column_serviceprovider - 1]
                # check for empty string
                if serviceprovider_name:
                    # value is valid
                    try:
                        # get or create serviceprovider
                        serviceprovider, created = Serviceprovider.objects.get_or_create(serviceprovider_name = serviceprovider_name)
                        # call logger if created
                        if created:
                            serviceprovider.logger(logger_username, ' SYSTEM_IMPORTER_FILE_CSV_SERVICEPROVIDER_CREATED')
                    # value is not valid
                    except DataError:
                        # if function was called from 'system_instant' and 'system_upload'
                        if request:
                            # call message
                            messages.warning(request, f'Value for serviceprovider in row {row_counter} was not a valid value.')
                        # call logger
                        warning_logger(logger_username, f' SYSTEM_IMPORTER_FILE_CSV_SERVICEPROVIDER_COLUMN row_{row_counter}:invalid_serviceprovider')
                        # set empty value
                        serviceprovider = None
                # string was empty
                else:
                    # set empty value (field is empty)
                    serviceprovider = None
            # index out of range
            except IndexError:
                # if function was called from 'system_instant' and 'system_upload'
                if request:
                    # call message
                    messages.warning(request, f'Index for serviceprovider in row {row_counter} was out of range.')
                # call logger
                warning_logger(logger_username, f' SYSTEM_IMPORTER_FILE_CSV_SERVICEPROVIDER_COLUMN row_{row_counter}:out_of_range')
                # set empty value
                serviceprovider = None
        # get serviceprovider from DB
        elif model.csv_default_serviceprovider:
            serviceprovider = model.csv_default_serviceprovider
        # set empty value (removes for existing system if neither CSV nor DB is chosen, does nothing for new system)
        else:
            serviceprovider = None
        # set serviceprovider for system
        system.serviceprovider = serviceprovider

    """ systemtype """

    # set systemtype for new system or change if remove old is set
    if system_created or (not system_created and model.csv_remove_systemtype):
        # get systemtype from CSV
        if model.csv_choice_systemtype:
            # check for index error
            try:
                # get systemtype from CSV column
                systemtype_name = row[model.csv_column_systemtype - 1]
                # check for empty string
                if systemtype_name:
                    # value is valid
                    try:
                        # get or create systemtype
                        systemtype, created = Systemtype.objects.get_or_create(systemtype_name = systemtype_name)
                        # call logger if created
                        if created:
                            systemtype.logger(logger_username, ' SYSTEM_IMPORTER_FILE_CSV_SYSTEMTYPE_CREATED')
                    # value is not valid
                    except DataError:
                        # if function was called from 'system_instant' and 'system_upload'
                        if request:
                            # call message
                            messages.warning(request, f'Value for systemtype in row {row_counter} was not a valid value.')
                        # call logger
                        warning_logger(logger_username, f' SYSTEM_IMPORTER_FILE_CSV_SYSTEMTYPE_COLUMN row_{row_counter}:invalid_systemtype')
                        # set empty value
                        systemtype = None
                # string was empty
                else:
                    # set empty value (field is empty)
                    systemtype = None
            # index out of range
            except IndexError:
                # if function was called from 'system_instant' and 'system_upload'
                if request:
                    # call message
                    messages.warning(request, f'Index for systemtype in row {row_counter} was out of range.')
                # call logger
                warning_logger(logger_username, f' SYSTEM_IMPORTER_FILE_CSV_SYSTEMTYPE_COLUMN row_{row_counter}:out_of_range')
                # set empty value
                systemtype = None
        # get systemtype from DB
        elif model.csv_default_systemtype:
            systemtype = model.csv_default_systemtype
        # set empty value (removes for existing system if neither CSV nor DB is chosen, does nothing for new system)
        else:
            systemtype = None
        # set systemtype for system
        system.systemtype = systemtype

    # return system with foreign key relations to 'csv_main.system_handler'
    return system
コード例 #10
0
                            # call logger
                            warning_logger(logger_username, f' SYSTEM_IMPORTER_FILE_CSV_CASE_COLUMN row_{row_counter}:invalid_case')
                            # set empty value
                            case = None
                    # only add case to system if one of the previous checks was successful
                    if case:
                        # set case for system
                        system.case.add(case)
            # index out of range
            except IndexError:
                # if function was called from 'system_instant' and 'system_upload'
                if request:
                    # call message
                    messages.warning(request, f'Index for case in row {row_counter} was out of range.')
                # call logger
                warning_logger(logger_username, f' SYSTEM_IMPORTER_FILE_CSV_CASE_COLUMN row_{row_counter}:out_of_range')

        # get case from DB
        elif model.csv_default_case:
            cases = model.csv_default_case
            for case in cases.all():
                # add case to system
                system.case.add(case)

    """ company """

    # set company for new system or change if remove old is set
    if system_created or (not system_created and model.csv_remove_company):

        # remove companies if not new system
        if not system_created:
コード例 #11
0
def check_system_name(model, row, row_counter, request=None):
    """ check system name for valid value """

    # reset continue condition
    stop_system_importer_file_csv = False
    """ set username for logger """

    # if function was called from 'system_instant' and 'system_upload'
    if request:
        logger_username = str(request.user)
    # if function was called from 'system_cron'
    else:
        logger_username = model.csv_import_username.username
    """ perform checks (for system_name, return immediately) """

    # check for index error
    try:
        system_name = row[model.csv_column_system - 1]
    except IndexError:
        # if function was called from 'system_instant' and 'system_upload'
        if request:
            # call message
            messages.warning(
                request,
                f'Index for system in row {row_counter} was out of range. System not created.'
            )
        # call logger
        warning_logger(
            logger_username,
            f' SYSTEM_IMPORTER_FILE_CSV_SYSTEM_COLUMN row_{row_counter}:out_of_range'
        )
        # set stop condition
        stop_system_importer_file_csv = True
        # return stop condition to 'csv_main.system_handler'
        return stop_system_importer_file_csv
    """ perform checks (remaining checks, need system_name) """

    # check system column for empty string
    if not system_name:
        # if function was called from 'system_instant' and 'system_upload'
        if request:
            # call message
            messages.warning(
                request,
                f'Value for system in row {row_counter} was an empty string. System not created.'
            )
        # call logger
        warning_logger(
            logger_username,
            f' SYSTEM_IMPORTER_FILE_CSV_SYSTEM_COLUMN row_{row_counter}:empty_column'
        )
        # set stop condition
        stop_system_importer_file_csv = True

    # check system column for length of string
    if len(system_name) > 50:
        # if function was called from 'system_instant' and 'system_upload'
        if request:
            # call message
            messages.warning(
                request,
                f'Value for system in row {row_counter} was too long. System not created.'
            )
        # call logger
        warning_logger(
            logger_username,
            f' SYSTEM_IMPORTER_FILE_CSV_SYSTEM_COLUMN row_{row_counter}:long_string'
        )
        # set stop condition
        stop_system_importer_file_csv = True

    # return stop condition to 'csv_main.system_handler'
    return stop_system_importer_file_csv
コード例 #12
0
ファイル: filesystem.py プロジェクト: kahfiAG/dfirtrack
def reportitems(request):
    """ this function checks for every system the existence of a markdown file with information about the and imports the content of this file as reportitem for the corresponding system """

    # call logger
    debug_logger(str(request.user), " REPORTITEM_FILESYSTEM_IMPORTER_BEGIN")

    # check whether REPORTITEMS_FILESYSTEMPATH is defined in `dfirtrack.config`
    if reportitems_filesystempath == '':
        # call logger
        error_logger(str(request.user),
                     " REPORTITEMS_FILESYSTEMPATH_VARIABLE_UNDEFINED")
        messages.error(
            request,
            "The variable REPORTITEMS_FILESYSTEMPATH seems to be undefined. Check `dfirtrack.config`!"
        )
        # leave importer
        return redirect('/systems/')

    # check whether REPORTITEMS_FILESYSTEMPATH points to non-existing directory
    if not os.path.isdir(reportitems_filesystempath):
        # call logger
        error_logger(str(request.user),
                     " REPORTITEMS_FILESYSTEM_IMPORTER_WRONG_PATH")
        messages.error(
            request,
            "The variable REPORTITEMS_FILESYSTEMPATH points to a non-existing directory. Check `dfirtrack.config`!"
        )
        # leave importer
        return redirect('/systems/')

    # check whether REPORTITEMS_HEADLINE is defined in `dfirtrack.config`
    if reportitems_headline == '':
        # call logger
        error_logger(str(request.user),
                     " REPORTITEMS_HEADLINE_VARIABLE_UNDEFINED")
        messages.error(
            request,
            "The variable REPORTITEMS_HEADLINE seems to be undefined. Check `dfirtrack.config`!"
        )
        # leave importer
        return redirect('/systems/')

    # check whether REPORTITEMS_SUBHEADLINE is defined in `dfirtrack.config`
    if reportitems_subheadline == '':
        # call logger
        error_logger(str(request.user),
                     " REPORTITEMS_SUBHEADLINE_VARIABLE_UNDEFINED")
        messages.error(
            request,
            "The variable REPORTITEMS_SUBHEADLINE seems to be undefined. Check `dfirtrack.config`!"
        )
        # leave importer
        return redirect('/systems/')

    # check whether REPORTITEMS_DELETE is defined in `dfirtrack.config`
    if not isinstance(reportitems_delete, bool):
        # call logger
        error_logger(str(request.user),
                     " REPORTITEMS_DELETE_VARIABLE_UNDEFINED")
        messages.error(
            request,
            "The variable REPORTITEMS_DELETE seems to be undefined or not a boolean. Check `dfirtrack.config`!"
        )
        # leave importer
        return redirect('/systems/')

    # get all system objects
    systems = System.objects.all()

    # create headline if it does not exist
    headline, created = Headline.objects.get_or_create(
        headline_name=reportitems_headline)
    if created == True:
        # call logger
        headline.logger(str(request.user),
                        " REPORTITEMS_FILESYSTEM_IMPORTER_HEADLINE_CREATED")

    # set counter for non-existing files (needed for messages)
    nofile_found_counter = 0

    # set counter for created reportitems (needed for messages)
    reportitems_created_counter = 0

    # set counter for modified reportitems (needed for messages)
    reportitems_modified_counter = 0

    # set counter for deleted reportitems (needed for messages)
    reportitems_deleted_counter = 0

    # iterate over systems
    for system in systems:

        # create path for reportfile
        reportpath = reportitems_filesystempath + "/" + system.system_name + ".md"

        # check whether a file is existing for this system
        if not os.path.isfile(reportpath):
            # call logger
            warning_logger(
                str(request.user),
                " REPORTITEMS_FILESYSTEM_IMPORTER_NO_FILE system_name:" +
                system.system_name)
            # autoincrement counter
            nofile_found_counter += 1

            # check whether already existing reportitem for this system should be deleted if no file was provided
            if reportitems_delete:
                # delete already existing reportitem for this system if no file was provided
                try:
                    reportitem = Reportitem.objects.get(
                        system=system,
                        headline=headline,
                        reportitem_subheadline=reportitems_subheadline)
                    # call logger (before deleting instance)
                    reportitem.logger(
                        str(request.user),
                        " REPORTITEMS_FILESYSTEM_IMPORTER_REPORTITEM_DELETED")
                    reportitem.delete()
                    # autoincrement counter
                    reportitems_deleted_counter += 1
                except Reportitem.DoesNotExist:
                    pass

            # continue with next system
            continue

        # create reportitem if it does not exist (get_or_create won't work in this context because of needed user objects for saving)
        try:
            reportitem = Reportitem.objects.get(
                system=system,
                headline=headline,
                reportitem_subheadline=reportitems_subheadline)
            reportitems_modified_counter += 1
        except Reportitem.DoesNotExist:
            reportitem = Reportitem()
            reportitems_created_counter += 1
            reportitem.system = system
            reportitem.headline = headline
            reportitem.reportitem_subheadline = reportitems_subheadline
            reportitem.reportitem_created_by_user_id = request.user

        # open file
        reportfile = open(reportpath, "r")
        # add changing values (existing reportitem_note will be overwritten)
        reportitem.reportitem_note = reportfile.read()
        # close file
        reportfile.close()
        reportitem.reportitem_modified_by_user_id = request.user
        reportitem.save()

        # call logger
        reportitem.logger(
            str(request.user),
            " REPORTITEMS_FILESYSTEM_IMPORTER_REPORTITEM_CREATED_OR_MODIFIED")

    # call final messages
    if nofile_found_counter > 0:
        if nofile_found_counter == 1:
            messages.warning(
                request, "No file was found for " + str(nofile_found_counter) +
                " system.")
        else:
            messages.warning(
                request, "No files were found for " +
                str(nofile_found_counter) + " systems.")
    if reportitems_created_counter > 0:
        if reportitems_created_counter == 1:
            messages.success(
                request,
                str(reportitems_created_counter) + ' reportitem was created.')
        else:
            messages.success(
                request,
                str(reportitems_created_counter) +
                ' reportitems were created.')
    if reportitems_modified_counter > 0:
        if reportitems_modified_counter == 1:
            messages.success(
                request,
                str(reportitems_modified_counter) +
                ' reportitem was modified.')
        else:
            messages.success(
                request,
                str(reportitems_modified_counter) +
                ' reportitems were modified.')
    if reportitems_deleted_counter > 0:
        if reportitems_deleted_counter == 1:
            messages.success(
                request,
                str(reportitems_deleted_counter) + ' reportitem was deleted.')
        else:
            messages.success(
                request,
                str(reportitems_deleted_counter) +
                ' reportitems were deleted.')

    return redirect('/systems/')
コード例 #13
0
ファイル: system_creator.py プロジェクト: FabFaeb/dfirtrack
def system_creator_async(request_post, request_user):
    """ function to create many systems at once """

    # call logger
    debug_logger(str(request_user), ' SYSTEM_CREATOR_BEGIN')

    # exctract lines from systemlist (list results from request object via large text area)
    lines = request_post.get('systemlist').splitlines()

    #  count lines (needed for messages)
    number_of_lines = len(lines)

    # set systems_created_counter (needed for messages)
    systems_created_counter = 0

    # set systems_skipped_counter (needed for messages)
    systems_skipped_counter = 0

    # set lines_faulty_counter (needed for messages)
    lines_faulty_counter = 0

    # create empty list (needed for messages)
    skipped_systems = []

    # iterate over lines
    for line in lines:

        # skip emtpy lines
        if line == '':
            # autoincrement counter
            lines_faulty_counter += 1
            # call logger
            warning_logger(str(request_user), ' SYSTEM_CREATOR_ROW_EMPTY')
            continue

        # check line for length of string
        if len(line) > 50:
            # autoincrement counter
            lines_faulty_counter += 1
            # call logger
            warning_logger(str(request_user), ' SYSTEM_CREATOR_LONG_STRING')
            continue

        # check for existence of system
        system = System.objects.filter(system_name=line)
        """ already existing system """

        # in case of existing system
        if system.count() > 0:
            # autoincrement counter
            systems_skipped_counter += 1
            # add system name to list of skipped systems
            skipped_systems.append(line)
            # call logger
            error_logger(
                str(request_user),
                ' SYSTEM_CREATOR_SYSTEM_EXISTS ' + 'system_name:' + line)
            # leave this loop because system with this systemname already exists
            continue
        """ new system """

        # create form with request data
        form = SystemCreatorForm(request_post)

        # create system
        if form.is_valid():
            """ object creation """

            # don't save form yet
            system = form.save(commit=False)

            # set system_name
            system.system_name = line

            # set auto values
            system.system_created_by_user_id = request_user
            system.system_modified_by_user_id = request_user
            system.system_modify_time = timezone.now()

            # save object
            system.save()

            # save manytomany
            form.save_m2m()
            """ object counter / log """

            # autoincrement counter
            systems_created_counter += 1

            # call logger
            system.logger(str(request_user), ' SYSTEM_CREATOR_EXECUTED')
    """ call final messages """

    # finish message
    message_user(request_user, 'System creator finished', constants.SUCCESS)

    # number messages

    if systems_created_counter > 0:
        if systems_created_counter == 1:
            message_user(request_user,
                         str(systems_created_counter) + ' system was created.',
                         constants.SUCCESS)
        else:
            message_user(
                request_user,
                str(systems_created_counter) + ' systems were created.',
                constants.SUCCESS)

    if systems_skipped_counter > 0:
        if systems_skipped_counter == 1:
            message_user(
                request_user,
                str(systems_skipped_counter) + ' system was skipped. ' +
                str(skipped_systems), constants.ERROR)
        else:
            message_user(
                request_user,
                str(systems_skipped_counter) + ' systems were skipped. ' +
                str(skipped_systems), constants.ERROR)

    if lines_faulty_counter > 0:
        if lines_faulty_counter == 1:
            message_user(
                request_user,
                str(lines_faulty_counter) + ' line out of ' +
                str(number_of_lines) +
                ' lines was faulty (see log file for details).',
                constants.WARNING)
        else:
            message_user(
                request_user,
                str(lines_faulty_counter) + ' lines out of ' +
                str(number_of_lines) +
                ' lines were faulty (see log file for details).',
                constants.WARNING)

    # call logger
    info_logger(
        str(request_user),
        ' SYSTEM_CREATOR_STATUS ' + 'created:' + str(systems_created_counter) +
        '|' + 'skipped:' + str(systems_skipped_counter) + '|' +
        'faulty_lines:' + str(lines_faulty_counter))

    # call logger
    debug_logger(str(request_user), ' SYSTEM_CREATOR_END')
コード例 #14
0
ファイル: csv_main.py プロジェクト: sulaimanzai/dfirtrack
def system_handler(request=None, uploadfile=False):

    # get config model
    model = SystemImporterFileCsvConfigModel.objects.get(
        system_importer_file_csv_config_name='SystemImporterFileCsvConfig')
    """ set username for logger and object """

    # if function was called from 'system_instant' and 'system_upload'
    if request:
        # get user for object
        csv_import_user = request.user
        # get user for logger
        logger_username = str(request.user)
    # if function was called from 'system_cron'
    else:
        # get user for object
        csv_import_user = model.csv_import_username
        # get user for logger
        logger_username = model.csv_import_username.username
    """ start system importer """

    # get starttime
    starttime = timezone.now().strftime('%Y-%m-%d %H:%M:%S')

    # call logger
    debug_logger(logger_username, ' SYSTEM_IMPORTER_FILE_CSV_START')

    # create lock tags
    create_lock_tags(model)
    """ file handling  """

    # file was uploaded via form (called via 'system_upload')
    if uploadfile:
        # text object can not be passed as argument from 'system_upload'
        systemcsv = TextIOWrapper(request.FILES['systemcsv'].file,
                                  encoding=request.encoding)
    # file was fetched from file system (called via 'system_instant' or 'system_cron')
    else:
        # build csv file path
        csv_import_file = model.csv_import_path + '/' + model.csv_import_filename
        # open file
        systemcsv = open(csv_import_file, 'r')

    # get field delimiter from config
    if model.csv_field_delimiter == 'field_comma':
        delimiter = ','
    elif model.csv_field_delimiter == 'field_semicolon':
        delimiter = ';'

    # get text quotechar from config
    if model.csv_text_quote == 'text_double_quotation_marks':
        quotechar = '"'
    elif model.csv_text_quote == 'text_single_quotation_marks':
        quotechar = "'"

    # read rows out of csv
    rows = csv.reader(systemcsv, delimiter=delimiter, quotechar=quotechar)
    """ check file """

    # if function was called from 'system_instant' and 'system_upload'
    if request:
        # check file for csv respectively some kind of text file
        file_check = check_content_file_type(rows, logger_username, request)
    # if function was called from 'system_cron'
    else:
        # check file for csv respectively some kind of text file
        file_check = check_content_file_type(rows, logger_username)

    # leave system_importer_file_csv if file check throws errors
    if not file_check:
        # close file
        systemcsv.close()
        # return to calling function 'csv.system_cron' or 'csv.system_instant' or 'csv.system_upload'
        return

    # jump to begin of file again after iterating in file check
    systemcsv.seek(0)
    """ prepare loop """

    # set row_counter (needed for logger)
    row_counter = 1

    # set systems_created_counter (needed for logger)
    systems_created_counter = 0

    # set systems_updated_counter (needed for logger)
    systems_updated_counter = 0

    # set systems_multiple_counter (needed for logger)
    systems_multiple_counter = 0

    # create empty list (needed for logger)
    systems_multiple_list = []

    # set systems_skipped_counter (needed for logger)
    systems_skipped_counter = 0
    """ start loop """

    # iterate over rows
    for row in rows:
        """ skip headline if necessary """

        # check for first row and headline condition
        if row_counter == 1 and model.csv_headline:
            # autoincrement row counter
            row_counter += 1
            # leave loop for headline row
            continue
        """ filter for systems """

        # if function was called from 'system_instant' and 'system_upload'
        if request:
            # check system_name for valid value
            stop_system_importer_file_csv = check_system_name(
                model, row, row_counter, request)
        # if function was called from 'system_cron'
        else:
            # check system_name for valid value
            stop_system_importer_file_csv = check_system_name(
                model, row, row_counter)

        # leave loop if system_name caused errors
        if stop_system_importer_file_csv:
            # autoincrement counter
            systems_skipped_counter += 1
            # autoincrement row counter
            row_counter += 1
            # leave loop
            continue

        # get system name (for domain name comparison)
        system_name = row[model.csv_column_system - 1]

        # TODO: [logic] add option which attributes are used for filtering?
        # TODO: [logic] (like domain, dnsname, company)
        # TODO: [logic] e.g. 'csv_identification_dnsname'

        # get all systems
        systemquery = System.objects.filter(system_name=system_name, )
        """ check how many systems were returned """

        # if there is only one system -> modify system
        if len(systemquery) == 1:

            # skip if system already exists (depending on csv_skip_existing_system)
            if model.csv_skip_existing_system:

                # autoincrement counter
                systems_skipped_counter += 1
                # autoincrement row counter
                row_counter += 1
                # leave loop
                continue

            # TODO: [logic] add option which attributes are used for filtering?
            # TODO: [logic] (like domain, dnsname, company)
            # TODO: [logic] e.g. 'csv_identification_dnsname'

            # get existing system object
            system = System.objects.get(system_name=system_name, )

            # change mandatory meta attributes
            system.system_modify_time = timezone.now()
            system.system_modified_by_user_id = csv_import_user

            # set value for already existing system (modify system)
            system_created = False

            # if function was called from 'system_instant' and 'system_upload'
            if request:
                # add foreign key relationships to system
                system = add_fk_attributes(system, system_created, model, row,
                                           row_counter, request)
            # if function was called from 'system_cron'
            else:
                # add foreign key relationships to system
                system = add_fk_attributes(system, system_created, model, row,
                                           row_counter)

            # save object
            system.save()

            # if function was called from 'system_instant' and 'system_upload'
            if request:
                # add many2many relationships to system
                system = add_many2many_attributes(system, system_created,
                                                  model, row, row_counter,
                                                  request)
            # if function was called from 'system_cron'
            else:
                # add many2many relationships to system
                system = add_many2many_attributes(system, system_created,
                                                  model, row, row_counter)

            # autoincrement systems_updated_counter
            systems_updated_counter += 1

            # call logger
            system.logger(logger_username,
                          ' SYSTEM_IMPORTER_FILE_CSV_SYSTEM_MODIFIED')

        # if there is more than one system
        elif len(systemquery) > 1:

            # add system name to list
            systems_multiple_list.append(system_name)

            # autoincrement systems_multiple_counter
            systems_multiple_counter += 1

            # call logger
            warning_logger(
                logger_username,
                f' SYSTEM_IMPORTER_FILE_CSV_MULTIPLE_SYSTEMS System:{system_name}'
            )

        # if there is no system -> create system
        else:

            # create new system object
            system = System()

            # add system_name from csv
            system.system_name = system_name

            # add mandatory meta attributes
            system.system_modify_time = timezone.now()
            system.system_created_by_user_id = csv_import_user
            system.system_modified_by_user_id = csv_import_user

            # set value for new system (create system)
            system_created = True

            # if function was called from 'system_instant' and 'system_upload'
            if request:
                # add foreign key relationships to system
                system = add_fk_attributes(system, system_created, model, row,
                                           row_counter, request)
            # if function was called from 'system_cron'
            else:
                # add foreign key relationships to system
                system = add_fk_attributes(system, system_created, model, row,
                                           row_counter)

            # save object
            system.save()

            # if function was called from 'system_instant' and 'system_upload'
            if request:
                # add many2many relationships to system
                system = add_many2many_attributes(system, system_created,
                                                  model, row, row_counter,
                                                  request)
            # if function was called from 'system_cron'
            else:
                # add many2many relationships to system
                system = add_many2many_attributes(system, system_created,
                                                  model, row, row_counter)

            # autoincrement systems_created_counter
            systems_created_counter += 1

            # call logger
            system.logger(logger_username,
                          ' SYSTEM_IMPORTER_FILE_CSV_SYSTEM_CREATED')

        # autoincrement row counter
        row_counter += 1

    # close file
    systemcsv.close()
    """ finish system importer """

    # get endtime
    endtime = timezone.now().strftime('%Y-%m-%d %H:%M:%S')

    # if function was called from 'system_instant' and 'system_upload'
    if request:
        # call final messages
        final_messages(
            systems_created_counter,
            systems_updated_counter,
            systems_skipped_counter,
            systems_multiple_counter,
            systems_multiple_list,
            request,
        )
    # if function was called from 'system_cron'
    else:
        # call final messages
        final_messages_cron(
            systems_created_counter,
            systems_updated_counter,
            systems_skipped_counter,
            systems_multiple_counter,
            systems_multiple_list,
            starttime,
            endtime,
        )

    # call logger
    info_logger(
        logger_username, f' SYSTEM_IMPORTER_FILE_CSV_STATUS'
        f' created:{systems_created_counter}'
        f'|updated:{systems_updated_counter}'
        f'|skipped:{systems_skipped_counter}'
        f'|multiple:{systems_multiple_counter}')
    # call logger
    debug_logger(logger_username, ' SYSTEM_IMPORTER_FILE_CSV_END')

    # return to calling function 'csv.system_cron' or 'csv.system_instant' or 'csv.system_upload'
    return
コード例 #15
0
ファイル: filesystem.py プロジェクト: fxcebx/dfirtrack
def reportitem(request):
    """ this function checks for every system the existence of a markdown file with information about system the and imports the content of this file as reportitem for the corresponding system """

    # call logger
    debug_logger(str(request.user), " REPORTITEM_IMPORTER_FILE_FILESYSTEM_BEGAN")

    # check config before continuing
    stop_reportitem_importer_file_filesystem = check_config(request)

    # leave reportitem_importer_file_filesystem if variables caused errors
    if stop_reportitem_importer_file_filesystem:
        return redirect(reverse('system_list'))

    # get all system objects
    systems = System.objects.all()

    # create headline if it does not exist
    headline, created = Headline.objects.get_or_create(headline_name=dfirtrack_config.REPORTITEM_HEADLINE)
    if created == True:
        # call logger
        headline.logger(str(request.user), " REPORTITEM_IMPORTER_FILE_FILESYSTEM_HEADLINE_CREATED")

    # set counter for non-existing files (needed for messages)
    nofile_found_counter = 0

    # set counter for created reportitems (needed for messages)
    reportitems_created_counter = 0

    # set counter for modified reportitems (needed for messages)
    reportitems_modified_counter = 0

    # set counter for deleted reportitems (needed for messages)
    reportitems_deleted_counter = 0

    # iterate over systems
    for system in systems:

        # create path for reportfile
        reportpath = dfirtrack_config.REPORTITEM_FILESYSTEMPATH + "/" + system.system_name + ".md"

        # check whether a file is existing for this system
        if not os.path.isfile(reportpath):
            # call logger
            warning_logger(str(request.user), " REPORTITEM_IMPORTER_FILE_FILESYSTEM_NO_FILE system_name:" + system.system_name)
            # autoincrement counter
            nofile_found_counter += 1

            # check whether already existing reportitem for this system should be deleted if no file was provided
            if dfirtrack_config.REPORTITEM_DELETE:
                # delete already existing reportitem for this system if no file was provided
                try:
                    reportitem = Reportitem.objects.get(system = system, headline = headline, reportitem_subheadline = dfirtrack_config.REPORTITEM_SUBHEADLINE)
                    # call logger (before deleting instance)
                    reportitem.logger(str(request.user), " REPORTITEM_IMPORTER_FILE_FILESYSTEM_REPORTITEM_DELETED")
                    reportitem.delete()
                    # autoincrement counter
                    reportitems_deleted_counter += 1
                except Reportitem.DoesNotExist:
                    pass

            # continue with next system
            continue

        # create reportitem if it does not exist (get_or_create won't work in this context because of needed user objects for saving)
        try:
            reportitem = Reportitem.objects.get(system = system, headline = headline, reportitem_subheadline = dfirtrack_config.REPORTITEM_SUBHEADLINE)
            reportitems_modified_counter += 1
        except Reportitem.DoesNotExist:
            reportitem = Reportitem()
            reportitems_created_counter += 1
            reportitem.system = system
            reportitem.headline = headline
            reportitem.reportitem_subheadline = dfirtrack_config.REPORTITEM_SUBHEADLINE
            reportitem.reportitem_created_by_user_id = request.user

        # open file
        reportfile = open(reportpath, "r")
        # add changing values (existing reportitem_note will be overwritten)
        reportitem.reportitem_note = reportfile.read()
        # close file
        reportfile.close()
        reportitem.reportitem_modified_by_user_id = request.user
        reportitem.save()

        # call logger
        reportitem.logger(str(request.user), " REPORTITEM_IMPORTER_FILE_FILESYSTEM_REPORTITEM_CREATED_OR_MODIFIED")

    # call final messages
    if nofile_found_counter > 0:
        if nofile_found_counter == 1:
            messages.warning(request, "No file was found for " + str(nofile_found_counter) + " system.")
        else:
            messages.warning(request, "No files were found for " + str(nofile_found_counter) + " systems.")
    if reportitems_created_counter > 0:
        if reportitems_created_counter  == 1:
            messages.success(request, str(reportitems_created_counter) + ' reportitem was created.')
        else:
            messages.success(request, str(reportitems_created_counter) + ' reportitems were created.')
    if reportitems_modified_counter > 0:
        if reportitems_modified_counter  == 1:
            messages.success(request, str(reportitems_modified_counter) + ' reportitem was modified.')
        else:
            messages.success(request, str(reportitems_modified_counter) + ' reportitems were modified.')
    if reportitems_deleted_counter > 0:
        if reportitems_deleted_counter  == 1:
            messages.success(request, str(reportitems_deleted_counter) + ' reportitem was deleted.')
        else:
            messages.success(request, str(reportitems_deleted_counter) + ' reportitems were deleted.')

    return redirect(reverse('system_list'))
コード例 #16
0
ファイル: giraf_check_data.py プロジェクト: dekoder/dfirtrack
def check_config(request):                              # coverage: ignore branch
    """ check variables in `dfirtrack.config` """

    # reset stop condition
    stop_importer_api_giraf = False

    # check GIRAF_URL for string
    if not isinstance(dfirtrack_config.GIRAF_URL, str):
        messages.error(request, "`GIRAF_URL` is not a string. Check `dfirtrack.config`!")
        # call logger
        warning_logger(str(request.user), " IMPORTER_API_GIRAF variable GIRAF_URL no string")
        stop_importer_api_giraf = True

    # check GIRAF_URL for empty string (check only if it actually is a string)
    if isinstance(dfirtrack_config.GIRAF_URL, str) and not dfirtrack_config.GIRAF_URL:
        messages.error(request, "`GIRAF_URL` contains an empty string. Check `dfirtrack.config`!")
        # call logger
        warning_logger(str(request.user), " IMPORTER_API_GIRAF variable GIRAF_URL empty string")
        stop_importer_api_giraf = True

    # check GIRAF_USER for string
    if not isinstance(dfirtrack_config.GIRAF_USER, str):
        messages.error(request, "`GIRAF_USER` is not a string. Check `dfirtrack.config`!")
        # call logger
        warning_logger(str(request.user), " IMPORTER_API_GIRAF variable GIRAF_USER no string")
        stop_importer_api_giraf = True

    # check GIRAF_USER for empty string (check only if it actually is a string)
    if isinstance(dfirtrack_config.GIRAF_USER, str) and not dfirtrack_config.GIRAF_USER:
        messages.error(request, "`GIRAF_USER` contains an empty string. Check `dfirtrack.config`!")
        # call logger
        warning_logger(str(request.user), " IMPORTER_API_GIRAF variable GIRAF_USER empty string")
        stop_importer_api_giraf = True

    # check GIRAF_PASS for string
    if not isinstance(dfirtrack_config.GIRAF_PASS, str):
        messages.error(request, "`GIRAF_PASS` is not a string. Check `dfirtrack.config`!")
        # call logger
        warning_logger(str(request.user), " IMPORTER_API_GIRAF variable GIRAF_PASS no string")
        stop_importer_api_giraf = True

    # check GIRAF_PASS for empty string (check only if it actually is a string)
    if isinstance(dfirtrack_config.GIRAF_PASS, str) and not dfirtrack_config.GIRAF_PASS:
        messages.error(request, "`GIRAF_PASS` contains an empty string. Check `dfirtrack.config`!")
        # call logger
        warning_logger(str(request.user), " IMPORTER_API_GIRAF variable GIRAF_PASS empty string")
        stop_importer_api_giraf = True

    return stop_importer_api_giraf
コード例 #17
0
def system_modificator(request):
    """function to modify many systems at once (helper function to call the real function)"""

    # form was valid to post
    if request.method == "POST":

        try:
            request.POST['systemlist']
        except:
            # call logger
            warning_logger(str(request.user),
                           ' SYSTEM_MODIFICATOR_NO_SYSTEMS_PROVIDED')
            # show immediate message for user
            messages.warning(request, 'No systems were provided.')

            # return directly to system list
            return redirect(reverse('system_list'))

        # get objects from request object
        request_post = request.POST
        request_user = request.user

        # show immediate message for user
        messages.success(request, 'System modificator started')

        # call async function
        async_task(
            "dfirtrack_main.modificator.system_modificator.system_modificator_async",
            request_post,
            request_user,
        )

        # return directly to system list
        return redirect(reverse('system_list'))

    # show empty form
    else:

        show_systemlist = bool(int(request.GET.get('systemlist', 0)))

        # workflows
        workflows = Workflow.objects.all()

        # show empty form with default values for convenience and speed reasons
        form = SystemModificatorForm(
            initial={
                'systemstatus_choice': 'keep_status',
                'analysisstatus_choice': 'keep_status',
                'company_delete': 'keep_not_add',
                'tag_delete': 'keep_not_add',
                'contact_delete': 'keep_existing',
                'location_delete': 'keep_existing',
                'serviceprovider_delete': 'keep_existing',
            },
            use_system_charfield=show_systemlist,
        )

        # call logger
        debug_logger(str(request.user), ' SYSTEM_MODIFICATOR_ENTERED')

    return render(
        request,
        'dfirtrack_main/system/system_modificator.html',
        {
            'form': form,
            'workflows': workflows
        },
    )
コード例 #18
0
def system_modificator_async(request_post, request_user):
    """ function to modify many systems at once """

    # call logger
    debug_logger(str(request_user), " SYSTEM_MODIFICATOR_BEGIN")

    # exctract lines from systemlist (list results from request object via large text area)
    lines = request_post.get('systemlist').splitlines()

    # iterate over lines
    for line in lines:

        # skip emtpy lines
        if line == '':
            warning_logger(str(request_user), " SYSTEM_MODIFICATOR_ROW_EMPTY")
            continue

        # check line for string
        if not isinstance(line, str):
            warning_logger(str(request_user), " SYSTEM_MODIFICATOR_NO_STRING")
            continue

        # check line for length of string
        if len(line) > 50:
            warning_logger(str(request_user), " SYSTEM_MODIFICATOR_LONG_STRING")
            continue

        # check for existence of system
        system = System.objects.filter(system_name = line)
        if system.count() == 0:
            # call logger
            error_logger(str(request_user), " SYSTEM_MODIFICATOR_SYSTEM_DOES_NOT_EXISTS " + "system_name:" + line)
            # leave this loop because system with this systemname does not exist
            continue
        elif system.count() > 1:
            # call logger
            error_logger(str(request_user), " SYSTEM_MODIFICATOR_SYSTEM_NOT_DISTINCT " + "system_name:" + line)
            # leave this loop because system with this systemname is not distinct
            continue

        # get existing system
        system = System.objects.get(system_name = line)

        # create form with request data
        form = SystemModificatorForm(request_post, instance = system)

        # extract tags (list results from request object via multiple choice field)
        tags = request_post.getlist('tag')

        # modify system
        if form.is_valid():

            # don't save form yet
            system = form.save(commit=False)

            # set system_name
            system.system_name = line

            # set auto values
            system.system_modified_by_user_id = request_user
            system.system_modify_time = timezone.now()

            # save object
            system.save()

            # call logger
            system.logger(str(request_user), ' SYSTEM_MODIFICATOR_EXECUTED')

            # TODO: add check for empty list
            # add tags (using save_m2m would replace existing tags)
            for tag_id in tags:
                # get object
                tag = Tag.objects.get(tag_id=tag_id)
                # add tag to system
                system.tag.add(tag)

    # call logger
    debug_logger(str(request_user), " SYSTEM_MODIFICATOR_END")
コード例 #19
0
def entry(request):
    """ this form parses a file and tries to get entries for a single system """

    # form was valid to post
    if request.method == "POST":

        # call logger
        debug_logger(str(request.user), " ENTRY_TXT_IMPORTER_BEGIN")

        # get text out of file (variable results from request object via file upload field)
        entryfile = TextIOWrapper(request.FILES['entryfile'].file,
                                  encoding=request.encoding)

        # set row counter (needed for logger)
        i = 0

        # iterate over rows in file
        for row in entryfile:

            # autoincrement row counter
            i += 1

            # skip first two lines # TODO: remove first two lines from parsing script
            if i == 1 or i == 2:
                continue

            # split line from markdown table format to single values
            column = row.split("|")

            # check row for empty value
            if len(column) < 6:
                warning_logger(
                    str(request.user), " ENTRY_TXT_IMPORTER_SYSTEM_COLUMN " +
                    "row_" + str(i) + ":empty_row")
                continue

            # get values of former markdown tables
            entry_date = column[1]
            entry_utc = column[2]
            entry_system = column[3]
            entry_type = column[4]
            entry_content = column[5]

            # remove trailing and leading whitespaces
            entry_date = entry_date.strip()
            entry_utc = entry_utc.strip()
            entry_system = entry_system.strip()
            entry_type = entry_type.strip()
            entry_content = entry_content.strip()

            # concatenate all relevant entry values to a string for hashing
            entry_string = entry_date + entry_utc + entry_system + entry_type + entry_content

            # calculate hash from entry values
            entry_hash = hashlib.sha1(entry_string.encode('utf8'))
            entry_sha1 = entry_hash.hexdigest()

            # get system_id as string from POST object
            system = request.POST['system']

            # check for existing entry_sha1 for this system and skip if it already exist
            try:
                check_entry = Entry.objects.get(system=system,
                                                entry_sha1=entry_sha1)
                warning_logger(
                    str(request.user), " ENTRY_TXT_IMPORTER_ENTRY_EXISTS " +
                    "row_" + str(i) + ":entry_exists")
                continue
            except:
                pass

            # convert timing information to datetime object
            entry_time = parse(entry_date + " " + entry_utc + "+00:00")

            # create form with request data
            form = EntryFileImport(request.POST, request.FILES)

            # create entry
            if form.is_valid():

                pass
                # don't save form yet
                entry = form.save(commit=False)

                # set values from file (row / column)
                entry.entry_time = entry_time
                entry.entry_sha1 = entry_sha1
                entry.entry_date = entry_date
                entry.entry_utc = entry_utc
                entry.entry_system = entry_system
                entry.entry_type = entry_type
                entry.entry_content = entry_content

                # set auto values
                entry.entry_created_by_user_id = request.user
                entry.entry_modified_by_user_id = request.user

                # save object
                entry.save()

                # call logger
                entry.logger(str(request.user), ' ENTRY_TXT_IMPORTER_EXECUTED')

        # call logger
        debug_logger(str(request.user), " ENTRY_TXT_IMPORTER_END")

        return redirect(reverse('system_detail', args=(system, )))

    else:
        # show empty form with preselected system
        if request.method == 'GET' and 'system' in request.GET:
            system = request.GET['system']
            form = EntryFileImport(initial={
                'system': system,
            })
        else:
            # show empty form
            form = EntryFileImport()

        # call logger
        debug_logger(str(request.user), " ENTRY_TXT_IMPORTER_ENTERED")
    return render(request, 'dfirtrack_main/entry/entry_file_importer.html',
                  {'form': form})
コード例 #20
0
def check_config(request):
    """ check variables of dfirtrack.config """

    # reset stop condition
    stop_reportitem_importer_file_filesystem = False

    # check REPORTITEM_FILESYSTEMPATH for string
    if not isinstance(dfirtrack_config.REPORTITEM_FILESYSTEMPATH, str):
        messages.error(
            request,
            "`REPORTITEM_FILESYSTEMPATH` is not a string. Check `dfirtrack.config`!"
        )
        # call logger
        warning_logger(
            str(request.user),
            " REPORTITEM_IMPORTER_FILE_FILESYSTEM variable REPORTITEM_FILESYSTEMPATH no string"
        )
        stop_reportitem_importer_file_filesystem = True

    # check REPORTITEM_FILESYSTEMPATH for empty string (check only if it is a string)
    if isinstance(dfirtrack_config.REPORTITEM_FILESYSTEMPATH,
                  str) and not dfirtrack_config.REPORTITEM_FILESYSTEMPATH:
        messages.error(
            request,
            "`REPORTITEM_FILESYSTEMPATH` contains an empty string. Check `dfirtrack.config`!"
        )
        # call logger
        warning_logger(
            str(request.user),
            " REPORTITEM_IMPORTER_FILE_FILESYSTEM variable REPORTITEM_FILESYSTEMPATH empty string"
        )
        stop_reportitem_importer_file_filesystem = True

    # check REPORTITEM_FILESYSTEMPATH existing directory (check only if REPORTITEM_FILESYSTEMPATH is a string and not an empty string)
    if isinstance(dfirtrack_config.REPORTITEM_FILESYSTEMPATH,
                  str) and dfirtrack_config.REPORTITEM_FILESYSTEMPATH:
        if not os.path.isdir(dfirtrack_config.REPORTITEM_FILESYSTEMPATH):
            messages.error(
                request,
                "`REPORTITEM_FILESYSTEMPATH` points to a non-existing directory. Check `dfirtrack.config`!"
            )
            # call logger
            warning_logger(
                str(request.user),
                " REPORTITEM_IMPORTER_FILE_FILESYSTEM variable REPORTITEM_FILESYSTEMPATH path does not exist"
            )
            stop_reportitem_importer_file_filesystem = True

    # check REPORTITEM_HEADLINE for string
    if not isinstance(dfirtrack_config.REPORTITEM_HEADLINE, str):
        messages.error(
            request,
            "`REPORTITEM_HEADLINE` is not a string. Check `dfirtrack.config`!")
        # call logger
        warning_logger(
            str(request.user),
            " REPORTITEM_IMPORTER_FILE_FILESYSTEM variable REPORTITEM_HEADLINE no string"
        )
        stop_reportitem_importer_file_filesystem = True

    # check REPORTITEM_HEADLINE for empty string (check only if it is a string)
    if isinstance(dfirtrack_config.REPORTITEM_HEADLINE,
                  str) and not dfirtrack_config.REPORTITEM_HEADLINE:
        messages.error(
            request,
            "`REPORTITEM_HEADLINE` contains an empty string. Check `dfirtrack.config`!"
        )
        # call logger
        warning_logger(
            str(request.user),
            " REPORTITEM_IMPORTER_FILE_FILESYSTEM variable REPORTITEM_HEADLINE empty string"
        )
        stop_reportitem_importer_file_filesystem = True

    # check REPORTITEM_SUBHEADLINE for string
    if not isinstance(dfirtrack_config.REPORTITEM_SUBHEADLINE, str):
        messages.error(
            request,
            "`REPORTITEM_SUBHEADLINE` is not a string. Check `dfirtrack.config`!"
        )
        # call logger
        warning_logger(
            str(request.user),
            " REPORTITEM_IMPORTER_FILE_FILESYSTEM variable REPORTITEM_SUBHEADLINE no string"
        )
        stop_reportitem_importer_file_filesystem = True

    # check REPORTITEM_SUBHEADLINE for empty string (check only if it is a string)
    if isinstance(dfirtrack_config.REPORTITEM_SUBHEADLINE,
                  str) and not dfirtrack_config.REPORTITEM_SUBHEADLINE:
        messages.error(
            request,
            "`REPORTITEM_SUBHEADLINE` contains an empty string. Check `dfirtrack.config`!"
        )
        # call logger
        warning_logger(
            str(request.user),
            " REPORTITEM_IMPORTER_FILE_FILESYSTEM variable REPORTITEM_SUBHEADLINE empty string"
        )
        stop_reportitem_importer_file_filesystem = True

    # check REPORTITEM_DELETE for bool
    if not isinstance(dfirtrack_config.REPORTITEM_DELETE, bool):
        messages.error(
            request,
            "`REPORTITEM_DELETE` is not boolean. Check `dfirtrack.config`!")
        # call logger
        warning_logger(
            str(request.user),
            " REPORTITEM_IMPORTER_FILE_FILESYSTEM variable REPORTITEM_DELETE not boolean"
        )
        stop_reportitem_importer_file_filesystem = True

    # create final message and log
    if stop_reportitem_importer_file_filesystem:
        messages.warning(request, "Nothing was changed.")
        # call logger
        warning_logger(
            str(request.user),
            " REPORTITEM_IMPORTER_FILE_FILESYSTEM_ENDED_WITH_ERRORS")

    return stop_reportitem_importer_file_filesystem
コード例 #21
0
def system_modificator_async(request_post, request_user):
    """function to modify many systems at once"""

    # call logger
    debug_logger(str(request_user), ' SYSTEM_MODIFICATOR_START')

    # extract lines from systemlist (list results either from request object via multiline selector or via large text area)
    lines = request_post.getlist('systemlist')
    system_char_field_used = False
    # if large text area was used, the list contains only one entry with (one or more) line breaks
    if len(lines) == 1 and ("\r\n" in lines[0] or not lines[0].isdigit()):
        system_char_field_used = True
        lines = lines[0].splitlines()
    """ prepare and start loop """

    #  count lines (needed for messages)
    number_of_lines = len(lines)

    # set systems_modified_counter (needed for messages)
    systems_modified_counter = 0

    # set systems_skipped_counter (needed for messages)
    systems_skipped_counter = 0

    # set lines_faulty_counter (needed for messages)
    lines_faulty_counter = 0

    # create empty list (needed for messages)
    skipped_systems = []

    # workflows to apply
    workflows = request_post.getlist("workflow")

    # set workflows_applied (needed for messages)
    if workflows:
        workflow_count = len(workflows)
    else:
        workflow_count = 0
    workflows_applied = 0

    # iterate over lines
    for line in lines:

        # skip empty lines
        if line == '':
            # autoincrement counter
            lines_faulty_counter += 1
            # call logger
            warning_logger(str(request_user), ' SYSTEM_MODIFICATOR_ROW_EMPTY')
            continue

        # check line for string
        if not isinstance(line, str):  # coverage: ignore branch
            # autoincrement counter
            lines_faulty_counter += 1
            # call logger
            warning_logger(str(request_user), ' SYSTEM_MODIFICATOR_NO_STRING')
            continue

        # check line for length of string
        if len(line) > 50:
            # autoincrement counter
            lines_faulty_counter += 1
            # call logger
            warning_logger(str(request_user),
                           ' SYSTEM_MODIFICATOR_LONG_STRING')
            continue

        # check for existence of system
        if system_char_field_used:
            system = System.objects.filter(system_name=line)
        else:
            system = System.objects.filter(system_id=line)
        """ handling non-existing (== 0) or non-unique (> 1) systems """

        # system does not exist
        if system.count() == 0:

            # autoincrement counter
            systems_skipped_counter += 1
            # add system name to list of skipped systems
            skipped_systems.append(line)
            # call logger
            warning_logger(
                str(request_user),
                f' SYSTEM_MODIFICATOR_SYSTEM_DOES_NOT_EXISTS system_id/system_name:{line}',
            )
            # leave this loop because system with this systemname does not exist
            continue

        # more than one system exists
        elif system.count() > 1:

            # autoincrement counter
            systems_skipped_counter += 1
            # add system name to list of skipped systems
            skipped_systems.append(line)
            # call logger
            warning_logger(
                str(request_user),
                f' SYSTEM_MODIFICATOR_SYSTEM_NOT_DISTINCT system_id/system_name:{line}',
            )
            # leave this loop because system with this systemname is not distinct
            continue
        """ unique system (== 1) """

        # get existing system
        if system_char_field_used:
            system = System.objects.get(system_name=line)
        else:
            system = System.objects.get(system_id=line)

        # create form with request data
        form = SystemModificatorForm(
            request_post,
            instance=system,
            use_system_charfield=system_char_field_used)

        # extract tags (list results from request object via multiple choice field)
        tags = request_post.getlist('tag')

        # extract companies (list results from request object via multiple choice field)
        companies = request_post.getlist('company')

        # TODO: [code] add condition for invalid form, not implemented yet because of multiple constraints

        # modify system
        if form.is_valid():
            """object modification"""

            # don't save form yet
            system = form.save(commit=False)

            # set auto values
            system.system_modified_by_user_id = request_user
            """ status fields """

            # replace, if 'change status' was selected (checking for status value independent of form field validation)
            if (form['analysisstatus_choice'].value() == 'change_status'
                    and form['analysisstatus'].value()):

                # replace status
                analysisstatus_id = form['analysisstatus'].value()
                analysisstatus = Analysisstatus.objects.get(
                    analysisstatus_id=analysisstatus_id)
                system.analysisstatus = analysisstatus

            # replace, if 'change status' was selected (checking for status value independent of form field validation)
            if (form['systemstatus_choice'].value() == 'change_status'
                    and form['systemstatus'].value()):

                # replace status
                systemstatus_id = form['systemstatus'].value()
                systemstatus = Systemstatus.objects.get(
                    systemstatus_id=systemstatus_id)
                system.systemstatus = systemstatus
            """ fk non-model fields """

            # replace / delete, if 'switch_new / Switch to selected item or none' was selected
            if form['contact_delete'].value() == 'switch_new':

                # replace, if value was submitted via form
                if form['contact'].value():
                    contact_id = form['contact'].value()
                    contact = Contact.objects.get(contact_id=contact_id)
                    system.contact = contact
                # delete, if form field was empty
                else:
                    system.contact = None

            # replace / delete, if 'switch_new / Switch to selected item or none' was selected
            if form['location_delete'].value() == 'switch_new':

                # replace, if value was submitted via form
                if form['location'].value():
                    location_id = form['location'].value()
                    location = Location.objects.get(location_id=location_id)
                    system.location = location
                # delete, if form field was empty
                else:
                    system.location = None

            # replace / delete, if 'switch_new / Switch to selected item or none' was selected
            if form['serviceprovider_delete'].value() == 'switch_new':

                # replace, if value was submitted via form
                if form['serviceprovider'].value():
                    serviceprovider_id = form['serviceprovider'].value()
                    serviceprovider = Serviceprovider.objects.get(
                        serviceprovider_id=serviceprovider_id)
                    system.serviceprovider = serviceprovider
                # delete, if form field was empty
                else:
                    system.serviceprovider = None

            # save object
            system.save()
            """ object counter / log """

            # autoincrement counter
            systems_modified_counter += 1

            # call logger
            system.logger(str(request_user), ' SYSTEM_MODIFICATOR_EXECUTED')
            """ many 2 many """

            # remove existing relations if 'remove_and_add / Delete existing and add new items' was selected
            if form['tag_delete'].value() == 'remove_and_add':

                # remove all m2m
                system.tag.clear()

            # add new relations if not 'keep_not_add / Do not change and keep existing' was selected
            if form['tag_delete'].value() != 'keep_not_add':

                # add new tags (using save_m2m would replace existing tags it there were any)
                for tag_id in tags:
                    # get object
                    tag = Tag.objects.get(tag_id=tag_id)
                    # add tag to system
                    system.tag.add(tag)

            # remove existing relations if 'remove_and_add / Delete existing and add new items' was selected
            if form['company_delete'].value() == 'remove_and_add':

                # remove all m2m
                system.company.clear()

            # add new relations if not 'keep_not_add / Do not change and keep existing' was selected
            if form['company_delete'].value() != 'keep_not_add':

                # add new companies (using save_m2m would replace existing companies it there were any)
                for company_id in companies:
                    # get object
                    company = Company.objects.get(company_id=company_id)
                    # add company to system
                    system.company.add(company)

            # apply workflows
            if workflows:
                error_code = Workflow.apply(workflows, system, request_user)
                if error_code:
                    system.logger(str(request_user),
                                  ' COULD_NOT_APPLY_WORKFLOW')
                else:
                    workflows_applied += workflow_count
    """ finish system modificator """

    # call final messages
    final_messages(
        systems_modified_counter,
        systems_skipped_counter,
        lines_faulty_counter,
        skipped_systems,
        number_of_lines,
        request_user,
        workflow_count,
        workflows_applied,
    )

    # call logger
    info_logger(
        str(request_user),
        f' SYSTEM_MODIFICATOR_STATUS'
        f' modified:{systems_modified_counter}'
        f'|skipped:{systems_skipped_counter}'
        f'|faulty_lines:{lines_faulty_counter}',
    )

    # call logger
    debug_logger(str(request_user), ' SYSTEM_MODIFICATOR_END')
コード例 #22
0
def add_many2many_attributes(system, system_created, model, row, row_counter, request=None):
    """ add many2many relationships to system """

    """ set username for logger and object """

    # if function was called from 'system_instant' and 'system_upload'
    if request:
        # get user for object
        csv_import_user = request.user
        # get user for logger
        logger_username = str(request.user)
    # if function was called from 'system_cron'
    else:
        # get user for object
        csv_import_user = model.csv_import_username
        # get user for logger
        logger_username = model.csv_import_username.username

    """ IP addresses """

    # add IPs for new system or change if remove old is set
    if system_created or (not system_created and model.csv_remove_ip):

        # remove IPs if not new system
        if not system_created:
            # remove all IPs
            system.ip.clear()

        # get IPs from CSV
        if model.csv_choice_ip:
            # check for index error
            try:
                # get IP string
                ip_string = row[model.csv_column_ip - 1]
                # check for empty string
                if ip_string:
                    # get IP delimiter from config
                    if model.csv_ip_delimiter == 'ip_comma':
                        ip_delimiter = ','
                    elif model.csv_ip_delimiter == 'ip_semicolon':
                        ip_delimiter = ';'
                    elif model.csv_ip_delimiter == 'ip_space':
                        ip_delimiter = ' '
                    # split IP string to list depending on delimiter
                    ip_list = ip_string.split(ip_delimiter)
                    # iterate over list elements
                    for ip_ip in ip_list:
                        # if function was called from 'system_instant' and 'system_upload'
                        if request:
                            # check, get or create IP
                            ip = check_and_create_ip(ip_ip, model, row_counter, request)
                        # if function was called from 'system_cron'
                        else:
                            # check, get or create IP
                            ip = check_and_create_ip(ip_ip, model, row_counter)
                        # IP was returned from 'check_and_create_ip'
                        if ip:
                            # add ip to system
                            system.ip.add(ip)
            # index out of range
            except IndexError:
                # if function was called from 'system_instant' and 'system_upload'
                if request:
                    # call message
                    messages.warning(request, f'Index for IP in row {row_counter} was out of range.')
                # call logger
                warning_logger(logger_username, f' SYSTEM_IMPORTER_FILE_CSV_IP_COLUMN row_{row_counter}:out_of_range')

    """ case """

    # set case for new system or change if remove old is set
    if system_created or (not system_created and model.csv_remove_case):

        # remove cases if not new system
        if not system_created:
            # remove all cases
            system.case.clear()

        # get case from CSV
        if model.csv_choice_case:
            # check for index error
            try:
                # get case from CSV column
                case_name = row[model.csv_column_case - 1]
                # check for empty string
                if case_name:
                    # get existing case
                    try:
                        case = Case.objects.get(
                            case_name = case_name,
                        )
                    # create new case
                    except Case.DoesNotExist:
                        # value is valid
                        try:
                            case, created = Case.objects.get_or_create(
                                case_name = case_name,
                                case_is_incident = False,
                                case_created_by_user_id = csv_import_user,
                            )
                            # call logger if created
                            if created:
                                case.logger(logger_username, ' SYSTEM_IMPORTER_FILE_CSV_CASE_CREATED')
                        # value is not valid
                        except DataError:
                            # if function was called from 'system_instant' and 'system_upload'
                            if request:
                                # call message
                                messages.warning(request, f'Value for case in row {row_counter} was not a valid value.')
                            # call logger
                            warning_logger(logger_username, f' SYSTEM_IMPORTER_FILE_CSV_CASE_COLUMN row_{row_counter}:invalid_case')
                            # set empty value
                            case = None
コード例 #23
0
def system_creator_async(request_post, request_user):
    """ function to create many systems at once """

    # call logger
    debug_logger(str(request_user), ' SYSTEM_CREATOR_START')

    # exctract lines from systemlist (list results from request object via large text area)
    lines = request_post.get('systemlist').splitlines()

    #  count lines (needed for messages)
    number_of_lines = len(lines)

    # set systems_created_counter (needed for messages)
    systems_created_counter = 0

    # set systems_skipped_counter (needed for messages)
    systems_skipped_counter = 0

    # set lines_faulty_counter (needed for messages)
    lines_faulty_counter = 0

    # create empty list (needed for messages)
    skipped_systems = []

    # iterate over lines
    for line in lines:

        # skip emtpy lines
        if line == '':
            # autoincrement counter
            lines_faulty_counter += 1
            # call logger
            warning_logger(str(request_user), ' SYSTEM_CREATOR_ROW_EMPTY')
            continue

        # check line for length of string
        if len(line) > 50:
            # autoincrement counter
            lines_faulty_counter += 1
            # call logger
            warning_logger(str(request_user), ' SYSTEM_CREATOR_LONG_STRING')
            continue

        # check for existence of system
        system = System.objects.filter(system_name = line)

        """ already existing system """

        # in case of existing system
        if system.count() > 0:
            # autoincrement counter
            systems_skipped_counter += 1
            # add system name to list of skipped systems
            skipped_systems.append(line)
            # call logger
            warning_logger(str(request_user), f' SYSTEM_CREATOR_SYSTEM_EXISTS system_name:{line}')
            # leave this loop because system with this systemname already exists
            continue

        """ new system """

        # create form with request data
        form = SystemCreatorForm(request_post)

        # create system
        if form.is_valid():

            """ object creation """

            # don't save form yet
            system = form.save(commit=False)

            # set system_name
            system.system_name = line

            # set auto values
            system.system_created_by_user_id = request_user
            system.system_modified_by_user_id = request_user
            system.system_modify_time = timezone.now()

            # save object
            system.save()

            # save manytomany
            form.save_m2m()

            """ object counter / log """

            # autoincrement counter
            systems_created_counter  += 1

            # call logger
            system.logger(str(request_user), ' SYSTEM_CREATOR_EXECUTED')

    """ finish system importer """

    # call final messages
    final_messages(systems_created_counter, systems_skipped_counter, lines_faulty_counter, skipped_systems, number_of_lines, request_user)

    # call logger
    info_logger(
        str(request_user),
        f' SYSTEM_CREATOR_STATUS'
        f' created:{systems_created_counter}'
        f'|skipped:{systems_skipped_counter}'
        f'|faulty_lines:{lines_faulty_counter}'
    )

    # call logger
    debug_logger(str(request_user), ' SYSTEM_CREATOR_END')
コード例 #24
0
def system_modificator_async(request_post, request_user):
    """ function to modify many systems at once """

    # call logger
    debug_logger(str(request_user), ' SYSTEM_MODIFICATOR_BEGIN')

    # exctract lines from systemlist (list results either from request object via multiline selector or via large text area)
    lines = request_post.getlist('systemlist')
    system_char_field_used = False
    # if large text area was used, the list contains only one entry with (one or more) line breaks
    if len(lines) == 1 and ("\r\n" in lines[0] or not lines[0].isdigit()):
        system_char_field_used = True
        lines = lines[0].splitlines()

    #  count lines (needed for messages)
    number_of_lines = len(lines)

    # set systems_modified_counter (needed for messages)
    systems_modified_counter = 0

    # set systems_skipped_counter (needed for messages)
    systems_skipped_counter = 0

    # set lines_faulty_counter (needed for messages)
    lines_faulty_counter = 0

    # create empty list (needed for messages)
    skipped_systems = []

    # iterate over lines
    for line in lines:

        # skip emtpy lines
        if line == '':
            # autoincrement counter
            lines_faulty_counter += 1
            # call logger
            warning_logger(str(request_user), ' SYSTEM_MODIFICATOR_ROW_EMPTY')
            continue

        # check line for string
        if not isinstance(line, str):  # coverage: ignore branch
            # autoincrement counter
            lines_faulty_counter += 1
            # call logger
            warning_logger(str(request_user), ' SYSTEM_MODIFICATOR_NO_STRING')
            continue

        # check line for length of string
        if len(line) > 50:
            # autoincrement counter
            lines_faulty_counter += 1
            # call logger
            warning_logger(str(request_user),
                           ' SYSTEM_MODIFICATOR_LONG_STRING')
            continue

        # check for existence of system
        if system_char_field_used:
            system = System.objects.filter(system_name=line)
        else:
            system = System.objects.filter(system_id=line)
        """ handling non-existing or non-unique systems 2 """

        # system does not exist
        if system.count() == 0:
            # autoincrement counter
            systems_skipped_counter += 1
            # add system name to list of skipped systems
            skipped_systems.append(line)
            # call logger
            error_logger(
                str(request_user),
                ' SYSTEM_MODIFICATOR_SYSTEM_DOES_NOT_EXISTS ' +
                'system_id/system_name:' + line)
            # leave this loop because system with this systemname does not exist
            continue
        # more than one system exists
        elif system.count() > 1:
            # autoincrement counter
            systems_skipped_counter += 1
            # add system name to list of skipped systems
            skipped_systems.append(line)
            # call logger
            error_logger(
                str(request_user), ' SYSTEM_MODIFICATOR_SYSTEM_NOT_DISTINCT ' +
                'system_id/system_name:' + line)
            # leave this loop because system with this systemname is not distinct
            continue

        # get existing system
        if system_char_field_used:
            system = System.objects.get(system_name=line)
        else:
            system = System.objects.get(system_id=line)
        """ new system """

        # create form with request data
        form = SystemModificatorForm(
            request_post,
            instance=system,
            use_system_charfield=system_char_field_used)

        # extract tags (list results from request object via multiple choice field)
        tags = request_post.getlist('tag')

        # extract companies (list results from request object via multiple choice field)
        companies = request_post.getlist('company')

        # modify system
        if form.is_valid():
            """ object modification """

            # don't save form yet
            system = form.save(commit=False)

            # set auto values
            system.system_modified_by_user_id = request_user
            system.system_modify_time = timezone.now()

            # save object
            system.save()
            """ object counter / log """

            # autoincrement counter
            systems_modified_counter += 1

            # call logger
            system.logger(str(request_user), ' SYSTEM_MODIFICATOR_EXECUTED')
            """ many 2 many """

            # TODO: add check for empty list
            # add tags (using save_m2m would replace existing tags)
            for tag_id in tags:
                # get object
                tag = Tag.objects.get(tag_id=tag_id)
                # add tag to system
                system.tag.add(tag)

            for company_id in companies:
                # get object
                company = Company.objects.get(company_id=company_id)
                # add company to system
                system.company.add(company)
    """ call final messages """

    # finish message
    message_user(request_user, 'System modificator finished',
                 constants.SUCCESS)

    # number messages

    if systems_modified_counter > 0:
        if systems_modified_counter == 1:
            message_user(
                request_user,
                str(systems_modified_counter) + ' system was modified.',
                constants.SUCCESS)
        else:
            message_user(
                request_user,
                str(systems_modified_counter) + ' systems were modified.',
                constants.SUCCESS)

    if systems_skipped_counter > 0:
        if systems_skipped_counter == 1:
            message_user(
                request_user,
                str(systems_skipped_counter) + ' system was skipped. ' +
                str(skipped_systems), constants.ERROR)
        else:
            message_user(
                request_user,
                str(systems_skipped_counter) + ' systems were skipped. ' +
                str(skipped_systems), constants.ERROR)

    if lines_faulty_counter > 0:
        if lines_faulty_counter == 1:
            message_user(
                request_user,
                str(lines_faulty_counter) + ' line out of ' +
                str(number_of_lines) +
                ' lines was faulty (see log file for details).',
                constants.WARNING)
        else:
            message_user(
                request_user,
                str(lines_faulty_counter) + ' lines out of ' +
                str(number_of_lines) +
                ' lines were faulty (see log file for details).',
                constants.WARNING)

    # call logger
    info_logger(
        str(request_user), ' SYSTEM_MODIFICATOR_STATUS ' + 'modified:' +
        str(systems_modified_counter) + '|' + 'skipped:' +
        str(systems_skipped_counter) + '|' + 'faulty_lines:' +
        str(lines_faulty_counter))

    # call logger
    debug_logger(str(request_user), " SYSTEM_MODIFICATOR_END")
コード例 #25
0
def systems_ips(request):
    """ this function parses a csv file and tries to import systems and corresponding ips """

    # form was valid to post
    if request.method == "POST":

        # call logger
        debug_logger(str(request.user), " SYSTEM_IP_IMPORTER_BEGIN")

        # get text out of file (variable results from request object via file upload field)
        systemipcsv = TextIOWrapper(request.FILES['systemipcsv'].file, encoding=request.encoding)

        # read rows out of csv
        rows = csv.reader(systemipcsv, quotechar="'")

        # set row counter (needed for logger)
        i = 0

        # check for wrong file type
        try:
            # iterate over rows
            for row in rows:

                # autoincrement row counter
                i += 1

                # check for empty rows
                try:
                    # check system column for empty value
                    if row[0] == '':
                        warning_logger(str(request.user), " SYSTEM_IP_IMPORTER_SYSTEM_COLUMN " + "row_" + str(i) + ":empty_column")
                        continue
                except IndexError:
                    warning_logger(str(request.user), " SYSTEM_IP_IMPORTER_ROW row_" + str(i) + ":empty_row")
                    continue

                # check system column for string
                if not isinstance(row[0], str):
                    warning_logger(str(request.user), " SYSTEM_IP_IMPORTER_SYSTEM_COLUMN " + "row_" + str(i) + ":no_string")
                    continue

                # check system column for length of string
                if len(row[0]) > 50:
                    warning_logger(str(request.user), " SYSTEM_IP_IMPORTER_SYSTEM_COLUMN " + "row_" + str(i) + ":long_string")
                    continue

                # check ip column for ip
                try:
                    ipaddress.ip_address(row[1])
                except ValueError:
                    warning_logger(str(request.user), " SYSTEM_IP_IMPORTER_IP_COLUMN " + "row_" + str(i) + ":invalid_ip")
                    continue

                # create ip
                ip, created = Ip.objects.get_or_create(ip_ip=row[1])
                if created == True:
                    ip.logger(str(request.user), " SYSTEMS_IP_IMPORTER_IP_CREATED")

                # check for existence of system
                system = System.objects.filter(system_name = row[0], ip = ip)
                if system.count() > 0:
                    error_logger(str(request.user), " SYSTEM_IP_IMPORTER_SYSTEM_EXISTS " + "row_" + str(i) + ":system_exists|system_name:" + row[0] + "|ip:" + str(row[1]))
                    continue

                # create form with request data
                form = SystemIpFileImport(request.POST, request.FILES)

                # create system
                if form.is_valid():

                    # don't save form yet
                    system = form.save(commit=False)

                    # set system_name
                    system.system_name = row[0]

                    # set auto values
                    system.system_created_by_user_id = request.user
                    system.system_modified_by_user_id = request.user
                    system.system_modify_time = timezone.now()

                    # save object
                    system.save()

                    # save manytomany
                    form.save_m2m()

                    # save ip for system
                    system.ip.add(ip)

                    # call logger
                    system.logger(str(request.user), ' SYSTEM_IP_IMPORTER_EXECUTED')

        # wrong file type
        except UnicodeDecodeError:
            critical_logger(str(request.user), " SYSTEM_IP_IMPORTER_WRONG_FILE_TYPE")

        # call logger
        debug_logger(str(request.user), " SYSTEM_IP_IMPORTER_END")

        return redirect('/systems')

    else:
        # show empty form
        form = SystemIpFileImport(initial={
            'systemstatus': 2,
            'analysisstatus': 1,
        })

        # call logger
        debug_logger(str(request.user), " SYSTEM_IP_IMPORTER_ENTERED")
    return render(request, 'dfirtrack_main/system/systems_ip_importer.html', {'form': form})