@ -0,0 +1,26 @@ | |||||
! GENERAL | |||||
URxvt*saveLines: 100000 | |||||
URxvt*scrollBar: false | |||||
URxvt*scrollBar_right: false | |||||
URxvt*scrollstyle: rxvt | |||||
URxvt*termName: rxvt-256color | |||||
! THEME | |||||
URxvt*transparent: true | |||||
URxvt*depth: 32 | |||||
URxvt*tintColor: Gray | |||||
URxvt*shading: 30 | |||||
URxvt*foreground: White | |||||
URxvt*background: Blue | |||||
URxvt*internalBorder: 14 | |||||
URxvt*externalBorder: 0 | |||||
! FONT | |||||
URxvt*font: xft:Pragmata Pro:pixelsize=12:antialias=true:hinting=true | |||||
URxvt*boldFont: xft:Pragmata Pro:bold:pixelsize=12:antialias=true:hinting=true | |||||
URxvt*letterSpace: 0 | |||||
! EXT | |||||
URxvt.keysym.Shift-Control-V: perl:clipboard:paste | |||||
URxvt.iso14755: False | |||||
URxvt.perl-ext-common: default,clipboard |
@ -0,0 +1,12 @@ | |||||
Xft.dpi: 192 | |||||
Xft.autohint: 0 | |||||
Xft.lcdfilter: lcddefault | |||||
Xft.hintstyle: hintfull | |||||
Xft.hinting: 1 | |||||
Xft.antialias: 1 | |||||
Xft.rgba: rgb | |||||
! ------------------------------------------------------------------------------ | |||||
! URxvt | |||||
! ----------------------------------------------------------------------------- | |||||
! see ~/.Xdefaults |
@ -0,0 +1,96 @@ | |||||
#!/bin/bash | |||||
################################################## | |||||
# .aliases | |||||
# ------------ | |||||
# Loosly based on the amazing work of Jess Frazelle | |||||
# | |||||
# :author: Levi Olson | |||||
# :date: 1 Feb 2018 | |||||
# :version: 0.0.1 | |||||
################################################## | |||||
# Check for various OS openers. Quit as soon as we find one that works. | |||||
for opener in browser-exec xdg-open cmd.exe cygstart "start" open; do | |||||
if command -v $opener >/dev/null 2>&1; then | |||||
if [[ "$opener" == "cmd.exe" ]]; then | |||||
# shellcheck disable=SC2139 | |||||
alias open="$opener /c start"; | |||||
else | |||||
# shellcheck disable=SC2139 | |||||
alias open="$opener"; | |||||
fi | |||||
break; | |||||
fi | |||||
done | |||||
alias a='emacsclient ~/.bashrc' | |||||
alias sf='source ~/.bashrc' | |||||
alias ll='ls -ahl --color' | |||||
alias l='ls -ahl --color' | |||||
alias e='emacsclient' | |||||
alias brightness='sudo tee /sys/class/backlight/acpi_video1/brightness <<<' | |||||
alias pmsyu='sudo pacman -Syu --color=auto' | |||||
alias pacman='sudo pacman --color auto' | |||||
alias update='sudo pacman -Syu' | |||||
alias upmirrors='sudo reflector --score 100 --fastest 25 --sort rate --save /etc/pacman.d/mirrorlist --verbose' | |||||
#git | |||||
alias pr='git push origin HEAD' | |||||
alias gaa='git add --all .' | |||||
alias gcm='git commit -m' | |||||
alias gc='git checkout' | |||||
alias gd='git diff --patience' | |||||
alias gds='git diff --staged --patience' | |||||
alias st='git status' | |||||
alias gl='git log --decorate' | |||||
alias glb='git log --oneline --decorate --all --graph -n15' | |||||
alias glv='git log --oneline --decorate --all --graph' | |||||
#dirs | |||||
alias thit='cd ~/Projects/work/thit-mobile-api/; clear' | |||||
alias gothit='cd ~/go/src/go-thit/; clear' | |||||
#docker | |||||
alias dps='docker ps' | |||||
alias dpsa='docker ps -a' | |||||
#misc | |||||
alias copy='xsel --clipboard --input' | |||||
alias paste='xsel --clipboard --output' | |||||
#untar | |||||
alias untar='tar xvf' | |||||
#afk | |||||
alias afk='i3lock -c 000000' | |||||
# copy file interactive | |||||
alias cp='cp -i' | |||||
# move file interactive | |||||
alias mv='mv -i' | |||||
# Intuitive map function | |||||
# For example, to list all directories that contain a certain file: | |||||
# find . -name .gitattributes | map dirname | |||||
alias map="xargs -n1" | |||||
# Stopwatch | |||||
alias timer='echo "Timer started. Stop with Ctrl-D." && date && time cat && date' | |||||
# Always enable colored `grep` output | |||||
alias grep='grep --color=auto ' | |||||
# Easier navigation: .., ..., ...., ....., ~ and - | |||||
alias ..="cd .." | |||||
alias ...="cd ../.." | |||||
alias ....="cd ../../.." | |||||
alias .....="cd ../../../.." | |||||
alias ~="cd ~" | |||||
alias -- -="cd -" | |||||
# Allow aliases to be "sudoed" | |||||
alias sudo='sudo ' |
@ -0,0 +1,45 @@ | |||||
#!/bin/bash | |||||
############################################ | |||||
# .bash_profile | |||||
# --------------- | |||||
# Based on the amazing work of Jess Frazelle | |||||
############################################ | |||||
# Load the shell dotfiles, and then some: | |||||
# * ~/.path can be used to extend `$PATH`. | |||||
# * ~/.extra can be used for other settings you don’t want to commit. | |||||
for file in ~/.{bash_prompt,aliases,functions,path,dockerfunc,extra,exports}; do | |||||
if [[ -r "$file" ]] && [[ -f "$file" ]]; then | |||||
# shellcheck source=/dev/null | |||||
source "$file" | |||||
fi | |||||
done | |||||
unset file | |||||
# Save multi-line commands as single line in history | |||||
shopt -s cmdhist | |||||
# Case-insensitive globbing (used in pathname expansion) | |||||
shopt -s nocaseglob | |||||
# Append to the Bash history file, rather than overwriting it | |||||
shopt -s histappend | |||||
# Autocorrect typos in path names when using `cd` | |||||
shopt -s cdspell | |||||
# Enable some Bash 4 features when possible: | |||||
# * `autocd`, e.g. `**/qux` will enter `./foo/bar/baz/qux` | |||||
# * Recursive globbing, e.g. `echo **/*.txt` | |||||
for option in autocd globstar; do | |||||
shopt -s "$option" 2> /dev/null | |||||
done | |||||
# Add tab completion for SSH hostnames based on ~/.ssh/config | |||||
# ignoring wildcards | |||||
[[ -e "$HOME/.ssh/config" ]] && complete -o "default" \ | |||||
-o "nospace" \ | |||||
-W "$(grep "^Host" ~/.ssh/config | \ | |||||
grep -v "[?*]" | cut -d " " -f2 | \ | |||||
tr ' ' '\n')" scp sftp ssh |
@ -0,0 +1,128 @@ | |||||
#!/bin/bash | |||||
# Shell prompt based on the amazing work of Jess Frazelle. | |||||
# Screenshot: http://i.imgur.com/EkEtphC.png | |||||
if [[ $COLORTERM = gnome-* && $TERM = xterm ]] && infocmp gnome-256color >/dev/null 2>&1; then | |||||
export TERM='gnome-256color'; | |||||
elif infocmp xterm-256color >/dev/null 2>&1; then | |||||
export TERM='xterm-256color'; | |||||
fi; | |||||
prompt_git() { | |||||
local s=''; | |||||
local branchName=''; | |||||
# Check if the current directory is in a Git repository. | |||||
if [ "$(git rev-parse --is-inside-work-tree &>/dev/null; echo "${?}")" == '0' ]; then | |||||
# check if the current directory is in .git before running git checks | |||||
if [ "$(git rev-parse --is-inside-git-dir 2> /dev/null)" == 'false' ]; then | |||||
if [[ -O "$(git rev-parse --show-toplevel)/.git/index" ]]; then | |||||
git update-index --really-refresh -q &> /dev/null; | |||||
fi; | |||||
# Check for uncommitted changes in the index. | |||||
if ! git diff --quiet --ignore-submodules --cached; then | |||||
s+='+'; | |||||
fi; | |||||
# Check for unstaged changes. | |||||
if ! git diff-files --quiet --ignore-submodules --; then | |||||
s+='!'; | |||||
fi; | |||||
# Check for untracked files. | |||||
if [ -n "$(git ls-files --others --exclude-standard)" ]; then | |||||
s+='?'; | |||||
fi; | |||||
# Check for stashed files. | |||||
if git rev-parse --verify refs/stash &>/dev/null; then | |||||
s+='$'; | |||||
fi; | |||||
fi; | |||||
# Get the short symbolic ref. | |||||
# If HEAD isn’t a symbolic ref, get the short SHA for the latest commit | |||||
# Otherwise, just give up. | |||||
branchName="$(git symbolic-ref --quiet --short HEAD 2> /dev/null || \ | |||||
git rev-parse --short HEAD 2> /dev/null || \ | |||||
echo '(unknown)')"; | |||||
[ -n "${s}" ] && s=" [${s}]"; | |||||
echo -e "${1}${branchName}${blue}${s}"; | |||||
else | |||||
return; | |||||
fi; | |||||
} | |||||
cloud="" | |||||
if grep -q "^flags.* hypervisor" /proc/cpuinfo && [[ ! -d "/mnt/c/Windows/" ]]; then | |||||
cloud="☁️ " | |||||
fi | |||||
if tput setaf 1 &> /dev/null; then | |||||
tput sgr0; # reset colors | |||||
bold=$(tput bold); | |||||
reset=$(tput sgr0); | |||||
# Solarized colors, taken from http://git.io/solarized-colors. | |||||
black=$(tput setaf 0); | |||||
blue=$(tput setaf 33); | |||||
cyan=$(tput setaf 37); | |||||
green=$(tput setaf 64); | |||||
orange=$(tput setaf 166); | |||||
purple=$(tput setaf 125); | |||||
red=$(tput setaf 124); | |||||
violet=$(tput setaf 61); | |||||
white=$(tput setaf 15); | |||||
yellow=$(tput setaf 136); | |||||
else | |||||
bold=''; | |||||
reset="\\e[0m"; | |||||
# shellcheck disable=SC2034 | |||||
black="\\e[1;30m"; | |||||
blue="\\e[1;34m"; | |||||
cyan="\\e[1;36m"; | |||||
green="\\e[1;32m"; | |||||
# shellcheck disable=SC2034 | |||||
orange="\\e[1;33m"; | |||||
# shellcheck disable=SC2034 | |||||
purple="\\e[1;35m"; | |||||
red="\\e[1;31m"; | |||||
violet="\\e[1;35m"; | |||||
white="\\e[1;37m"; | |||||
yellow="\\e[1;33m"; | |||||
fi; | |||||
# Highlight the user name when logged in as root. | |||||
if [[ "${USER}" == "root" ]]; then | |||||
userStyle="${red}"; | |||||
else | |||||
userStyle="${blue}"; | |||||
fi; | |||||
# Highlight the hostname when connected via SSH. | |||||
if [[ "${SSH_TTY}" ]]; then | |||||
hostStyle="${bold}${cyan}"; | |||||
else | |||||
hostStyle="${cyan}"; | |||||
fi; | |||||
# Set the terminal title to the current working directory. | |||||
PS1="\\[\\033]0;\\w\\007\\]"; | |||||
PS1+="\\[${bold}\\]\\n"; # newline | |||||
PS1+="\\[${userStyle}\\]\\u"; # username | |||||
PS1+="\\[${white}\\] at "; | |||||
PS1+="\\[${hostStyle}\\]${cloud}\\h"; # host | |||||
PS1+="\\[${white}\\] in "; | |||||
PS1+="\\[${green}\\]\\w"; # working directory | |||||
PS1+="\$(prompt_git \"${white} on ${violet}\")"; # Git repository details | |||||
PS1+="\\n"; | |||||
PS1+="\\[${white}\\]\$ \\[${reset}\\]"; # `$` (and reset color) | |||||
export PS1; | |||||
PS2="\\[${yellow}\\]→ \\[${reset}\\]"; | |||||
export PS2; |
@ -0,0 +1,45 @@ | |||||
#!/bin/bash | |||||
# If not running interactively, don't do anything | |||||
case $- in | |||||
*i*) ;; | |||||
*) return;; | |||||
esac | |||||
# restore last saved path | |||||
if [ -f ~/.last_dir ]; then | |||||
cd `cat ~/.last_dir` | |||||
fi | |||||
# check the window size after each command and, if necessary, | |||||
# update the values of LINES and COLUMNS. | |||||
shopt -s checkwinsize | |||||
# 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$//'\'')"' | |||||
# enable programmable completion features (you don't need to enable | |||||
# this, 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 | |||||
# shellcheck source=/dev/null | |||||
. /usr/share/bash-completion/bash_completion | |||||
elif [[ -f /etc/bash_completion ]]; then | |||||
# shellcheck source=/dev/null | |||||
. /etc/bash_completion | |||||
fi | |||||
fi | |||||
for file in /etc/bash_completion.d/* ; do | |||||
# shellcheck source=/dev/null | |||||
source "$file" | |||||
done | |||||
if [[ -f "${HOME}/.bash_profile" ]]; then | |||||
# shellcheck source=/dev/null | |||||
source "${HOME}/.bash_profile" | |||||
fi | |||||
sleep 0.2 | |||||
clear |
@ -0,0 +1,390 @@ | |||||
#!/bin/bash | |||||
###################################### | |||||
# .dockerfunc | |||||
# ------------ | |||||
# Bash wrappers for docker run commands | |||||
# | |||||
# Based on the amazing work of Jess Frazelle | |||||
# | |||||
# :author: Levi Olson | |||||
# :date: 1 Feb 2018 | |||||
# :version: 0.0.1 | |||||
###################################### | |||||
export DOCKER_REPO_PREFIX=jess | |||||
dcleanup() { | |||||
local containers | |||||
mapfile -t containers < <(docker ps -aq 2>/dev/null) | |||||
docker rm "${containers[@]}" 2>/dev/null | |||||
local volumes | |||||
mapfile -t volumes < <(docker ps --filter status=exited -q 2>/dev/null) | |||||
docker rm -v "${volumes[@]}" 2>/dev/null | |||||
local images | |||||
mapfile -t images < <(docker images --filter dangling=true -q 2>/dev/null) | |||||
docker rmi "${images[@]}" 2>/dev/null | |||||
} | |||||
del_stopped() { | |||||
local name=$1 | |||||
local state | |||||
state=$(docker inspect --format "{{.State.Running}}" "$name" 2>/dev/null) | |||||
if [[ "$state" == "false" ]]; then | |||||
docker rm "$name" | |||||
fi | |||||
} | |||||
relies_on() { | |||||
for container in "$@"; do | |||||
local state | |||||
state=$(docker inspect --format "{{.State.Running}}" "$container" 2>/dev/null) | |||||
if [[ "$state" == "false" ]] || [[ "$state" == "" ]]; then | |||||
echo "$container is not running, starting it for you." | |||||
$container | |||||
fi | |||||
done | |||||
} | |||||
###################### | |||||
# Container Aliases | |||||
# --------------------- | |||||
###################### | |||||
aws() { | |||||
docker run -it --rm \ | |||||
-v "${HOME}/.aws:/root/.aws" \ | |||||
--log-driver none \ | |||||
--name aws \ | |||||
${DOCKER_REPO_PREFIX}/awscli "$@" | |||||
} | |||||
cadvisor() { | |||||
docker run -d \ | |||||
--restart always \ | |||||
-v /:/rootfs:ro \ | |||||
-v /var/run:/var/run:rw \ | |||||
-v /sys:/sys:ro \ | |||||
-v /var/lib/docker/:/var/lib/docker:ro \ | |||||
-p 1234:8080 \ | |||||
--name cadvisor \ | |||||
google/cadvisor | |||||
hostess add cadvisor "$(docker inspect --format '{{.NetworkSettings.Networks.bridge.IPAddress}}' cadvisor)" | |||||
browser-exec "http://cadvisor:8080" | |||||
} | |||||
chrome() { | |||||
# add flags for proxy if passed | |||||
local proxy= | |||||
local map | |||||
local args=$* | |||||
if [[ "$1" == "tor" ]]; then | |||||
relies_on torproxy | |||||
map="MAP * ~NOTFOUND , EXCLUDE torproxy" | |||||
proxy="socks5://torproxy:9050" | |||||
args="https://check.torproject.org/api/ip ${*:2}" | |||||
fi | |||||
del_stopped chrome | |||||
# one day remove /etc/hosts bind mount when effing | |||||
# overlay support inotify, such bullshit | |||||
docker run -d \ | |||||
--memory 6gb \ | |||||
-v /etc/localtime:/etc/localtime:ro \ | |||||
-v /tmp/.X11-unix:/tmp/.X11-unix \ | |||||
-e "DISPLAY=unix${DISPLAY}" \ | |||||
-v "${HOME}/Downloads:/root/Downloads" \ | |||||
-v "${HOME}/Pictures:/root/Pictures" \ | |||||
-v "${HOME}/Torrents:/root/Torrents" \ | |||||
-v "${HOME}/.chrome:/data" \ | |||||
-v /dev/shm:/dev/shm \ | |||||
-v /etc/hosts:/etc/hosts \ | |||||
--security-opt seccomp:$HOME/chrome.json \ | |||||
--device /dev/snd \ | |||||
--device /dev/dri \ | |||||
--device /dev/video0 \ | |||||
--device /dev/usb \ | |||||
--device /dev/bus/usb \ | |||||
--group-add audio \ | |||||
--group-add video \ | |||||
--name chrome \ | |||||
${DOCKER_REPO_PREFIX}/chrome --user-data-dir=/data \ | |||||
--proxy-server="$proxy" \ | |||||
--host-resolver-rules="$map" "$args" | |||||
} | |||||
chromium() { | |||||
# add flags for proxy if passed | |||||
local proxy= | |||||
local map | |||||
local args=$* | |||||
if [[ "$1" == "tor" ]]; then | |||||
relies_on torproxy | |||||
map="MAP * ~NOTFOUND , EXCLUDE torproxy" | |||||
proxy="socks5://torproxy:9050" | |||||
args="https://check.torproject.org/api/ip ${*:2}" | |||||
fi | |||||
del_stopped chromium | |||||
# one day remove /etc/hosts bind mount when effing | |||||
# overlay support inotify, such bullshit | |||||
docker run -d \ | |||||
--memory 6gb \ | |||||
-v /etc/localtime:/etc/localtime:ro \ | |||||
-v /tmp/.X11-unix:/tmp/.X11-unix \ | |||||
-e "DISPLAY=unix${DISPLAY}" \ | |||||
-v "${HOME}/Downloads:/root/Downloads" \ | |||||
-v "${HOME}/Pictures:/root/Pictures" \ | |||||
-v "${HOME}/Torrents:/root/Torrents" \ | |||||
-v "${HOME}/.chrome:/data" \ | |||||
-v /dev/shm:/dev/shm \ | |||||
-v /etc/hosts:/etc/hosts \ | |||||
--security-opt seccomp:$HOME/chrome.json \ | |||||
--device /dev/snd \ | |||||
--device /dev/dri \ | |||||
--device /dev/video0 \ | |||||
--device /dev/usb \ | |||||
--device /dev/bus/usb \ | |||||
--group-add audio \ | |||||
--group-add video \ | |||||
--name chromium \ | |||||
${DOCKER_REPO_PREFIX}/chromium --user-data-dir=/data \ | |||||
--proxy-server="$proxy" \ | |||||
--host-resolver-rules="$map" "$args" | |||||
} | |||||
firefox() { | |||||
del_stopped firefox | |||||
relies_on pulseaudio | |||||
docker run -d \ | |||||
--memory 6gb \ | |||||
--net host \ | |||||
--cpuset-cpus 0 \ | |||||
-v /etc/localtime:/etc/localtime:ro \ | |||||
-v /tmp/.X11-unix:/tmp/.X11-unix \ | |||||
-v "${HOME}/.cache/mozilla:/root/.cache/mozilla" \ | |||||
-v "${HOME}/.mozilla:/root/.mozilla" \ | |||||
-v "${HOME}/Downloads:/root/Downloads" \ | |||||
-v "${HOME}/Pictures:/root/Pictures" \ | |||||
-v "${HOME}/Torrents:/root/Torrents" \ | |||||
-e "DISPLAY=unix${DISPLAY}" \ | |||||
-e GDK_SCALE \ | |||||
-e GDK_DPI_SCALE \ | |||||
--device /dev/snd \ | |||||
--device /dev/dri \ | |||||
--name firefox \ | |||||
${DOCKER_REPO_PREFIX}/firefox "$@" | |||||
} | |||||
gimp() { | |||||
del_stopped gimp | |||||
docker run -d \ | |||||
-v /etc/localtime:/etc/localtime:ro \ | |||||
-v /tmp/.X11-unix:/tmp/.X11-unix \ | |||||
-e "DISPLAY=unix${DISPLAY}" \ | |||||
-v "${HOME}/Pictures:/root/Pictures" \ | |||||
-v "${HOME}/.gtkrc:/root/.gtkrc" \ | |||||
-e GDK_SCALE \ | |||||
-e GDK_DPI_SCALE \ | |||||
--name gimp \ | |||||
${DOCKER_REPO_PREFIX}/gimp | |||||
} | |||||
hollywood() { | |||||
docker run --rm -it \ | |||||
--name hollywood \ | |||||
${DOCKER_REPO_PREFIX}/hollywood | |||||
} | |||||
htop() { | |||||
docker run --rm -it \ | |||||
--pid host \ | |||||
--net none \ | |||||
--name htop \ | |||||
${DOCKER_REPO_PREFIX}/htop | |||||
} | |||||
mpd() { | |||||
del_stopped mpd | |||||
# adding cap sys_admin so I can use nfs mount | |||||
# the container runs as a unpriviledged user mpd | |||||
docker run -d \ | |||||
--device /dev/snd \ | |||||
--cap-add SYS_ADMIN \ | |||||
-e MPD_HOST=/var/lib/mpd/socket \ | |||||
-v /etc/localtime:/etc/localtime:ro \ | |||||
-v /etc/exports:/etc/exports:ro \ | |||||
-v "${HOME}/.mpd:/var/lib/mpd" \ | |||||
-v "${HOME}/.mpd.conf:/etc/mpd.conf" \ | |||||
--name mpd \ | |||||
${DOCKER_REPO_PREFIX}/mpd | |||||
} | |||||
nes() { | |||||
del_stopped nes | |||||
local game=$1 | |||||
docker run -d \ | |||||
-v /tmp/.X11-unix:/tmp/.X11-unix \ | |||||
-e "DISPLAY=unix${DISPLAY}" \ | |||||
--device /dev/dri \ | |||||
--device /dev/snd \ | |||||
--name nes \ | |||||
${DOCKER_REPO_PREFIX}/nes "/games/${game}.rom" | |||||
} | |||||
pulseaudio() { | |||||
del_stopped pulseaudio | |||||
docker run -d \ | |||||
-v /etc/localtime:/etc/localtime:ro \ | |||||
--device /dev/snd \ | |||||
-p 4713:4713 \ | |||||
--restart always \ | |||||
--group-add audio \ | |||||
--name pulseaudio \ | |||||
${DOCKER_REPO_PREFIX}/pulseaudio | |||||
} | |||||
spotify() { | |||||
del_stopped spotify | |||||
docker run -d \ | |||||
-v /etc/localtime:/etc/localtime:ro \ | |||||
-v /tmp/.X11-unix:/tmp/.X11-unix \ | |||||
-v "${HOME}/.spotify:/home/spotify/.spotify" \ | |||||
-v "${HOME}/.cache/spotify:/home/spotify/.cache/spotify" \ | |||||
-e "DISPLAY=unix${DISPLAY}" \ | |||||
-e QT_DEVICE_PIXEL_RATIO \ | |||||
--security-opt seccomp:unconfined \ | |||||
--device /dev/snd \ | |||||
--device /dev/dri \ | |||||
--group-add audio \ | |||||
--group-add video \ | |||||
--name spotify \ | |||||
${DOCKER_REPO_PREFIX}/spotify | |||||
} | |||||
steam() { | |||||
del_stopped steam | |||||
relies_on pulseaudio | |||||
docker run -d \ | |||||
-v /etc/localtime:/etc/localtime:ro \ | |||||
-v /etc/machine-id:/etc/machine-id:ro \ | |||||
-v /var/run/dbus:/var/run/dbus \ | |||||
-v /tmp/.X11-unix:/tmp/.X11-unix \ | |||||
-v "${HOME}/.steam:/home/steam" \ | |||||
-e "DISPLAY=unix${DISPLAY}" \ | |||||
--link pulseaudio:pulseaudio \ | |||||
-e PULSE_SERVER=pulseaudio \ | |||||
--device /dev/dri \ | |||||
--name steam \ | |||||
${DOCKER_REPO_PREFIX}/steam | |||||
} | |||||
telnet() { | |||||
docker run -it --rm \ | |||||
--log-driver none \ | |||||
${DOCKER_REPO_PREFIX}/telnet "$@" | |||||
} | |||||
termboy() { | |||||
del_stopped termboy | |||||
local game=$1 | |||||
docker run --rm -it \ | |||||
--device /dev/snd \ | |||||
--name termboy \ | |||||
${DOCKER_REPO_PREFIX}/nes "/games/${game}.rom" | |||||
} | |||||
tor() { | |||||
del_stopped tor | |||||
docker run -d \ | |||||
--net host \ | |||||
--name tor \ | |||||
${DOCKER_REPO_PREFIX}/tor | |||||
# set up the redirect iptables rules | |||||
sudo setup-tor-iptables | |||||
# validate we are running through tor | |||||
browser-exec "https://check.torproject.org/" | |||||
# exit current shell | |||||
# exit 0 | |||||
} | |||||
torbrowser() { | |||||
del_stopped torbrowser | |||||
docker run -d \ | |||||
-v /etc/localtime:/etc/localtime:ro \ | |||||
-v /tmp/.X11-unix:/tmp/.X11-unix \ | |||||
-e "DISPLAY=unix${DISPLAY}" \ | |||||
-e GDK_SCALE \ | |||||
-e GDK_DPI_SCALE \ | |||||
--device /dev/snd \ | |||||
--name torbrowser \ | |||||
${DOCKER_REPO_PREFIX}/tor-browser | |||||
# exit current shell | |||||
# exit 0 | |||||
} | |||||
tormessenger() { | |||||
del_stopped tormessenger | |||||
docker run -d \ | |||||
-v /etc/localtime:/etc/localtime:ro \ | |||||
-v /tmp/.X11-unix:/tmp/.X11-unix \ | |||||
-e "DISPLAY=unix${DISPLAY}" \ | |||||
-e GDK_SCALE \ | |||||
-e GDK_DPI_SCALE \ | |||||
--device /dev/snd \ | |||||
--name tormessenger \ | |||||
${DOCKER_REPO_PREFIX}/tor-messenger | |||||
# exit current shell | |||||
# exit 0 | |||||
} | |||||
torproxy() { | |||||
del_stopped torproxy | |||||
docker run -d \ | |||||
--restart always \ | |||||
-v /etc/localtime:/etc/localtime:ro \ | |||||
-p 9050:9050 \ | |||||
--name torproxy \ | |||||
${DOCKER_REPO_PREFIX}/tor-proxy | |||||
hostess add torproxy "$(docker inspect --format '{{.NetworkSettings.Networks.bridge.IPAddress}}' torproxy)" | |||||
} | |||||
traceroute() { | |||||
docker run --rm -it \ | |||||
--net host \ | |||||
${DOCKER_REPO_PREFIX}/traceroute "$@" | |||||
} | |||||
transmission() { | |||||
del_stopped transmission | |||||
docker run -d \ | |||||
-v /etc/localtime:/etc/localtime:ro \ | |||||
-v "${HOME}/Torrents:/transmission/download" \ | |||||
-v "${HOME}/.transmission:/transmission/config" \ | |||||
-p 9091:9091 \ | |||||
-p 51413:51413 \ | |||||
-p 51413:51413/udp \ | |||||
--name transmission \ | |||||
${DOCKER_REPO_PREFIX}/transmission | |||||
hostess add transmission "$(docker inspect --format '{{.NetworkSettings.Networks.bridge.IPAddress}}' transmission)" | |||||
browser-exec "http://transmission:9091" | |||||
} | |||||
wireshark() { | |||||
del_stopped wireshark | |||||
docker run -d \ | |||||
-v /etc/localtime:/etc/localtime:ro \ | |||||
-v /tmp/.X11-unix:/tmp/.X11-unix \ | |||||
-e "DISPLAY=unix${DISPLAY}" \ | |||||
--cap-add NET_RAW \ | |||||
--cap-add NET_ADMIN \ | |||||
--net host \ | |||||
--name wireshark \ | |||||
${DOCKER_REPO_PREFIX}/wireshark | |||||
} |
@ -0,0 +1,35 @@ | |||||
#!/bin/bash | |||||
################################################## | |||||
# .exports | |||||
# ------------ | |||||
# Loosly based on the amazing work of Jess Frazelle | |||||
# | |||||
# :author: Levi Olson | |||||
# :date: 1 Feb 2018 | |||||
# :version: 0.0.1 | |||||
################################################## | |||||
export EDITOR=emacsclient | |||||
export TERMINAL=kitty | |||||
# Larger bash history (allow 32³ entries; default is 500) | |||||
export HISTSIZE=50000000 | |||||
export HISTFILESIZE=$HISTSIZE | |||||
export HISTCONTROL=ignoreboth:erasedups | |||||
# Prefer US English and use UTF-8 | |||||
export LANG="en_US.UTF-8" | |||||
export LC_ALL="en_US.UTF-8" | |||||
# Don't clear the screen after quitting a manual page | |||||
export MANPAGER="less -X" | |||||
export JOURNAL_DIR=$HOME/org/journal | |||||
export PROJECTS_DIR=$HOME/Projects | |||||
# DPI for GTK apps | |||||
export GDK_SCALE=1 | |||||
export GDK_DPI_SCALE=1 | |||||
export QT_DEVICE_PIXEL_RATIO=1 | |||||
export GI_TYPELIB_PATH="/usr/local/lib/girepository-1.0" |
@ -0,0 +1,156 @@ | |||||
#!/bin/bash | |||||
################################################## | |||||
# .functions | |||||
# ------------ | |||||
# Based on the amazing work of Jess Frazelle | |||||
# | |||||
# :author: Levi Olson | |||||
# :date: 1 Feb 2018 | |||||
# :version: 0.0.1 | |||||
################################################## | |||||
# Simple calculator | |||||
calc() { | |||||
local result="" | |||||
result="$(printf "scale=10;%s\\n" "$*" | bc --mathlib | tr -d '\\\n')" | |||||
# └─ default (when `--mathlib` is used) is 20 | |||||
if [[ "$result" == *.* ]]; then | |||||
# improve the output for decimal numbers | |||||
# add "0" for cases like ".5" | |||||
# add "0" for cases like "-.5" | |||||
# remove trailing zeros | |||||
printf "%s" "$result" | | |||||
sed -e 's/^\./0./' \ | |||||
-e 's/^-\./-0./' \ | |||||
-e 's/0*$//;s/\.$//' | |||||
else | |||||
printf "%s" "$result" | |||||
fi | |||||
printf "\\n" | |||||
} | |||||
# mkdir, cd into it | |||||
mkcd() { | |||||
mkdir -p "$@" | |||||
cd "$1" | |||||
} | |||||
# save path on cd | |||||
cd() { | |||||
builtin cd $@ | |||||
pwd > ~/.last_dir | |||||
} | |||||
# Syntax-highlight JSON strings or files | |||||
# Usage: `json '{"foo":42}'` or `echo '{"foo":42}' | json` | |||||
json() { | |||||
if [ -t 0 ]; then # argument | |||||
python -mjson.tool <<< "$*" | pygmentize -l javascript | |||||
else # pipe | |||||
python -mjson.tool | pygmentize -l javascript | |||||
fi | |||||
} | |||||
# Call from a local repo to open the repository on github/bitbucket in browser | |||||
# Modified version of https://github.com/zeke/ghwd | |||||
repo() { | |||||
# Figure out github repo base URL | |||||
local base_url | |||||
base_url=$(git config --get remote.origin.url) | |||||
base_url=${base_url%\.git} # remove .git from end of string | |||||
# Fix git@github.com: URLs | |||||
base_url=${base_url//git@github\.com:/https:\/\/github\.com\/} | |||||
# Fix git://github.com URLS | |||||
base_url=${base_url//git:\/\/github\.com/https:\/\/github\.com\/} | |||||
# Fix git@bitbucket.org: URLs | |||||
base_url=${base_url//git@bitbucket.org:/https:\/\/bitbucket\.org\/} | |||||
# Fix git@gitlab.com: URLs | |||||
base_url=${base_url//git@gitlab\.com:/https:\/\/gitlab\.com\/} | |||||
# Validate that this folder is a git folder | |||||
if ! git branch 2>/dev/null 1>&2 ; then | |||||
echo "Not a git repo!" | |||||
exit $? | |||||
fi | |||||
# Find current directory relative to .git parent | |||||
full_path=$(pwd) | |||||
git_base_path=$(cd "./$(git rev-parse --show-cdup)" || exit 1; pwd) | |||||
relative_path=${full_path#$git_base_path} # remove leading git_base_path from working directory | |||||
# If filename argument is present, append it | |||||
if [ "$1" ]; then | |||||
relative_path="$relative_path/$1" | |||||
fi | |||||
# Figure out current git branch | |||||
# git_where=$(command git symbolic-ref -q HEAD || command git name-rev --name-only --no-undefined --always HEAD) 2>/dev/null | |||||
git_where=$(command git name-rev --name-only --no-undefined --always HEAD) 2>/dev/null | |||||
# Remove cruft from branchname | |||||
branch=${git_where#refs\/heads\/} | |||||
[[ $base_url == *bitbucket* ]] && tree="src" || tree="tree" | |||||
url="$base_url/$tree/$branch$relative_path" | |||||
echo "Calling $(type open) for $url" | |||||
open "$url" &> /dev/null || (echo "Using $(type open) to open URL failed." && exit 1); | |||||
} | |||||
# Get colors in manual pages | |||||
man() { | |||||
env \ | |||||
LESS_TERMCAP_mb="$(printf '\e[1;31m')" \ | |||||
LESS_TERMCAP_md="$(printf '\e[1;31m')" \ | |||||
LESS_TERMCAP_me="$(printf '\e[0m')" \ | |||||
LESS_TERMCAP_se="$(printf '\e[0m')" \ | |||||
LESS_TERMCAP_so="$(printf '\e[1;44;33m')" \ | |||||
LESS_TERMCAP_ue="$(printf '\e[0m')" \ | |||||
LESS_TERMCAP_us="$(printf '\e[1;32m')" \ | |||||
man "$@" | |||||
} | |||||
# get dbus session | |||||
dbs() { | |||||
local t=$1 | |||||
if [[ -z "$t" ]]; then | |||||
local t="session" | |||||
fi | |||||
dbus-send --$t --dest=org.freedesktop.DBus \ | |||||
--type=method_call --print-reply \ | |||||
/org/freedesktop/DBus org.freedesktop.DBus.ListNames | |||||
} | |||||
# get the name of a x window | |||||
xname(){ | |||||
local window_id=$1 | |||||
if [[ -z $window_id ]]; then | |||||
echo "Please specifiy a window id, you find this with 'xwininfo'" | |||||
return 1 | |||||
fi | |||||
local match_string='".*"' | |||||
local match_qstring='"[^"\\]*(\\.[^"\\]*)*"' # NOTE: Adds 1 backreference | |||||
# get the name | |||||
xprop -id "$window_id" | \ | |||||
sed -nr \ | |||||
-e "s/^WM_CLASS\\(STRING\\) = ($match_qstring), ($match_qstring)$/instance=\\1\\nclass=\\3/p" \ | |||||
-e "s/^WM_WINDOW_ROLE\\(STRING\\) = ($match_qstring)$/window_role=\\1/p" \ | |||||
-e "/^WM_NAME\\(STRING\\) = ($match_string)$/{s//title=\\1/; h}" \ | |||||
-e "/^_NET_WM_NAME\\(UTF8_STRING\\) = ($match_qstring)$/{s//title=\\1/; h}" \ | |||||
-e "\${g; p}" | |||||
} |
@ -0,0 +1 @@ | |||||
.extra |
@ -0,0 +1,5 @@ | |||||
#!/bin/bash | |||||
export GOPATH=$HOME/go | |||||
export GOBIN=$GOPATH/bin | |||||
export PATH=$GOBIN:$PATH:/opt/android-sdk/platform-tools |
@ -0,0 +1,16 @@ | |||||
#!/bin/sh | |||||
########################################## | |||||
# .xinitrc | |||||
# --------- | |||||
########################################## | |||||
#XDG_CONFIG_HOME="$HOME/.config" | |||||
#export XDG_CONFIG_HOME | |||||
xrdb -merge ~/.Xresources | |||||
xrdb -merge ~/.Xdefaults | |||||
xmodmap $HOME/.xmodmap | |||||
exec i3 |
@ -0,0 +1,3 @@ | |||||
clear lock | |||||
keycode 66 = Control_L | |||||
add Control = Control_L |
@ -0,0 +1,3 @@ | |||||
init: | |||||
@echo "Let's begin" | |||||
@./init.sh |
@ -0,0 +1,48 @@ | |||||
#!/bin/bash | |||||
############################################################################## | |||||
# browser-exec | |||||
# ----------- | |||||
# Opens a hyperlink in the browser that is currently being run in a container. | |||||
# First checks if firefox is running then chrome. | |||||
# If neither are running it starts a firefox container. | |||||
# | |||||
# Usage: | |||||
# browser-exec $uri | |||||
# | |||||
# Based on the amazing work of Jess Frazelle | |||||
# | |||||
# Dependancies: firefox, chrome, nsenter, xdg | |||||
# | |||||
# :authors: Levi Olson | |||||
# :date: 1 Feb 2018 | |||||
# :version: 0.0.1 | |||||
############################################################################## | |||||
#set -e | |||||
set -o pipefail | |||||
browser_exec() { | |||||
# check if firefox container is running | |||||
firefox_state=$(docker inspect --format "{{.State.Running}}" firefox 2>/dev/null) | |||||
if [[ "$firefox_state" == "true" ]]; then | |||||
docker exec -i firefox /usr/bin/firefox "$@" 2>/dev/null | |||||
else | |||||
# check if chrome container is running | |||||
chrome_state=$(docker inspect --format "{{.State.Running}}" chrome 2>/dev/null) | |||||
if [[ "$chrome_state" == "true" ]]; then | |||||
docker exec -i chrome /usr/bin/google-chrome --user-data-dir=/data "$@" 2>/dev/null | |||||
else | |||||
# maybe we are running in runc | |||||
chrome_pid=$(pgrep -f "chrome --user-data" | head -n 1 2>/dev/null) | |||||
if [[ ! -z "$chrome_pid" ]]; then | |||||
# nsenter the chrome runc container | |||||
sudo nsenter -t "$chrome_pid" --pid --user --net --uts --mount --ipc /usr/bin/google-chrome --user-data-dir=/data "$@" 2>/dev/null | |||||
else | |||||
# neither are currently running so lets try xdg-open | |||||
xdg-open "$@" | |||||
fi | |||||
fi | |||||
fi | |||||
} | |||||
browser_exec "$@" |
@ -0,0 +1,27 @@ | |||||
#!/bin/bash | |||||
########################################## | |||||
# docker-cleanup-everything | |||||
# ------------ | |||||
# Based on the amazing work of Jess Frazelle | |||||
# | |||||
# Dependencies: docker | |||||
# | |||||
# :author: Levi Olson | |||||
# :date: 31 Jan 2018 | |||||
# :version: 0.0.1 | |||||
########################################## | |||||
cleanup() { | |||||
local containers | |||||
mapfile -t containers < <(docker ps -aq 2>/dev/null) | |||||
docker rm "${containers[@]}" 2>/dev/null | |||||
local volumes | |||||
mapfile -t volumes < <(docker ps --filter status=exited -q 2>/dev/null) | |||||
docker rm -v "${volumes[@]}" 2>/dev/null | |||||
local images | |||||
mapfile -t images < <(docker images --filter dangling=true -q 2>/dev/null) | |||||
docker rmi "${images[@]}" 2>/dev/null | |||||
} | |||||
cleanup |
@ -0,0 +1,27 @@ | |||||
#!/bin/bash | |||||
########################################## | |||||
# docker-cleanup-non-running-images | |||||
# ------------ | |||||
# Based on the amazing work of Jess Frazelle | |||||
# | |||||
# Dependencies: docker | |||||
# | |||||
# :author: Levi Olson | |||||
# :date: 31 Jan 2018 | |||||
# :version: 0.0.1 | |||||
########################################## | |||||
set -e | |||||
set -o pipefail | |||||
cleanup() { | |||||
mapfile -t images < <(docker images -q --no-trunc) | |||||
for c in $(docker ps -aq); do | |||||
image=$(docker inspect --format '{{.Image}}' "$c") | |||||
images=( "${images[@]/$image}" ) | |||||
done | |||||
docker rmi -f "${images[@]}" 2>&1 || true | |||||
} | |||||
cleanup |
@ -0,0 +1,19 @@ | |||||
#!/bin/bash | |||||
########################################## | |||||
# lockscreen | |||||
# ------------ | |||||
# | |||||
# Dependencies: docker, i3lock, scrot | |||||
# | |||||
# Loosly based on the amazing work of Jess Frazelle | |||||
# | |||||
# :author: Levi Olson | |||||
# :date: 31 Jan 2018 | |||||
# :version: 0.0.1 | |||||
########################################## | |||||
set -e | |||||
# subshell | |||||
( | |||||
i3lock -c 000000 | |||||
) |
@ -0,0 +1,41 @@ | |||||
#!/bin/bash | |||||
###################################### | |||||
# init.sh | |||||
# --------- | |||||
# Symlink ~/dotfiles to $HOME | |||||
###################################### | |||||
dir=~/dotfiles # dotfiles directory | |||||
backup=~/dotfiles_backup # old dotfiles backup directory | |||||
symfiles=".aliases .bash_profile .bash_prompt .bashrc .dockerfunc .exports .functions .path .xinitrc .Xresources .Xdefaults .xmodmap" | |||||
symdefaults=".extra" # not in version control | |||||
###################################### | |||||
# create dotfiles_old in homedir | |||||
echo "Creating $backup to backup of any existing dotfiles already in ~/" | |||||
mkdir -p $backup | |||||
echo "...done" | |||||
# change to the dotfiles directory | |||||
echo "Changing to the $dir directory" | |||||
cd $dir | |||||
echo "...done" | |||||
# move any existing dotfiles in homedir to dotfiles_old directory, then create symlinks | |||||
for file in $symfiles; do | |||||
echo "Moving any existing dotfiles from ~/ to $backup" | |||||
mv ~/$file $backup/ | |||||
echo "Creating symlink to $file in home directory." | |||||
ln -s $dir/$file ~/$file | |||||
done | |||||
echo "...done" | |||||
# create any template/default files not in version control | |||||
for file in $symdefaults; do | |||||
echo "Creating empty file $file in home directory." | |||||
touch $dir/$file | |||||
echo "#!/bin/bash\n\n##############################\n# $file\n# ---------------\n##############################\n\n" > $dir/$file | |||||
done | |||||
echo "...done" |