various fixes
[distro-setup] / .bashrc
diff --git a/.bashrc b/.bashrc
index d2b80bf96a4042514a5c7c1675c31af23fb32fdb..912b678aac9c76bb8e67408ce6436125af0cc70b 100644 (file)
--- a/.bashrc
+++ b/.bashrc
@@ -1,3 +1,17 @@
+# Copyright (C) 2016 Ian Kelling
+
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+
+#     http://www.apache.org/licenses/LICENSE-2.0
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 # to debug
 #set -x
 # redirect output to log file. this doesn't work. todo figure out why
@@ -196,12 +210,12 @@ C_DEFAULT_DIR=/a
 ## include files ###
 ###################
 
-for _x in /a/bin/distro-functions/src/* /a/bin/*/*-function; do
+for _x in /a/bin/distro-functions/src/* /a/bin/!(githtml)/*-function?(s); do
     source "$_x"
 done
 unset _x
 # so I can share my bashrc
-for x in /a/bin/bash_unpublished/*; do source $x; done
+for x in /a/bin/bash_unpublished/!(.#*); do source $x; done
 source $(dirname $(readlink -f $BASH_SOURCE))/path_add-function
 source /a/bin/log-quiet/logq-function
 path_add /a/exe
@@ -301,9 +315,9 @@ _cdiff-prep() {
 
 _khfix_common() {
     local h=${1##*@}
-    ssh-keygen -R $h
+    ssh-keygen -R $h -f $(readlink -f ~/.ssh/known_hosts)
     local x=$(timeout 0.1 ssh -v $1 |& sed -rn "s/debug1: Connecting to $h \[([^\]*)].*/\1/p");
-    ssh-keygen -R $x
+    ssh-keygen -R $x -f $(readlink -f ~/.ssh/known_hosts)
 }
 khfix() { # known hosts fix
     _khfix_common "$@"
@@ -371,22 +385,28 @@ cdiff() {
     done < "$unified"
 }
 
-cgpl ()
+cgpl()
 {
-    if [[ $# == 0 ]]; then
+    if (($#)); then
+        cp /a/bin/data/COPYING "$@"
+    else
         cp /a/bin/data/COPYING .
+    fi
+}
+capache()
+{
+    if (($#)); then
+        cp /a/bin/data/LICENSE "$@"
     else
-        cp /a/bin/data/COPYING "$@"
+        cp /a/bin/data/LICENSE .
     fi
 }
-
 chown() {
     # makes it so chown -R symlink affects the symlink and its target.
     if [[ $1 == -R ]]; then
         shift
         command chown -h "$@"
-        command chown "$@"
-        command chown -RH "$@"
+        command chown -R "$@"
     else
         command chown "$@"
     fi
@@ -558,6 +578,9 @@ rename-test() {
     return 0
 }
 
+feh() {
+    command feh -FzZ "$@"
+}
 
 funce() {
     # like -e for functions. returns on error.
@@ -574,6 +597,30 @@ fw() {
     firefox -P default "$@" >/dev/null 2>&1
 }
 
+getdir () {
+    local help="Usage: getdir [--help] PATH
+Output the directory of PATH, or just PATH if it is a directory."
+    if [[ $1 == --help ]]; then
+        echo "$help"
+        return 0
+    fi
+    if [[ $# -ne 1 ]]; then
+        echo "getdir error: expected 1 argument, got $#"
+        return 1
+    fi
+    if [[ -d $1 ]]; then
+        echo "$1"
+    else
+        local dir="$(dirname "$1")"
+        if [[ -d $dir ]]; then
+            echo "$dir"
+        else
+            echo "getdir error: directory does not exist"
+            return 1
+        fi
+    fi
+}
+
 git_empty_branch() { # start an empty git branch. carefull, it deletes untracked files.
     [[ $# == 1 ]] || { echo 'need a branch name!'; return 1;}
     local gitroot
@@ -584,14 +631,25 @@ git_empty_branch() { # start an empty git branch. carefull, it deletes untracked
     git clean -fdx
 }
 
+gitroot() {
+    local help="Usage: gitroot [--help]
+Print the full path to the root of the current git repo
+
+Handles being within a .git directory, unlike git rev-parse --show-toplevel,
+and works in older versions of git which did not have that."
+    if [[ $1 == --help ]]; then
+        echo "$help"
+        return
+    fi
+    local p=$(git rev-parse --git-dir) || { echo "error: not in a git repo" ; return 1; }
+    [[ $p != /* ]] && p=$PWD
+    echo "${p%%/.git}"
+}
+
 gr() {
     grep -iIP --color=auto "$@"
 }
 
-
-
-
-
 grr() {
     if [[ ${#@} == 1 ]]; then
         grep -riIP --color=auto "$@" .
@@ -619,7 +677,7 @@ hl() { # history limit. Write extra history to archive file.
     if (($linecount > $max_lines)); then
         prune_lines=$(($linecount - $max_lines))
         head -n $prune_lines "$HISTFILE" >> "$harchive" \
-            && sed -ie "1,${prune_lines}d"  $HISTFILE
+            && sed --follow-symlinks -ie "1,${prune_lines}d"  $HISTFILE
     fi
 }
 
@@ -732,12 +790,6 @@ make-targets() {
 }
 
 
-md5diff() {
-    [[ $(md5sum < "$1") != $(md5sum < "$2") ]]
-}
-
-
-
 mkc() {
     mkdir "$1"
     c "$1"
@@ -745,6 +797,11 @@ mkc() {
 
 mkdir() { command mkdir -p "$@"; }
 
+pithos() {
+    cd /a/opt/Pithosfly/
+    python3 -m pithos&r
+}
+
 pakaraoke() {
     # from http://askubuntu.com/questions/456021/remove-vocals-from-mp3-and-get-only-instrumentals
     pactl load-module module-ladspa-sink sink_name=Karaoke master=alsa_output.usb-Audioengine_Audioengine_D1-00.analog-stereo plugin=karaoke_1409 label=karaoke control=-30
@@ -793,8 +850,12 @@ pub() {
     rld /a/h/_site/ li:/var/www/iankelling.org/html
 }
 
+pubip() { curl -4s https://icanhazip.com; }
+whatismyip() { pubip; }
+
+
 pwgen() {
-    apg -s -m 10 -x 14 -t
+    apg -m 12 -x 16 -t
 }
 
 
@@ -835,6 +896,7 @@ rlu() { # [OPTS] HOST PATH
     opts=("${@:1:$#-2}") #  1 to last -2
     path="${@:$#}" # last
     host="${@:$#-1:1}" # last -1
+    if [[ $path == .* ]]; then echo error: need absolut path; return 1; fi
     # rync here uses checksum instead of time so we don't mess with
     # unison relying on time as much. g is for group, same reason
     # to keep up with unison.
@@ -842,7 +904,8 @@ rlu() { # [OPTS] HOST PATH
 }
 
 
-rspicy() { # HOST DOMAIN
+rspicy() { # usage: HOST DOMAIN
+    # connect to spice vm remote host. use vspicy for local host
     local port=$(ssh $1<<EOF
 sudo virsh dumpxml $2|grep "<graphics.*type='spice'" | \
        sed -rn "s/.*port='([0-9]+).*/\1/p"
@@ -857,12 +920,8 @@ EOF
 
 s() {
     # background
-    # alias s='SUDOD="$PWD" sudo -i '
-    # because this is an alias, and the extra space at the end, it would allow
-    #  aliases to be used with it. but aliases aren't used in scripts,
-    #  better to eliminate inconsistencies. Plus, you can't do s=s; $s command
-    #  with an alias, which I like to do in some functions
-    # extra space at the end allows aliases to work
+    # I use a function because otherwise we can't use in a script,
+    # can't assign to variable.
     #
     # note: gksudo is recommended for X apps because it does not set the
     # home directory to the same, and thus apps writing to ~ fuck things up
@@ -965,12 +1024,21 @@ srm () {
     command srm -ll "$@"
 }
 
+srun() {
+    scp $2 $1:/tmp
+    ssh $1 /tmp/${2##*/} "${@:2}"
+}
+
 t() {
     local x
     local -a args
     if type -t trash-put >/dev/null; then
-        # skip args that don't exist, or else it's an err
-        for x in "$@"; do [[ ! -e $x ]] || args+=("$x"); done
+        # skip args that don't exist, or else trash-put will have an error
+        for x in "$@"; do
+            if [[ -e $x || -L $x ]]; then
+                args+=("$x")
+            fi
+        done
         [[ ! ${args[@]} ]] || trash-put "${args[@]}"
     else
         rm -rf "$@"
@@ -1079,6 +1147,50 @@ tx() { # toggle set -x, and the prompt so it doesn't spam
     fi
 }
 
+vc() {
+    [[ $1 ]] || { e "$0: error, expected cmd to run"; return 1; }
+    # manually run vpn so it stays within a network namespace,
+    # until I get it all wired up with systemd.
+    newns vpn start
+    pid=$(< /run/openvpn/client.pid)
+    vpn_on=false
+    if [[ $pid ]]; then
+        if [[ -e /proc/$pid ]]; then
+            vpn_on=true
+        else
+            vpn_on=false
+            s rm -f /run/openvpn/client.pid
+        fi
+    fi
+    $vpn_on || s ip netns exec vpn /usr/sbin/openvpn --daemon ovpn --config /etc/openvpn/client.conf --cd /etc/openvpn --writepid /run/openvpn/client.pid
+    gksudo -- ip netns exec vpn gksudo -u ${SUDO_USER:-$USER} "$@"
+}
+
+transmission() {
+    vc transmission-gtk&
+    i=0
+    while ((i < 10)); do
+        tun_ip=$(s ip netns exec vpn ip a show dev tun0 | sed -rn 's/^ *inet (10\.8\.\S+).*/\1/p')
+        [[ ! $tun_ip ]] || break
+        sleep 1
+    done
+    echo "$0: tun_ip=$tun_ip"
+    [[ $tun_ip ]] || { e "$0: error: no tun0 addr found"; return 1; }
+    ssh dopub bash <<EOF
+set -e
+rule="-A PREROUTING -i eth0 -p tcp -m tcp --dport 63324 -j DNAT --to-destination $tun_ip:63324"
+found=false
+while read -r line; do
+  if [[ \$line == \$rule ]] && ! \$found; then
+    found=true
+  else
+    iptables -t nat -D \${line#-A}
+  fi
+done < <(iptables -t nat -S | grep -E -- '--dport\s+63324')
+\$found || iptables -t nat \$rule
+EOF
+}
+
 virshrm() {
     for x in "$@"; do virsh destroy "$x"; virsh undefine "$x"; done
 }
@@ -1108,6 +1220,7 @@ vpn() {
     journalctl --unit=openvpn@client -f -n0
 }
 
+
 vpnoff() {
     s systemctl stop openvpn@client
 }
@@ -1120,7 +1233,7 @@ vrm() {
 
 
 
-vspicy() {
+vspicy() { # usage: VIRSH_DOMAIN
     # connect to vms made with virt-install
     spicy -p $(sudo virsh dumpxml "$1"|grep "<graphics.*type='spice'"|\
                    sed -r "s/.*port='([0-9]+).*/\1/")
@@ -1326,8 +1439,8 @@ fi
 export rvmsudo_secure_path=1
 
 # for other script I wrote
-export ACME_TINY_PATH=/a/opt/acme-tiny
-export lt ACME_TINY_WRAPPER_CERT_DIR=/p/c/machine_specific/$HOSTNAME
+#export ACME_TINY_PATH=/a/opt/acme-tiny
+export ACME_TINY_WRAPPER_CERT_DIR=/p/c/machine_specific/$HOSTNAME/webservercerts
 
 if [[ -s "/usr/local/rvm/scripts/rvm" ]]; then
     source "/usr/local/rvm/scripts/rvm"
@@ -1335,8 +1448,7 @@ elif [[ -s $HOME/.rvm/scripts/rvm ]]; then
     source $HOME/.rvm/scripts/rvm
 fi
 
-mkdir -p ~/.npm-global
-npm config set prefix '~/.npm-global'
+
 path_add --end ~/.npm-global
 
 # https://wiki.archlinux.org/index.php/Xinitrc#Autostart_X_at_login