X-Git-Url: https://iankelling.org/git/?a=blobdiff_plain;f=brc2;h=3edbae0f26a47871cf1e0d733f570d0b935f8995;hb=HEAD;hp=eae5aa93439b60f921cc061cacee567cf47d2c1f;hpb=6d1ec26482f86b0f2d9560ce3d04ea8c63297c25;p=distro-setup diff --git a/brc2 b/brc2 index eae5aa9..8406dab 100644 --- a/brc2 +++ b/brc2 @@ -172,7 +172,7 @@ slemacs() { sle() { # sl emacs local f=/home/iank/.emacs.d/init.el - sl --sl-test-cmd ". /etc/os-release ; printf %s \${VERSION//[^a-zA-Z0-9]/}; test -e $f && stat -c%Y $f" --sl-test-hook slemacs "$@" + sl --sl-test-cmd "sed -rn '/^VERSION=/{s/^.*=//;s/[^[:alnum:]]//gp}' /etc/os-release; test -e $f && stat -c%Y $f" --sl-test-hook slemacs "$@" } ccomp ssh sle @@ -441,7 +441,7 @@ ralerts() { # remote alerts ap() { # pushd in case current directory has an ansible.cfg file pushd /a/xans >/dev/null - ansible-playbook -v -l ${1:- $(hostname -f)} site.yml + ansible-playbook -v -i ${1:- $(hostname -f)}, site.yml popd >/dev/null } aw() { @@ -1504,7 +1504,6 @@ btrbk-host-debug() { # $ dig ns1.gnu.org @b0.org.afilias-nst.org. -# todo: make sm pull/push use systemd instead of the journal cat command bbk() { # btrbk wrapper local ret=0 c / @@ -1683,11 +1682,9 @@ jdo() { if [[ $cmd != /* ]]; then cmd=$(type -P "$cmd") fi + #note date format for since is date '+%F %T' # -q = quiet - journalctl -qn2 -f -u "$cmd_name" & - # Trial and error of time needed to avoid missing initial lines. - # .5 was not reliable. 1 was not reliable. 2 was not reliable - sleep 4 + journalctl --since=now -qn2 -f -u "$cmd_name" & jr_pid=$! # note, we could have a version that does system --user, but if for example # it does sudo ssh, that will leave a process around that we can't kill @@ -1855,7 +1852,13 @@ dsign() { # set day start for use in other programs. # expected to do be in a format like 830, or 800 or 1300. ds() { + local regex + regex='[0-9]?[0-9]?[0-9][0-9]' if [[ $1 ]]; then + if [[ ! $1 =~ $regex ]]; then + echo "ds: error. expected \$1 to match $regex, got \$1: $1" + return 1 + fi echo $1 >/b/data/daystart else cat /b/data/daystart @@ -1998,8 +2001,8 @@ apache-header() { # https://www.gnu.org/licenses/license-recommendations.en.html. They # recommend that small programs, < 300 lines, be licensed under the # Apache License 2.0. This file contains or is part of one or more small -# programs. If a small program grows beyond 300 lines, I plan to switch -# its license to GPL. +# programs. If a small program grows beyond 300 lines, I plan to change +# to a recommended GPL license. # Copyright 2024 Ian Kelling @@ -2033,7 +2036,7 @@ apache-apply-repo() { apache-apply() { for file; do - if head -n1 "$file"| grep -E '^#!/bin/bash\b' &>/dev/null; then + if head -n1 "$file"| grep -E '^#!/' &>/dev/null; then { head -n1 "$file" apache-header @@ -2638,17 +2641,28 @@ wgkey() { host-info-all() { host-info-update + bindpushb8 + # for wireguard configs + ssh iank@li.b8.nz conflink wrt-setup } -# if you change a host's ip, then run -# bindpushb8 -# wrt-setup + + + +## for updating host info like ip, location, update /p/c/host-info and +## host_info below. the host_info array should probably be in its own +## file that gets sourced so that it can be more easily updated. + +# todo: this is so long that it becomes confusing, +# try to split it up. +# +# To make some changes take effect, run host-info-all. host-info-update() { - local -A vpn_ips host_ips host_macs nonvpn_ips all_ips + local -A vpn_ips host_ips host_macs portfw_ips nonvpn_ips all_ips local -a root_hosts nonroot_hosts # the hosts with no mac @@ -2677,6 +2691,7 @@ host-info-update() { all_ips[$host]=$ip if $vpn; then + portfw_ips[$host]=$ip vpn_ips[$host]=$ip else nonvpn_ips[$host]=$ip @@ -2686,12 +2701,15 @@ host-info-update() { # hosts is that it is for the User part, the IdentityFile part is # redundant to *.b8.nz. Also note ${host}i, we only setup those for vpn hosts, but there is no harm in overspecifying here. root_hosts+=($host ${host}i $host.b8.nz ${host}i.b8.nz) + root_hosts_a[$host]=t # a for associative array else nonroot_hosts+=($host ${host}i) fi - host_ips[$host]=$ip - host_macs[$host]=$mac + if [[ $mac ]]; then + host_macs[$host]=$mac + fi + done

$tmpf + cedit -e work-identity /p/c/subdir_files/.ssh/config-static <$tmpf + rm -f $tmpf + + ### begin focus on hosts file update ### + # + # This started as its own function, but it actually + # needed to alter the ssh config, so combined it. + # + # background: This is finally doing dynamic ip resolution via the hosts + # file. I considered detecting where each host was dynamically or + # something, but ultimately decided to mostly avoid that, other than + # detecting the status of the current machine I'm on. I want to be able + # to move it around without having to manually type much of anything. + local -a host_domain_suffix hosts + local -A ip_to_hosts + local suf ip i host at_home suf_from_here + + source /p/c/domain-info + + at_home=false + if ip n | grep -q "10.2.0.1 .* b4:75:0e:fd:06:4a"; then + at_home=true + fi + + for i in ${host_domain_suffix[@]}; do + if [[ $i == *.* ]]; then + suf=$i + continue + fi + hosts+=($i) + if [[ $i == "$HOSTNAME" ]]; then + unset "portfw_ips[$i]" + continue + fi + + suf_from_here=$suf + if ! $at_home && [[ $suf == .b8.nz || $suf == [wc].b8.nz ]]; then + suf_from_here=i.b8.nz + else + unset "portfw_ips[$i]" fi + + ip=$(getent ahostsv4 "$i$suf_from_here" | awk '{ print $1 }' | head -n1) ||: + if [[ ! $ip ]]; then + if [[ $suf == .office.fsf.org ]]; then + suf_from_here=wg.b8.nz + ip=$(getent ahostsv4 "$i$suf_from_here" | awk '{ print $1 }' | head -n1) ||: + fi + if [[ ! $ip ]]; then + echo error: failed to get ip of "$i$suf_from_here" + return 1 + fi + fi + ip_to_hosts[$ip]+=" $i" done + + for ip in "${!ip_to_hosts[@]}"; do + echo "$ip${ip_to_hosts[$ip]}" + done | s cedit -e hosts-file-up /etc/hosts + for host in ${hosts[@]}; do + echo $host + done >/p/c/subdir_files/.dsh/group/btrbk + ### end focus on hosts file update ### + + + # note: note sure if this is a great way to check. + # todo: think about it + + if $at_home; then + # possible that in the future we want to create + # a dynamic file here, and then we can move the cat + # command above out of the conditional + rsync -a /p/c/subdir_files/.ssh/config-static ~/.ssh/config + else + for host in ${!portfw_ips[@]}; do + ipsuf=${portfw_ips[$host]} + cat < ~/.ssh/config-dynamic + cat /p/c/subdir_files/.ssh/config-static ~/.ssh/config-dynamic >~/.ssh/config + fi } # usage host ipsuf [extrahost] @@ -3264,8 +3382,8 @@ myprof() { pushd /home/iank/.local/share/profanity/chatlogs/iank_at_fsf.org/rooms/office_at_conference.fsf.org logs=(*) logcount=${#logs[@]} - if (( logcount > 15 )); then - i=$(( logcount - 15 )) + if (( logcount > 16 )); then + i=$(( logcount - 16 )) else i=0 fi @@ -4057,10 +4175,7 @@ vpn() { fi [[ $1 ]] || { echo need arg; return 1; } - journalctl --unit=$vpn_service@$1 -f -n0 & - # sometimes the journal doesnt open until after the vpn output - # has happened. hoping this fixes that. - sleep 1 + journalctl --since=now --unit=$vpn_service@$1 -f -n0 & sudo systemctl start $vpn_service@$1 # sometimes the ask-password agent does not work and needs a delay. sleep .5 @@ -4079,15 +4194,17 @@ fixu() { fi } -# unmute +# unmute desktop output um() { - local sink card + local sink card sedcmd sink=$(pactl get-default-sink) if [[ $sink == auto_null ]]; then # guessing there is just one with an off profile. otherwise we will # need some other solution, like storing the card identifier that we - # muted with nap. - card=$(pacmd list-cards | sed -n '/^[[:space:]]*index:/{s/^[[:space:]]*index://;h};/^[[:space:]]*active profile: $/{g;p;q}') + # muted with nap. Or, we could so some hakery with + # pactl -f json. + sedcmd='/^[[:space:]]*index:/{s/^[[:space:]]*index://;h};/^[[:space:]]*active profile: $/{g;p;q}' + card=$(pacmd list-cards | sed -n "$sedcmd") m pacmd set-card-profile "$card" output:analog-stereo fi @@ -4605,7 +4722,8 @@ ftoc() { units "tempF($1)" tempC } -# requires dns/firewall setup first +# note: requires dns setup of live.iankelling.org, & if i'm home, port +# forwarding in wrt-setup-local. todo: automate that. local-icecast() { web-conf -e ian@iankelling.org -f 8000 - apache2 live.iankelling.org <<'EOF' @@ -4652,6 +4770,30 @@ tclear() { done } +opensslcertinfo() { + openssl x509 -txt -in "$@" +} + +# dsh on btrbk hosts +dsb() { + : +} + +# dsh a file and run it +dsa() { + local ret file + if ! parallel -j 10 scp x {}:/tmp <~/.dsh/group/btrbk; then + echo parallel scp failed. dsa returning $ret + fi + dsh -g btrbk +} + +# temporary +zmqsend() { + /nocow/t/ffmpeg-release/ffmpeg-7.0.1/tools/zmqsend "$@" +} + +ffg() { /nocow/t/ffmpeg-release/ffmpeg-7.0.1/tools/graph2dot -o /tmp/g.tmp && dot -Tpng /tmp/g.tmp -o /tmp/g.png && feh /tmp/g.png; } export BASEFILE_DIR=/a/bin/fai-basefiles