diff --git a/aps.sh b/aps.sh new file mode 100644 index 0000000..4bd8c31 --- /dev/null +++ b/aps.sh @@ -0,0 +1,220 @@ +#!/bin/sh + +AL_TEMP_LOCATION="/tmp" +AL_INSTALL_ROOT="/tmp/alroot" +AL_INSTALLED_PKG_DATABASE="${AL_INSTALL_ROOT}/var/aps/installed" +AL_LOCAL_PKG_DATABASE="${AL_INSTALL_ROOT}/var/aps/repos" + +# Repo config +official="https://git.hippoz.xyz/alnux/repo" + +set_default_package_config_values() { + AL_PKG_CONFIG_DEPLOY=true + AL_PKG_CONFIG_VER="0.1" + AL_PKG_CONFIG_NAME="alnuxpackage" + AL_PKG_CONFIG_MAKEDEPENDS="" + AL_PKG_CONFIG_DEPENDS="" +} + +unset_config_values() { + unset AL_PKG_CONFIG_DEPLOY + unset AL_PKG_CONFIG_VER + unset AL_PKG_CONFIG_NAME + unset AL_PKG_CONFIG_MAKEDEPENDS + unset AL_PKG_CONFIG_DEPENDS +} + +load_installed_pkg_config() { + echo ":: Looking up package ${1} in local installed packages..." + set_default_package_config_values + if [ -d "${AL_INSTALLED_PKG_DATABASE}/${1}" ]; then + echo ":: Package ${1} was found, loading config..." + AL_PKG_NAME=${1} + AL_PKG_PACKAGE_PATH="${AL_INSTALLED_PKG_DATABASE}/${1}" + run_package_script "package" + else + echo "[E] Package ${1} was not found in the local installed package database, exiting..." + exit 1 + fi +} + +extract_package() { + echo "[*] Copying package ${1} into temporary location ${AL_TEMP_LOCATION}..." + #tar -xf "${1}" -C "${AL_TEMP_LOCATION}" + cp -prv "${1}" "${AL_TEMP_LOCATION}" + AL_PKG_NAME="${1%/}" + AL_PKG_NAME="${AL_PKG_NAME##*/}" + AL_PKG_NAME=$(echo "${AL_PKG_NAME}" | cut -f 1 -d '.') + cd "${AL_INSTALL_ROOT}" + + AL_PKG_PACKAGE_PATH="${AL_TEMP_LOCATION}/${AL_PKG_NAME}" + + set_default_package_config_values +} + +add_package_to_database() { + if [ ! -d "${AL_INSTALLED_PKG_DATABASE}" ]; then + echo "[*] Package database folder not found, creating..." + mkdir -pv "${AL_INSTALLED_PKG_DATABASE}" + fi + + if [ -x "${AL_PKG_PACKAGE_PATH}/package" ]; then + echo ":: Adding target ${AL_PKG_NAME} to installed package database..." + if [ ! -d "${AL_INSTALLED_PKG_DATABASE}/${AL_PKG_NAME}" ]; then + echo "[*] Package folder for ${AL_PKG_NAME} not found, creating..." + mkdir "${AL_INSTALLED_PKG_DATABASE}/${AL_PKG_NAME}" + fi + cp -pv "${AL_PKG_PACKAGE_PATH}/package" "${AL_INSTALLED_PKG_DATABASE}/${AL_PKG_NAME}/package" + if [ -e "${AL_TEMP_LOCATION}/${AL_PKG_NAME}-payloadfiles" ]; then + cp -pv "${AL_TEMP_LOCATION}/${AL_PKG_NAME}-payloadfiles" "${AL_INSTALLED_PKG_DATABASE}/${AL_PKG_NAME}/payloadfiles" + fi + else + echo "[*] Target ${AL_PKG_NAME} does not have a package script and will not be added to the installed package database" + fi +} + +run_package_script() { + if [ -x "${AL_PKG_PACKAGE_PATH}/${1}" ]; then + echo ":: Running ${1} script for target ${AL_PKG_NAME}..." + . "${AL_PKG_PACKAGE_PATH}/${1}" + fi +} + +deploy_package_payload() { + if [ "${AL_PKG_CONFIG_DEPLOY}" = true ]; then + echo ":: Deploying target ${AL_PKG_NAME}..." + cp -rpv "${AL_PKG_PACKAGE_PATH}/payload"/* "${AL_INSTALL_ROOT}" > "${AL_TEMP_LOCATION}/${AL_PKG_NAME}-payloaddeploylog" + sed 's/^.*-> //' "${AL_TEMP_LOCATION}/${AL_PKG_NAME}-payloaddeploylog" | tr -d \'\" > "${AL_TEMP_LOCATION}/${AL_PKG_NAME}-payloadfiles" + rm "${AL_TEMP_LOCATION}/${AL_PKG_NAME}-payloaddeploylog" + fi +} + +install_extracted_package() { + run_package_script "package" + run_package_script "build" + run_package_script "predeploy" + deploy_package_payload + run_package_script "postdeploy" + + echo "[*] Install complete for target ${AL_PKG_NAME}" +} + +extract_cleanup() { + echo "[*] Cleaning up after target ${AL_PKG_NAME}..." + rm -rv "${AL_PKG_PACKAGE_PATH}" + rm -v "${AL_TEMP_LOCATION}/${AL_PKG_NAME}-payloadfiles" + + unset AL_PKG_PACKAGE_PATH + unset AL_PKG_NAME + + unset_config_values + + cd "${AL_INSTALL_ROOT}" +} + +install_local_package() { + if [ ! -e "${1}" ]; then + echo "[E] File ${1} does not exist, exiting..." + exit 1 + fi + + extract_package "${1}" + install_extracted_package + add_package_to_database + extract_cleanup +} + +remove_local_package() { + load_installed_pkg_config "${1}" + PAYLOADFILES_PATH="${AL_PKG_PACKAGE_PATH}/payloadfiles" + + if [ ! -e "${PAYLOADFILES_PATH}" ]; then + echo "[E] Package ${1} does not have a payloadfiles file. Exiting..." + exit 0 + fi + + echo ":: Removing target ${1}..." + + rm -rv $(<${PAYLOADFILES_PATH}) + rm -rv ${AL_PKG_PACKAGE_PATH} + + echo "[*] Removal complete for target ${AL_PKG_NAME}" +} + +sync_local_repo_database() { + echo ":: Syncing local database for repo ${1}..." + if [ ! -d "${AL_LOCAL_PKG_DATABASE}/${1}" ]; then + echo ":: Local database for repo ${1} does not exist, cloning..." + git clone "${2}" "${AL_LOCAL_PKG_DATABASE}/${1}" + else + echo ":: Local database for repo ${1} exists, updating..." + cd "${AL_LOCAL_PKG_DATABASE}/${1}" + git pull + fi +} + +install_package_from_repo() { # NOTE(hippoz): This can get a tad confusing... ${1} is the repo and ${2} is the package + echo ":: Installing package ${2} from ${1} repo" + if [ ! -d "${AL_LOCAL_PKG_DATABASE}/${1}/${2}" ]; then + echo "[E] Package ${2} was not found in ${1}, exiting..." + exit 1 + else + install_local_package "${AL_LOCAL_PKG_DATABASE}/${1}/${2}" + fi +} + +upgrade() { + echo ":: Upgrading installed packages..." + unset_config_values + cd "${AL_INSTALLED_PKG_DATABASE}" + for pkg in */; do + INSTALLED_PKG_PATH="${AL_INSTALLED_PKG_DATABASE}/${pkg}" + . ${INSTALLED_PKG_PATH}/package + AL_PKG_NAME="${INSTALLED_PKG_PATH%/}" + AL_PKG_NAME="${AL_PKG_NAME##*/}" + + ALREADY_INSTALLED_VERSION=${AL_PKG_CONFIG_VER} + + if [ ! -d "${AL_LOCAL_PKG_DATABASE}/${1}/${AL_PKG_NAME}" ]; then + echo "[E] Package ${AL_PKG_NAME} was not found in ${1}, exiting..." + exit 1 + else + . "${AL_LOCAL_PKG_DATABASE}/${1}/${AL_PKG_NAME}/package" + fi + + if [ ! "${ALREADY_INSTALLED_VERSION}" = "${AL_PKG_CONFIG_VER}" ]; then + echo ":: Package ${AL_PKG_NAME} is out of date, updating..." + install_package_from_repo "${1}" "${AL_PKG_NAME}" + fi + + unset_config_values + done +} + +main() { + case ${1} in + install) + install_local_package "${2}" + ;; + remove) + remove_local_package "${2}" + ;; + sync) + sync_local_repo_database "official" ${official} + if [ -z "${2}" ]; then + echo "[*] No targets specified." + else + install_package_from_repo "official" "${2}" + fi + ;; + upgrade) + upgrade "official" + ;; + *) + echo "[E] Invalid option ${1}, exiting..." + exit 0 + ;; + esac +} + +main "${1}" "${2}" \ No newline at end of file