From 835b994969c90a3caa40bc43fae8d71e1bfbca56 Mon Sep 17 00:00:00 2001 From: Toby Vincent Date: Tue, 29 Mar 2022 15:33:22 -0500 Subject: refactor: moved scripts out of $HOME --- scripts/.local/bin/discord-relay.sh | 2 + scripts/.local/bin/git-split.sh | 208 +++++++++++++++++++++++++++++++ scripts/.local/bin/gpg-test.sh | 102 ++++++++++++++++ scripts/.local/bin/init-git.sh | 193 +++++++++++++++++++++++++++++ scripts/.local/bin/init-latex.sh | 11 ++ scripts/.local/bin/install-crate.sh | 235 ++++++++++++++++++++++++++++++++++++ scripts/.local/bin/mega-dl.sh | 121 +++++++++++++++++++ scripts/.local/bin/mkln.sh | 115 ++++++++++++++++++ scripts/.local/bin/socket-relay.sh | 217 +++++++++++++++++++++++++++++++++ scripts/.local/bin/td.sh | 151 +++++++++++++++++++++++ scripts/.scripts/discord-relay.sh | 2 - scripts/.scripts/git-split.sh | 208 ------------------------------- scripts/.scripts/gpg-test.sh | 102 ---------------- scripts/.scripts/init-git.sh | 193 ----------------------------- scripts/.scripts/init-latex.sh | 11 -- scripts/.scripts/install-crate.sh | 235 ------------------------------------ scripts/.scripts/mega-dl.sh | 121 ------------------- scripts/.scripts/mkln.sh | 115 ------------------ scripts/.scripts/socket-relay.sh | 217 --------------------------------- scripts/.scripts/td.sh | 151 ----------------------- 20 files changed, 1355 insertions(+), 1355 deletions(-) create mode 100755 scripts/.local/bin/discord-relay.sh create mode 100755 scripts/.local/bin/git-split.sh create mode 100644 scripts/.local/bin/gpg-test.sh create mode 100755 scripts/.local/bin/init-git.sh create mode 100755 scripts/.local/bin/init-latex.sh create mode 100755 scripts/.local/bin/install-crate.sh create mode 100755 scripts/.local/bin/mega-dl.sh create mode 100755 scripts/.local/bin/mkln.sh create mode 100755 scripts/.local/bin/socket-relay.sh create mode 100755 scripts/.local/bin/td.sh delete mode 100755 scripts/.scripts/discord-relay.sh delete mode 100755 scripts/.scripts/git-split.sh delete mode 100644 scripts/.scripts/gpg-test.sh delete mode 100755 scripts/.scripts/init-git.sh delete mode 100755 scripts/.scripts/init-latex.sh delete mode 100755 scripts/.scripts/install-crate.sh delete mode 100755 scripts/.scripts/mega-dl.sh delete mode 100755 scripts/.scripts/mkln.sh delete mode 100755 scripts/.scripts/socket-relay.sh delete mode 100755 scripts/.scripts/td.sh (limited to 'scripts') diff --git a/scripts/.local/bin/discord-relay.sh b/scripts/.local/bin/discord-relay.sh new file mode 100755 index 0000000..3932908 --- /dev/null +++ b/scripts/.local/bin/discord-relay.sh @@ -0,0 +1,2 @@ +#!/bin/sh +exec socat UNIX-LISTEN:/var/run/discord-ipc-0,fork,group=discord,umask=007 EXEC:"npiperelay.exe -ep -s //./pipe/discord-ipc-0",nofork >/dev/null 2>&1 diff --git a/scripts/.local/bin/git-split.sh b/scripts/.local/bin/git-split.sh new file mode 100755 index 0000000..ecb2b3a --- /dev/null +++ b/scripts/.local/bin/git-split.sh @@ -0,0 +1,208 @@ +#!/usr/bin/env bash + +TEMP=$(getopt -o hvdymu:r: --long help,verbose,debug,submodule,remote:,username:,visibility: \ + -n 'javawrap' -- "$@") + +if [ $? != 0 ]; then + echo "Terminating..." >&2 + exit 1 +fi + +if ! git rev-parse --is-inside-work-tree &>/dev/null; then + echo "Must be run inside a git repository" >&2 + exit 1 +fi + +eval set -- "$TEMP" + +SCRIPT="$(basename $0)" +ARTIFACTS=(".gitignore" ".gitattributes" ".vscode" "LICENSE") +VERBOSE=false +DEBUG=false +CONFIRMED=false +SUBMODULE=false +REPO=$(git rev-parse --show-toplevel) +USERNAME="$(git config user.username)" +REMOTE= +VISIBILITY="--public" + +read -r -d '' USAGE <<-EOF +USAGE: $SCRIPT [OPTIONS] + +OPTIONS: + -h, --help Show this message + -v, --verbose Show more output + -d, --debug NOT IMPLEMENTED + -y, --confirm Do not prompt for confirmation + -m, --submodule + Migrate directory in original repository to submodule + + -u, --username= + Github username. Can be used instead of remote to dynamically name + the repositories. If --username and --remote are both ommited, defaults + to $(git config user.username) + + -r, --remote= + Github remote, defaults to ${username}/${directory} + + --private + Create the new remote repository as private. It is created + as public if ommited + +ARGS: + ... Directory to split out of original repository, + defaults to current directory +EOF + +while true; do + case "$1" in + -h | --help) + echo "$USAGE" + exit 0 + ;; + -v | --verbose) + VERBOSE=true + shift + ;; + -d | --debug) + DEBUG=true + shift + ;; + -y) + CONFIRMED=true + shift + ;; + -m | --submodule) + SUBMODULE=true + shift + ;; + -u | --username) + USERNAME="$2" + shift 2 + ;; + -r | --remote) + REMOTE="$(basename $(dirname ${2#"git@github.com:"}))/$(basename ${2#"git@github.com:"})" + shift 2 + ;; + --public | --private) + VISIBILITY="$1" + shift + ;; + --) + shift + break + ;; + *) + break + ;; + esac +done + +DIRECTORY="${1:-$(realpath --relative-to="$REPO" .)}" + +if [ ! -d "${REPO}/${DIRECTORY}" ]; then + echo "ERROR: Directory does not exist." >&2 + echo "$USAGE" + exit 1 +fi + +if [ -z "$REMOTE" ]; then + if [ -z "$USERNAME" ]; then + echo "ERROR: No remote provided and user.username was not set." >&2 + echo "$USAGE" + exit 1 + else + REMOTE="${USERNAME}/${DIRECTORY}" + fi +fi + +set -e + +cd $REPO + +git subtree split -P $DIRECTORY -b $DIRECTORY + +cd "$(mktemp -d)" + +git init && git pull $REPO $DIRECTORY && git branch -M main + +for f in "${ARTIFACTS[@]}"; do + if [[ ! -e "./${f}" && -e "${REPO}/${f}" ]]; then + printf '%s\n' "Copying ${f} to new repository..." + cp -r "${REPO}/${f}" ./ + fi +done + +git add -A && git commit -m "split out $DIRECTORY into submodule" + +# TODO check if remote already exists +if command -v gh &>/dev/null; then + yes "n" | gh repo create --confirm "${REMOTE}" "${VISIBILITY}" +else + printf '%s\n' 'gh cli tool could not be found. Explicitly adding git remote to your local repository.' + + git remote add origin https://github.com/${REMOTE} +fi + +set +e + +git push -u origin main + +if [ $? -ne 0 ]; then + printf '\n%s\n' 'Verify/create the remote repository and push to it with the following command: ' + printf '\n\t%s%s%s\n\n' '`cd ' "$(pwd)" ' && git push -u origin main`' + + printf '\t%s\n' \ + '*********************************************************************************' \ + '* The new repository was created in a temp directory! *' \ + '* If the local repository is not pushed to remote, it will be lost on reboot. *' \ + '*********************************************************************************' +else + tempdir="$(pwd)" + cd "$REPO" + rm -rf "$tempdir" +fi + +# Migrate to submodule + +if [ "$SUBMODULE" != true ]; then + exit 0 +fi + +# TODO fix and remove warning + +printf 'Migrating the original subdirectory to submodule.\n' + +if [ "$QUIET" != true ]; then + printf '\t%s\n' \ + '*************************************************************************************' \ + '* THIS IS NOT TESTED AND HAS A POSSIBLY OF DATA LOSS! *' \ + '* *' \ + '* This runs `git rm -rf` and `rm -rf` on the original subdirectory. *' \ + '* Double check you succesfully migrated the subdirectory to the new repository. *' \ + '*************************************************************************************' +fi + +if [ "$CONFIRMED" != true ]; then + read -p "Proceed? (Y/n) " -n 1 -r + printf '\n' + if [[ $REPLY =~ ^[Yy]$ ]]; then + CONFIRMED=true + else + [[ "$0" = "$BASH_SOURCE" ]] && exit 1 || return 1 + fi +fi + +cd $REPO + +git rm -rf $DIRECTORY +rm -rf $DIRECTORY + +git submodule add git@github.com:$REMOTE $DIRECTORY +git submodule update --init --recursive + +git commit -m "split out $DIRECTORY into submodule" + +if [ $? -ne 0 ]; then + printf '%s\n' 'Submodule succesfully added. Be sure to `git push -u origin main` after verifing the migration.' +fi diff --git a/scripts/.local/bin/gpg-test.sh b/scripts/.local/bin/gpg-test.sh new file mode 100644 index 0000000..f23b83d --- /dev/null +++ b/scripts/.local/bin/gpg-test.sh @@ -0,0 +1,102 @@ +#!/usr/bin/env bash + +TEMP=$(getopt -o hvdsea: --long help,verbose,debug,signature,encryption,authentication \ + -n 'javawrap' -- "$@") + +if [ $? != 0 ]; then + echo "Terminating..." >&2 + exit 1 +fi + +eval set -- "$TEMP" + +usage() { + cat <$temp/test.txt + + result="$(gpg --output $temp/test.gpg -e $temp/test.txt 2>&1 && gpg --output $temp/test.out -d $temp/test.txt.gpg 2>&1)" + grep '42' $temp/test.out 2>&1 + print_result result +fi + +if [[ $ALL -eq "true" || $AUTHENTICATION -eq "true" ]]; then + echo "Testing authentication key..." + result="$(ssh-add -l)" + print_result result +fi diff --git a/scripts/.local/bin/init-git.sh b/scripts/.local/bin/init-git.sh new file mode 100755 index 0000000..0a45b90 --- /dev/null +++ b/scripts/.local/bin/init-git.sh @@ -0,0 +1,193 @@ +#!/usr/bin/env bash + +# Global +SCRIPT="$(basename $0)" +SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd)" +GITATTRIBUTES_URL="https://gist.githubusercontent.com/tobyvin/70f3671c76016063594ea45edbb97094/raw" + +# Defaults +VERBOSE=0 +QUIET=0 +INTERACTIVE=0 +TEMPLATE="visualstudiocode" +LICENSE="mit" + +# Usage output +read -r -d '' USAGE < + +OPTIONS: + -h, --help Show this message + -v, --verbose Show more output + -q, --quiet Suppress all output + -i, --interactive Run command interactivly + + -l, --license [LICENSE_ID] + Specify which license to generate. Defaults to '$LICENSE' + + -t, --template [IGNORE_TEMPLATE,...] + Project template(s) used when generating the .gitignore file. It + can also be a comma seperated list or templates. Use '-t list' to + see available templates. Defaults to '$TEMPLATE' +USAGE + +# Options +SHORT=hvqil:t: +LONG=help,verbose,quiet,interactive,license:,template: + +# Test getopt +getopt --test 2>/dev/null +if [[ $? -ne 4 ]]; then + read -r -d '' message <&2 + exit 1 +fi + +# Parse options +TEMP=$(getopt \ + --options ${SHORT} \ + --longoptions ${LONG} \ + --name ${SCRIPT} \ + -- "$@") + +# Exit on failed getopt +if [ $? != 0 ]; then + echo "Error in getopt. Terminating..." >&2 + exit 1 +fi + +eval set -- "${TEMP}" +unset TEMP + +while [[ $# -gt 0 ]]; do + case "$1" in + -h | --help) + echo "$USAGE" + exit 0 + ;; + -v | --verbose) + VERBOSE=1 + shift + ;; + -q | --quiet) + QUIET=1 + shift + ;; + -i | --interactive) + INTERACTIVE=1 + shift + ;; + -l | --license) + LICENSE="$2" + shift 2 + ;; + -t | --template) + TEMPLATE="$2" + shift 2 + ;; + --) + shift + break + ;; + *) break ;; + esac +done + +VALID_TEMPLATES=$(curl -L -s "https://www.toptal.com/developers/gitignore/api/list") + +validate-template() { + local template="$1" + local templates="$2" + if [[ ",$2," == *",$template,"* ]]; then + [ "$QUIET" != 1 ] && printf "'%s' is already added.\n" "$template" >&2 + return 1 + elif ! [[ $VALID_TEMPLATES =~ "$template" ]]; then + [ "$QUIET" != 1 ] && printf "'%s' is not a valid template.\n" "$template" >&2 + return 1 + else + [ "$VERBOSE" == 1 ] && printf "Added template: %s\n" "$template" >&2 + return 0 + fi +} + +get-gitignore() { + local templates='' + IFS=',' read -ra input <<<"$1" + + for template in "${input[@]}"; do + if validate-template "$template" "$templates"; then + templates+="${template}," + fi + done + + echo ${templates%?} +} + +get-gitignore-interactive() { + local templates='' + + while true; do + read -p 'Input gitignore template(s): ' -i "$1" readInput + echo "" + + IFS=', ' input=$readInput + [ -z "$input" ] && break + if [[ "$input" == "list" ]]; then + echo "$VALID_TEMPLATES" >&2 + else + for template in $input; do + if validate-template "$template" "$templates"; then + templates+="${template}," + fi + done + fi + [ "$QUIET" != 1 ] && printf "\nTemplates: %s\n" "${templates%?}" >&2 + done + + echo "${templates%?}" +} + +get-license() { + licenseJson="$(curl -sH 'Accept: application/vnd.github.v3+json' https://api.github.com/licenses/$1)" + # not_found='"message": "Not Found"' + if [[ $licenseJson =~ '"message": "Not Found"' ]]; then + [ "$QUIET" != 1 ] && printf "'%s' is not a valid license identifier.\n" "$LICENSE" >&2 + else + echo $licenseJson | grep -oP '.*"body":\s*"\K.*(?=\s*",)' | + tr '\n' '\0' | xargs -0 printf '%b\n' | + sed "s/\\[year\\]/$(date +'%Y')/" | + sed "s/\\[fullname\\]/$(git config --get user.name)/" + fi +} + +if [[ "$TEMPLATE" == "list" ]]; then + echo "$VALID_TEMPLATES" + exit 0 +fi + +if [ $INTERACTIVE -eq 0 ]; then + gitignore_cmd=get-gitignore +else + gitignore_cmd=get-gitignore-interactive +fi + +TEMPLATES=$($gitignore_cmd $TEMPLATE) + +# .gitignore +[ "$VERBOSE" == 1 ] && printf "Creating .gitignore using: %s\n" "$TEMPLATES" >&1 +curl -L -s "https://www.toptal.com/developers/gitignore/api/${TEMPLATES}" >.gitignore + +# .gitattributes +[ "$VERBOSE" == 1 ] && printf "Creating .gitattributes\n" >&1 +curl -sL "$GITATTRIBUTES_URL" >.gitattributes + +# LICENSE +[ "$VERBOSE" == 1 ] && printf "Creating LICENSE using: %s\n" "$LICENSE" >&1 +get-license $LICENSE >LICENSE + +echo "$PWD" diff --git a/scripts/.local/bin/init-latex.sh b/scripts/.local/bin/init-latex.sh new file mode 100755 index 0000000..7b8125e --- /dev/null +++ b/scripts/.local/bin/init-latex.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + +USER="tobyvin" +GIST_ID="c94716d1106256e4ab0e27aed398a0a2" + +curl -Ls "https://gist.github.com/${USER}/${GIST_ID}/download" -o tempFile +unzip -q tempFile +rm -rf tempFile +mv "${GIST_ID}-master" styles +mv styles/template.tex "$(basename "$(pwd)").tex" +mv styles/table.tex . diff --git a/scripts/.local/bin/install-crate.sh b/scripts/.local/bin/install-crate.sh new file mode 100755 index 0000000..1c1578a --- /dev/null +++ b/scripts/.local/bin/install-crate.sh @@ -0,0 +1,235 @@ +#!/bin/sh + +# modified from https://github.com/japaric/trust/blob/gh-pages/install.sh. + +set -e + +help() { + cat <<'EOF' +Install a binary release of a Rust crate hosted on GitHub + +Usage: + install-crate.sh [options] + +Options: + -h, --help Display this message + -q, --quiet Silence all output + --git SLUG Get the crate from "https://github/$SLUG" + -f, --force Force overwriting an existing binary + --crate NAME Name of the crate to install (default ) + --tag TAG Tag (version) of the crate to install (default ) + --no-tag Do not tag between the crate and the target in the url + --target TARGET Install the release compiled for $TARGET (default <`rustc` host>) + --to LOCATION Where to install the binary (default ~/.cargo/bin) + --completion + Install all the completions + + --completion-bash DIR + Install the bash completion scripts in DIR (default ~/.local/share/bash_completion.d) + + --completion-zsh DIR + Install the zsh completion scripts in DIR (default ~/.local/share/zsh/site-functions) + + --completion-fish DIR + Install the fish completion scripts in DIR (default ~/.config/fish/completions) +EOF +} + +say() { + if [ ! $quiet ]; then + echo "install-crate.sh: $1" + fi +} + +say_err() { + say "$1" >&2 +} + +err() { + if [ ! -z $td ]; then + rm -rf $td + fi + + say_err "ERROR $1" + exit 1 +} + +need() { + if ! command -v $1 >/dev/null 2>&1; then + err "need $1 (command not found)" + fi +} + +is_opt() { case $1 in "--"*) true ;; *) false ;; esac } +is_arg() { if [ "$1" ] && ! is_opt $1; then true; else false; fi; } + +quiet=false +force=false +no_tag=false +completion_bash=false +completion_zsh=false +completion_fish=false +comp_dir_bash="${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion/completions" +comp_dir_zsh="${XDG_DATA_HOME:-$HOME/.local/share}/zsh/site-functions" +comp_dir_fish="${XDG_CONFIG_HOME:-$HOME/.config}/fish/completions" +while test $# -gt 0; do + case $1 in + --quiet | -q) + quiet=true + ;; + --crate) + crate=$2 + shift + ;; + --force | -f) + force=true + ;; + --git) + git=$2 + shift + ;; + --help | -h) + help + exit 0 + ;; + --tag) + tag=$2 + shift + ;; + --no-tag) + no_tag=true + ;; + --target) + target=$2 + shift + ;; + --to) + dest=$2 + shift + ;; + --completion) + completion_bash=true + completion_zsh=true + completion_fish=true + ;; + --completion-bash) + completion_bash=true + if is_arg $2; then + comp_dir_bash=$2 + shift + fi + ;; + --completion-zsh) + completion_zsh=true + if is_arg $2; then + echo "$2" + comp_dir_zsh=$2 + shift + fi + ;; + --completion-fish) + completion_fish=true + if is_arg $2; then + comp_dir_fish=$2 + shift + fi + ;; + *) ;; + + esac + shift +done + +# Dependencies +need basename +need curl +need install +need mkdir +need mktemp +need tar + +# Optional dependencies +if [ -z $crate ] || [ -z $tag ] || [ -z $target ]; then + need cut +fi + +if [ -z $tag ]; then + need rev +fi + +if [ -z $target ]; then + need grep + need rustc +fi + +if [ -z $git ]; then + err 'must specify a git repository using `--git`. Example: `install.sh --git japaric/cross`' +fi + +url="https://github.com/$git" +say_err "GitHub repository: $url" + +if [ -z $crate ]; then + crate=$(echo $git | cut -d'/' -f2) +fi + +say_err "Crate: $crate" + +url="$url/releases" + +if [ -z $tag ]; then + tag=$(curl -s "$url/latest" | cut -d'"' -f2 | rev | cut -d'/' -f1 | rev) + say_err "Tag: latest ($tag)" +else + say_err "Tag: $tag" +fi + +if [ -z $target ]; then + target=$(rustc -Vv | grep host | cut -d' ' -f2) +fi + +say_err "Target: $target" + +if [ -z $dest ]; then + dest="$HOME/.cargo/bin" +fi + +if [ $no_tag = true ]; then + crate_tag="$crate" +elif case $tag in "$crate"*) true ;; *) false ;; esac then + crate_tag="$tag" +else + crate_tag="$crate-$tag" +fi + +say_err "Installing to: $dest" +url="$url/download/$tag/${crate_tag}-$target.tar.gz" + +say_err "Downloading: $url" + +td=$(mktemp -d || mktemp -d -t tmp) +curl -sL $url | tar -C $td -xz + +for f in $(find "$td" -type f); do + case $f in + *".bash") + [ $completion_bash ] && install -D $f "$comp_dir_bash/$crate" + ;; + *".zsh" | *"_$crate") + [ $completion_zsh ] && install -D $f "$comp_dir_zsh/_$crate" + ;; + *".fish") + [ $completion_fish ] && install -D $f "$comp_dir_fish/$crate.fish" + ;; + *) ;; + esac + + test -x $f || continue + if [ -e "$dest/$f" ] && [ $force = false ]; then + err "$(dirname $f) already exists in $dest" + else + install -Dm 755 $f $dest + fi +done + +rm -rf $td diff --git a/scripts/.local/bin/mega-dl.sh b/scripts/.local/bin/mega-dl.sh new file mode 100755 index 0000000..b19be68 --- /dev/null +++ b/scripts/.local/bin/mega-dl.sh @@ -0,0 +1,121 @@ +#!/bin/bash + +# Source: https://gist.github.com/zanculmarktum/170b94764bd9a3da31078580ccea8d7e + +# Copyright 2018, 2019, 2020 Azure Zanculmarktum +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# Dependencies: +# openssl + +# Usage: +# $ ./megafetch.sh https://mega.nz/#!abcdefgh!1234567890abcdefghijklmnopqrstuvwxyzABCDEFG +# http://gfs208n103.userstorage.mega.co.nz/dl/-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890A +# file.name +# abcefghijklmnopqrstuvwxyz0123456 +# 1234567890abcdef0000000000000000 +# $ wget -O file.name http://gfs208n103.userstorage.mega.co.nz/dl/-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890A +# $ cat file.name | openssl enc -d -aes-128-ctr -K abcefghijklmnopqrstuvwxyz0123456 -iv 1234567890abcdef0000000000000000 > file.name.new +# $ mv -f file.name.new file.name + +URL="" +OUTPATH="$PWD" +USAGE="Usage: ${0##*/} " + +if [[ $1 =~ ^https?:\/\/mega(\.co)?\.nz ]]; then + URL="$1" +fi + +if [[ ! $URL ]]; then + echo $USAGE >&2 + exit 1 +fi + +if [[ ! -z "$2" ]]; then + OUTPATH="$2" +fi + +if [[ ! -d "$OUTPATH" ]]; then + echo $USAGE >&2 + exit 1 +fi + +CURL="curl -Y 1 -y 10" + +missing=false +for cmd in openssl; do + if [[ ! $(command -v "$cmd" 2>&1) ]]; then + missing=true + echo "${0##*/}: $cmd: command not found" >&2 + fi +done +if $missing; then + exit 1 +fi + +if [[ $URL =~ .*/file/[^#]*#[^#]* ]]; then + id="${URL#*file/}" + id="${id%%#*}" + key="${URL##*file/}" + key="${key##*#}" +else + id="${URL#*!}" + id="${id%%!*}" + key="${URL##*!}" +fi + +raw_hex=$(echo "${key}=" | tr '\-_' '+/' | tr -d ',' | base64 -d -i 2>/dev/null | od -v -An -t x1 | tr -d '\n ') +hex=$( + printf "%016x" \ + $((0x${raw_hex:0:16} ^ 0x${raw_hex:32:16})) \ + $((0x${raw_hex:16:16} ^ 0x${raw_hex:48:16})) +) + +json=$($CURL -s -H 'Content-Type: application/json' -d '[{"a":"g", "g":"1", "p":"'"$id"'"}]' 'https://g.api.mega.co.nz/cs?id=&ak=') || exit 1 +json="${json#"[{"}" +json="${json%"}]"}" +file_url="${json##*'"g":'}" +file_url="${file_url%%,*}" +file_url="${file_url//'"'/}" + +json=$($CURL -s -H 'Content-Type: application/json' -d '[{"a":"g", "p":"'"$id"'"}]' 'https://g.api.mega.co.nz/cs?id=&ak=') || exit 1 +at="${json##*'"at":'}" +at="${at%%,*}" +at="${at//'"'/}" + +json=$(echo "${at}==" | tr '\-_' '+/' | tr -d ',' | openssl enc -a -A -d -aes-128-cbc -K "$hex" -iv "00000000000000000000000000000000" -nopad | tr -d '\0') +json="${json#"MEGA{"}" +json="${json%"}"}" +file_name="${json##*'"n":'}" +if [[ $file_name == *,* ]]; then + file_name="${file_name%%,*}" +fi +file_name="${file_name//'"'/}" + +outfile="$OUTPATH/$file_name" + +$CURL -s "$file_url" | openssl enc -d -aes-128-ctr -K "$hex" -iv "${raw_hex:32:16}0000000000000000" >"$outfile" + +echo "$outfile" + +# echo "$file_url" +# echo "$file_name" +# echo "$hex" +# echo "${raw_hex:32:16}0000000000000000" diff --git a/scripts/.local/bin/mkln.sh b/scripts/.local/bin/mkln.sh new file mode 100755 index 0000000..ef174c2 --- /dev/null +++ b/scripts/.local/bin/mkln.sh @@ -0,0 +1,115 @@ +#!/usr/bin/env bash + +TEMP=$(getopt -o hvqdf --long help,verbose,quiet,debug,force \ + -n 'javawrap' -- "$@") + +if [ $? != 0 ]; then + echo "Terminating..." >&2 + exit 1 +fi + +eval set -- "$TEMP" + +SCRIPT="$(basename $0)" +VERBOSE=false +QUIET=false +DEBUG=false +FORCE=false + +read -r -d '' USAGE <<-EOF +USAGE: $SCRIPT [OPTIONS] + +OPTIONS: + -h, --help Show this message + -v, --verbose Show more output + -q, --quiet Suppress all output + -d, --debug NOT IMPLEMENTED + -f, --force Overwrite items + +ARGS: + ... File to link. +EOF + +while true; do + case "$1" in + -h | --help) + echo "$USAGE" + exit 0 + ;; + -v | --verbose) + VERBOSE=true + shift + ;; + -q | --quiet) + QUIET=true + shift + ;; + -d | --debug) + DEBUG=true + shift + ;; + -f | --force) + FORCE=true + shift + ;; + --) + shift + break + ;; + *) + break + ;; + esac +done + +if ! command -v powershell.exe &>/dev/null; then + [ "$QUIET" != true ] && echo "Powershell not found in path." >&2 + exit 1 +fi + +if [ -z "$2" ]; then + 2="$(pwd)" +fi + +[ "$VERBOSE" == true ] && echo "linking $2 -> $1" + +if [ -d "$1" ]; then + [ "$VERBOSE" == true ] && echo "$1 is a directory. Creating symbolic link." + args='/D' +fi + +mkdir -p $(dirname $2) + +source=$(wslpath -w $1) +target=$(wslpath -w $(dirname $2))\\$(basename $2) + +if ls -la "$(dirname $2)/" 2>/dev/null | grep -q "$(basename $2)"; then + + current_path=$(powershell.exe -c "(Get-Item $target).Target" 2>/dev/null) + + if [[ "${current_path/*wsl$/}" == *"${source/*wsl$/}"* ]]; then + [ "$VERBOSE" == true ] && echo "$(basename $2) is set correctly. Skipping." + exit 0 + fi + + if [ "$FORCE" == true ]; then + [ "$VERBOSE" == true ] && echo "$(basename $2) exists. Overwriting." + rm -rf "$2" + else + [ "$QUIET" != true ] && echo "$(basename $target) already exists. Use -f to overwrite." >&2 + exit 1 + fi +fi + +mkdir -p "$(dirname $2)" +cmd="cd ~; cmd /c mklink ${args} ${target} ${source}" + +if [ "$DEBUG" == true ]; then + [ "$QUIET" != true ] && printf '\nCommand: \n%s\n\n' "powershell.exe -c ${cmd} &>/dev/null" +else + if $QUIET; then + powershell.exe -c "${cmd}" &>/dev/null + else + powershell.exe -c "${cmd}" + fi +fi diff --git a/scripts/.local/bin/socket-relay.sh b/scripts/.local/bin/socket-relay.sh new file mode 100755 index 0000000..436fa54 --- /dev/null +++ b/scripts/.local/bin/socket-relay.sh @@ -0,0 +1,217 @@ +#!/usr/bin/env bash +set -euo pipefail + +OPTS=$(getopt -o hds:x: --long help,debug,sock:,exec:,ssh,gpg,gpg-extra,discord -n 'javawrap' -- "$@") + +eval set -- "$OPTS" + +PAGEANT="$HOME/.ssh/wsl2-ssh-pageant.exe" +NPIPE="$(command -v npiperelay.exe)" +SCRIPT="$(basename "$0")" + +help() { + cat <<-EOF +$SCRIPT +Toby Vincent + +$SCRIPT description + +USAGE: + $SCRIPT [OPTIONS] + $SCRIPT [OPTIONS] + +OPTIONS: + -h, --help Display this message + -s, --sock Path to the linux socket + -x, --exec Command to run for socat's EXEC: arg + --ssh Relay the ssh agent's socket + --gpg Relay the gpg agent's socket + --gpg-extra Relay the gpg agent's extra socket + +ARGS: + start (default) + Start the socat process + + stop + Kill the socat process +EOF +} + +say() { + if ! $quiet; then + echo "$SCRIPT: $1" + fi +} + +say_err() { + say "$1" >&2 +} + +err() { + say_err "ERROR: $1" + exit 1 +} + +need() { + for cmd in $@; do + if ! command -v $cmd >/dev/null 2>&1; then + err "need $cmd (command not found)" + fi + done +} + +start() { + if ! ss -a | grep -q "$sock"; then + if test -x "$relay"; then + rm -rf "$sock" + (setsid nohup socat UNIX-LISTEN:"${sock},${listen_args}" EXEC:"$cmd" >/dev/null 2>&1 &) + + else + echo >&2 "WARNING: $relay is not executable." + fi + fi + + if $gpg; then + gpg-connect-agent.exe /bye &>/dev/null + fi +} + +stop() { + if $gpg; then + gpg-connect-agent.exe KILLAGENT /bye &>/dev/null + fi + + if pgrep -f "socat.*$sock.*$relay" &>/dev/null; then + pkill -f "socat.*$sock.*$relay" + fi +} + +check() { + pgrep -fa "socat.*$sock.*$relay" +} + +quiet=false +debug=false +sock="" +cmd="" +gpg=false +ssh=false +extra=false +discord=false +while test $# -gt 0; do + case $1 in + -h | --help) + help + return 0 + ;; + -q | --quiet) + quiet=true + shift + ;; + -d | --debug) + debug=true + shift + ;; + -s | --sock) + sock=$2 + shift + shift + ;; + -x | --exec) + cmd=$2 + shift + shift + ;; + --ssh) + ssh=true + shift + ;; + --gpg) + gpg=true + shift + ;; + --gpg-extra) + gpg=true + extra=true + shift + ;; + --discord) + discord=true + shift + ;; + --) + shift + break + ;; + *) + help + exit 1 + ;; + esac +done + +need ss +need socat + +listen_args="fork" + +case true in +$ssh) + need $PAGEANT + + sock="${SSH_AUTH_SOCK:-$HOME/.ssh/agent.sock}" + cmd="$PAGEANT" + ;; +$gpg) + need $PAGEANT + need "gpg-connect-agent.exe" + + sock="${GPG_AGENT_SOCK:-$HOME/.gnupg/S.gpg-agent}" + if $extra; then + sock+=".extra" + fi + + cmd="$PAGEANT --gpg $(basename $sock)" + ;; +$discord) + need $NPIPE + + sock="${DISCORD_IPC_SOCK:-/var/run/discord-ipc-0}" + cmd="$NPIPE -ep -s //./pipe/$(basename $sock)" + + listen_args="fork,group=discord,umask=007" + ;; +$(test -z "${cmd}")) + err "No EXEC provided. Must supply either --ssh, --gpg, --gpg-extra, --pipe, or --exec" + ;; +esac + +if test -z "${sock}"; then + err "No socket provided." +fi + +relay="$(echo $cmd | head -n1 | awk '{print $1;}')" + +case ${1:-'start'} in +check) + shift + check + ;; +start) + shift + start + ;; +stop) + shift + stop + ;; +restart) + shift + stop + start + ;; +*) + help + exit 1 + ;; +esac diff --git a/scripts/.local/bin/td.sh b/scripts/.local/bin/td.sh new file mode 100755 index 0000000..968c98b --- /dev/null +++ b/scripts/.local/bin/td.sh @@ -0,0 +1,151 @@ +#!/bin/sh +TEMP=$(getopt -o hf --long help,force \ + -n 'javawrap' -- "$@") + +if [ $? != 0 ]; then + echo "Terminating..." >&2 + exit 1 +fi + +eval set -- "$TEMP" + +SCRIPT="$(basename $0)" +ENV_CACHE="${HOME}/.cache/td/.env" + +help() { + cat <<-EOF +$SCRIPT +Toby Vincent + +$SCRIPT is a script for managing and navigating a persistent temp directory. In +order to function properly, this script must be sourced in the currently shell. +Consider setting an alias such as + + alias td=". $SCRIPT" + +USAGE: + $SCRIPT [OPTIONS] + $SCRIPT [OPTIONS] + +OPTIONS: + -h, --help Display this message + -f, --force Use the --force argument when removing TD + +ARGS: + toggle (default) + Switch between TD_ORIGIN and TD. This will create TD if it does not + exist. This is the default if no command is provided. + + new | create + Creates a new temp directory and cds into it it stores the path + to the temp directory in TD, and the path to the previous directory in + TD_ORIGIN. + + rm | remove + Removes the directory stored in TD unsets TD and TD_ORIGIN. + + ls | list | show + Shows the current values for TD and TD_ORIGIN +EOF +} + +echo_err() { + echo >&2 "$SCRIPT: $@" +} + +show() { + if [ ! -n "$TD" ]; then + echo_err "Not set" + return 1 + fi + echo "TD=$TD" + echo "TD_ORIGIN=$TD_ORIGIN" +} + +remove() { + if [ ! -n "$TD" ]; then + echo_err "Not set" + return 1 + fi + + rm "$rm_args" "$TD" + + echo "removed $TD" + + if [ "$PWD" = "$TD" ]; then + cd "$TD_ORIGIN" + fi + + rm "$ENV_CACHE" -rf + unset TD + unset TD_ORIGIN +} + +create() { + remove 2>/dev/null + + td=$(mktemp -d) + + export TD="$td" + update-origin + + echo "created $TD" + cd "$TD" +} + +update-origin() { + export TD_ORIGIN="$PWD" + cat >$ENV_CACHE <<-EOF +TD=$TD +TD_ORIGIN=$TD_ORIGIN +EOF +} + +toggle() { + if [ "$PWD" = "$TD" ]; then + cd "$TD_ORIGIN" + elif [ -n "$TD" ]; then + update-origin + cd "$TD" + else + create + fi +} + +if [ -f "$ENV_CACHE" ]; then + export $(cat "$ENV_CACHE" | xargs) +fi + +rm_args="-r" +while test $# -gt 0; do + case $1 in + --help | -h) + help + return 0 + ;; + --force | -f) + rm_args="-rf" + shift + ;; + --) + shift + break + ;; + *) break ;; + esac +done + +case $1 in +ls | list | show) + show + ;; +rm | remove) + remove + ;; +new | create) + create + ;; +* | toggle) + toggle + ;; +esac diff --git a/scripts/.scripts/discord-relay.sh b/scripts/.scripts/discord-relay.sh deleted file mode 100755 index 3932908..0000000 --- a/scripts/.scripts/discord-relay.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -exec socat UNIX-LISTEN:/var/run/discord-ipc-0,fork,group=discord,umask=007 EXEC:"npiperelay.exe -ep -s //./pipe/discord-ipc-0",nofork >/dev/null 2>&1 diff --git a/scripts/.scripts/git-split.sh b/scripts/.scripts/git-split.sh deleted file mode 100755 index ecb2b3a..0000000 --- a/scripts/.scripts/git-split.sh +++ /dev/null @@ -1,208 +0,0 @@ -#!/usr/bin/env bash - -TEMP=$(getopt -o hvdymu:r: --long help,verbose,debug,submodule,remote:,username:,visibility: \ - -n 'javawrap' -- "$@") - -if [ $? != 0 ]; then - echo "Terminating..." >&2 - exit 1 -fi - -if ! git rev-parse --is-inside-work-tree &>/dev/null; then - echo "Must be run inside a git repository" >&2 - exit 1 -fi - -eval set -- "$TEMP" - -SCRIPT="$(basename $0)" -ARTIFACTS=(".gitignore" ".gitattributes" ".vscode" "LICENSE") -VERBOSE=false -DEBUG=false -CONFIRMED=false -SUBMODULE=false -REPO=$(git rev-parse --show-toplevel) -USERNAME="$(git config user.username)" -REMOTE= -VISIBILITY="--public" - -read -r -d '' USAGE <<-EOF -USAGE: $SCRIPT [OPTIONS] - -OPTIONS: - -h, --help Show this message - -v, --verbose Show more output - -d, --debug NOT IMPLEMENTED - -y, --confirm Do not prompt for confirmation - -m, --submodule - Migrate directory in original repository to submodule - - -u, --username= - Github username. Can be used instead of remote to dynamically name - the repositories. If --username and --remote are both ommited, defaults - to $(git config user.username) - - -r, --remote= - Github remote, defaults to ${username}/${directory} - - --private - Create the new remote repository as private. It is created - as public if ommited - -ARGS: - ... Directory to split out of original repository, - defaults to current directory -EOF - -while true; do - case "$1" in - -h | --help) - echo "$USAGE" - exit 0 - ;; - -v | --verbose) - VERBOSE=true - shift - ;; - -d | --debug) - DEBUG=true - shift - ;; - -y) - CONFIRMED=true - shift - ;; - -m | --submodule) - SUBMODULE=true - shift - ;; - -u | --username) - USERNAME="$2" - shift 2 - ;; - -r | --remote) - REMOTE="$(basename $(dirname ${2#"git@github.com:"}))/$(basename ${2#"git@github.com:"})" - shift 2 - ;; - --public | --private) - VISIBILITY="$1" - shift - ;; - --) - shift - break - ;; - *) - break - ;; - esac -done - -DIRECTORY="${1:-$(realpath --relative-to="$REPO" .)}" - -if [ ! -d "${REPO}/${DIRECTORY}" ]; then - echo "ERROR: Directory does not exist." >&2 - echo "$USAGE" - exit 1 -fi - -if [ -z "$REMOTE" ]; then - if [ -z "$USERNAME" ]; then - echo "ERROR: No remote provided and user.username was not set." >&2 - echo "$USAGE" - exit 1 - else - REMOTE="${USERNAME}/${DIRECTORY}" - fi -fi - -set -e - -cd $REPO - -git subtree split -P $DIRECTORY -b $DIRECTORY - -cd "$(mktemp -d)" - -git init && git pull $REPO $DIRECTORY && git branch -M main - -for f in "${ARTIFACTS[@]}"; do - if [[ ! -e "./${f}" && -e "${REPO}/${f}" ]]; then - printf '%s\n' "Copying ${f} to new repository..." - cp -r "${REPO}/${f}" ./ - fi -done - -git add -A && git commit -m "split out $DIRECTORY into submodule" - -# TODO check if remote already exists -if command -v gh &>/dev/null; then - yes "n" | gh repo create --confirm "${REMOTE}" "${VISIBILITY}" -else - printf '%s\n' 'gh cli tool could not be found. Explicitly adding git remote to your local repository.' - - git remote add origin https://github.com/${REMOTE} -fi - -set +e - -git push -u origin main - -if [ $? -ne 0 ]; then - printf '\n%s\n' 'Verify/create the remote repository and push to it with the following command: ' - printf '\n\t%s%s%s\n\n' '`cd ' "$(pwd)" ' && git push -u origin main`' - - printf '\t%s\n' \ - '*********************************************************************************' \ - '* The new repository was created in a temp directory! *' \ - '* If the local repository is not pushed to remote, it will be lost on reboot. *' \ - '*********************************************************************************' -else - tempdir="$(pwd)" - cd "$REPO" - rm -rf "$tempdir" -fi - -# Migrate to submodule - -if [ "$SUBMODULE" != true ]; then - exit 0 -fi - -# TODO fix and remove warning - -printf 'Migrating the original subdirectory to submodule.\n' - -if [ "$QUIET" != true ]; then - printf '\t%s\n' \ - '*************************************************************************************' \ - '* THIS IS NOT TESTED AND HAS A POSSIBLY OF DATA LOSS! *' \ - '* *' \ - '* This runs `git rm -rf` and `rm -rf` on the original subdirectory. *' \ - '* Double check you succesfully migrated the subdirectory to the new repository. *' \ - '*************************************************************************************' -fi - -if [ "$CONFIRMED" != true ]; then - read -p "Proceed? (Y/n) " -n 1 -r - printf '\n' - if [[ $REPLY =~ ^[Yy]$ ]]; then - CONFIRMED=true - else - [[ "$0" = "$BASH_SOURCE" ]] && exit 1 || return 1 - fi -fi - -cd $REPO - -git rm -rf $DIRECTORY -rm -rf $DIRECTORY - -git submodule add git@github.com:$REMOTE $DIRECTORY -git submodule update --init --recursive - -git commit -m "split out $DIRECTORY into submodule" - -if [ $? -ne 0 ]; then - printf '%s\n' 'Submodule succesfully added. Be sure to `git push -u origin main` after verifing the migration.' -fi diff --git a/scripts/.scripts/gpg-test.sh b/scripts/.scripts/gpg-test.sh deleted file mode 100644 index f23b83d..0000000 --- a/scripts/.scripts/gpg-test.sh +++ /dev/null @@ -1,102 +0,0 @@ -#!/usr/bin/env bash - -TEMP=$(getopt -o hvdsea: --long help,verbose,debug,signature,encryption,authentication \ - -n 'javawrap' -- "$@") - -if [ $? != 0 ]; then - echo "Terminating..." >&2 - exit 1 -fi - -eval set -- "$TEMP" - -usage() { - cat <$temp/test.txt - - result="$(gpg --output $temp/test.gpg -e $temp/test.txt 2>&1 && gpg --output $temp/test.out -d $temp/test.txt.gpg 2>&1)" - grep '42' $temp/test.out 2>&1 - print_result result -fi - -if [[ $ALL -eq "true" || $AUTHENTICATION -eq "true" ]]; then - echo "Testing authentication key..." - result="$(ssh-add -l)" - print_result result -fi diff --git a/scripts/.scripts/init-git.sh b/scripts/.scripts/init-git.sh deleted file mode 100755 index 0a45b90..0000000 --- a/scripts/.scripts/init-git.sh +++ /dev/null @@ -1,193 +0,0 @@ -#!/usr/bin/env bash - -# Global -SCRIPT="$(basename $0)" -SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd)" -GITATTRIBUTES_URL="https://gist.githubusercontent.com/tobyvin/70f3671c76016063594ea45edbb97094/raw" - -# Defaults -VERBOSE=0 -QUIET=0 -INTERACTIVE=0 -TEMPLATE="visualstudiocode" -LICENSE="mit" - -# Usage output -read -r -d '' USAGE < - -OPTIONS: - -h, --help Show this message - -v, --verbose Show more output - -q, --quiet Suppress all output - -i, --interactive Run command interactivly - - -l, --license [LICENSE_ID] - Specify which license to generate. Defaults to '$LICENSE' - - -t, --template [IGNORE_TEMPLATE,...] - Project template(s) used when generating the .gitignore file. It - can also be a comma seperated list or templates. Use '-t list' to - see available templates. Defaults to '$TEMPLATE' -USAGE - -# Options -SHORT=hvqil:t: -LONG=help,verbose,quiet,interactive,license:,template: - -# Test getopt -getopt --test 2>/dev/null -if [[ $? -ne 4 ]]; then - read -r -d '' message <&2 - exit 1 -fi - -# Parse options -TEMP=$(getopt \ - --options ${SHORT} \ - --longoptions ${LONG} \ - --name ${SCRIPT} \ - -- "$@") - -# Exit on failed getopt -if [ $? != 0 ]; then - echo "Error in getopt. Terminating..." >&2 - exit 1 -fi - -eval set -- "${TEMP}" -unset TEMP - -while [[ $# -gt 0 ]]; do - case "$1" in - -h | --help) - echo "$USAGE" - exit 0 - ;; - -v | --verbose) - VERBOSE=1 - shift - ;; - -q | --quiet) - QUIET=1 - shift - ;; - -i | --interactive) - INTERACTIVE=1 - shift - ;; - -l | --license) - LICENSE="$2" - shift 2 - ;; - -t | --template) - TEMPLATE="$2" - shift 2 - ;; - --) - shift - break - ;; - *) break ;; - esac -done - -VALID_TEMPLATES=$(curl -L -s "https://www.toptal.com/developers/gitignore/api/list") - -validate-template() { - local template="$1" - local templates="$2" - if [[ ",$2," == *",$template,"* ]]; then - [ "$QUIET" != 1 ] && printf "'%s' is already added.\n" "$template" >&2 - return 1 - elif ! [[ $VALID_TEMPLATES =~ "$template" ]]; then - [ "$QUIET" != 1 ] && printf "'%s' is not a valid template.\n" "$template" >&2 - return 1 - else - [ "$VERBOSE" == 1 ] && printf "Added template: %s\n" "$template" >&2 - return 0 - fi -} - -get-gitignore() { - local templates='' - IFS=',' read -ra input <<<"$1" - - for template in "${input[@]}"; do - if validate-template "$template" "$templates"; then - templates+="${template}," - fi - done - - echo ${templates%?} -} - -get-gitignore-interactive() { - local templates='' - - while true; do - read -p 'Input gitignore template(s): ' -i "$1" readInput - echo "" - - IFS=', ' input=$readInput - [ -z "$input" ] && break - if [[ "$input" == "list" ]]; then - echo "$VALID_TEMPLATES" >&2 - else - for template in $input; do - if validate-template "$template" "$templates"; then - templates+="${template}," - fi - done - fi - [ "$QUIET" != 1 ] && printf "\nTemplates: %s\n" "${templates%?}" >&2 - done - - echo "${templates%?}" -} - -get-license() { - licenseJson="$(curl -sH 'Accept: application/vnd.github.v3+json' https://api.github.com/licenses/$1)" - # not_found='"message": "Not Found"' - if [[ $licenseJson =~ '"message": "Not Found"' ]]; then - [ "$QUIET" != 1 ] && printf "'%s' is not a valid license identifier.\n" "$LICENSE" >&2 - else - echo $licenseJson | grep -oP '.*"body":\s*"\K.*(?=\s*",)' | - tr '\n' '\0' | xargs -0 printf '%b\n' | - sed "s/\\[year\\]/$(date +'%Y')/" | - sed "s/\\[fullname\\]/$(git config --get user.name)/" - fi -} - -if [[ "$TEMPLATE" == "list" ]]; then - echo "$VALID_TEMPLATES" - exit 0 -fi - -if [ $INTERACTIVE -eq 0 ]; then - gitignore_cmd=get-gitignore -else - gitignore_cmd=get-gitignore-interactive -fi - -TEMPLATES=$($gitignore_cmd $TEMPLATE) - -# .gitignore -[ "$VERBOSE" == 1 ] && printf "Creating .gitignore using: %s\n" "$TEMPLATES" >&1 -curl -L -s "https://www.toptal.com/developers/gitignore/api/${TEMPLATES}" >.gitignore - -# .gitattributes -[ "$VERBOSE" == 1 ] && printf "Creating .gitattributes\n" >&1 -curl -sL "$GITATTRIBUTES_URL" >.gitattributes - -# LICENSE -[ "$VERBOSE" == 1 ] && printf "Creating LICENSE using: %s\n" "$LICENSE" >&1 -get-license $LICENSE >LICENSE - -echo "$PWD" diff --git a/scripts/.scripts/init-latex.sh b/scripts/.scripts/init-latex.sh deleted file mode 100755 index 7b8125e..0000000 --- a/scripts/.scripts/init-latex.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env bash - -USER="tobyvin" -GIST_ID="c94716d1106256e4ab0e27aed398a0a2" - -curl -Ls "https://gist.github.com/${USER}/${GIST_ID}/download" -o tempFile -unzip -q tempFile -rm -rf tempFile -mv "${GIST_ID}-master" styles -mv styles/template.tex "$(basename "$(pwd)").tex" -mv styles/table.tex . diff --git a/scripts/.scripts/install-crate.sh b/scripts/.scripts/install-crate.sh deleted file mode 100755 index 1c1578a..0000000 --- a/scripts/.scripts/install-crate.sh +++ /dev/null @@ -1,235 +0,0 @@ -#!/bin/sh - -# modified from https://github.com/japaric/trust/blob/gh-pages/install.sh. - -set -e - -help() { - cat <<'EOF' -Install a binary release of a Rust crate hosted on GitHub - -Usage: - install-crate.sh [options] - -Options: - -h, --help Display this message - -q, --quiet Silence all output - --git SLUG Get the crate from "https://github/$SLUG" - -f, --force Force overwriting an existing binary - --crate NAME Name of the crate to install (default ) - --tag TAG Tag (version) of the crate to install (default ) - --no-tag Do not tag between the crate and the target in the url - --target TARGET Install the release compiled for $TARGET (default <`rustc` host>) - --to LOCATION Where to install the binary (default ~/.cargo/bin) - --completion - Install all the completions - - --completion-bash DIR - Install the bash completion scripts in DIR (default ~/.local/share/bash_completion.d) - - --completion-zsh DIR - Install the zsh completion scripts in DIR (default ~/.local/share/zsh/site-functions) - - --completion-fish DIR - Install the fish completion scripts in DIR (default ~/.config/fish/completions) -EOF -} - -say() { - if [ ! $quiet ]; then - echo "install-crate.sh: $1" - fi -} - -say_err() { - say "$1" >&2 -} - -err() { - if [ ! -z $td ]; then - rm -rf $td - fi - - say_err "ERROR $1" - exit 1 -} - -need() { - if ! command -v $1 >/dev/null 2>&1; then - err "need $1 (command not found)" - fi -} - -is_opt() { case $1 in "--"*) true ;; *) false ;; esac } -is_arg() { if [ "$1" ] && ! is_opt $1; then true; else false; fi; } - -quiet=false -force=false -no_tag=false -completion_bash=false -completion_zsh=false -completion_fish=false -comp_dir_bash="${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion/completions" -comp_dir_zsh="${XDG_DATA_HOME:-$HOME/.local/share}/zsh/site-functions" -comp_dir_fish="${XDG_CONFIG_HOME:-$HOME/.config}/fish/completions" -while test $# -gt 0; do - case $1 in - --quiet | -q) - quiet=true - ;; - --crate) - crate=$2 - shift - ;; - --force | -f) - force=true - ;; - --git) - git=$2 - shift - ;; - --help | -h) - help - exit 0 - ;; - --tag) - tag=$2 - shift - ;; - --no-tag) - no_tag=true - ;; - --target) - target=$2 - shift - ;; - --to) - dest=$2 - shift - ;; - --completion) - completion_bash=true - completion_zsh=true - completion_fish=true - ;; - --completion-bash) - completion_bash=true - if is_arg $2; then - comp_dir_bash=$2 - shift - fi - ;; - --completion-zsh) - completion_zsh=true - if is_arg $2; then - echo "$2" - comp_dir_zsh=$2 - shift - fi - ;; - --completion-fish) - completion_fish=true - if is_arg $2; then - comp_dir_fish=$2 - shift - fi - ;; - *) ;; - - esac - shift -done - -# Dependencies -need basename -need curl -need install -need mkdir -need mktemp -need tar - -# Optional dependencies -if [ -z $crate ] || [ -z $tag ] || [ -z $target ]; then - need cut -fi - -if [ -z $tag ]; then - need rev -fi - -if [ -z $target ]; then - need grep - need rustc -fi - -if [ -z $git ]; then - err 'must specify a git repository using `--git`. Example: `install.sh --git japaric/cross`' -fi - -url="https://github.com/$git" -say_err "GitHub repository: $url" - -if [ -z $crate ]; then - crate=$(echo $git | cut -d'/' -f2) -fi - -say_err "Crate: $crate" - -url="$url/releases" - -if [ -z $tag ]; then - tag=$(curl -s "$url/latest" | cut -d'"' -f2 | rev | cut -d'/' -f1 | rev) - say_err "Tag: latest ($tag)" -else - say_err "Tag: $tag" -fi - -if [ -z $target ]; then - target=$(rustc -Vv | grep host | cut -d' ' -f2) -fi - -say_err "Target: $target" - -if [ -z $dest ]; then - dest="$HOME/.cargo/bin" -fi - -if [ $no_tag = true ]; then - crate_tag="$crate" -elif case $tag in "$crate"*) true ;; *) false ;; esac then - crate_tag="$tag" -else - crate_tag="$crate-$tag" -fi - -say_err "Installing to: $dest" -url="$url/download/$tag/${crate_tag}-$target.tar.gz" - -say_err "Downloading: $url" - -td=$(mktemp -d || mktemp -d -t tmp) -curl -sL $url | tar -C $td -xz - -for f in $(find "$td" -type f); do - case $f in - *".bash") - [ $completion_bash ] && install -D $f "$comp_dir_bash/$crate" - ;; - *".zsh" | *"_$crate") - [ $completion_zsh ] && install -D $f "$comp_dir_zsh/_$crate" - ;; - *".fish") - [ $completion_fish ] && install -D $f "$comp_dir_fish/$crate.fish" - ;; - *) ;; - esac - - test -x $f || continue - if [ -e "$dest/$f" ] && [ $force = false ]; then - err "$(dirname $f) already exists in $dest" - else - install -Dm 755 $f $dest - fi -done - -rm -rf $td diff --git a/scripts/.scripts/mega-dl.sh b/scripts/.scripts/mega-dl.sh deleted file mode 100755 index b19be68..0000000 --- a/scripts/.scripts/mega-dl.sh +++ /dev/null @@ -1,121 +0,0 @@ -#!/bin/bash - -# Source: https://gist.github.com/zanculmarktum/170b94764bd9a3da31078580ccea8d7e - -# Copyright 2018, 2019, 2020 Azure Zanculmarktum -# All rights reserved. -# -# Redistribution and use of this script, with or without modification, is -# permitted provided that the following conditions are met: -# -# 1. Redistributions of this script must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED -# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -# Dependencies: -# openssl - -# Usage: -# $ ./megafetch.sh https://mega.nz/#!abcdefgh!1234567890abcdefghijklmnopqrstuvwxyzABCDEFG -# http://gfs208n103.userstorage.mega.co.nz/dl/-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890A -# file.name -# abcefghijklmnopqrstuvwxyz0123456 -# 1234567890abcdef0000000000000000 -# $ wget -O file.name http://gfs208n103.userstorage.mega.co.nz/dl/-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890A -# $ cat file.name | openssl enc -d -aes-128-ctr -K abcefghijklmnopqrstuvwxyz0123456 -iv 1234567890abcdef0000000000000000 > file.name.new -# $ mv -f file.name.new file.name - -URL="" -OUTPATH="$PWD" -USAGE="Usage: ${0##*/} " - -if [[ $1 =~ ^https?:\/\/mega(\.co)?\.nz ]]; then - URL="$1" -fi - -if [[ ! $URL ]]; then - echo $USAGE >&2 - exit 1 -fi - -if [[ ! -z "$2" ]]; then - OUTPATH="$2" -fi - -if [[ ! -d "$OUTPATH" ]]; then - echo $USAGE >&2 - exit 1 -fi - -CURL="curl -Y 1 -y 10" - -missing=false -for cmd in openssl; do - if [[ ! $(command -v "$cmd" 2>&1) ]]; then - missing=true - echo "${0##*/}: $cmd: command not found" >&2 - fi -done -if $missing; then - exit 1 -fi - -if [[ $URL =~ .*/file/[^#]*#[^#]* ]]; then - id="${URL#*file/}" - id="${id%%#*}" - key="${URL##*file/}" - key="${key##*#}" -else - id="${URL#*!}" - id="${id%%!*}" - key="${URL##*!}" -fi - -raw_hex=$(echo "${key}=" | tr '\-_' '+/' | tr -d ',' | base64 -d -i 2>/dev/null | od -v -An -t x1 | tr -d '\n ') -hex=$( - printf "%016x" \ - $((0x${raw_hex:0:16} ^ 0x${raw_hex:32:16})) \ - $((0x${raw_hex:16:16} ^ 0x${raw_hex:48:16})) -) - -json=$($CURL -s -H 'Content-Type: application/json' -d '[{"a":"g", "g":"1", "p":"'"$id"'"}]' 'https://g.api.mega.co.nz/cs?id=&ak=') || exit 1 -json="${json#"[{"}" -json="${json%"}]"}" -file_url="${json##*'"g":'}" -file_url="${file_url%%,*}" -file_url="${file_url//'"'/}" - -json=$($CURL -s -H 'Content-Type: application/json' -d '[{"a":"g", "p":"'"$id"'"}]' 'https://g.api.mega.co.nz/cs?id=&ak=') || exit 1 -at="${json##*'"at":'}" -at="${at%%,*}" -at="${at//'"'/}" - -json=$(echo "${at}==" | tr '\-_' '+/' | tr -d ',' | openssl enc -a -A -d -aes-128-cbc -K "$hex" -iv "00000000000000000000000000000000" -nopad | tr -d '\0') -json="${json#"MEGA{"}" -json="${json%"}"}" -file_name="${json##*'"n":'}" -if [[ $file_name == *,* ]]; then - file_name="${file_name%%,*}" -fi -file_name="${file_name//'"'/}" - -outfile="$OUTPATH/$file_name" - -$CURL -s "$file_url" | openssl enc -d -aes-128-ctr -K "$hex" -iv "${raw_hex:32:16}0000000000000000" >"$outfile" - -echo "$outfile" - -# echo "$file_url" -# echo "$file_name" -# echo "$hex" -# echo "${raw_hex:32:16}0000000000000000" diff --git a/scripts/.scripts/mkln.sh b/scripts/.scripts/mkln.sh deleted file mode 100755 index ef174c2..0000000 --- a/scripts/.scripts/mkln.sh +++ /dev/null @@ -1,115 +0,0 @@ -#!/usr/bin/env bash - -TEMP=$(getopt -o hvqdf --long help,verbose,quiet,debug,force \ - -n 'javawrap' -- "$@") - -if [ $? != 0 ]; then - echo "Terminating..." >&2 - exit 1 -fi - -eval set -- "$TEMP" - -SCRIPT="$(basename $0)" -VERBOSE=false -QUIET=false -DEBUG=false -FORCE=false - -read -r -d '' USAGE <<-EOF -USAGE: $SCRIPT [OPTIONS] - -OPTIONS: - -h, --help Show this message - -v, --verbose Show more output - -q, --quiet Suppress all output - -d, --debug NOT IMPLEMENTED - -f, --force Overwrite items - -ARGS: - ... File to link. -EOF - -while true; do - case "$1" in - -h | --help) - echo "$USAGE" - exit 0 - ;; - -v | --verbose) - VERBOSE=true - shift - ;; - -q | --quiet) - QUIET=true - shift - ;; - -d | --debug) - DEBUG=true - shift - ;; - -f | --force) - FORCE=true - shift - ;; - --) - shift - break - ;; - *) - break - ;; - esac -done - -if ! command -v powershell.exe &>/dev/null; then - [ "$QUIET" != true ] && echo "Powershell not found in path." >&2 - exit 1 -fi - -if [ -z "$2" ]; then - 2="$(pwd)" -fi - -[ "$VERBOSE" == true ] && echo "linking $2 -> $1" - -if [ -d "$1" ]; then - [ "$VERBOSE" == true ] && echo "$1 is a directory. Creating symbolic link." - args='/D' -fi - -mkdir -p $(dirname $2) - -source=$(wslpath -w $1) -target=$(wslpath -w $(dirname $2))\\$(basename $2) - -if ls -la "$(dirname $2)/" 2>/dev/null | grep -q "$(basename $2)"; then - - current_path=$(powershell.exe -c "(Get-Item $target).Target" 2>/dev/null) - - if [[ "${current_path/*wsl$/}" == *"${source/*wsl$/}"* ]]; then - [ "$VERBOSE" == true ] && echo "$(basename $2) is set correctly. Skipping." - exit 0 - fi - - if [ "$FORCE" == true ]; then - [ "$VERBOSE" == true ] && echo "$(basename $2) exists. Overwriting." - rm -rf "$2" - else - [ "$QUIET" != true ] && echo "$(basename $target) already exists. Use -f to overwrite." >&2 - exit 1 - fi -fi - -mkdir -p "$(dirname $2)" -cmd="cd ~; cmd /c mklink ${args} ${target} ${source}" - -if [ "$DEBUG" == true ]; then - [ "$QUIET" != true ] && printf '\nCommand: \n%s\n\n' "powershell.exe -c ${cmd} &>/dev/null" -else - if $QUIET; then - powershell.exe -c "${cmd}" &>/dev/null - else - powershell.exe -c "${cmd}" - fi -fi diff --git a/scripts/.scripts/socket-relay.sh b/scripts/.scripts/socket-relay.sh deleted file mode 100755 index 436fa54..0000000 --- a/scripts/.scripts/socket-relay.sh +++ /dev/null @@ -1,217 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -OPTS=$(getopt -o hds:x: --long help,debug,sock:,exec:,ssh,gpg,gpg-extra,discord -n 'javawrap' -- "$@") - -eval set -- "$OPTS" - -PAGEANT="$HOME/.ssh/wsl2-ssh-pageant.exe" -NPIPE="$(command -v npiperelay.exe)" -SCRIPT="$(basename "$0")" - -help() { - cat <<-EOF -$SCRIPT -Toby Vincent - -$SCRIPT description - -USAGE: - $SCRIPT [OPTIONS] - $SCRIPT [OPTIONS] - -OPTIONS: - -h, --help Display this message - -s, --sock Path to the linux socket - -x, --exec Command to run for socat's EXEC: arg - --ssh Relay the ssh agent's socket - --gpg Relay the gpg agent's socket - --gpg-extra Relay the gpg agent's extra socket - -ARGS: - start (default) - Start the socat process - - stop - Kill the socat process -EOF -} - -say() { - if ! $quiet; then - echo "$SCRIPT: $1" - fi -} - -say_err() { - say "$1" >&2 -} - -err() { - say_err "ERROR: $1" - exit 1 -} - -need() { - for cmd in $@; do - if ! command -v $cmd >/dev/null 2>&1; then - err "need $cmd (command not found)" - fi - done -} - -start() { - if ! ss -a | grep -q "$sock"; then - if test -x "$relay"; then - rm -rf "$sock" - (setsid nohup socat UNIX-LISTEN:"${sock},${listen_args}" EXEC:"$cmd" >/dev/null 2>&1 &) - - else - echo >&2 "WARNING: $relay is not executable." - fi - fi - - if $gpg; then - gpg-connect-agent.exe /bye &>/dev/null - fi -} - -stop() { - if $gpg; then - gpg-connect-agent.exe KILLAGENT /bye &>/dev/null - fi - - if pgrep -f "socat.*$sock.*$relay" &>/dev/null; then - pkill -f "socat.*$sock.*$relay" - fi -} - -check() { - pgrep -fa "socat.*$sock.*$relay" -} - -quiet=false -debug=false -sock="" -cmd="" -gpg=false -ssh=false -extra=false -discord=false -while test $# -gt 0; do - case $1 in - -h | --help) - help - return 0 - ;; - -q | --quiet) - quiet=true - shift - ;; - -d | --debug) - debug=true - shift - ;; - -s | --sock) - sock=$2 - shift - shift - ;; - -x | --exec) - cmd=$2 - shift - shift - ;; - --ssh) - ssh=true - shift - ;; - --gpg) - gpg=true - shift - ;; - --gpg-extra) - gpg=true - extra=true - shift - ;; - --discord) - discord=true - shift - ;; - --) - shift - break - ;; - *) - help - exit 1 - ;; - esac -done - -need ss -need socat - -listen_args="fork" - -case true in -$ssh) - need $PAGEANT - - sock="${SSH_AUTH_SOCK:-$HOME/.ssh/agent.sock}" - cmd="$PAGEANT" - ;; -$gpg) - need $PAGEANT - need "gpg-connect-agent.exe" - - sock="${GPG_AGENT_SOCK:-$HOME/.gnupg/S.gpg-agent}" - if $extra; then - sock+=".extra" - fi - - cmd="$PAGEANT --gpg $(basename $sock)" - ;; -$discord) - need $NPIPE - - sock="${DISCORD_IPC_SOCK:-/var/run/discord-ipc-0}" - cmd="$NPIPE -ep -s //./pipe/$(basename $sock)" - - listen_args="fork,group=discord,umask=007" - ;; -$(test -z "${cmd}")) - err "No EXEC provided. Must supply either --ssh, --gpg, --gpg-extra, --pipe, or --exec" - ;; -esac - -if test -z "${sock}"; then - err "No socket provided." -fi - -relay="$(echo $cmd | head -n1 | awk '{print $1;}')" - -case ${1:-'start'} in -check) - shift - check - ;; -start) - shift - start - ;; -stop) - shift - stop - ;; -restart) - shift - stop - start - ;; -*) - help - exit 1 - ;; -esac diff --git a/scripts/.scripts/td.sh b/scripts/.scripts/td.sh deleted file mode 100755 index 968c98b..0000000 --- a/scripts/.scripts/td.sh +++ /dev/null @@ -1,151 +0,0 @@ -#!/bin/sh -TEMP=$(getopt -o hf --long help,force \ - -n 'javawrap' -- "$@") - -if [ $? != 0 ]; then - echo "Terminating..." >&2 - exit 1 -fi - -eval set -- "$TEMP" - -SCRIPT="$(basename $0)" -ENV_CACHE="${HOME}/.cache/td/.env" - -help() { - cat <<-EOF -$SCRIPT -Toby Vincent - -$SCRIPT is a script for managing and navigating a persistent temp directory. In -order to function properly, this script must be sourced in the currently shell. -Consider setting an alias such as - - alias td=". $SCRIPT" - -USAGE: - $SCRIPT [OPTIONS] - $SCRIPT [OPTIONS] - -OPTIONS: - -h, --help Display this message - -f, --force Use the --force argument when removing TD - -ARGS: - toggle (default) - Switch between TD_ORIGIN and TD. This will create TD if it does not - exist. This is the default if no command is provided. - - new | create - Creates a new temp directory and cds into it it stores the path - to the temp directory in TD, and the path to the previous directory in - TD_ORIGIN. - - rm | remove - Removes the directory stored in TD unsets TD and TD_ORIGIN. - - ls | list | show - Shows the current values for TD and TD_ORIGIN -EOF -} - -echo_err() { - echo >&2 "$SCRIPT: $@" -} - -show() { - if [ ! -n "$TD" ]; then - echo_err "Not set" - return 1 - fi - echo "TD=$TD" - echo "TD_ORIGIN=$TD_ORIGIN" -} - -remove() { - if [ ! -n "$TD" ]; then - echo_err "Not set" - return 1 - fi - - rm "$rm_args" "$TD" - - echo "removed $TD" - - if [ "$PWD" = "$TD" ]; then - cd "$TD_ORIGIN" - fi - - rm "$ENV_CACHE" -rf - unset TD - unset TD_ORIGIN -} - -create() { - remove 2>/dev/null - - td=$(mktemp -d) - - export TD="$td" - update-origin - - echo "created $TD" - cd "$TD" -} - -update-origin() { - export TD_ORIGIN="$PWD" - cat >$ENV_CACHE <<-EOF -TD=$TD -TD_ORIGIN=$TD_ORIGIN -EOF -} - -toggle() { - if [ "$PWD" = "$TD" ]; then - cd "$TD_ORIGIN" - elif [ -n "$TD" ]; then - update-origin - cd "$TD" - else - create - fi -} - -if [ -f "$ENV_CACHE" ]; then - export $(cat "$ENV_CACHE" | xargs) -fi - -rm_args="-r" -while test $# -gt 0; do - case $1 in - --help | -h) - help - return 0 - ;; - --force | -f) - rm_args="-rf" - shift - ;; - --) - shift - break - ;; - *) break ;; - esac -done - -case $1 in -ls | list | show) - show - ;; -rm | remove) - remove - ;; -new | create) - create - ;; -* | toggle) - toggle - ;; -esac -- cgit v1.2.3-70-g09d2