parent
3dbe1486bd
commit
a269e1966a
@ -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 <sagedev@leaflesstree.com>" |
||||||
|
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 |
Loading…
Reference in new issue