swdepot 5.98 KB
Newer Older
1 2 3
#!/usr/bin/python -tt
# -*- coding: utf-8 -*-

4
# (c) 2013, Raul Melo
5
# Written by Raul Melo <raulmelo@gmail.com>
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
# Based on yum module written by Seth Vidal <skvidal at fedoraproject.org>
#
# 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 <http://www.gnu.org/licenses/>.

import re
22
import pipes
23 24 25 26 27 28 29

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)
30
version_added: "1.4"
31 32 33 34 35 36 37 38 39 40
notes: []
author: Raul Melo
options:
    name:
        description:
            - package name.
        required: true
        default: null
        choices: []
        aliases: []
41
        version_added: 1.4
42 43 44 45 46 47 48
    state:
        description:
            - whether to install (C(present), C(latest)), or remove (C(absent)) a package.
        required: true
        default: null
        choices: [ 'present', 'latest', 'absent']
        aliases: []
49
        version_added: 1.4
50 51 52 53 54 55 56
    depot:
        description:
            - The source repository from which install or upgrade a package.
        required: false
        default: null
        choices: []
        aliases: []
57
        version_added: 1.4
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
'''

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 compare_package(version1, version2):
    """ Compare version packages.
        Return values:
        -1 first minor
        0 equal
        1 fisrt greater """

    def normalize(v):
74
        return [int(x) for x in re.sub(r'(\.0+)*$', '', v).split(".")]
75 76
    return cmp(normalize(version1), normalize(version2))

77
def query_package(module, name, depot=None):
78 79 80 81
    """ Returns whether a package is installed or not and version. """

    cmd_list = '/usr/sbin/swlist -a revision -l product'
    if depot:
82
        rc, stdout, stderr = module.run_command("%s -s %s %s | grep %s" % (cmd_list, pipes.quote(depot), pipes.quote(name), pipes.quote(name)), use_unsafe_shell=True)
83
    else:
84
        rc, stdout, stderr = module.run_command("%s %s | grep %s" % (cmd_list, pipes.quote(name), pipes.quote(name)), use_unsafe_shell=True)
85 86 87 88 89 90 91
    if rc == 0:
        version = re.sub("\s\s+|\t" , " ", stdout).strip().split()[1]
    else:
        version = None

    return rc, version

92
def remove_package(module, name):
93 94 95
    """ Uninstall package if installed. """

    cmd_remove = '/usr/sbin/swremove'
96
    rc, stdout, stderr = module.run_command("%s %s" % (cmd_remove, name))
97 98 99 100 101 102

    if rc == 0:
        return rc, stdout
    else:
        return rc, stderr

103
def install_package(module, depot, name):
104 105 106
    """ Install package if not already installed """

    cmd_install = '/usr/sbin/swinstall -x mount_all_filesystems=false'
107
    rc, stdout, stderr = module.run_command("%s -s %s %s" % (cmd_install, depot, name))
108 109 110 111 112 113 114
    if rc == 0:
        return rc, stdout
    else:
        return rc, stderr

def main():
    module = AnsibleModule(
115 116 117
        argument_spec = dict(
            name = dict(aliases=['pkg'], required=True),
            state = dict(choices=['present', 'absent', 'latest'], required=True),
118
            depot = dict(default=None, required=False)
119 120 121
        ),
        supports_check_mode=True
    )
122 123 124 125 126
    name = module.params['name']
    state = module.params['state']
    depot = module.params['depot']

    changed = False
127
    msg = "No changed"
128
    rc = 0
129 130 131
    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)
132 133 134


    #Check local version
135
    rc, version_installed = query_package(module, name)
136 137 138 139 140 141 142 143 144 145
    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)
146
        rc, output = install_package(module, depot, name)
147 148 149 150 151 152

        if not rc:
            changed = True
            msg = "Packaged installed"

        else:
153
            module.fail_json(name=name, msg=output, rc=rc)
154 155 156

    elif state == 'latest' and installed == True:
        #Check depot version
157
        rc, version_depot = query_package(module, name, depot)
158 159 160 161 162 163

        if not rc:
            if compare_package(version_installed,version_depot) == -1:
                if module.check_mode:
                    module.exit_json(changed=True)
                #Install new version
164
                rc, output = install_package(module, depot, name)
165 166

                if not rc:
167
                    msg = "Packge upgraded, Before " + version_installed + " Now " + version_depot
168 169 170
                    changed = True

                else:
171
                    module.fail_json(name=name, msg=output, rc=rc)
172 173 174

        else:
            output = "Software package not in repository " + depot
175
            module.fail_json(name=name, msg=output, rc=rc)
176

177
    elif state == 'absent' and installed == True:
178 179
        if module.check_mode:
            module.exit_json(changed=True)
180
        rc, output = remove_package(module, name)
181 182 183 184
        if not rc:
            changed = True
            msg = "Package removed"
        else:
185
            module.fail_json(name=name, msg=output, rc=rc)
186 187 188 189

    if module.check_mode:
        module.exit_json(changed=False)

190
    module.exit_json(changed=changed, name=name, state=state, msg=msg)
191

192
# import module snippets
193
from ansible.module_utils.basic import *
194 195 196

main()