Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
A
ansible
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
OpenEdx
ansible
Commits
d3e98943
Commit
d3e98943
authored
Mar 16, 2014
by
Michael DeHaan
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #6405 from fabianfreyer/devel
Add support for new pkgng repository format and annotations
parents
9cdbc537
064722aa
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
160 additions
and
23 deletions
+160
-23
library/packaging/pkgng
+160
-23
No files found.
library/packaging/pkgng
View file @
d3e98943
...
@@ -46,10 +46,21 @@ options:
...
@@ -46,10 +46,21 @@ options:
choices: [ 'yes', 'no' ]
choices: [ 'yes', 'no' ]
required: false
required: false
default: no
default: no
annotation:
description:
- a comma-separated list of keyvalue-pairs of the form
<+/-/:><key>[=<value>]. A '+' denotes adding an annotation, a
'-' denotes removing an annotation, and ':' denotes modifying an
annotation.
If setting or modifying annotations, a value must be provided.
required: false
pkgsite:
pkgsite:
description:
description:
- specify packagesite to use for downloading packages, if
- for pkgng versions before 1.1.4, specify packagesite to use
not specified, use settings from /usr/local/etc/pkg.conf
for downloading packages, if not specified, use settings from
/usr/local/etc/pkg.conf
for newer pkgng versions, specify a the name of a repository
configured in /usr/local/etc/pkg/repos
required: false
required: false
author: bleader
author: bleader
notes:
notes:
...
@@ -60,6 +71,9 @@ EXAMPLES = '''
...
@@ -60,6 +71,9 @@ EXAMPLES = '''
# Install package foo
# Install package foo
- pkgng: name=foo state=present
- pkgng: name=foo state=present
# Annotate package foo and bar
- pkgng: name=foo,bar annotation=+test1=baz,-test2,:test3=foobar
# Remove packages foo and bar
# Remove packages foo and bar
- pkgng: name=foo,bar state=absent
- pkgng: name=foo,bar state=absent
'''
'''
...
@@ -68,92 +82,215 @@ EXAMPLES = '''
...
@@ -68,92 +82,215 @@ EXAMPLES = '''
import
json
import
json
import
shlex
import
shlex
import
os
import
os
import
re
import
sys
import
sys
def
query_package
(
module
,
pkg
in
_path
,
name
):
def
query_package
(
module
,
pkg
ng
_path
,
name
):
rc
,
out
,
err
=
module
.
run_command
(
"
%
s info -g -e
%
s"
%
(
pkg
in
_path
,
name
))
rc
,
out
,
err
=
module
.
run_command
(
"
%
s info -g -e
%
s"
%
(
pkg
ng
_path
,
name
))
if
rc
==
0
:
if
rc
==
0
:
return
True
return
True
return
False
return
False
def
pkgng_older_than
(
module
,
pkgng_path
,
compare_version
):
rc
,
out
,
err
=
module
.
run_command
(
"
%
s -v"
%
pkgng_path
)
version
=
map
(
lambda
x
:
int
(
x
),
re
.
split
(
r'[\._]'
,
out
))
def
remove_packages
(
module
,
pkgin_path
,
packages
):
i
=
0
new_pkgng
=
True
while
compare_version
[
i
]
==
version
[
i
]:
i
+=
1
if
i
==
min
(
len
(
compare_version
),
len
(
version
)):
break
else
:
if
compare_version
[
i
]
>
version
[
i
]:
new_pkgng
=
False
return
not
new_pkgng
def
remove_packages
(
module
,
pkgng_path
,
packages
):
remove_c
=
0
remove_c
=
0
# Using a for loop incase of error, we can report the package that failed
# Using a for loop incase of error, we can report the package that failed
for
package
in
packages
:
for
package
in
packages
:
# Query the package first, to see if we even need to remove
# Query the package first, to see if we even need to remove
if
not
query_package
(
module
,
pkg
in
_path
,
package
):
if
not
query_package
(
module
,
pkg
ng
_path
,
package
):
continue
continue
if
not
module
.
check_mode
:
if
not
module
.
check_mode
:
rc
,
out
,
err
=
module
.
run_command
(
"
%
s delete -y
%
s"
%
(
pkg
in
_path
,
package
))
rc
,
out
,
err
=
module
.
run_command
(
"
%
s delete -y
%
s"
%
(
pkg
ng
_path
,
package
))
if
not
module
.
check_mode
and
query_package
(
module
,
pkg
in
_path
,
package
):
if
not
module
.
check_mode
and
query_package
(
module
,
pkg
ng
_path
,
package
):
module
.
fail_json
(
msg
=
"failed to remove
%
s:
%
s"
%
(
package
,
out
))
module
.
fail_json
(
msg
=
"failed to remove
%
s:
%
s"
%
(
package
,
out
))
remove_c
+=
1
remove_c
+=
1
if
remove_c
>
0
:
if
remove_c
>
0
:
module
.
exit_json
(
changed
=
True
,
msg
=
"removed
%
s package(s)"
%
remove_c
)
return
(
True
,
"removed
%
s package(s)"
%
remove_c
)
module
.
exit_json
(
changed
=
False
,
msg
=
"package(s) already absent"
)
return
(
False
,
"package(s) already absent"
)
def
install_packages
(
module
,
pkg
in
_path
,
packages
,
cached
,
pkgsite
):
def
install_packages
(
module
,
pkg
ng
_path
,
packages
,
cached
,
pkgsite
):
install_c
=
0
install_c
=
0
if
pkgsite
!=
""
:
# as of pkg-1.1.4, PACKAGESITE is deprecated in favor of repository definitions
pkgsite
=
"PACKAGESITE=
%
s"
%
(
pkgsite
)
# in /usr/local/etc/pkg/repos
old_pkgng
=
pkgng_older_than
(
module
,
pkgng_path
,
[
1
,
1
,
4
])
if
old_pkgng
and
(
pkgsite
!=
""
):
pkgsite
=
"PACKAGESITE=
%
s"
%
(
pkgsite
)
if
not
module
.
check_mode
and
cached
==
"no"
:
if
not
module
.
check_mode
and
cached
==
"no"
:
rc
,
out
,
err
=
module
.
run_command
(
"
%
s
%
s update"
%
(
pkgsite
,
pkgin_path
))
if
old_pkgng
:
rc
,
out
,
err
=
module
.
run_command
(
"
%
s
%
s update"
%
(
pkgsite
,
pkgng_path
))
else
:
rc
,
out
,
err
=
module
.
run_command
(
"
%
s update"
%
(
pkgng_path
))
if
rc
!=
0
:
if
rc
!=
0
:
module
.
fail_json
(
msg
=
"Could not update catalogue"
)
module
.
fail_json
(
msg
=
"Could not update catalogue"
)
for
package
in
packages
:
for
package
in
packages
:
if
query_package
(
module
,
pkg
in
_path
,
package
):
if
query_package
(
module
,
pkg
ng
_path
,
package
):
continue
continue
if
not
module
.
check_mode
:
if
not
module
.
check_mode
:
rc
,
out
,
err
=
module
.
run_command
(
"
%
s
%
s install -g -U -y
%
s"
%
(
pkgsite
,
pkgin_path
,
package
))
if
old_pkgng
:
rc
,
out
,
err
=
module
.
run_command
(
"
%
s
%
s install -g -U -y
%
s"
%
(
pkgsite
,
pkgng_path
,
package
))
else
:
rc
,
out
,
err
=
module
.
run_command
(
"
%
s install -r
%
s -g -U -y
%
s"
%
(
pkgng_path
,
pkgsite
,
package
))
if
not
module
.
check_mode
and
not
query_package
(
module
,
pkg
in
_path
,
package
):
if
not
module
.
check_mode
and
not
query_package
(
module
,
pkg
ng
_path
,
package
):
module
.
fail_json
(
msg
=
"failed to install
%
s:
%
s"
%
(
package
,
out
),
stderr
=
err
)
module
.
fail_json
(
msg
=
"failed to install
%
s:
%
s"
%
(
package
,
out
),
stderr
=
err
)
install_c
+=
1
install_c
+=
1
if
install_c
>
0
:
if
install_c
>
0
:
module
.
exit_json
(
changed
=
True
,
msg
=
"present
%
s package(s)"
%
(
install_c
))
return
(
True
,
"added
%
s package(s)"
%
(
install_c
))
module
.
exit_json
(
changed
=
False
,
msg
=
"package(s) already present"
)
return
(
False
,
"package(s) already present"
)
def
annotation_query
(
module
,
pkgng_path
,
package
,
tag
):
rc
,
out
,
err
=
module
.
run_command
(
"
%
s info -g -A
%
s"
%
(
pkgng_path
,
package
))
match
=
re
.
search
(
r'^\s*(?P<tag>
%
s)\s*:\s*(?P<value>\w+)'
%
tag
,
out
,
flags
=
re
.
MULTILINE
)
if
match
:
return
match
.
group
(
'value'
)
return
False
def
annotation_add
(
module
,
pkgng_path
,
package
,
tag
,
value
):
_value
=
annotation_query
(
module
,
pkgng_path
,
package
,
tag
)
if
not
_value
:
# Annotation does not exist, add it.
rc
,
out
,
err
=
module
.
run_command
(
'
%
s annotate -y -A
%
s
%
s "
%
s"'
%
(
pkgng_path
,
package
,
tag
,
value
))
if
rc
!=
0
:
module
.
fail_json
(
"could not annotate
%
s:
%
s"
%
(
package
,
out
),
stderr
=
err
)
return
True
elif
_value
!=
value
:
# Annotation exists, but value differs
module
.
fail_json
(
mgs
=
"failed to annotate
%
s, because
%
s is already set to
%
s, but should be set to
%
s"
%
(
package
,
tag
,
_value
,
value
))
return
False
else
:
# Annotation exists, nothing to do
return
False
def
annotation_delete
(
module
,
pkgng_path
,
package
,
tag
,
value
):
_value
=
annotation_query
(
module
,
pkgng_path
,
package
,
tag
)
if
_value
:
rc
,
out
,
err
=
module
.
run_command
(
'
%
s annotate -y -D
%
s
%
s'
%
(
pkgng_path
,
package
,
tag
))
if
rc
!=
0
:
module
.
fail_json
(
"could not delete annotation to
%
s:
%
s"
%
(
package
,
out
),
stderr
=
err
)
return
True
return
False
def
annotation_modify
(
module
,
pkgng_path
,
package
,
tag
,
value
):
_value
=
annotation_query
(
module
,
pkgng_path
,
package
,
tag
)
if
not
value
:
# No such tag
module
.
fail_json
(
"could not change annotation to
%
s: tag
%
s does not exist"
%
(
package
,
tag
))
elif
_value
==
value
:
# No change in value
return
False
else
:
rc
,
out
,
err
=
module
.
run_command
(
'
%
s annotate -y -M
%
s
%
s "
%
s"'
%
(
pkgng_path
,
package
,
tag
,
value
))
if
rc
!=
0
:
module
.
fail_json
(
"could not change annotation annotation to
%
s:
%
s"
%
(
package
,
out
),
stderr
=
err
)
return
True
def
annotate_packages
(
module
,
pkgng_path
,
packages
,
annotation
):
annotate_c
=
0
annotations
=
map
(
lambda
_annotation
:
re
.
match
(
r'(?P<operation>[\+-:])(?P<tag>\w+)(=(?P<value>\w+))?'
,
_annotation
)
.
groupdict
(),
re
.
split
(
r','
,
annotation
))
operation
=
{
'+'
:
annotation_add
,
'-'
:
annotation_delete
,
':'
:
annotation_modify
}
for
package
in
packages
:
for
_annotation
in
annotations
:
annotate_c
+=
(
1
if
operation
[
_annotation
[
'operation'
]](
module
,
pkgng_path
,
package
,
_annotation
[
'tag'
],
_annotation
[
'value'
])
else
0
)
if
annotate_c
>
0
:
return
(
True
,
"added
%
s annotations."
%
annotate_c
)
return
(
False
,
"changed no annotations"
)
def
main
():
def
main
():
module
=
AnsibleModule
(
module
=
AnsibleModule
(
argument_spec
=
dict
(
argument_spec
=
dict
(
state
=
dict
(
default
=
"present"
,
choices
=
[
"present"
,
"absent"
]),
state
=
dict
(
default
=
"present"
,
choices
=
[
"present"
,
"absent"
]
,
required
=
False
),
name
=
dict
(
aliases
=
[
"pkg"
],
required
=
True
),
name
=
dict
(
aliases
=
[
"pkg"
],
required
=
True
),
cached
=
dict
(
default
=
False
,
type
=
'bool'
),
cached
=
dict
(
default
=
False
,
type
=
'bool'
),
annotation
=
dict
(
default
=
""
,
required
=
False
),
pkgsite
=
dict
(
default
=
""
,
required
=
False
)),
pkgsite
=
dict
(
default
=
""
,
required
=
False
)),
supports_check_mode
=
True
)
supports_check_mode
=
True
)
pkg
in
_path
=
module
.
get_bin_path
(
'pkg'
,
True
)
pkg
ng
_path
=
module
.
get_bin_path
(
'pkg'
,
True
)
p
=
module
.
params
p
=
module
.
params
pkgs
=
p
[
"name"
]
.
split
(
","
)
pkgs
=
p
[
"name"
]
.
split
(
","
)
changed
=
False
msgs
=
[]
if
p
[
"state"
]
==
"present"
:
if
p
[
"state"
]
==
"present"
:
install_packages
(
module
,
pkgin_path
,
pkgs
,
p
[
"cached"
],
p
[
"pkgsite"
])
_changed
,
_msg
=
install_packages
(
module
,
pkgng_path
,
pkgs
,
p
[
"cached"
],
p
[
"pkgsite"
])
changed
=
changed
or
_changed
msgs
.
append
(
_msg
)
elif
p
[
"state"
]
==
"absent"
:
elif
p
[
"state"
]
==
"absent"
:
remove_packages
(
module
,
pkgin_path
,
pkgs
)
_changed
,
_msg
=
remove_packages
(
module
,
pkgng_path
,
pkgs
)
changed
=
changed
or
_changed
msgs
.
append
(
_msg
)
if
p
[
"annotation"
]:
_changed
,
_msg
=
annotate_packages
(
module
,
pkgng_path
,
pkgs
,
p
[
"annotation"
])
changed
=
changed
or
_changed
msgs
.
append
(
_msg
)
module
.
exit_json
(
changed
=
changed
,
msg
=
", "
.
join
(
msgs
))
# import module snippets
# import module snippets
from
ansible.module_utils.basic
import
*
from
ansible.module_utils.basic
import
*
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment