web-hp-eprint-clone/eprintcloned

191 lines
9.7 KiB
Bash
Executable File

#!/bin/bash
# Check for specified arguments
if [ $# -lt 3 ]
then
echo "Not enough arguments - exiting"
exit 1
fi
# Check if LibreOffice is installed
if type libreoffice &> /dev/null; then
echo "libreoffice is installed" > /dev/null
else
echo "LibreOffice is not installed, install LibreOffice from your package manager on your distro"
exit 1
fi
# Check if Node.js is installed
if type node &> /dev/null; then
echo "node is installed" > /dev/null
else
echo "Node.js is not installed, install Node.js from your package manager on your distro"
exit 1
fi
# Check is there is another NSFW scanning instance active
wait_for_curl_to_finish() {
while pgrep -x "curl" > /dev/null; do
echo "curl is currently running. Waiting..."
sleep 1 # Wait for 1 second before checking again
done
}
# Check is there is another web renderer instance active
wait_for_node_to_finish() {
while pgrep -x "node" > /dev/null; do
echo "node is currently running. Waiting..."
sleep 1 # Wait for 1 second before checking again
done
}
# Check for the lpr command if it's compatible
command_name="lpr"
search_string="lpr - print files"
# Search the man page for the string
if man "$command_name" 2>/dev/null | grep -q "$search_string"; then
echo "$command_name is compatible" > /dev/null
else
echo "Incompatible or not installed lpr program - exiting"
echo "Install the right version of the lpr program or if using a distro which ships older packages like lpr, move to a newer distro which has fresher packages."
exit 1
fi
printer=Deskjet-2600 # replace this with your actual printer name before putting it into /usr/bin
imagelogmsg="Server hoster decided to enable file logging, if you don't wish your file to be logged, ask the server owner to delete your sent file or if you are the server hoster set LOG=nolog in .env file" # specify a custom logging of files message
nsfwscantosmsg="Server hoster enabled NSFW scanning, by sending any images to this instance, you agree to the DeepAI TOS at https://deepai.org/terms-of-service/terms-of-service to scan them." # specify a custom logging of NSFW message
nsfwscantrue="The following image you uploaded is not safe for work. Due to Cloudflare TOS, you cannot send content promoting NSFW"
# check if quality is specified, it it isn't then set the default quality
if [[ " $3 " =~ "" ]]; then
quality="4"
else
pagerange="$3"
fi
# check if page range is specified, if it is 0 or nothing is specified then ignore setting a page range
if [[ " $4 " =~ "0" ]]; then
pagerange=""
else
pagerange="$4"
fi
if [[ " $4 " =~ "" ]]; then
pagerange=""
else
pagerange="$4"
fi
# Loop through each file passed as an argument
for file in "$1"; do
# Get the MIME type of the file
mime_type=$(file --mime-type -b "$file")
# Check if the MIME type is for images, text, PDF files or any Microsoft Office documents and if NSFW scanning is on, check for NSFW presence
if [[ "$mime_type" == image/* || "$mime_type" == application/pdf ]]; then
if [[ $2 == log ]]; then
echo $imagelogmsg
cp "$1" $HOME/imagelog/
echo "Printing image/document"
rm /tmp/response.json
lpr -r -o portrait -o media=A4 -o fit-to-page -o print-quality=$quality $pagerange "$1" -P $printer && exit 0 # if you are using a different printer that requires different commands to print, change this part of the code.
else
echo "Printing image/document"
rm /tmp/repsonse.json
lpr -r -o portrait -o media=A4 -o fit-to-page -o print-quality=$quality $pagerange "$1" -P $printer && exit 0 # if you are using a different printer that requires different commands to print, change this part of the code.
fi
elif [[ "$mime_type" == text/html ]]; then
if [[ $2 == log ]]; then
echo $imagelogmsg
cp "$1" $HOME/imagelog/
echo "Rendering HTML file"
wait_for_node_to_finish
node index.js $1 /tmp/outputweb.png
echo "Printing rendered HTML file"
lpr -o portrait -o media=A4 -o fit-to-page -o print-quality=$quality $pagerange "/tmp/outputweb.png" -P $printer && exit 0 # if you are using a different printer that requires different commands to print, change this part of the code.
else
echo "Rendering HTML file"
wait_for_node_to_finish
node index.js $1 /tmp/outputweb.png
echo "Printing rendered HTML file"
lpr -r -o portrait -o media=A4 -o fit-to-page -o print-quality=$quality $pagerange "/tmp/outputweb.png" -P $printer && exit 0 # if you are using a different printer that requires different commands to print, change this part of the code.
fi
elif [[ "$mime_type" == text/* ]]; then
if [[ $2 == log ]]; then
echo $imagelogmsg
cp "$1" $HOME/imagelog/
ini_file="$1"
# Read the ini file and check for the [htmlrender] section and url variable
if grep -q '^\[htmlrender\]' "$ini_file"; then
# If the header exists, look for the 'url' variable
url=$(awk -F= '/^\[htmlrender\]/ {found=1} found && $1~/^url/ {print $2; exit}' "$ini_file" | xargs)
# Check if url was found
if [ -n "$url" ]; then
echo "HTML render file structure detected, rendering site: $url"
wait_for_node_to_finish
node index.js "$url" "/tmp/outputweb.png"
echo "Printing rendered page"
lpr -o portrait -o media=A4 -o fit-to-page -o print-quality=$quality $pagerange "/tmp/outputweb.png" -P $printer && exit 0 # if you are using a different printer that requires different commands to print, change this part of the code.
else
echo "'url' variable not found in [htmlrender] section of text file, assuming normal text"
fi
else
echo "[htmlrender] section not found in text file, assuming normal text"
fi
echo "Printing text"
lpr -o portrait -o media=A4 -o fit-to-page -o print-quality=$quality $pagerange "$1" -P $printer && exit 0 # if you are using a different printer that requires different commands to print, change this part of the code.
else
ini_file="$1"
# Read the ini file and check for the [htmlrender] section and url variable
if grep -q '^\[htmlrender\]' "$ini_file"; then
# If the header exists, look for the 'url' variable
url=$(awk -F= '/^\[htmlrender\]/ {found=1} found && $1~/^url/ {print $2; exit}' "$ini_file" | xargs)
# Check if url was found
if [ -n "$url" ]; then
echo "HTML render file structure detected, rendering site: $url"
wait_for_node_to_finish
node index.js "$url" "/tmp/outputweb.png"
echo "Printing rendered page"
lpr -o portrait -o media=A4 -o fit-to-page -o print-quality=$quality $pagerange "/tmp/outputweb.png" -P $printer && exit 0 # if you are using a different printer that requires different commands to print, change this part of the code.
else
echo "'url' variable not found in [htmlrender] section of text file, assuming normal text"
fi
else
echo "[htmlrender] section not found in text file, assuming normal text"
fi
echo "Printing text"
lpr -r -o portrait -o media=A4 -o fit-to-page -o print-quality=$quality $pagerange "$1" -P $printer && exit 0 # if you are using a different printer that requires different commands to print, change this part of the code.
fi
elif [[ "$mime_type" == application/msword || "$mime_type" == application/vnd.openxmlformats-officedocument.wordprocessingml.document || "$mime_type" == application/vnd.ms-powerpoint || "$mime_type" == application/vnd.openxmlformats-officedocument.presentationml.presentation || "$mime_type" == application/vnd.ms-excel || "$mime_type" == application/vnd.openxmlformats-officedocument.spreadsheetml.sheet ]]; then
if [[ $2 == log ]]; then
echo $imagelogmsg
cp "$1" $HOME/imagelog/
echo "Converting Microsoft Office file format to .pdf"
filename=$(basename "$1")
extensionless="${filename%.*}"
echo "converted file is "$extensionless
libreoffice --headless --convert-to pdf "$1" --outdir "/tmp/$extensionless" || bash -c 'echo "Conversion failed, try again later" && exit 1'
echo "Printing .pdf converted Microsoft Office file"
lpr -o portrait -o media=A4 -o fit-to-page -o print-quality=$quality $pagerange "/tmp/$extensionless.pdf" -P $printer # if you are using a different printer that requires different commands to print, change this part of the code.
rm "/tmp/$extensionless/$extensionless.pdf" && exit 0
else
echo "Converting Microsoft Office file format to .pdf"
filename=$(basename "$1")
extensionless="${filename%.*}"
echo "converted file is "$extensionless
libreoffice --headless --convert-to pdf "$1" --outdir "/tmp/$extensionless" || bash -c 'echo "Conversion failed, try again later" && exit 1'
echo "Printing .pdf converted Microsoft Office file"
lpr -o portrait -o media=A4 -o fit-to-page -o print-quality=$quality $pagerange "/tmp/$extensionless.pdf" -P $printer # if you are using a different printer that requires different commands to print, change this part of the code.
rm "/tmp/$extensionless/$extensionless.pdf" && exit 0
fi
else
echo "Error: Invalid file type or, ePrint clone only accepts the following MIME types: text/*, image/*, application/pdf, application/msword, application/vnd.ms-*, application/vnd.openxmlformats-officedocument*, text/html"
exit 1
fi
done