Skip to content

Commit 4e0b11c

Browse files
committed
fixed zypper.py and zypper_repository.py for SLE10 platform
1 parent 681db4c commit 4e0b11c

File tree

2 files changed

+101
-25
lines changed

2 files changed

+101
-25
lines changed

packaging/zypper.py

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,16 @@
8484
- zypper: name=nmap state=absent
8585
'''
8686

87+
# Function used for getting zypper version
88+
def zypper_version(module):
89+
"""Return (rc, message) tuple"""
90+
cmd = ['/usr/bin/zypper', '-V']
91+
rc, stdout, stderr = module.run_command(cmd, check_rc=False)
92+
if rc == 0:
93+
return rc, stdout
94+
else:
95+
return rc, stderr
96+
8797
# Function used for getting versions of currently installed packages.
8898
def get_current_version(m, name):
8999
cmd = ['/bin/rpm', '-q', '--qf', '%{NAME} %{VERSION}-%{RELEASE}\n']
@@ -130,20 +140,22 @@ def get_package_state(m, packages):
130140
return installed_state
131141

132142
# Function used to make sure a package is present.
133-
def package_present(m, name, installed_state, disable_gpg_check, disable_recommends):
143+
def package_present(m, name, installed_state, disable_gpg_check, disable_recommends, old_zypper):
134144
packages = []
135145
for package in name:
136146
if installed_state[package] is False:
137147
packages.append(package)
138148
if len(packages) != 0:
139149
cmd = ['/usr/bin/zypper', '--non-interactive']
140150
# add global options before zypper command
141-
if disable_gpg_check:
151+
if disable_gpg_check and not old_zypper:
142152
cmd.append('--no-gpg-check')
153+
else:
154+
cmd.append('--no-gpg-checks')
143155

144156
cmd.extend(['install', '--auto-agree-with-licenses'])
145157
# add install parameter
146-
if disable_recommends:
158+
if disable_recommends and not old_zypper:
147159
cmd.append('--no-recommends')
148160
cmd.extend(packages)
149161
rc, stdout, stderr = m.run_command(cmd, check_rc=False)
@@ -161,16 +173,19 @@ def package_present(m, name, installed_state, disable_gpg_check, disable_recomme
161173
return (rc, stdout, stderr, changed)
162174

163175
# Function used to make sure a package is the latest available version.
164-
def package_latest(m, name, installed_state, disable_gpg_check, disable_recommends):
176+
def package_latest(m, name, installed_state, disable_gpg_check, disable_recommends, old_zypper):
165177

166178
# first of all, make sure all the packages are installed
167-
(rc, stdout, stderr, changed) = package_present(m, name, installed_state, disable_gpg_check)
179+
(rc, stdout, stderr, changed) = package_present(m, name, installed_state, disable_gpg_check, disable_recommends, old_zypper)
168180

169181
# if we've already made a change, we don't have to check whether a version changed
170182
if not changed:
171183
pre_upgrade_versions = get_current_version(m, name)
172184

173-
cmd = ['/usr/bin/zypper', '--non-interactive', 'update', '--auto-agree-with-licenses']
185+
if old_zypper:
186+
cmd = ['/usr/bin/zypper', '--non-interactive', 'install', '--auto-agree-with-licenses']
187+
else:
188+
cmd = ['/usr/bin/zypper', '--non-interactive', 'update', '--auto-agree-with-licenses']
174189
cmd.extend(name)
175190
rc, stdout, stderr = m.run_command(cmd, check_rc=False)
176191

@@ -183,7 +198,7 @@ def package_latest(m, name, installed_state, disable_gpg_check, disable_recommen
183198
return (rc, stdout, stderr, changed)
184199

185200
# Function used to make sure a package is not installed.
186-
def package_absent(m, name, installed_state):
201+
def package_absent(m, name, installed_state, old_zypper):
187202
packages = []
188203
for package in name:
189204
if installed_state[package] is True:
@@ -234,16 +249,23 @@ def main():
234249
result['name'] = name
235250
result['state'] = state
236251

252+
rc, out = zypper_version(module)
253+
match = re.match(r'zypper\s+(\d+)\.(\d+)\.(\d+)', out)
254+
if not match or int(match.group(1)) > 0:
255+
old_zypper = False
256+
else:
257+
old_zypper = True
258+
237259
# Get package state
238260
installed_state = get_package_state(module, name)
239261

240262
# Perform requested action
241263
if state in ['installed', 'present']:
242-
(rc, stdout, stderr, changed) = package_present(module, name, installed_state, disable_gpg_check, disable_recommends)
264+
(rc, stdout, stderr, changed) = package_present(module, name, installed_state, disable_gpg_check, disable_recommends, old_zypper)
243265
elif state in ['absent', 'removed']:
244-
(rc, stdout, stderr, changed) = package_absent(module, name, installed_state)
266+
(rc, stdout, stderr, changed) = package_absent(module, name, installed_state, old_zypper)
245267
elif state == 'latest':
246-
(rc, stdout, stderr, changed) = package_latest(module, name, installed_state, disable_gpg_check, disable_recommends)
268+
(rc, stdout, stderr, changed) = package_latest(module, name, installed_state, disable_gpg_check, disable_recommends, old_zypper)
247269

248270
if rc != 0:
249271
if stderr:

packaging/zypper_repository.py

Lines changed: 69 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -72,16 +72,24 @@
7272
# Add python development repository
7373
- zypper_repository: repo=http://download.opensuse.org/repositories/devel:/languages:/python/SLE_11_SP3/devel:languages:python.repo
7474
'''
75-
from xml.dom.minidom import parseString as parseXML
7675

7776
REPO_OPTS = ['alias', 'name', 'priority', 'enabled', 'autorefresh', 'gpgcheck']
7877

78+
def zypper_version(module):
79+
"""Return (rc, message) tuple"""
80+
cmd = ['/usr/bin/zypper', '-V']
81+
rc, stdout, stderr = module.run_command(cmd, check_rc=False)
82+
if rc == 0:
83+
return rc, stdout
84+
else:
85+
return rc, stderr
7986

8087
def _parse_repos(module):
8188
"""parses the output of zypper -x lr and returns a parse repo dictionary"""
8289
cmd = ['/usr/bin/zypper', '-x', 'lr']
8390
repos = []
8491

92+
from xml.dom.minidom import parseString as parseXML
8593
rc, stdout, stderr = module.run_command(cmd, check_rc=True)
8694
dom = parseXML(stdout)
8795
repo_list = dom.getElementsByTagName('repo')
@@ -95,8 +103,25 @@ def _parse_repos(module):
95103

96104
return repos
97105

106+
def _parse_repos_old(module):
107+
"""parses the output of zypper sl and returns a parse repo dictionary"""
108+
cmd = ['/usr/bin/zypper', 'sl']
109+
repos = []
110+
rc, stdout, stderr = module.run_command(cmd, check_rc=True)
111+
for line in stdout.split('\n'):
112+
matched = re.search(r'\d+\s+\|\s+(?P<enabled>\w+)\s+\|\s+(?P<autorefresh>\w+)\s+\|\s+(?P<type>\w+)\s+\|\s+(?P<name>\w+)\s+\|\s+(?P<url>.*)', line)
113+
if matched == None:
114+
continue
115+
116+
m = matched.groupdict()
117+
m['alias']= m['name']
118+
m['priority'] = 100
119+
m['gpgcheck'] = 1
120+
repos.append(m)
121+
122+
return repos
98123

99-
def repo_exists(module, **kwargs):
124+
def repo_exists(module, old_zypper, **kwargs):
100125

101126
def repo_subset(realrepo, repocmp):
102127
for k in repocmp:
@@ -109,21 +134,32 @@ def repo_subset(realrepo, repocmp):
109134
return False
110135
return True
111136

112-
repos = _parse_repos(module)
137+
if old_zypper:
138+
repos = _parse_repos_old(module)
139+
else:
140+
repos = _parse_repos(module)
113141

114142
for repo in repos:
115143
if repo_subset(repo, kwargs):
116144
return True
117145
return False
118146

119147

120-
def add_repo(module, repo, alias, description, disable_gpg_check):
121-
cmd = ['/usr/bin/zypper', 'ar', '--check', '--refresh']
148+
def add_repo(module, repo, alias, description, disable_gpg_check, old_zypper):
149+
if old_zypper:
150+
cmd = ['/usr/bin/zypper', 'sa']
151+
else:
152+
cmd = ['/usr/bin/zypper', 'ar', '--check', '--refresh']
153+
154+
if repo.startswith("file:/") and old_zypper:
155+
cmd.extend(['-t', 'Plaindir'])
156+
else:
157+
cmd.extend(['-t', 'plaindir'])
122158

123159
if description:
124160
cmd.extend(['--name', description])
125161

126-
if disable_gpg_check:
162+
if disable_gpg_check and not old_zypper:
127163
cmd.append('--no-gpgcheck')
128164

129165
cmd.append(repo)
@@ -138,14 +174,21 @@ def add_repo(module, repo, alias, description, disable_gpg_check):
138174
elif 'already exists. Please use another alias' in stderr:
139175
changed = False
140176
else:
141-
module.fail_json(msg=stderr if stderr else stdout)
177+
#module.fail_json(msg=stderr if stderr else stdout)
178+
if stderr:
179+
module.fail_json(msg=stderr)
180+
else:
181+
module.fail_json(msg=stdout)
142182

143183
return changed
144184

145185

146-
def remove_repo(module, repo, alias):
186+
def remove_repo(module, repo, alias, old_zypper):
147187

148-
cmd = ['/usr/bin/zypper', 'rr']
188+
if old_zypper:
189+
cmd = ['/usr/bin/zypper', 'sd']
190+
else:
191+
cmd = ['/usr/bin/zypper', 'rr']
149192
if alias:
150193
cmd.append(alias)
151194
else:
@@ -158,7 +201,11 @@ def remove_repo(module, repo, alias):
158201

159202
def fail_if_rc_is_null(module, rc, stdout, stderr):
160203
if rc != 0:
161-
module.fail_json(msg=stderr if stderr else stdout)
204+
#module.fail_json(msg=stderr if stderr else stdout)
205+
if stderr:
206+
module.fail_json(msg=stderr)
207+
else:
208+
module.fail_json(msg=stdout)
162209

163210

164211
def main():
@@ -182,6 +229,13 @@ def main():
182229
def exit_unchanged():
183230
module.exit_json(changed=False, repo=repo, state=state, name=name)
184231

232+
rc, out = zypper_version(module)
233+
match = re.match(r'zypper\s+(\d+)\.(\d+)\.(\d+)', out)
234+
if not match or int(match.group(1)) > 0:
235+
old_zypper = False
236+
else:
237+
old_zypper = True
238+
185239
# Check run-time module parameters
186240
if state == 'present' and not repo:
187241
module.fail_json(msg='Module option state=present requires repo')
@@ -196,22 +250,22 @@ def exit_unchanged():
196250
module.fail_json(msg='Name required when adding non-repo files:')
197251

198252
if repo and repo.endswith('.repo'):
199-
exists = repo_exists(module, url=repo, alias=name)
253+
exists = repo_exists(module, old_zypper, url=repo, alias=name)
200254
elif repo:
201-
exists = repo_exists(module, url=repo)
255+
exists = repo_exists(module, old_zypper, url=repo)
202256
else:
203-
exists = repo_exists(module, alias=name)
257+
exists = repo_exists(module, old_zypper, alias=name)
204258

205259
if state == 'present':
206260
if exists:
207261
exit_unchanged()
208262

209-
changed = add_repo(module, repo, name, description, disable_gpg_check)
263+
changed = add_repo(module, repo, name, description, disable_gpg_check, old_zypper)
210264
elif state == 'absent':
211265
if not exists:
212266
exit_unchanged()
213267

214-
changed = remove_repo(module, repo, name)
268+
changed = remove_repo(module, repo, name, old_zypper)
215269

216270
module.exit_json(changed=changed, repo=repo, state=state)
217271

0 commit comments

Comments
 (0)