Exemple #1
0
    def update_node_from_rules(self, rules, user, computer, obj_ui, obj, action, node, policy, rule_type, job_ids_by_computer):
        updated = updated_updated_by = False
        attributes_jobs_updated = []
        attributes_updated_by_updated = []
        for field_chef, field_ui in rules.items():
            if is_user_policy(field_chef) and 'user' not in computer:
                continue
            job_attr = '.'.join(field_chef.split('.')[:3]) + '.job_ids'
            updated_by_attr = self.get_updated_by_fieldname(field_chef, policy, obj, computer)
            priority_obj_ui = obj_ui
            obj_ui_field = None
            if (rule_type == 'policies' or not policy.get('is_emitter_policy', False)) and updated_by_attr not in attributes_updated_by_updated:
                updated_updated_by = updated_updated_by or self.update_node_updated_by(node, field_chef, obj, action, updated_by_attr, attributes_updated_by_updated)
            priority_obj = self.priority_object(node, updated_by_attr, obj, action)
            if priority_obj != obj:
                priority_obj_ui = self.get_object_ui(rule_type, priority_obj, node, policy)
            if priority_obj.get('_id', None) == obj.get('_id', None) or action == DELETED_POLICY_ACTION:
                if callable(field_ui):
                    if is_user_policy(field_chef):
                        priority_obj = computer['user']
                    obj_ui_field = field_ui(priority_obj_ui, obj=priority_obj, node=node, field_chef=field_chef)
                else:
                    obj_ui_field = priority_obj_ui.get(field_ui, None)

                if obj_ui_field is None and action != DELETED_POLICY_ACTION:
                    continue
                elif obj_ui_field is None and action == DELETED_POLICY_ACTION:
                    try:
                        obj_ui_field = delete_dotted(node.attributes, field_chef)
                        updated = True
                    except KeyError:
                        pass
                else:
                    try:
                        value_field_chef = node.attributes.get_dotted(field_chef)
                    except KeyError:
                        value_field_chef = None
                    if obj_ui_field != value_field_chef:
                        node.attributes.set_dotted(field_chef, obj_ui_field)
                        updated = True
            if job_attr not in attributes_jobs_updated:
                if updated:
                    self.update_node_job_id(user, obj, action, computer, node, policy, job_attr, attributes_jobs_updated, job_ids_by_computer)
        return (node, (updated or updated_updated_by))
Exemple #2
0
 def get_updated_by_fieldname(self, field_chef, policy, obj, computer):
     updated_path = '.'.join(field_chef.split('.')[:3])
     if is_user_policy(field_chef):
         if obj['type'] != 'user':
             user = computer['user']
         else:
             user = obj
         updated_path += '.users.' + get_username_chef_format(user)
     updated_path += '.updated_by'
     return updated_path
Exemple #3
0
 def get_updated_by_fieldname(self, field_chef, policy, obj, computer):
     updated_path = '.'.join(field_chef.split('.')[:3])
     if is_user_policy(field_chef):
         if obj['type'] != 'user':
             user = computer['user']
         else:
             user = obj
         updated_path += '.users.' + get_username_chef_format(user)
     updated_path += '.updated_by'
     return updated_path
Exemple #4
0
 def command(self):
     db = self.pyramid.db
     ou, admin, policy = self.check_input()
     if not ou:
         return
     ou['policies'][unicode(policy['_id'])] = self.policy_data
     if not self.save_ou(ou, admin):
         return
     waiting_to_celery(db)
     if is_user_policy(policy['path']):
         computer_errors = self.check_users(ou, admin, policy)
     else:
         computer_errors = self.check_computers(ou, admin, policy)
     self.print_error(computer_errors)
Exemple #5
0
 def command(self):
     db = self.pyramid.db
     ou, admin, policy = self.check_input()
     if not ou:
         return
     ou['policies'][unicode(policy['_id'])] = self.policy_data
     if not self.save_ou(ou, admin):
         return
     waiting_to_celery(db)
     if is_user_policy(policy['path']):
         computer_errors = self.check_users(ou, admin, policy)
     else:
         computer_errors = self.check_computers(ou, admin, policy)
     self.print_error(computer_errors)
Exemple #6
0
 def update_node_updated_by(self, node, field_chef, obj, action, attr,
                            attributes_updated):
     updated = False
     try:
         updated_by = node.attributes.get_dotted(attr).to_dict()
     except KeyError:
         updated_by = {}
     obj_id = unicode(obj['_id'])
     obj_type = obj['type']
     if obj_type in ['computer', 'user']:
         if action == DELETED_POLICY_ACTION:
             del updated_by[obj_type]
         else:
             updated_by[obj_type] = obj_id
         updated = True
     else:  # Ous or groups
         updated_by_type = updated_by.get(obj_type, [])
         if action == DELETED_POLICY_ACTION:
             try:
                 updated_by_type.remove(obj_id)
                 updated = True
             except ValueError:
                 pass
         elif obj_id not in updated_by_type:
             updated = True
             if obj_type == 'ou':
                 updated_by_type.append(obj_id)
                 updated_by_type = self.order_ou_by_depth(updated_by_type)
             else:
                 updated_by_type.append(obj_id)
         if updated_by_type:
             updated_by[obj_type] = updated_by_type
         elif obj_type in updated_by:
             del updated_by[obj_type]
     if updated:
         if is_user_policy(attr):
             users_dict_path = '.'.join(attr.split('.')[:-2])
             try:
                 if not node.attributes.get_dotted(users_dict_path):
                     node.attributes.set_dotted(users_dict_path, {})
             except KeyError:
                 node.attributes.set_dotted(users_dict_path, {})
         node.attributes.set_dotted(attr, updated_by)
         attributes_updated.append(attr)
     return updated
Exemple #7
0
 def update_node_updated_by(self, node, field_chef, obj, action, attr, attributes_updated):
     updated = False
     try:
         updated_by = node.attributes.get_dotted(attr).to_dict()
     except KeyError:
         updated_by = {}
     obj_id = unicode(obj['_id'])
     obj_type = obj['type']
     if obj_type in ['computer', 'user']:
         if action == DELETED_POLICY_ACTION:
             del updated_by[obj_type]
         else:
             updated_by[obj_type] = obj_id
         updated = True
     else:  # Ous or groups
         updated_by_type = updated_by.get(obj_type, [])
         if action == DELETED_POLICY_ACTION:
             try:
                 updated_by_type.remove(obj_id)
                 updated = True
             except ValueError:
                 pass
         elif obj_id not in updated_by_type:
             updated = True
             if obj_type == 'ou':
                 updated_by_type.append(obj_id)
                 updated_by_type = self.order_ou_by_depth(updated_by_type)
             else:
                 updated_by_type.append(obj_id)
         if updated_by_type:
             updated_by[obj_type] = updated_by_type
         elif obj_type in updated_by:
             del updated_by[obj_type]
     if updated:
         if is_user_policy(attr):
             users_dict_path = '.'.join(attr.split('.')[:-2])
             try:
                 if not node.attributes.get_dotted(users_dict_path):
                     node.attributes.set_dotted(users_dict_path, {})
             except KeyError:
                 node.attributes.set_dotted(users_dict_path, {})
         node.attributes.set_dotted(attr, updated_by)
         attributes_updated.append(attr)
     return updated
Exemple #8
0
 def update_node_job_id(self, user, obj, action, computer, node, policy, attr, attributes_updated, job_ids_by_computer):
     if node.attributes.has_dotted(attr):
         job_ids = node.attributes.get_dotted(attr)
     else:
         job_ids = []
     job_storage = JobStorage(self.db.jobs, user)
     job_status = 'processing'
     computer_name = computer['name']
     if is_user_policy(policy.get('path', '')) and 'user' in computer:
         computer['user_and_name'] = '%s / %s' % (computer_name, computer['user']['name'])
     else:
         computer['user_and_name'] = None
     job_id = job_storage.create(obj=obj,
                                 op=action,
                                 status=job_status,
                                 computer=computer,
                                 policy=policy,
                                 administrator_username=user['username'])
     job_ids.append(unicode(job_id))
     job_ids_by_computer.append(job_id)
     attributes_updated.append(attr)
     node.attributes.set_dotted(attr, job_ids)
Exemple #9
0
 def update_node_job_id(self, user, obj, action, computer, node, policy,
                        attr, attributes_updated, job_ids_by_computer):
     if node.attributes.has_dotted(attr):
         job_ids = node.attributes.get_dotted(attr)
     else:
         job_ids = []
     job_storage = JobStorage(self.db.jobs, user)
     job_status = 'processing'
     computer_name = computer['name']
     if is_user_policy(policy.get('path', '')) and 'user' in computer:
         computer['user_and_name'] = '%s / %s' % (computer_name,
                                                  computer['user']['name'])
     else:
         computer['user_and_name'] = None
     job_id = job_storage.create(obj=obj,
                                 op=action,
                                 status=job_status,
                                 computer=computer,
                                 policy=policy,
                                 administrator_username=user['username'])
     job_ids.append(unicode(job_id))
     job_ids_by_computer.append(job_id)
     attributes_updated.append(attr)
     node.attributes.set_dotted(attr, job_ids)
Exemple #10
0
    def command(self):
        api = _get_chef_api(self.settings.get('chef.url'),
                            toChefUsername(self.options.chef_username),
                            self.options.chef_pem)
        cookbook_name = self.settings['chef.cookbook_name']

        cookbook = get_cookbook(api, cookbook_name)

        languages = self.settings.get('pyramid.locales')
        languages.remove(self.settings.get('pyramid.default_locale_name'))

        policies = {}
        try:
            for key, value in cookbook['metadata']['attributes']['json_schema']['object']['properties']['gecos_ws_mgmt']['properties'].items():
                for k, policy in value['properties'].items():
                    policy['path'] = '%s.%s.%s' % (cookbook_name, key, k)
                    policies[k] = policy
        except KeyError:
            print "Can not found policies in cookbook %s" % cookbook_name
            sys.exit(1)

        policies_to_import = self.options.policies
        if policies_to_import:
            found = set(policies_to_import).intersection(set(policies.keys()))
            not_found = set(policies_to_import).difference(set(policies.keys()))
            if not_found:
                print "%s policies to import. Policies NOT FOUND: %s" % (len(found), list(not_found))
            else:
                print "%s policies to import" % len(found)
        else:
            print "%s policies to import" % len(policies.keys())

        for key, value in policies.items():
            if policies_to_import and key not in policies_to_import:
                continue
            elif key in EXCLUDE_POLICIES:
                continue
            if key == PACKAGE_POLICY:
                self.set_packages_url(value)
            for ex_attr in EXCLUDE_GENERIC_ATTRS:
                if ex_attr in value['properties']:
                    del(value['properties'][ex_attr])
            path = value.pop('path')

            support_os = value['properties']['support_os']['default']

            del value['properties']['support_os']

            if is_user_policy(path):
                targets = ['ou', 'user', 'group']
                title = value['title']
                titles = {}
                for lan in languages:
                    titles[lan] = value['title_' + lan]

                value = value['properties']['users']['patternProperties']['.*']
                if 'updated_by' in value.get('properties', {}):
                    del value['properties']['updated_by']
                value['title'] = title
                for lan in languages:
                    value['title_' + lan] = titles[lan]

            elif 'network_mgmt' in path:
                targets = ['computer']
            else:
                targets = DEFAULT_TARGETS

            policy = {
                'name': value['title'],
                'slug': key,
                'path': path,
                'schema': value,
                'targets': targets,
                'is_emitter_policy': False,
                'support_os': support_os,
            }

            for lan in languages:
                policy['name_' + lan] = value['title_' + lan]

            self.treatment_policy(policy)

        self.create_software_profiles_policy(policies, languages)

        if not self.options.ignore_emitter_policies:
            for emiter in RESOURCES_EMITTERS_TYPES:
                slug = emiter_police_slug(emiter)
                schema = deepcopy(SCHEMA_EMITTER)
                schema['properties']['object_related_list']['title'] = '%s list' % emiter.capitalize()
                for lan in languages:
                    schema['properties']['object_related_list']['title_' + lan] = EMITTER_LIST_LOCALIZED[lan] % EMITTER_LOCALIZED[lan][emiter]
                schema['properties']['object_related_list']['autocomplete_url'] = POLICY_EMITTER_URL[slug]
                policy = {
                    'name': POLICY_EMITTER_NAMES[slug],
                    'slug': slug,
                    'path': POLICY_EMITTER_PATH[slug],
                    'targets': POLICY_EMITTER_TARGETS[slug],
                    'is_emitter_policy': True,
                    'schema': schema,
                    'support_os': policies[POLICY_EMITTER_PATH[slug].split('.')[2]]['properties']['support_os']['default']
                }
                for lan in languages:
                    policy['name_' + lan] = POLICY_EMITTER_NAMES_LOCALIZED[lan][slug]
                self.treatment_policy(policy)
    def command(self):
        api = _get_chef_api(self.settings.get('chef.url'),
                            toChefUsername(self.options.chef_username),
                            self.options.chef_pem, self.settings.get('chef.ssl.verify'), self.settings.get('chef.version'))
        cookbook_name = self.settings['chef.cookbook_name']

        cookbook = get_cookbook(api, cookbook_name)

        languages = self.settings.get('pyramid.locales')
        languages.remove(self.settings.get('pyramid.default_locale_name'))

        policies = {}
        try:
            for key, value in cookbook['metadata']['attributes']['json_schema']['object']['properties']['gecos_ws_mgmt']['properties'].items():
                for k, policy in value['properties'].items():
                    policy['path'] = '%s.%s.%s' % (cookbook_name, key, k)
                    policies[k] = policy
        except KeyError:
            print "Can not found policies in cookbook %s" % cookbook_name
            sys.exit(1)

        policies_to_import = self.options.policies
        if policies_to_import:
            found = set(policies_to_import).intersection(set(policies.keys()))
            not_found = set(policies_to_import).difference(set(policies.keys()))
            if not_found:
                print "%s policies to import. Policies NOT FOUND: %s" % (len(found), list(not_found))
            else:
                print "%s policies to import" % len(found)
        else:
            print "%s policies to import" % len(policies.keys())

        for key, value in policies.items():
            if policies_to_import and key not in policies_to_import:
                continue
            elif key in EXCLUDE_POLICIES:
                continue
            if key == PACKAGE_POLICY:
                self.set_packages_url(value)
            
            if key == MIMETYPES_POLICY:
                self.set_mimetypes_url(value)

            if key == MOBILE_BROADBAND_POLICY:
                self.set_serviceproviders_url(value)

            support_os = value['properties']['support_os']['default']

            for ex_attr in EXCLUDE_GENERIC_ATTRS:
                if ex_attr in value['properties']:
                    del(value['properties'][ex_attr])

            path = value.pop('path')

            form_layout = value.pop('form', {})
            is_mergeable = value.pop('is_mergeable', False)
            autoreverse = value.pop('autoreverse', False)

            if is_user_policy(path):
                targets = ['ou', 'user', 'group']
                title = value['title']
                titles = {}
                for lan in languages:
                    titles[lan] = value['title_' + lan]

                value = value['properties']['users']['patternProperties']['.*']
                if 'updated_by' in value.get('properties', {}):
                    del value['properties']['updated_by']
                value['title'] = title
                for lan in languages:
                    value['title_' + lan] = titles[lan]

            elif 'single_node' in path:
                targets = ['computer']
            else:
                targets = DEFAULT_TARGETS

            policy = {
                'name': value['title'],
                'slug': key,
                'path': path,
                'schema': value,
                'form': form_layout,
                'targets': targets,
                'is_emitter_policy': False,
                'support_os': support_os,
                'is_mergeable': is_mergeable,
                'autoreverse': autoreverse,
            }

            for lan in languages:
                policy['name_' + lan] = value['title_' + lan]

            self.treatment_policy(policy)

        if not self.options.ignore_emitter_policies:
            for emiter in RESOURCES_EMITTERS_TYPES:
                slug = emiter_police_slug(emiter)
                schema = deepcopy(SCHEMA_EMITTER)
                schema['properties']['object_related_list']['title'] = '%s list' % emiter.capitalize()
                for lan in languages:
                    schema['properties']['object_related_list']['title_' + lan] = EMITTER_LIST_LOCALIZED[lan] % EMITTER_LOCALIZED[lan][emiter]
                schema['properties']['object_related_list']['autocomplete_url'] = POLICY_EMITTER_URL[slug]
                policy = {
                    'name': POLICY_EMITTER_NAMES[slug],
                    'slug': slug,
                    'path': POLICY_EMITTER_PATH[slug],
                    'targets': POLICY_EMITTER_TARGETS[slug],
                    'is_emitter_policy': True,
                    'schema': schema,
                    'support_os': policies[POLICY_EMITTER_PATH[slug].split('.')[2]]['properties']['support_os']['default'],
                    'is_mergeable': True,
                    'autoreverse': policies[POLICY_EMITTER_PATH[slug].split('.')[-2]].get('autoreverse', False)
                }
                for lan in languages:
                    policy['name_' + lan] = POLICY_EMITTER_NAMES_LOCALIZED[lan][slug]
                self.treatment_policy(policy)
                
        # Check non imported policies
        print "Check non imported policies..."
        dbpolicies = self.db.policies.find({})
        found = False
        for policy in dbpolicies:
            if (policy['slug'] not in policies and 
                not policy['slug'].endswith('_can_view')):
                print "Policy '%s' wasn't imported. Probably is deprecated." % (policy['slug'])
                found = True
                if self.options.delete:
                    # Delete deprecated policy
                    self.db.policies.remove({'slug': policy['slug']})
                    print "Policy '%s' deleted!" % (policy['slug'])
                    if policy['slug'] == 'package_profile_res':
                        # Also delete software_profiles collection
                        print "Drop software profiles collection!"
                        self.db.software_profiles.drop()
                        self.db.settings.remove({'key' : 'software_profiles'})
                        
        if not found:
            print "There are no deprecated policies"
Exemple #12
0
    def update_node_from_rules(self, rules, user, computer, obj_ui, obj,
                               action, node, policy, rule_type,
                               job_ids_by_computer):
        updated = updated_updated_by = False
        attributes_jobs_updated = []
        attributes_updated_by_updated = []
        for field_chef, field_ui in rules.items():
            if is_user_policy(field_chef) and 'user' not in computer:
                continue
            job_attr = '.'.join(field_chef.split('.')[:3]) + '.job_ids'
            updated_by_attr = self.get_updated_by_fieldname(
                field_chef, policy, obj, computer)
            priority_obj_ui = obj_ui
            obj_ui_field = None
            if (rule_type == 'policies'
                    or not policy.get('is_emitter_policy', False)
                ) and updated_by_attr not in attributes_updated_by_updated:
                updated_updated_by = updated_updated_by or self.update_node_updated_by(
                    node, field_chef, obj, action, updated_by_attr,
                    attributes_updated_by_updated)
            priority_obj = self.priority_object(node, updated_by_attr, obj,
                                                action)
            if priority_obj != obj:
                priority_obj_ui = self.get_object_ui(rule_type, priority_obj,
                                                     node, policy)
            if priority_obj.get('_id', None) == obj.get(
                    '_id', None) or action == DELETED_POLICY_ACTION:
                if callable(field_ui):
                    if is_user_policy(field_chef):
                        priority_obj = computer['user']
                    obj_ui_field = field_ui(priority_obj_ui,
                                            obj=priority_obj,
                                            node=node,
                                            field_chef=field_chef)
                else:
                    obj_ui_field = priority_obj_ui.get(field_ui, None)

                if obj_ui_field is None and action != DELETED_POLICY_ACTION:
                    continue
                elif obj_ui_field is None and action == DELETED_POLICY_ACTION:
                    try:
                        obj_ui_field = delete_dotted(node.attributes,
                                                     field_chef)
                        updated = True
                    except KeyError:
                        pass
                else:
                    try:
                        value_field_chef = node.attributes.get_dotted(
                            field_chef)
                    except KeyError:
                        value_field_chef = None
                    if obj_ui_field != value_field_chef:
                        node.attributes.set_dotted(field_chef, obj_ui_field)
                        updated = True
            if job_attr not in attributes_jobs_updated:
                if updated:
                    self.update_node_job_id(user, obj, action, computer, node,
                                            policy, job_attr,
                                            attributes_jobs_updated,
                                            job_ids_by_computer)
        return (node, (updated or updated_updated_by))