{ pkgs, lib, config, specialArgs, options, modulesPath, ... }: with pkgs; let pastebin = (writeShellApplication { name = "pb"; runtimeInputs = [ curl ]; text = '' #!/bin/sh # init variables version="v2020.10.27" ENDPOINT="https://stp.cx" flag_options=":hvcufe:s::" flag_version=0 flag_help=0 flag_file=0 flag_url=0 flag_colors=0 flag_ext=0 data="" EXT="" # help message available via func show_help() { cat > /dev/stdout << END pb [options] filename or (command-with-stdout) | pb Uploads a file or data to steph's 0x0 paste bin OPTIONAL FLAGS: -h Show this help -v Show current version number -f Explicitly interpret stdin as filename -c Pretty color output -u Shorten URL -s server_address Use alternative pastebin server address -e bin_extension Specify a binary file extension used in the upload END } show_usage() { cat > /dev/stdout << END usage: pb [-hfvcux] [-s server_address] filename END } # helper for program exit, supports error codes and messages die () { msg="$1" code="$2" # exit code defaults to 1 if printf "%s" "''${code}" | grep -q '^[0-9]+$'; then code=1 fi # output message to stdout or stderr based on code if [ -n "''${msg}" ]; then if [ "''${code}" -eq 0 ]; then printf "%s\\n" "''${msg}" else printf "%s%s%s\\n" "$ERROR" "''${msg}" "$RESET" >&2 fi fi exit "''${code}" } # attempt to parse options or die if ! parsed=$(getopt ''${flag_options} "$@"); then printf "pb: unknown option\\n" show_usage exit 2 fi # handle options eval set -- "''${parsed}" while true; do case "$1" in -h|?) flag_help=1 ;; -v) flag_version=1 ;; -c) flag_colors=1 ;; -f) flag_file=1 ;; -e) shift flag_ext=1 EXT="$1" ;; -s) shift ENDPOINT="$1" ;; -u) flag_url=1 ;; --) shift break ;; *) die "Internal error: $1" 3 ;; esac shift done # display current version if [ ''${flag_version} -gt 0 ]; then printf "%s\\n" "''${version}" die "" 0 fi # display help if [ ''${flag_help} -gt 0 ]; then show_help die "" 0 fi # is not interactive shell, use stdin if [ -t 0 ]; then flag_file=1 else if [ ''${flag_ext} -gt 0 ]; then # short-circuit stdin access to ensure binary data is transferred to curl curl -sF"file=@-;filename=null.''${EXT}" "''${ENDPOINT}" < /dev/stdin exit 0 else data="$(cat < /dev/stdin )" fi fi # if data variable is empty (not a pipe) use params as fallback if [ -z "$data" ]; then data="$*" fi # Colors if [ ''${flag_colors} -gt 0 ]; then SUCCESS=$(tput setaf 190) ERROR=$(tput setaf 196) RESET=$(tput sgr0) else SUCCESS="" ERROR="" RESET="" fi # URL shortening reference # If URL mode detected, process URL shortener and end processing without # checking for a file to upload to the pastebin if [ ''${flag_url} -gt 0 ]; then if [ -z "''${data}" ]; then # if no data # print error message printf "%sProvide URL to shorten%s\\n" "$ERROR" "$RESET" else # shorten URL and print results result=$(curl -sF"shorten=''${data}" "''${ENDPOINT}") printf "%s%s%s\\n" "$SUCCESS" "$result" "$RESET" fi die "" 0 fi if [ ''${flag_file} -gt 0 ]; then # file mode if [ -z "''${data}" ]; then # if no data # print error message printf "%sProvide data to upload%s\\n" "$ERROR" "$RESET" elif [ ! -f "''${data}" ]; then # file not found with name provided # print error messagse printf "%s%s%s\\tFile not found.%s\\n" "$RESET" "''${data}" "$ERROR" "$RESET" # attempt to split data string (multi-line?) and upload each string as file for f in ''${data}; do # if there's nothing to parse, skip this loop if [ "$f" = "$data" ]; then break; fi # check if file exists if [ -f "''${f}" ]; then if [ ''${flag_ext} -gt 0 ]; then # send file to endpoint masked with new extension result=$(curl -sF"file=@''${f};filename=null.''${EXT}" "''${ENDPOINT}") else # send file to endpoint result=$(curl -sF"file=@''${f}" "''${ENDPOINT}") fi printf "%s%s%s\\n" "$SUCCESS" "$result" "$RESET" else # print error message printf "%sFile not found.%s\\n" "$ERROR" "$RESET" fi done else # data available in file # send file to endpoint result=$(curl -sF"file=@''${data}" "''${ENDPOINT}") printf "%s%s%s\\n" "$SUCCESS" "$result" "$RESET" fi else # non-file mode if [ -z "''${data}" ]; then # if no data # print error message printf "%sNo data found for upload. Please try again.%s\\n" "$ERROR" "$RESET" else # data available # send data to endpoint result=$(printf "%s" "''${data}" | curl -sF"file=@-;filename=null.txt" "''${ENDPOINT}") printf "%s%s%s\\n" "$SUCCESS" "$result" "$RESET" fi fi ''; }); in { home.packages = [ pastebin ]; }