mirror of
https://github.com/YunoHost/package_check.git
synced 2024-09-03 20:06:20 +02:00
Yoloimplement support for appsv2
This commit is contained in:
parent
03f9f66db0
commit
395bab657a
4 changed files with 96 additions and 70 deletions
54
lib/default_install_args.py
Normal file
54
lib/default_install_args.py
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
#!/usr/bin/python3
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import json
|
||||||
|
import toml
|
||||||
|
|
||||||
|
def get_default_values_for_questions(manifest):
|
||||||
|
|
||||||
|
base_default_value_per_arg_type = {
|
||||||
|
("domain", "domain"): "domain.tld",
|
||||||
|
("path", "path"): "/" + manifest["id"],
|
||||||
|
("user", "admin"): "package_checker",
|
||||||
|
("group", "init_main_permission"): "visitors",
|
||||||
|
("group", "init_admin_permission"): "admins",
|
||||||
|
("password", "password"): "MySuperComplexPassword"
|
||||||
|
}
|
||||||
|
|
||||||
|
if manifest.get("packaging_format", 1) <= 1:
|
||||||
|
questions = {q["name"]:q for q in manifest["arguments"]["install"]}
|
||||||
|
else:
|
||||||
|
questions = manifest["install"]
|
||||||
|
|
||||||
|
for name, question in questions.items():
|
||||||
|
type_and_name = (question["type"], name)
|
||||||
|
base_default = base_default_value_per_arg_type.get(type_and_name)
|
||||||
|
if base_default:
|
||||||
|
yield (name, base_default)
|
||||||
|
elif question.get("default"):
|
||||||
|
if isinstance(question.get("default"), bool):
|
||||||
|
yield (name, str(int(question.get("default"))))
|
||||||
|
else:
|
||||||
|
yield (name, str(question.get("default")))
|
||||||
|
elif question["type"] == "boolean":
|
||||||
|
yield (name, "1")
|
||||||
|
elif question.get("choices"):
|
||||||
|
if isinstance(question["choices"]):
|
||||||
|
choices = str(question["choices"])
|
||||||
|
else:
|
||||||
|
choices = list(question["choices"].keys())
|
||||||
|
yield (name, question["choices"][0])
|
||||||
|
else:
|
||||||
|
raise Exception("No default value could be computed for arg " + name)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
manifest_path = sys.argv[1:][0]
|
||||||
|
|
||||||
|
if manifest_path.endswith(".json"):
|
||||||
|
manifest = json.load(open(manifest_path, "r"))
|
||||||
|
else:
|
||||||
|
manifest = toml.load(open(manifest_path, "r"))
|
||||||
|
|
||||||
|
querystring = '&'.join([k + "=" + v for k, v in get_default_values_for_questions(manifest)])
|
||||||
|
print(querystring)
|
|
@ -1,56 +0,0 @@
|
||||||
#!/usr/bin/python3
|
|
||||||
|
|
||||||
import sys
|
|
||||||
import json
|
|
||||||
|
|
||||||
def argument_for_question(question, all_choices=False):
|
|
||||||
question_type = question.get("type")
|
|
||||||
|
|
||||||
if question_type is None and question.get("choices"):
|
|
||||||
question_type = "boolean"
|
|
||||||
elif question_type in [None, "string"] and question.get("default"):
|
|
||||||
question_type = "with_default"
|
|
||||||
elif question_type is None and question["name"] == "admin":
|
|
||||||
question_type = "user"
|
|
||||||
elif question_type is None and question["name"] == "domain":
|
|
||||||
question_type = "domain"
|
|
||||||
|
|
||||||
if question_type == "domain":
|
|
||||||
return (question["name"], "ynh.local")
|
|
||||||
elif question_type == "path":
|
|
||||||
if all_choices:
|
|
||||||
return (question["name"], question["default"], "/")
|
|
||||||
else:
|
|
||||||
return (question["name"], question["default"])
|
|
||||||
elif question_type == "with_default":
|
|
||||||
return (question["name"], question["default"])
|
|
||||||
elif question_type == "boolean":
|
|
||||||
if not all_choices:
|
|
||||||
if isinstance(question["default"], bool):
|
|
||||||
if question["default"]:
|
|
||||||
question["default"] = "1"
|
|
||||||
else:
|
|
||||||
question["default"] = "0"
|
|
||||||
|
|
||||||
return (question["name"], question["default"])
|
|
||||||
else:
|
|
||||||
if isinstance(question["default"], bool) :
|
|
||||||
return (question["name"], "1", "0")
|
|
||||||
|
|
||||||
if question.get("choices"):
|
|
||||||
return (question["name"],) + tuple(question["choices"])
|
|
||||||
|
|
||||||
return (question["name"], question["default"])
|
|
||||||
elif question_type == "password":
|
|
||||||
return (question["name"], "ynh")
|
|
||||||
elif question_type == "user":
|
|
||||||
return (question["name"], "johndoe")
|
|
||||||
else:
|
|
||||||
raise Exception("Unknow question type: %s\n" % question_type, question)
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
manifest_path = sys.argv[1:][0]
|
|
||||||
manifest = json.load(open(manifest_path, "r"))
|
|
||||||
|
|
||||||
for question in manifest["arguments"]["install"]:
|
|
||||||
print(":".join(argument_for_question(question, all_choices=True)))
|
|
40
lib/tests.sh
40
lib/tests.sh
|
@ -76,13 +76,14 @@ _INSTALL_APP () {
|
||||||
|
|
||||||
# We have default values for domain, admin and is_public, but these
|
# We have default values for domain, admin and is_public, but these
|
||||||
# may still be overwritten by the args ($@)
|
# may still be overwritten by the args ($@)
|
||||||
for arg_override in "domain=$SUBDOMAIN" "admin=$TEST_USER" "is_public=1" "$@"
|
for arg_override in "domain=$SUBDOMAIN" "admin=$TEST_USER" "is_public=1" "init_main_permission=visitors" "$@"
|
||||||
do
|
do
|
||||||
key="$(echo $arg_override | cut -d '=' -f 1)"
|
key="$(echo $arg_override | cut -d '=' -f 1)"
|
||||||
value="$(echo $arg_override | cut -d '=' -f 2-)"
|
value="$(echo $arg_override | cut -d '=' -f 2-)"
|
||||||
|
|
||||||
# (Legacy stuff ... We don't override is_public if its type is not boolean)
|
# (Legacy stuff ... We don't override is_public if its type is not boolean)
|
||||||
[[ "$key" == "is_public" ]] \
|
[[ -e $package_path/manifest.json ]] \
|
||||||
|
&& [[ "$key" == "is_public" ]] \
|
||||||
&& [[ "$(jq -r '.arguments.install[] | select(.name=="is_public") | .type' $package_path/manifest.json)" != "boolean" ]] \
|
&& [[ "$(jq -r '.arguments.install[] | select(.name=="is_public") | .type' $package_path/manifest.json)" != "boolean" ]] \
|
||||||
&& continue
|
&& continue
|
||||||
|
|
||||||
|
@ -90,14 +91,27 @@ _INSTALL_APP () {
|
||||||
done
|
done
|
||||||
|
|
||||||
# Note : we do this at this stage and not during the parsing of check_process
|
# Note : we do this at this stage and not during the parsing of check_process
|
||||||
# because this also applies to upgrades ...
|
# because this also applies to upgrades ... ie older version may have different args and default values
|
||||||
# For all manifest arg
|
|
||||||
for ARG in $(jq -r '.arguments.install[].name' $package_path/manifest.json)
|
# Fetch and loop over all manifest arg
|
||||||
|
if [[ -e $package_path/manifest.json ]]
|
||||||
|
then
|
||||||
|
local manifest_args="$(jq -r '.arguments.install[].name' $package_path/manifest.json)"
|
||||||
|
else
|
||||||
|
local manifest_args="$(grep '^\s*\[install\.' $package_path/manifest.toml | tr -d '[]' | awk -F. '{print $2}')"
|
||||||
|
fi
|
||||||
|
|
||||||
|
for ARG in $manifest_args
|
||||||
do
|
do
|
||||||
# If the argument is not yet in install args, add its default value
|
# If the argument is not yet in install args, add its default value
|
||||||
if ! echo "$install_args" | grep -q -E "\<$ARG="
|
if ! echo "$install_args" | grep -q -E "\<$ARG="
|
||||||
|
then
|
||||||
|
if [[ -e $package_path/manifest.json ]]
|
||||||
then
|
then
|
||||||
local default_value=$(jq -e -r --arg ARG $ARG '.arguments.install[] | select(.name==$ARG) | .default' $package_path/manifest.json)
|
local default_value=$(jq -e -r --arg ARG $ARG '.arguments.install[] | select(.name==$ARG) | .default' $package_path/manifest.json)
|
||||||
|
else
|
||||||
|
local default_value=$(python3 -c "import toml, sys; t = toml.loads(sys.stdin.read()); d = t['install']['$ARG'].get('default'); assert d is not None, 'Missing default value'; print(d)" < manifest.toml)
|
||||||
|
fi
|
||||||
[[ $? -eq 0 ]] || { log_error "Missing install arg $ARG ?"; return 1; }
|
[[ $? -eq 0 ]] || { log_error "Missing install arg $ARG ?"; return 1; }
|
||||||
[[ ${install_args: -1} == '&' ]] || install_args+="&"
|
[[ ${install_args: -1} == '&' ]] || install_args+="&"
|
||||||
install_args+="$ARG=$default_value"
|
install_args+="$ARG=$default_value"
|
||||||
|
@ -177,7 +191,14 @@ _VALIDATE_THAT_APP_CAN_BE_ACCESSED () {
|
||||||
# private by default For "regular" apps (with a is_public arg) they are
|
# private by default For "regular" apps (with a is_public arg) they are
|
||||||
# installed as public, and we precisely want to check they are publicly
|
# installed as public, and we precisely want to check they are publicly
|
||||||
# accessible *without* tweaking skipped_uris...
|
# accessible *without* tweaking skipped_uris...
|
||||||
if [ "$install_type" != 'private' ] && [[ -z "$(jq -r '.arguments.install[] | select(.name=="is_public")' $package_path/manifest.json)" ]]
|
if [[ -e $package_path/manifest.json ]]
|
||||||
|
then
|
||||||
|
local has_public_arg=$([[ -n "$(jq -r '.arguments.install[] | select(.name=="is_public")' $package_path/manifest.json)" ]] && echo true || echo false)
|
||||||
|
else
|
||||||
|
local has_public_arg=$(grep -q '\[install.init_main_permission\]' manifest.toml && echo true || echo false)
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$install_type" != 'private' ] && [[ $has_public_arg == "false" ]]
|
||||||
then
|
then
|
||||||
log_debug "Forcing public access using a skipped_uris setting"
|
log_debug "Forcing public access using a skipped_uris setting"
|
||||||
# Add a skipped_uris on / for the app
|
# Add a skipped_uris on / for the app
|
||||||
|
@ -350,10 +371,11 @@ TEST_INSTALL () {
|
||||||
|
|
||||||
local check_path="/"
|
local check_path="/"
|
||||||
local is_public="1"
|
local is_public="1"
|
||||||
|
local init_main_permission="visitors"
|
||||||
[ "$install_type" = "subdir" ] && { start_test "Installation in a sub path"; local check_path=/path; }
|
[ "$install_type" = "subdir" ] && { start_test "Installation in a sub path"; local check_path=/path; }
|
||||||
[ "$install_type" = "root" ] && { start_test "Installation on the root"; }
|
[ "$install_type" = "root" ] && { start_test "Installation on the root"; }
|
||||||
[ "$install_type" = "nourl" ] && { start_test "Installation without URL access"; local check_path=""; }
|
[ "$install_type" = "nourl" ] && { start_test "Installation without URL access"; local check_path=""; }
|
||||||
[ "$install_type" = "private" ] && { start_test "Installation in private mode"; local is_public="0"; }
|
[ "$install_type" = "private" ] && { start_test "Installation in private mode"; local is_public="0"; local init_main_permission="all_users"; }
|
||||||
local snapname=snap_${install_type}install
|
local snapname=snap_${install_type}install
|
||||||
|
|
||||||
LOAD_LXC_SNAPSHOT snap0
|
LOAD_LXC_SNAPSHOT snap0
|
||||||
|
@ -361,7 +383,7 @@ TEST_INSTALL () {
|
||||||
_PREINSTALL
|
_PREINSTALL
|
||||||
|
|
||||||
# Install the application in a LXC container
|
# Install the application in a LXC container
|
||||||
_INSTALL_APP "path=$check_path" "is_public=$is_public" \
|
_INSTALL_APP "path=$check_path" "is_public=$is_public" "init_main_permission=$init_main_permission" \
|
||||||
&& _VALIDATE_THAT_APP_CAN_BE_ACCESSED "$SUBDOMAIN" "$check_path" "$install_type" \
|
&& _VALIDATE_THAT_APP_CAN_BE_ACCESSED "$SUBDOMAIN" "$check_path" "$install_type" \
|
||||||
|
|
||||||
local install=$?
|
local install=$?
|
||||||
|
@ -377,7 +399,7 @@ TEST_INSTALL () {
|
||||||
# Remove and reinstall the application
|
# Remove and reinstall the application
|
||||||
_REMOVE_APP \
|
_REMOVE_APP \
|
||||||
&& log_small_title "Reinstalling after removal." \
|
&& log_small_title "Reinstalling after removal." \
|
||||||
&& _INSTALL_APP "path=$check_path" "is_public=$is_public" \
|
&& _INSTALL_APP "path=$check_path" "is_public=$is_public" "init_main_permission=$init_main_permission" \
|
||||||
&& _VALIDATE_THAT_APP_CAN_BE_ACCESSED "$SUBDOMAIN" "$check_path" "$install_type"
|
&& _VALIDATE_THAT_APP_CAN_BE_ACCESSED "$SUBDOMAIN" "$check_path" "$install_type"
|
||||||
|
|
||||||
return $?
|
return $?
|
||||||
|
|
|
@ -87,6 +87,7 @@ parse_check_process() {
|
||||||
echo "$install_args" | tr '&' '\n' | grep -q "^path=" ||install_args+="path=&"
|
echo "$install_args" | tr '&' '\n' | grep -q "^path=" ||install_args+="path=&"
|
||||||
echo "$install_args" | tr '&' '\n' | grep -q "^admin=" ||install_args+="admin=&"
|
echo "$install_args" | tr '&' '\n' | grep -q "^admin=" ||install_args+="admin=&"
|
||||||
echo "$install_args" | tr '&' '\n' | grep -q "^is_public=" ||install_args+="is_public=&"
|
echo "$install_args" | tr '&' '\n' | grep -q "^is_public=" ||install_args+="is_public=&"
|
||||||
|
echo "$install_args" | tr '&' '\n' | grep -q "^init_main_permission=" ||install_args+="init_main_permission=&"
|
||||||
|
|
||||||
extract_check_process_section "^; Checks" "^; " $test_serie_rawconf > $TEST_CONTEXT/check_process.tests_infos
|
extract_check_process_section "^; Checks" "^; " $test_serie_rawconf > $TEST_CONTEXT/check_process.tests_infos
|
||||||
|
|
||||||
|
@ -193,16 +194,16 @@ guess_test_configuration() {
|
||||||
> "$TEST_CONTEXT/tests/$test_id.json"
|
> "$TEST_CONTEXT/tests/$test_id.json"
|
||||||
}
|
}
|
||||||
|
|
||||||
local install_args=$(python3 "./lib/manifest_parsing.py" "$package_path/manifest.json" | cut -d ':' -f1,2 | tr ':' '=' | tr '\n' '&')
|
local install_args=$(python3 "./lib/default_install_args.py" "$package_path"/manifest.*)
|
||||||
|
|
||||||
add_test "PACKAGE_LINTER"
|
add_test "PACKAGE_LINTER"
|
||||||
add_test "TEST_INSTALL" "root"
|
add_test "TEST_INSTALL" "root"
|
||||||
add_test "TEST_INSTALL" "subdir"
|
add_test "TEST_INSTALL" "subdir"
|
||||||
if echo $install_args | grep -q "is_public="
|
if echo $install_args | grep -q "is_public=\|init_main_permission="
|
||||||
then
|
then
|
||||||
add_test "TEST_INSTALL" "private"
|
add_test "TEST_INSTALL" "private"
|
||||||
fi
|
fi
|
||||||
if grep multi_instance "$package_path/manifest.json" | grep -q true
|
if grep multi_instance "$package_path"/manifest.* | grep -q true
|
||||||
then
|
then
|
||||||
add_test "TEST_INSTALL" "multi"
|
add_test "TEST_INSTALL" "multi"
|
||||||
fi
|
fi
|
||||||
|
@ -220,7 +221,12 @@ run_all_tests() {
|
||||||
mkdir -p $TEST_CONTEXT/results
|
mkdir -p $TEST_CONTEXT/results
|
||||||
mkdir -p $TEST_CONTEXT/logs
|
mkdir -p $TEST_CONTEXT/logs
|
||||||
|
|
||||||
|
if [ -e $package_path/manifest.json ]
|
||||||
|
then
|
||||||
readonly app_id="$(jq -r .id $package_path/manifest.json)"
|
readonly app_id="$(jq -r .id $package_path/manifest.json)"
|
||||||
|
else
|
||||||
|
readonly app_id="$(grep '^id = ' $package_path/manifest.toml | tr -d '" ' | awk -F= '{print $2}')"
|
||||||
|
fi
|
||||||
|
|
||||||
# Parse the check_process only if it's exist
|
# Parse the check_process only if it's exist
|
||||||
check_process="$package_path/check_process"
|
check_process="$package_path/check_process"
|
||||||
|
|
Loading…
Add table
Reference in a new issue