#!/bin/sh

# Copyright (c) 2018 - 2023 Jolla Ltd.
#
# License: Jolla Proprietary

INSTANCE_NAME=$1
if [ -n "$INSTANCE_NAME" ]; then
    CONFIG_INSTANCE="--instance $INSTANCE_NAME"
fi

if [ -z "$CONTAINER_SERVICE" ]; then
    CONTAINER_SERVICE="$(appsupport-config --prepare-name $CONFIG_INSTANCE)"
fi

if systemctl is-active --quiet $CONTAINER_SERVICE; then
    # Service already running, no need to prepare anything.
    exit 0
fi

if [ -z "$INSTANCE_NAME" ]; then
    INSTANCE_NAME="default"
fi

BASE_INSTALL_PATH="$(appsupport-config --base)"
BASE_CONFIG_PATH="$(appsupport-config --baseconf)"
LXC_CONFIG_PATH="$(appsupport-config --lxc-path)"
CONTAINER_CONFIG_PATH="$(appsupport-config $CONFIG_INSTANCE --path)"
CONTAINER_CONFIG_AGGREGATE_FILE="$(appsupport-config $CONFIG_INSTANCE --config)"
GENERATE_CONFIG="$(appsupport-config --generate)"
APPSUPPORT_USER="$(appsupport-config --user)"
APPSUPPORT_USER_UID=$(getent passwd $APPSUPPORT_USER | cut -d: -f3)
APPSUPPORT_USER_HOME=$(getent passwd $APPSUPPORT_USER | cut -d: -f6)
# This is unrelated to APPSUPPORT_USER_UID
if [ "$(appsupport-config --get-prop ro.alien.unprivileged)" = "1" ]; then
    PRIVILEGED=0
    APPSUPPORT_BASE_UID=$(appsupport-config --get-prop ro.alien.unprivileged_uid)
else
    PRIVILEGED=1
    APPSUPPORT_BASE_UID=0
fi

if [ -d "$CONTAINER_CONFIG_PATH" ]; then
    rm -r "$CONTAINER_CONFIG_PATH"
fi
mkdir -p "$CONTAINER_CONFIG_PATH"

# Generate configuration which is used later
APPSUPPORT_CONFIG_PATH="$CONTAINER_CONFIG_PATH/config.d"
mkdir -p "$APPSUPPORT_CONFIG_PATH"

CONFIG_PATHS="$(appsupport-config --allconf)"

$GENERATE_CONFIG --configs "$CONFIG_PATHS" --type config --user-id "$APPSUPPORT_USER_UID" --instance "$INSTANCE_NAME" --base-uid "$APPSUPPORT_BASE_UID" "$APPSUPPORT_CONFIG_PATH/appsupport.conf" || exit 32

APPSUPPORT_GENERATE_CONFIG="$GENERATE_CONFIG --config $APPSUPPORT_CONFIG_PATH"
APPSUPPORT_PARSE_CONFIG="$(appsupport-config --parse) --config $APPSUPPORT_CONFIG_PATH"

ANDROID_DATA_ROOT="$($APPSUPPORT_PARSE_CONFIG --key DataRoot)"
CONTROL_FILE_PATH="$CONTAINER_CONFIG_PATH/control"
ROOTFS_PATH="$($APPSUPPORT_PARSE_CONFIG --key RootFsPath)"
SYSTEM_IMAGE_PATH="$($APPSUPPORT_PARSE_CONFIG --key SystemImagePath)"

export CONTAINER_CONFIG_PATH="$CONTAINER_CONFIG_PATH"
source "$BASE_INSTALL_PATH/init/appsupport-common"

# ensure this dir exists because we need to mount it for sdcards
mkdir -p /run/media/$APPSUPPORT_USER
chown $APPSUPPORT_USER:$APPSUPPORT_USER /run/media/$APPSUPPORT_USER

# Export common variables during init

appsupport_init_export APPSUPPORT_API="\"$BASE_INSTALL_PATH/init/appsupport-common\""
appsupport_init_export INSTANCE_NAME="\"$INSTANCE_NAME\""
appsupport_init_export CONFIG_INSTANCE="\"$CONFIG_INSTANCE\""
appsupport_init_export APPSUPPORT_GENERATE_CONFIG="\"$APPSUPPORT_GENERATE_CONFIG\""
appsupport_init_export APPSUPPORT_PARSE_CONFIG="\"$APPSUPPORT_PARSE_CONFIG\""
appsupport_init_export BASE_INSTALL_PATH="\"$BASE_INSTALL_PATH\""
appsupport_init_export BASE_CONFIG_PATH="\"$BASE_CONFIG_PATH\""
appsupport_init_export LXC_CONFIG_PATH="\"$LXC_CONFIG_PATH\""
appsupport_init_export CONTAINER_CONFIG_PATH="\"$CONTAINER_CONFIG_PATH\""
appsupport_init_export APPSUPPORT_USER="\"$APPSUPPORT_USER\""
appsupport_init_export PRIVILEGED=$PRIVILEGED
appsupport_init_export APPSUPPORT_BASE_UID=$APPSUPPORT_BASE_UID
appsupport_init_export APPSUPPORT_USER_UID=$APPSUPPORT_USER_UID
appsupport_init_export APPSUPPORT_USER_HOME="\"$APPSUPPORT_USER_HOME\""
appsupport_init_export ANDROID_DATA_ROOT="\"$ANDROID_DATA_ROOT\""
appsupport_init_export ANDROID_DATA="$ANDROID_DATA_ROOT/data"
appsupport_init_export CONTROL_FILE_PATH="\"$CONTROL_FILE_PATH\""
appsupport_init_export ROOTFS_PATH="\"$ROOTFS_PATH\""
appsupport_init_export SYSTEM_IMAGE_PATH="\"$SYSTEM_IMAGE_PATH\""

# Data storage locations
mkdir -p $ANDROID_DATA_ROOT/data/media/0
chown $APPSUPPORT_BASE_UID:$APPSUPPORT_BASE_UID $ANDROID_DATA_ROOT

appsupport_run_hook_scripts "prepare-hook.d"

# This needs to be after all the config generation scripts have run
for CONFIG_FILE in $(ls -1 $CONTAINER_CONFIG_PATH/*_config | sort); do
    echo "lxc.include = $CONFIG_FILE" >> $CONTAINER_CONFIG_AGGREGATE_FILE
done

# Make sure unprivileged user has access to init variables as well
chown -R $APPSUPPORT_BASE_UID:$APPSUPPORT_USER_UID "$CONTAINER_CONFIG_PATH"
chmod 750 "$CONTAINER_CONFIG_PATH"
chmod 640 "$CONTAINER_CONFIG_PATH"/*
chmod 750 "$APPSUPPORT_CONFIG_PATH"
chmod 640 "$APPSUPPORT_CONFIG_PATH"/*

## Limit permission of the conf files to owner and group
chmod o-rwx $CONTAINER_CONFIG_PATH

if [ ! -e $CONTROL_FILE_PATH ]; then
    mkfifo -m 660 $CONTROL_FILE_PATH
fi
if [ $PRIVILEGED -eq 0 ]; then
    chown $APPSUPPORT_USER:appsupport-root $CONTROL_FILE_PATH
fi

(
    CONTROL_CODE="$(cat $CONTROL_FILE_PATH)"

    if [ "$CONTROL_CODE" = "ok" ]; then
        appsupport_run_hook_scripts "prepare-post-hook.d"
    else
        echo "Control code: $CONTROL_CODE"
    fi

    rm -f "$CONTROL_FILE_PATH"
) &

exit 0

