summaryrefslogtreecommitdiffstats
path: root/src/lib/Bcfg2/Server/Plugins/Packages/Layman.py
blob: 40358e214f9fd5b0f8bcc1a2c362eee05671e08e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import os
import layman
import Bcfg2.Server.Plugin

class LaymanSource(Bcfg2.Server.Plugin.Debuggable):
    basegroups = ['portage', 'gentoo', 'emerge']
    ptype = 'layman'
    cclass = 'Portage'

    def __init__(self, basepath, xsource, config):
        Bcfg2.Server.Plugin.Debuggable.__init__(self)
        self.basepath = basepath
        self.xsource = xsource
        self.config = config

        self.url = xsource.get('url', 'http://www.gentoo.org/proj/en/overlays/repositories.xml')
        self.name = xsource.get('name', '')
        self.priority = xsource.get('priority', 0)
        self.cachefile = None
        self.gpgkeys = []
        self.recommended = False

        # configure layman
        base = os.path.join(basepath, 'layman')
        config = layman.config.OptionConfig(options = {
            'storage': os.path.join(base, 'overlays'),
            'cache': os.path.join(base, 'cache'),
            'installed': os.path.join(base, 'installed.xml'),
            'local_list': os.path.join(base, 'overlays.xml'),
            'overlays': [url]
	})
	self.api = layman.LaymanAPI(config)

	# path
	self.dir = os.path.join(basepath, 'overlays', self.name)

        # build the set of conditions to see if this source applies to
        # a given set of metadata
        self.conditions = []
        self.groups = [] # provided for some limited backwards compat
        for el in xsource.iterancestors():
            if el.tag == "Group":
                if el.get("negate", "false").lower() == "true":
                    self.conditions.append(lambda m, el=el:
                                           el.get("name") not in m.groups)
                else:
                    self.groups.append(el.get("name"))
                    self.conditions.append(lambda m, el=el:
                                           el.get("name") in m.groups)
            elif el.tag == "Client":
                if el.get("negate", "false").lower() == "true":
                    self.conditions.append(lambda m, el=el:
                                           el.get("name") != m.hostname)
                else:
                    self.conditions.append(lambda m, el=el:
                                           el.get("name") == m.hostname)

    def save_state(self):
        pass

    def load_state(self):
        pass

    def filter_unknown(self, unknown):
        filtered = set([u for u in unknown if u.startswith('choice')])
        unknown.difference_update(filtered)

    def get_urls(self):
        return self.url
    urls = property(get_urls)

    def magic_groups_match(self, metadata):
        if self.config.getboolean("global", "magic_groups",
                                  default=True) == False:
            return True
        else:
            for group in self.basegroups:
                if group in metadata.groups:
                    return True
            return False

    def setup_data(self, force_update=False):
        self.api.fetch_remote_list()
        if not self.api.is_repo(self.name):
            self.logger.error("Packages: Layman overlay '%s' not"
                              " found" % self.name)
            return False

        if not self.api.is_installed(self.name):
            self.logger.info("Packages: Adding layman overlay '%s'" %
                             self.name)
            if not self.api.add_repos(name):
                self.logger.error("Packages: Failed adding layman"
                                  " overlay '%s'" % self.name)
                return False

        if force_update:
            if not self.api.sync(name):
                self.logger.error("Packages: Failed syncing layman"
                                  " overlay '%s'" % self.name)
                return False

        return True

    def applies(self, metadata):
        # check base groups
        if not self.magic_groups_match(metadata):
            return False

        # check Group/Client tags from sources.xml
        for condition in self.conditions:
            if not condition(metadata):
                return False

        return True