commit 832182fe9484a3ae3b266a1e62793a980441d784 Author: Tovi Jaeschke-Rogers Date: Thu Jul 2 15:14:16 2020 +0930 Initialized new dotfiles repo diff --git a/.bashrc b/.bashrc new file mode 100644 index 0000000..7de2a31 --- /dev/null +++ b/.bashrc @@ -0,0 +1,109 @@ +#!/bin/bash + +set -o vi +bind -m vi-insert "\C-l":clear-screen + +shopt -s extglob + +HISTSIZE= +HISTFILESIZE= + +export EDITOR='nvim' + +export GIT_AUTHOR_NAME="Tovi Jaeschke-Rogers" +export GIT_AUTHOR_EMAIL="tovi@tovijaeschke.xyz" +export GIT_COMMITTER_NAME="Tovi Jaeschke-Rogers" +export GIT_COMMITTER_EMAIL="tovi@tovijaeschke.xyz" + +export LESS='-R' +export LESSOPEN='|~/.lessfilter %s' + +alias ls="ls --color=auto" \ + vb='nvim ~/.bashrc && source ~/.bashrc' \ + va='nvim ~/.config/aliasrc && source ~/.bashrc' + +if [[ $(uname) != "Linux" ]]; then + + test -e "${HOME}/.iterm2_shell_integration.bash" && source "${HOME}/.iterm2_shell_integration.bash" || true + + export HOMEBREW_NO_INSTALL_CLEANUP=1 + + export GIT_AUTHOR_EMAIL="tovi.jaeschke-rogers@thirty4.com" + export GIT_COMMITTER_EMAIL="tovi.jaeschke-rogers@thirty4.com" + + alias ls="ls -G" \ + vb='nvim ~/.bash_profile && source ~/.bash_profile' \ + va='nvim ~/.config/aliasrc && source ~/.bash_profile' + + mount-hdd() { + if [ -z $1 ]; then + sudo umount /dev/disk2s1 && sudo /usr/local/bin/ntfs-3g /dev/disk2s1 /Volumes/NTFS -olocal -oallow_other + else + sudo umount /dev/$1 && sudo /usr/local/bin/ntfs-3g /dev/$1 /Volumes/NTFS -olocal -oallow_other + fi + } + +fi + +# set PATH so it includes user's private bin if it exists +if [ -d "$HOME/.local/bin" ] ; then + PATH="$PATH:$(du "$HOME/.local/bin/" | cut -f2 | tr '\n' ':')" +fi + +source ~/.config/aliasrc + +parse_git_branch() { + git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/' +} + +export PS1=" \[\033[0;36m\]\t \[\033[0;35m\]\u\[\033[0;32m\]@\[\033[0;34m\]\h \[\033[32m\]\W\[\033[33m\]\$(parse_git_branch)\[\033[31m\] \n$\[\033[00m\] " + +mkcd() { + if [ ! -d "$1" ]; then + mkdir -p "$1" && cd "$1" + elif [ -d "$1" ]; then + cd "$1" + else + echo "Error" + fi +} + +# Go up directory structures +up() { + cd $(printf "%0.0s../" $(seq 1 $1)); +} + +git() { + if [[ $@ == "mergetool" ]]; then + command git mergetool --no-gui + else + command git $@ + fi +} + +# git branch -vv | grep 'gone\]' | awk ' { print $1 }' | xargs -p git branch -d +git-prune() { + if [[ $@ == "--apply" ]]; then + command git branch --merged develop | grep -vEw "develop$|master$" | xargs git branch -d + else + echo "Run \"git prune --apply\" to delete the following branches:" + command git branch --merged develop | grep -vEw "develop$|master$" + fi +} + +color-diff() { + if [ -z ${1+x} ] || [ -z ${2+x} ]; then + echo "Usage: color-diff dir1/ dir2/" + return + fi + diff -bur $1 $2 | colordiff | less +} + +export NVM_DIR="$HOME/.nvm" +[ -s "/usr/local/opt/nvm/nvm.sh" ] && . "/usr/local/opt/nvm/nvm.sh" # This loads nvm +[ -s "/usr/local/opt/nvm/etc/bash_completion.d/nvm" ] && . "/usr/local/opt/nvm/etc/bash_completion.d/nvm" + + +[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion + +[[ -r "/usr/local/etc/profile.d/bash_completion.sh" ]] && . "/usr/local/etc/profile.d/bash_completion.sh" diff --git a/.config/aliasrc b/.config/aliasrc new file mode 100644 index 0000000..6e3310f --- /dev/null +++ b/.config/aliasrc @@ -0,0 +1,26 @@ +#!/bin/sh +alias q='exit' \ + dd='sudo dd status=progress' \ + h="history | grep" \ + back='cd -' \ + b='cd -' \ + py='python3' \ + py2='python2' \ + v='nvim' \ + vim='nvim' \ + ka='killall' \ + grep='grep --color=auto' \ + egrep='grep --color=auto -E' \ + sshtj='ssh tovi@tovijaeschke.xyz' \ + extip='curl -s www.icanhazip.com' \ + ns='sudo nmap -p- -sV' \ + cc='rm -rf cache/* && php symfony cc' \ + pdu='php symfony propel:diff && php symfony propel:up' \ + foursync='php symfony four:sync' \ + ddate='date +%d-%m-%Y' \ + gitup='git push origin $(git rev-parse --abbrev-ref HEAD)' \ + gco='git checkout' \ + vv='nvim ~/.config/nvim/init.vim' \ + delorig='find . -name "*.orig" -exec rm {} \;' \ + delbak='find . -name "*.bak" -exec rm {} \;' \ + site-clone='wget --mirror --convert-links --adjust-extension --page-requisites --no-parent' diff --git a/.config/nvim/init.vim b/.config/nvim/init.vim new file mode 100644 index 0000000..28dec6c --- /dev/null +++ b/.config/nvim/init.vim @@ -0,0 +1,204 @@ +let mapleader ="," + +if ! filereadable(expand('~/.config/nvim/autoload/plug.vim')) + echo "Downloading junegunn/vim-plug to manage plugins..." + silent !mkdir -p ~/.config/nvim/autoload/ + silent !curl "https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim" > ~/.config/nvim/autoload/plug.vim + autocmd VimEnter * PlugInstall +endif + +call plug#begin('~/.config/nvim/plugged') +Plug 'morhetz/gruvbox' +Plug 'neoclide/coc.nvim', {'branch': 'release'} +Plug 'junegunn/fzf', { 'do': { -> fzf#install() } } +Plug 'junegunn/fzf.vim' +"Plug 'vim-scripts/jcommenter.vim' +"Plug 'SirVer/ultisnips' +"Plug 'phux/vim-snippets' +"Plug 'tobyS/vmustache' +"Plug 'tobyS/pdv' +Plug 'Rican7/php-doc-modded' +Plug 'jreybert/vimagit' +Plug 'bling/vim-airline' +Plug 'tpope/vim-commentary' +Plug 'tpope/vim-fugitive' +Plug 'rbong/vim-flog' +Plug 'ap/vim-css-color' +call plug#end() + +" Some basics: + set go=a + set mouse=a + set nohlsearch + set clipboard+=unnamedplus + set incsearch + set smartcase + + set noswapfile + set nobackup + set undodir=~/.config/nvim/undodir + set undofile + + colorscheme gruvbox + set background=dark + + nnoremap c "_c + set nocompatible + filetype plugin on + syntax on + set encoding=utf-8 + set number relativenumber + +" Indent marks + "set listchars=tab:\|_ + "set list + +" Tab 2 spaces + filetype plugin indent on + set tabstop=2 softtabstop=2 expandtab shiftwidth=2 smarttab + +" Disables automatic commenting on newline: + autocmd FileType * setlocal formatoptions-=c formatoptions-=r formatoptions-=o + +" coc + inoremap + \ pumvisible() ? "\" : + \ check_back_space() ? "\" : + \ coc#refresh() + inoremap pumvisible() ? "\" : "\" + + function! s:check_back_space() abort + let col = col('.') - 1 + return !col || getline('.')[col - 1] =~# '\s' + endfunction + + nmap gd (coc-definition) + nmap gr (coc-references) + + inoremap pumvisible() ? "\" : "\" + inoremap pumvisible() ? "\" : "\" + +" fzf remaps + "nnoremap :GFiles + nnoremap :GFiles + nnoremap :Files + +" php-doc-modded + nnoremap :call PhpDocSingle()i + "nnoremap :call PhpDocSingle() + "vnoremap :call PhpDocRange() + let g:pdv_cfg_autoEndClass = 0 + let g:pdv_cfg_autoEndFunction = 0 + +" Spell-check set to o, 'o' for 'orthography': + map o :setlocal spell! spelllang=en_au + +" Splits open at the bottom and right, which is non-retarded, unlike vim defaults. + set splitbelow splitright + +" Shortcutting split navigation, saving a keypress: + " nnoremap h + " nnoremap j + " nnoremap k + " nnoremap l + +" Check file in shellcheck: + map s :!clear && shellcheck % + +" Replace all is aliased to S. + nnoremap S :%s//g + +" Ensure files are read as what I want: + let g:vimwiki_ext2syntax = {'.Rmd': 'markdown', '.rmd': 'markdown','.md': 'markdown', '.markdown': 'markdown', '.mdown': 'markdown'} + let g:vimwiki_list = [{'path': '~/vimwiki', 'syntax': 'markdown', 'ext': '.md'}] + autocmd BufRead,BufNewFile *.ms,*.me,*.mom,*.man set filetype=groff + autocmd BufRead,BufNewFile *.tex set filetype=tex + +" Automatically deletes all trailing whitespace on save. + autocmd BufWritePre * %s/\s\+$//e + +" Rebind $ to d + nnoremap d $ + +" Navigating with guides + inoremap /<++>"_c4l + vnoremap /<++>"_c4l + map /<++>"_c4l + +" Remember last cursor position + autocmd BufReadPost * if @% !~# '\.git[\/\\]COMMIT_EDITMSG$' && line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g`\"" | endif + +" Update CHANGELOG message + inoremap C Update CHANGELOG:wq + +"""HTML + autocmd FileType html inoremap b <++>FbT>i + autocmd FileType html inoremap it <++>FeT>i + autocmd FileType html inoremap 1

<++>2kf2

<++>2kf3

<++>2kfp

<++>02kf>a + autocmd FileType html inoremap a href=""><++><++>14hi + autocmd FileType html inoremap e target="_blank"href=""><++><++>14hi + autocmd FileType html inoremap ul
<++>03kfli o
  • F>a + autocmd FileType html inoremap ol
    <++>03kfim <++><++>Fcf"a + autocmd FileType html inoremap td <++>Fdcit + autocmd FileType html inoremap tr <++>kfth <++>Fhcit + autocmd FileType html inoremap tab
    O + autocmd FileType html inoremap gr F>a + autocmd FileType html inoremap rd F>a + autocmd FileType html inoremap yl F>a + autocmd FileType html inoremap dt
    <++>
    <++>2kcit + autocmd FileType html inoremap dl
    <++>3kcc + autocmd FileType html inoremap & & + autocmd FileType html inoremap á á + autocmd FileType html inoremap é é + autocmd FileType html inoremap í í + autocmd FileType html inoremap ó ó + autocmd FileType html inoremap ú ú + autocmd FileType html inoremap ä ä + autocmd FileType html inoremap ë ë + autocmd FileType html inoremap ï ï + autocmd FileType html inoremap ö ö + autocmd FileType html inoremap ü ü + autocmd FileType html inoremap ã ã + autocmd FileType html inoremap ẽ &etilde; + autocmd FileType html inoremap ĩ ĩ + autocmd FileType html inoremap õ õ + autocmd FileType html inoremap ũ ũ + autocmd FileType html inoremap ñ ñ + autocmd FileType html inoremap à à + autocmd FileType html inoremap è è + autocmd FileType html inoremap ì ì + autocmd FileType html inoremap ò ò + autocmd FileType html inoremap ù ù + + + +""MARKDOWN +" autocmd Filetype markdown,rmd map w yiWi[Ea](pa) +" autocmd Filetype markdown,rmd inoremap n --- +" autocmd Filetype markdown,rmd inoremap b ****<++>F*hi +" autocmd Filetype markdown,rmd inoremap s ~~~~<++>F~hi +" autocmd Filetype markdown,rmd inoremap e **<++>F*i +" autocmd Filetype markdown,rmd inoremap h ====<++>F=hi +" autocmd Filetype markdown,rmd inoremap i ![](<++>)<++>F[a +" autocmd Filetype markdown,rmd inoremap a [](<++>)<++>F[a +" autocmd Filetype markdown,rmd inoremap 1 #<++>kA +" autocmd Filetype markdown,rmd inoremap 2 ##<++>kA +" autocmd Filetype markdown,rmd inoremap 3 ###<++>kA +" autocmd Filetype markdown,rmd inoremap l -------- +" autocmd Filetype rmd inoremap r ```{r}```2kO +" autocmd Filetype rmd inoremap p ```{python}```2kO +" autocmd Filetype rmd inoremap c ``````2kO + +""".php + autocmd FileType php inoremap f public function {<++>}kkk$i + autocmd FileType php inoremap t $this + autocmd FileType php inoremap u use Thirty4\Theme\Form\\<++>;5hi + autocmd FileType php inoremap s 'url' => [ 'select', [ 'name' => '' ]],4hi + autocmd FileType php inoremap v var_dump();die();k$hi + diff --git a/.gitignore_global b/.gitignore_global new file mode 100644 index 0000000..f4af9f3 --- /dev/null +++ b/.gitignore_global @@ -0,0 +1,6 @@ +.idea +lib/filter/base +lib/form/base +zz_release_ticket.php +ZzDummyTask.class.php +lib/task/ZzDummyTask.class.php diff --git a/.iterm2_shell_integration.bash b/.iterm2_shell_integration.bash new file mode 100755 index 0000000..55b4677 --- /dev/null +++ b/.iterm2_shell_integration.bash @@ -0,0 +1,608 @@ +#!/bin/bash +# The iTerm2 customizations fall under the following license: +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + +# -- BEGIN ITERM2 CUSTOMIZATIONS -- +if [[ "$ITERM_ENABLE_SHELL_INTEGRATION_WITH_TMUX""$TERM" != screen && "$ITERM_SHELL_INTEGRATION_INSTALLED" = "" && "$-" == *i* && "$TERM" != linux && "$TERM" != dumb ]]; then + +if shopt extdebug | grep on > /dev/null; then + echo "iTerm2 Shell Integration not installed." + echo "" + echo "Your shell has 'extdebug' turned on." + echo "This is incompatible with shell integration." + echo "Find 'shopt -s extdebug' in bash's rc scripts and remove it." + return 0 +fi + +ITERM_SHELL_INTEGRATION_INSTALLED=Yes +# Saved copy of your PS1. This is used to detect if the user changes PS1 +# directly. ITERM_PREV_PS1 will hold the last value that this script set PS1 to +# (including various custom escape sequences). +ITERM_PREV_PS1="$PS1" + +# The following chunk of code, bash-preexec.sh, is licensed like this: +# The MIT License +# +# Copyright (c) 2015 Ryan Caloras and contributors (see https://github.com/rcaloras/bash-preexec) +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +# Wrap bash-preexec.sh in a function so that, if it exits early due to having +# been sourced elsewhere, it doesn't exit our entire script. +_install_bash_preexec () { +# -- BEGIN BASH-PREEXEC.SH -- +#!/bin/bash +# +# bash-preexec.sh -- Bash support for ZSH-like 'preexec' and 'precmd' functions. +# https://github.com/rcaloras/bash-preexec +# +# +# 'preexec' functions are executed before each interactive command is +# executed, with the interactive command as its argument. The 'precmd' +# function is executed before each prompt is displayed. +# +# Author: Ryan Caloras (ryan@bashhub.com) +# Forked from Original Author: Glyph Lefkowitz +# +# V0.3.7 +# +# -- END ITERM2 CUSTOMIZATIONS -- + +# bash-preexec.sh -- Bash support for ZSH-like 'preexec' and 'precmd' functions. +# https://github.com/rcaloras/bash-preexec +# +# +# 'preexec' functions are executed before each interactive command is +# executed, with the interactive command as its argument. The 'precmd' +# function is executed before each prompt is displayed. +# +# Author: Ryan Caloras (ryan@bashhub.com) +# Forked from Original Author: Glyph Lefkowitz +# +# V0.3.7 +# + +# General Usage: +# +# 1. Source this file at the end of your bash profile so as not to interfere +# with anything else that's using PROMPT_COMMAND. +# +# 2. Add any precmd or preexec functions by appending them to their arrays: +# e.g. +# precmd_functions+=(my_precmd_function) +# precmd_functions+=(some_other_precmd_function) +# +# preexec_functions+=(my_preexec_function) +# +# 3. Consider changing anything using the DEBUG trap or PROMPT_COMMAND +# to use preexec and precmd instead. Preexisting usages will be +# preserved, but doing so manually may be less surprising. +# +# Note: This module requires two Bash features which you must not otherwise be +# using: the "DEBUG" trap, and the "PROMPT_COMMAND" variable. If you override +# either of these after bash-preexec has been installed it will most likely break. + +# Avoid duplicate inclusion +if [[ "${__bp_imported:-}" == "defined" ]]; then + return 0 +fi +__bp_imported="defined" + +# Should be available to each precmd and preexec +# functions, should they want it. $? and $_ are available as $? and $_, but +# $PIPESTATUS is available only in a copy, $BP_PIPESTATUS. +# TODO: Figure out how to restore PIPESTATUS before each precmd or preexec +# function. +__bp_last_ret_value="$?" +BP_PIPESTATUS=("${PIPESTATUS[@]}") +__bp_last_argument_prev_command="$_" + +__bp_inside_precmd=0 +__bp_inside_preexec=0 + +# Fails if any of the given variables are readonly +# Reference https://stackoverflow.com/a/4441178 +__bp_require_not_readonly() { + local var + for var; do + if ! ( unset "$var" 2> /dev/null ); then + echo "iTerm2 Shell Integration:bash-preexec requires write access to ${var}" >&2 + return 1 + fi + done +} + +# Remove ignorespace and or replace ignoreboth from HISTCONTROL +# so we can accurately invoke preexec with a command from our +# history even if it starts with a space. +__bp_adjust_histcontrol() { + local histcontrol + histcontrol="${HISTCONTROL//ignorespace}" + # Replace ignoreboth with ignoredups + if [[ "$histcontrol" == *"ignoreboth"* ]]; then + histcontrol="ignoredups:${histcontrol//ignoreboth}" + fi; + export HISTCONTROL="$histcontrol" +} + +# This variable describes whether we are currently in "interactive mode"; +# i.e. whether this shell has just executed a prompt and is waiting for user +# input. It documents whether the current command invoked by the trace hook is +# run interactively by the user; it's set immediately after the prompt hook, +# and unset as soon as the trace hook is run. +__bp_preexec_interactive_mode="" + +__bp_trim_whitespace() { + local var=$@ + var="${var#"${var%%[![:space:]]*}"}" # remove leading whitespace characters + var="${var%"${var##*[![:space:]]}"}" # remove trailing whitespace characters + echo -n "$var" +} + +# This function is installed as part of the PROMPT_COMMAND; +# It sets a variable to indicate that the prompt was just displayed, +# to allow the DEBUG trap to know that the next command is likely interactive. +__bp_interactive_mode() { + __bp_preexec_interactive_mode="on"; +} + + +# This function is installed as part of the PROMPT_COMMAND. +# It will invoke any functions defined in the precmd_functions array. +__bp_precmd_invoke_cmd() { + # Save the returned value from our last command, and from each process in + # its pipeline. Note: this MUST be the first thing done in this function. + __bp_last_ret_value="$?" BP_PIPESTATUS=("${PIPESTATUS[@]}") + + # Don't invoke precmds if we are inside an execution of an "original + # prompt command" by another precmd execution loop. This avoids infinite + # recursion. + if (( __bp_inside_precmd > 0 )); then + return + fi + local __bp_inside_precmd=1 + + # Invoke every function defined in our function array. + local precmd_function + for precmd_function in "${precmd_functions[@]}"; do + + # Only execute this function if it actually exists. + # Test existence of functions with: declare -[Ff] + if type -t "$precmd_function" 1>/dev/null; then + __bp_set_ret_value "$__bp_last_ret_value" "$__bp_last_argument_prev_command" + # Quote our function invocation to prevent issues with IFS + "$precmd_function" + fi + done +} + +# Sets a return value in $?. We may want to get access to the $? variable in our +# precmd functions. This is available for instance in zsh. We can simulate it in bash +# by setting the value here. +__bp_set_ret_value() { + return ${1:-} +} + +__bp_in_prompt_command() { + + local prompt_command_array + IFS=';' read -ra prompt_command_array <<< "$PROMPT_COMMAND" + + local trimmed_arg + trimmed_arg=$(__bp_trim_whitespace "${1:-}") + + local command + for command in "${prompt_command_array[@]:-}"; do + local trimmed_command + trimmed_command=$(__bp_trim_whitespace "$command") + # Only execute each function if it actually exists. + if [[ "$trimmed_command" == "$trimmed_arg" ]]; then + return 0 + fi + done + + return 1 +} + +# This function is installed as the DEBUG trap. It is invoked before each +# interactive prompt display. Its purpose is to inspect the current +# environment to attempt to detect if the current command is being invoked +# interactively, and invoke 'preexec' if so. +__bp_preexec_invoke_exec() { + # Save the contents of $_ so that it can be restored later on. + # https://stackoverflow.com/questions/40944532/bash-preserve-in-a-debug-trap#40944702 + __bp_last_argument_prev_command="${1:-}" + # Don't invoke preexecs if we are inside of another preexec. + if (( __bp_inside_preexec > 0 )); then + return + fi + local __bp_inside_preexec=1 + + # Checks if the file descriptor is not standard out (i.e. '1') + # __bp_delay_install checks if we're in test. Needed for bats to run. + # Prevents preexec from being invoked for functions in PS1 + if [[ ! -t 1 && -z "${__bp_delay_install:-}" ]]; then + return + fi + + if [[ -n "${COMP_LINE:-}" ]]; then + # We're in the middle of a completer. This obviously can't be + # an interactively issued command. + return + fi + if [[ -z "${__bp_preexec_interactive_mode:-}" ]]; then + # We're doing something related to displaying the prompt. Let the + # prompt set the title instead of me. + return + else + # If we're in a subshell, then the prompt won't be re-displayed to put + # us back into interactive mode, so let's not set the variable back. + # In other words, if you have a subshell like + # (sleep 1; sleep 2) + # You want to see the 'sleep 2' as a set_command_title as well. + if [[ 0 -eq "${BASH_SUBSHELL:-}" ]]; then + __bp_preexec_interactive_mode="" + fi + fi + + if __bp_in_prompt_command "${BASH_COMMAND:-}"; then + # If we're executing something inside our prompt_command then we don't + # want to call preexec. Bash prior to 3.1 can't detect this at all :/ + __bp_preexec_interactive_mode="" + return + fi + + local this_command + this_command=$( + export LC_ALL=C + HISTTIMEFORMAT= builtin history 1 | sed '1 s/^ *[0-9][0-9]*[* ] //' + ) + + # Sanity check to make sure we have something to invoke our function with. + if [[ -z "$this_command" ]]; then + return + fi + + # If none of the previous checks have returned out of this function, then + # the command is in fact interactive and we should invoke the user's + # preexec functions. + + # Invoke every function defined in our function array. + local preexec_function + local preexec_function_ret_value + local preexec_ret_value=0 + for preexec_function in "${preexec_functions[@]:-}"; do + + # Only execute each function if it actually exists. + # Test existence of function with: declare -[fF] + if type -t "$preexec_function" 1>/dev/null; then + __bp_set_ret_value ${__bp_last_ret_value:-} + # Quote our function invocation to prevent issues with IFS + "$preexec_function" "$this_command" + preexec_function_ret_value="$?" + if [[ "$preexec_function_ret_value" != 0 ]]; then + preexec_ret_value="$preexec_function_ret_value" + fi + fi + done + + # Restore the last argument of the last executed command, and set the return + # value of the DEBUG trap to be the return code of the last preexec function + # to return an error. + # If `extdebug` is enabled a non-zero return value from any preexec function + # will cause the user's command not to execute. + # Run `shopt -s extdebug` to enable + __bp_set_ret_value "$preexec_ret_value" "$__bp_last_argument_prev_command" +} + +__bp_install() { + # Exit if we already have this installed. + if [[ "${PROMPT_COMMAND:-}" == *"__bp_precmd_invoke_cmd"* ]]; then + return 1; + fi + + trap '__bp_preexec_invoke_exec "$_"' DEBUG + + # Preserve any prior DEBUG trap as a preexec function + local prior_trap=$(sed "s/[^']*'\(.*\)'[^']*/\1/" <<<"${__bp_trap_string:-}") + unset __bp_trap_string + if [[ -n "$prior_trap" ]]; then + eval '__bp_original_debug_trap() { + '"$prior_trap"' + }' + preexec_functions+=(__bp_original_debug_trap) + fi + + # Adjust our HISTCONTROL Variable if needed. + __bp_adjust_histcontrol + + + # Issue #25. Setting debug trap for subshells causes sessions to exit for + # backgrounded subshell commands (e.g. (pwd)& ). Believe this is a bug in Bash. + # + # Disabling this by default. It can be enabled by setting this variable. + if [[ -n "${__bp_enable_subshells:-}" ]]; then + + # Set so debug trap will work be invoked in subshells. + set -o functrace > /dev/null 2>&1 + shopt -s extdebug > /dev/null 2>&1 + fi; + + # Install our hooks in PROMPT_COMMAND to allow our trap to know when we've + # actually entered something. + PROMPT_COMMAND="__bp_precmd_invoke_cmd; __bp_interactive_mode" + + # Add two functions to our arrays for convenience + # of definition. + precmd_functions+=(precmd) + preexec_functions+=(preexec) + + # Since this function is invoked via PROMPT_COMMAND, re-execute PC now that it's properly set + eval "$PROMPT_COMMAND" +} + +# Sets our trap and __bp_install as part of our PROMPT_COMMAND to install +# after our session has started. This allows bash-preexec to be included +# at any point in our bash profile. Ideally we could set our trap inside +# __bp_install, but if a trap already exists it'll only set locally to +# the function. +__bp_install_after_session_init() { + + # Make sure this is bash that's running this and return otherwise. + if [[ -z "${BASH_VERSION:-}" ]]; then + return 1; + fi + + # bash-preexec needs to modify these variables in order to work correctly + # if it can't, just stop the installation + __bp_require_not_readonly PROMPT_COMMAND HISTCONTROL HISTTIMEFORMAT || return + + # If there's an existing PROMPT_COMMAND capture it and convert it into a function + # So it is preserved and invoked during precmd. + if [[ -n "$PROMPT_COMMAND" ]]; then + eval '__bp_original_prompt_command() { + '"$PROMPT_COMMAND"' + }' + precmd_functions+=(__bp_original_prompt_command) + fi + + # Installation is finalized in PROMPT_COMMAND, which allows us to override the DEBUG + # trap. __bp_install sets PROMPT_COMMAND to its final value, so these are only + # invoked once. + # It's necessary to clear any existing DEBUG trap in order to set it from the install function. + # Using \n as it's the most universal delimiter of bash commands + PROMPT_COMMAND=$'\n__bp_trap_string="$(trap -p DEBUG)"\ntrap DEBUG\n__bp_install\n' +} + +# Run our install so long as we're not delaying it. +if [[ -z "$__bp_delay_install" ]]; then + __bp_install_after_session_init +fi; +# -- END BASH-PREEXEC.SH -- +} +_install_bash_preexec +unset -f _install_bash_preexec + +# -- BEGIN ITERM2 CUSTOMIZATIONS -- + +# We don't care about whitespace, but users care about not changing their histcontrol variables. +# We overwrite the upstream __bp_adjust_histcontrol function whcih gets called from the next +# PROMPT_COMMAND invocation. +function __bp_adjust_histcontrol() { + true +} + +function iterm2_begin_osc { + printf "\033]" +} + +function iterm2_end_osc { + printf "\007" +} + +function iterm2_print_state_data() { + iterm2_begin_osc + printf "1337;RemoteHost=%s@%s" "$USER" "$iterm2_hostname" + iterm2_end_osc + + iterm2_begin_osc + printf "1337;CurrentDir=%s" "$PWD" + iterm2_end_osc + + iterm2_print_user_vars +} + +# Usage: iterm2_set_user_var key value +function iterm2_set_user_var() { + iterm2_begin_osc + printf "1337;SetUserVar=%s=%s" "$1" $(printf "%s" "$2" | base64 | tr -d '\n') + iterm2_end_osc +} + +if [ -z "$(type -t iterm2_print_user_vars)" ] || [ "$(type -t iterm2_print_user_vars)" != function ]; then + # iterm2_print_user_vars is not already defined. Provide a no-op default version. + # + # Users can write their own version of this function. It should call + # iterm2_set_user_var but not produce any other output. + function iterm2_print_user_vars() { + true + } +fi + +function iterm2_prompt_prefix() { + iterm2_begin_osc + printf "133;D;\$?" + iterm2_end_osc +} + +function iterm2_prompt_mark() { + iterm2_begin_osc + printf "133;A" + iterm2_end_osc +} + +function iterm2_prompt_suffix() { + iterm2_begin_osc + printf "133;B" + iterm2_end_osc +} + +function iterm2_print_version_number() { + iterm2_begin_osc + printf "1337;ShellIntegrationVersion=14;shell=bash" + iterm2_end_osc +} + + +# If hostname -f is slow on your system, set iterm2_hostname before sourcing this script. +if [ -z "${iterm2_hostname:-}" ]; then + iterm2_hostname=$(hostname -f 2>/dev/null) + # some flavors of BSD (i.e. NetBSD and OpenBSD) don't have the -f option + if [ $? -ne 0 ]; then + iterm2_hostname=$(hostname) + fi +fi + +# Runs after interactively edited command but before execution +__iterm2_preexec() { + # Save the returned value from our last command + __iterm2_last_ret_value="$?" + + iterm2_begin_osc + printf "133;C;" + iterm2_end_osc + # If PS1 still has the value we set it to in iterm2_preexec_invoke_cmd then + # restore it to its original value. It might have changed if you have + # another PROMPT_COMMAND (like liquidprompt) that modifies PS1. + if [ -n "${ITERM_ORIG_PS1+xxx}" -a "$PS1" = "$ITERM_PREV_PS1" ] + then + export PS1="$ITERM_ORIG_PS1" + fi + iterm2_ran_preexec="yes" + + __bp_set_ret_value "$__iterm2_last_ret_value" "$__bp_last_argument_prev_command" +} + +function __iterm2_precmd () { + __iterm2_last_ret_value="$?" + + # Work around a bug in CentOS 7.2 where preexec doesn't run if you press + # ^C while entering a command. + if [[ -z "${iterm2_ran_preexec:-}" ]] + then + __iterm2_preexec "" + fi + iterm2_ran_preexec="" + + + + # This is an iTerm2 addition to try to work around a problem in the + # original preexec.bash. + # When the PS1 has command substitutions, this gets invoked for each + # substitution and each command that's run within the substitution, which + # really adds up. It would be great if we could do something like this at + # the end of this script: + # PS1="$(iterm2_prompt_prefix)$PS1($iterm2_prompt_suffix)" + # and have iterm2_prompt_prefix set a global variable that tells precmd not to + # output anything and have iterm2_prompt_suffix reset that variable. + # Unfortunately, command substitutions run in subshells and can't + # communicate to the outside world. + # Instead, we have this workaround. We save the original value of PS1 in + # $ITERM_ORIG_PS1. Then each time this function is run (it's called from + # PROMPT_COMMAND just before the prompt is shown) it will change PS1 to a + # string without any command substitutions by doing eval on ITERM_ORIG_PS1. At + # this point ITERM_PREEXEC_INTERACTIVE_MODE is still the empty string, so preexec + # won't produce output for command substitutions. + + # The first time this is called ITERM_ORIG_PS1 is unset. This tests if the variable + # is undefined (not just empty) and initializes it. We can't initialize this at the + # top of the script because it breaks with liquidprompt. liquidprompt wants to + # set PS1 from a PROMPT_COMMAND that runs just before us. Setting ITERM_ORIG_PS1 + # at the top of the script will overwrite liquidprompt's PS1, whose value would + # never make it into ITERM_ORIG_PS1. Issue 4532. It's important to check + # if it's undefined before checking if it's empty because some users have + # bash set to error out on referencing an undefined variable. + if [ -z "${ITERM_ORIG_PS1+xxx}" ] + then + # ITERM_ORIG_PS1 always holds the last user-set value of PS1. + # You only get here on the first time iterm2_preexec_invoke_cmd is called. + export ITERM_ORIG_PS1="$PS1" + fi + + # If you want to generate PS1 dynamically from PROMPT_COMMAND, the best way + # to do it is to define a function named iterm2_generate_ps1 that sets PS1. + # Issue 5964. Other shells don't have this issue because they don't need + # such extremes to get precmd and preexec. + if [ -n "$(type -t iterm2_generate_ps1)" ] && [ "$(type -t iterm2_generate_ps1)" = function ]; then + iterm2_generate_ps1 + fi + + + if [[ "$PS1" != "$ITERM_PREV_PS1" ]] + then + export ITERM_ORIG_PS1="$PS1" + fi + + # Get the value of the prompt prefix, which will change $? + \local iterm2_prompt_prefix_value="$(iterm2_prompt_prefix)" + + # Add the mark unless the prompt includes '$(iterm2_prompt_mark)' as a substring. + if [[ $ITERM_ORIG_PS1 != *'$(iterm2_prompt_mark)'* && x$ITERM2_SQUELCH_MARK = x ]] + then + iterm2_prompt_prefix_value="$iterm2_prompt_prefix_value$(iterm2_prompt_mark)" + fi + + # Send escape sequences with current directory and hostname. + iterm2_print_state_data + + # Reset $? to its saved value, which might be used in $ITERM_ORIG_PS1. + __bp_set_ret_value "$__iterm2_last_ret_value" "$__bp_last_argument_prev_command" + + # Set PS1 to various escape sequences, the user's preferred prompt, and more escape sequences. + export PS1="\[$iterm2_prompt_prefix_value\]$ITERM_ORIG_PS1\[$(iterm2_prompt_suffix)\]" + + # Save the value we just set PS1 to so if the user changes PS1 we'll know and we can update ITERM_ORIG_PS1. + export ITERM_PREV_PS1="$PS1" + __bp_set_ret_value "$__iterm2_last_ret_value" "$__bp_last_argument_prev_command" +} + +# Install my functions +preexec_functions+=(__iterm2_preexec) +precmd_functions+=(__iterm2_precmd) + +iterm2_print_state_data +iterm2_print_version_number +fi + +# -- END ITERM2 CUSTOMIZATIONS -- + diff --git a/.local/bin/c b/.local/bin/c new file mode 100755 index 0000000..3fb4807 --- /dev/null +++ b/.local/bin/c @@ -0,0 +1,5 @@ +#!/bin/bash + +F=$(fzf) + +[ -z "$F" ] || nvim "$F" diff --git a/.local/bin/dmenu-bangs b/.local/bin/dmenu-bangs new file mode 100755 index 0000000..cdf7e3b --- /dev/null +++ b/.local/bin/dmenu-bangs @@ -0,0 +1,98 @@ +#!/usr/bin/env bash +# author: unknown +# sentby: MoreChannelNoise (https://www.youtube.com/user/MoreChannelNoise) +# editby: gotbletu (https://www.youtube.com/user/gotbletu) + +# demo: https://www.youtube.com/watch?v=kxJClZIXSnM +# info: this is a script to launch other rofi scripts, +# saves us the trouble of binding multiple hotkeys for each script, +# when we can just use one hotkey for everything. + +declare -A LABELS +declare -A COMMANDS + +### +# List of defined 'bangs' + +# launch programs +COMMANDS["apps"]="dmenu_run -i -m 0 -fn 'Inconsolata:size=10' -nb '#222222' -nf '#bbbbbb' -sb '#005577' -sf '#eeeeee'" +LABELS["apps"]="" + +# clipboard +COMMANDS["clipboard"]="greenclip print | dmenu -i -l 10 -m 0 -fn 'Inconsolata:size=10' -nb '#222222' -nf '#bbbbbb' -sb '#005577' -sf '#eeeeee' -p 'clipboard: ' | xclip -selection clipboard" +LABELS["clipboard"]="" + +# search local files +COMMANDS["emoji"]="~/.local/bin/dmenu-scripts/dmenu-emoji" +LABELS["emoji"]="" + +# mount drives +COMMANDS["mount"]="sudo ~/.local/bin/dmenu-scripts/dmenu-mount" +LABELS["mount"]="" + +# umount drives +COMMANDS["unmount"]="sudo ~/.local/bin/dmenu-scripts/dmenu-mount unmount" +LABELS["unmount"]="" + +# shutdown +COMMANDS["shutdown"]="sudo ~/.local/bin/dmenu-scripts/dmenu-shutdown" +LABELS["shutdown"]="" + +# PDF man pages +COMMANDS["man"]="~/.local/bin/dmenu-scripts/dmenu-man" +LABELS["man"]="" + +# locate files +COMMANDS["locate"]="~/.local/bin/dmenu-scripts/dmenu-locate" +LABELS["locate"]="" + +################################################################################ +# do not edit below +################################################################################ +## +# Generate menu +## +function print_menu() +{ + for key in ${!LABELS[@]} + do + echo "$key ${LABELS}" + # echo "$key ${LABELS[$key]}" + # my top version just shows the first field in labels row, not two words side by side + done +} +## +# Show rofi. +## +function start() +{ + print_menu | sort | dmenu -i -m 0 -fn "Inconsolata:size=10" -nb "#222222" -nf "#bbbbbb" -sb "#005577" -sf "#eeeeee" -p "dmenu bangs: " + +} + + +# Run it +value="$(start)" + +# Split input. +# grab upto first space. +choice=${value%%\ *} +# graph remainder, minus space. +input=${value:$((${#choice}+1))} + +## +# Cancelled? bail out +## +if test -z ${choice} +then + exit +fi + +# check if choice exists +if test ${COMMANDS[$choice]+isset} +then + # Execute the choice + eval ${COMMANDS[$choice]} +else + eval $choice | dmenu +fi diff --git a/.local/bin/dmenu-scripts/dmenu-emoji b/.local/bin/dmenu-scripts/dmenu-emoji new file mode 100755 index 0000000..5323e7a --- /dev/null +++ b/.local/bin/dmenu-scripts/dmenu-emoji @@ -0,0 +1,15 @@ +#!/bin/bash + +#cat ~/.emoji | dmenu -i -l 10 -m 0 -fn 'Inconsolata:size=10' -nb '#222222' -nf '#bbbbbb' -sb '#005577' -sf '#eeeeee' -p 'Emoji: ' + +chosen=$(grep -v "#" ~/.emoji | dmenu -i -l 20 -m 0 -fn 'Inconsolata:size=10' -nb '#222222' -nf '#bbbbbb' -sb '#005577' -sf '#eeeeee' -p 'emoji: ') + +[ "$chosen" != "" ] || exit + +c=$(echo "$chosen" | sed "s/ .*//") +echo "$c" | tr -d '\n' | xclip -selection clipboard +notify-send "'$c' copied to clipboard." & + +s=$(echo "$chosen" | sed "s/.*; //" | awk '{print $1}') +echo "$s" | tr -d '\n' | xclip +notify-send "'$s' copied to primary." & diff --git a/.local/bin/dmenu-scripts/dmenu-locate b/.local/bin/dmenu-scripts/dmenu-locate new file mode 100755 index 0000000..769325a --- /dev/null +++ b/.local/bin/dmenu-scripts/dmenu-locate @@ -0,0 +1,3 @@ +#!/bin/bash + +xdg-open $(locate home media | dmenu -l 20 -i -m 0 -fn "Inconsolata:size=10" -nb "#000000" -nf "#bbbbbb" -sb "#0099cc" -sf "#000000" -p "Locate: ") diff --git a/.local/bin/dmenu-scripts/dmenu-man b/.local/bin/dmenu-scripts/dmenu-man new file mode 100755 index 0000000..5fdf651 --- /dev/null +++ b/.local/bin/dmenu-scripts/dmenu-man @@ -0,0 +1,3 @@ +#!/bin/bash + +man -k . | dmenu -i -m 0 -fn "Inconsolata:size=10" -nb "#000000" -nf "#bbbbbb" -sb "#0099cc" -sf "#000000" -l 20 -p "Man: " | awk '{print $1}' | xargs -r man -Tpdf | zathura - diff --git a/.local/bin/dmenu-scripts/dmenu-mount b/.local/bin/dmenu-scripts/dmenu-mount new file mode 100755 index 0000000..ce73a2d --- /dev/null +++ b/.local/bin/dmenu-scripts/dmenu-mount @@ -0,0 +1,28 @@ +#!/bin/bash + +COLS="name,type,size,mountpoint" + +if [[ "$1" == "unmount" ]] +then + drives="$(lsblk -rpo "$COLS" | awk '$2=="part"&&$4!=""{printf "%s (%s)\n",$1,$3}')" + [ -z "$drives" ] && exit 1 + chosen="$(echo "$drives" | dmenu -i -l 10 -m 0 -fn 'Inconsolata:size=10' -nb '#222222' -nf '#bbbbbb' -sb '#005577' -sf '#eeeeee' -p 'Drive to unmount: ' | awk '{print $1}')" + [ -z "$chosen" ] && exit 1 + umount $chosen && notify-send "$chosen umounted" || notfiy-send "Error unmounting $chosen" +else + drives="$(lsblk -rpo "$COLS" | awk '$2=="part"&&$4==""{printf "%s (%s)\n",$1,$3}')" + [ -z "$drives" ] && exit 1 + chosen="$(echo "$drives" | dmenu -i -l 10 -m 0 -fn 'Inconsolata:size=10' -nb '#222222' -nf '#bbbbbb' -sb '#005577' -sf '#eeeeee' -p 'Drive to mount: ' | awk '{print $1}')" + [ -z "$chosen" ] && exit 1 + mount "$chosen" && exit 0 + mp="$(find /mnt /media /mount /home -type d -maxdepth 1 2>/dev/null | dmenu -i -l 10 -m 0 -fn 'Inconsolata:size=10' -nb '#222222' -nf '#bbbbbb' -sb '#005577' -sf '#eeeeee' -p 'Mount point: ' | awk '{print $1}')" + [ "$mp" = "" ] && exit 1 + if [ ! -d "$mp" ]; then + mkdiryn=$(printf "No\\nYes" | dmenu -i -m 0 -fn 'Inconsolata:size=10' -nb '#222222' -nf '#bbbbbb' -sb '#005577' -sf '#eeeeee' -p 'Mount point does not exist, create it?') + [ "$mkdiryn" = "Yes" ] && sudo -A mkdir -p "$mp" + fi + echo $mp + mount "$chosen" "$mp" && notify-send "$chosen mounted to $mp." || notify-send "Error mounting $chosen to $mp" +fi + + diff --git a/.local/bin/dmenu-scripts/dmenu-shutdown b/.local/bin/dmenu-scripts/dmenu-shutdown new file mode 100755 index 0000000..f0a66ea --- /dev/null +++ b/.local/bin/dmenu-scripts/dmenu-shutdown @@ -0,0 +1,24 @@ +#!/bin/bash + +option=$(echo -e "Lock the screen\nReboot\nShutdown\nHibernate" | dmenu -i -m 0 -fn "Inconsolata:size=10" -nb "#000000" -nf "#bbbbbb" -sb "#0099cc" -sf "#000000" -p "Power menu: ") + +answer=$(echo -e "No\nYes" | dmenu -i -m 0 -fn "Inconsolata:size=10" -nb "#000000" -nf "#bbbbbb" -sb "#0099cc" -sf "#000000" -p "Would you like to ${option} now? ") + + +if [[ ${answer} == "Yes" ]] +then + if [[ ${option} == "Lock the screen" ]] + then + slock + elif [[ ${option} == "Reboot" ]] + then + systemctl reboot + elif [[ ${option} == "Shutdown" ]] + then + systemctl poweroff + elif [[ ${option} == "Hibernate" ]] + then + systemctl hibernate + fi +fi + diff --git a/.local/bin/new-repo b/.local/bin/new-repo new file mode 100755 index 0000000..4a7a948 --- /dev/null +++ b/.local/bin/new-repo @@ -0,0 +1,12 @@ +#!/bin/sh + +read -p "Enter the name/url for repo: " url +read -p "Enter the description for repo:" desc + +url_parsed=${url// /_} + +url_path="/var/www/git/${url_parsed}.git" + +ssh git@tovijaeschke.xyz "mkdir -p ${url_path} && git init --bare ${url_path} && echo -e \"\nrepo.url=${url_parsed}\nrepo.path=${url_path}\nrepo.desc=${desc}\n\" >> /etc/cgitrepos" + +git remote add origin git@git.tovijaeschke.xyz:${url_path} diff --git a/.local/bin/nt b/.local/bin/nt new file mode 100755 index 0000000..edfb56e --- /dev/null +++ b/.local/bin/nt @@ -0,0 +1,9 @@ +#!/bin/bash + +F=$(ls ~/notes/ | fzf) + +if [ ${F: -4} == ".enc" ]; then + fenc -e $(realpath ~/notes/${F}) +else + nvim $(realpath ~/notes/${F}) +fi diff --git a/.local/bin/pentest/bytetoword b/.local/bin/pentest/bytetoword new file mode 100755 index 0000000..6acdb46 --- /dev/null +++ b/.local/bin/pentest/bytetoword @@ -0,0 +1,10 @@ +#!/usr/bin/python3 + +import sys + +def a(one): + if one[:2] == "0x": + one = one[2:] + print(bytearray.fromhex(one).decode()) + +a(sys.argv[1]) diff --git a/.local/bin/pentest/leak-lookup b/.local/bin/pentest/leak-lookup new file mode 100755 index 0000000..3ec76ee --- /dev/null +++ b/.local/bin/pentest/leak-lookup @@ -0,0 +1,163 @@ +#!/usr/bin/env python3 + +class Colours: + HEADER = '\033[95m' + OKBLUE = '\033[94m' + OKGREEN = '\033[92m' + WARNING = '\033[93m' + FAIL = '\033[91m' + ENDC = '\033[0m' + BOLD = '\033[1m' + UNDERLINE = '\033[4m' + +try: + import os + import re + import sys + import getopt + import requests + from clint.textui import progress + from bs4 import BeautifulSoup +except Exception as err: + print(Colours.FAIL + "Error: {}".format(err) + Colours.ENDC) + +def Usage(): + use_msg = ''' +---------- Usage ---------- +leak-lookup [options] [search term] +--------------------------- +Options: + -h: Prints this help message + -p: Searches haveibeenpwned.com + -d: Searches for leaked database +--------------------------- +''' + print(use_msg) + +def DownloadDatabase(url, name): + try: + r = requests.get(url, stream=True) + with open(name, 'wb') as f: + total_length = int(r.headers.get('content-length')) + for chunk in progress.bar(r.iter_content(chunk_size=1024), expected_size=(total_length/1024) + 1): + if chunk: + f.write(chunk) + f.flush() + except (KeyboardInterrupt, SystemExit, EOFError): + print(Colours.FAIL + "An error occurred, cleaning up" + Colours.ENDC) + os.remove(name) + +def DatabaseQuery(database): + r = requests.get("https://www.databases.today/search-nojs.php?for=" + database) + if r.reason != "OK": + print(Colours.FAIL + "Error code: {}".format(r.status_code) + Colours.ENDC) + sys.exit(1) + soup = BeautifulSoup(r.text, "html.parser") + dbs = soup.find(id="myTable").find_all("tr") + entries = [] + for table in dbs: + entry = table.find_all("td") + if len(entry) != 0: + entries.append([entry[0].text, entry[4].a.get("href")]) + print("Which file would you like to download?") + for index, dllink in enumerate(entries): + print("{}) {}".format(index + 1, dllink[0])) + print("a) All") + print("q) Quit") + download_choice = input(">> ") + if download_choice == "q": + sys.exit(0) + elif download_choice == "a": + for x in dllink: + DownloadDatabase(x[1], x[0]) + else: + try: + download_choice = int(download_choice) - 1 + DownloadDatabase(dllink[1], dllink[0].split(" (")[0]) + except: + print(Colours.FAIL + "Error: Invalid selection" + Colours.ENDC) + sys.exit(1) + + +def QueryHaveIBeenPwned(email): + r = requests.post("https://haveibeenpwned.com/", data={"Account": email}) + if r.reason != "OK": + print(Colours.FAIL + "Error code: {}".format(r.status_code) + Colours.ENDC) + sys.exit(1) + soup = BeautifulSoup(r.text, "html.parser") + pwnCount = re.match("Pwned on \d+", soup.find(id="pwnCount").text) + if pwnCount == None: + print(Colours.OKGREEN + "{} has no public leaks".format(email) + Colours.ENDC) + return + print(Colours.FAIL + "{} has {} public leaks avalible".format(email, pwnCount.group().split(" ")[-1]) + Colours.ENDC) + leaks = [] + for leak in soup.find_all(class_="pwnedWebsite"): + leak_name = None + leak_status = None + compromised_data = None + leak_name_html = leak.find(class_="pwnedCompanyTitle") + if leak_name_html: + if "(" in leak_name_html.text: + leak_name = leak_name_html.text.split(" (")[0] + leak_status = leak_name_html.text.split(" (")[1][:-2] + else: + leak_name = leak_name_html.text[:-1] + leak_status = None + compromised_data_html = leak.find(class_="dataClasses") + if compromised_data_html: + compromised_data = compromised_data_html.text + if leak_name: + leaks.append([leak_name, leak_status, compromised_data]) + print("\nDownload databases:") + for index, leak in enumerate(leaks): + if leak[1] == None: + print("{}) {}: {}".format(index + 1, leak[0], leak[2])) + else: + print("{}) {} ({}): {}".format(index + 1, leak[0], leak[1], leak[2])) + print("a) Download all") + print("q) Quit") + download_choice = input(">> ") + if download_choice == "q": + sys.exit(0) + elif download_choice == "a": + for leak in leaks: + DatabaseQuery(leak[0]) + try: + download_choice = int(download_choice) - 1 + DatabaseQuery(leaks[download_choice][0]) + except: + print(Colours.FAIL + "Error: Invalid selection" + Colours.ENDC) + sys.exit(1) + + +def main(): + if len(sys.argv[1:]) == 0: + Usage() + sys.exit(1) + try: + options, remainder = getopt.getopt(sys.argv[1:],'hpd',['h', 'p','d',]) + except getopt.GetoptError as err: + print(Colours.FAIL + "Error: {}".format(err) + Colours.ENDC) + sys.exit(1) + + for opt, arg in options: + if opt == "-h": + Usage() + sys.exit(0) + elif opt == "-p": + if len(remainder) == 0: + Usage() + sys.exit(1) + QueryHaveIBeenPwned(" ".join(remainder)) + elif opt == "-d": + if len(remainder) == 0: + Usage() + sys.exit(1) + DatabaseQuery(" ".join(remainder)) + + +if __name__ == "__main__": + try: + main() + except (KeyboardInterrupt, SystemExit, EOFError): + sys.exit(0) diff --git a/.local/bin/shellcode-gen b/.local/bin/shellcode-gen new file mode 100755 index 0000000..68f8846 --- /dev/null +++ b/.local/bin/shellcode-gen @@ -0,0 +1,7 @@ +#!/bin/bash + +for i in $(objdump -d $1 | tr '\t' ' ' | tr ' ' '\n' | egrep '^[0-9a-f]{2}$' ) +do + echo -n "\x$i" +done +echo -e "\n" diff --git a/.local/bin/vg b/.local/bin/vg new file mode 100755 index 0000000..ebdbb69 --- /dev/null +++ b/.local/bin/vg @@ -0,0 +1,26 @@ +#!/bin/sh +VAGRANT=`which vagrant` +### User vagrant global-status to get the global ID +GLOBAL_ID='e2d06a8' +GLOBAL_DIR='/opt/vhosts/tools-deployment' +CWD=`pwd` + +pushd $GLOBAL_DIR +if [[ $1 == "up" ]] +then + $VAGRANT up $GLOBAL_ID + ntfy -l INFO -t 'VAGRANT' send 'VM has finished booting' +elif [[ $1 == "halt" ]] +then + $VAGRANT halt $GLOBAL_ID + ntfy -l INFO -t 'VAGRANT' send 'VM has halted' +elif [[ $1 == "sup" ]] +then + $VAGRANT up $GLOBAL_ID + ntfy -l INFO -t 'VAGRANT' send 'VM has started, ssh-ing into it' + echo 'Shelling into machine...' + $VAGRANT ssh +else + $VAGRANT "$@" +fi +popd diff --git a/.local/bin/workflow/cabl b/.local/bin/workflow/cabl new file mode 100755 index 0000000..9be66a6 --- /dev/null +++ b/.local/bin/workflow/cabl @@ -0,0 +1,28 @@ +#!/bin/bash +# Dependencies are xclip and xorg-xprop. +# qrencode required for qrcode generation. +# groff/zathura required for man pages. +prim="$(xclip -o)"; [ -z "$prim" ] && exit + +PID=$(xprop -id "$(xprop -root | awk '/_NET_ACTIVE_WINDOW\(WINDOW\)/{print $NF}')" | grep -m 1 PID | cut -d " " -f 3) +PID=$(echo "$(pstree -lpA "$PID" | tail -n 1)" | awk -F'---' '{print $NF}' | sed -re 's/[^0-9]//g') +cd "$(readlink /proc/"$PID"/cwd)" +[[ "${prim}" == *"~"* ]] && prim=$(echo "~/go/src/gitlab.com/tovijaeschke/website" | sed 's@~@'"$HOME"'@g') +[ -f "$prim" ] && xdg-open "$prim" && exit +[ -d "$prim" ] && st -c "$prim" && exit + +websearch() { "$BROWSER" "https://duckduckgo.com/?q=$@" ;} +wikipedia() { "$BROWSER" "https://en.wikipedia.org/wiki/$@" ;} +wiktionary() { "$BROWSER" "https://en.wiktionary.org/wiki/$@" ;} +piratebay() { "$BROWSER" "https://piratebays.fi/s/?q=$@" ;} +maps() { "$BROWSER" "https://www.openstreetmap.org/search?query=$@" ;} +ebay() { "$BROWSER" "https://www.ebay.com/sch/$@" ;} + +echo "$prim" | grep "^.*\.[A-Za-z]\+.*" >/dev/null && gotourl() { "$BROWSER" "$@" ;} +echo "$prim" | grep "^.*@.*\.[A-Za-z]\+$" >/dev/null && email() { xdg-email "$@" ;} +command -v qrencode >/dev/null && qrcode() { qrencode "$@" -s 10 -o /tmp/qr.png && xdg-open /tmp/qr.png ;} +man -k "^$prim$" >/dev/null && manual() { man -Tpdf "$prim" | zathura - ;} + +func="$(declare -F | awk '{print $3}' | dmenu -p "Plumb $prim to?" -i -l 15)" + +[ -z "$func" ] || "$func" "$prim" diff --git a/.local/bin/workflow/change_wp b/.local/bin/workflow/change_wp new file mode 100755 index 0000000..de2af74 --- /dev/null +++ b/.local/bin/workflow/change_wp @@ -0,0 +1,4 @@ +#!/bin/bash + +notify-send "Changing wallpaper" +feh --bg-fill ~/pix/cyberpunk/$(ls ~/pix/cyberpunk | shuf -n 1) diff --git a/.local/bin/workflow/compile b/.local/bin/workflow/compile new file mode 100755 index 0000000..44a9e54 --- /dev/null +++ b/.local/bin/workflow/compile @@ -0,0 +1,8 @@ +#!/bin/bash + +case "$1" in + *.asm) nasm -f elf64 "$1" && ld "${1%.*}".o -o "${1%.*}"; rm "${1%.*}".o ;; + *.c) gcc "$1" -o "${1%.*}" ;; + *.go) go build "$1" ;; + Makefile) make ;; +esac diff --git a/.local/bin/workflow/extern_monitor b/.local/bin/workflow/extern_monitor new file mode 100755 index 0000000..d2ec224 --- /dev/null +++ b/.local/bin/workflow/extern_monitor @@ -0,0 +1,9 @@ +#!/bin/bash +intern=LVDS-1 +extern=VGA-1 + +if xrandr | grep "$extern connected"; then + xrandr --output ${extern} --auto --right-of ${intern} +else + xrandr --output ${extern} --off --output ${intern} --auto +fi diff --git a/.local/bin/workflow/extract b/.local/bin/workflow/extract new file mode 100755 index 0000000..d09a790 --- /dev/null +++ b/.local/bin/workflow/extract @@ -0,0 +1,25 @@ +#!/bin/bash +if [ -f $1 ] ; then + # NAME=${1%.*} + # mkdir $NAME && cd $NAME + case $1 in + *.tar.bz2) tar xvjf ../$1 ;; + *.tar.gz) tar xvzf ../$1 ;; + *.tar.xz) tar xvJf ../$1 ;; + *.lzma) unlzma ../$1 ;; + *.bz2) bunzip2 ../$1 ;; + *.rar) unrar x -ad ../$1 ;; + *.gz) gunzip ../$1 ;; + *.tar) tar xvf ../$1 ;; + *.tbz2) tar xvjf ../$1 ;; + *.tgz) tar xvzf ../$1 ;; + *.zip) unzip ../$1 ;; + *.Z) uncompress ../$1 ;; + *.7z) 7z x ../$1 ;; + *.xz) unxz ../$1 ;; + *.exe) cabextract ../$1 ;; + *) echo "extract: '$1' - unknown archive method" ;; + esac +else +echo "$1 - file does not exist" + fi diff --git a/.local/bin/workflow/greenclip b/.local/bin/workflow/greenclip new file mode 100755 index 0000000..16f89de Binary files /dev/null and b/.local/bin/workflow/greenclip differ diff --git a/.local/bin/workflow/lock_toggle b/.local/bin/workflow/lock_toggle new file mode 100755 index 0000000..1efee0c --- /dev/null +++ b/.local/bin/workflow/lock_toggle @@ -0,0 +1,10 @@ +#!/bin/bash + +if [ $(pgrep xautolock) ] +then + killall xautolock + notify-send "🔓 Turning off xautolock" +else + xautolock -time 10 -locker slock & + notify-send "🔒 Turning on xautolock" +fi diff --git a/.local/bin/workflow/voldown b/.local/bin/workflow/voldown new file mode 100755 index 0000000..148560a --- /dev/null +++ b/.local/bin/workflow/voldown @@ -0,0 +1,4 @@ +#!/bin/bash +pactl set-sink-volume @DEFAULT_SINK@ -5% +vol=$(amixer sget Master | grep 'Right:' | awk -F'[][]' '{ print $2 }') +notify-send -t 500 "Volume: ${vol}" diff --git a/.local/bin/workflow/volup b/.local/bin/workflow/volup new file mode 100755 index 0000000..508d561 --- /dev/null +++ b/.local/bin/workflow/volup @@ -0,0 +1,4 @@ +#!/bin/bash +pactl set-sink-volume @DEFAULT_SINK@ +5% +vol=$(amixer sget Master | grep 'Right:' | awk -F'[][]' '{ print $2 }') +notify-send -t 500 "Volume: ${vol}" diff --git a/.local/bin/workflow/vpn b/.local/bin/workflow/vpn new file mode 100755 index 0000000..fd2c9e1 --- /dev/null +++ b/.local/bin/workflow/vpn @@ -0,0 +1,14 @@ +#!/bin/bash + + +listandReturn() { + printf "Listing contents of %s.\\n" "$1" + ls -rc "$1" | awk -F '/' '{print $NF}' | nl + read -erp "Pick an entry by number to $2, or press ctrl-c to cancel. " number + chosen="$(ls -rc "$1" | nl | grep -w "$number" | awk '{print $2}')" + basefile="$(basename "$chosen")" && base="${basefile%.*}" +} + +listandReturn ~/.openvpn/UDP\ 1194\ Normal/ + +sudo openvpn --config ~/.openvpn/UDP\ 1194\ Normal/${basefile}