Files
LithosAnanke/site/org/install.sh
T
Claude 51dd4a8391
Build / Image RASPI (push) Successful in 2m18s
Build / Image PC (push) Successful in 2m54s
Build / Image MILKV (push) Successful in 2m29s
Build / v4 tests (32- and 64-bit cells) (push) Successful in 10m23s
site/org: the .org wiki's landing page and its two dashboards
Ruled by Captain Bob, 2026-11-07: a generic landing page for anonymous
visitors, a login-protected admin dashboard for him, and a protected
contributors' dashboard. Main.WebHome (everyone), Admin.WebHome
(XWiki.rajames alone), Contributors.WebHome (XWiki.StarshipContributors
and the administrator); CI shown as Gitea's live workflow badges.
install.sh puts them on the wiki through XWiki's REST API, with the group
and the space rights, and checks a guest's view. Not yet run: the .org
XWiki answers 503.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GE3SDvQn5EoxdGufk84zz2
2026-11-07 11:29:10 +00:00

99 lines
4.6 KiB
Bash
Executable File

#!/bin/bash
# install.sh -- the .org XWiki's three pages (Captain Bob, 2026-11-07): a landing page anyone can
# read, an admin dashboard for the administrator alone, and a contributors' dashboard for the
# group XWiki.StarshipContributors (and the administrator). Through XWiki's REST API:
#
# Main.WebHome Main.WebHome.xwiki rights untouched: the wiki's own (guests view)
# Admin.WebHome Admin.WebHome.xwiki Admin.WebPreferences: view, edit, comment,
# delete -- $ADMIN_USER alone
# Contributors.WebHome Contributors.WebHome.xwiki Contributors.WebPreferences: view, comment --
# XWiki.StarshipContributors and $ADMIN_USER;
# edit, delete -- $ADMIN_USER
# XWiki.StarshipContributors the group, created empty; members are added in the wiki's
# administration (Users and Groups)
#
# An allow on a space denies that right there to everyone not named -- guests included.
#
# XWIKI_USER=rajames XWIKI_PASSWORD=... site/org/install.sh [https://starshipos-f18.org]
#
# Run it again after editing a page: pages are replaced, rights and the group are added once.
# It ends by checking, without logging in, that the landing page is readable and the dashboards
# are not.
set -euo pipefail
cd "$(dirname "$0")"
base=${1:-https://starshipos-f18.org}
rest="$base/rest/wikis/xwiki"
user=${XWIKI_USER:?set XWIKI_USER}
pass=${XWIKI_PASSWORD:?set XWIKI_PASSWORD}
admin=${ADMIN_USER:-XWiki.$user}
group=XWiki.StarshipContributors
auth=(-u "$user:$pass")
page() { # page <space> <name> <title> [file]: create or replace
local body
body=$(python3 -c '
import sys
from xml.sax.saxutils import escape
title, path = sys.argv[1], sys.argv[2]
content = open(path).read() if path else ""
print("<page xmlns=\"http://www.xwiki.org\"><title>%s</title><syntax>xwiki/2.1</syntax>"
"<content>%s</content></page>" % (escape(title), escape(content)))' "$3" "${4:-}")
curl -fsS -o /dev/null -w " page $1.$2: %{http_code}\n" "${auth[@]}" -X PUT \
-H 'Content-Type: application/xml' --data-binary "$body" "$rest/spaces/$1/pages/$2"
}
objects() { # objects <space> <page> <class>: how many the page has
curl -fsS "${auth[@]}" -H 'Accept: application/json' "$rest/spaces/$1/pages/$2/objects/$3" |
python3 -c 'import json,sys; print(len(json.load(sys.stdin).get("objectSummaries") or []))'
}
object() { # object <space> <page> <class> <property=value>...: add one
local s=$1 p=$2 c=$3; shift 3
local args=(--data-urlencode "className=$c")
for kv in "$@"; do args+=(--data-urlencode "property#$kv"); done
curl -fsS -o /dev/null -w " $s.$p: $c added (%{http_code})\n" "${auth[@]}" -X POST "${args[@]}" \
"$rest/spaces/$s/pages/$p/objects"
}
echo "=== $base, as $user"
page Main WebHome "StarshipOS" Main.WebHome.xwiki
page Admin WebHome "Admin Dashboard" Admin.WebHome.xwiki
page Contributors WebHome "Contributors' Dashboard" Contributors.WebHome.xwiki
echo "=== the group $group"
page XWiki StarshipContributors "Starship Contributors"
if [ "$(objects XWiki StarshipContributors XWiki.XWikiGroups)" = 0 ]; then
object XWiki StarshipContributors XWiki.XWikiGroups "member="
else
echo " already a group"
fi
echo "=== rights"
page Admin WebPreferences "Admin rights"
if [ "$(objects Admin WebPreferences XWiki.XWikiGlobalRights)" = 0 ]; then
object Admin WebPreferences XWiki.XWikiGlobalRights \
"levels=view,edit,comment,delete" "users=$admin" "groups=" "allow=1"
else
echo " Admin: rights there already, left as they are"
fi
page Contributors WebPreferences "Contributors rights"
if [ "$(objects Contributors WebPreferences XWiki.XWikiGlobalRights)" = 0 ]; then
object Contributors WebPreferences XWiki.XWikiGlobalRights \
"levels=view,comment" "users=$admin" "groups=$group" "allow=1"
object Contributors WebPreferences XWiki.XWikiGlobalRights \
"levels=edit,delete" "users=$admin" "groups=" "allow=1"
else
echo " Contributors: rights there already, left as they are"
fi
echo "=== as a guest"
bad=
for p in Main Admin Contributors; do
code=$(curl -s -o /dev/null -w '%{http_code}' -H 'Accept: application/json' "$rest/spaces/$p/pages/WebHome")
case "$p:$code" in
Main:200|Admin:401|Admin:403|Contributors:401|Contributors:403)
echo " $p.WebHome: $code -- as it should be";;
*) echo " $p.WebHome: $code -- NOT as it should be"; bad=1;;
esac
done
[ -z "$bad" ] || { echo "install: a guest's view is wrong; see above" >&2; exit 1; }
echo "=== done: $base/bin/view/Main/"