X-Git-Url: https://iankelling.org/git/?a=blobdiff_plain;f=brc;h=2a81b25fa369f557d373f431d3c56400f61e9707;hb=9a0f77b0495e6f2643d5646c54b4c99cf3118c67;hp=a47a6fa6cb6d99ef82ae7eb6be6742e868958bf8;hpb=0f9a999aa601cd77343a3e08cf0c6c4f9f943813;p=distro-setup diff --git a/brc b/brc index a47a6fa..2a81b25 100644 --- a/brc +++ b/brc @@ -128,19 +128,79 @@ fi export SSH_CONFIG_FILE_OVERRIDE=/root/.ssh/confighome + + # emacs has a different default search path than the info command. This -# adds the info defaults to emacs, but not the reverse, because I dun +# adds the info defaults to emacs. This is commented because after +# various upgrades this is no longer a problem: for the directories that +# exist on my system, emacs already includes the ones that info +# searches. +# +# but not the reverse, because I dun # care much about the cli. The search path is only on the cli if you run # "info xxx", or in emacs if you run '(info xxx)', so not that -# important, but might as well fix it. +# important and i don't bother fixing it. + +# # info info says this path is what was compiled, and its not documented +# # anywhere. Through source grepping, i found it in files.h of the info +# # source in trisquel flidas. +# # +# # Trailing : means for emacs to add its own stuff on to the end. +# # +# # A problem with this is that directories which are not readable breaks info. And of course, this hard coding is not nice. +# # I removed PATH from the start, because I've never seen an info file in PATH. And removed ".", because I can just specify the full file name in that case. +# # +# # https://raw.githubusercontent.com/debian-tex/texinfo/master/info/filesys.h +# # + +# # note: to split up the var like this, do: +# # IFS=:; printf '%s\n' $INFOPATH + +# dirs=( +# /usr/local/info +# /usr/info +# /usr/local/lib/info +# /usr/lib/info +# /usr/local/gnu/info +# /usr/local/gnu/lib/info +# /usr/gnu/info +# /usr/gnu/lib/info +# /opt/gnu/info +# /usr/share/info +# /usr/share/lib/info +# /usr/local/share/info +# /usr/local/share/lib/info +# /usr/gnu/lib/emacs/info +# /usr/local/gnu/lib/emacs/info +# /usr/local/lib/emacs/info +# /usr/local/emacs/info +# ) + +# for d in ${dirs[@]}; do +# if [[ -r $d ]]; then +# INFOPATH="$d:$INFOPATH" +# fi +# done +# unset d dirs + + +# note: guix bash config does this automatically. +if [[ $INFOPATH != *: ]]; then + INFOPATH="$INFOPATH:" +fi -# info info says this path is what was compiled, and its not documented -# anywhere. Through source grepping, i found it in filesys.h of the info -# source in trisquel flidas. +# info parameter expansion +# +# info cheat sheet: +# H: see keybinds +# / search, {, }: next/prev match +# ctrl/alt-v scroll forward/backward within this node +# l: go to previous node # -# Traling : means for emacs to add its own stuff on to the end. +info-pe() { + info bash 'Basic Shell Features' 'Shell Expansions' 'Shell Parameter Expansion' +} -export INFOPATH=$PATH:/usr/local/info:/usr/info:/usr/local/lib/info:/usr/lib/info:/usr/local/gnu/info:/usr/local/gnu/lib/info:/usr/gnu/info:/usr/gnu/lib/info:/opt/gnu/info:/usr/share/info:/usr/share/lib/info:/usr/local/share/info:/usr/local/share/lib/info:/usr/gnu/lib/emacs/info:/usr/local/gnu/lib/emacs/info:/usr/local/lib/emacs/info:/usr/local/emacs/info:.: # for openwrt system that has no stty, this is easier than # guarding every time i use it. @@ -648,6 +708,76 @@ jdo() { (( ret == 0 )) || return $ret } ccomp time jdo + +# standard date as used in logs +datelog() { + date +%Y-%m-%d "$@" +} + +# date in log appropriate format +dtl() { + date "+%F %T" "$@" +} + +# ts formatted +tsf() { + command ts "%F %T" "$@" +} + +# ts log. log command to log file. +# usage: tsl LOG_PATH_PREFIX COMMAND... +# example: tsl /root/command +# log file will be like /root/command-2024-02-10.log +tsl() { + local log_prefix log_path appending ret + if (( $# < 2 )); then + echo "tsl: error: expected >= 2 arguments, got $#" >&2 + return 1 + fi + log_prefix="$1" + if [[ $log_prefix == */* && ! -d ${log_prefix%*/} ]]; then + echo "tsl: error: expected directory at ${log_prefix%*/}" >&2 + return 1 + fi + log_path=$log_prefix-$(date +%Y-%m-%d).log + appending=false + if [[ -s $log_path ]]; then + appending=true + fi + shift + printf "%s\n" "CWD: $PWD, log: $log_path, running $*" | ts "%F %T" | tee -a "$log_path" + ret=0 + "$@" |& ts "%F %T" | tee -a "$log_path" || ret=$? + printf "%s\n" "exit code $ret from command: $*" | ts "%F %T" | tee -a "$log_path" + if $appending; then + printf "%s\n" "note: this log file contains logs before those of previous command" | ts "%F %T" | tee -a "$log_path" + fi +} + +disk-info() { + local cmds cmd + mapfile -t cmds <<'EOF' +tail -n +1 /proc/mdstat /etc/mdadm/mdadm.conf /etc/fstab /etc/crypttab +lsblk +blkid +ls -la /dev/disk/by-id +EOF + + for cmd in "${cmds[@]}"; do + cat <$tmp || [[ $? == 1 ]] # 1 when it doesnt exist in the file + if [[ -s $tmp ]]; then + key=$(sed -r 's/^.*([^ ]+ +[^ ]+) *$/\1/' $tmp) + fi + rm $tmp if [[ $key ]]; then grep -Fv "$key" "$file" | sponge "$file" fi + key= fi - key=$(ssh-keygen -F "$ip_entry" -f $file | sed -r 's/^.*([^ ]+ +[^ ]+) *$/\1/') + tmp=$(mktemp) + ssh-keygen -F "$ip_entry" -f $file >$tmp || [[ $? == 1 ]] + if [[ -s $tmp ]]; then + key=$(sed -r 's/^.*([^ ]+ +[^ ]+) *$/\1/' $tmp) + fi + rm $tmp if [[ $key ]]; then grep -Fv "$key" "$file" | sponge "$file" fi ll ~/.ssh/known_hosts - rootsshsync } -khfix() { # known hosts fix - _khfix_common "$@" || return 1 +khfix-r() { # known hosts fix + root + _khfix-common "$@" || return 1 ssh $1 : + rootsshsync } -khcopy() { - _khfix_common "$@" - ssh-copy-id $1 +khfix() { + _khfix-common "$@" || return 1 + ssh $1 : } # copy path into clipboard @@ -1540,7 +1681,86 @@ hlm() { hl "$*"; "$@"; } hrcat() { local f; for f; do [[ -f $f ]] || continue; hr; echo "$f"; cat "$f"; done } +# example usage: +# github-release-dl restic/restic restic_ _linux_amd64.bz2 +# gets a url like: +# https://github.com/restic/restic/releases/download/v0.16.3/restic_0.16.3_linux_amd64.bz2 +github-release-dl() { + local github_path file_prefix file_suffix latest_prefix version redir_path + github_path=$1 + file_prefix=$2 + file_suffix=$3 + if (( $# != 3 )); then + echo "$0: error, expected 3 arguments" >&2 + return 1 + fi + redir_path="https://github.com/$github_path/releases/latest/download/" + latest_prefix=$(curl -s -I "$redir_path" | awk 'tolower($1) == "location:" {print $2}') + # it has a trailing /r at the end. just kill any whitespace. + latest_prefix="${latest_prefix//[$'\t\r\n ']}" + if [[ ! $latest_prefix ]]; then + echo "failed to find latest path. Tried to find case insensitive 'location:' in the curl output:" + m curl -s -I "$redir_path" + return 1 + fi + version="${latest_prefix##*/}" + version="${version#v}" + m wget -- "$latest_prefix/$file_prefix$version$file_suffix" +} + +# examples. +# go-github-install restic/restic restic_ _linux_amd64.bz2 +# go-github-install restic/rest-server rest-server_ _linux_amd64.tar.gz + +# common pattern among go binaries on github +go-github-install() { + local tmpd targetf tmp files src + tmpd=$(mktemp -d) + cd $tmpd + file_prefix=$2 + file_suffix=$3 + tmp="${file_prefix##*[[:alnum:]]}" + targetf="${file_prefix%$tmp}" + echo targetf: $targetf + github-release-dl "$@" + files=(./*) + case $file_suffix in + *.bz2) + bunzip2 -- ./* + ;; + *.tar.gz|*.tgz) + tar -vxzf ./* + ;; + esac + rm -f -- "${files[@]}" + files=(./*) + # Here we detect and handle 2 cases: either we extracted a single + # binary which we have to rename or a folder with a binary named + # $targetf in it which is all we care about. + if (( ${#files[@]} == 1 )) && [[ -f ${files[0]} ]]; then + chmod +x ./* + mv -- ./* /usr/local/bin/$targetf + else + files=(./*/$targetf) + if [[ -f $targetf ]]; then + src=$targetf + elif [[ -f ${files[0]} ]]; then + src="${files[0]}" + fi + chmod +x "$src" + mv -- "$src" /usr/local/bin + fi + cd - >/dev/null + rm -rf $tmpd +} +## 2024: I'm using gh instead of hub, but leaving this just in case. +## I tried the github cli tool (gh) and it seems easier than +## I remember hub. +## +## hub predated github's 2020 official cli tool gh. +## more info at +## https://raw.githubusercontent.com/cli/cli/trunk/docs/gh-vs-hub.md # get latest hub and run it # main command to use: # hub pull-request --no-edit @@ -2069,6 +2289,16 @@ sedi() { +# todo: test variable assignment with newlines here. +# https://stackoverflow.com/questions/15783701/which-characters-need-to-be-escaped-when-using-bash + +# beware that it only works on the assumption that any special +# characters in the input string are intended to be escaped, not to work +# as special chacters. +shellescape() { + LC_ALL=C sed -e 's/[^a-zA-Z0-9,._+@%/-]/\\&/g; 1{$s/^$/""/}; 1!s/^/"/; $!s/$/"/' +} + rmstrips() { ssh fencepost head -n 300 /gd/gnuorg/EventAndTravelInfo/rms-current-trips.txt | less } @@ -2697,14 +2927,19 @@ vmunshare() { } myiwscan() { - # find input, copy to pattern space, when we find the first field, print the copy in different order without newlines. - # instead of using labels, we could just match a line and group, eg: /signal:/,{s/signal:(.*)/\1/h} - sudo iw dev wls1 scan | sed -rn " + local i + interfaces=$(iw dev | awk '$1 == "Interface" {print $2}') + for i in $interfaces; do + echo "myiwscan: considering $i" + # find input, copy to pattern space, when we find the first field, print the copy in different order without newlines. + # instead of using labels, we could just match a line and group, eg: /signal:/,{s/signal:(.*)/\1/h} + sudo iw dev $i scan | sed -rn " s/^\Wcapability: (.*)/\1/;Ta;h;b :a;s/^\Wsignal: -([^.]+).*/\1/;Tb;H;b # padded to min width of 20 :b;s/\WSSID: (.*)/\1 /;T;s/^(.{20}(.*[^ ])?) */\1/;H;g;s/(.*)\n(.*)\n(.*)/\2 \3 \1/gp;b "|sort -r + done } # Run script by copying it to a temporary location first, @@ -2858,30 +3093,44 @@ cm() { } -disk-info() { - local cmds cmd - mapfile -t cmds <<'EOF' -tail -n +1 /proc/mdstat /etc/mdadm/mdadm.conf /etc/fstab /etc/crypttab -lsblk -blkid -ls -la /dev/disk/by-id -EOF +fsf-sv-header() { + local f + local -a f_maybe + if ! type -p sponge &>/dev/null; then + echo "$0: error: missing dependency: sudo apt install moreutils" >&2 + return 1 + fi - for cmd in "${cmds[@]}"; do - cat < -\`\`\` -EOF - $cmd - cat <<'EOF' +Copyright (C) $(date +%Y) Free Software Foundation -``` +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. This file is offered as-is, +without any warranty. + +Contributions are welcome. See . EOF done } + +tsr() { # ts run + "$@" |& ts || return $? +} + + # * misc stuff