From a269e1966af1d551cc9fb53270f3c7b92ec886e6 Mon Sep 17 00:00:00 2001 From: keyboardsage Date: Sun, 23 Apr 2023 16:37:38 -0400 Subject: [PATCH] Added a script that generates a .deb file --- internal_dev/debmaker.sh | 166 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 166 insertions(+) create mode 100755 internal_dev/debmaker.sh diff --git a/internal_dev/debmaker.sh b/internal_dev/debmaker.sh new file mode 100755 index 0000000..c469a5d --- /dev/null +++ b/internal_dev/debmaker.sh @@ -0,0 +1,166 @@ +#!/bin/env bash +############################################################################### +# Purpose: The purpose of this script is to simply generate a .deb file. +# Once the .deb file is generated a copy is moved to /tmp. +# +# It can be installed and uninstalled like so: +# $ sudo apt -y install ./chatgpt-shell-cli_0.0.1_all.deb +# $ sudo apt -y remove chatgpt-shell-cli +############################################################################### + +# Functions +make_directory() { + local filepath="$1" + local shouldRemake=$2 + + if [ $shouldRemake -ne 0 ]; then # delete old directory first if desired + rm -rf "$filepath" + fi + + mkdir -p "$filepath" +} + +add_installation_files() { + local ABSOLUTE_INSTALL_DIRECTORY="$1" + local PROGRAM_NAME="$2" + local ARCHITECTURE="$3" + local PROGRAM_FILEPATH="${ABSOLUTE_INSTALL_DIRECTORY}/${PROGRAM_NAME,,}" + + # Place the files in the directory based on the architecture + #curl -sS https://raw.githubusercontent.com/0xacx/chatGPT-shell-cli/main/chatgpt.sh -o "$PROGRAM_FILEPATH" + cp ../chatgpt.sh "$PROGRAM_FILEPATH" + + # Configure open image command with xdg-open for Linux systems (copied from install.sh) + if [[ "$OSTYPE" == "linux"* ]] || [[ "$OSTYPE" == "freebsd"* ]]; then + sed -i 's/open "${image_url}"/xdg-open "${image_url}"/g' "$PROGRAM_FILEPATH" + fi +} + +set_attributes() { + local STARTING_DIRECTORY="$1" + local IN_DEB_PROGRAM_NAME="$2" + + find "${STARTING_DIRECTORY}" -type d -exec chmod 0755 {} \; # set all dirs + find "${STARTING_DIRECTORY}" -type f -exec chmod 0644 {} \; # set all files + find "${STARTING_DIRECTORY}" -name "${IN_DEB_PROGRAM_NAME}" -type f -exec chmod 0755 {} \; # set executable + find "${STARTING_DIRECTORY}" -name "postinst" -type f -exec chmod 0755 {} \; # set postinst +} + +add_control_file () { + local CONTROL_FILE="$1" + +SECTION="utils" +DEPENDS="curl (>= 7.68), jq (>= 1.6)" # HELPFUL: Use `$ dpkg-query -W -f='${VERSION}\n' depNameHere` to find version info +MAINTAINER="Alwyn \"KeyboardSage\" Berkeley " +HOMEPAGE="https://gptshell.cc" +DESCRIPTION="A simple, lightweight shell script to use OpenAI's chatGPT and + DALL-E from the terminal without installing python or node.js." +cat << EOF > "$CONTROL_FILE" +Package: $PACKAGE_NAME +Version: $PROGRAM_VERSION +Architecture: $ARCHITECTURES +Section: $SECTION +Essential: no +Priority: optional +Depends: $DEPENDS +Maintainer: $MAINTAINER +Homepage: $HOMEPAGE +Description: $DESCRIPTION +EOF +} + +add_postinst_file () { + local POSTINST="$1" + ALIAS_NAME="chatgpt.sh" + +cat << EOF > "$POSTINST" +#!/bin/env bash + +# only continue if the file exists +if [ -f "/usr/bin/${PACKAGE_NAME}" ]; then + +echo "File /usr/bin/${PACKAGE_NAME} exists." + + # Make Alias (no sudo, already running as root) + ln -s /usr/bin/${PACKAGE_NAME} /usr/bin/${ALIAS_NAME} + + # Show user message + echo "Installed $PACKAGE_NAME script to /usr/bin/${PACKAGE_NAME}" + echo "The OPENAI_KEY environment variable containing your key is necessary for the script to function." + echo -e "Add the line below to your shell profile with a valid key:\n" + echo "export OPENAI_KEY=\"your_key_here\"" + echo -e "\nIf needed, detailed instructions are available:\nhttps://github.com/0xacx/chatGPT-shell-cli/tree/main#manual-installation" + +fi + +exit 0 +EOF +} + +# Main +cd `dirname $0` # Run from the directory that stores the script + +# Remove the old .debs if there are any +PROGRAM_NAME="chatGPT-shell-cli" +PACKAGE_NAME="${PROGRAM_NAME,,}" +rm -f "${PACKAGE_NAME}*.deb" >/dev/null +sudo rm -f "/tmp/${PACKAGE_NAME}.deb" >/dev/null + +# Stage directory +RELATIVE_STAGING_DIR="./debpkgs" +ABSOLUTE_STAGING_DIR=$(readlink --canonicalize "${RELATIVE_STAGING_DIR}") +make_directory "$ABSOLUTE_STAGING_DIR" 1 # remake staging directory + +# Architectures +ABSOLUTE_ARCH_DIRECTORIES=() + +PROGRAM_VERSION="0.0.1" # No versioning at the moment, 0.0.1 is a placeholder +ARCHITECTURES="all" +for arch in `echo $ARCHITECTURES`; do + architectureDirectory="${ABSOLUTE_STAGING_DIR}/${PACKAGE_NAME}_${PROGRAM_VERSION}_${arch}" + make_directory "$architectureDirectory" 0 + ABSOLUTE_ARCH_DIRECTORIES+=("$architectureDirectory") +done + +# Installation Directories and Installation Files +INSTALL_DIRECTORIES=("/usr/bin") +for (( i=0; i<${#ABSOLUTE_ARCH_DIRECTORIES[@]}; i++ )); do # For each arch directory... + for dir in "${INSTALL_DIRECTORIES[@]}"; do + # Create the install directories needed... + installDirectory="${ABSOLUTE_ARCH_DIRECTORIES[i]}${dir}" + make_directory "$installDirectory" 0 + # DEBUG: echo "Architecture directory $((i+1)): ${ABSOLUTE_ARCH_DIRECTORIES[i]} processed and now has $installDirectory" + + # Create the installation file(s) needed based on the install directory + add_installation_files "$installDirectory" "$PROGRAM_NAME" "${ABSOLUTE_ARCH_DIRECTORIES[i]##*_}" + done +done + +# For each architecture directory make the... +for (( i=0; i<${#ABSOLUTE_ARCH_DIRECTORIES[@]}; i++ )); do + # ...DEBIAN directory + ABSOLUTE_DEBIAN_DIR="${ABSOLUTE_ARCH_DIRECTORIES[i]}/DEBIAN" + make_directory "${ABSOLUTE_DEBIAN_DIR}" 0 + + # ...Post installation file + add_postinst_file "${ABSOLUTE_DEBIAN_DIR}/postinst" + + # ...Control file + add_control_file "${ABSOLUTE_DEBIAN_DIR}/control" + + # ...then measure the staged size of the package and add that to the control file + STAGING_SIZE_IN_KB="$(du -s ${ABSOLUTE_ARCH_DIRECTORIES[i]} | awk '{print $1;}')" + echo "Installed-Size: ${STAGING_SIZE_IN_KB}" >> "${ABSOLUTE_DEBIAN_DIR}/control" +done + +# Ensure proper file attributes on all files for all architectures +set_attributes "${ABSOLUTE_STAGING_DIR}" "${PROGRAM_NAME,,}" + +# Build +for (( i=0; i<${#ABSOLUTE_ARCH_DIRECTORIES[@]}; i++ )); do + PROGRAM_ARCH="${ABSOLUTE_ARCH_DIRECTORIES[i]##*_}" + DEB_FILENAME="${PACKAGE_NAME}_${PROGRAM_VERSION}_${PROGRAM_ARCH}.deb" + dpkg-deb --root-owner-group --build "${ABSOLUTE_ARCH_DIRECTORIES[i]}" "$DEB_FILENAME" + chmod 644 "$DEB_FILENAME" + sudo cp "$DEB_FILENAME" /tmp # Copied to /tmp for testing since apt is not allowed to access /home/* +done \ No newline at end of file