#!/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