Initial commit of new shell sourcing system - base directory
parent
547074314a
commit
8d8ade7810
|
@ -0,0 +1,42 @@
|
|||
# Bash Shell Setup Repo
|
||||
A better way to keep organized and share interactive (.bashrc) environment, aliases, functions, modules
|
||||
|
||||
## Install
|
||||
|
||||
Clone to a directory
|
||||
|
||||
`git clone https://git.kebler.net/bashrc <repo path>` e.g. /opt/shell
|
||||
|
||||
now edit your `~/.bashrc` with nano or other available editor
|
||||
|
||||
add this
|
||||
```
|
||||
export BASH_SHELL_REPO=<repo path>/setup.
|
||||
source $BASH_SHELL_REPO/setup.sh
|
||||
```
|
||||
|
||||
The idea is to keep the .bashrc file completely clean and manage this repo instead
|
||||
so you should really find a home for all the existing content of your .bashrc file within the repo
|
||||
|
||||
Every file in `env` `functions`,`aliases` and `misc` subdirectories will be sourced in that order (in setup.sh). Within each folder all files are sourced except ones ending with a `.off` extension, starting with `.` and the README.md file plus any in any subfolder except `/archive` or ` /dep`
|
||||
|
||||
The sourced files in this repo should be NOT be user/machine/network specific
|
||||
|
||||
if you include any of these environment variables all files in there directories will be sourced where
|
||||
|
||||
|
||||
export BASH_SHELL_USER=<path> # will be in home/<USER>
|
||||
export BASH_SHELL_MACHINE=<path> #parent directory e.g. opt/shell/machine
|
||||
export BASH_SHELL_NETWORK=<path> #parent directory e.g. opt/shell/network
|
||||
|
||||
if there is a script setup.sh in the root of these directoies it will be run. If not then all files no matter how deep will be sourced in alpha order order.
|
||||
|
||||
For those
|
||||
|
||||
If need to turn off a file just add `.off` to the file name rather than move or delete the file...simple.
|
||||
|
||||
If you are really done with something but want to keep a copy in the repo move it to /archive folder within the primary subfolders
|
||||
|
||||
if sourcing some file depends on another preface with numbers to put it before. Functions are all sourced before aliases so can be refered to there.
|
||||
|
||||
Be aware that an alias or function set in the repo could be subsuming some existing binary or script.
|
|
@ -0,0 +1,65 @@
|
|||
# 00 will get loaded first
|
||||
|
||||
alias flist="function_list"
|
||||
alias flistg="function_list | grep"
|
||||
alias aliasg="alias | grep "
|
||||
|
||||
alias envg="env | grep "
|
||||
|
||||
# Add an "alert" alias for long running commands. Use like so:
|
||||
# sleep 10; alert
|
||||
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
|
||||
|
||||
# brings user path to sudo
|
||||
alias sudoi='sudo -i env PATH=$PATH'
|
||||
alias sudoh='sudo -H'
|
||||
|
||||
alias reboot="sudo systemctl reboot"
|
||||
alias poweroff="sudo systemctl poweroff"
|
||||
|
||||
# search for a running process
|
||||
alias psl='ps -ef | grep'
|
||||
# kill any process containing given name
|
||||
alias ska='sudo killall'
|
||||
alias ka='killall'
|
||||
# kill processes greped
|
||||
alias skg='sudo pkill -f'
|
||||
alias kg='pkill -f'
|
||||
|
||||
alias df='df -h -x supermount'
|
||||
alias du='du -h'
|
||||
alias egrep='egrep --color'
|
||||
alias fgrep='fgrep --color'
|
||||
alias grep='grep --color'
|
||||
|
||||
# Directory/File
|
||||
alias ls='ls -F --color=auto'
|
||||
alias l='ls'
|
||||
alias la='ls -a'
|
||||
alias ll='ls -l'
|
||||
alias lla='ls -l -a'
|
||||
alias llag='ls -l -a | grep'
|
||||
alias lsd='ls -d */'
|
||||
alias md='mkdir'
|
||||
alias mv='mv -i'
|
||||
alias p='cd -'
|
||||
alias rd='rmdir'
|
||||
alias rm='rm -i'
|
||||
alias cd..='cd ..'
|
||||
alias cp='cp -i'
|
||||
alias mpath="echo $PATH" # machine path per /etc/environment
|
||||
alias path='echo $PATH'
|
||||
alias sysinfo='sudo inxi -Fzxd'
|
||||
|
||||
alias efstab="cp /etc/fstab ~/fstab.bak && gedit admin:/etc/fstab"
|
||||
alias ea="editor ~/.bash_aliases"
|
||||
alias ead="editor ~/.kbd-aliases/"
|
||||
alias eadg="editor ~/.kbd-aliases/"
|
||||
alias eag="editor ~/.bash_aliases"
|
||||
alias essh="sudo editor /etc/ssh/sshd_config"
|
||||
alias ebrc='editor ~/.bashrc'
|
||||
# follows a link to list the source path
|
||||
alias follow="readlink -f"
|
||||
|
||||
# Will scrub all and reload only aliases in .bash_aliaes
|
||||
alias reloada="unalias -a && source ~/.bash_aliases && compgen -a"
|
|
@ -0,0 +1,12 @@
|
|||
# apt package manager
|
||||
alias installa="sudo apt-get install"
|
||||
alias reinstall="sudo apt install --reinstall"
|
||||
# change depending on distro - need to have backports loaded in apt sources
|
||||
# FYI can just load individual binaries from the wiki using deb files say from testing or unstable
|
||||
alias remove="sudo apt-get remove"
|
||||
alias aremove="sudo apt-get autoremove"
|
||||
alias purge="sudo apt-get purge"
|
||||
alias update="sudo apt-get update"
|
||||
alias pkgst="apt policy"
|
||||
alias esources='sudo nano /etc/apt/sources.list.d/'
|
||||
alias ppa='sh -c '\''sudo add-apt-repository ppa:$1/ppa'\'' _'
|
|
@ -0,0 +1 @@
|
|||
alias caddyr="ssh -t nas "/opt/scripts/caddyr""
|
|
@ -0,0 +1,7 @@
|
|||
# using firehol
|
||||
alias fwstp="sudo firehol stop"
|
||||
alias fws="sudo firehol start"
|
||||
alias fwdf="/opt/firehol/scripts/default"
|
||||
alias fwt="/opt/firehol/scripts/try"
|
||||
alias fwdb="/opt/firehol/scripts/debug"
|
||||
alias fwm="/opt/firehol/scripts/merge"
|
|
@ -0,0 +1,4 @@
|
|||
# run this on remote machine via ssh x11 forwarding
|
||||
alias rmintupdate='XAUTHORITY=/home/sysadmin/.Xauthority sudo -E mintupdate'
|
||||
alias rsources='XAUTHORITY=/home/sysadmin/.Xauthority sudo -E software-sources'
|
||||
alias rsynaptic='XAUTHORITY=/home/sysadmin/.Xauthority sudo -E synaptic'
|
|
@ -0,0 +1,4 @@
|
|||
# nas
|
||||
alias naslist="echo nasfm nasdisk nasgparted nasdata, caddyr, caddye"
|
||||
alias nasha="ssh -t nas 'cd /usr/share/hassio/homeassistant ; bash'"
|
||||
alias nascaddy="ssh -t nas 'cd /opt/caddy ; bash'"
|
|
@ -0,0 +1,33 @@
|
|||
#!/bin/bash
|
||||
if command -v docker >/dev/null 2>&1; then
|
||||
|
||||
#docker - add users to docker group to avoid needing sudo
|
||||
# run a command on a container
|
||||
# if [ $(which docker)]; then
|
||||
|
||||
alias dkcr="docker run"
|
||||
# start a container
|
||||
alias dkcs="docker start"
|
||||
# restart all running containers
|
||||
alias dkcrr="docker restart $(docker ps -q)"
|
||||
# start all exited containers
|
||||
alias dkcsu="docker start $(docker ps --filter "status=exited")"
|
||||
# ls stopped, la all, l running
|
||||
alias dkcls="docker ps --filter "status=exited""
|
||||
alias dkcla="docker ps -a "
|
||||
alias dkcl="docker ps "
|
||||
alias dkil="docker images --digests=true"
|
||||
alias dkir="docker rmi $(docker images -q)"
|
||||
alias dks="sudo service docker"
|
||||
alias dkcstpa="docker stop $(docker ps -a -q)"
|
||||
# remove unrunning containers
|
||||
alias dkcrm="docker rm $(docker ps -a -q)"
|
||||
# stop and remove
|
||||
alias dkcsrm="docker rm -f $(docker ps -a -q)"
|
||||
# cleans out unused/dangling aufs volumes - run this occasionally
|
||||
alias dkclean="docker volume ls -qf dangling=true | xargs -r docker volume rm"
|
||||
alias dkde="gksudo gedit /etc/default/docker"
|
||||
|
||||
# else
|
||||
# echo "docker not installed, aliases not loaded"
|
||||
fi
|
|
@ -0,0 +1,2 @@
|
|||
alias gspa="git subrepo push --all"
|
||||
alias gpom="git pull origin master" # update repo from default remove
|
|
@ -0,0 +1,4 @@
|
|||
# i2c
|
||||
alias i2cs='i2cdetect -y 1'
|
||||
alias erpic='sudo editor /boot/config.txt'
|
||||
alias gerpic='gksu pluma /boot/config.txt'
|
|
@ -0,0 +1,5 @@
|
|||
# bring an interface up or down
|
||||
alias nid="sudo ip link set down"
|
||||
alias niu="sudo ip link set up"
|
||||
# restart wan interface including networkd restart
|
||||
alias nir1="nid wan && niu wan && nwr"
|
|
@ -0,0 +1,2 @@
|
|||
alias ports="netstat -tulpn"
|
||||
alias flushdns="systemctl restart systemd-resolved"
|
|
@ -0,0 +1,3 @@
|
|||
alias sports='dmesg | egrep --color "serial|tty"'
|
||||
alias connewest='screen $(ls -tw 1 /dev/tty* | head -1) 115200'
|
||||
alias conacm0='screen /dev/ttyACM0 115200'
|
|
@ -0,0 +1,15 @@
|
|||
alias nws="sudo systemctl start systemd-networkd"
|
||||
alias nwe="sudo systemctl enable systemd-networkd"
|
||||
alias nwd="sudo systemctl disable systemd-networkd"
|
||||
alias nwstp="sudo systemctl stop systemd-networkd"
|
||||
alias nwr="sudo systemctl restart systemd-networkd"
|
||||
alias nwdst="systemctl status systemd-networkd"
|
||||
alias nwj="journalctl -u systemd-networkd"
|
||||
alias nw="networkctl"
|
||||
alias nwst="networkctl status"
|
||||
alias nwl="networkctl lldp"
|
||||
|
||||
alias nid="sudo ip link set down"
|
||||
alias niu="sudo ip link set up"
|
||||
alias nir1="nid eth1 && niu eth1 && nwr"
|
||||
alias nir1="nid eth1 && niu eth1 && nwr"
|
|
@ -0,0 +1,11 @@
|
|||
alias sdst="sudo systemctl status"
|
||||
alias sds="sudo systemctl start"
|
||||
alias sdr="sudo systemctl restart"
|
||||
alias sde="sudo systemctl enable"
|
||||
alias sdstp="sudo systemctl stop"
|
||||
alias sdd="sudo systemctl disable"
|
||||
alias sdrld="sudo systemctl daemon-reload"
|
||||
alias sdla="systemctl list-units | grep"
|
||||
alias sdl="systemctl list-unit-files | grep"
|
||||
alias sdle="systemctl list-unit-files | grep enabled"
|
||||
alias sdpidu="systemctl show --property MainPID --value"
|
|
@ -0,0 +1,12 @@
|
|||
# user versions
|
||||
alias sdstu="systemctl --user status"
|
||||
alias sdsu="systemctl --user start"
|
||||
alias sdru="systemctl --user restart"
|
||||
alias sdeu="systemctl --user enable"
|
||||
alias sdstpu="systemctl --user stop"
|
||||
alias sdrldu="systemctl --user daemon-reload"
|
||||
alias sddu="systemctl --user disable"
|
||||
alias sdlau="systemctl --user list-units | grep"
|
||||
alias sdlu="systemctl --user list-unit-files | grep"
|
||||
alias sdleu="systemctl --user list-unit-files | grep enabled"
|
||||
alias sdpidu="systemctl show --user --property MainPID --value"
|
|
@ -0,0 +1,4 @@
|
|||
# pio in path and completion for platformio subcommands
|
||||
export PATH=$PATH:~/.platformio/penv/bin
|
||||
eval "$(_PLATFORMIO_COMPLETE=source platformio)"
|
||||
eval "$(_PIO_COMPLETE=source pio)"
|
|
@ -0,0 +1,9 @@
|
|||
alias pmi="sudo pm2 install"
|
||||
alias pms="sudo pm2 start"
|
||||
alias pmstp="sudo pm2 stop"
|
||||
alias pmr="sudo pm2 delete"
|
||||
alias pmra="sudo pm2 delete all"
|
||||
alias pmstpa="sudo pm2 stop all"
|
||||
alias pmv="sudo pm2 save"
|
||||
alias pml="sudo pm2 list"
|
||||
alias pmm="sudo pm2 monit"
|
|
@ -0,0 +1,23 @@
|
|||
{
|
||||
"protocol": "sftp",
|
||||
"host": "router",
|
||||
"port": 22,
|
||||
"user": "sysadmin",
|
||||
"pass": "",
|
||||
"promptForPass": false,
|
||||
"remote": "/home/sysadmin/.kbd-aliases",
|
||||
"local": "",
|
||||
"agent": "env",
|
||||
"privatekey": "",
|
||||
"passphrase": "",
|
||||
"hosthash": "",
|
||||
"ignorehost": true,
|
||||
"connTimeout": 10000,
|
||||
"keepalive": 10000,
|
||||
"keyboardInteractive": false,
|
||||
"keyboardInteractiveForPass": false,
|
||||
"remoteCommand": "",
|
||||
"remoteShell": "",
|
||||
"watch": [],
|
||||
"watchTimeout": 500
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
# bower
|
||||
alias bidv="bower install --save-dev"
|
||||
alias brdv="bower uninstall --save-dev"
|
||||
alias bi="bower install --save"
|
||||
alias br="bower uninstall --save"
|
|
@ -0,0 +1,9 @@
|
|||
alias iptl="sudo iptables -S"
|
||||
alias iptlf="sudo iptables -L"
|
||||
alias iptln="sudo iptables -L -t nat"
|
||||
alias iptd="sudo /etc/iptables/iptables-default.sh"
|
||||
alias iptf="sudo /etc/iptables/iptables-flush.sh"
|
||||
alias ipts="sudo systemctl start iptables"
|
||||
alias iptst="sudo systemctl status iptables"
|
||||
alias iptstp="sudo systemctl stop iptables"
|
||||
alias iptstpp="sudo /etc/iptables/iptables-default.sh"
|
|
@ -0,0 +1,14 @@
|
|||
# if parameter(s) is needed instead of just at the end of alias then create a "little" function instead.
|
||||
# like mymv() { mv $1 $2; }
|
||||
# or rsynchc() { rsync --help | grep "\-$1"; }
|
||||
|
||||
|
||||
alias sdns="nmcli device show eth0 | grep IP4.DNS"
|
||||
# shows running processes with ntfs that might hang gparted, then kill with next command
|
||||
alias ntfs='ps -ef | egrep "dosfsck|ntfs"'
|
||||
|
||||
alias lo="gnome-session-quit"
|
||||
|
||||
#mongo via docker container name mongodbmo
|
||||
alias mg="docker exec -it mongodbserver mongo"
|
||||
alias mongodb="docker exec -it mongodbserver mongo"
|
|
@ -0,0 +1,29 @@
|
|||
# Additional Shell Repos to Source
|
||||
# BASH_SHELL is a common parent directory that should be set in /etc/bash.bashrc
|
||||
# unless below specific directories are set
|
||||
# shell files are sourced in this order
|
||||
# sourced via /etc/bash.bashrc so for all machine users
|
||||
# $BASH_SHELL_BASE # this MUST be set in /etc/bash.bashrc
|
||||
# $BASH_SHELL_NETWORK/all
|
||||
# $BASH_SHELL_NETWORK/$NETWORKNAME
|
||||
# $BASH_SHELL_HOST/all
|
||||
# $BASH_SHELL_HOST/<hostname>
|
||||
# sourced via $HOME/.bashrc
|
||||
# $HOME/shell or $HOME/BASH_SHELL_USER
|
||||
|
||||
# within each of those directories if setup.sh exits it will be run
|
||||
# otherwise files will be sourced exactly like in the base
|
||||
|
||||
# identify a network name that this host resides on
|
||||
# like hostname but for the LAN network
|
||||
# if unset then only /all will be sourced
|
||||
export NETWORKNAME=238
|
||||
# will use $BASH_SHELL_NETWORK/$NETWORKNAME under this directory unless specifically set
|
||||
export BASH_SHELL_NETWORK=$BASH_SHELL/network
|
||||
|
||||
# will use $BASH_SHELL_HOST/<hostname> unless specifically set
|
||||
export BASH_SHELL_HOST=$BASH_SHELL/host
|
||||
|
||||
# by default SHELL sources will be looked for under $HOME/bash/shell
|
||||
# but can be user set below to $HOME/$BASH_SHELL_USER
|
||||
# export BASH_SHELL_USER=<some directory under $HOME>
|
|
@ -0,0 +1,4 @@
|
|||
# set PATH so it includes user's private bin if it exists
|
||||
if [ -d "/opt/bin" ] ; then
|
||||
PATH="/opt/bin:$PATH"
|
||||
fi
|
|
@ -0,0 +1,9 @@
|
|||
# set PATH so it includes user's private bin if it exists
|
||||
if [ -d "$HOME/bin" ] ; then
|
||||
PATH="$HOME/bin:$PATH"
|
||||
fi
|
||||
|
||||
# set PATH so it includes user's private bin if it exists
|
||||
if [ -d "$HOME/.local/bin" ] ; then
|
||||
PATH="$HOME/.local/bin:$PATH"
|
||||
fi
|
|
@ -0,0 +1,17 @@
|
|||
# set PATH so it includes user's private bin if it exists
|
||||
if [ -d "$HOME/bin" ] ; then
|
||||
PATH="$HOME/bin:$PATH"
|
||||
fi
|
||||
|
||||
# set PATH so it includes user's private bin if it exists
|
||||
if [ -d "$HOME/.local/bin" ] ; then
|
||||
PATH="$HOME/.local/bin:$PATH"
|
||||
fi
|
||||
|
||||
# if running bash
|
||||
if [ -n "$BASH_VERSION" ]; then
|
||||
# include .bashrc if it exists
|
||||
if [ -f "$HOME/.bashrc" ]; then
|
||||
. "$HOME/.bashrc"
|
||||
fi
|
||||
fi
|
|
@ -0,0 +1,3 @@
|
|||
# used by aliases that need an editor
|
||||
export EDITOR=atom
|
||||
# export EDITOR=nano
|
|
@ -0,0 +1,2 @@
|
|||
# colored GCC warnings and errors
|
||||
export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'
|
|
@ -0,0 +1 @@
|
|||
export GIT_SSL_NO_VERIFY=1
|
|
@ -0,0 +1,7 @@
|
|||
# don't put duplicate lines or lines starting with space in the history.
|
||||
# See bash(1) for more options
|
||||
HISTCONTROL=ignoreboth
|
||||
|
||||
# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
|
||||
HISTSIZE=1000
|
||||
HISTFILESIZE=2000
|
|
@ -0,0 +1,7 @@
|
|||
# All the directories which contain based modules/libraries
|
||||
# module libraries will be look up in this order
|
||||
# first set any additional modules directories to search (if any)
|
||||
# MODULE_DIRS=()
|
||||
# those will be searched first then /modules under the shell directories
|
||||
# user,host,network,base in that order
|
||||
# this provide a way to override a module with a more specific version
|
|
@ -0,0 +1,2 @@
|
|||
# set ssh agent socket for each session
|
||||
export SSH_AUTH_SOCK="$XDG_RUNTIME_DIR/ssh-agent.socket"
|
|
@ -0,0 +1,38 @@
|
|||
#!/bin/bash
|
||||
# 00 will get loaded first
|
||||
|
||||
##-- functions which may be used by any of the alias file --#
|
||||
|
||||
function function_list() {
|
||||
echo
|
||||
echo -e "\033[1;4;32m""Functions:""\033[0;34m"
|
||||
declare -F | grep -v "declare -f\s_" | awk {'print $3'}
|
||||
echo
|
||||
echo -e "\033[0m"
|
||||
}
|
||||
|
||||
function alias_list() {
|
||||
echo
|
||||
echo -e "\033[1;4;32m""Aliases:""\033[0;34m"
|
||||
alias | awk {'print $2'} | awk -F= {'print $1'}
|
||||
echo
|
||||
echo -e "\033[0m"
|
||||
}
|
||||
|
||||
rsynchc() { rsync --help | grep "\-$1"; }
|
||||
alias rsynch="rsynchc"
|
||||
|
||||
change-ext() {
|
||||
shopt -s globstar
|
||||
rename -n 's/.'+$1+'/.'+$2+'/' **
|
||||
}
|
||||
alias chext=change-ext
|
||||
|
||||
# find in any file
|
||||
fif() {
|
||||
grep -rnswl $1 -e $2 | more
|
||||
}
|
||||
|
||||
# edit files
|
||||
# set the system editor using EDITOR environment variable
|
||||
editor() { ${EDITOR} $1; }
|
|
@ -0,0 +1,46 @@
|
|||
#!/bin/bash
|
||||
# aws cli from docker image on any machine
|
||||
function aws() {
|
||||
AWS_CLI_IMAGE=${AWS_CLI_IMAGE:-amazon/aws-cli:latest}
|
||||
AWS_WORKING_DIR=${AWS_WORKING_DIR:-$HOME/awscli}
|
||||
local cmd
|
||||
cmd="docker run --rm -ti
|
||||
--env AWS_ACCESS_KEY_ID
|
||||
--env AWS_CONFIG_FILE
|
||||
--env AWS_SHARED_CREDENTIALS_FILE
|
||||
--env AWS_SECRET_ACCESS_KEY
|
||||
--env AWS_DEFAULT_REGION
|
||||
-v ${HOME}/.aws:/root/.aws
|
||||
-v ${AWS_WORKING_DIR}:/aws
|
||||
${AWS_CLI_IMAGE} $*
|
||||
--no-cli-pager
|
||||
"
|
||||
# echo ${cmd}
|
||||
# local res
|
||||
echo "$(eval ${cmd})"
|
||||
# echo $RES
|
||||
|
||||
}
|
||||
|
||||
# `! [ -z $AWS_ACCESS_KEY_ID ] && echo "--env AWS_ACCESS_KEY_ID"` \
|
||||
# `! [ -z $AWS_SECRET_ACCESS_KEY ] && echo "--env AWS_SECRET_ACCESS_KEY"` \
|
||||
# `! [ -z $AWS_DEFAULT_REGION ] && echo "--env AWS_DEFAULT_REGION"` \
|
||||
|
||||
test () {
|
||||
|
||||
echo $(aws route53 list-hosted-zones)
|
||||
|
||||
}
|
||||
|
||||
aws-get-zone-id () {
|
||||
local records
|
||||
local domain
|
||||
domain=$(get-domain $1)
|
||||
echo $domain
|
||||
aws route53 list-hosted-zones --query "'HostedZones[?Name==\`${domain}.\`]'"
|
||||
echo returned
|
||||
echo $RES
|
||||
# local res
|
||||
# res=$(echo $records | grep ID | awk -F'[\"#]+' '{print $4}' | awk -F'[/#]+' '{print $3}')
|
||||
# echo "$res"
|
||||
}
|
|
@ -0,0 +1,86 @@
|
|||
#!/bin/bash
|
||||
|
||||
function aws-get-zone-record () {
|
||||
local record
|
||||
echo get record $1 $(get-domain $1)
|
||||
record=$(
|
||||
aws route53 list-resource-record-sets \
|
||||
--hosted-zone-id $(aws-get-zone-id $1)
|
||||
)
|
||||
echo "$record"
|
||||
}
|
||||
|
||||
function aws-get-zone-record-prop () {
|
||||
local record
|
||||
record=$(aws-get-zone-record $1)
|
||||
local res
|
||||
res=$(get-prop-value "$record" $2)
|
||||
echo "$res"
|
||||
}
|
||||
|
||||
|
||||
function aws-get-zone-record-value () {
|
||||
local record
|
||||
record=$(aws-get-zone-record $1)
|
||||
local res
|
||||
res=$(get-prop-value "$record" "ResourceRecords[0].Value")
|
||||
echo "$res"
|
||||
}
|
||||
|
||||
function aws-update-zone-record-value () {
|
||||
|
||||
if [ "$#" -ne 2 ]; then
|
||||
echo "Both recordset and value required"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
RECORDSET=$1
|
||||
VALUE=$2
|
||||
COMMENT=${3:-"Updating Record"}
|
||||
RECORD=$(aws-get-zone-record "$RECORDSET")
|
||||
echo the reccord $RECORD
|
||||
# ZONENAME=$(get-domain $RECORDSET)
|
||||
ZONEID=$(aws-get-zone-id "$(get-domain $RECORDSET )")
|
||||
# The Time-To-Live of this recordset
|
||||
# echo Zone Name and ID for recordset $RECORDSET $ZONENAME $ZONEID
|
||||
# TTL=60 # call this later with increase
|
||||
# Fill a temp file with valid JSON
|
||||
CHANGE="{
|
||||
\"Comment\":\"$COMMENT\",
|
||||
\"Changes\":[
|
||||
{
|
||||
\"Action\":\"UPSERT\",
|
||||
\"ResourceRecordSet\":{
|
||||
\"ResourceRecords\":[
|
||||
{
|
||||
\"Value\":\"$VALUE\"
|
||||
}
|
||||
],
|
||||
\"Name\":\"$RECORDSET\",
|
||||
\"Type\":\"$(get-prop-value "$RECORD" Type)\",
|
||||
\"TTL\":\"$(get-prop-value "$RECORD" TTL)\"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
"
|
||||
echo updating record with
|
||||
batch=\'${CHANGE}\'
|
||||
echo batch
|
||||
|
||||
|
||||
# Update the Hosted Zone record
|
||||
CMD="aws route53 change-resource-record-sets
|
||||
--hosted-zone-id ${ZONEID}
|
||||
--change-batch $batch
|
||||
"
|
||||
|
||||
echo "${CMD}"
|
||||
local res
|
||||
res=$($CMD)
|
||||
echo "$res"
|
||||
|
||||
|
||||
# echo confirm change $(aws-get-zone-record-value $RECORDSET)
|
||||
# end function
|
||||
}
|
|
@ -0,0 +1,105 @@
|
|||
#!/bin/bash
|
||||
function route53-set-record () {
|
||||
# (optional) You might need to set your PATH variable at the top here
|
||||
# depending on how you run this script
|
||||
# PATH=PATH
|
||||
|
||||
# Hosted Zone ID e.g. BJBK35SKMM9OE
|
||||
ZONEID="ZF04FGKB9QHN2"
|
||||
|
||||
# The CNAME you want to update e.g. hello.example.com
|
||||
RECORDSET="238.kebler.net"
|
||||
|
||||
# More advanced options below
|
||||
# The Time-To-Live of this recordset
|
||||
TTL=300
|
||||
# Change this if you want
|
||||
COMMENT="Auto updating @ `date`"
|
||||
# Change to AAAA if using an IPv6 address
|
||||
TYPE="A"
|
||||
|
||||
# Get the external IP address from OpenDNS (more reliable than other providers)
|
||||
IP=`dig +short myip.opendns.com @resolver1.opendns.com`
|
||||
|
||||
echo current ip is $IP
|
||||
|
||||
|
||||
# Get current dir
|
||||
# (from http://stackoverflow.com/a/246128/920350)
|
||||
# DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
DIR=$HOME
|
||||
LOGFILE="$DIR/update-route53.log"
|
||||
IPFILE="$DIR/update-route53.ip"
|
||||
|
||||
if ! valid_ip $IP; then
|
||||
echo "Invalid IP address: $IP" >> "$LOGFILE"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check if the IP has changed
|
||||
if [ ! -f "$IPFILE" ]
|
||||
then
|
||||
touch "$IPFILE"
|
||||
fi
|
||||
|
||||
if grep -Fxq "$IP" "$IPFILE"; then
|
||||
# code if found
|
||||
echo "IP is still $IP. Exiting" >> "$LOGFILE"
|
||||
exit 0
|
||||
else
|
||||
echo "IP has changed to $IP" >> "$LOGFILE"
|
||||
# Fill a temp file with valid JSON
|
||||
TMPFILE=$(mktemp /tmp/temporary-file.XXXXXXXX)
|
||||
cat > ${TMPFILE} << EOF
|
||||
{
|
||||
"Comment":"$COMMENT",
|
||||
"Changes":[
|
||||
{
|
||||
"Action":"UPSERT",
|
||||
"ResourceRecordSet":{
|
||||
"ResourceRecords":[
|
||||
{
|
||||
"Value":"$IP"
|
||||
}
|
||||
],
|
||||
"Name":"$RECORDSET",
|
||||
"Type":"$TYPE",
|
||||
"TTL":$TTL
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
EOF
|
||||
|
||||
# Update the Hosted Zone record
|
||||
aws route53 change-resource-record-sets \
|
||||
--hosted-zone-id $ZONEID \
|
||||
--change-batch file://"$TMPFILE" >> "$LOGFILE"
|
||||
echo "IP Changed in Route53" >> "$LOGFILE"
|
||||
|
||||
# Clean up
|
||||
rm $TMPFILE
|
||||
fi
|
||||
|
||||
# All Done - cache the IP address for next time
|
||||
echo "$IP" > "$IPFILE"
|
||||
|
||||
}
|
||||
# end function
|
||||
|
||||
function valid_ip()
|
||||
{
|
||||
local ip=$1
|
||||
local stat=1
|
||||
|
||||
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
|
||||
OIFS=$IFS
|
||||
IFS='.'
|
||||
ip=($ip)
|
||||
IFS=$OIFS
|
||||
[[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
|
||||
&& ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
|
||||
stat=$?
|
||||
fi
|
||||
return $stat
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
#!/bin/bash
|
||||
function caddye(){
|
||||
rrem sysadmin@nas.kebler.net "gedit /opt/caddy/caddy.conf"
|
||||
}
|
||||
|
||||
function caddys(){
|
||||
rrem sysadmin@nas.kebler.net "sudo systemctl status caddy"
|
||||
}
|
||||
|
||||
function caddyj(){
|
||||
rrem sysadmin@nas.kebler.net "journalctl -u caddy | tail -f -n -100"
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
#!/bin/bash
|
||||
# nas
|
||||
|
||||
## rrem already loaded in 00-basic
|
||||
|
||||
function nasfm(){
|
||||
rrem sysadmin@nas.kebler.net "nemo $1"
|
||||
}
|
||||
|
||||
function nasdisk(){
|
||||
rrem sysadmin@nas.kebler.net "sudo gnome-disks"
|
||||
}
|
||||
|
||||
|
||||
function nasgparted(){
|
||||
rrem sysadmin@nas.kebler.net "sudo gparted"
|
||||
}
|
||||
|
||||
function nasdata(){
|
||||
rrem sysadmin@nas.kebler.net "nemo /mnt/data"
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
A test
|
|
@ -0,0 +1,40 @@
|
|||
#!/bin/bash
|
||||
valid_ip()
|
||||
{
|
||||
local ip=$1
|
||||
local stat=1
|
||||
local res
|
||||
|
||||
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
|
||||
OIFS=$IFS
|
||||
IFS='.'
|
||||
ip=($ip)
|
||||
IFS=$OIFS
|
||||
[[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
|
||||
&& ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
|
||||
res=$([ $? == 0 ] && echo true || echo false)
|
||||
else
|
||||
res=false
|
||||
fi
|
||||
echo $res
|
||||
}
|
||||
|
||||
get_domain() {
|
||||
local domain
|
||||
domain=$(echo $1 | awk -F\. '{print $(NF-1) FS $NF}')
|
||||
echo "$domain"
|
||||
}
|
||||
|
||||
# must be json as a string, depends on jq
|
||||
get_prop_value () {
|
||||
local value
|
||||
# echo in $1 get $2
|
||||
value=$(echo $1 | jq -r .$2)
|
||||
echo $value
|
||||
}
|
||||
|
||||
|
||||
is_array() {
|
||||
local variable_name=$1
|
||||
[[ "$(declare -p $variable_name 2>/dev/null)" =~ "declare -a" ]]
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
#!/bin/bash
|
||||
function logit(){
|
||||
local SCRIPT_PATH
|
||||
local LOG_PATH
|
||||
local SCRIPT_DIR
|
||||
local SCRIPT_NAME
|
||||
|
||||
tty -s
|
||||
if [ "0" != "$?" ] || [ $1 == f ]; then
|
||||
SCRIPT_PATH=$(readlink -f "$0")
|
||||
SCRIPT_DIR=$(dirname $SCRIPT_PATH)
|
||||
SCRIPT_NAME=$(basename ${SCRIPT_PATH%.*})
|
||||
mkdir -p $SCRIPT_DIR/logs
|
||||
# log is the /logs subdirectory of original script directory
|
||||
LOG_PATH="$SCRIPT_DIR/logs/$SCRIPT_NAME.log"
|
||||
exec 1> $LOG_PATH 2>&1
|
||||
echo $(date) logging for $SCRIPT_PATH
|
||||
fi
|
||||
}
|
|
@ -0,0 +1,4 @@
|
|||
# remote start a program (with x11 forwarding will render locally if gui)
|
||||
function rrem(){
|
||||
ssh -X -t "$1" """$2" "$3"""
|
||||
}
|
|
@ -0,0 +1,40 @@
|
|||
#!/bin/bash
|
||||
function sdj(){
|
||||
journalctl -u "$1" | tail -f -n ${2:-50}
|
||||
}
|
||||
function sdjf(){
|
||||
journalctl -f -u "$1"
|
||||
}
|
||||
function sdw(){
|
||||
sdst "$1" | grep Loaded
|
||||
}
|
||||
|
||||
function sdstate () {
|
||||
echo $1 state
|
||||
systemctl show --no-page $1 | grep ActiveState
|
||||
systemctl show --no-page $1 | grep UnitFileState
|
||||
systemctl show --no-page $1 | grep LoadState
|
||||
systemctl show --no-page $1 | grep ExecMainPID
|
||||
systemctl show --no-page $1 | grep ExecMainStartTimestamp=
|
||||
systemctl show --no-page $1 | grep ExecMainExitTimestamp=
|
||||
}
|
||||
|
||||
function sdju(){
|
||||
journalctl --user -u "$1" | tail -f -n ${2:-50}
|
||||
}
|
||||
function sdjuf(){
|
||||
journalctl --user -f -u "$1"
|
||||
}
|
||||
function sdwu(){
|
||||
sdstu "$1" | grep Loaded
|
||||
}
|
||||
|
||||
function sdstateu () {
|
||||
echo $1 state
|
||||
systemctl --user show --no-page $1 | grep ActiveState
|
||||
systemctl --user show --no-page $1 | grep UnitFileState
|
||||
systemctl --user show --no-page $1 | grep LoadState
|
||||
systemctl --user show --no-page $1 | grep ExecMainPID
|
||||
systemctl --user show --no-page $1 | grep ExecMainStartTimestamp=
|
||||
systemctl --user show --no-page $1 | grep ExecMainExitTimestamp=
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
# GoLang
|
||||
export GOROOT=/opt/go/bin
|
||||
export PATH=$GOROOT/bin:$PATH
|
||||
export GOPATH=/opt/go/workspace
|
||||
export PATH=$GOPATH/bin:$PATH
|
|
@ -0,0 +1,53 @@
|
|||
#!/bin/bash
|
||||
|
||||
if command -v node >/dev/null 2>&1; then
|
||||
# gives access to packages with bin in a project
|
||||
export PATH=$PATH:./node_modules/.bin
|
||||
export PATH=$PATH:/opt/node-global-apps/bin
|
||||
|
||||
|
||||
export NPM_REGISTRY=https://npm.kebler.net
|
||||
alias nr="npm run"
|
||||
alias nrs="npm -s run"
|
||||
alias nt="npm -s test"
|
||||
alias ntw="npm -s run testw"
|
||||
alias npms="npm start"
|
||||
alias npmlag="npm la --silent --depth=0 --global"
|
||||
alias npmla="npm la --silent --depth=0"
|
||||
alias npmlaf="npm la --silent | grep"
|
||||
alias npmlsg="npm ls --silent --depth=0 --global"
|
||||
alias npmlsf="npm ls --silent grep"
|
||||
alias npmlsa="npm ls --silent"
|
||||
alias npmls="npm ls --silent --depth=0"
|
||||
# just npm install for install without saving into package.json
|
||||
alias npmi="npm install --save"
|
||||
alias npmr="npm uninstall --save"
|
||||
alias npmio="npm install --save-optional"
|
||||
alias npmro="npm uninstall --save-optional"
|
||||
alias npmidv="npm install --save-dev"
|
||||
alias npmidvnd="npm install --save-dev --package-lock-only --no-package-lock"
|
||||
alias npmrdv="npm uninstall --save-dev"
|
||||
alias npmig="npm install -g"
|
||||
alias snpmig="sudo npm install -g"
|
||||
alias npmrg="npm uninstall -g"
|
||||
alias snpmrg="npm uninstall -g"
|
||||
alias npmunpm="echo npm installed version && npm --version && echo npm latest version available && npm view npm@latest version && echo any key to continue npm upgrade or break && read && npm install -g npm@latest"
|
||||
alias npmua="npm --depth=9999 update"
|
||||
alias npmug="npm-check -g -u"
|
||||
alias npmu="npm-check -u"
|
||||
alias npmcc="ncu -p -a -u"
|
||||
alias npmcdvc="ncu -d -a -u"
|
||||
alias npmc="ncu -p"
|
||||
alias npma="npm-add-dependencies"
|
||||
# will publish to whichever is the default registry - confusing so commented out
|
||||
# alias npmpub="npm publish --access public"
|
||||
alias npmlrepub="npm publish --registry http://localhost:4873 --force --access restricted"
|
||||
alias npmlpub="npm publish --registry http://localhost:4873 --access restricted"
|
||||
alias npmnrepub="npm publish --registry https://npm.kebler.net --force --access restricted"
|
||||
alias npmnpub="npm publish --registry https://npm.kebler.net --access restricted"
|
||||
alias npmjspub="npm publish --registry https://registry.npmjs.org --access public"
|
||||
alias yalcpush="nodemon -x 'yalc push'"
|
||||
|
||||
# else
|
||||
# echo "node not installed, npm aliases not loaded"
|
||||
fi
|
|
@ -0,0 +1,12 @@
|
|||
alias python3="python3.8"
|
||||
alias spip="sudo -H python3.8 -m pip"
|
||||
alias spipi="sudo -H python3.8 -m pip install"
|
||||
alias spipiu="sudo -H python3.8 -m pip install -U"
|
||||
alias spipl="sudo -H python3.8 -m pip list"
|
||||
alias spiplo="sudo -H python3.8 -m pip list --outdated"
|
||||
alias pipu="pipx upgrade"
|
||||
alias pipua="pipx upgrade-all"
|
||||
alias pipupip="pipx upgrade pipx"
|
||||
alias pipi="pipx install"
|
||||
alias pipl="pipx list"
|
||||
alias piplv="pipx list --verbose"
|
|
@ -0,0 +1,19 @@
|
|||
alias ycc="yarn cache clean"
|
||||
alias yr="yarn run"
|
||||
alias ys="yarn run start"
|
||||
alias ya="yarn add"
|
||||
# alias yu="yarn upgrade"
|
||||
alias yrm="yarn remove"
|
||||
alias yao="yarn add --optional"
|
||||
alias yad="yarn add --dev"
|
||||
alias yl="yarn list --depth=0"
|
||||
alias ylp="yarn list --depth=0 --pattern"
|
||||
alias yu="yarn upgrade-interactive"
|
||||
|
||||
alias ylg="yarn global list --depth=0"
|
||||
alias ylgp="yarn global list --depth=0 --pattern"
|
||||
alias yag="yarn global add"
|
||||
alias yrg="yarn global remove"
|
||||
alias yug="yarn global upgrade-interactive"
|
||||
|
||||
alias ypub="yarn publish --access public"
|
|
@ -0,0 +1,2 @@
|
|||
# make less more friendly for non-text input files, see lesspipe(1)
|
||||
[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"
|
|
@ -0,0 +1,27 @@
|
|||
#!/bin/bash
|
||||
|
||||
# uncomment for a colored prompt, if the terminal has the capability; turned
|
||||
# off by default to not distract the user: the focus in a terminal window
|
||||
# should be on the output of commands, not on the prompt
|
||||
#force_color_prompt=yes
|
||||
|
||||
if [ -n "$force_color_prompt" ]; then
|
||||
if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
|
||||
# We have color support; assume it's compliant with Ecma-48
|
||||
# (ISO/IEC-6429). (Lack of such support is extremely rare, and such
|
||||
# a case would tend to support setf rather than setaf.)
|
||||
color_prompt=yes
|
||||
else
|
||||
color_prompt=
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
# use http://bashrcgenerator.com/
|
||||
PARENTBASE='${PWD#"${PWD%/*/*}/"}'
|
||||
PS1="\[\033[38;5;11m\]\u\[$(tput sgr0)\]@\h:\[$(tput sgr0)\]\[\033[38;5;6m\][\[$(tput sgr0)\]\[\033[38;5;14m\]${PARENTBASE}\[$(tput sgr0)\]\[\033[38;5;6m\]]\[$(tput sgr0)\]\[$(tput sgr0)\]"
|
||||
|
||||
parse_git_branch() {
|
||||
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
|
||||
}
|
||||
PS1="$PS1\[\033[00m\]\$(parse_git_branch)\$ "
|
|
@ -0,0 +1,5 @@
|
|||
#!/bin/bash
|
||||
# set a fancy prompt (non-color, unless we know we "want" color)
|
||||
case "$TERM" in
|
||||
xterm|xterm-color|*-256color) color_prompt=yes;;
|
||||
esac
|
|
@ -0,0 +1,24 @@
|
|||
#!/bin/bash
|
||||
# must have fuser and bindfs installed
|
||||
function bmount(){
|
||||
if [ "$1" == "-mp" ]; then
|
||||
MOUNTED=$(mountpoint "$2" | grep not)
|
||||
if [ -z "$MOUNTED" ]; then
|
||||
echo $2 is a mount point so bind mounting $2/$3 to $4
|
||||
notify-send "bind mounting ${2}/${3} to ${4}" --icon=dialog-information -t 2000
|
||||
bindfs "$2/$3" "$4"
|
||||
else
|
||||
notify-send "${2} not a mount point - Unable to bind mount ${2}/${3} to ${4}" --icon=dialog-error -t 2000
|
||||
fi
|
||||
else
|
||||
echo bind mounting $1 to $2
|
||||
notify-send "bind mounting ${1} to ${2}" --icon=dialog-information -t 2000
|
||||
bindfs "$1" "$2"
|
||||
fi
|
||||
}
|
||||
|
||||
function bumount(){
|
||||
echo "removing bind mount at $1"
|
||||
notify-send "removing bind mount at ${1}" --icon=dialog-information -t 2000
|
||||
fusermount -u "$1"
|
||||
}
|
|
@ -0,0 +1,147 @@
|
|||
#!/bin/bash
|
||||
|
||||
BLOCK_FILE=""
|
||||
BLOCK_NAME='BLOCK'
|
||||
BLOCK_COMMENT_CHAR="#"
|
||||
# a comment added before the block
|
||||
BLOCK_DESCRIPTION=""
|
||||
|
||||
function __update () {
|
||||
if [ ! -z "$BLOCK_FILE" ]; then
|
||||
touch $BLOCK_FILE
|
||||
tail -c1 $BLOCK_FILE | read -r _ || echo >> $BLOCK_FILE
|
||||
fi
|
||||
BLOCK_BEGIN="$BLOCK_COMMENT_CHAR --- ${BLOCK_NAME} BEGIN ---"
|
||||
BLOCK_END="$BLOCK_COMMENT_CHAR --- ${BLOCK_NAME} END ---"
|
||||
BLOCK="\n$([ -z "$BLOCK_DESCRIPTION" ] || echo "${BLOCK_COMMENT_CHAR} ${BLOCK_DESCRIPTION}\n")${BLOCK_BEGIN}\n${BLOCK_END}"
|
||||
# for testing
|
||||
# BLOCK="a line before\n${BLOCK}\nanother line outside"
|
||||
|
||||
}
|
||||
|
||||
__update
|
||||
# echo -e "default block template follows use: block-set before block-add to change>\n" $BLOCK
|
||||
|
||||
function set-block () {
|
||||
|
||||
declare OPTION
|
||||
declare OPTARG
|
||||
declare OPTIND
|
||||
|
||||
while getopts ':f:c:d:n:' OPTION; do
|
||||
echo $OPTION $OPTARG
|
||||
case "$OPTION" in
|
||||
f)
|
||||
BLOCK_FILE=$OPTARG
|
||||
echo File set to $BLOCK_FILE
|
||||
;;
|
||||
c)
|
||||
BLOCK_COMMENT_CHAR=$OPTARG
|
||||
;;
|
||||
d)
|
||||
BLOCK_DESCRIPTION=$OPTARG
|
||||
;;
|
||||
n)
|
||||
BLOCK_NAME=$OPTARG
|
||||
;;
|
||||
*)
|
||||
echo unknown option $OPTION
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
shift $(( OPTIND - 1 ))
|
||||
|
||||
__update
|
||||
echo -e "new block template follows use: block-add >\n" $BLOCK
|
||||
echo ----
|
||||
echo $([ -e "$BLOCK_FILE" ] || echo "Warning: No output file set yet, use block-set -f <path>" && echo "block will be placed in $BLOCK_FILE")
|
||||
echo -------
|
||||
}
|
||||
|
||||
|
||||
function add-block () {
|
||||
# only add if it doesn't exist, existance is only based on block begin
|
||||
local ADD
|
||||
ADD=$(echo "${BLOCK}" | sed 's/\//\\\//g')
|
||||
if [ -e "$BLOCK_FILE" ]; then
|
||||
sed -n '/^[ \t]*'"${BLOCK_BEGIN}"'/{q50}' "${BLOCK_FILE}"
|
||||
[ $? == 50 ] && return
|
||||
WHERE=${1-${BLOCK_BEGIN}} # default is end
|
||||
echo Where $WHERE
|
||||
sed -i '/'"${WHERE}"'/{s/.*/&\n'"${ADD}"'/;h};${x;/^$/{s//'"$ADD"'/;H};x}' "${BLOCK_FILE}"
|
||||
else
|
||||
echo "no file set in which to add block, use: set-block -f <file path>"
|
||||
fi
|
||||
}
|
||||
|
||||
modify-block () {
|
||||
sed -i '/^'"${BLOCK_BEGIN}"'/,/^'"${BLOCK_END}"$'/ {
|
||||
/'"${BLOCK_BEGIN}"'/b
|
||||
/'"${BLOCK_END}"'/b
|
||||
s/'"${1}"'/'"${2}"'/
|
||||
}' "${BLOCK_FILE}"
|
||||
}
|
||||
|
||||
remove-block () {
|
||||
[ -z "$BLOCK_DESCRIPTION" ] || sed -ni '/'"${BLOCK_BEGIN}"'/{x;d;};1h;1!{x;p;};${x;p;}' "${BLOCK_FILE}"
|
||||
remove-block-leading
|
||||
sed -i '/^'"${BLOCK_BEGIN}"'/,/^'"${BLOCK_END}"$'/ {
|
||||
d
|
||||
}' "${BLOCK_FILE}"
|
||||
}
|
||||
|
||||
remove-block-leading () {
|
||||
printf "%s\n" "$(tac $BLOCK_FILE \
|
||||
| sed '/'"${BLOCK_BEGIN}"'/,/^./{ /^[ \t]*$/d}' | tac)" > $BLOCK_FILE
|
||||
}
|
||||
|
||||
block-remove-content () {
|
||||
sed -i '/^'"${BLOCK_BEGIN}"'/,/^'"${BLOCK_END}"$'/ {
|
||||
/'"${BLOCK_BEGIN}"'/b
|
||||
/'"${BLOCK_END}"'/b
|
||||
d
|
||||
}' "${BLOCK_FILE}"
|
||||
}
|
||||
|
||||
|
||||
block-add-line () {
|
||||
# echo argument count $#, $1, $2, $3
|
||||
local ADD
|
||||
ADD="/^${BLOCK_BEGIN}/a\\${1}"
|
||||
if [ $# -gt 1 ]; then
|
||||
if [ "$1" == "--end" ];then
|
||||
ADD="/${BLOCK_END}/i\\${2}"
|
||||
else
|
||||
if [ "$1" == "--before" ];then
|
||||
ADD="/${2}/i\\${3}"
|
||||
else
|
||||
ADD="/${1}/a\\${2}"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
# echo $ADD
|
||||
sed -i '/^'"${BLOCK_BEGIN}"'/,/^'"${BLOCK_END}"$'/ {
|
||||
'"${ADD}"'
|
||||
}' "${BLOCK_FILE}"
|
||||
}
|
||||
|
||||
block-remove-line () {
|
||||
sed -i '/^'"${BLOCK_BEGIN}"'/,/^'"${BLOCK_END}"$'/ {
|
||||
/'"${1}"'/d
|
||||
}' "${BLOCK_FILE}"
|
||||
}
|
||||
|
||||
block-change-line () {
|
||||
sed -i '/^'"${BLOCK_BEGIN}"'/,/^'"${BLOCK_END}"$'/ {
|
||||
/'"${1}"'/c\'"${2}"'
|
||||
}' "${BLOCK_FILE}"
|
||||
}
|
||||
|
||||
block-modify-line () {
|
||||
sed -i '/^'"${BLOCK_BEGIN}"'/,/^'"${BLOCK_END}"$'/ {
|
||||
/'"${BLOCK_BEGIN}"'/b
|
||||
/'"${BLOCK_END}"'/b
|
||||
/'"${1}"'/{s/'"${2}"'/'"${3}"'/}
|
||||
}' "${BLOCK_FILE}"
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
#!/bin/bash
|
||||
rm test.txt
|
||||
echo "some first text
|
||||
some middle text
|
||||
some after text" > test.txt
|
||||
source ./block.sh
|
||||
set-block -n "GO ENVIRONMENT" -d "comment before"
|
||||
set-block -f "./test.txt"
|
||||
# add-block "some middle text"
|
||||
add-block
|
||||
block-remove-content
|
||||
block-add-line "1 added to beginning"
|
||||
block-add-line --end "2 added to end"
|
||||
block-add-line "3 yet another added to beginning"
|
||||
block-add-line "4 yet yet another added to beginning -- remove later"
|
||||
block-add-line --end "5 finally one added to end"
|
||||
block-add-line ^2 "added after line 2"
|
||||
block-add-line --before ^2 "added before line 2"
|
||||
block-change-line "finally" "last line was changed to this"
|
||||
echo modifying block
|
||||
sleep 5
|
||||
block-modify-line "3" yet **yet**
|
||||
modify-block added *added*
|
||||
echo removing line with "remove"
|
||||
sleep 5
|
||||
block-remove-line "remove"
|
||||
echo "done with example, deleting"
|
||||
sleep 5
|
||||
echo removing block now
|
||||
remove-block
|
|
@ -0,0 +1,39 @@
|
|||
#!/bin/bash
|
||||
function replace {
|
||||
local PATTERN=$1; shift
|
||||
local NEW_LINE=$1; shift
|
||||
local FILE=$1; shift
|
||||
[ ! "$PATTERN" ] || [ ! $FILE ] && return 1
|
||||
local BEFORE=$1
|
||||
local NEW=$(echo "${NEW_LINE}" | sed 's/\//\\\//g')
|
||||
echo finding: $PATTERN Replace with $NEW before $BEFORE in $FILE
|
||||
touch "${FILE}" || return 1
|
||||
echo matching: $PATTERN
|
||||
match=false
|
||||
if [ "$NEW_LINE" ]; then
|
||||
sed -i '/'"${PATTERN}"'/{s/.*/'"${NEW}"'/;h};${x;/./{x;q100};{x;q20}}' "${FILE}"
|
||||
[[ $? -eq 100 ]] && match=true
|
||||
echo match $match
|
||||
if [ $match == false ]; then
|
||||
echo adding new entry $NEW_LINE
|
||||
if [ "$BEFORE" ]; then
|
||||
echo searching for $BEFORE to add line before
|
||||
# sed -i '/'"${BEFORE}"'/{i/.*/'"${NEW}"'/;h};${x;/./{x;q100};x}' "${FILE}"
|
||||
sed -i '/'"${BEFORE}"'/!{q20};/'"${BEFORE}"'/i\'"${NEW}" "${FILE}"
|
||||
echo return $?
|
||||
exit
|
||||
# ;/i '"${NEW}"'' "${FILE}"
|
||||
[[ $? -eq 100 ]] && match=true || match=false
|
||||
echo before match $match
|
||||
fi
|
||||
# if [ $match == false ]; then
|
||||
# echo appending to file
|
||||
# echo "${NEW_LINE}" >> "${FILE}"
|
||||
# fi
|
||||
else echo line matched/replaced
|
||||
fi
|
||||
else
|
||||
sed '/'"${PATTERN}"'/d' "${FILE}"
|
||||
echo line removed
|
||||
fi
|
||||
}
|
|
@ -0,0 +1,39 @@
|
|||
#!/bin/bash
|
||||
function replace {
|
||||
local PATTERN=$1; shift
|
||||
local NEW_LINE=$1; shift
|
||||
local FILE=$1; shift
|
||||
[ ! "$PATTERN" ] || [ ! $FILE ] && return 1
|
||||
local BEFORE=$1
|
||||
local NEW=$(echo "${NEW_LINE}" | sed 's/\//\\\//g')
|
||||
echo finding: $PATTERN Replace with $NEW before $BEFORE in $FILE
|
||||
touch "${FILE}" || return 1
|
||||
echo matching: $PATTERN
|
||||
match=false
|
||||
if [ "$NEW_LINE" ]; then
|
||||
sed -i '/'"${PATTERN}"'/{s/.*/'"${NEW}"'/;h};${x;/./{x;q100};{x;q20}}' "${FILE}"
|
||||
[[ $? -eq 100 ]] && match=true
|
||||
echo match $match
|
||||
if [ $match == false ]; then
|
||||
echo adding new entry $NEW_LINE
|
||||
if [ "$BEFORE" ]; then
|
||||
echo searching for $BEFORE to add line before
|
||||
# sed -i '/'"${BEFORE}"'/{i/.*/'"${NEW}"'/;h};${x;/./{x;q100};x}' "${FILE}"
|
||||
sed -i '/'"${BEFORE}"'/!{q20};/'"${BEFORE}"'/i\'"${NEW}" "${FILE}"
|
||||
echo return $?
|
||||
exit
|
||||
# ;/i '"${NEW}"'' "${FILE}"
|
||||
[[ $? -eq 100 ]] && match=true || match=false
|
||||
echo before match $match
|
||||
fi
|
||||
# if [ $match == false ]; then
|
||||
# echo appending to file
|
||||
# echo "${NEW_LINE}" >> "${FILE}"
|
||||
# fi
|
||||
else echo line matched/replaced
|
||||
fi
|
||||
else
|
||||
sed '/'"${PATTERN}"'/d' "${FILE}"
|
||||
echo line removed
|
||||
fi
|
||||
}
|
|
@ -0,0 +1,141 @@
|
|||
#!/usr/bin/env bash
|
||||
# shebang for syntax detection, not a command
|
||||
# do *not* set executable!
|
||||
|
||||
declare -Ag _modules_
|
||||
|
||||
shopt -s expand_aliases
|
||||
alias _args_='(( $# ))'
|
||||
alias _to_args_='set --'
|
||||
|
||||
module.already_loaded () {
|
||||
declare -Ag _modules_
|
||||
[[ -v _modules_[${BASH_SOURCE[1]}] ]]
|
||||
}
|
||||
|
||||
_blank_ () {
|
||||
[[ -z ${1:-} ]]
|
||||
}
|
||||
|
||||
_defined_ () {
|
||||
[[ -v $1 ]]
|
||||
}
|
||||
|
||||
_eq_ () {
|
||||
[[ $1 == "${2:-}" ]]
|
||||
}
|
||||
|
||||
_functions_ () {
|
||||
env -i bash <<END
|
||||
shopt -s expand_aliases
|
||||
alias source=:
|
||||
\\source $1 &>/dev/null
|
||||
compgen -A function;:
|
||||
END
|
||||
}
|
||||
|
||||
_in_ () {
|
||||
[[ $IFS$1$IFS == *"$IFS$2$IFS"* ]]
|
||||
}
|
||||
|
||||
_pop_ () {
|
||||
local -n ref1=$1
|
||||
local ref2=${2:-}
|
||||
|
||||
_present_ $ref2 && printf -v $ref2 %s "${ref1[-1]}"
|
||||
unset -v $1[-1]
|
||||
}
|
||||
|
||||
_present_ () {
|
||||
[[ -n ${1:-} ]]
|
||||
}
|
||||
|
||||
_push_ () {
|
||||
local -n ref=$1
|
||||
|
||||
ref+=( "$2" )
|
||||
}
|
||||
|
||||
_parent_=${BASH_SOURCE[1]:-}
|
||||
|
||||
[[ ${1:-} != module ]] && return
|
||||
set -- ${*:2}
|
||||
|
||||
_numargs_+=( $# )
|
||||
|
||||
{ ! _args_ && _present_ ${_file_:-} && _eq_ $_parent_ $_file_ ;} && return
|
||||
|
||||
{ ! _args_ && _present_ $_parent_ && ! _eq_ ${_parent_##*/} module ;} && {
|
||||
_in_ "${_ancestors_[*]:-}" $_parent_ && return
|
||||
_push_ _ancestors_ $_parent_
|
||||
}
|
||||
|
||||
! _args_ && _to_args_ $_parent_
|
||||
|
||||
for _file_; do
|
||||
_module_=${_file_%%=*}
|
||||
_file_=${_file_#*=}
|
||||
|
||||
_defined_ _modules_[$_file_] && continue
|
||||
|
||||
_eq_ $_module_ $_file_ && {
|
||||
_module_=${_module_##*/}
|
||||
_module_=${_module_%.*}
|
||||
}
|
||||
|
||||
_prefixes_+=( $_module_ )
|
||||
|
||||
_push_ _aliases_ "$(alias)"
|
||||
unalias -a
|
||||
|
||||
_functions_=$(_functions_ $_file_)
|
||||
|
||||
for _function_ in $_functions_; do
|
||||
printf -v _prefix_ %s. ${_prefixes_[*]}
|
||||
alias $_function_=$_prefix_$_function_
|
||||
done
|
||||
|
||||
_push_ _files_ $_file_
|
||||
_push_ _funcs_ "$_functions_"
|
||||
|
||||
set --
|
||||
source $_file_
|
||||
|
||||
unset -v _prefixes_[-1]
|
||||
|
||||
_pop_ _files_ _file_
|
||||
_pop_ _funcs_ _functions_
|
||||
|
||||
_modules_[$_file_]=''
|
||||
|
||||
for _function_ in $_functions_; do
|
||||
unalias $_function_
|
||||
done
|
||||
|
||||
eval "${_aliases_[-1]}"
|
||||
_pop_ _aliases_
|
||||
done
|
||||
|
||||
! (( ${#_files_[*]} )) && {
|
||||
unalias _args_
|
||||
unalias _to_args_
|
||||
unset -f _blank_
|
||||
unset -f _defined_
|
||||
unset -f _eq_
|
||||
unset -f _in_
|
||||
unset -f _pop_
|
||||
unset -f _present_
|
||||
unset -f _push_
|
||||
unset -v _file_
|
||||
unset -v _funcs_
|
||||
unset -v _function_
|
||||
unset -v _functions_
|
||||
unset -v _module_
|
||||
unset -v _name_
|
||||
unset -v _parent_
|
||||
unset -v _prefix_
|
||||
unset -v _prefixes_
|
||||
}
|
||||
{ ! (( _numargs_[-1] )) && [[ -n ${BASH_SOURCE[1]} && ${BASH_SOURCE[1]##*/} != module ]] ;} && unset -v _ancestors_[-1]
|
||||
unset -v _numargs_[-1]
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
#!/bin/bash
|
||||
# must have fuser and bindfs installed
|
||||
module-load () {
|
||||
BASH_MODULES="${BASH_MODULES:-/opt/bash/modules}"
|
||||
MODULES=$1
|
||||
echo $MODULES
|
||||
for i in ${MODULES[@]}; do
|
||||
echo $BASH_MODULES ${i}
|
||||
. "$BASH_MODULES"/"$i".sh
|
||||
done
|
||||
}
|
|
@ -0,0 +1,31 @@
|
|||
#!/bin/bash
|
||||
# depends on sshfs fuse for ssh
|
||||
function smount(){
|
||||
MOUNTED=$(mountpoint "$2" | grep not)
|
||||
if [ -z "$MOUNTED" ]; then
|
||||
echo "remote $1 already mounted at $2, aborting mount"
|
||||
else
|
||||
echo "mounting $1 at $2 via ssh"
|
||||
sshfs $1 $2 $3 $4 -o default_permissions
|
||||
fi
|
||||
}
|
||||
|
||||
function usmount(){
|
||||
MOUNTED=$(mountpoint $1 | grep not)
|
||||
if [ -z "$MOUNTED" ]; then
|
||||
echo "unmounting remote file system at $1"
|
||||
fusermount -u $1
|
||||
else
|
||||
echo "nothing mounted at $1, aborting unmount"
|
||||
fi
|
||||
}
|
||||
|
||||
DIR="${BASH_SOURCE%/*}"
|
||||
if [[ ! -d "$DIR" ]]; then DIR="$PWD"; fi
|
||||
|
||||
for f in $DIR/*; do
|
||||
if [ ${f: -4} != ".off" ] && [ $(basename $f) != "sshfs.sh" ] && [ ! -d "$f" ] ; then
|
||||
# echo 'loading mount functions for '$f
|
||||
. $f
|
||||
fi
|
||||
done
|
|
@ -0,0 +1,6 @@
|
|||
BASH_MODULES="${BASH_MODULES:-/opt/bash/modules}"
|
||||
. $BASH_MODULES/load-modules.sh
|
||||
MODULES=(logit)
|
||||
load-modules $MODULES
|
||||
|
||||
logit v
|
|
@ -0,0 +1,20 @@
|
|||
#!/bin/bash
|
||||
# append to the history file, don't overwrite it
|
||||
shopt -s histappend
|
||||
# check the window size after each command and, if necessary,
|
||||
# update the values of LINES and COLUMNS.
|
||||
shopt -s checkwinsize
|
||||
# If set, the pattern "**" used in a pathname expansion context will
|
||||
# match all files and zero or more directories and subdirectories.
|
||||
#shopt -s globstar
|
||||
|
||||
# enable programmable completion features (you don't need to enable
|
||||
# if it's already enabled in /etc/bash.bashrc and /etc/profile
|
||||
# sources /etc/bash.bashrc).
|
||||
if ! shopt -oq posix; then
|
||||
if [ -f /usr/share/bash-completion/bash_completion ]; then
|
||||
. /usr/share/bash-completion/bash_completion
|
||||
elif [ -f /etc/bash_completion ]; then
|
||||
. /etc/bash_completion
|
||||
fi
|
||||
fi
|
|
@ -0,0 +1,78 @@
|
|||
#!/bin/bash
|
||||
DIR=${1:-$(dirname ${BASH_SOURCE[0]})}
|
||||
|
||||
# source the required directory source function
|
||||
if [ ! -e "$BASH_SHELL_BASE/source-dir.func" ]; then
|
||||
echo "!Unable to load sourcing function at $DIR/source-dir, shell not set up!"
|
||||
else
|
||||
. $BASH_SHELL_BASE/source-dir.func
|
||||
# source the default shopt options
|
||||
[ -e "$DIR/options" ] && . $DIR/options
|
||||
|
||||
function shell_process_directory () {
|
||||
local SUBDIRS
|
||||
local DIR
|
||||
local DSUBDIRS
|
||||
|
||||
DIR=${1:-$BASH_SHELL_BASE}
|
||||
echo $DIR
|
||||
|
||||
if [ -d "$DIR" ]; then
|
||||
if [ "$DIR" = "$BASH_SHELL_BASE" ] && [ $BASH_SHELL_BASE_SOURCED ]; then
|
||||
if [ -v PS1 ]; then
|
||||
echo base directory already sourced
|
||||
read -p "do you want to re-source the base (not recommended)? " -n 1 -r
|
||||
echo
|
||||
[[ ! $REPLY =~ ^[Yy]$ ]] && return 1
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -f "$DIR/setup.sh" ] && [ "$DIR" != "$BASH_SHELL_BASE" ]; then
|
||||
echo "$DIR/setup.sh" found, running instead of default processing
|
||||
. "$DIR/setup.sh"
|
||||
else
|
||||
# default processing
|
||||
local SUBDIRS
|
||||
local DSUBDIRS
|
||||
# default subdirectories to source
|
||||
DSUBDIRS="env function alias misc lang app"
|
||||
IFS=' ' read -r -a SUBDIRS <<< "${2:-$DSUBDIRS}"
|
||||
# echo ${SUBDIRS[@]}
|
||||
for SUBDIR in "${SUBDIRS[@]}"
|
||||
do
|
||||
if [ -e "$DIR/$SUBDIR" ]; then
|
||||
echo processing subdirectory $DIR/$SUBDIR
|
||||
# must quote all globs to avoid bash glob expansion which is likely on
|
||||
source_dir -p "archive" -x '"*.off" "*.md"' -d 0 $DIR/$SUBDIR
|
||||
else
|
||||
echo no subdirectory $DIR/$SUBDIR to process, ignorning
|
||||
fi
|
||||
done
|
||||
fi
|
||||
echo "done sourcing directory $DIR"
|
||||
else
|
||||
echo $DIR does not exist nothing to source
|
||||
fi
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
# process the base directory by default
|
||||
unset BASH_SHELL_BASE_SOURCED
|
||||
shell_process_directory
|
||||
export BASH_SHELL_BASE_SOURCED=true
|
||||
# process network
|
||||
shell_process_directory "$BASH_SHELL_NETWORK/all"
|
||||
[ $NETWORKNAME ] && shell_process_directory "$BASH_SHELL_NETWORK/$NETWORKNAME"
|
||||
# process host
|
||||
shell_process_directory "$BASH_SHELL_HOST/all"
|
||||
shell_process_directory "$BASH_SHELL_HOST/$(hostname)"
|
||||
# process user
|
||||
# Note: $HOME/shell or $HOME/BASH_SHELL_USER are sourced via $HOME/.bashrc
|
||||
|
||||
echo $(envg BASH) | xargs -n 1
|
||||
|
||||
fi
|
|
@ -0,0 +1,109 @@
|
|||
#!/bin/bash
|
||||
source_dir () {
|
||||
# USAGE
|
||||
# will never source source .files or .directories
|
||||
# all option arguments that contain globs/wildcards must be quoted to avoid expansion
|
||||
# p option excludes additional paths below of the given name (and depth)
|
||||
# d option sets the directory depth which is current directy by default, 0 is all
|
||||
# x excludes file globs
|
||||
# f inclucdes only file globs otherwise it's all except .files
|
||||
# if no directory is given it will attempt to source the present working directory
|
||||
# example:
|
||||
# source_dir -p "archive" -x '"*.off" "*.md"' -d 0 # $DIR/$SUBDIR
|
||||
declare OPTION
|
||||
declare OPTARG
|
||||
declare OPTIND
|
||||
local PATHS
|
||||
local NAMES
|
||||
local ENAMES
|
||||
local DEPTH=1
|
||||
local VERBOSE=0
|
||||
|
||||
while getopts 'p:d:x:f:' OPTION; do
|
||||
case "$OPTION" in
|
||||
p)
|
||||
# PATHS=("$OPTARG")
|
||||
IFS=',' read -r -a PATHS <<< "$OPTARG"
|
||||
# echo EXCLUDING THESE PATHS ${PATHS[*]}
|
||||
;;
|
||||
x)
|
||||
IFS=',' read -r -a ENAMES <<< "${OPTARG}"
|
||||
# echo EXCLUDING THESE FILE NAMES ${ENAMES[*]}
|
||||
;;
|
||||
f)
|
||||
# NAMES=("$OPTARG")
|
||||
IFS=',' read -r -a NAMES <<< "${OPTARG}"
|
||||
# echo INCLUDING ONLY THESE FILE NAMES ${NAMES[*]}
|
||||
;;
|
||||
d)
|
||||
DEPTH=$OPTARG
|
||||
# echo "SOURCING TO DEPTH (0=any)" "$DEPTH"
|
||||
;;
|
||||
*)
|
||||
echo unknown option $OPTION
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
shift $(( OPTIND - 1 ))
|
||||
|
||||
local DIR
|
||||
DIR="$@"
|
||||
if [ ! "$DIR" ]; then
|
||||
if [ -v PS1 ]; then
|
||||
echo no directory to source provided
|
||||
echo sourcing present working directory $(pwd)
|
||||
read -p "Do you want to continue? " -n 1 -r
|
||||
[[ $REPLY =~ ^[Yy]$ ]] && DIR=$(pwd) || return 1
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
|
||||
[ ! -d "$DIR" ] && echo " directory $DIR does not exist, aborting" && return 1
|
||||
|
||||
# echo dir $DIR
|
||||
|
||||
local FIND
|
||||
FIND="find $DIR"
|
||||
FIND+=$([ ! $DEPTH == 0 ] && echo " -maxdepth $DEPTH ")
|
||||
FIND+=" -type f ! -path \"*/.*/*\" ! -name \".*\" "
|
||||
|
||||
|
||||
local name
|
||||
local path
|
||||
|
||||
if [[ ${PATHS[0]} ]]; then
|
||||
for path in ${PATHS[@]}; do
|
||||
# echo excluding $path
|
||||
FIND+=$(echo ' ! -path "*/'$path'/*"')
|
||||
done
|
||||
fi
|
||||
|
||||
if [[ ${ENAMES[0]} ]]; then
|
||||
for name in ${ENAMES[@]}; do
|
||||
# echo excluding name $name
|
||||
FIND+=$(echo " ! -name ${name}")
|
||||
done
|
||||
fi
|
||||
|
||||
if [[ ${NAMES[0]} ]]; then
|
||||
for name in ${NAMES[@]}; do
|
||||
# echo only finding $name
|
||||
FIND+=$(echo " -name ${name}")
|
||||
done
|
||||
fi
|
||||
|
||||
# echo
|
||||
# echo find dir: $DIR
|
||||
# echo find command: $FIND
|
||||
|
||||
local FILES
|
||||
FILES=$(eval $FIND | sort)
|
||||
# echo $FILES | xargs -n 1
|
||||
for f in $FILES; do
|
||||
# echo sourcing: $f
|
||||
. "$f"
|
||||
done
|
||||
|
||||
}
|
Reference in New Issue