Files
李建琦 6d655c9903
Release / update-version (push) Has been cancelled
Release / build-frontend (push) Has been cancelled
Release / release (push) Has been cancelled
Release / sync-version-file (push) Has been cancelled
CI / shell (push) Canceled after 0s
CI / test (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
CI / golangci-lint (push) Canceled after 0s
Security Scan / backend-security (push) Canceled after 0s
Security Scan / frontend-security (push) Canceled after 0s
Sub2API v1.0 - AI API 网关(二开初始版本,基于上游 Wei-Shaw/sub2api)
2026-08-21 18:30:13 +08:00

165 lines
4.3 KiB
Bash
Executable File

#!/bin/bash
set -eu
STATE_DIR="${FAKE_CONTAINER_STATE:?FAKE_CONTAINER_STATE is required}"
mkdir -p \
"${STATE_DIR}/containers" \
"${STATE_DIR}/running" \
"${STATE_DIR}/networks" \
"${STATE_DIR}/volumes" \
"${STATE_DIR}/unowned/container" \
"${STATE_DIR}/unowned/network" \
"${STATE_DIR}/unowned/volume"
list_names() {
local directory=$1
local path
for path in "${directory}"/*; do
[[ -e "${path}" ]] || continue
basename "${path}"
done
}
last_argument() {
local value=""
for value in "$@"; do :; done
printf '%s\n' "${value}"
}
inspect_resource() {
local resource_type=$1
local resource_name=$2
local label_value="apple-container"
local address="192.168.65.4/24"
if [[ -e "${STATE_DIR}/unowned/${resource_type}/${resource_name}" ]]; then
label_value="other"
fi
case "${resource_name}" in
sub2api-apple-postgres) address="192.168.65.2/24" ;;
sub2api-apple-redis) address="192.168.65.3/24" ;;
esac
printf '[{"configuration":{"labels":{"org.sub2api.stack":"%s"}},"status":{"networks":[{"ipv4Address":"%s"}]}}]\n' \
"${label_value}" "${address}"
}
command=${1-}
if [[ $# -gt 0 ]]; then shift; fi
case "${command}" in
--version)
echo "container CLI version 1.1.0 (build: release, commit: fake)"
;;
system)
subcommand=${1-}
case "${subcommand}" in
status) [[ -e "${STATE_DIR}/system-running" ]] ;;
start) touch "${STATE_DIR}/system-running" ;;
stop) rm -f "${STATE_DIR}/system-running" "${STATE_DIR}/running"/* ;;
*) exit 1 ;;
esac
;;
list)
include_all=false
for argument in "$@"; do
[[ "${argument}" == "--all" || "${argument}" == "-a" ]] && include_all=true
done
if [[ "${include_all}" == true ]]; then
list_names "${STATE_DIR}/containers"
else
list_names "${STATE_DIR}/running"
fi
;;
network)
subcommand=${1-}
shift || true
case "${subcommand}" in
list)
echo default
list_names "${STATE_DIR}/networks"
;;
create) touch "${STATE_DIR}/networks/$(last_argument "$@")" ;;
inspect) inspect_resource network "${1}" ;;
delete) rm -f "${STATE_DIR}/networks/${1}" ;;
*) exit 1 ;;
esac
;;
volume)
subcommand=${1-}
shift || true
case "${subcommand}" in
list) list_names "${STATE_DIR}/volumes" ;;
create) touch "${STATE_DIR}/volumes/$(last_argument "$@")" ;;
inspect) inspect_resource volume "${1}" ;;
delete) rm -f "${STATE_DIR}/volumes/${1}" ;;
*) exit 1 ;;
esac
;;
image)
subcommand=${1-}
case "${subcommand}" in
inspect|pull) exit 0 ;;
*) exit 1 ;;
esac
;;
create)
name=""
while [[ $# -gt 0 ]]; do
case "$1" in
--name)
name=$2
shift 2
;;
--label|--network|--platform|--ulimit|--env-file|--volume|--entrypoint|--publish)
shift 2
;;
*)
shift
;;
esac
done
[[ -n "${name}" ]]
touch "${STATE_DIR}/containers/${name}"
;;
inspect)
inspect_resource container "${1}"
;;
start)
touch "${STATE_DIR}/running/${1}"
;;
stop)
for argument in "$@"; do
case "${argument}" in
--time|--signal) skip_next=true ;;
[0-9]*|SIG*) ;;
*) rm -f "${STATE_DIR}/running/${argument}" ;;
esac
done
;;
delete)
for argument in "$@"; do
case "${argument}" in
--force|-f) ;;
*)
rm -f "${STATE_DIR}/running/${argument}"
rm -f "${STATE_DIR}/containers/${argument}"
;;
esac
done
;;
exec)
echo 1
;;
logs|copy)
exit 0
;;
*)
echo "Unsupported fake container command: ${command} $*" >&2
exit 1
;;
esac