diff --git a/rhn_channel.py b/rhn_channel.py new file mode 100755 index 00000000000..ca24ee3e63f --- /dev/null +++ b/rhn_channel.py @@ -0,0 +1,138 @@ +#!/usr/bin/python + +DOCUMENTATION = ''' +--- +module: rhn_channel +short_description: Define Red Hat software channels +description: + - Adds or removes Red Hat software channels on a system +version_added: 1.0 +author: Vincent Van der Kussen +notes: + - this module fetches the systemid from rhn. A function + to use the local systemid is provided (get_localsystem) + but not integrated + - Username and password are currently hardcoded in the main + section +requirements: + - none +options: + name: + description + - name of the software channel + required: true + default: null + sysname: + description: + - name of the system as it is known in rhn/sattelite + required: true + default: null + url: + description: + - The full url to the rhn/sattelite api + required: true +examples: + - code: rhn_channel name=rhel-x86_64-server-v2vwin-6 sysname=server01 + url=https://rhn.redhat.com/rpc/api + description: add software channel rhel-x86_64-server-v2vwin-6 + to server01 in Red Hat Network +''' + +import xmlrpclib +from operator import itemgetter +import re + + +# ------------------------------------------------------- # + +def get_systemid(client, session, sysname): + systems = client.system.listUserSystems(session) + for system in systems: + if system.get('name') == sysname: + idres = system.get('id') + idd = int(idres) + return idd + +# ------------------------------------------------------- # + +def get_localsystemid(): + f = open("/etc/sysconfig/rhn/systemid", "r") + content = f.read() + loc_id = re.search(r'\b(ID-)(\d{10})' ,content) + return loc_id.group(2) + +# ------------------------------------------------------- # + +def subscribe_channels(channels, client, session, sysname, sys_id): + c = base_channels(client, session, sys_id) + c.append(channels) + return client.channel.software.setSystemChannels(session, sys_id, c) + +# ------------------------------------------------------- # + +def unsubscribe_channels(channels, client, session, sysname, sys_id): + c = base_channels(client, session, sys_id) + c.remove(channels) + return client.channel.software.setSystemChannels(session, sys_id, c) + +# ------------------------------------------------------- # + +def base_channels(client, session, sys_id): + basechan = client.channel.software.listSystemChannels(session, sys_id) + chans = [item['channel_label'] for item in basechan] + return chans + +# ------------------------------------------------------- # + + +def main(): + + module = AnsibleModule( + argument_spec = dict( + state = dict(default='present', choices=['present', 'absent']), + name = dict(required=True), + sysname = dict(required=True), + url = dict(required=True), + ) +# supports_check_mode=True + ) + + state = module.params['state'] + channelname = module.params['name'] + systname = module.params['sysname'] + saturl = module.params['url'] + + #initialize connection + user = "kussenv" + pwd = "fubar2000" + client = xmlrpclib.Server(saturl, verbose=0) + session = client.auth.login(user, pwd) + + # get systemid + sys_id = get_systemid(client, session, systname) + + # get channels for system + chans = base_channels(client, session, sys_id) + + + if state == 'present': + if channelname in chans: + module.exit_json(changed=False, msg="Channel %s already exists" % channelname) + + else: + subscribe_channels(channelname, client, session, systname, sys_id) + module.exit_json(changed=True, msg="Channel %s added" % channelname) + + if state == 'absent': + if not channelname in chans: + module.exit_json(changed=False, msg="System not subscribed to channel %s." % channelname) + else: + unsubscribe_channels(channelname, client, session, systname, sys_id) + module.exit_json(changed=True, msg="Channel %s removed" % channelname) + + client.auth.logout(session) + + +# include magic from lib/ansible/module_common.py +#<> +main()