1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
|
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Copyright (c) 2018, Mikhail Gordeev
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later
from __future__ import absolute_import, division, print_function
__metaclass__ = type
DOCUMENTATION = '''
---
module: apt_repo
short_description: Manage APT repositories via apt-repo
description:
- Manages APT repositories using apt-repo tool.
- See U(https://www.altlinux.org/Apt-repo) for details about apt-repo
notes:
- This module works on ALT based distros.
- Does NOT support checkmode, due to a limitation in apt-repo tool.
extends_documentation_fragment:
- community.general.attributes
attributes:
check_mode:
support: none
diff_mode:
support: none
options:
repo:
description:
- Name of the repository to add or remove.
required: true
type: str
state:
description:
- Indicates the desired repository state.
choices: [ absent, present ]
default: present
type: str
remove_others:
description:
- Remove other then added repositories
- Used if O(state=present)
type: bool
default: false
update:
description:
- Update the package database after changing repositories.
type: bool
default: false
author:
- Mikhail Gordeev (@obirvalger)
'''
EXAMPLES = '''
- name: Remove all repositories
community.general.apt_repo:
repo: all
state: absent
- name: Add repository `Sisysphus` and remove other repositories
community.general.apt_repo:
repo: Sisysphus
state: present
remove_others: true
- name: Add local repository `/space/ALT/Sisyphus` and update package cache
community.general.apt_repo:
repo: copy:///space/ALT/Sisyphus
state: present
update: true
'''
RETURN = ''' # '''
import os
from ansible.module_utils.basic import AnsibleModule
APT_REPO_PATH = "/usr/bin/apt-repo"
def apt_repo(module, *args):
"""run apt-repo with args and return its output"""
# make args list to use in concatenation
args = list(args)
rc, out, err = module.run_command([APT_REPO_PATH] + args)
if rc != 0:
module.fail_json(msg="'%s' failed: %s" % (' '.join(['apt-repo'] + args), err))
return out
def add_repo(module, repo):
"""add a repository"""
apt_repo(module, 'add', repo)
def rm_repo(module, repo):
"""remove a repository"""
apt_repo(module, 'rm', repo)
def set_repo(module, repo):
"""add a repository and remove other repositories"""
# first add to validate repository
apt_repo(module, 'add', repo)
apt_repo(module, 'rm', 'all')
apt_repo(module, 'add', repo)
def update(module):
"""update package cache"""
apt_repo(module, 'update')
def main():
module = AnsibleModule(
argument_spec=dict(
repo=dict(type='str', required=True),
state=dict(type='str', default='present', choices=['absent', 'present']),
remove_others=dict(type='bool', default=False),
update=dict(type='bool', default=False),
),
)
if not os.path.exists(APT_REPO_PATH):
module.fail_json(msg='cannot find /usr/bin/apt-repo')
params = module.params
repo = params['repo']
state = params['state']
old_repositories = apt_repo(module)
if state == 'present':
if params['remove_others']:
set_repo(module, repo)
else:
add_repo(module, repo)
elif state == 'absent':
rm_repo(module, repo)
if params['update']:
update(module)
new_repositories = apt_repo(module)
changed = old_repositories != new_repositories
module.exit_json(changed=changed, repo=repo, state=state)
if __name__ == '__main__':
main()
|