Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 3ab2b075da | |||
| 821d4d0ad8 | |||
| 6cc8dabf72 | |||
| 0d7fa2c511 | |||
| 4a18460178 | |||
| d2b3d4f6ea | |||
| f3d327f28f | |||
| 2b05d8c952 | |||
| 6cb41c1277 | |||
| f0d02d6af1 |
+19
-5
@@ -417,13 +417,27 @@ def check_nm_pwd(username, password):
|
||||
Returns:
|
||||
dict: User document if credentials are valid, None otherwise
|
||||
"""
|
||||
db_name = cfg.MONGODB_DB
|
||||
try:
|
||||
from tenant import get_tenant_context
|
||||
ctx = get_tenant_context()
|
||||
if ctx and ctx.tenant_id:
|
||||
db_name = ctx.db_name or ctx.resolve_tenant()
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
client = MongoClient(cfg.MONGODB_HOST, cfg.MONGODB_PORT)
|
||||
db = client[cfg.MONGODB_DB]
|
||||
db = client[db_name]
|
||||
users = db['users']
|
||||
hashed_password = hashlib.sha512(password.encode()).hexdigest()
|
||||
user = users.find_one({'Username': username, 'Password': hashed_password})
|
||||
user = users.find_one({'Username': username}) or users.find_one({'username': username})
|
||||
client.close()
|
||||
return user
|
||||
|
||||
if not user:
|
||||
return None
|
||||
|
||||
if user.get('Password') == hashing(password):
|
||||
return user
|
||||
return None
|
||||
|
||||
|
||||
def add_user(
|
||||
@@ -471,7 +485,7 @@ def add_user(
|
||||
'Admin': False,
|
||||
'active_ausleihung': None,
|
||||
'name': name_alias,
|
||||
'last_name': '',
|
||||
'last_name': last_name.strip() if last_name else '',
|
||||
'IsStudent': bool(is_student),
|
||||
'PermissionPreset': permission_defaults['preset'],
|
||||
'ActionPermissions': permission_defaults['actions'],
|
||||
|
||||
+255
-17
@@ -20,11 +20,13 @@ show_help() {
|
||||
echo " restart-tenant <id> 'Restart' a single tenant (clears cache/sessions)"
|
||||
echo " restart-all Restart all application containers (zero-downtime reload)"
|
||||
echo " list List active tenants"
|
||||
echo " -h, --help Show this help message"
|
||||
echo ""
|
||||
echo "Examples:"
|
||||
echo " ./manage-tenant.sh add school_a 10001"
|
||||
echo " ./manage-tenant.sh remove test_tenant"
|
||||
echo " ./manage-tenant.sh restart-all"
|
||||
echo " ./manage-tenant.sh -h"
|
||||
exit 1
|
||||
}
|
||||
|
||||
@@ -65,14 +67,164 @@ PY
|
||||
fi
|
||||
}
|
||||
|
||||
if [ -z "$1" ]; then
|
||||
update_runtime_ports() {
|
||||
local new_port="$1"
|
||||
local env_file="$PWD/.docker-build.env"
|
||||
local current_ports=""
|
||||
local port_list=()
|
||||
local unique_ports=()
|
||||
local first_port=""
|
||||
if [ -n "$new_port" ]; then
|
||||
if [ -f "$env_file" ]; then
|
||||
current_ports="$(awk -F= '/^INVENTAR_HTTP_PORTS=/{print $2; exit}' "$env_file" | tr -d ' ' || true)"
|
||||
if [ -z "$current_ports" ]; then
|
||||
current_ports="$(awk -F= '/^INVENTAR_HTTP_PORT=/{print $2; exit}' "$env_file" | tr -d ' ' || true)"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -n "$current_ports" ]; then
|
||||
IFS=',' read -r -a port_list <<<"${current_ports// /,}"
|
||||
fi
|
||||
port_list+=("$new_port")
|
||||
|
||||
for port in "${port_list[@]}"; do
|
||||
if [ -n "$port" ] && ! printf '%s\n' "${unique_ports[@]}" | grep -qx "$port"; then
|
||||
unique_ports+=("$port")
|
||||
fi
|
||||
done
|
||||
|
||||
if [ ${#unique_ports[@]} -eq 0 ]; then
|
||||
unique_ports=("$new_port")
|
||||
fi
|
||||
|
||||
first_port="${unique_ports[0]}"
|
||||
local ports_csv
|
||||
ports_csv="$(IFS=,; echo "${unique_ports[*]}")"
|
||||
|
||||
if [ ! -f "$env_file" ]; then
|
||||
cat > "$env_file" <<EOF
|
||||
NUITKA_BUILD=0
|
||||
INVENTAR_HTTP_PORT=$first_port
|
||||
INVENTAR_HTTP_PORTS=$ports_csv
|
||||
EOF
|
||||
else
|
||||
if grep -q '^INVENTAR_HTTP_PORTS=' "$env_file" 2>/dev/null; then
|
||||
sed -i "s|^INVENTAR_HTTP_PORTS=.*|INVENTAR_HTTP_PORTS=$ports_csv|" "$env_file"
|
||||
else
|
||||
printf '\nINVENTAR_HTTP_PORTS=%s\n' "$ports_csv" >> "$env_file"
|
||||
fi
|
||||
if grep -q '^INVENTAR_HTTP_PORT=' "$env_file" 2>/dev/null; then
|
||||
sed -i "s|^INVENTAR_HTTP_PORT=.*|INVENTAR_HTTP_PORT=$first_port|" "$env_file"
|
||||
else
|
||||
printf '\nINVENTAR_HTTP_PORT=%s\n' "$first_port" >> "$env_file"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "Updated runtime env ports: $ports_csv"
|
||||
fi
|
||||
}
|
||||
|
||||
remove_tenant_port() {
|
||||
local tenant_id="$1"
|
||||
local config_path="$CONFIG_FILE"
|
||||
local port
|
||||
|
||||
port="$(python3 - "$config_path" "$tenant_id" <<'PY'
|
||||
import json, sys, os
|
||||
path, tenant_id = sys.argv[1], sys.argv[2]
|
||||
if not os.path.isfile(path):
|
||||
sys.exit(1)
|
||||
with open(path, 'r', encoding='utf-8') as f:
|
||||
cfg = json.load(f)
|
||||
tenants = cfg.get('tenants', {})
|
||||
if not isinstance(tenants, dict) or tenant_id not in tenants or not isinstance(tenants[tenant_id], dict):
|
||||
sys.exit(2)
|
||||
removed = tenants.pop(tenant_id, None)
|
||||
cfg['tenants'] = tenants
|
||||
with open(path, 'w', encoding='utf-8') as f:
|
||||
json.dump(cfg, f, indent=4, ensure_ascii=False)
|
||||
if removed is not None:
|
||||
port = removed.get('port')
|
||||
if port is not None:
|
||||
print(port)
|
||||
PY
|
||||
)"
|
||||
|
||||
local status=$?
|
||||
if [ $status -eq 1 ]; then
|
||||
echo "Error: config file not found: $config_path"
|
||||
return 1
|
||||
fi
|
||||
if [ $status -eq 2 ]; then
|
||||
return 2
|
||||
fi
|
||||
|
||||
if [ -n "$port" ]; then
|
||||
echo "$port"
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
remove_runtime_port() {
|
||||
local removed_port="$1"
|
||||
local env_file="$PWD/.docker-build.env"
|
||||
local current_ports=""
|
||||
local port_list=()
|
||||
local new_ports=()
|
||||
local first_port=""
|
||||
|
||||
if [ ! -f "$env_file" ]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
current_ports="$(awk -F= '/^INVENTAR_HTTP_PORTS=/{print $2; exit}' "$env_file" | tr -d ' ' || true)"
|
||||
if [ -z "$current_ports" ]; then
|
||||
current_ports="$(awk -F= '/^INVENTAR_HTTP_PORT=/{print $2; exit}' "$env_file" | tr -d ' ' || true)"
|
||||
fi
|
||||
|
||||
if [ -z "$current_ports" ]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
IFS=',' read -r -a port_list <<<"${current_ports// /,}"
|
||||
for port in "${port_list[@]}"; do
|
||||
if [ -n "$port" ] && [ "$port" != "$removed_port" ]; then
|
||||
new_ports+=("$port")
|
||||
fi
|
||||
done
|
||||
|
||||
if [ ${#new_ports[@]} -eq 0 ]; then
|
||||
sed -i '/^INVENTAR_HTTP_PORTS=/d;/^INVENTAR_HTTP_PORT=/d' "$env_file"
|
||||
return 0
|
||||
fi
|
||||
|
||||
first_port="${new_ports[0]}"
|
||||
local ports_csv="$(IFS=,; echo "${new_ports[*]}")"
|
||||
|
||||
if grep -q '^INVENTAR_HTTP_PORTS=' "$env_file" 2>/dev/null; then
|
||||
sed -i "s|^INVENTAR_HTTP_PORTS=.*|INVENTAR_HTTP_PORTS=$ports_csv|" "$env_file"
|
||||
else
|
||||
printf '\nINVENTAR_HTTP_PORTS=%s\n' "$ports_csv" >> "$env_file"
|
||||
fi
|
||||
|
||||
if grep -q '^INVENTAR_HTTP_PORT=' "$env_file" 2>/dev/null; then
|
||||
sed -i "s|^INVENTAR_HTTP_PORT=.*|INVENTAR_HTTP_PORT=$first_port|" "$env_file"
|
||||
else
|
||||
printf '\nINVENTAR_HTTP_PORT=%s\n' "$first_port" >> "$env_file"
|
||||
fi
|
||||
}
|
||||
|
||||
if [ -z "${1:-}" ]; then
|
||||
show_help
|
||||
fi
|
||||
|
||||
COMMAND=$1
|
||||
TENANT_ID=$2
|
||||
COMMAND="$1"
|
||||
TENANT_ID="${2:-}"
|
||||
|
||||
case "$COMMAND" in
|
||||
-h|--help)
|
||||
show_help
|
||||
;;
|
||||
add)
|
||||
if [ -z "$TENANT_ID" ]; then
|
||||
echo "Error: Please provide a tenant_id."
|
||||
@@ -86,6 +238,7 @@ case "$COMMAND" in
|
||||
exit 1
|
||||
fi
|
||||
register_tenant_port "$TENANT_ID" "$PORT_ARG"
|
||||
update_runtime_ports "$PORT_ARG"
|
||||
fi
|
||||
|
||||
echo "Adding new tenant '$TENANT_ID'..."
|
||||
@@ -94,11 +247,53 @@ case "$COMMAND" in
|
||||
APP_CONTAINER=$(docker ps -qf "name=app" | head -n 1)
|
||||
if [ -n "$APP_CONTAINER" ]; then
|
||||
docker exec $APP_CONTAINER python3 -c "
|
||||
import sys; sys.path.insert(0, '/app/Web'); import settings; from pymongo import MongoClient; import hashlib
|
||||
import sys, re; sys.path.insert(0, '/app/Web'); import settings; from pymongo import MongoClient; import hashlib
|
||||
tenant_id = sys.argv[1].lower()
|
||||
sanitized = ''.join(c for c in tenant_id if c.isalnum() or c == '_')
|
||||
db_name = f'inventar_{sanitized}'
|
||||
client = MongoClient(settings.MONGODB_HOST, int(settings.MONGODB_PORT))
|
||||
db = client[f'{settings.MONGODB_DB}_{sys.argv[1]}']
|
||||
db = client[db_name]
|
||||
hashed_pw = hashlib.sha512('admin123'.encode()).hexdigest()
|
||||
db.users.insert_one({'Username': 'admin', 'Password': hashed_pw, 'Role': 'admin', 'Name': 'Admin', 'Nachname': 'User'})
|
||||
if db.users.count_documents({'Username': 'admin'}) == 0:
|
||||
db.users.insert_one({
|
||||
'Username': 'admin',
|
||||
'Password': hashed_pw,
|
||||
'Admin': True,
|
||||
'active_ausleihung': None,
|
||||
'name': 'Admin',
|
||||
'last_name': 'User',
|
||||
'IsStudent': False,
|
||||
'PermissionPreset': 'full_access',
|
||||
'ActionPermissions': {
|
||||
'can_borrow': True,
|
||||
'can_insert': True,
|
||||
'can_edit': True,
|
||||
'can_delete': True,
|
||||
'can_manage_users': True,
|
||||
'can_manage_settings': True,
|
||||
'can_view_logs': True,
|
||||
},
|
||||
'PagePermissions': {
|
||||
'home': True,
|
||||
'tutorial_page': True,
|
||||
'my_borrowed_items': True,
|
||||
'notifications_view': True,
|
||||
'impressum': True,
|
||||
'license': True,
|
||||
'library_view': True,
|
||||
'terminplan': True,
|
||||
'home_admin': True,
|
||||
'upload_admin': True,
|
||||
'library_admin': True,
|
||||
'admin_borrowings': True,
|
||||
'library_loans_admin': True,
|
||||
'admin_damaged_items': True,
|
||||
'admin_audit_dashboard': True,
|
||||
'logs': True,
|
||||
'manage_filters': True,
|
||||
'manage_locations': True,
|
||||
},
|
||||
})
|
||||
print(f'Tenant {sys.argv[1]} database initialized. Default admin: admin / admin123')
|
||||
" "$TENANT_ID"
|
||||
echo "Tenant '$TENANT_ID' successfully added. Ready to use."
|
||||
@@ -120,14 +315,28 @@ print(f'Tenant {sys.argv[1]} database initialized. Default admin: admin / admin1
|
||||
APP_CONTAINER=$(docker ps -qf "name=app" | head -n 1)
|
||||
if [ -n "$APP_CONTAINER" ]; then
|
||||
docker exec $APP_CONTAINER python3 -c "
|
||||
import sys; sys.path.insert(0, '/app/Web'); import settings; from pymongo import MongoClient
|
||||
import sys; sys.path.insert(0, '/app/Web'); from tenant import TenantContext; import settings; from pymongo import MongoClient
|
||||
ctx = TenantContext()
|
||||
db_name = ctx._get_db_name(sys.argv[1])
|
||||
client = MongoClient(settings.MONGODB_HOST, int(settings.MONGODB_PORT))
|
||||
client.drop_database(f'{settings.MONGODB_DB}_{sys.argv[1]}')
|
||||
client.drop_database(db_name)
|
||||
print(f'Database for tenant {sys.argv[1]} dropped.')
|
||||
" "$TENANT_ID"
|
||||
echo "Tenant '$TENANT_ID' removed successfully."
|
||||
echo "Tenant '$TENANT_ID' database removed."
|
||||
else
|
||||
echo "Error: Application container not running."
|
||||
echo "Warning: Application container not running. Tenant database may still exist in MongoDB."
|
||||
fi
|
||||
|
||||
port_to_remove=""
|
||||
if port_to_remove="$(remove_tenant_port "$TENANT_ID" 2>/dev/null)"; then
|
||||
if [ -n "$port_to_remove" ]; then
|
||||
remove_runtime_port "$port_to_remove"
|
||||
echo "Removed tenant '$TENANT_ID' from config.json and cleaned runtime port $port_to_remove."
|
||||
else
|
||||
echo "Removed tenant '$TENANT_ID' from config.json. No port mapping was present."
|
||||
fi
|
||||
else
|
||||
echo "Warning: tenant '$TENANT_ID' was not configured in config.json or could not be removed."
|
||||
fi
|
||||
else
|
||||
echo "Removal canceled."
|
||||
@@ -164,17 +373,46 @@ print(f'Tenant {sys.argv[1]} session cache cleared. Tenant restarted.')
|
||||
;;
|
||||
|
||||
list)
|
||||
echo "Listing active tenants (Databases):"
|
||||
echo "Listing configured tenants (config.json):"
|
||||
if [ -f "$CONFIG_FILE" ]; then
|
||||
python3 - "$CONFIG_FILE" <<'PY'
|
||||
import json, sys
|
||||
path = sys.argv[1]
|
||||
with open(path, 'r', encoding='utf-8') as f:
|
||||
cfg = json.load(f)
|
||||
tenants = cfg.get('tenants', {})
|
||||
if isinstance(tenants, dict) and tenants:
|
||||
for tid, conf in tenants.items():
|
||||
port = conf.get('port') if isinstance(conf, dict) else None
|
||||
if port is not None:
|
||||
print(f'- {tid} (port {port})')
|
||||
else:
|
||||
print(f'- {tid}')
|
||||
else:
|
||||
print(' (no tenants configured)')
|
||||
PY
|
||||
else
|
||||
echo " (config.json not found)"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "Listing active tenant databases (MongoDB):"
|
||||
APP_CONTAINER=$(docker ps -qf "name=app" | head -n 1)
|
||||
if [ -n "$APP_CONTAINER" ]; then
|
||||
docker exec $APP_CONTAINER python3 -c "
|
||||
import sys; sys.path.insert(0, '/app/Web'); import settings; from pymongo import MongoClient
|
||||
docker exec -i "$APP_CONTAINER" python3 - <<'PY'
|
||||
import sys
|
||||
sys.path.insert(0, '/app/Web')
|
||||
import settings
|
||||
from pymongo import MongoClient
|
||||
client = MongoClient(settings.MONGODB_HOST, int(settings.MONGODB_PORT))
|
||||
prefix = f'{settings.MONGODB_DB}_'
|
||||
prefix = 'inventar_'
|
||||
dbs = [d for d in client.list_database_names() if d.startswith(prefix)]
|
||||
for db in dbs:
|
||||
print(f'- {db.replace(prefix, \"\")}')
|
||||
"
|
||||
if dbs:
|
||||
for db in dbs:
|
||||
print(f'- {db.replace(prefix, "")}')
|
||||
else:
|
||||
print(' (no tenant databases found)')
|
||||
PY
|
||||
else
|
||||
echo "Error: Application container not running."
|
||||
fi
|
||||
|
||||
+71
-2
@@ -5,6 +5,62 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
|
||||
cd "$SCRIPT_DIR"
|
||||
|
||||
COMPOSE_FILE="docker-compose-multitenant.yml"
|
||||
ENV_FILE="$SCRIPT_DIR/.docker-build.env"
|
||||
RUNTIME_COMPOSE_OVERRIDE_FILE="$SCRIPT_DIR/.docker-compose.runtime.override.yml"
|
||||
|
||||
parse_port_list() {
|
||||
local raw="$1"
|
||||
local port
|
||||
local ports=()
|
||||
raw="${raw//,/ }"
|
||||
for port in $raw; do
|
||||
port="${port//[[:space:]]/}"
|
||||
if [ -n "$port" ] && printf '%s\n' "$port" | grep -qE '^[0-9]+$'; then
|
||||
ports+=("$port")
|
||||
fi
|
||||
done
|
||||
printf '%s\n' "${ports[@]}"
|
||||
}
|
||||
|
||||
write_runtime_override() {
|
||||
local current_ports=""
|
||||
local app_image=""
|
||||
local ports=()
|
||||
|
||||
if [ -f "$ENV_FILE" ]; then
|
||||
app_image="$(awk -F= '/^INVENTAR_APP_IMAGE=/{print $2; exit}' "$ENV_FILE" | tr -d ' ' || true)"
|
||||
current_ports="$(awk -F= '/^INVENTAR_HTTP_PORTS=/{print $2; exit}' "$ENV_FILE" | tr -d ' ' || true)"
|
||||
if [ -z "$current_ports" ]; then
|
||||
current_ports="$(awk -F= '/^INVENTAR_HTTP_PORT=/{print $2; exit}' "$ENV_FILE" | tr -d ' ' || true)"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -n "$app_image" ]; then
|
||||
if [ -n "$current_ports" ]; then
|
||||
mapfile -t ports < <(parse_port_list "$current_ports")
|
||||
fi
|
||||
|
||||
cat > "$RUNTIME_COMPOSE_OVERRIDE_FILE" <<EOF
|
||||
services:
|
||||
app:
|
||||
image: $app_image
|
||||
build: null
|
||||
EOF
|
||||
if [ ${#ports[@]} -gt 1 ]; then
|
||||
cat >> "$RUNTIME_COMPOSE_OVERRIDE_FILE" <<EOF
|
||||
ports:
|
||||
EOF
|
||||
for port in "${ports[@]}"; do
|
||||
cat >> "$RUNTIME_COMPOSE_OVERRIDE_FILE" <<EOF
|
||||
- "$port:8000"
|
||||
EOF
|
||||
done
|
||||
fi
|
||||
else
|
||||
rm -f "$RUNTIME_COMPOSE_OVERRIDE_FILE"
|
||||
fi
|
||||
}
|
||||
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case "$1" in
|
||||
--multitenant)
|
||||
@@ -27,11 +83,24 @@ if ! command -v docker >/dev/null 2>&1; then
|
||||
fi
|
||||
|
||||
echo "Rebuilding and/or restarting app container using $COMPOSE_FILE..."
|
||||
write_runtime_override
|
||||
compose_args=(-f "$COMPOSE_FILE")
|
||||
if [ -f "$RUNTIME_COMPOSE_OVERRIDE_FILE" ]; then
|
||||
compose_args+=( -f "$RUNTIME_COMPOSE_OVERRIDE_FILE" )
|
||||
fi
|
||||
if [ -f "$ENV_FILE" ]; then
|
||||
compose_args+=( --env-file "$ENV_FILE" )
|
||||
fi
|
||||
|
||||
if [ -f "$SCRIPT_DIR/Dockerfile" ]; then
|
||||
docker compose -f "$COMPOSE_FILE" up -d --build app
|
||||
docker compose "${compose_args[@]}" up -d --build app
|
||||
else
|
||||
echo "Warning: Dockerfile not found in $SCRIPT_DIR. Skipping build and restarting existing app container."
|
||||
docker compose -f "$COMPOSE_FILE" up -d --no-build app
|
||||
if ! docker compose "${compose_args[@]}" up -d --no-build app; then
|
||||
echo "Warning: app image not found or not available locally. Attempting docker compose pull app..."
|
||||
docker compose "${compose_args[@]}" pull app
|
||||
docker compose "${compose_args[@]}" up -d --no-build app
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "Cleaning up unused Docker images..."
|
||||
|
||||
@@ -419,6 +419,7 @@ configure_host_ports() {
|
||||
local requested_http
|
||||
local requested_ports
|
||||
local ports=()
|
||||
local occupied_ports=()
|
||||
|
||||
requested_http=""
|
||||
requested_ports=""
|
||||
@@ -442,15 +443,33 @@ configure_host_ports() {
|
||||
if [ ${#ports[@]} -gt 0 ]; then
|
||||
HTTP_PORTS_VALUE="${ports[*]}"
|
||||
HTTP_PORT_VALUE="${ports[0]}"
|
||||
|
||||
for port in "${ports[@]}"; do
|
||||
if port_in_use "$port"; then
|
||||
occupied_ports+=("$port")
|
||||
fi
|
||||
done
|
||||
|
||||
if [ ${#occupied_ports[@]} -gt 0 ]; then
|
||||
if [ ${#ports[@]} -eq 1 ]; then
|
||||
HTTP_PORT_VALUE="$(find_free_port "$DEFAULT_TENANT_PORT_START")"
|
||||
echo "Host port ${ports[0]} is already occupied. Assigned new tenant port: $HTTP_PORT_VALUE"
|
||||
HTTP_PORTS_VALUE="$HTTP_PORT_VALUE"
|
||||
else
|
||||
echo "Error: requested host port(s) already in use: ${occupied_ports[*]}"
|
||||
echo "Remove the occupied port(s) from INVENTAR_HTTP_PORTS or stop the conflicting service."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
else
|
||||
HTTP_PORT_VALUE="$DEFAULT_TENANT_PORT_START"
|
||||
HTTP_PORTS_VALUE="$HTTP_PORT_VALUE"
|
||||
fi
|
||||
|
||||
if port_in_use "$HTTP_PORT_VALUE"; then
|
||||
HTTP_PORT_VALUE="$(find_free_port "$DEFAULT_TENANT_PORT_START")"
|
||||
echo "Host port ${ports[0]:-$DEFAULT_TENANT_PORT_START} is already occupied. Assigned new tenant port: $HTTP_PORT_VALUE"
|
||||
HTTP_PORTS_VALUE="$HTTP_PORT_VALUE"
|
||||
if port_in_use "$HTTP_PORT_VALUE"; then
|
||||
HTTP_PORT_VALUE="$(find_free_port "$DEFAULT_TENANT_PORT_START")"
|
||||
echo "Host port $DEFAULT_TENANT_PORT_START is already occupied. Assigned new tenant port: $HTTP_PORT_VALUE"
|
||||
HTTP_PORTS_VALUE="$HTTP_PORT_VALUE"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user