docs: site example: add validation script and travis config
This commit is contained in:
parent
2c071657ac
commit
e23a1039de
15
docs/site-example/.travis.yml
Normal file
15
docs/site-example/.travis.yml
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
language: bash
|
||||||
|
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
packages:
|
||||||
|
- lua5.1
|
||||||
|
- luarocks
|
||||||
|
|
||||||
|
install:
|
||||||
|
- eval $(luarocks path --bin)
|
||||||
|
- luarocks install --local lua-cjson
|
||||||
|
- luarocks install --local luacheck
|
||||||
|
|
||||||
|
script:
|
||||||
|
- bash tests/validate_site.sh
|
242
docs/site-example/tests/.luacheckrc
Normal file
242
docs/site-example/tests/.luacheckrc
Normal file
@ -0,0 +1,242 @@
|
|||||||
|
codes = true
|
||||||
|
std = "lua51"
|
||||||
|
self = false
|
||||||
|
|
||||||
|
include_files = {
|
||||||
|
"*.lua",
|
||||||
|
"/**/files/lib/gluon/ebtables/*",
|
||||||
|
"/**/luasrc/**/*",
|
||||||
|
}
|
||||||
|
|
||||||
|
-- files["scripts/check_site.lua"] = {
|
||||||
|
-- allow_defined = true,
|
||||||
|
-- module = true,
|
||||||
|
-- }
|
||||||
|
|
||||||
|
files["/**/check_site.lua"] = {
|
||||||
|
globals = {
|
||||||
|
"alternatives",
|
||||||
|
"extend",
|
||||||
|
"in_domain",
|
||||||
|
"in_site",
|
||||||
|
"need",
|
||||||
|
"need_alphanumeric_key",
|
||||||
|
"need_array",
|
||||||
|
"need_array_of",
|
||||||
|
"need_boolean",
|
||||||
|
"need_chanlist",
|
||||||
|
"need_domain_name",
|
||||||
|
"need_number",
|
||||||
|
"need_one_of",
|
||||||
|
"need_string",
|
||||||
|
"need_string_array",
|
||||||
|
"need_string_array_match",
|
||||||
|
"need_string_match",
|
||||||
|
"need_table",
|
||||||
|
"need_value",
|
||||||
|
"obsolete",
|
||||||
|
"table_keys",
|
||||||
|
"this_domain",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
files["/**/files/lib/gluon/ebtables/*"] = {
|
||||||
|
globals = {
|
||||||
|
"site",
|
||||||
|
},
|
||||||
|
new_read_globals = {
|
||||||
|
"chain",
|
||||||
|
"rule",
|
||||||
|
},
|
||||||
|
max_line_length = false,
|
||||||
|
}
|
||||||
|
|
||||||
|
files["/**/luasrc/lib/gluon/config-mode/*"] = {
|
||||||
|
globals = {
|
||||||
|
"DynamicList",
|
||||||
|
"Flag",
|
||||||
|
"Form",
|
||||||
|
"i18n",
|
||||||
|
"ListValue",
|
||||||
|
"renderer.render",
|
||||||
|
"renderer.render_string",
|
||||||
|
"Section",
|
||||||
|
"TextValue",
|
||||||
|
"_translate",
|
||||||
|
"translate",
|
||||||
|
"translatef",
|
||||||
|
"Value",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
files["/**/luasrc/lib/gluon/**/controller/*"] = {
|
||||||
|
new_read_globals = {
|
||||||
|
"_",
|
||||||
|
"alias",
|
||||||
|
"call",
|
||||||
|
"entry",
|
||||||
|
"model",
|
||||||
|
"node",
|
||||||
|
"template",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
files["/**/gluon-client-bridge/luasrc/usr/lib/lua/gluon/client_bridge.lua"] = {
|
||||||
|
globals = {
|
||||||
|
"next_node_macaddr",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
files["/**/gluon-config-mode-geo-location-osm/luasrc/usr/lib/lua/gluon/config-mode/geo-location-osm.lua"] = {
|
||||||
|
-- allow_defined = true,
|
||||||
|
-- module = true,
|
||||||
|
globals = {
|
||||||
|
"help",
|
||||||
|
"MapValue",
|
||||||
|
"options",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
files["/**/gluon-core/luasrc/usr/lib/lua/gluon/*"] = {
|
||||||
|
globals = {
|
||||||
|
"_M",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
files["/**/gluon-core/luasrc/usr/lib/lua/gluon/iputil.lua"] = {
|
||||||
|
-- allow_defined = true,
|
||||||
|
-- module = true,
|
||||||
|
globals = {
|
||||||
|
"IPv6",
|
||||||
|
"mac_to_ip",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
files["/**/gluon-core/luasrc/usr/lib/lua/gluon/platform.lua"] = {
|
||||||
|
-- allow_defined = true,
|
||||||
|
-- module = true,
|
||||||
|
globals = {
|
||||||
|
"is_outdoor_device",
|
||||||
|
"match",
|
||||||
|
},
|
||||||
|
new_read_globals = {
|
||||||
|
-- globals provided by platform_info
|
||||||
|
"get_board_name",
|
||||||
|
"get_image_name",
|
||||||
|
"get_model",
|
||||||
|
"get_subtarget",
|
||||||
|
"get_target",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
files["/**/gluon-core/luasrc/usr/lib/lua/gluon/users.lua"] = {
|
||||||
|
globals = {
|
||||||
|
"remove_group",
|
||||||
|
"remove_user",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
files["/**/gluon-core/luasrc/usr/lib/lua/gluon/util.lua"] = {
|
||||||
|
-- allow_defined = true,
|
||||||
|
-- module = true,
|
||||||
|
globals = {
|
||||||
|
"add_to_set",
|
||||||
|
"contains",
|
||||||
|
"default_hostname",
|
||||||
|
"domain_seed_bytes",
|
||||||
|
"exec",
|
||||||
|
"find_phy",
|
||||||
|
"foreach_radio",
|
||||||
|
"generate_mac",
|
||||||
|
"get_mesh_devices",
|
||||||
|
"get_uptime",
|
||||||
|
"get_wlan_mac",
|
||||||
|
"glob",
|
||||||
|
"node_id",
|
||||||
|
"readfile",
|
||||||
|
"remove_from_set",
|
||||||
|
"replace_prefix",
|
||||||
|
"trim",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
files["/**/gluon-web/luasrc/usr/lib/lua/gluon/web/*"] = {
|
||||||
|
globals = {
|
||||||
|
"Http",
|
||||||
|
"HTTP_MAX_CONTENT",
|
||||||
|
"mimedecode_message_body",
|
||||||
|
"parse_message_body",
|
||||||
|
"urldecode",
|
||||||
|
"urldecode_params",
|
||||||
|
"urlencode",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
files["/**/gluon-web/luasrc/usr/lib/lua/gluon/web/util.lua"] = {
|
||||||
|
globals = {
|
||||||
|
"class",
|
||||||
|
"instanceof",
|
||||||
|
"pcdata",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
files["/**/gluon-web-admin/luasrc/lib/gluon/config-mode/controller/admin/upgrade.lua"] = {
|
||||||
|
globals = {
|
||||||
|
"file",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
files["/**/gluon-web-mesh-vpn-fastd/luasrc/lib/gluon/config-mode/model/admin/mesh_vpn_fastd.lua"] = {
|
||||||
|
globals = {
|
||||||
|
"gluon",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
files["/**/gluon-web-model/luasrc/usr/lib/lua/gluon/web/model/datatypes.lua"] = {
|
||||||
|
-- allow_defined = true,
|
||||||
|
-- module = true,
|
||||||
|
globals = {
|
||||||
|
"bool",
|
||||||
|
"float",
|
||||||
|
"imax",
|
||||||
|
"imin",
|
||||||
|
"integer",
|
||||||
|
"ip4addr",
|
||||||
|
"ip6addr",
|
||||||
|
"ipaddr",
|
||||||
|
"irange",
|
||||||
|
"max",
|
||||||
|
"maxlength",
|
||||||
|
"min",
|
||||||
|
"minlength",
|
||||||
|
"range",
|
||||||
|
"ufloat",
|
||||||
|
"uinteger",
|
||||||
|
"wpakey",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
files["/**/gluon-web-model/luasrc/usr/lib/lua/gluon/web/model/classes.lua"] = {
|
||||||
|
-- allow_defined = true,
|
||||||
|
globals = {
|
||||||
|
"AbstractValue",
|
||||||
|
"DynamicList",
|
||||||
|
"Flag",
|
||||||
|
"Form",
|
||||||
|
"FORM_INVALID",
|
||||||
|
"FORM_NODATA",
|
||||||
|
"FORM_VALID",
|
||||||
|
"ListValue",
|
||||||
|
"Node",
|
||||||
|
"Section",
|
||||||
|
"Template",
|
||||||
|
"TextValue",
|
||||||
|
"Value",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
files["/**/gluon-web-osm/luasrc/usr/lib/lua/gluon/*"] = {
|
||||||
|
globals = {
|
||||||
|
"MapValue",
|
||||||
|
},
|
||||||
|
}
|
10
docs/site-example/tests/site_config.lua
Normal file
10
docs/site-example/tests/site_config.lua
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
local site = os.getenv('GLUON_SITEDIR') .. '/'
|
||||||
|
local config = os.getenv('GLUON_SITE_CONFIG')
|
||||||
|
|
||||||
|
local function loader()
|
||||||
|
coroutine.yield('return ')
|
||||||
|
coroutine.yield(io.open(site..config):read('*a'))
|
||||||
|
end
|
||||||
|
|
||||||
|
-- setfenv doesn't work with Lua 5.2 anymore, but we're using 5.1
|
||||||
|
return setfenv(assert(load(coroutine.wrap(loader), config)), {})()
|
123
docs/site-example/tests/validate_site.sh
Executable file
123
docs/site-example/tests/validate_site.sh
Executable file
@ -0,0 +1,123 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -uo pipefail
|
||||||
|
|
||||||
|
# validate_site.sh checks if the site.conf is valid json
|
||||||
|
GLUON_REPO="https://github.com/rubo77/gluon"
|
||||||
|
GLUON_BRANCH='ssid-changer'
|
||||||
|
GLUON_PACKAGES_REPO="https://github.com/freifunk-gluon/packages"
|
||||||
|
GLUON_PACKAGES_BRANCH='master'
|
||||||
|
|
||||||
|
P="$(pwd)"
|
||||||
|
echo "####### check if lua5.1 is installed ..."
|
||||||
|
which lua5.1
|
||||||
|
if [ "$?" == 1 ]; then
|
||||||
|
echo lua5.1 not present!
|
||||||
|
echo install with sudo apt install lua5.1
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
CONFIGS="site.conf"
|
||||||
|
if [ -d "domains" ]; then
|
||||||
|
CONFIGS="$CONFIGS "domains/*
|
||||||
|
fi
|
||||||
|
|
||||||
|
for c in $CONFIGS; do
|
||||||
|
echo "####### validating lua $c ..."
|
||||||
|
GLUON_SITEDIR="." GLUON_SITE_CONFIG="$c" lua5.1 tests/site_config.lua
|
||||||
|
if [ "$?" == 1 ]; then
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
echo "OK: $c"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
for BASHFILE in "$P"/*.sh; do
|
||||||
|
[ -f "$BASHFILE" ] || continue
|
||||||
|
echo "####### validating $BASHFILE ..."
|
||||||
|
bash -n "$BASHFILE"
|
||||||
|
if [ "$?" == 0 ]; then
|
||||||
|
echo "OK: $BASHFILE"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "####### validating $P/modules ..."
|
||||||
|
GLUON_SITE_FEEDS="none"
|
||||||
|
source "$P/modules"
|
||||||
|
testpath=/tmp/site-validate
|
||||||
|
rm -Rf "$testpath"
|
||||||
|
mkdir -p "$testpath/packages"
|
||||||
|
cd "$testpath/packages"
|
||||||
|
if [ "$GLUON_SITE_FEEDS" != "none" ]; then
|
||||||
|
for feed in $GLUON_SITE_FEEDS; do
|
||||||
|
echo "####### checking PACKAGES_${feed^^}_REPO ..."
|
||||||
|
repo_var="PACKAGES_${feed^^}_REPO"
|
||||||
|
commit_var="PACKAGES_${feed^^}_COMMIT"
|
||||||
|
branch_var="PACKAGES_${feed^^}_BRANCH"
|
||||||
|
repo="${!repo_var}"
|
||||||
|
commit="${!commit_var}"
|
||||||
|
branch="${!branch_var}"
|
||||||
|
if [ "$repo" == "" ]; then
|
||||||
|
echo "repo $repo_var missing"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if [ "$commit" == "" ]; then
|
||||||
|
echo "commit $commit_var missing"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if [ "$branch" == "" ]; then
|
||||||
|
echo "branch $branch_var missing"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
git clone -b "$branch" --depth 1000 --single-branch "$repo" "$feed"
|
||||||
|
if [ "$?" != "0" ]; then exit 1; fi
|
||||||
|
cd "$feed"
|
||||||
|
echo "git checkout $commit"
|
||||||
|
git checkout "$commit"
|
||||||
|
if [ "$?" != "0" ]; then exit 1; fi
|
||||||
|
cd -
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "####### Lua linter check for all package feeds ..."
|
||||||
|
~/.luarocks/bin/luacheck --config "$P/tests/.luacheckrc" "$testpath/packages"
|
||||||
|
|
||||||
|
echo "####### downloading $GLUON_PACKAGES_REPO ..."
|
||||||
|
git clone -b "$GLUON_PACKAGES_BRANCH" --depth 1 --single-branch "$GLUON_PACKAGES_REPO"
|
||||||
|
|
||||||
|
echo "####### downloading gluon ..."
|
||||||
|
cd "$testpath"
|
||||||
|
git init gluon
|
||||||
|
cd gluon
|
||||||
|
git remote add origin "$GLUON_REPO"
|
||||||
|
git config core.sparsecheckout true
|
||||||
|
echo "package/*" >> .git/info/sparse-checkout
|
||||||
|
git pull --depth 1 origin "$GLUON_BRANCH"
|
||||||
|
cp -a package/ "$testpath/packages"
|
||||||
|
cd "$testpath/packages/package"
|
||||||
|
|
||||||
|
echo "####### validating GLUON_SITE_PACKAGES from $P/site.mk ..."
|
||||||
|
# ignore non-gluon packages and standard gluon features
|
||||||
|
sed '0,/^GLUON_LANGS/d' "$P/site.mk" | sed '/GLUON_TARGET/,$d' | egrep -v '(#|G|iwinfo|iptables|haveged|vim|socat|tar|mesh-batman-adv-1[45]|web-advanced|web-wizard)'> "$testpath"/site.mk.sh
|
||||||
|
sed -i 's/\s\\$//g;/^$/d' "$testpath"/site.mk.sh
|
||||||
|
sed -i 's/gluon-mesh-batman-adv-1[45]/gluon-mesh-batman-adv/g' "$testpath"/site.mk.sh
|
||||||
|
sed -i 's/gluon-config-mode-geo-location-with-map/gluon-config-mode-geo-location/g' $testpath/site.mk.sh
|
||||||
|
cat "$testpath"/site.mk.sh |
|
||||||
|
while read packet; do
|
||||||
|
if [ "$packet" != "" ]; then
|
||||||
|
echo -n "# $packet"
|
||||||
|
FOUND="$(find "$testpath/packages/" -type d -name "$packet")"
|
||||||
|
if [ "$FOUND" '!=' '' ]; then
|
||||||
|
echo " found in $(echo "$FOUND"|sed 's|'"$testpath/packages"'||g')"
|
||||||
|
else
|
||||||
|
# check again with prefix gluon-
|
||||||
|
FOUND="$(find "$testpath/packages/" -type d -name "gluon-$packet")"
|
||||||
|
if [ "$FOUND" '!=' '' ]; then
|
||||||
|
echo " found as FEATURE in $(echo "$FOUND"|sed 's|'"$testpath/packages"'||g')"
|
||||||
|
else
|
||||||
|
echo
|
||||||
|
echo "ERROR: $packet missing"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
@ -734,6 +734,16 @@ modules
|
|||||||
.. literalinclude:: ../site-example/modules
|
.. literalinclude:: ../site-example/modules
|
||||||
:language: makefile
|
:language: makefile
|
||||||
|
|
||||||
|
.travis.yml and ``test`` folder
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
The test folder contains a validation script that can be called in your site
|
||||||
|
folder if you want to validate the external packages you defined in your
|
||||||
|
``modules`` file. Travis can be added to your git repository to automatically
|
||||||
|
validate new commits to your site repository. It can also be called manually in
|
||||||
|
your console with ``bash tests/validate_site.sh``.
|
||||||
|
|
||||||
|
|
||||||
site-repos in the wild
|
site-repos in the wild
|
||||||
^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user