1386 lines
29 KiB
Bash
Executable file
1386 lines
29 KiB
Bash
Executable file
#!/bin/sh
|
|
set -e
|
|
|
|
TESTDIR="$(readlink -f "$(dirname "$0")")"
|
|
. "$TESTDIR/framework"
|
|
|
|
getoriginfromsuite() { echo 'Oranges'; }
|
|
getlabelfromsuite() { echo 'Lemons'; }
|
|
getversionfromsuite() { echo 'Volkamer'; }
|
|
|
|
setupenvironment
|
|
configarchitecture "i386"
|
|
|
|
DESCR='Some description that has a unusual word xxyyzz and aabbcc and a UPPERCASE'
|
|
DESCR2='Some other description with the unusual aabbcc only'
|
|
insertpackage 'unstable' 'foo' 'all' '1.0' '' '' "$DESCR
|
|
Long description of stuff and such, with lines
|
|
.
|
|
and paragraphs and everything."
|
|
insertpackage 'testing' 'bar' 'i386' '2.0' '' '' "$DESCR2"
|
|
insertpackage 'testing' 'upgrade' 'i386' '2.0'
|
|
insertinstalledpackage 'upgrade' 'i386' '1.0'
|
|
|
|
setupaptarchive
|
|
|
|
APTARCHIVE="$(readlink -f ./aptarchive)"
|
|
export TEST_HOOK_VERSION=0.2
|
|
|
|
cat >> json-hook.sh << EOF
|
|
#!/bin/bash
|
|
trap '' SIGPIPE
|
|
clean_json() {
|
|
jq 'del (.params.options[]? | select(.name != "APT::Architecture"))'
|
|
}
|
|
while true; do
|
|
read request <&\$APT_HOOK_SOCKET || exit 1
|
|
|
|
if echo "\$request" 2>/dev/null | grep -q ".hello"; then
|
|
echo "HOOK: HELLO"
|
|
fi
|
|
|
|
if echo "\$request" 2>/dev/null | grep -q ".bye"; then
|
|
echo "HOOK: BYE"
|
|
exit 0;
|
|
fi
|
|
|
|
request="\$(printf "%s" "\$request" | clean_json)"
|
|
echo "HOOK: request \$request"
|
|
|
|
read empty <&\$APT_HOOK_SOCKET || exit 1
|
|
|
|
echo HOOK: empty \$empty
|
|
|
|
if echo "\$request" 2>/dev/null | grep -q ".hello"; then
|
|
printf '{"jsonrpc": "2.0", "result": {"version": "'\$TEST_HOOK_VERSION'"}, "id": 0}\n\n' >&\$APT_HOOK_SOCKET 2>/dev/null || exit 1
|
|
fi
|
|
|
|
|
|
done
|
|
EOF
|
|
|
|
chmod +x json-hook.sh
|
|
|
|
HOOK="$(readlink -f ./json-hook.sh)"
|
|
|
|
# Setup all hooks
|
|
cat >> rootdir/etc/apt/apt.conf.d/99-json-hooks << EOF
|
|
AptCli::Hooks::Install:: "$HOOK";
|
|
AptCli::Hooks::Upgrade:: "$HOOK";
|
|
AptCli::Hooks::Search:: "$HOOK";
|
|
EOF
|
|
|
|
|
|
############################# Success search #######################
|
|
testsuccessequal 'HOOK: HELLO
|
|
HOOK: request {
|
|
"jsonrpc": "2.0",
|
|
"method": "org.debian.apt.hooks.hello",
|
|
"id": 0,
|
|
"params": {
|
|
"versions": [
|
|
"0.1",
|
|
"0.2"
|
|
],
|
|
"options": [
|
|
{
|
|
"name": "APT::Architecture",
|
|
"value": "i386"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
HOOK: empty
|
|
HOOK: request {
|
|
"jsonrpc": "2.0",
|
|
"method": "org.debian.apt.hooks.search.pre",
|
|
"params": {
|
|
"command": "search",
|
|
"search-terms": [
|
|
"foo"
|
|
],
|
|
"unknown-packages": [],
|
|
"packages": []
|
|
}
|
|
}
|
|
HOOK: empty
|
|
HOOK: BYE
|
|
Sorting...
|
|
Full Text Search...
|
|
foo/unstable 1.0 all
|
|
Some description that has a unusual word xxyyzz and aabbcc and a UPPERCASE
|
|
|
|
HOOK: HELLO
|
|
HOOK: request {
|
|
"jsonrpc": "2.0",
|
|
"method": "org.debian.apt.hooks.hello",
|
|
"id": 0,
|
|
"params": {
|
|
"versions": [
|
|
"0.1",
|
|
"0.2"
|
|
],
|
|
"options": [
|
|
{
|
|
"name": "APT::Architecture",
|
|
"value": "i386"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
HOOK: empty
|
|
HOOK: request {
|
|
"jsonrpc": "2.0",
|
|
"method": "org.debian.apt.hooks.search.post",
|
|
"params": {
|
|
"command": "search",
|
|
"search-terms": [
|
|
"foo"
|
|
],
|
|
"unknown-packages": [],
|
|
"packages": []
|
|
}
|
|
}
|
|
HOOK: empty
|
|
HOOK: BYE' apt search foo
|
|
|
|
############################# Failed search #######################
|
|
testsuccessequal 'HOOK: HELLO
|
|
HOOK: request {
|
|
"jsonrpc": "2.0",
|
|
"method": "org.debian.apt.hooks.hello",
|
|
"id": 0,
|
|
"params": {
|
|
"versions": [
|
|
"0.1",
|
|
"0.2"
|
|
],
|
|
"options": [
|
|
{
|
|
"name": "APT::Architecture",
|
|
"value": "i386"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
HOOK: empty
|
|
HOOK: request {
|
|
"jsonrpc": "2.0",
|
|
"method": "org.debian.apt.hooks.search.pre",
|
|
"params": {
|
|
"command": "search",
|
|
"search-terms": [
|
|
"foox"
|
|
],
|
|
"unknown-packages": [],
|
|
"packages": []
|
|
}
|
|
}
|
|
HOOK: empty
|
|
HOOK: BYE
|
|
Sorting...
|
|
Full Text Search...
|
|
HOOK: HELLO
|
|
HOOK: request {
|
|
"jsonrpc": "2.0",
|
|
"method": "org.debian.apt.hooks.hello",
|
|
"id": 0,
|
|
"params": {
|
|
"versions": [
|
|
"0.1",
|
|
"0.2"
|
|
],
|
|
"options": [
|
|
{
|
|
"name": "APT::Architecture",
|
|
"value": "i386"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
HOOK: empty
|
|
HOOK: request {
|
|
"jsonrpc": "2.0",
|
|
"method": "org.debian.apt.hooks.search.fail",
|
|
"params": {
|
|
"command": "search",
|
|
"search-terms": [
|
|
"foox"
|
|
],
|
|
"unknown-packages": [],
|
|
"packages": []
|
|
}
|
|
}
|
|
HOOK: empty
|
|
HOOK: BYE' apt search foox
|
|
|
|
|
|
############################# Failed install #######################
|
|
|
|
testfailureequal 'Reading package lists...
|
|
Building dependency tree...
|
|
HOOK: HELLO
|
|
HOOK: request {
|
|
"jsonrpc": "2.0",
|
|
"method": "org.debian.apt.hooks.hello",
|
|
"id": 0,
|
|
"params": {
|
|
"versions": [
|
|
"0.1",
|
|
"0.2"
|
|
],
|
|
"options": [
|
|
{
|
|
"name": "APT::Architecture",
|
|
"value": "i386"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
HOOK: empty
|
|
HOOK: request {
|
|
"jsonrpc": "2.0",
|
|
"method": "org.debian.apt.hooks.install.fail",
|
|
"params": {
|
|
"command": "install",
|
|
"search-terms": [
|
|
"foxxx"
|
|
],
|
|
"unknown-packages": [
|
|
"foxxx"
|
|
],
|
|
"packages": []
|
|
}
|
|
}
|
|
HOOK: empty
|
|
HOOK: BYE
|
|
E: Unable to locate package foxxx' apt install foxxx
|
|
|
|
############################# Success install #######################
|
|
|
|
testsuccessequal 'Reading package lists...
|
|
Building dependency tree...
|
|
HOOK: HELLO
|
|
HOOK: request {
|
|
"jsonrpc": "2.0",
|
|
"method": "org.debian.apt.hooks.hello",
|
|
"id": 0,
|
|
"params": {
|
|
"versions": [
|
|
"0.1",
|
|
"0.2"
|
|
],
|
|
"options": [
|
|
{
|
|
"name": "APT::Architecture",
|
|
"value": "i386"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
HOOK: empty
|
|
HOOK: request {
|
|
"jsonrpc": "2.0",
|
|
"method": "org.debian.apt.hooks.install.pre-prompt",
|
|
"params": {
|
|
"command": "install",
|
|
"search-terms": [
|
|
"foo"
|
|
],
|
|
"unknown-packages": [],
|
|
"packages": [
|
|
{
|
|
"id": 2,
|
|
"name": "foo",
|
|
"architecture": "i386",
|
|
"mode": "install",
|
|
"automatic": false,
|
|
"versions": {
|
|
"candidate": {
|
|
"id": 2,
|
|
"version": "1.0",
|
|
"architecture": "all",
|
|
"pin": 500,
|
|
"origins": [
|
|
{
|
|
"archive": "unstable",
|
|
"codename": "sid",
|
|
"origin": "Oranges",
|
|
"label": "Lemons",
|
|
"site": ""
|
|
}
|
|
]
|
|
},
|
|
"install": {
|
|
"id": 2,
|
|
"version": "1.0",
|
|
"architecture": "all",
|
|
"pin": 500,
|
|
"origins": [
|
|
{
|
|
"archive": "unstable",
|
|
"codename": "sid",
|
|
"origin": "Oranges",
|
|
"label": "Lemons",
|
|
"site": ""
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
HOOK: empty
|
|
HOOK: BYE
|
|
The following NEW packages will be installed:
|
|
foo
|
|
HOOK: HELLO
|
|
HOOK: request {
|
|
"jsonrpc": "2.0",
|
|
"method": "org.debian.apt.hooks.hello",
|
|
"id": 0,
|
|
"params": {
|
|
"versions": [
|
|
"0.1",
|
|
"0.2"
|
|
],
|
|
"options": [
|
|
{
|
|
"name": "APT::Architecture",
|
|
"value": "i386"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
HOOK: empty
|
|
HOOK: request {
|
|
"jsonrpc": "2.0",
|
|
"method": "org.debian.apt.hooks.install.package-list",
|
|
"params": {
|
|
"command": "install",
|
|
"search-terms": [
|
|
"foo"
|
|
],
|
|
"unknown-packages": [],
|
|
"packages": [
|
|
{
|
|
"id": 2,
|
|
"name": "foo",
|
|
"architecture": "i386",
|
|
"mode": "install",
|
|
"automatic": false,
|
|
"versions": {
|
|
"candidate": {
|
|
"id": 2,
|
|
"version": "1.0",
|
|
"architecture": "all",
|
|
"pin": 500,
|
|
"origins": [
|
|
{
|
|
"archive": "unstable",
|
|
"codename": "sid",
|
|
"origin": "Oranges",
|
|
"label": "Lemons",
|
|
"site": ""
|
|
}
|
|
]
|
|
},
|
|
"install": {
|
|
"id": 2,
|
|
"version": "1.0",
|
|
"architecture": "all",
|
|
"pin": 500,
|
|
"origins": [
|
|
{
|
|
"archive": "unstable",
|
|
"codename": "sid",
|
|
"origin": "Oranges",
|
|
"label": "Lemons",
|
|
"site": ""
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
HOOK: empty
|
|
HOOK: BYE
|
|
0 upgraded, 1 newly installed, 0 to remove and 1 not upgraded.
|
|
HOOK: HELLO
|
|
HOOK: request {
|
|
"jsonrpc": "2.0",
|
|
"method": "org.debian.apt.hooks.hello",
|
|
"id": 0,
|
|
"params": {
|
|
"versions": [
|
|
"0.1",
|
|
"0.2"
|
|
],
|
|
"options": [
|
|
{
|
|
"name": "APT::Architecture",
|
|
"value": "i386"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
HOOK: empty
|
|
HOOK: request {
|
|
"jsonrpc": "2.0",
|
|
"method": "org.debian.apt.hooks.install.statistics",
|
|
"params": {
|
|
"command": "install",
|
|
"search-terms": [
|
|
"foo"
|
|
],
|
|
"unknown-packages": [],
|
|
"packages": [
|
|
{
|
|
"id": 2,
|
|
"name": "foo",
|
|
"architecture": "i386",
|
|
"mode": "install",
|
|
"automatic": false,
|
|
"versions": {
|
|
"candidate": {
|
|
"id": 2,
|
|
"version": "1.0",
|
|
"architecture": "all",
|
|
"pin": 500,
|
|
"origins": [
|
|
{
|
|
"archive": "unstable",
|
|
"codename": "sid",
|
|
"origin": "Oranges",
|
|
"label": "Lemons",
|
|
"site": ""
|
|
}
|
|
]
|
|
},
|
|
"install": {
|
|
"id": 2,
|
|
"version": "1.0",
|
|
"architecture": "all",
|
|
"pin": 500,
|
|
"origins": [
|
|
{
|
|
"archive": "unstable",
|
|
"codename": "sid",
|
|
"origin": "Oranges",
|
|
"label": "Lemons",
|
|
"site": ""
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
HOOK: empty
|
|
HOOK: BYE
|
|
Inst foo (1.0 Lemons:unstable [all])
|
|
Conf foo (1.0 Lemons:unstable [all])
|
|
HOOK: HELLO
|
|
HOOK: request {
|
|
"jsonrpc": "2.0",
|
|
"method": "org.debian.apt.hooks.hello",
|
|
"id": 0,
|
|
"params": {
|
|
"versions": [
|
|
"0.1",
|
|
"0.2"
|
|
],
|
|
"options": [
|
|
{
|
|
"name": "APT::Architecture",
|
|
"value": "i386"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
HOOK: empty
|
|
HOOK: request {
|
|
"jsonrpc": "2.0",
|
|
"method": "org.debian.apt.hooks.install.post",
|
|
"params": {
|
|
"command": "install",
|
|
"search-terms": [
|
|
"foo"
|
|
],
|
|
"unknown-packages": [],
|
|
"packages": [
|
|
{
|
|
"id": 2,
|
|
"name": "foo",
|
|
"architecture": "i386",
|
|
"mode": "install",
|
|
"automatic": false,
|
|
"versions": {
|
|
"candidate": {
|
|
"id": 2,
|
|
"version": "1.0",
|
|
"architecture": "all",
|
|
"pin": 500,
|
|
"origins": [
|
|
{
|
|
"archive": "unstable",
|
|
"codename": "sid",
|
|
"origin": "Oranges",
|
|
"label": "Lemons",
|
|
"site": ""
|
|
}
|
|
]
|
|
},
|
|
"install": {
|
|
"id": 2,
|
|
"version": "1.0",
|
|
"architecture": "all",
|
|
"pin": 500,
|
|
"origins": [
|
|
{
|
|
"archive": "unstable",
|
|
"codename": "sid",
|
|
"origin": "Oranges",
|
|
"label": "Lemons",
|
|
"site": ""
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
HOOK: empty
|
|
HOOK: BYE' apt install foo -s
|
|
|
|
############################# Failed dist-upgrade #######################
|
|
|
|
testfailureequal 'Reading package lists...
|
|
Building dependency tree...
|
|
HOOK: HELLO
|
|
HOOK: request {
|
|
"jsonrpc": "2.0",
|
|
"method": "org.debian.apt.hooks.hello",
|
|
"id": 0,
|
|
"params": {
|
|
"versions": [
|
|
"0.1",
|
|
"0.2"
|
|
],
|
|
"options": [
|
|
{
|
|
"name": "APT::Architecture",
|
|
"value": "i386"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
HOOK: empty
|
|
HOOK: request {
|
|
"jsonrpc": "2.0",
|
|
"method": "org.debian.apt.hooks.install.fail",
|
|
"params": {
|
|
"command": "dist-upgrade",
|
|
"search-terms": [
|
|
"foxxx"
|
|
],
|
|
"unknown-packages": [
|
|
"foxxx"
|
|
],
|
|
"packages": []
|
|
}
|
|
}
|
|
HOOK: empty
|
|
HOOK: BYE
|
|
E: Unable to locate package foxxx' apt dist-upgrade foxxx
|
|
|
|
############################# Success install #######################
|
|
|
|
testsuccessequal 'Reading package lists...
|
|
Building dependency tree...
|
|
Calculating upgrade...
|
|
HOOK: HELLO
|
|
HOOK: request {
|
|
"jsonrpc": "2.0",
|
|
"method": "org.debian.apt.hooks.hello",
|
|
"id": 0,
|
|
"params": {
|
|
"versions": [
|
|
"0.1",
|
|
"0.2"
|
|
],
|
|
"options": [
|
|
{
|
|
"name": "APT::Architecture",
|
|
"value": "i386"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
HOOK: empty
|
|
HOOK: request {
|
|
"jsonrpc": "2.0",
|
|
"method": "org.debian.apt.hooks.install.pre-prompt",
|
|
"params": {
|
|
"command": "dist-upgrade",
|
|
"search-terms": [],
|
|
"unknown-packages": [],
|
|
"packages": [
|
|
{
|
|
"id": 1,
|
|
"name": "upgrade",
|
|
"architecture": "i386",
|
|
"mode": "upgrade",
|
|
"automatic": false,
|
|
"versions": {
|
|
"candidate": {
|
|
"id": 1,
|
|
"version": "2.0",
|
|
"architecture": "i386",
|
|
"pin": 500,
|
|
"origins": [
|
|
{
|
|
"archive": "testing",
|
|
"codename": "testing",
|
|
"origin": "Oranges",
|
|
"label": "Lemons",
|
|
"site": ""
|
|
}
|
|
]
|
|
},
|
|
"install": {
|
|
"id": 1,
|
|
"version": "2.0",
|
|
"architecture": "i386",
|
|
"pin": 500,
|
|
"origins": [
|
|
{
|
|
"archive": "testing",
|
|
"codename": "testing",
|
|
"origin": "Oranges",
|
|
"label": "Lemons",
|
|
"site": ""
|
|
}
|
|
]
|
|
},
|
|
"current": {
|
|
"id": 3,
|
|
"version": "1.0",
|
|
"architecture": "i386",
|
|
"pin": 100,
|
|
"origins": []
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
HOOK: empty
|
|
HOOK: BYE
|
|
The following packages will be upgraded:
|
|
upgrade
|
|
HOOK: HELLO
|
|
HOOK: request {
|
|
"jsonrpc": "2.0",
|
|
"method": "org.debian.apt.hooks.hello",
|
|
"id": 0,
|
|
"params": {
|
|
"versions": [
|
|
"0.1",
|
|
"0.2"
|
|
],
|
|
"options": [
|
|
{
|
|
"name": "APT::Architecture",
|
|
"value": "i386"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
HOOK: empty
|
|
HOOK: request {
|
|
"jsonrpc": "2.0",
|
|
"method": "org.debian.apt.hooks.install.package-list",
|
|
"params": {
|
|
"command": "dist-upgrade",
|
|
"search-terms": [],
|
|
"unknown-packages": [],
|
|
"packages": [
|
|
{
|
|
"id": 1,
|
|
"name": "upgrade",
|
|
"architecture": "i386",
|
|
"mode": "upgrade",
|
|
"automatic": false,
|
|
"versions": {
|
|
"candidate": {
|
|
"id": 1,
|
|
"version": "2.0",
|
|
"architecture": "i386",
|
|
"pin": 500,
|
|
"origins": [
|
|
{
|
|
"archive": "testing",
|
|
"codename": "testing",
|
|
"origin": "Oranges",
|
|
"label": "Lemons",
|
|
"site": ""
|
|
}
|
|
]
|
|
},
|
|
"install": {
|
|
"id": 1,
|
|
"version": "2.0",
|
|
"architecture": "i386",
|
|
"pin": 500,
|
|
"origins": [
|
|
{
|
|
"archive": "testing",
|
|
"codename": "testing",
|
|
"origin": "Oranges",
|
|
"label": "Lemons",
|
|
"site": ""
|
|
}
|
|
]
|
|
},
|
|
"current": {
|
|
"id": 3,
|
|
"version": "1.0",
|
|
"architecture": "i386",
|
|
"pin": 100,
|
|
"origins": []
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
HOOK: empty
|
|
HOOK: BYE
|
|
1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
|
|
HOOK: HELLO
|
|
HOOK: request {
|
|
"jsonrpc": "2.0",
|
|
"method": "org.debian.apt.hooks.hello",
|
|
"id": 0,
|
|
"params": {
|
|
"versions": [
|
|
"0.1",
|
|
"0.2"
|
|
],
|
|
"options": [
|
|
{
|
|
"name": "APT::Architecture",
|
|
"value": "i386"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
HOOK: empty
|
|
HOOK: request {
|
|
"jsonrpc": "2.0",
|
|
"method": "org.debian.apt.hooks.install.statistics",
|
|
"params": {
|
|
"command": "dist-upgrade",
|
|
"search-terms": [],
|
|
"unknown-packages": [],
|
|
"packages": [
|
|
{
|
|
"id": 1,
|
|
"name": "upgrade",
|
|
"architecture": "i386",
|
|
"mode": "upgrade",
|
|
"automatic": false,
|
|
"versions": {
|
|
"candidate": {
|
|
"id": 1,
|
|
"version": "2.0",
|
|
"architecture": "i386",
|
|
"pin": 500,
|
|
"origins": [
|
|
{
|
|
"archive": "testing",
|
|
"codename": "testing",
|
|
"origin": "Oranges",
|
|
"label": "Lemons",
|
|
"site": ""
|
|
}
|
|
]
|
|
},
|
|
"install": {
|
|
"id": 1,
|
|
"version": "2.0",
|
|
"architecture": "i386",
|
|
"pin": 500,
|
|
"origins": [
|
|
{
|
|
"archive": "testing",
|
|
"codename": "testing",
|
|
"origin": "Oranges",
|
|
"label": "Lemons",
|
|
"site": ""
|
|
}
|
|
]
|
|
},
|
|
"current": {
|
|
"id": 3,
|
|
"version": "1.0",
|
|
"architecture": "i386",
|
|
"pin": 100,
|
|
"origins": []
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
HOOK: empty
|
|
HOOK: BYE
|
|
Inst upgrade [1.0] (2.0 Lemons:testing [i386])
|
|
Conf upgrade (2.0 Lemons:testing [i386])
|
|
HOOK: HELLO
|
|
HOOK: request {
|
|
"jsonrpc": "2.0",
|
|
"method": "org.debian.apt.hooks.hello",
|
|
"id": 0,
|
|
"params": {
|
|
"versions": [
|
|
"0.1",
|
|
"0.2"
|
|
],
|
|
"options": [
|
|
{
|
|
"name": "APT::Architecture",
|
|
"value": "i386"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
HOOK: empty
|
|
HOOK: request {
|
|
"jsonrpc": "2.0",
|
|
"method": "org.debian.apt.hooks.install.post",
|
|
"params": {
|
|
"command": "dist-upgrade",
|
|
"search-terms": [],
|
|
"unknown-packages": [],
|
|
"packages": [
|
|
{
|
|
"id": 1,
|
|
"name": "upgrade",
|
|
"architecture": "i386",
|
|
"mode": "upgrade",
|
|
"automatic": false,
|
|
"versions": {
|
|
"candidate": {
|
|
"id": 1,
|
|
"version": "2.0",
|
|
"architecture": "i386",
|
|
"pin": 500,
|
|
"origins": [
|
|
{
|
|
"archive": "testing",
|
|
"codename": "testing",
|
|
"origin": "Oranges",
|
|
"label": "Lemons",
|
|
"site": ""
|
|
}
|
|
]
|
|
},
|
|
"install": {
|
|
"id": 1,
|
|
"version": "2.0",
|
|
"architecture": "i386",
|
|
"pin": 500,
|
|
"origins": [
|
|
{
|
|
"archive": "testing",
|
|
"codename": "testing",
|
|
"origin": "Oranges",
|
|
"label": "Lemons",
|
|
"site": ""
|
|
}
|
|
]
|
|
},
|
|
"current": {
|
|
"id": 3,
|
|
"version": "1.0",
|
|
"architecture": "i386",
|
|
"pin": 100,
|
|
"origins": []
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
HOOK: empty
|
|
HOOK: BYE' apt dist-upgrade -s
|
|
|
|
|
|
################## version 0.1 #########################
|
|
TEST_HOOK_VERSION=0.1
|
|
|
|
testsuccessequal 'Reading package lists...
|
|
Building dependency tree...
|
|
Calculating upgrade...
|
|
HOOK: HELLO
|
|
HOOK: request {
|
|
"jsonrpc": "2.0",
|
|
"method": "org.debian.apt.hooks.hello",
|
|
"id": 0,
|
|
"params": {
|
|
"versions": [
|
|
"0.1",
|
|
"0.2"
|
|
],
|
|
"options": [
|
|
{
|
|
"name": "APT::Architecture",
|
|
"value": "i386"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
HOOK: empty
|
|
HOOK: request {
|
|
"jsonrpc": "2.0",
|
|
"method": "org.debian.apt.hooks.install.pre-prompt",
|
|
"params": {
|
|
"command": "dist-upgrade",
|
|
"search-terms": [],
|
|
"unknown-packages": [],
|
|
"packages": [
|
|
{
|
|
"id": 1,
|
|
"name": "upgrade",
|
|
"architecture": "i386",
|
|
"mode": "install",
|
|
"automatic": false,
|
|
"versions": {
|
|
"candidate": {
|
|
"id": 1,
|
|
"version": "2.0",
|
|
"architecture": "i386",
|
|
"pin": 500,
|
|
"origins": [
|
|
{
|
|
"archive": "testing",
|
|
"codename": "testing",
|
|
"origin": "Oranges",
|
|
"label": "Lemons",
|
|
"site": ""
|
|
}
|
|
]
|
|
},
|
|
"install": {
|
|
"id": 1,
|
|
"version": "2.0",
|
|
"architecture": "i386",
|
|
"pin": 500,
|
|
"origins": [
|
|
{
|
|
"archive": "testing",
|
|
"codename": "testing",
|
|
"origin": "Oranges",
|
|
"label": "Lemons",
|
|
"site": ""
|
|
}
|
|
]
|
|
},
|
|
"current": {
|
|
"id": 3,
|
|
"version": "1.0",
|
|
"architecture": "i386",
|
|
"pin": 100,
|
|
"origins": []
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
HOOK: empty
|
|
HOOK: BYE
|
|
The following packages will be upgraded:
|
|
upgrade
|
|
HOOK: HELLO
|
|
HOOK: request {
|
|
"jsonrpc": "2.0",
|
|
"method": "org.debian.apt.hooks.hello",
|
|
"id": 0,
|
|
"params": {
|
|
"versions": [
|
|
"0.1",
|
|
"0.2"
|
|
],
|
|
"options": [
|
|
{
|
|
"name": "APT::Architecture",
|
|
"value": "i386"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
HOOK: empty
|
|
HOOK: request {
|
|
"jsonrpc": "2.0",
|
|
"method": "org.debian.apt.hooks.install.package-list",
|
|
"params": {
|
|
"command": "dist-upgrade",
|
|
"search-terms": [],
|
|
"unknown-packages": [],
|
|
"packages": [
|
|
{
|
|
"id": 1,
|
|
"name": "upgrade",
|
|
"architecture": "i386",
|
|
"mode": "install",
|
|
"automatic": false,
|
|
"versions": {
|
|
"candidate": {
|
|
"id": 1,
|
|
"version": "2.0",
|
|
"architecture": "i386",
|
|
"pin": 500,
|
|
"origins": [
|
|
{
|
|
"archive": "testing",
|
|
"codename": "testing",
|
|
"origin": "Oranges",
|
|
"label": "Lemons",
|
|
"site": ""
|
|
}
|
|
]
|
|
},
|
|
"install": {
|
|
"id": 1,
|
|
"version": "2.0",
|
|
"architecture": "i386",
|
|
"pin": 500,
|
|
"origins": [
|
|
{
|
|
"archive": "testing",
|
|
"codename": "testing",
|
|
"origin": "Oranges",
|
|
"label": "Lemons",
|
|
"site": ""
|
|
}
|
|
]
|
|
},
|
|
"current": {
|
|
"id": 3,
|
|
"version": "1.0",
|
|
"architecture": "i386",
|
|
"pin": 100,
|
|
"origins": []
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
HOOK: empty
|
|
HOOK: BYE
|
|
1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
|
|
HOOK: HELLO
|
|
HOOK: request {
|
|
"jsonrpc": "2.0",
|
|
"method": "org.debian.apt.hooks.hello",
|
|
"id": 0,
|
|
"params": {
|
|
"versions": [
|
|
"0.1",
|
|
"0.2"
|
|
],
|
|
"options": [
|
|
{
|
|
"name": "APT::Architecture",
|
|
"value": "i386"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
HOOK: empty
|
|
HOOK: request {
|
|
"jsonrpc": "2.0",
|
|
"method": "org.debian.apt.hooks.install.statistics",
|
|
"params": {
|
|
"command": "dist-upgrade",
|
|
"search-terms": [],
|
|
"unknown-packages": [],
|
|
"packages": [
|
|
{
|
|
"id": 1,
|
|
"name": "upgrade",
|
|
"architecture": "i386",
|
|
"mode": "install",
|
|
"automatic": false,
|
|
"versions": {
|
|
"candidate": {
|
|
"id": 1,
|
|
"version": "2.0",
|
|
"architecture": "i386",
|
|
"pin": 500,
|
|
"origins": [
|
|
{
|
|
"archive": "testing",
|
|
"codename": "testing",
|
|
"origin": "Oranges",
|
|
"label": "Lemons",
|
|
"site": ""
|
|
}
|
|
]
|
|
},
|
|
"install": {
|
|
"id": 1,
|
|
"version": "2.0",
|
|
"architecture": "i386",
|
|
"pin": 500,
|
|
"origins": [
|
|
{
|
|
"archive": "testing",
|
|
"codename": "testing",
|
|
"origin": "Oranges",
|
|
"label": "Lemons",
|
|
"site": ""
|
|
}
|
|
]
|
|
},
|
|
"current": {
|
|
"id": 3,
|
|
"version": "1.0",
|
|
"architecture": "i386",
|
|
"pin": 100,
|
|
"origins": []
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
HOOK: empty
|
|
HOOK: BYE
|
|
Inst upgrade [1.0] (2.0 Lemons:testing [i386])
|
|
Conf upgrade (2.0 Lemons:testing [i386])
|
|
HOOK: HELLO
|
|
HOOK: request {
|
|
"jsonrpc": "2.0",
|
|
"method": "org.debian.apt.hooks.hello",
|
|
"id": 0,
|
|
"params": {
|
|
"versions": [
|
|
"0.1",
|
|
"0.2"
|
|
],
|
|
"options": [
|
|
{
|
|
"name": "APT::Architecture",
|
|
"value": "i386"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
HOOK: empty
|
|
HOOK: request {
|
|
"jsonrpc": "2.0",
|
|
"method": "org.debian.apt.hooks.install.post",
|
|
"params": {
|
|
"command": "dist-upgrade",
|
|
"search-terms": [],
|
|
"unknown-packages": [],
|
|
"packages": [
|
|
{
|
|
"id": 1,
|
|
"name": "upgrade",
|
|
"architecture": "i386",
|
|
"mode": "install",
|
|
"automatic": false,
|
|
"versions": {
|
|
"candidate": {
|
|
"id": 1,
|
|
"version": "2.0",
|
|
"architecture": "i386",
|
|
"pin": 500,
|
|
"origins": [
|
|
{
|
|
"archive": "testing",
|
|
"codename": "testing",
|
|
"origin": "Oranges",
|
|
"label": "Lemons",
|
|
"site": ""
|
|
}
|
|
]
|
|
},
|
|
"install": {
|
|
"id": 1,
|
|
"version": "2.0",
|
|
"architecture": "i386",
|
|
"pin": 500,
|
|
"origins": [
|
|
{
|
|
"archive": "testing",
|
|
"codename": "testing",
|
|
"origin": "Oranges",
|
|
"label": "Lemons",
|
|
"site": ""
|
|
}
|
|
]
|
|
},
|
|
"current": {
|
|
"id": 3,
|
|
"version": "1.0",
|
|
"architecture": "i386",
|
|
"pin": 100,
|
|
"origins": []
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
HOOK: empty
|
|
HOOK: BYE' apt dist-upgrade -s
|
|
|
|
|
|
################## Wrong version #########################
|
|
TEST_HOOK_VERSION=42
|
|
|
|
testfailureequal 'Reading package lists...
|
|
Building dependency tree...
|
|
Calculating upgrade...
|
|
HOOK: HELLO
|
|
HOOK: request {
|
|
"jsonrpc": "2.0",
|
|
"method": "org.debian.apt.hooks.hello",
|
|
"id": 0,
|
|
"params": {
|
|
"versions": [
|
|
"0.1",
|
|
"0.2"
|
|
],
|
|
"options": [
|
|
{
|
|
"name": "APT::Architecture",
|
|
"value": "i386"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
HOOK: empty
|
|
HOOK: HELLO
|
|
HOOK: request {
|
|
"jsonrpc": "2.0",
|
|
"method": "org.debian.apt.hooks.hello",
|
|
"id": 0,
|
|
"params": {
|
|
"versions": [
|
|
"0.1",
|
|
"0.2"
|
|
],
|
|
"options": [
|
|
{
|
|
"name": "APT::Architecture",
|
|
"value": "i386"
|
|
}
|
|
]
|
|
}
|
|
}
|
|
HOOK: empty
|
|
E: Unknown hook version in handshake from hook '$HOOK': {"jsonrpc": "2.0", "result": {"version": "42"}, "id": 0}
|
|
E: Sub-process '$HOOK' returned an error code (1)
|
|
E: Failure running hook '$HOOK'
|
|
E: Unknown hook version in handshake from hook '$HOOK': {"jsonrpc": "2.0", "result": {"version": "42"}, "id": 0}
|
|
E: Sub-process '$HOOK' returned an error code (1)
|
|
E: Failure running hook '$HOOK'' apt dist-upgrade -s
|
|
################## Error in hello response #########################
|
|
|
|
cat > json-hook.sh << EOF
|
|
#!/bin/bash
|
|
exec 2>/dev/null
|
|
trap '' SIGPIPE
|
|
while true; do
|
|
read request <&\$APT_HOOK_SOCKET
|
|
read empty <&\$APT_HOOK_SOCKET
|
|
|
|
if echo "\$request" | grep -q ".hello"; then
|
|
printf '{"jsonrpc": "2.0", "error": {"version": "0.1"}, "id": 0}\n\n' >&\$APT_HOOK_SOCKET
|
|
break
|
|
fi
|
|
done
|
|
exit 0
|
|
EOF
|
|
|
|
|
|
testfailureequal 'Reading package lists...
|
|
Building dependency tree...
|
|
E: Hook '$HOOK' reported an error during hello: {"jsonrpc": "2.0", "error": {"version": "0.1"}, "id": 0}
|
|
E: Hook '$HOOK' reported an error during hello: {"jsonrpc": "2.0", "error": {"version": "0.1"}, "id": 0}' apt install foo -s
|
|
|
|
################## Missing separator line #########################
|
|
cat > json-hook.sh << EOF
|
|
#!/bin/bash
|
|
exec 2>/dev/null
|
|
trap '' SIGPIPE
|
|
while true; do
|
|
read request <&\$APT_HOOK_SOCKET
|
|
read empty <&\$APT_HOOK_SOCKET
|
|
|
|
if echo "\$request" | grep -q ".hello"; then
|
|
printf '{"jsonrpc": "2.0", "result": {"version": "0.1"}, "id": 0}\n' >&\$APT_HOOK_SOCKET
|
|
break
|
|
fi
|
|
done
|
|
exit 0
|
|
EOF
|
|
|
|
|
|
testfailureequal 'Reading package lists...
|
|
Building dependency tree...
|
|
E: Could not read message separator line after handshake from '$HOOK': end of file
|
|
E: Could not read message separator line after handshake from '$HOOK': end of file' apt install foo -s
|
|
|
|
################## Wrong separator line #########################
|
|
cat > json-hook.sh << EOF
|
|
#!/bin/bash
|
|
exec 2>/dev/null
|
|
trap '' SIGPIPE
|
|
while true; do
|
|
read request <&\$APT_HOOK_SOCKET
|
|
read empty <&\$APT_HOOK_SOCKET
|
|
|
|
if echo "\$request" | grep -q ".hello"; then
|
|
printf '{"jsonrpc": "2.0", "result": {"version": "0.1"}, "id": 0}\nXX' >&\$APT_HOOK_SOCKET
|
|
break
|
|
fi
|
|
done
|
|
exit 0
|
|
EOF
|
|
|
|
|
|
testfailureequal 'Reading package lists...
|
|
Building dependency tree...
|
|
E: Expected empty line after handshake from '$HOOK', received XX
|
|
E: Expected empty line after handshake from '$HOOK', received XX' apt install foo -s
|
|
|
|
##################### Removed hook || true ############################
|
|
cat > rootdir/etc/apt/apt.conf.d/99-json-hooks << EOF
|
|
AptCli::Hooks::Install:: "true";
|
|
AptCli::Hooks::Search:: "true";
|
|
EOF
|
|
|
|
testsuccessequal 'Reading package lists...
|
|
Building dependency tree...
|
|
The following NEW packages will be installed:
|
|
foo
|
|
0 upgraded, 1 newly installed, 0 to remove and 1 not upgraded.
|
|
Inst foo (1.0 Lemons:unstable [all])
|
|
Conf foo (1.0 Lemons:unstable [all])' apt install foo -s
|
|
|
|
|
|
|