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
|