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
7776REPO_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
8087def _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
159202def 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
164211def 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