diff --git a/00_aliases b/aliases/00_aliases similarity index 100% rename from 00_aliases rename to aliases/00_aliases diff --git a/backup b/backup new file mode 100755 index 0000000..adfe508 --- /dev/null +++ b/backup @@ -0,0 +1,35 @@ +#!/bin/bash + +declare -A to_copy to_rsync +repo="$(pwd)" + +# files to copy +to_copy["${HOME}/.bashrc"]='shell/bashrc' + +# directories to copy +to_rsync["${HOME}/.config/aliases"]='aliases' + +# directories to copy +to_rsync["${HOME}/bin"]='bin' + +for src in "${!to_copy[@]}"; do + dst="${to_copy[$src]}" + dir="$(dirname "$dst")" + file="$(basename "$dst")" + if [[ ! -d "${repo}/${dir}" ]]; then + mkdir -p "${repo}/${dir}" + fi + rsync -a "$src" "${repo}/${dir}/${file}" + if [[ $? != 0 ]]; then + printf 'Copying "%s" to "%s" had an error.\n' "$src" "$dst" >&2 + fi +done + +for src in "${!to_rsync[@]}"; do + dst="${to_rsync[$src]}" + if [[ ! -d "$src" ]]; then + printf '"%s" does not exist. Can not copy.\n' "$src" >&2 + else + (cd "$src" && rsync -a * "${repo}/${dst}/") + fi +done diff --git a/bin/chrome b/bin/chrome new file mode 100755 index 0000000..d427036 --- /dev/null +++ b/bin/chrome @@ -0,0 +1,7 @@ +#!/bin/bash +logfile="/dev/shm/chrome_log_$$" +google-chrome-stable --enable-features=UseOzonePlatform --ozone-platform=wayland "$@" &> "$logfile" +if [[ $? != 0 ]]; then + printf 'Check logfile: %s\n' "$logfile" + exit $? +fi diff --git a/bin/mtx b/bin/mtx new file mode 120000 index 0000000..1ae3ce6 --- /dev/null +++ b/bin/mtx @@ -0,0 +1 @@ +tmux_control \ No newline at end of file diff --git a/bin/mx b/bin/mx new file mode 120000 index 0000000..1ae3ce6 --- /dev/null +++ b/bin/mx @@ -0,0 +1 @@ +tmux_control \ No newline at end of file diff --git a/bin/nethup b/bin/nethup new file mode 100755 index 0000000..7651665 --- /dev/null +++ b/bin/nethup @@ -0,0 +1,4 @@ +#!/bin/bash + +doas systemctl restart iwd +doas systemctl restart dhcpcd diff --git a/bin/power b/bin/power new file mode 100755 index 0000000..356f309 --- /dev/null +++ b/bin/power @@ -0,0 +1,160 @@ +#!/usr/bin/env python3 + +import argparse +import logging +import pexpect +import pprint +import sys + + +class power(object): + def __init__(self): + self.strip_handle = None + + self.usb_port_to_device = { + '1': 'pi3battery' + } + self.usb_device_to_port = self.reverse_usb_ports() + + self.strip_port_to_device = { + 'AA2': '10g_netgear', + 'AA6': 'monitor', + 'AA16': 'ndanknasty', + 'AA17': 'muppet', + 'AA19': 'usb_hub', + 'AA21': 'ultra_arikui', + 'AA22': 'nodegrid', + 'AA23': 'nodegrid:PS2', + 'AA24': 'office_wap_poe', + 'AA25': 'tray_switch', + 'AA26': 'den_wap_poe', + 'AA27': 'studio_wap_poe', + 'AA28': '1g_netgear', + 'AA29': 'danknasty', + } + self.strip_device_to_port = self.reverse_strip_ports() + print(self.strip_port_to_device.values()) + self.device_types = {'rpm': device for device in self.strip_port_to_device.values()} + for i in self.device_types: + print(i, self.device_types[i]) + sys.exit(1) + + def list_devices(self): + print('Configured devices:') + for device in self.strip_device_to_port: + print(f' {device}') + + def list_ports(self): + print('Configured ports:') + for port in self.strip_port_to_device: + print(f' {port}') + + def strip_command(self, cmd): + if not self.strip_handle: + self.strip_connect() + self.strip_con + + def process(self, args): + if args.debug: + logging.basicConfig(level=logging.DEBUG) + logging.debug('Logging set to DEBUG') + logging.debug(args) + if args.on: + logging.debug(f'on: {args.on}') + self.on(args.on) + if args.off: + logging.debug(f'off: {args.off}') + self.off(args.off) + if args.listall: + logging.debug('displaying all config') + self.list_all() + + def list_all(self): + print() + print('Power Strip:') + for k, v in self.strip_device_to_port.items(): + print(k, ', '.join(v)) + print() + print('USB Hub:') + for k, v in self.usb_device_to_port.items(): + print(k, v) + + def on(self, device_list): + devices = device_list.split(',') + for device in devices: + if device not in self.strip_device_to_port: + logging.error(f'"{device}" not a known device.') + self.list_devices() + sys.exit(1) + + def off(self, args): + sys.exit('bye') + devices = device_list.split(',') + logging.debug(f'turning off {devices}') + + def status(self, args): + pass + + def reverse_usb_ports(self): + return {device: port for (port, device) in self.usb_port_to_device.items()} + + def reverse_strip_ports(self): + strip_device_to_port = {} + for strip_port, device in self.strip_port_to_device.items(): + if device not in strip_device_to_port: + strip_device_to_port[device] = [] + strip_device_to_port[device].append(strip_port) + return strip_device_to_port + + def exp(self, p, results, timeout=30): + results[pexpect.TIMEOUT] = 'timeout' + results[pexpect.EOF] = 'disconnect' + list_res = list(results.keys()) + + res = p.expect(list_res, timeout=timeout) + text_res = results[list_res[res]] + if text_res == 'timeout': + sys.exit('timeout') + elif text_res == 'disconnect': + sys.exit('disconnect') + return text_res + + def ssh_connect(self, host): + cmd = ['ssh', host] + p = pexpect.spawnu(' '.join(cmd)) + p.logfile = sys.stderr + + results = {'Password: ': 'prompt'} + res = exp(p, results) + p.sendline('admn') + results = {'Switched PDU: ': 'prompt'} + res = exp(p, results) + + +def main(): + parser = argparse.ArgumentParser() + + actions = parser.add_argument_group('actions') + action = actions.add_mutually_exclusive_group(required=True) + action.add_argument('--status', metavar='DEVICES', help='get power status of a device', type=str) + action.add_argument('--off', metavar='DEVICES', help='turn off device', type=str) + action.add_argument('--on', metavar='DEVICES', help='turn on device', type=str) + action.add_argument('--reboot', metavar='DEVICES', help='reboot a device', type=str) + action.add_argument('--portoff', metavar='PORTS', help='turn off a port', type=str) + action.add_argument('--porton', metavar='PORTS', help='turn on port', type=str) + action.add_argument('--listdev', help='list devices', action='store_true') + action.add_argument('--listport', help='list ports', action='store_true') + action.add_argument('--listall', help='show all config', action='store_true') + + options = parser.add_argument_group('options') + options.add_argument('--output', help='choose output: text, json', type=str, choices=['text', 'json']) + options.add_argument('--debug', help='turn on debug output', action='store_true') + + args = parser.parse_args() + + p = power() + p.process(args) + + +if __name__ == '__main__': + main() diff --git a/bin/record_nosound b/bin/record_nosound new file mode 100755 index 0000000..961aa0a --- /dev/null +++ b/bin/record_nosound @@ -0,0 +1,2 @@ +#!/bin/bash +wf-recorder -g "$(slurp)" --file=$(date "+%s").mp4 diff --git a/bin/record_sound b/bin/record_sound new file mode 100755 index 0000000..432cbb7 --- /dev/null +++ b/bin/record_sound @@ -0,0 +1,2 @@ +#!/bin/bash +wf-recorder -g "$(slurp)" --audio --file=$(date "+%s").mp4 diff --git a/bin/stx b/bin/stx new file mode 120000 index 0000000..1ae3ce6 --- /dev/null +++ b/bin/stx @@ -0,0 +1 @@ +tmux_control \ No newline at end of file diff --git a/bin/sx b/bin/sx new file mode 120000 index 0000000..1ae3ce6 --- /dev/null +++ b/bin/sx @@ -0,0 +1 @@ +tmux_control \ No newline at end of file diff --git a/bin/tls b/bin/tls new file mode 120000 index 0000000..1ae3ce6 --- /dev/null +++ b/bin/tls @@ -0,0 +1 @@ +tmux_control \ No newline at end of file diff --git a/bin/tmux_control b/bin/tmux_control new file mode 100755 index 0000000..78c770e --- /dev/null +++ b/bin/tmux_control @@ -0,0 +1,128 @@ +#!/usr/bin/env bash + +function link_or_rm() { + local env="$1" + local tmp="$2" + if [[ -z "${env}" ]]; then + # No auth sock; remove symlink, if any. + rm -f -- "${tmp}" + elif [[ "${env}" != "${tmp}" ]]; then + # Construct expected symlink to point to auth sock. + ln -snf -- "${env}" "${tmp}" + fi +} + +# Get invocation, stx or mtx +zero="$0" +invocation=$(basename "$zero") + +case "$invocation" in + tmux_control) + declare -a tmux_links + tmux_links=( stx mtx sx mx tls ) + for link in "${tmux_links[@]}"; do + if [[ ! -h "${HOME}/bin/${link}" ]]; then + (cd "${HOME}/bin" && ln -s "tmux_control" "${link}") + fi + done + echo 'stx or sx for inner sessions; mtx or mx for outer sessions, tls to list all sessions' >&2 + exit 1 + ;; + sx) + socket="tmux_${USER}_stx" + tmux -L "${socket}" "$@" + exit $? + ;; + mx) + socket="tmux_${USER}_mtx" + tmux -L "${socket}" "$@" + exit $? + ;; + tls) + declare -a sockets + readarray -d '' sockets < <(find "/tmp/tmux-$(id -u)" -maxdepth 1 -type s -print0) + for socket in ${sockets[*]}; do + printf '%s\n' "$socket" + tmux -L "$(basename "${socket}")" list-sessions | sed 's/^/ /' + done + exit 0 +esac + +socket="tmux_${USER}_${invocation}" + +style="inner" +if [[ "${invocation}" == mtx ]]; then + style="outer" +fi + +config="${HOME}/.tmux.conf_${style}" + +session_name="default" +if [[ -n $1 ]]; then + session_name="$1" +fi + +if [[ "$1" == "test" ]]; then + echo "invocation: ${invocation}" + echo "config: ${config}" + echo "session: ${session_name}" + exit 0 +fi + +if [[ ! -f "${config}" ]]; then + echo "Didn't find ${config}" >&2 + exit 1 +fi + +# Make the temp directory if it doesn't exist +home_sock_folder="${HOME}/.tmp" +if ! [ -d "${home_sock_folder}" ]; then + mkdir -m 700 "${home_sock_folder}" +fi + +# Symlinks to sockets that might change out from under tmux +if [[ -z "${TMUX}" ]] || [[ "$style" == "inner" && "$TMUX" =~ mtx ]]; then + ssh_auth_sock_symlink="${home_sock_folder}/ssh_auth_sock" + fwd_ssh_sock_symlink="${home_sock_folder}/fwd_ssh_auth_sock" + sway_sock_symlink="${home_sock_folder}/sway_sock" + i3_sock_symlink="${home_sock_folder}/i3_sock" + link_or_rm "${SSH_AUTH_SOCK}" "${ssh_auth_sock_symlink}" + link_or_rm "${FWD_SSH_AUTH_SOCK}" "${fwd_ssh_sock_symlink}" + # SWAYSOCK == I3SOCK, probably some Xwayland compatability thing + link_or_rm "${SWAYSOCK}" "${sway_sock_symlink}" + link_or_rm "${SWAYSOCK}" "${i3_sock_symlink}" + + # See if there are any sessions on this socket + echo running: tmux -L "${socket}" list-sessions + tmux -L "${socket}" list-sessions + echo results: $? + if [[ $? != 0 ]]; then + # No tmux session @ $socket + exec env \ + I3SOCK="${i3_sock_symlink}" \ + SWAYSOCK="${sway_sock_symlink}" \ + SSH_AUTH_SOCK="${ssh_auth_sock_symlink}" \ + FWD_SSH_AUTH_SOCK="${f}" \ + tmux -f "${config}" -L "${socket}" ${args} new-session -s "${session_name}" + + elif tmux -L "${socket}" list-sessions 2>/dev/null | grep "^${session_name}:" &>/dev/null; then + # A named session exists + exec env \ + I3SOCK="${i3_sock_symlink}" \ + SWAYSOCK="${sway_sock_symlink}" \ + SSH_AUTH_SOCK="${ssh_auth_sock_symlink}" \ + FWD_SSH_AUTH_SOCK="${f}" \ + tmux -f "${config}" -L "${socket}" ${args} attach -t "${session_name}" + else + # Some session lives at that socket but it's a different name than is given + exec env \ + I3SOCK="${i3_sock_symlink}" \ + SWAYSOCK="${sway_sock_symlink}" \ + SSH_AUTH_SOCK="${ssh_auth_sock_symlink}" \ + FWD_SSH_AUTH_SOCK="${f}" \ + tmux -f "${config}" -L "${socket}" ${args} new-session -s "${session_name}" + fi +else + echo "Already in a tmux session. Giving up." + exit 1 +fi diff --git a/restore b/restore new file mode 100755 index 0000000..08be580 --- /dev/null +++ b/restore @@ -0,0 +1,35 @@ +#!/bin/bash + +declare -A to_copy to_rsync +repo="$(pwd)" + +# files to copy +to_copy["${HOME}/.bashrc"]='shell/bashrc' + +# directories to copy +to_rsync["${HOME}/.config/aliases"]='aliases' + +# directories to copy +to_rsync["${HOME}/bin"]='bin' + +for dst in "${to_copy[@]}"; do + src="${to_copy[$dst]}" + dir="$(dirname "$src")" + file="$(basename "$src")" + if [[ ! -d "${dir}" ]]; then + mkdir -p "${dir}" + fi + (cd "$dir" && rsync -a "$file" "${dir}" + if [[ $? != 0 ]]; then + printf 'Copying "%s" to "%s" had an error.\n' "$src" "$dst" >&2 + fi +done + +for dst in "${to_rsync[@]}"; do + src="${to_rsync[$dst]}" + if [[ ! -d "$dst" ]]; then + printf '"%s" does not exist. Can not copy.\n' "$src" >&2 + else + (cd "$src" && rsync -a * "${repo}/${dst}/") + fi +done diff --git a/bashrc b/shell/bashrc similarity index 100% rename from bashrc rename to shell/bashrc