From e635a1ee5a3469a6cc3a4c10766cb58110e0565e Mon Sep 17 00:00:00 2001 From: Raul Melo Date: Thu, 1 Aug 2013 13:49:25 +0200 Subject: [PATCH 1/4] Module for swdepot (HP-UX package manager) --- packaging/swdepot | 201 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 201 insertions(+) create mode 100755 packaging/swdepot diff --git a/packaging/swdepot b/packaging/swdepot new file mode 100755 index 00000000000..2897da9d316 --- /dev/null +++ b/packaging/swdepot @@ -0,0 +1,201 @@ +#!/usr/bin/python -tt +# -*- coding: utf-8 -*- + +# (c) 2012, Flowroute LLC +# Written by Matthew Williams +# Based on yum module written by Seth Vidal +# +# This module is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This software is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this software. If not, see . + +import re + +DOCUMENTATION = ''' +--- +module: swdepot +short_description: Manage packages with swdepot package manager (HP-UX) +description: + - Will install, upgrade and remove packages with swdepot package manager (HP-UX) +version_added: "1.3" +notes: [] +author: Raul Melo +options: + name: + description: + - package name. + required: true + default: null + choices: [] + aliases: [] + version_added: 1.3 + state: + description: + - whether to install (C(present), C(latest)), or remove (C(absent)) a package. + required: true + default: null + choices: [ 'present', 'latest', 'absent'] + aliases: [] + version_added: 1.3 + depot: + description: + - The source repository from which install or upgrade a package. + required: false + default: null + choices: [] + aliases: [] + version_added: 1.3 +''' + +EXAMPLES = ''' +- swdepot: name=unzip-6.0 state=installed depot=repository:/path +- swdepot: name=unzip state=latest depot=repository:/path +- swdepot: name=unzip state=absent +''' + +def _run(cmd): + # returns (rc, stdout, stderr) from shell command + process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) + stdout, stderr = process.communicate() + return (process.returncode, stdout, stderr) + +def compare_package(version1, version2): + """ Compare version packages. + Return values: + -1 first minor + 0 equal + 1 fisrt greater """ + + def normalize(v): + return [int(x) for x in re.sub(r'(\.0+)*$','', v).split(".")] + return cmp(normalize(version1), normalize(version2)) + +def query_package(name,depot=None): + """ Returns whether a package is installed or not and version. """ + + cmd_list = '/usr/sbin/swlist -a revision -l product' + if depot: + rc, stdout, stderr = _run("%s -s %s %s | grep %s" % (cmd_list, depot, name, name)) + else: + rc, stdout, stderr = _run("%s %s | grep %s" % (cmd_list, name, name)) + if rc == 0: + version = re.sub("\s\s+|\t" , " ", stdout).strip().split()[1] + else: + version = None + + return rc, version + +def remove_package(name): + """ Uninstall package if installed. """ + + cmd_remove = '/usr/sbin/swremove' + rc, stdout, stderr = _run("%s %s" % (cmd_remove, name)) + + if rc == 0: + return rc, stdout + else: + return rc, stderr + +def install_package(depot, name): + """ Install package if not already installed """ + + cmd_install = '/usr/sbin/swinstall -x mount_all_filesystems=false' + rc, stdout, stderr = _run("%s -s %s %s" % (cmd_install, depot, name)) + if rc == 0: + return rc, stdout + else: + return rc, stderr + +def main(): + module = AnsibleModule( + argument_spec = dict( + name = dict(aliases=['pkg'],required=True), + state = dict(choices=['present','absent','latest'],required=True), + depot = dict(default=None,requied=False) + ), + supports_check_mode=True + ) + name = module.params['name'] + state = module.params['state'] + depot = module.params['depot'] + + changed = False + msg = 'No changed' + rc = 0 + if ( state == "present" or state == "latest" ) and depot == None: + output = "depot parameter is mandatory with present or latest task" + module.fail_json(name=name,msg=output,rc=rc) + + + #Check local version + rc, version_installed = query_package(name) + if not rc: + installed = True + msg = "Already installed" + + else: + installed = False + + if ( state == 'present' or state == 'latest' ) and installed == False: + if module.check_mode: + module.exit_json(changed=True) + rc, output = install_package(depot, name) + + if not rc: + changed = True + msg = "Packaged installed" + + else: + module.fail_json(name=name,msg=output,rc=rc) + + elif state == 'latest' and installed == True: + #Check depot version + rc, version_depot = query_package(name,depot) + + if not rc: + if compare_package(version_installed,version_depot) == -1: + if module.check_mode: + module.exit_json(changed=True) + #Install new version + rc, output = install_package(depot, name) + + if not rc: + msg = 'Packge upgraded, Before ' + version_installed + " Now " + version_depot + changed = True + + else: + module.fail_json(name=name,msg=output,rc=rc) + + else: + output = "Software package not in repository " + depot + module.fail_json(name=name,msg=output,rc=rc) + + elif state == "absent" and installed == True: + if module.check_mode: + module.exit_json(changed=True) + rc, output = remove_package(name) + if not rc: + changed = True + msg = "Package removed" + else: + module.fail_json(name=name,msg=output,rc=rc) + + if module.check_mode: + module.exit_json(changed=False) + + module.exit_json(changed=changed,name=name,state=state,msg=msg) + +# this is magic, see lib/ansible/module_common.py +#<> + +main() + From b8cba01800c6f529a8c4044e70086114c250cedb Mon Sep 17 00:00:00 2001 From: Raul Melo Date: Fri, 9 Aug 2013 16:04:13 +0200 Subject: [PATCH 2/4] Made some code cleanups and use of module.run_command --- packaging/swdepot | 72 ++++++++++++++++++++++------------------------- 1 file changed, 33 insertions(+), 39 deletions(-) diff --git a/packaging/swdepot b/packaging/swdepot index 2897da9d316..ef054085105 100755 --- a/packaging/swdepot +++ b/packaging/swdepot @@ -1,8 +1,8 @@ #!/usr/bin/python -tt # -*- coding: utf-8 -*- -# (c) 2012, Flowroute LLC -# Written by Matthew Williams +# (c) 2013, Raul Melo +# Written by Raul Melo # Based on yum module written by Seth Vidal # # This module is free software: you can redistribute it and/or modify @@ -62,12 +62,6 @@ EXAMPLES = ''' - swdepot: name=unzip state=absent ''' -def _run(cmd): - # returns (rc, stdout, stderr) from shell command - process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) - stdout, stderr = process.communicate() - return (process.returncode, stdout, stderr) - def compare_package(version1, version2): """ Compare version packages. Return values: @@ -76,17 +70,17 @@ def compare_package(version1, version2): 1 fisrt greater """ def normalize(v): - return [int(x) for x in re.sub(r'(\.0+)*$','', v).split(".")] + return [int(x) for x in re.sub(r'(\.0+)*$', '', v).split(".")] return cmp(normalize(version1), normalize(version2)) -def query_package(name,depot=None): +def query_package(module, name, depot=None): """ Returns whether a package is installed or not and version. """ cmd_list = '/usr/sbin/swlist -a revision -l product' if depot: - rc, stdout, stderr = _run("%s -s %s %s | grep %s" % (cmd_list, depot, name, name)) + rc, stdout, stderr = module.run_command("%s -s %s %s | grep %s" % (cmd_list, depot, name, name)) else: - rc, stdout, stderr = _run("%s %s | grep %s" % (cmd_list, name, name)) + rc, stdout, stderr = module.run_command("%s %s | grep %s" % (cmd_list, name, name)) if rc == 0: version = re.sub("\s\s+|\t" , " ", stdout).strip().split()[1] else: @@ -94,22 +88,22 @@ def query_package(name,depot=None): return rc, version -def remove_package(name): +def remove_package(module, name): """ Uninstall package if installed. """ cmd_remove = '/usr/sbin/swremove' - rc, stdout, stderr = _run("%s %s" % (cmd_remove, name)) + rc, stdout, stderr = module.run_command("%s %s" % (cmd_remove, name)) if rc == 0: return rc, stdout else: return rc, stderr -def install_package(depot, name): +def install_package(module, depot, name): """ Install package if not already installed """ cmd_install = '/usr/sbin/swinstall -x mount_all_filesystems=false' - rc, stdout, stderr = _run("%s -s %s %s" % (cmd_install, depot, name)) + rc, stdout, stderr = module.run_command("%s -s %s %s" % (cmd_install, depot, name)) if rc == 0: return rc, stdout else: @@ -117,27 +111,27 @@ def install_package(depot, name): def main(): module = AnsibleModule( - argument_spec = dict( - name = dict(aliases=['pkg'],required=True), - state = dict(choices=['present','absent','latest'],required=True), - depot = dict(default=None,requied=False) - ), - supports_check_mode=True - ) + argument_spec = dict( + name = dict(aliases=['pkg'], required=True), + state = dict(choices=['present', 'absent', 'latest'], required=True), + depot = dict(default=None, requied=False) + ), + supports_check_mode=True + ) name = module.params['name'] state = module.params['state'] depot = module.params['depot'] changed = False - msg = 'No changed' + msg = "No changed" rc = 0 - if ( state == "present" or state == "latest" ) and depot == None: - output = "depot parameter is mandatory with present or latest task" - module.fail_json(name=name,msg=output,rc=rc) + if ( state == 'present' or state == 'latest' ) and depot == None: + output = "depot parameter is mandatory in present or latest task" + module.fail_json(name=name, msg=output, rc=rc) #Check local version - rc, version_installed = query_package(name) + rc, version_installed = query_package(module, name) if not rc: installed = True msg = "Already installed" @@ -148,51 +142,51 @@ def main(): if ( state == 'present' or state == 'latest' ) and installed == False: if module.check_mode: module.exit_json(changed=True) - rc, output = install_package(depot, name) + rc, output = install_package(module, depot, name) if not rc: changed = True msg = "Packaged installed" else: - module.fail_json(name=name,msg=output,rc=rc) + module.fail_json(name=name, msg=output, rc=rc) elif state == 'latest' and installed == True: #Check depot version - rc, version_depot = query_package(name,depot) + rc, version_depot = query_package(module, name, depot) if not rc: if compare_package(version_installed,version_depot) == -1: if module.check_mode: module.exit_json(changed=True) #Install new version - rc, output = install_package(depot, name) + rc, output = install_package(module, depot, name) if not rc: - msg = 'Packge upgraded, Before ' + version_installed + " Now " + version_depot + msg = "Packge upgraded, Before " + version_installed + " Now " + version_depot changed = True else: - module.fail_json(name=name,msg=output,rc=rc) + module.fail_json(name=name, msg=output, rc=rc) else: output = "Software package not in repository " + depot - module.fail_json(name=name,msg=output,rc=rc) + module.fail_json(name=name, msg=output, rc=rc) - elif state == "absent" and installed == True: + elif state == 'absent' and installed == True: if module.check_mode: module.exit_json(changed=True) - rc, output = remove_package(name) + rc, output = remove_package(module, name) if not rc: changed = True msg = "Package removed" else: - module.fail_json(name=name,msg=output,rc=rc) + module.fail_json(name=name, msg=output, rc=rc) if module.check_mode: module.exit_json(changed=False) - module.exit_json(changed=changed,name=name,state=state,msg=msg) + module.exit_json(changed=changed, name=name, state=state, msg=msg) # this is magic, see lib/ansible/module_common.py #<> From c01540f8ac436c75dde2b4f814a7f6299c9db2bf Mon Sep 17 00:00:00 2001 From: Raul Melo Date: Tue, 8 Oct 2013 00:24:42 +0200 Subject: [PATCH 3/4] Change file swdepot perms --- packaging/swdepot | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 packaging/swdepot diff --git a/packaging/swdepot b/packaging/swdepot old mode 100755 new mode 100644 From 1eaf3881ef32cfc453f39d343c07827943e36a8b Mon Sep 17 00:00:00 2001 From: Raul Melo Date: Tue, 8 Oct 2013 00:27:08 +0200 Subject: [PATCH 4/4] Changed ansible target version --- packaging/swdepot | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packaging/swdepot b/packaging/swdepot index ef054085105..8cfe43d7ac3 100644 --- a/packaging/swdepot +++ b/packaging/swdepot @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- # (c) 2013, Raul Melo -# Written by Raul Melo +# Written by Raul Melo # Based on yum module written by Seth Vidal # # This module is free software: you can redistribute it and/or modify @@ -26,7 +26,7 @@ module: swdepot short_description: Manage packages with swdepot package manager (HP-UX) description: - Will install, upgrade and remove packages with swdepot package manager (HP-UX) -version_added: "1.3" +version_added: "1.4" notes: [] author: Raul Melo options: @@ -37,7 +37,7 @@ options: default: null choices: [] aliases: [] - version_added: 1.3 + version_added: 1.4 state: description: - whether to install (C(present), C(latest)), or remove (C(absent)) a package. @@ -45,7 +45,7 @@ options: default: null choices: [ 'present', 'latest', 'absent'] aliases: [] - version_added: 1.3 + version_added: 1.4 depot: description: - The source repository from which install or upgrade a package. @@ -53,7 +53,7 @@ options: default: null choices: [] aliases: [] - version_added: 1.3 + version_added: 1.4 ''' EXAMPLES = '''