Example #1
0
def link_rule(profile=None, type=None, id=None):
    """ Link rule to a profile.
        Retrieve Profile Object and update it with new Type Object who contains Rules Objects.

        :param: profile: profile name (same as profile yaml file).
        :param: type: rule's type (same as type yaml file).
        :param: id: rule's id passed by user.
        :type: profile: list of str
        :type: type: list of str
        :type: id: list of int
        :return: list of profile name updated
        :rtype: list of str

        .. seealso:: heimdall.conf.rules.getTypeObject(), heimdall.core.type.Type, heimdall.conf.profiles.getProfileObject()
    """
    from conf.profiles import getProfileObject
    from utils.profile import update_profile
    from conf.rules import getTypeObject, getRuleObject

    for prof in profile:
        p = getProfileObject(prof)
        for ty in p.types:
            if ty.name == type[0]:  # If type exist in profile, we just add all rules or one from this type.
                if id == -1:  # Deleting all rules, and add Type Object with all rules.
                    p.remove_type(ty)
                    p.add_type(getTypeObject(type[0]))
                else:  # add new Rules Objects to Type Object for all id passed by user
                    [ty.add_rule(getRuleObject(ty.name, i)) for i in id]
        else:  # Profile object doesnt have this type
            if id == -1:
                p.add_type(getTypeObject(type[0]))
            else:
                p.add_type(getTypeObject(type[0], id))
        update_profile(p)
    return profile
Example #2
0
def move_rule(oldtype=None, id=None, newtype=None):
    """ Move rule from one type to another.
        Retrieve old Type Object and new Type Object and update both with the Rule Object filter by id.

        :param: oldtype: old rule's type (same as type yaml file).
        :param: id: rule's id passed by user.
        :param: newtype: new rule's type (same as type yaml file).
        :type: oldtype: list of one str
        :type: id: list of one int
        :type: newtype: list of one str
        :return: Updated old Type and new Type
        :rtype: Old Type Object, New Type Object

        .. seealso:: heimdall.conf.rules.getTypeObject(), heimdall.core.type.Type
    """
    from conf.rules import getTypeObject
    from utils.wiki import move_wikirule
    old = getTypeObject(oldtype[0])
    new = getTypeObject(newtype[0])

    for r in old.rules:
        if str(r.id) == str(id[0]):  # We found our Rule
            oldid = r.id
            r.type = new.name
            r.id = new.get_new_id()
            old.remove_rule(r)
            new.add_rule(r)
            move_wikirule(old, new, oldid, r.id)
    return old, new
Example #3
0
def remove_type(name=None):
    """ Remove type file from type name passed by user.

        :param: name: type's name (same as type yaml file) passed by user
        :type: name: list of one str element
        :return: True if remove succeed
        :rtype: bool

        .. seealso:: heimdall.conf.rule.getTypeObject(), heimdall.core.yml.remove_yml()
    """
    from core.yml import remove_yml
    from core.type import Type
    from conf.rules import getTypeObject
    from core.exceptions import TypeInstanceError
    from utils.wiki import remove_wikidir
    t = getTypeObject(name[0])
    try:
        if isinstance(t, Type):
            remove_yml(t.path)
            remove_wikidir(t)
            print "Type %s successfully removed!" % name
            return True
        else:
            raise TypeInstanceError(
                'Argument for %s must be an Type Instance' %
                update_self_type.__name__)
    except TypeInstanceError as tie:
        print tie
        exit(tie.code)
Example #4
0
def remove_rule(type=None, id=None):
    """ Remove Rule Object from Type Object attribute rules and return updated Type Object.

        :param: type: rule's type (same as type yaml file) passed by user
        :param: id: rule's id passed by user
        :type: type: list of one str
        :type: id: list of one int
        :return: Updated Type
        :rtype: Type Object

        .. seealso:: heimdall.conf.rules.getTypeObject(), heimdall.core.type.Type
    """
    from conf.rules import getTypeObject
    from utils.wiki import remove_wikirule
    t = getTypeObject(type[0])

    removed_rules = []
    if id:
        from conf.rules import getRuleObject
        for i in id:
            for r in t.rules:
                if str(i) == str(r.id):
                    removed_rules.append(r)
    else:
        removed_rules = t.rules

    for r in removed_rules:
        t.remove_rule(r)
        remove_wikirule(r)

    return t
Example #5
0
def check_rule_exist(type=None, id=None):
    """ Check if rule already exist.

        :param: type: rule's name passed by user.
        :param: id: rule's name passed by user.
        :type: type: list of one str
        :type: id: list of one int
        :return: True if rule doesnt exist, False otherwise.
        :rtype: bool

        .. seealso:: heimdall.conf.rules.getTypeObject()
    """
    if not type and not id:
        return

    from conf.rules import getTypeObject
    from core.exceptions import RuleAlreadyExist

    try:
        for ty in type:
            t = getTypeObject(ty)
            rule_id = []
            [rule_id.append(r.id) for r in t.rules]
            exist = set(rule_id).intersection(set(id))
            if exist:
                raise RuleAlreadyExist('Rule from type %s with id %s already exist!' % (t.name, next(iter(exist))))
        else:
            return False
    except RuleAlreadyExist as rae:
        print rae
        exit(rae.code)
Example #6
0
def check_rule(type=None, id=None):
    """ Check if rule exist.

        :param: type: rule's name passed by user.
        :param: id: rule's name passed by user.
        :type: type: list of one str
        :type: type: list of one int elem
        :return: True if rule exist, False otherwise.
        :rtype: bool

        .. seealso:: heimdall.conf.rules.getTypeObject()
    """
    if not type and not id:
        return False

    from conf.rules import getTypeObject
    from core.exceptions import RuleDoesNotExist

    try:
        for ty in type:
            t = getTypeObject(ty)
            for i in id:
                if not t.check_id_exist(i):
                    raise RuleDoesNotExist('Rule from type %s with id %s Does not exist!' % (t.name, i))
        else:
            return True
    except RuleDoesNotExist as rne:
        print rne
        exit(rne.code)
Example #7
0
def getAllProfilesObjects():
    """ Open and read data from heimdall/conf/profiles/profile.yml, then create Profile Objects from data.
        Type Objects are also created and added to Profile Objects.

        :return: list of all Profile Objects available.
        :rtype: list of Profile Objects

        ..seealso:: heimdall.core.profile.Profile, heimdall.conf.rules.getTypeObject()
    """
    from core.profile import Profile
    from conf.rules import getTypeObject
    from core.yml import open_yml

    profile_availables = []
    for profilesfiles in __profilesfiles__:
        filepath = path.join(__pdir__, profilesfiles)
        profile_data = open_yml(path=filepath)

        if profile_data:
            profile_data['path'] = filepath
            profile = Profile(**profile_data)
            [
                profile.types.append(getTypeObject(t, i))
                for t, i in profile_data['types'].iteritems()
            ]
            profile_availables.append(profile)

    return profile_availables
Example #8
0
def get_type(name=None):
    """ Take type information passed by user, and return list of type filtered

        :param: name: type's type (same as type yaml file) passed by user
        :type: name: list of str
        :return: list of Type Objects filtered
        :rtype: list of Type Objects

        ..seealso:: heimdall.conf.rules.getTypeObject()
    """
    from conf.rules import getTypeObject

    types = []
    [types.append(getTypeObject(n)) for n in name]

    return types
Example #9
0
def update_self_type(name=None, desc=None, newname=None):
    """ Update a Type object from information passed by user, and return the new Type Object created.
            New Object is write in corresponding yaml file.

            :param: name: type's name (same as plateform yaml file) passed by user
            :param: desc: type's description passed by user
            :param: newname: type's new name (plateform yaml file will be rename) passed by user
            :type: name: list of one str element
            :type: desc: list of one str element
            :type: newname: list of one str element
            :return: updated new Type Object
            :rtype: Type Object

            .. seealso:: heimdall.conf.rules.getTypeObject(), heimdall.core.yml.rename_yml(), update_type()
        """
    from core.type import Type
    from core.yml import rename_yml
    from conf.rules import getTypeObject
    from core.exceptions import TypeInstanceError
    from utils.wiki import rename_wikidir

    t = getTypeObject(name[0])
    ot = t

    if desc:
        t.desc = desc[0]
    if newname:
        t.name = newname[0]
        t.path = t.path.replace(name[0], newname[0])
        try:
            if isinstance(t, Type):
                rename_yml(oldpath=ot.path, newpath=t.path)
                rename_wikidir(oldtype=ot, newtype=t)
            else:
                raise TypeInstanceError(
                    'Argument for %s must be an Type Instance' %
                    update_self_type.__name__)
        except TypeInstanceError as tie:
            print tie
            exit(tie.code)
        for r in t.rules:
            r.type = t.name
    update_type(t)
    return t
Example #10
0
def add_rule(**kwargs):
    """ Create a Rule Object from information passed by user, and return a TypeObject who contain the new rule Object.

        Keyword Args:
            type (list of one str): rule's type (same as type yaml file) passed by user
            desc (list of one str): rule's description passed by user
            auditcmd (list of str): rule's auditcmd passed by user
            auditscript (list of str): rule's auditscript passed by user
            remedcmd (list of str): rule's remedcmd passed by user
            remedscript (list of str): rule's remedscript passed by use

        :return: updated Type with the new Rule Object
        :rtype: Type Object

        ..seealso: heimdall.core.rule.Rule, heimdall.core.type.Type, heimdall.conf.rules.getTypeObject
    """
    from core.rule import Rule
    # Create new dict with no empty values AND string format if value is list of one element
    newrule = {}
    for k, v in kwargs.iteritems():
        if not v:  # no value passed for this key, just pass
            pass
        elif 'audit' in k:  # key can be 'auditcmd' or 'auditscript', merge into 'audit' key.
            newrule['audit'] = kwargs[k]
        elif 'remed' in k:  # key can be 'remedcmd' or 'remedscript', merge into 'remed' key.
            newrule['remed'] = kwargs[k]
        else:  # type and desc are list of one element
            newrule[k] = kwargs[k][0]

    rule = Rule(**newrule)

    from conf.rules import getTypeObject

    t = getTypeObject(rule.type)  # Retrieve Type Object from rule type attribute
    rule.id = t.get_new_id()  # Setting new id
    from utils.wiki import create_wikirule
    create_wikirule(rule)
    rule.check_wikipage()
    t.add_rule(rule)

    return t
Example #11
0
def update_rule(**kwargs):
    """ Update a Rule Object from information passed by user, and return a TypeObject who contain the new rule Object.

        Keyword Args:
            type (list of str): rule's type (same as type yaml file) passed by user
            desc (list of str): rule's description passed by user
            id (list of int): rule's id passed by user
            auditcmd (list of str): rule's auditcmd passed by user
            auditscript (list of str): rule's auditscript passed by user
            remedcmd (list of str): rule's remedcmd passed by user
            remedscript (list of str): rule's remedscript passed by use

        :return: updated Type with the new Rule Object
        :rtype: Type Object

        ..seealso: heimdall.core.rule.Rule, heimdall.core.type.Type, heimdall.conf.rules.getTypeObject
    """
    from conf.rules import getTypeObject

    t = getTypeObject(kwargs.get('type')[0])
    audit = []
    remed = []
    for r in t.rules:
        if str(r.id) == str(kwargs.get('id')[0]):  # We found our Rule
            for k, v in kwargs.iteritems():
                if v:
                    if 'audit' in k:  # key can be 'auditcmd' or 'auditscript', merge into 'audit' key.
                        [audit.append(val) for val in v]
                    elif 'remed' in k:  # key can be 'remedcmd' or 'remedscript', merge into 'remed' key.
                        [remed.append(val) for val in v]
                    elif k == 'id':
                        r.__setattr__('id', kwargs.get('id')[0])
                    else:
                        # update attributes with new values
                        r.__setattr__(k, v[0]) if v else r.__setattr__(k, '')
            if audit:
                r.__setattr__('audit', audit)
            if remed:
                r.__setattr__('remed', remed)
            print r.audit
    return t
Example #12
0
def get_rules(type=None, id=None):
    """ Take rule information passed by user, and return list of rules filtered

        :param: type: rule's type (same as type yaml file) passed by user
        :param: id: rule's id passed by user
        :type: type: list of str
        :type: id: list of int
        :return: list of Rule Objects filtered
        :rtype: list of Rule Objects

        ..seealso:: heimdall.conf.hosts.getPlateformObject(), heimdall.conf.rules.getAllRulesObjects()
    """

    from conf.rules import getAllRulesObjects, getTypeObject

    rules_availables = []
    all_rules = getAllRulesObjects()

    if not type:
        if id:  # if not type set, and id is set filter by id
            [rules_availables.append(r) for ri in id for r in all_rules if r.id == ri]
            return rules_availables
        else:  # id and type are not set, return all_rules
            return all_rules

    # type is set
    types = []
    [types.append(getTypeObject(t)) for t in type]

    if id:  # if id is set, filter by id AND type
        for ri in id:
            [rules_availables.append(r) for t in types for r in t.rules if r.id == ri]
        return rules_availables
    else:  # if id is not set, filter by type only
        [rules_availables.append(r) for t in types for r in t.rules]
        return rules_availables
Example #13
0
def getProfileObject(name=None):
    """ Open and read data from profile name passed by user, then create Profile Object from data
        Type Objects are also created and added to Profile Object.

        :return: Profile Object created from data read in heimdall/conf/profiles/profile.yml.
        :rtype: Profile Object

        ..seealso:: heimdall.core.profile.Profile, heimdall.conf.rules.getTypeObject()
    """
    from core.profile import Profile
    from conf.rules import getTypeObject
    from core.yml import open_yml

    filepath = path.join(__pdir__, name + '.yml')
    profile_data = open_yml(path=filepath)

    if profile_data:
        profile_data['path'] = filepath
        profile = Profile(**profile_data)
        [
            profile.types.append(getTypeObject(t, i))
            for t, i in profile_data['types'].iteritems()
        ]
        return profile