From 5c2f8c51a77902494dc2586a20e291859e000d6f Mon Sep 17 00:00:00 2001 From: acidvegas Date: Wed, 28 Feb 2024 22:45:58 -0500 Subject: [PATCH] Initial commit --- alacritty/.alacritty.toml | 79 +++++++++++++ bash/.bash_aliases | 51 ++++++++ bash/.bash_fun | 51 ++++++++ bash/.bash_functions | 145 +++++++++++++++++++++++ bash/.bash_recon | 59 +++++++++ bash/.bashrc | 11 ++ cmus/autosave | 59 +++++++++ dunst/dunstrc | 29 +++++ dwm/config.h | 80 +++++++++++++ dwm/patch_nosquares.diff | 13 ++ dwm/patch_notitles.diff | 10 ++ enterthevoid | 223 +++++++++++++++++++++++++++++++++++ enterthezoid | 145 +++++++++++++++++++++++ font/BlockZone.ttf | Bin 0 -> 76372 bytes font/ohsnap6x11r.psfu | Bin 0 -> 3583 bytes font/ohsnap7x12r.psfu | Bin 0 -> 3839 bytes font/ohsnap7x14r.psfu | Bin 0 -> 4351 bytes git/.gitconfig | 32 +++++ gpg/gpg.conf | 15 +++ scripts/bomber | 99 ++++++++++++++++ scripts/cmus-now | 5 + scripts/dbc | 75 ++++++++++++ scripts/gitremote | 62 ++++++++++ scripts/irc-post-commit-hook | 26 ++++ scripts/mutag | 13 ++ scripts/pmf | 59 +++++++++ scripts/shotz | 13 ++ scripts/statusbar | 5 + scripts/todo | 17 +++ scripts/torwall | 56 +++++++++ scripts/vps | 157 ++++++++++++++++++++++++ setup | 163 +++++++++++++++++++++++++ tmux/.tmux.conf | 37 ++++++ xorg/.xinitrc | 12 ++ 34 files changed, 1801 insertions(+) create mode 100644 alacritty/.alacritty.toml create mode 100644 bash/.bash_aliases create mode 100644 bash/.bash_fun create mode 100644 bash/.bash_functions create mode 100644 bash/.bash_recon create mode 100644 bash/.bashrc create mode 100644 cmus/autosave create mode 100644 dunst/dunstrc create mode 100644 dwm/config.h create mode 100644 dwm/patch_nosquares.diff create mode 100644 dwm/patch_notitles.diff create mode 100755 enterthevoid create mode 100755 enterthezoid create mode 100644 font/BlockZone.ttf create mode 100644 font/ohsnap6x11r.psfu create mode 100644 font/ohsnap7x12r.psfu create mode 100644 font/ohsnap7x14r.psfu create mode 100644 git/.gitconfig create mode 100644 gpg/gpg.conf create mode 100755 scripts/bomber create mode 100755 scripts/cmus-now create mode 100755 scripts/dbc create mode 100755 scripts/gitremote create mode 100644 scripts/irc-post-commit-hook create mode 100755 scripts/mutag create mode 100755 scripts/pmf create mode 100755 scripts/shotz create mode 100755 scripts/statusbar create mode 100755 scripts/todo create mode 100755 scripts/torwall create mode 100755 scripts/vps create mode 100755 setup create mode 100644 tmux/.tmux.conf create mode 100644 xorg/.xinitrc diff --git a/alacritty/.alacritty.toml b/alacritty/.alacritty.toml new file mode 100644 index 0000000..3a1d501 --- /dev/null +++ b/alacritty/.alacritty.toml @@ -0,0 +1,79 @@ +[colors.bright] +black = "0x696969" +blue = "0x007FFF" +cyan = "0x00CCCC" +green = "0x03C03C" +magenta = "0xFF1493" +red = "0xFF2400" +white = "0xFFFAFA" +yellow = "0xFDFF00" + +[colors.normal] +black = "0x10100E" +blue = "0x0087BD" +cyan = "0x20B2AA" +green = "0x009F6B" +magenta = "0x9A4EAE" +red = "0xC40233" +white = "0xC6C6C4" +yellow = "0xFFD700" + +[colors.primary] +background = "0x000000" +foreground = "0xC6C6C4" + +[font] +size = 8 + +[font.bold] +family = "BlockZone" +style = "Regular" + +[font.bold_italic] +family = "BlockZone" +style = "Regular" + +[font.italic] +family = "BlockZone" +style = "Regular" + +[font.normal] +family = "BlockZone" +style = "Regular" + +[[keyboard.bindings]] +action = "IncreaseFontSize" +key = "Equals" +mods = "Control" + +[[keyboard.bindings]] +action = "DecreaseFontSize" +key = "Minus" +mods = "Control" + +[[keyboard.bindings]] +action = "ResetFontSize" +key = "Key0" +mods = "Control" + +[[keyboard.bindings]] +action = "ScrollPageUp" +key = "PageUp" +mods = "Control" + +[[keyboard.bindings]] +action = "ScrollPageDown" +key = "PageDown" +mods = "Control" + +[[keyboard.bindings]] +action = "ScrollToBottom" +key = "End" +mods = "Control" + +[selection] +save_to_clipboard = true + +[shell] +args = ["new-session"] +program = "/usr/bin/tmux" diff --git a/bash/.bash_aliases b/bash/.bash_aliases new file mode 100644 index 0000000..48b2e5d --- /dev/null +++ b/bash/.bash_aliases @@ -0,0 +1,51 @@ +#!/bin/sh +# .bash_aliases - developed by acidvegas (https://git.acid.vegas/void) + +# colors +alias diff='diff --color=auto' +alias dmesg='dmesg --color=auto' +alias dir='dir --color=auto' +alias egrep='egrep --color=auto' +alias grep='grep --color=auto' +alias fgrep='fgrep --color=auto' +alias ip='ip -color=auto' +alias ls='ls --color=auto' +alias ncdu='ncdu --color dark -rr' +alias tree='tree -C' +alias vdir='vdir --color=auto' + +# rewrites +alias cp='cp -i' +alias exa='exa -aghl --git' +alias mv='mv -i' +alias pip='pip3' +alias progress='progress -m' +alias python='python3' +alias vlock='vlock -a' +alias wget='wget -q --show-progress' + +# git +alias gitfix='git push -u origin HEAD' +alias rmcommits="git checkout --orphan latest_branch && git add -A && git commit -S -am \"Initial commit\" && git branch -D master && git branch -m master && git push -f origin master" +alias nrmcommits="git checkout --orphan latest_branch && git add -A && git commit -S -am \"Initial commit\" && git branch -D main && git branch -m main && git push -f origin main" + +# random +alias ..="cd ../" +alias dropkey="dropbearkey -y -f .dropbear/key | head -n 2 | tail -n 1" +alias dump='setterm -dump 1 -file screen.dump' +alias newnym='echo -e "AUTHENTICATE \"CHANGEME\"\r\nSIGNAL NEWNYM\r\nQUIT" | nc 127.0.0.1 9051' +alias mkgz='tar -cvzf' +alias myip='curl 4.icanhazip.com && curl 6.icanhazip.com' +alias pubkey='ssh-keygen -y -f ~/.ssh/key' +alias pydebug='python -m trace -t' +alias torch='curl -s https://check.torproject.org | grep "Congratulations"' +alias y2m='youtube-dl --extract-audio --audio-format mp3 --audio-quality 0 -o "%(title)s.%(ext)s" --no-cache-dir --no-call-home' +alias up='sudo xbps install -Su && sudo xbps-install -u xbps && sudo xbps-remove -O' # What is this last command + +# scripts +alias dbc='~/.scripts/dbc' +alias gitremote='~/.scripts/gitremote' +alias irc2ansi='python3 ~/.scripts/irc2ansi.py' +alias mutag='~/.scripts/mutag' +alias pass='~/.scripts/pass' +alias shotz='~/.scripts/shotz' diff --git a/bash/.bash_fun b/bash/.bash_fun new file mode 100644 index 0000000..a89b756 --- /dev/null +++ b/bash/.bash_fun @@ -0,0 +1,51 @@ +#!/bin/sh +# .bash_fun - developed by acidvegas (https://git.acid.vegas/void) + +alias ansi='python3 ~/.scripts/irc2ansi.py ~/dev/git/ircart/ircart/ircart/ansi' +alias ascii='python3 ~/.scripts/irc2ansi.py ~/dev/git/ircart/ircart/ircart' +alias bomber='sh $HOME/.scripts/bomber' +alias busy="cat /dev/urandom | hexdump -C | grep 'ca fe'" +alias cmatrix='cmatrix -ab -u 1 -C magenta -s' +alias crypto="curl rate.sx" +alias donut="curl ascii.live/donut" +alias fireworks='confetty fireworks' +alias lavat='lavat -c magenta -s 10 -r 1 -R 1 -k cyan -b 20' +alias mapscii='telnet mapscii.me' +alias rmatrix='cmatrix -ab -u 1 -C red' +alias pipes='sh $HOME/.scripts/pipes' +alias pokemon='curl pkmn.li' +alias starwars='telnet towel.blinkenlights.nl' +alias wh='curl wttr.in' + +scene() { + for x in $(curl -L -k -s http://www.textfiles.com/artscene/ansi/bbs/ | tr ' ' '\n' | grep HREF | tr '"' ' ' | awk '{print $2}' | grep -P "(ans|vt)" | grep -v ".png" | grep "." | shuf); do + curl -L -k -s http://www.textfiles.com/artscene/ansi/bbs/$x | iconv -f 437 -t utf-8 | pv -q -L 600 + done +} + +# Some of the commands below are from package installs or custom builds +fun() { + echo "COMMAND | DESCRIPTION" + echo "------------- | -----------" + echo "asciiquarium | Terminal-based aquarium" + echo "ansi | Play ANSI art in your terminal" + echo "ascii | Play ASCII art in your terminal" + echo "bomber | Bomberman in your terminal" + echo "busy | Make your terminal busy" + echo "confetty | Confetti in your terminal" + echo "cmatrix | Matrix-style animation" + echo "crypto | Show cryptocurrency rates" + echo "donut | Spinning donut" + echo "dvd | Bouncing DVD logo" + echo "fire | Fire animation" + echo "fireworks | Fireworks in your terminal" + echo "lavat | Lava lamp style animation" + echo "mapscii | Maps in your terminal" + echo "pipes | Pipes in your terminal" + echo "pokemon | Random Pokémon" + echo "scene | Play ANSI scene art in your terminal" + echo "starwars | Watch Star Wars in your terminal" + echo "tty-solitaire | Play solitaire in your terminal" + echo "wh | Weather in your terminal" + echo "wipe | Clear your terminal in style" +} \ No newline at end of file diff --git a/bash/.bash_functions b/bash/.bash_functions new file mode 100644 index 0000000..fab6559 --- /dev/null +++ b/bash/.bash_functions @@ -0,0 +1,145 @@ +#!/bin/sh +# .bash_functions - developed by acidvegas (https://git.acid.vegas/void) + +cheat() { + curl cht.sh/$1 +} + +color() { + for color in {0..255}; do + printf "\e[48;5;%sm %3s \e[0m" $color $color + if [ $((($color + 1) % 6)) == 4 ]; then + echo + fi + done +} + +ctainr() { + NAME=$1 + lxc storage create $NAME-pool dir #Add "source=/path/to/storage" to use a different directory + lxc launch images:debian/12 $NAME-container -s $NAME-pool + sleep 10 # Delay to allow the container to start and get an IP address from the DHCP server + CONTAINER_IP=$(lxc list | grep $NAME-container | awk '{print $6}') + lxc config device override $NAME-container eth0 + lxc config device set $NAME-container eth0 ipv4.address $CONTAINER_IP + lxc config set $NAME-container boot.autostart true + lxc exec $NAME-container -- apt update -y + lxc exec $NAME-container -- apt upgrade -y + lxc exec $NAME-container -- apt install unattended-upgrades -y + lxc exec $NAME-container -- useradd -m -s /bin/bash agent + lxc exec $NAME-container -- journalctl --vacuum-time=1d + lxc exec $NAME-container -- sh -c 'printf "[Journal]\nStorage=volatile\nSplitMode=none\nRuntimeMaxUse=500K\n" > /etc/systemd/journald.conf' + lxc exec $NAME-container -- systemctl restart systemd-journald + echo "The $NAME container has been created and is available at $CONTAINER_IP" + echo "" + echo "Forward ports to the container using the following command:" + echo " lxc config device add $NAME-container $NAME-PORT_NAME proxy listen=tcp:[0.0.0.0]:HOST_PORT connect=tcp:[$CONTAINER_IP]:CONTAINER_PORT" + echo "" + echo "Tap in to your container with the following command:" + echo " lxc exec $NAME-container -- bash" +} + +extract() { + if [ ! -z "$1" ]; then + if [ -f $1 ]; then + 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 ;; + *) echo "$1 - unknown archive format" ;; + esac + else + echo "$1 - file does not exist" + fi + fi +} + +gcp() { + git add . + git commit -S -m "$*" + git push +} + +hf() { + curl -F file=@$1 https://hardfiles.org/ # yeah thats right motherfucker, real bay shit, for real bay motherfuckers. +} + +iso2usb() { + sudo dd bs=4M if=$1 of=$2 status=progress + sudo /bin/sync +} + +keys() { + echo "Ctrl + a move to the beginning of line." + echo "Ctrl + d if you've type something, Ctrl + d deletes the character under the cursor, else, it escapes the current shell." + echo "Ctrl + e move to the end of line." + echo "Ctrl + k delete all text from the cursor to the end of line." + echo "Ctrl + l CLEAR" + echo "Ctrl + n DOWN" + echo "Ctrl + p UP" + echo "Ctrl + q to resume output to terminal after Ctrl + s." + echo "Ctrl + r begins a backward search through command history.(keep pressing Ctrl + r to move backward)" + echo "Ctrl + s to stop output to terminal." + echo "Ctrl + t transpose the character before the cursor with the one under the cursor, press Esc + t to transposes the two words before the cursor." + echo "Ctrl + u cut the line before the cursor; then Ctrl + y paste it" + echo "Ctrl + w cut the word before the cursor; then Ctrl + y paste it" + echo "Ctrl + x + backspace delete all text from the beginning of line to the cursor." + echo "Ctrl + x + Ctrl + e launch editor defined by \$EDITOR to input your command. Useful for multi-line commands." + echo "Ctrl + z stop current running process and keep it in background. You can use \`fg\` to continue the process in the foreground, or \`bg\` to continue the process in the background." + echo "Ctrl + _ UNDO" +} + +mntusb() { + sudo mount $1 /mnt -o uid=$(id -u),gid=$(id -g) +} + +repo() { + if [ ! -z "$1" ]; then + for d in $(find $HOME/dev/git -type d -name mirrors -prune -o -type d -name .git -print); do + r=$(basename $(dirname $d)) + if [ $1 = $r ]; then + cd $d + fi + done + fi +} + +qr() { + curl qrenco.de/$1 +} + +rnd() { + cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w $1 | head -n 1 +} + +backup() { + DATA="dev dl doc media .gnupg .ssh .bogoya" + DEST=backup/main + for d in $DATA; do + rsync -avzh --progress --delete $HOME/$d blackbox:$DEST + done +} + +title() { + echo -ne "\033]0;$1\007" +} + +updater() { + xbps-install -Su + xbps-install -u xbps + xbps-install -Su + vkpurge rm all + pdtm -ua + +} diff --git a/bash/.bash_recon b/bash/.bash_recon new file mode 100644 index 0000000..3235293 --- /dev/null +++ b/bash/.bash_recon @@ -0,0 +1,59 @@ +#!/bin/sh +# .bash_recon - developed by acidvegas (https://git.acid.vegas/void) + +asn2ranges() { + local cache_file="/tmp/.bgp_tools_table_cache" + local current_time=$(date +%s) + local update_interval=$((2 * 60 * 60)) # 2 hours in seconds + if [ -f "$cache_file" ]; then + local last_update=$(date -r "$cache_file" +%s) + local time_diff=$(($current_time - $last_update)) + if [ $time_diff -gt $update_interval ]; then + curl -A 'acmeco bgp.tools - acid.vegas@acid.vegas' -s https://bgp.tools/table.txt -o "$cache_file" + fi + else + curl -A 'acmeco bgp.tools - acid.vegas@acid.vegas' -s https://bgp.tools/table.txt -o "$cache_file" + fi + awk -v asn="$1" '$NF == asn {print $1}' "$cache_file" +} + +asn2search() { + local search_string="$1" + local cache_file="/tmp/.bgp_tools_asn_cache" + local current_time=$(date +%s) + local update_interval=$((24 * 60 * 60)) # 24 hours in seconds + if [ -f "$cache_file" ]; then + local last_update=$(date -r "$cache_file" +%s) + local time_diff=$(($current_time - $last_update)) + if [ $time_diff -gt $update_interval ]; then + curl -A 'acmeco bgp.tools - acid.vegas@acid.vegas' -s https://bgp.tools/asns.csv -o "$cache_file" + fi + else + curl -A 'acmeco bgp.tools - acid.vegas@acid.vegas' -s https://bgp.tools/asns.csv -o "$cache_file" + fi + grep -i "$search_string" "$cache_file" +} + +atlastream() { + curl -s "https://atlas-stream.ripe.net/stream/?streamType=result&msm=1001" # FOR COWBOYS ONLY +} + +bgplookup() { + if [ -f "$1" ]; then + { echo "begin"; echo "verbose"; echo "count"; cat "$1"; echo "end"; } | nc bgp.tools 43 + else + whois -h bgp.tools " -v $1" + fi +} + +bgpstream() { + curl -s "https://ris-live.ripe.net/v1/stream/?format=json&client=hacktheplnet" # FOR COWBOYS ONLY +} + +crtsh() { + curl -s "https://crt.sh/?q=$1&output=json" | jq -r '.[].name_value' | sort | uniq +} + +shidb() { + curl https://internetdb.shodan.io/$1 +} diff --git a/bash/.bashrc b/bash/.bashrc new file mode 100644 index 0000000..a110b37 --- /dev/null +++ b/bash/.bashrc @@ -0,0 +1,11 @@ +[[ $- != *i* ]] && return + +export LC_CTYPE=en_US.UTF-8 +export LC_ALL=en_US.UTF-8 +export GPG_TTY=$(tty) +export PATH=$HOME/.local/bin:$PATH + +[ -f $HOME/.bash_aliases ] && source $HOME/.bash_aliases +[ -f $HOME/.bash_functions ] && source $HOME/.bash_functions + +export PS1="\e[38;5;237m\T\e[0m \e[38;5;41m\u@\h\e[0m \e[38;5;69m\w \e[0m: " diff --git a/cmus/autosave b/cmus/autosave new file mode 100644 index 0000000..5d88837 --- /dev/null +++ b/cmus/autosave @@ -0,0 +1,59 @@ +set aaa_mode=artist +set altformat_current= %f +set altformat_title=cmus: %f +set altformat_trackwin= %f +set auto_expand_albums_follow=false +set auto_expand_albums_search=false +set auto_expand_albums_selcur=false +set color_separator=gray +set color_statusline_bg=black +set color_statusline_fg=white +set color_titleline_bg=black +set color_trackwin_album_attr=default +set color_trackwin_album_fg=black +set color_win_bg=black +set color_win_cur=lightyellow +set color_win_cur_sel_bg=red +set color_win_cur_sel_fg=black +set color_win_fg=default +set color_win_inactive_cur_sel_fg=black +set color_win_sel_bg=gray +set color_win_sel_fg=black +set color_win_title_bg=default +set dsp.alsa.device=default +set dsp.jack.resampling_quality=2 +set format_current= %t +set format_statusline= %{status} %{?show_playback_position?%{position} %{?duration?/ %{duration} }?%{?duration?%{duration} }}%=%{?volume>=0?vol: %{volume}}%% +set format_title=cmus: %a - %t +set format_trackwin= %t +set format_trackwin_album= +set format_treewin= +set format_treewin_artist=%a +set lib_sort=artist title filename +set mixer.alsa.channel=PCM +set mixer.alsa.device=hw:1 +set mixer.oss.channel=PCM +set mixer.pulse.restore_volume=1 +set output_plugin=alsa +set repeat=true +set set_term_title=true +set smart_artist_sort=false +set softvol=true +set softvol_state=0 0 +set start_view=tree +set status_display_program=$HOME/.scripts/cmus-now +bind common , vol -10% +bind common . vol +10% +bind common down win-down +bind common enter win-activate +bind common left seek -5 +bind common p player-pause +bind common page_down win-page-down +bind common page_up win-page-up +bind common q quit -i +bind common right seek +5 +bind common s view settings +bind common tab win-next +bind common u shell cmus-remote -C clear && cmus-remote -C "add ~/music" && cmus-remote -C "update-cache -f" +bind common up win-up +fset mp3=filename="*.mp3" \ No newline at end of file diff --git a/dunst/dunstrc b/dunst/dunstrc new file mode 100644 index 0000000..97e3ce9 --- /dev/null +++ b/dunst/dunstrc @@ -0,0 +1,29 @@ +[global] + geometry = "1350x1+210+0" + separator_height = 0 + padding = 1 + font = Ohsnap 8 + format = "%s" + alignment = center + ignore_newline = true + show_indicators = false + history_length = 10 + always_run_script = false + mouse_left_click = close_current + mouse_middle_click = none + mouse_right_click = close_all + +[urgency_low] + background = "#000000" + foreground = "#ffffff" + timeout = 10 + +[urgency_normal] + background = "#000000" + foreground = "#ffffff" + timeout = 10 + +[urgency_critical] + background = "#000000" + foreground = "#ffffff" + timeout = 0 \ No newline at end of file diff --git a/dwm/config.h b/dwm/config.h new file mode 100644 index 0000000..ca5e1b3 --- /dev/null +++ b/dwm/config.h @@ -0,0 +1,80 @@ +#define XF86AudioMute 0x1008ff12 +#define XF86AudioLowerVolume 0x1008ff11 +#define XF86AudioRaiseVolume 0x1008ff13 +#define XF86AudioPlay 0x1008ff14 +#define XF86MonBrightnessDown 0x1008ff03 +#define XF86MonBrightnessUp 0x1008ff02 + +static const unsigned int borderpx = 0; +static const unsigned int snap = 32; +static const int showbar = 0; +static const int topbar = 1; +static const float mfact = 0.55; +static const int nmaster = 1; +static const int resizehints = 0; +static const int lockfullscreen = 1; +static const Layout layouts[] = { { "", tile } }; +static const Rule rules[] = { { NULL, NULL, NULL, 0, False, -1 } }; +static const char *tags[] = { "chat", "dev", "media", "work", "www", "other" }; +static const char *fonts[] = { "Misc Ohsnap.Icons:style=Regular:size=11" }; +static const char dmenufont[] = "Misc Ohsnap.Icons:style=Regular:size=11"; +static const char *colors[][3] = { + [SchemeNorm] = { "#FFFFFF", "#000000", "#444444" }, + [SchemeSel] = { "#00D787", "#000000", "#00D787" }, +}; + +#define MODKEY Mod4Mask +#define TAGKEYS(KEY,TAG) \ + { MODKEY, KEY, view, {.ui = 1 << TAG} }, \ + { MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \ + { MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \ + { MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} }, + +#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } + +static char dmenumon[2] = "0"; // TODO: Do we really need this? +static const char *dmenucmd[] = { "dmenu_run", "-m", "0", "-fn", dmenufont, "-nb", "#000000", "-nf", "#FFFFFF", "-sb", "#000000", "-sf", "#00D787", NULL }; +static const char *termcmd[] = { "alacritty", NULL }; +static const char *volume_toggle[] = { "pactl", "set-sink-mute", "0", "toggle", NULL }; +static const char *volume_down[] = { "amixer", "-q", "set", "Master", "10-", NULL }; +static const char *volume_up[] = { "amixer", "-q", "set", "Master", "10+", NULL }; +static const char *music_toggle[] = { "cmus-remote", "-u", NULL }; +static const char *backlight_down[] = { "xbacklight", "-dec", "10", NULL }; +static const char *backlight_up[] = { "xbacklight", "-inc", "10", NULL }; + +static Key keys[] = { + { MODKEY, XK_Return, spawn, {.v = termcmd } }, + { MODKEY, XK_Down, incnmaster, {.i = +1 } }, + { MODKEY, XK_Up, incnmaster, {.i = -1 } }, + { MODKEY, XK_Left, setmfact, {.f = -0.05} }, + { MODKEY, XK_Right, setmfact, {.f = +0.05} }, + { MODKEY, XK_h, togglebar, {0} }, + { MODKEY, XK_k, killclient, {0} }, + { MODKEY, XK_q, quit, {0} }, + { MODKEY, XK_f, setlayout, {.v = &layouts[0] } }, + { MODKEY, XK_r, spawn, {.v = dmenucmd } }, + { 0, XF86AudioMute, spawn, {.v = volume_toggle } }, + { 0, XF86AudioLowerVolume, spawn, {.v = volume_down } }, + { 0, XF86AudioRaiseVolume, spawn, {.v = volume_up } }, + { 0, XF86AudioPlay, spawn, {.v = music_toggle } }, + { 0, XF86MonBrightnessDown, spawn, {.v = backlight_down } }, + { 0, XF86MonBrightnessUp, spawn, {.v = backlight_up } }, + { 0, XK_Print, spawn, SHCMD("~/.scripts/shot.sh") }, + TAGKEYS( XK_1, 0) + TAGKEYS( XK_2, 1) + TAGKEYS( XK_3, 2) + TAGKEYS( XK_4, 3) + TAGKEYS( XK_5, 4) + TAGKEYS( XK_6, 5) + TAGKEYS( XK_7, 6) + TAGKEYS( XK_8, 7) + TAGKEYS( XK_9, 8) +}; + +static Button buttons[] = { + { ClkWinTitle, 0, Button2, zoom, {0} }, + { ClkClientWin, MODKEY, Button1, movemouse, {0} }, + { ClkClientWin, MODKEY, Button3, resizemouse, {0} }, + { ClkTagBar, 0, Button1, view, {0} }, + { ClkTagBar, MODKEY, Button1, tag, {0} }, +}; diff --git a/dwm/patch_nosquares.diff b/dwm/patch_nosquares.diff new file mode 100644 index 0000000..a59ec39 --- /dev/null +++ b/dwm/patch_nosquares.diff @@ -0,0 +1,13 @@ +--- a/drw.c 2019-03-09 23:41:26.989923828 -0500 ++++ b/drw.c 2019-03-09 23:41:35.459923639 -0500 +@@ -241,10 +241,6 @@ + if (!drw || !drw->scheme) + return; + XSetForeground(drw->dpy, drw->gc, invert ? drw->scheme[ColBg].pixel : drw->scheme[ColFg].pixel); +- if (filled) +- XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); +- else +- XDrawRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w - 1, h - 1); + } + + int diff --git a/dwm/patch_notitles.diff b/dwm/patch_notitles.diff new file mode 100644 index 0000000..b1e8368 --- /dev/null +++ b/dwm/patch_notitles.diff @@ -0,0 +1,10 @@ +--- a/dwm.c 2019-03-09 23:32:26.479935899 -0500 ++++ b/dwm.c 2019-03-09 23:32:36.269935680 -0500 +@@ -731,7 +731,6 @@ + if ((w = m->ww - sw - x) > bh) { + if (m->sel) { + drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]); +- drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0); + if (m->sel->isfloating) + drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0); + } else { diff --git a/enterthevoid b/enterthevoid new file mode 100755 index 0000000..753856c --- /dev/null +++ b/enterthevoid @@ -0,0 +1,223 @@ +#!/bin/bash +# enter the void - developed by acidvegas (https://git.acid.vegas/void) + +set -xev + +# Configuration +ARCH=x86_64 # x86_64 or x86_64-musl +CPU=intel # amd or intel +DRIVE=/dev/sdb # can be a single drive or an array if using raidz with zfs +HOSTNAME=blackhole +SWAP_SIZE=4 # In GB (set to 0 to disable) +ROOT_FS=btrfs # btrfs or ext4 +TIMEZONE=America/New_York +USERNAME=acidvegas +WIFI_SSID= # Leave blank if you don't want to use wifi +WIFI_PASS= +WIFI_DEV=wlan0 + +if [ -d /sys/firmware/efi ]; then + BOOT_OPTION=UEFI +else + BOOT_OPTION=BIOS +fi + + +check_config() { + if [ ! $ARCH = "x86_64" ] && [ ! $ARCH = "x86_64-musl" ]; then + printf "invalid ARCH\n" && exit 1 + elif [ ! $CPU = "amd" ] && [ ! $CPU = "intel" ]; then + printf "invalid CPU\n" && exit 1 + elif [ ! -b $DRIVE ]; then + printf "invalid DRIVE\n" && exit 1 + elif [ -z $HOSTNAME ]; then + printf "invalid HOSTNAME\n" && exit 1 + elif ! [ "$SWAP_SIZE" -eq "$SWAP_SIZE" ] 2>/dev/null; then + printf "invalid SWAP_SIZE\n" && exit 1 + elif [ ! $ROOT_FS = "btrfs" ] && [ ! $ROOT_FS = "ext4" ] && [ ! $ROOT_FS = "zfs" ]; then + printf "invalid ROOT_FS\n" && exit 1 + elif [ ! -f /usr/share/zoneinfo/$TIMEZONE ]; then + printf "invalid TIMEZONE\n" && exit 1 + elif [ -z $USERNAME ]; then + printf "invalid USERNAME\n" && exit 1 + elif [ ! -z $WIFI_SSID ]; then + if [ -z $(ip addr | grep '^[0-9]:' | awk '{print $2}' | tr -d ':' | grep $WIFI_DEV) ]; then + printf "invalid WIFI_DEV\n" && exit 1 + fi + fi +} + + +setup_network() { + if [ ! -z "$WIFI_SSID" ]; then + if rfkill list wifi | grep -q 'Soft blocked: yes\|Hard blocked: yes'; then + printf "Wifi is blocked, attempting to unblock... (make sure to handle this after reboot)\n" + rfkill unblock wifi + fi + wpa_passphrase "$WIFI_SSID" "$WIFI_PASS" | wpa_supplicant -i $WIFI_DEV -c /dev/stdin + fi +} + + +setup_partition() { + xbps-install -u xbps + xbps-install -Su + xbps-install parted + + wipefs -a $DRIVE + if [ $BOOT_OPTION = "UEFI" ]; then + parted $DRIVE --script mklabel gpt + parted $DRIVE --script mkpart primary fat32 1MiB 513MiB + parted $DRIVE --script set 1 esp on + parted $DRIVE --script mkpart primary $ROOT_FS 513MiB 100% + partprobe $DRIVE + mkfs.vfat ${DRIVE}1 + if [ $ROOT_FS = "btrfs" ]; then + mkfs.btrfs -f ${DRIVE}2 + mount ${DRIVE}2 /mnt + btrfs subvolume create /mnt/@ + btrfs subvolume create /mnt/@home + btrfs subvolume create /mnt/@snapshots + umount /mnt + mount -o subvol=@ ${DRIVE}2 /mnt + mkdir -p /mnt/{home,snapshots} + mount -o subvol=@home ${DRIVE}2 /mnt/home + mount -o subvol=@snapshots ${DRIVE}2 /mnt/snapshots + elif [ $ROOT_FS = "ext4" ]; then + mkfs.ext4 ${DRIVE}2 + mount ${DRIVE}2 /mnt + fi + mkdir -p /mnt/boot/efi + mount ${DRIVE}1 /mnt/boot/efi + elif [ $BOOT_OPTION = "BIOS" ]; then + parted $DRIVE --script mklabel msdos + parted $DRIVE --script mkpart primary $ROOT_FS 1MiB 100% + parted $DRIVE --script set 1 boot on + partprobe $DRIVE + if [ $ROOT_FS = "btrfs" ]; then + mkfs.btrfs -f ${DRIVE}1 + mount ${DRIVE}1 /mnt + btrfs subvolume create /mnt/@ + btrfs subvolume create /mnt/@home + btrfs subvolume create /mnt/@snapshots + umount /mnt + mount -o subvol=@ ${DRIVE}1 /mnt + mkdir -p /mnt/{home,snapshots} + mount -o subvol=@home ${DRIVE}1 /mnt/home + mount -o subvol=@snapshots ${DRIVE}1 /mnt/snapshots + elif [ $ROOT_FS = "ext4" ]; then + mkfs.ext4 ${DRIVE}1 + mount ${DRIVE}1 /mnt + fi + fi +} + + +setup_install() { + REPO=https://repo-default.voidlinux.org/current + if [ $ARCH = 'x86_64-musl' ]; then + REPO=$REPO/musl + fi + + mkdir -p /mnt/var/db/xbps/keys + cp /var/db/xbps/keys/* /mnt/var/db/xbps/keys/ + + XBPS_ARCH=$ARCH xbps-install -S -r /mnt -R "$REPO" base-system linux + + printf "entering chroot...remember to run setup_chroot() inside the chroot!\n" + xchroot /mnt /bin/bash +} + + +setup_chroot() { + passwd + xbps-install -u xbps + xbps-install -Su + + if [ $CPU = "intel" ]; then + xbps-install void-repo-nonfree + xbps-install -Su + xbps-install intel-ucode + ln -sf /etc/sv/intel-ucode /etc/runit/runsvdir/default/ + elif [ $CPU = "amd" ]; then + xbps-install linux-firmware-amd + fi + + useradd -m -s /bin/bash $USERNAME && passwd $USERNAME && gpasswd -a $USERNAME wheel + ln -sf /usr/share/zoneinfo/$TIMEZONE /etc/localtime + ln -sf /etc/sv/dhcpcd /etc/runit/runsvdir/default/ + hwclock --systohc + printf "$HOSTNAME\n" > /etc/hostname + printf "HOSTNAME=\"$HOSTNAME\"\nHARDWARECLOCK=\"UTC\"\nTIMEZONE=\"$TIMEZONE\"\nKEYMAP=us\n" > /etc/rc.conf + + if [ $ARCH = 'x86_64' ]; then + printf "en_US.UTF-8 UTF-8\n" > /etc/default/libc-locales + printf "LANG=en_US.UTF-8\n" > /etc/locale.conf + xbps-reconfigure -f glibc-locales + fi + + if [ $BOOT_OPTION = "UEFI" ]; then + if [ $ROOT_FS = "btrfs" ]; then + printf "UUID=$(blkid -s UUID -o value ${DRIVE}2) / $ROOT_FS defaults,noatime,subvol=@ 0 1\n" + printf "UUID=$(blkid -s UUID -o value ${DRIVE}2) /home $ROOT_FS defaults,subvol=@home 0 1\n" + printf "UUID=$(blkid -s UUID -o value ${DRIVE}2) /snapshots $ROOT_FS defaults,subvol=@snapshots 0 1\n" + elif [ $ROOT_FS = "ext4" ]; then + printf "UUID=$(blkid -s UUID -o value ${DRIVE}2) / $ROOT_FS defaults,noatime 0 1\n" + fi + printf "UUID=$(blkid -s UUID -o value ${DRIVE}1) /boot/efi vfat defaults,noatime 0 1\n" + elif [ $BOOT_OPTION = "BIOS" ]; then + if [ $ROOT_FS = "btrfs" ]; then + printf "UUID=$(blkid -s UUID -o value ${DRIVE}1) / btrfs defaults,noatime,subvol=@ 0 1\n" + printf "UUID=$(blkid -s UUID -o value ${DRIVE}1) /home btrfs defaults,subvol=@home 0 1\n" + printf "UUID=$(blkid -s UUID -o value ${DRIVE}1) /snapshots btrfs defaults,subvol=@snapshots 0 1\n" + elif [ $ROOT_FS = "ext4" ]; then + printf "UUID=$(blkid -s UUID -o value ${DRIVE}1) / $ROOT_FS defaults,noatime 0 1\n" + fi + fi > /etc/fstab + + printf "tmpfs /tmp tmpfs defaults,nosuid,nodev 0 0\n" >> /etc/fstab + + if [ $SWAP_SIZE -gt 0 ]; then + touch /swapfile + if [ $ROOT_FS = "btrfs" ]; then + chattr +C /swapfile + fi + dd if=/dev/zero of=/swapfile bs=1M count=${SWAP_SIZE}k status=progress + chmod 0600 /swapfile + mkswap /swapfile + swapon /swapfile + printf "/swapfile none swap sw 0 0\n" >> /etc/fstab + fi + + if [ $BOOT_OPTION = "UEFI" ]; then + xbps-install gummiboot + gummiboot install + nano /boot/loader/void-options.conf + xbps-reconfigure -f linux$(unamer -r) + # Optional, copy the EFI /boot/efi/EFI/boot/bootx64.efi to for tricking compatability + elif [ $BOOT_OPTION = "BIOS" ]; then + xbps-install grub + grub-install /dev/$DRIVE + fi + + xbps-reconfigure -fa + exit +} + + + +if [ "$#" -ne 1 ]; then + printf "usage: $0 [install|partition|chroot|final]\n" + exit 1 +fi + +check_config + +case "$1" in + network) setup_network ;; + partition) setup_partition ;; + install) setup_install ;; + chroot) setup_chroot ;; + final) umount -R /mnt; reboot ;; + *) printf "usage: $0 [install|partition|chroot|final]\n"; exit 1 ;; +esac diff --git a/enterthezoid b/enterthezoid new file mode 100755 index 0000000..2be9689 --- /dev/null +++ b/enterthezoid @@ -0,0 +1,145 @@ +#!/bin/bash +# enter the zoid (zfs on root with zraid) - developed by acidvegas (https://git.acid.vegas/void) +# reference: https://docs.zfsbootmenu.org/en/v2.2.x/guides/void-linux/uefi.html +# https://docs.zfsbootmenu.org/en/v2.3.x/guides/void-linux/uefi.html (do we need to make any updates?) + +set -xev + +# Configuration +HOSTNAME=blackhole +BOOT_DRIVE=/dev/sde # Use the internal USB drive for the boot partition +POOL_DRIVES="/dev/sda /dev/sdb /dev/sdc /dev/sdd" # Verify these with lsblk before running + + +convert_pool_drives() { + local devices=$1 + local by_id_drives="" + + for dev in $devices; do + local device_by_id_path="" + for id in /dev/disk/by-id/*; do + if [ "$(readlink -f "$id")" = "$(readlink -f "$dev")" ] && ! [[ $id =~ .*-part[0-9]+ ]]; then + device_by_id_path="$id" + break + fi + done + by_id_drives+="${device_by_id_path} " + done + + echo $by_id_drives +} + + +setup_zfs() { + source /etc/os-release + export ID + zgenhostid -f 0x00bab10c + + wipefs -a $BOOT_DRIVE + sgdisk --zap-all $BOOT_DRIVE + sgdisk -n "1:1m:+1g" -t "1:ef00" "$BOOT_DRIVE" + + for d in $POOL_DRIVES; do + wipefs -a $d + sgdisk --zap-all $d + sgdisk -n "1:0:-10m" -t "1:bf00" "$d" + if zdb -l "$d" &> /dev/null; then + zpool labelclear -f "$d" + fi + done + + POOL_DRIVES=$(convert_pool_drives "$POOL_DRIVES") + zpool create -f -o ashift=12 -O compression=lz4 -O acltype=posixacl -O xattr=sa -O relatime=on -o autotrim=on -o compatibility=openzfs-2.1-linux -m none zroot raidz $POOL_DRIVES + + zfs create -o mountpoint=none zroot/ROOT + zfs create -o mountpoint=/ -o canmount=noauto zroot/ROOT/$ID + zfs create -o mountpoint=/home zroot/home + zpool set bootfs=zroot/ROOT/$ID zroot + + zpool export zroot + zpool import -N -R /mnt zroot + zfs mount zroot/ROOT/$ID + zfs mount zroot/home + + udevadm trigger + + XBPS_ARCH=x86_64 xbps-install -S -R https://mirrors.servercentral.com/voidlinux/current -r /mnt base-system + cp /etc/hostid /mnt/etc + + xchroot /mnt +} + + +setup_chroot() { + passwd + + xbps-install -Suy + xbps-install -y void-repo-nonfree + xbps-install -Suy + xbps-install -y intel-ucode + ln -sf /etc/sv/intel-ucode /etc/runit/runsvdir/default/ + + ln -sf /usr/share/zoneinfo/America/New_York /etc/localtime + ln -sf /etc/sv/dhcpcd /etc/runit/runsvdir/default/ + hwclock --systohc + printf "$HOSTNAME\n" > /etc/hostname + printf "HOSTNAME=\"$HOSTNAME\"\nHARDWARECLOCK=\"UTC\"\nTIMEZONE=\"America/New_York\"\nKEYMAP=us\n" > /etc/rc.conf + + printf "en_US.UTF-8 UTF-8\nen_US ISO-8859-1\n" > /etc/default/libc-locales + xbps-reconfigure -f glibc-locales + + printf "nofsck=\"yes\"\nadd_dracutmodules+=\" zfs \"\nomit_dracutmodules+=\" btrfs \"\n" > /etc/dracut.conf.d/zol.conf + + xbps-install -y zfs + zfs set org.zfsbootmenu:commandline="quiet loglevel=4" zroot/ROOT + + mkfs.vfat -F32 ${BOOT_DRIVE}1 + BOOT_UUID=$(blkid -s UUID -o value ${BOOT_DRIVE}1) + echo "UUID=$BOOT_UUID /boot/efi vfat defaults 0 0" > /etc/fstab + mkdir -p /boot/efi + mount /boot/efi + + # Everything below this line is a "hacky" solution to a problem I was having with the zfsbootmenu package + # https://github.com/zbm-dev/zfsbootmenu/issues/293 + # The developers of zfsbootmenu are rude and unhelpful, so I had to figure this out on my own: + # 12:39 -- Mode #zfsbootmenu [+b *!*@big.dick.acid.vegas] by zdykstra + # 12:39 ◀▬▬ zdykstra has kicked acidvegas (acidvegas) + # 12:39 -- #zfsbootmenu: Cannot join channel (+b) - you are banned + + xbps-install -S zfsbootmenu gummiboot-efistub yq + yq -iy '.Global.ManageImages=true | .Global.BootMountPoint="/boot/efi" | .Components.Enabled=false | .EFI.ImageDir="/boot/efi/EFI/zbm" | .EFI.Versions=false | .EFI.Enabled=true | .Kernel.CommandLine="quiet loglevel=0"' /etc/zfsbootmenu/config.yaml + generate-zbm + + xbps-install -y refind + refind-install + rm /boot/refind_linux.conf + printf "\"Boot default\" \"quiet loglevel=0 zbm.skip\"\n\"Boot to menu\" \"quiet loglevel=0 zbm.show\"\n" > /boot/efi/EFI/ZBM/refind_linux.conf + + mkdir -p /boot/efi/EFI/BOOT + mvrefind /boot/efi/EFI/refind /boot/efi/EFI/BOOT + temp=$(mktemp -d) + wget -O $temp/latest.tar.gz https://get.zfsbootmenu.org/latest.tar.gz + tar xvf $temp/latest.tar.gz -C $temp/ + rm $temp/latest.tar.gz + mv $temp/zfs*/* /boot/efi/EFI/ZBM/ + rm /boot/efi/EFI/ZBM/vmlinuz.efi + + xbps-remove zfsbootmenu + xbps-reconfigure -fa + + exit +} + + + +if [ "$#" -ne 1 ]; then + printf "usage: $0 [zfs|chroot|final]\n" + exit 1 +fi + +case "$1" in + zfs) setup_zfs ;; + chroot) setup_chroot ;; + final) umount -n -R /mnt; zpool export zroot; reboot ;; + *) printf "usage: $0 [zfs|chroot|final]\n"; exit 1 ;; +esac \ No newline at end of file diff --git a/font/BlockZone.ttf b/font/BlockZone.ttf new file mode 100644 index 0000000000000000000000000000000000000000..0369147605d19bfd5152686495f72f24e12a71ac GIT binary patch literal 76372 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 literal 0 HcmV?d00001 diff --git a/font/ohsnap6x11r.psfu b/font/ohsnap6x11r.psfu new file mode 100644 index 0000000000000000000000000000000000000000..70fcb395937f3c480a44afe593efddaf61029492 GIT binary patch literal 3583 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 literal 0 HcmV?d00001 diff --git a/font/ohsnap7x14r.psfu b/font/ohsnap7x14r.psfu new file mode 100644 index 0000000000000000000000000000000000000000..10352e0925dc7207f0d04e1404fa11109b7236b7 GIT binary patch literal 4351 zcmZuz+m{?g8E?*+1M|S~^us>zFej(gphFN{uMD`xM#nhBs3VT|0RjXCU3GydBQ#-& z>zZhc$?mctG2kZIB#;Z_vbkSRm+MO&{1%q?bcNN>ig=u zS5-fMYV~-)7O~$Z6aIXJgY-KD2f2jf#lfN@CQWHMXAs=7^SZX1!A%|2 ziZHxo#~=_96r@rdZJFKY&_WsAavNoho`+!|W;;ceQGP$L@S%&h`kUMCEc4pkXoqEe zs9%etIVlT$oDMizG3YuS(G`ZLpfFAKME~ttn6%r;z(8VIuh0HBjJi`bOB-poqfV=} zUJ*r>q*SU_b+sak474^T&9<=9=oIWWppK-&;9wYeto7jm$H74bl}eR5q9~3PCe1aS zbfshR4Pdv$Brhb!ft7-96@Sk5Rk1z6D0IpiZFW4X0uVE^+~ZdIy<>p zX1Pa<49m_*Au-WPvMPLKE21H_(B~*fn%z#P({)bJEUkLGt=DRm?WC)Pw>=uk*0Y@A zQ9*Mk&S_n8mf|8C9nI#?(KHN21Y7O3Yuhcysk)0;(`IQ-iU?%uLq59HEPMNDw<{EH zsle~+&ylsv6_b@;@_`F=N3)i6a{uaKSobo?rq`6yE;;f()SQB_Cd4?7Sj*L_ErStH z8xb1C$*{EPX_cF%uO$`n$}Ulr819f(q1PTT%>6V8lj9uHD>;h1V9Qxis*`Cg;?Y!7 zYs$%Ep@*Yd)vAbNCNR&RbIEd&Jt^gnNNmZyTxuCfG|pP%Y^gXTsdW_bkG1W5u+K^~ zWch+X6*!tjK7V{9q!lzxVE;ZZHIW2bPRXBMKQ&?X3A2}#II9!m3xt3y0; zYZC09x6{TUrzwj+;Z!KKq$0h%;o;>iKNmmjJZxBV%19r%us}XkdwdkUOb6tfy9df zi5CSDFLJ~LmXOFz1|)}8pUa@+&qYl#qcqW1yqg-eoThQg5$zlihiZOb32|QuabJPj zQClj_MzEAYmEtp4vL)wKTXN(xXgSrgoTdjNkyGK?2KnG!^cu+LwcEUSL=7bxWtLFR zSy7D)mrBvopL3Fy?n5>{nN43rwqrCK-5snnId6wf8`x{(4g!DMFt(3I&0z1iDMaCwQg{5TC{8@OgXzU&NPiKN@%d z58}%h!dI{oUqy_E@HKoLO?(5Z@J+PvFjnJRSc7llJNPcz_#Pg?_tC)*@I(9vKgLh+ zQ~V5FJc`HgIM(6`Jc*~U4o~Cf_ywN9v-l-`g<<>}zrk-Yg6Hr&Uch?%4!_5X=;04| z2`?kTE7*W+%f?rcZ9D>Gqr33$2@Y?uA7Gzh--Bxm+~_gP3p$7S31I#bgqsl?-O0|7 zjK0afmwl3b3fH(awiokzh|Xhvl3Olg{w&fNqdy+aPBt3!jB+@ygr;wgTdIl*)okMya=>?=0kzPW28R-?6QJB|YHp2W7 zW(?*}FykzO8RjoAe}&ls^Ea5SFn@>H2D2Sz0%j6s3g&f~X_y@_Z@}z?*#+|t znB6dM!n_6ZPna2)JurJ=_QA};?1wo3a}efjn0H_f!5oG;0&^7RU6}V^j=>y%Creset' --abbrev-commit + mclone = clone --depth=1 + stats = diff --stat +[color] + diff = auto + status = auto + branch = auto + interactive = auto + ui = true + pager = true +[commit] + gpgSign = true +[core] + editor = nano + pager = delta +[diff] + colorMoved = default +[interactive] + diffFilter = delta --color-only +[merge] + conflictstyle = diff3 +[user] + signingkey = 441EB0F297E0DCF0AEF2F711EF4B922DB85DC9DE + name = acidvegas + email = acid.vegas@acid.vegas +[pull] + ff = only +[delta] + navigate = true + light = false + diff --git a/gpg/gpg.conf b/gpg/gpg.conf new file mode 100644 index 0000000..f814e29 --- /dev/null +++ b/gpg/gpg.conf @@ -0,0 +1,15 @@ +default-key 441EB0F297E0DCF0AEF2F711EF4B922DB85DC9DE +keyid-format 0xlong +keyserver-options include-revoked no-honor-keyserver-url +list-options show-uid-validity +no-comments +no-emit-version +no-greeting +utf8-strings +verify-options show-uid-validity +with-fingerprint + +personal-cipher-preferences AES256 AES192 AES CAST5 +personal-digest-preferences SHA512 SHA384 SHA256 SHA224 +cert-digest-algo SHA512 +default-preference-list SHA512 SHA384 SHA256 SHA224 AES256 AES192 AES CAST5 ZLIB BZIP2 ZIP Uncompressed \ No newline at end of file diff --git a/scripts/bomber b/scripts/bomber new file mode 100755 index 0000000..3c632ed --- /dev/null +++ b/scripts/bomber @@ -0,0 +1,99 @@ +#!/usr/bin/env bash +#by necro +e="\e[0m" +bk="\e[38;2;1;1;1m" +bl="\e[48;2;101;166;232m" +wh="\e[48;2;251;253;252m" +pi="\e[48;2;229;139;121m" +while true; do +clear +echo -e " + $bk██████████ $bk████$e + $bk████$wh ████$e$bk ██$bl ██$e + $bk██$wh ██████$bl $bk██$e + $bk██$pi $wh ██$e$bk ████$e + $bk██$pi ██ $wh ██$e + $bk██$pi ██ $wh ██$e + $bk██$pi ██ $wh ██$e + $bk██$pi $wh ██$e + $bk████$wh ██ ██$e + $bk████████$wh ████████$e + $bk██$bl ██$wh ██$bl ██$e + $bk██$bl ██$wh ██$bl ██$e + $bk██$wh ██$bl ██████$e + $bk██$bl ██$bl ██$bl ██$e + $bk████████████████$e + $bk██$wh ██$e + $bk██████████████$e + $bk██$bl ██$e + $bk████████████████$e" +sleep 0.1 +clear +echo -e " + $bk██████████ ████$e + $bk████$wh ██████$bl ██$e + $bk██$wh ██$bl ██$e + $bk██$pi $wh ████$e + $bk████$pi ██ $wh ██$e + $bk████$pi ██ $wh ██$e + $bk████$pi ██ $wh ██$e + $bk██$pi $wh ██$e + $bk████$wh ████ ██$e + $bk██$bl ████$wh ██████████$e + $bk██$bl ██$wh ██$bl ██$wh ██$e + $bk████$wh ██$bl ██$wh ██$e + $bk████$wh ████████████████$e + $bk██$bl ██████ ████$bl ██$e + $bk████$wh $bl $wh ██████$e + $bk██$bl ██$wh ████ ██$e + $bk██$bl ████████$e$bk ██$wh ██$bl ██$e + $bk████ ████$bl ██$e + $bk██$bl ██$e + $bk████$e" +sleep 0.3 +clear +echo -e " + $bk██████████ $bk████$e + $bk████$wh ████$e$bk ██$bl ██$e + $bk██$wh ██████$bl $bk██$e + $bk██$pi $wh ██$e$bk ████$e + $bk██$pi ██ $wh ██$e + $bk██$pi ██ $wh ██$e + $bk██$pi ██ $wh ██$e + $bk██$pi $wh ██$e + $bk████$wh ██ ██$e + $bk████████$wh ████████$e + $bk██$bl ██$wh ██$bl ██$e + $bk██$bl ██$wh ██$bl ██$e + $bk██$wh ██$bl ██████$e + $bk██$bl ██$bl ██$bl ██$e + $bk████████████████$e + $bk██$wh ██$e + $bk██████████████$e + $bk██$bl ██$e + $bk████████████████$e" +sleep 0.1 +clear +echo -e " + $bk██████████ ████ + $bk████$wh ████$e $bk██$bl ██$e + $bk██$wh ████$bl ██$e + $bk██$pi $wh ██████████$e + $bk██$pi ██ $wh ██$e + $bk██$pi ██ $wh ██$e + $bk██$pi ██ $wh ██$e + $bk██$pi $wh ██$e + $bk████████$wh ██████ ██$e + $bk██$bl ██████████$wh ████$e + $bk██$bl ████ ██$wh ██$e + $bk██$wh ██$bl ██$wh ████$e + $bk██$wh ██ ███████ ██$bl ██$e + $bk████$bl ██ ██$e + $bk████$bl ████$e + $bk██████$wh $bl ██████$wh ████$e + $bk██$bl ██$wh ██$e$bk ██$wh ██$bl ██$e + $bk██$bl ██$e$bk ████$bl ██$e + $bk████$e$bk ██$bl ██$e + $bk████" +sleep 0.3 +done diff --git a/scripts/cmus-now b/scripts/cmus-now new file mode 100755 index 0000000..45978b2 --- /dev/null +++ b/scripts/cmus-now @@ -0,0 +1,5 @@ +#!/bin/sh +# cmus 'now playing' notifications in dunst - developed by acidvegas (https://git.acid.vegas/void) +artist=`cmus-remote -Q | grep --text '^tag artist' | sed '/^tag artistsort/d' | awk '{gsub("tag artist ", "");print}'` +title=`cmus-remote -Q | grep --text '^tag title' | sed -e 's/tag title //' | awk '{gsub("tag title ", "");print}'` +notify-send "♫ $artist - $title" \ No newline at end of file diff --git a/scripts/dbc b/scripts/dbc new file mode 100755 index 0000000..4b63569 --- /dev/null +++ b/scripts/dbc @@ -0,0 +1,75 @@ +#!/bin/sh +# Dropbear Connect Script (DBC) - Developed by acidvegas (https://git.acid.vegas/void) + +# Dropbear config must be stored in pass in the following format: +# NAME USER HOST PORT JUMP +# +# JUMP is optional and can be used to specify a host that should use your jump host. +# If JUMP is set to x, the script will use the jump host to connect to the end host. +# There should only be one jump host in the config file and it should be named 'jump'. +# +# Example: +# jump acidvegas 68.192.37.5 5902 +# hatebox acidvegas 100.151.45.10 2023 x +# aws admin 45.16.150.203 22 +# +# Useful commands: +# Git usage : git config core.sshCommand "dbclient -i ~/.ssh/key" +# Generate private key : dropbearkey -t ed25519 -f ~/.dropbear/key +# Get public key : dropbearkey -y -f ~/.dropbear/key | head -n 2 | tail -n 1 + +load_host() { + CONFIG_DATA="$1" + NAME="$2" + + # Use grep to find the matching line + MATCHING_LINES=$(printf "%s\n" "$CONFIG_DATA" | grep "^$NAME ") + + # Check if exactly one matching line is found + LINE_COUNT=$(printf "%s\n" "$MATCHING_LINES" | wc -l) + if [ "$LINE_COUNT" -ne 1 ]; then + echo "Error: The NAME '$NAME' matches multiple or no lines." && return 1 + fi + + # Remove extra whitespace from the matching line + MATCHING_LINES=$(printf "%s\n" "$MATCHING_LINES" | tr -s '[:space:]' ' ') + + # Read parameters from the matching line + line_name=$(echo $MATCHING_LINES | cut -d ' ' -f 1) + line_user=$(echo $MATCHING_LINES | cut -d ' ' -f 2) + line_host=$(echo $MATCHING_LINES | cut -d ' ' -f 3) + line_port=$(echo $MATCHING_LINES | cut -d ' ' -f 4) + line_jump=$(echo $MATCHING_LINES | cut -d ' ' -f 5) + + # Output the result + printf "%s@%s^%s%s" "$line_user" "$line_host" "$line_port" "$line_jump" +} + +# Check if the name argument is provided +if [ $# -ne 1 ]; then + echo "usage: $0 [name]" && exit 1 +fi + +# Read the name argument +NAME=$1 + +# Read the config data +CONFIG_DATA=$($HOME/.scripts/pass dropbear) + +# Check if the config data is read successfully +if [ $? -ne 0 ]; then + echo "error: can not read config data" && exit 1 +fi + +# Load the host data +JUMP_HOST=$(load_host "$CONFIG_DATA" "jump") +END_HOST=$(load_host "$CONFIG_DATA" "$NAME") +JUMP_CHECK=$(printf "$END_HOST" | rev | cut -c1) + +# Connect to the host +if [ $JUMP_CHECK = "x" ]; then + END_HOST=$(printf $END_HOST | rev | cut -c2- | rev) + dbclient -K 60 -i $HOME/.dropbear/key $JUMP_HOST,$END_HOST +else + dbclient -K 60 -i $HOME/.dropbear/key $END_HOST +fi \ No newline at end of file diff --git a/scripts/gitremote b/scripts/gitremote new file mode 100755 index 0000000..994e3d6 --- /dev/null +++ b/scripts/gitremote @@ -0,0 +1,62 @@ +#!/bin/sh +# git remote setup script - developed by acidvegas (https://git.acid.vegas) +# +# note: This assumes the directory structure of $HOME/dev/git/$USER/$REPO for each repository. +# +# usage: +# gitremote | Update current working directory repository +# gitremote -a | Update every repository + +SIGNING_KEY='441EB0F297E0DCF0AEF2F711EF4B922DB85DC9DE' + +update_repo() { + DIR=$1 + USER=$(basename $(dirname $(dirname $DIR))) + REPO=$(basename $(dirname $DIR)) + echo "updating $USER/$REPO..." + git -C $DIR remote remove origin + if [ $USER = 'internetrelaychat' ]; then + git -C $DIR remote add origin git@github.com:internet-relay-chat/$REPO.git + git -C $DIR remote set-url --add --push origin git@github.com:internet-relay-chat/$REPO.git + git -C $DIR remote set-url --add --push origin git@gitlab.com:$USER/$REPO.git + git -C $DIR remote set-url --add --push origin git@codeberg.org:$USER/$REPO.git + git -C $DIR remote set-url --add --push origin supergit:$USER/$REPO.git + git -C $DIR remote set-url --add --push origin acidgit:$REPO.git + else + git -C $DIR remote add origin git@github.com:$USER/$REPO.git + git -C $DIR remote set-url --add --push origin git@github.com:$USER/$REPO.git + git -C $DIR remote set-url --add --push origin git@gitlab.com:$USER/$REPO.git + git -C $DIR remote set-url --add --push origin git@codeberg.org:$USER/$REPO.git + git -C $DIR remote set-url --add --push origin supergit:$USER/$REPO.git + git -C $DIR remote set-url --add --push origin acidgit:$REPO.git + fi + git -C $DIR config user.signingkey $SIGNING_KEY + if [ -f $DIR/description ]; then + if [ "$(cat $1/description)" = "Unnamed repository; edit this file 'description' to name the repository." ]; then + echo "Enter a description for $REPO:" + read DESC + echo "$DESC" > $DIR/description + fi + else + echo "Enter a description for $REPO:" + read DESC + echo "$DESC" > $DIR/description + fi + cp $HOME/.scripts/irc-post-commit-hook $DIR/hooks/post-commit + echo $USER > $DIR/owner + echo "https://git.acid.vegas/$REPO.git" > $DIR/url +} + +if [ "$#" = '1' ]; then + if [ $1 = '-a' ]; then + for d in $(find $HOME/dev/git -type d -name mirror -prune -o -type d -name .git -print | sort); do + update_repo $d + done + fi +else + if [ -d $PWD/.git ]; then + update_repo $PWD/.git + else + echo "invalid repository: missing .git directory" + fi +fi diff --git a/scripts/irc-post-commit-hook b/scripts/irc-post-commit-hook new file mode 100644 index 0000000..a163ad0 --- /dev/null +++ b/scripts/irc-post-commit-hook @@ -0,0 +1,26 @@ +#!/bin/sh +# irc post-commit hook - developed by acidvegas (https://git.acid.vegas/void) + +# Place this file in .git/hooks/post-commit and chmod +x + +# Configuration +WEECHAT_NETWORK="irc.supernets.org" +WEECHAT_CHANNEL="#dev" +WEECHAT_FIFO="/home/acidvegas/.local/share/weechat/weechat_fifo" +SSH_SERVER="war" + +# Get commit data for the message +_data=$(git log -1 --graph --pretty=format:"%h|%s|%cn") +_hash=$(echo "$_data" | cut -d'|' -f1 | cut -c 3-) +_msg=$(echo "$_data" | cut -d'|' -f2) +_name=$(echo "$_data" | cut -d'|' -f3) +#_name=$(basename $(dirname $(git rev-parse --show-toplevel))) # For locally parsing organization names +_repo=$(basename -s .git $(git config --get remote.origin.url)) +_summary=$(git show $_hash --stat | grep -E "fil(e|es) changed" | awk '{files+=$1; inserted+=$4; deleted+=$6} END {printf "%s|+%s|-%s", files, inserted, deleted }') +_files=$(echo $_summary | cut -d'|' -f1) +_inserts=$(echo $_summary | cut -d'|' -f2) +_deletes=$(echo $_summary | cut -d'|' -f3) +_ircmsg="irc.$WEECHAT_NETWORK.$WEECHAT_CHANNEL *^C14[^C11GitHub^C14]^O Commit pushed to ^C08$_name/$_repo^O (^C06$_hash^O) ^C14[^O$_files^C14|^C03$_inserts^C14|^C04$_deletes^C14]^O : $_msg" + +# Send the message to weechat +echo "$_ircmsg" | ssh $SSH_SERVER tee $WEECHAT_FIFO > /dev/null \ No newline at end of file diff --git a/scripts/mutag b/scripts/mutag new file mode 100755 index 0000000..99c2d8f --- /dev/null +++ b/scripts/mutag @@ -0,0 +1,13 @@ +#!/bin/sh +# mutag - developed by acidvegas (https://git.acid.vegas/void) +# removes all metadata & album art from mp3 files and sets the artist and title based on the directory and filename +# requires: id3v2 python-eyed3 +find $HOME/music -type f | while read SONG; do + DIR=$(dirname "$SONG") + ARTIST=$(basename "$DIR") + TITLE=$(basename "$SONG" .mp3) + echo "$DIR | $ARTIST | $TITLE" + eyeD3 --remove-all-images "$SONG" + id3v2 --delete-all "$SONG" + id3v2 --artist "$ARTIST" --song "$TITLE" -2 "$SONG" +done \ No newline at end of file diff --git a/scripts/pmf b/scripts/pmf new file mode 100755 index 0000000..40aeaea --- /dev/null +++ b/scripts/pmf @@ -0,0 +1,59 @@ +#!/bin/sh +# poor mans firewall - developed by acidvegas (https://git.acid.vegas/void) + +set -xev + +# Configuration +SSH_PORT='22' + +# Kernel hardening settings +mkdir -p /etc/sysctl.d +{ + printf "net.ipv4.conf.all.accept_source_route = 0\n" + printf "net.ipv6.conf.all.accept_source_route = 0\n" + printf "net.ipv4.conf.all.rp_filter = 1\n" + printf "net.ipv4.conf.default.rp_filter = 1\n" + printf "net.ipv4.conf.all.accept_redirects = 0\n" + printf "net.ipv6.conf.all.accept_redirects = 0\n" + printf "net.ipv4.conf.default.accept_redirects = 0\n" + printf "net.ipv6.conf.default.accept_redirects = 0\n" + printf "net.ipv4.conf.all.log_martians = 1\n" + printf "kernel.randomize_va_space = 2\n" + printf "fs.suid_dumpable = 0\n" +} > /etc/sysctl.d/99-custom-hardening.conf + +# Apply hardening settings +sysctl -p /etc/sysctl.d/99-custom-hardening.conf + +# Flush existing rules +iptables -F +iptables -X +iptables -t nat -F +iptables -t nat -X +iptables -t mangle -F +iptables -t mangle -X + +# Default chain policies +iptables -P INPUT DROP +iptables -P FORWARD DROP +iptables -P OUTPUT ACCEPT + +# Common Firewall rules +iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT +iptables -A INPUT -p icmp --icmp-type echo-request -j DROP # Disable response to ping requests +iptables -A INPUT -p icmp --icmp-type port-unreachable -j DROP +iptables -A INPUT -i lo -j ACCEPT + +# Allow SSH access from the Pi server +iptables -A INPUT -p tcp -s $PI_SERVER --dport $PORT_SSH -j ACCEPT + +# Save rules +iptables-save > /etc/iptables/iptables.rules + +# Create and configure the iptables service +printf '#!/bin/sh\nexec 2>&1\niptables-restore < /etc/iptables/iptables.rules\nexec chpst -b iptables pause\n' > /etc/sv/iptables/run +chmod +x /etc/sv/iptables/run +ln -sf /etc/sv/iptables /var/service/ && sv restart iptables + +# Show rules +iptables -L -v -n \ No newline at end of file diff --git a/scripts/shotz b/scripts/shotz new file mode 100755 index 0000000..13bc429 --- /dev/null +++ b/scripts/shotz @@ -0,0 +1,13 @@ +#!/bin/bash +# shotz - developed by acidvegas (https://acid.vegas/void) +# take a screenshot with selection and optionally upload it to hardfiles.org + +output_dir="$HOME/media/i/scrots" +output_file=$(date "+scrot_%y-%m_%d_%T.png") + +mkdir -p "$output_dir" +scrot -s "$output_dir/$output_file" + +if [ "$1" = "-u" ]; then + curl -F file=@"$output_dir/$output_file" https://hardfiles.org/ | xclip -selection clipboard +fi diff --git a/scripts/statusbar b/scripts/statusbar new file mode 100755 index 0000000..864c2f6 --- /dev/null +++ b/scripts/statusbar @@ -0,0 +1,5 @@ +#!/bin/sh +while true; do + xsetroot -name "$(date '+%I:%M @ %m/%')" + sleep 60 +done \ No newline at end of file diff --git a/scripts/todo b/scripts/todo new file mode 100755 index 0000000..e719cca --- /dev/null +++ b/scripts/todo @@ -0,0 +1,17 @@ +#!/bin/sh +# dmenu todo script - developed by acidvegas (https://git.acid.vegas/void) +db=$HOME/.todo +touch $db +while : +do + cmd=$(dmenu -l 10 -m 0 -fn "Misc Ohsnap.Icons:style=Regular:size=11" -nb "#000000" -nf "#FFFFFF" -sb "#000000" -sf "#00D787" "$@" < "$db") + if [ -z "$cmd" ]; then + break + elif grep -q "^$cmd\$" "$db"; then + grep -v "^$cmd\$" "$db" > "$db.$$" + mv "$db.$$" "$db" + else + echo "$cmd" >> "$db" + fi +done +exit 0 \ No newline at end of file diff --git a/scripts/torwall b/scripts/torwall new file mode 100755 index 0000000..f5c639a --- /dev/null +++ b/scripts/torwall @@ -0,0 +1,56 @@ +#!/bin/bash +# tor firewall script - developed by acidvegas (https://git.acid.vegas/void) + +# All traffic is routed through Tor. +# printf "DNSPort 53\nTransPort 9040\nSocksPort 9050\nControlPort 9051\n" > /etc/tor/torrc + + +start_tor() { + iptables -t nat -A OUTPUT -o lo -j RETURN + iptables -t nat -A OUTPUT -p tcp --syn -j REDIRECT --to-ports 9040 + iptables -t nat -A OUTPUT -p udp --dport 53 -j REDIRECT --to-ports 9053 + iptables -t nat -A OUTPUT -p tcp --dport 53 -j REDIRECT --to-ports 9053 + iptables -A OUTPUT ! -o lo ! -d 127.0.0.1/8 ! -p tcp -j DROP + echo "repository=http://lysator7eknrfl47rlyxvgeamrv7ucefgrrlhk7rouv3sna25asetwid.onion/pub/voidlinux/current/musl" > /etc/xbps.d/00-repository-main.conf + echo "nameserver 127.0.0.1" > /etc/resolv.conf && chattr +i /etc/resolv.conf + export SOCKS_PROXY="socks5://127.0.0.1:9050" + echo "All traffic is now routed through Tor." +} + +new_tor() { + iptables -F + iptables -t nat -F + + # Allow local-only connections + iptables -A OUTPUT -o lo -j ACCEPT + + # Allow the tor process to establish connections + iptables -A OUTPUT -m owner --uid-owner $(id -u debian-tor) -j ACCEPT + + # Redirect all non-local TCP connections to Tor's TransPort + iptables -t nat -A OUTPUT -p tcp --syn -j REDIRECT --to-ports 9040 + + # Redirect DNS queries to Tor's DNSPort + iptables -t nat -A OUTPUT -p udp --dport 53 -j REDIRECT --to-ports 9053 + iptables -t nat -A OUTPUT -p tcp --dport 53 -j REDIRECT --to-ports 9053 + + # Reject any other outbound traffic + iptables -A OUTPUT -j REJECT +} + +stop_tor() { + iptables -F + iptables -t nat -F + echo "repository=https://repo-default.voidlinux.org/current/musl" > /etc/xbps.d/00-repository-main.conf + echo "nameserver 1.1.1.1" > /etc/resolv.conf && chattr +i /etc/resolv.conf + unset SOCKS_PROXY + echo "Tor-only mode is now off." +} + +if [[ $1 == "start" ]]; then + start_tor +elif [[ $1 == "stop" ]]; then + stop_tor +else + echo "Usage: $0 [start|stop]" +fi diff --git a/scripts/vps b/scripts/vps new file mode 100755 index 0000000..85f0837 --- /dev/null +++ b/scripts/vps @@ -0,0 +1,157 @@ +#!/bin/bash +# enter the void (vps) - developed by acidvegas (https://git.acid.vegas/void) + +# Notes: +# MUSL builds for Void Linux are having an issue where `su` is segfaulting or returning "Bad address" +# +# Bootstrap: +# xbps-install -Su && xbps-install -u xbps && xbps-install wget nano && wget https://git.supernets.org/acidvegas/void/raw/branch/master/scripts/vps && chmod +x vps && ./vps root + +set -xev + +# Configuration +ARCH=x86_64 # x86_64 or x86_64-musl +DRIVE=/dev/vda +SSH_KEY="ssh-ed25519 REDACTED acidvegas@paloalto" +SWAP_SIZE=$((1 * 1024)) # 1GB +TIMEZONE="America/New_York" +USERNAME=supernets + +# Let's dynamically set the hostname so we don't have to hardcode it +echo "Hostname:" +read HOSTNAME + +setup_root() { + xbps-install -y parted + wipefs -a -f $DRIVE + parted --script $DRIVE mklabel msdos + parted --script $DRIVE mkpart primary ext4 1MiB 100% + parted --script $DRIVE set 1 boot on + mkfs.ext4 ${DRIVE}1 + mkdir -p /mnt + mount ${DRIVE}1 /mnt + mkdir -p /mnt/var/db/xbps/keys + cp /var/db/xbps/keys/* /mnt/var/db/xbps/keys/ + REPO=https://repo-default.voidlinux.org/current + [ $ARCH = 'x86_64-musl' ] && REPO=$REPO/musl + XBPS_ARCH=$ARCH xbps-install -y -S -r /mnt -R "$REPO" base-system linux + cp vps /mnt/root/ + xchroot /mnt /bin/bash +} + +setup_chroot() { + passwd + + xbps-install -u xbps + xbps-remove -y base-system openssh + xbps-install -Syu curl dropbear git htop lxd iptables nano net-tools runit-iptables tmux socklog-void wget + + # Set up networking + IP_ADDR=$(ip addr show eth0 | grep 'inet ' | awk '{print $2}' | cut -d'/' -f1) + GATEWAY=$(ip route show default | awk '/default/ {print $3}') + printf "ip link set eth0 up\nip addr add ${IP_ADDR}/24 dev eth0\nip route add default via $GATEWAY\n" > /etc/rc.local + printf "printf \"nameserver 208.67.222.222\\\nnameserver 208.67.220.220\\\nnameserver 2620:119:35::35\\\nnameserver 2620:119:53::53\" > /etc/resolv.conf" >> /etc/rc.local + + echo "$HOSTNAME" > /etc/hostname + printf "set boldtext\nset minibar\nset nohelp\nset nowrap\nset quickblank\nset tabsize 4\nunbind ^J main\nset selectedcolor black,red\ninclude \"/usr/share/nano/*.nanorc\"\n" > /etc/nanorc + printf "\nexport HISTFILE=/dev/null\nexport LESSHISTFILE=/dev/null\nexport PYTHONHISTFILE=/dev/null\n" >> /etc/profile + printf "Defaults lecture = always\nDefaults lecture_file = /etc/sudoers.d/sudoers.lecture\nroot ALL=(ALL) ALL\n%%wheel ALL=(ALL) ALL\n" > /etc/sudoers + printf "\n\033[1m \033[32m\"Bee\" careful \033[34m__\n \033[32mwith sudo! \033[34m// \ \n \\\\\\_/ \033[33m//\n \033[35m''-.._.-''-.._.. \033[33m-(||)(')\n '''\033[0m\n" > /etc/sudoers.d/sudoers.lecture + printf '#!/bin/sh\nexec 2>&1\n[ -r conf ] && . ./conf\nexec dropbear -K 0 -p %s -R -w -t -T 1 -F 2>&1\n' "$(shuf -i 10000-65534 -n 1)" > /etc/sv/dropbear/run + echo "hsts=0" >> /etc/wgetrc + >/var/log/lastlog && chattr +i /var/log/lastlog + + # Enable services (Using the runit dir because the system is not running yet) + ln -s /etc/sv/socklog-unix/ /etc/runit/runsvdir/default/ + ln -s /etc/sv/nanoklogd/ /etc/runit/runsvdir/default/ + ln -s /etc/sv/dropbear/ /etc/runit/runsvdir/default/ + ln -s /etc/sv/lxd /etc/runit/runsvdir/default/ + ln -s /usr/share/zoneinfo/$TIMEZONE /etc/localtime + + touch /swapfile + dd if=/dev/zero of=/swapfile bs=1M count=${SWAP_SIZE} status=progress + chmod 0600 /swapfile + mkswap /swapfile && swapon /swapfile + + hwclock --systohc + chsh -s /bin/bash + + useradd -m -s /bin/bash $USERNAME && passwd $USERNAME + gpasswd -a $USERNAME lxd + cp vps /home/$USERNAME/ && chown $USERNAME:$USERNAME /home/$USERNAME/vps + + if [ ! $ARCH = 'x86_64-musl' ]; then + xbps-reconfigure -f glibc-locales + fi + + # Setup fstab + echo "UUID=$(blkid -s UUID -o value ${DRIVE}1) / ext4 rw,errors=remount-ro,noatime 0 1" > /etc/fstab + echo "tmpfs /tmp tmpfs defaults,nosuid,nodev 0 0" >> /etc/fstab + echo "/swapfile none swap sw 0 0" >> /etc/fstab + echo "proc /proc proc defaults,hidepid=2 0 0" >> /etc/fstab + mount -o remount /proc + + # Preseed LXD initialization + { + echo "config:" + echo " images.auto_update_interval: \"0\"" + echo "networks:" + echo "- config:" + echo " ipv4.address: auto" + echo " ipv6.address: none" # Do we need IPv6 + echo " description: \"\"" + echo " name: lxdbr0" + echo " type: \"\"" + echo " project: default" + echo "storage_pools: []" + echo "profiles:" + echo "- config: {}" + echo " description: \"\"" + echo " devices:" + echo " eth0:" + echo " name: eth0" + echo " network: lxdbr0" + echo " type: nic" + echo " name: default" + echo "projects: []" + echo "cluster: null" + } | lxd init --preseed + + # Add the official SuperNETs seal of HARD FUCKIGN CORE INTERNET USAGE into the MOTD + { + echo "" + echo " \033[37;104m \033[0m \033[0m" + echo " \033[37;104m \033[37;101m \033[37;104m \033[0m \033[0m" + echo " \033[37;104m \033[37;101m \033[37;103m \033[37;101m \033[37;103m \033[37;101m \033[37;103m \033[37;101m \033[37;104m \033[0m \033[0m" + echo "\033[37;104m \033[37;101m \033[37;103m \033[37;101m \033[37;103m \033[37;101m \033[37;103m \033[37;101m \033[37;104m \033[0m \033[0m" + echo "\033[37;104m \033[37;101m \033[37;103m \033[37;101m \033[37;103m \033[37;101m \033[37;104m \033[0m \033[0m" + echo " \033[37;104m \033[37;101m \033[37;103m \033[37;101m \033[37;103m \033[37;101m \033[37;104m \033[0m \033[0m" + echo " \033[37;104m \033[37;101m \033[37;104m \033[0m \033[0m" + echo " \033[37;104m \033[37;101m \033[37;103m \033[37;101m \033[37;104m \033[0m \033[0m" + echo " \033[37;104m \033[37;101m \033[37;103m \033[37;101m \033[37;103m \033[37;101m \033[37;104m \033[0m \033[0m" + echo " \033[37;104m \033[37;101m \033[37;104m \033[0m \033[0m" + echo " \033[37;104m \033[37;101m \033[37;103m \033[37;101m \033[37;104m \033[0m \033[0m" + echo " \033[37;104m \033[37;101m \033[37;103m \033[37;101m \033[37;104m \033[0m \033[0m" + echo " \033[37;104m \033[37;101m \033[37;104m \033[0m \033[0m" + echo "┏┓┳┳┏┓┏┓┳┓ \033[37;104m \033[37;101m \033[37;104m \033[0m ┳┓┏┓┏┳┓┏┓" + echo "┗┓┃┃┣┛┣ ┣┫ \033[37;104m \033[0m ┃┃┣ ┃ ┗┓" + echo "┗┛┗┛┻ ┗┛┛┗ \033[37;104m \033[0m\033[0m ┛┗┗┛ ┻ ┗┛" + echo "" + } > /etc/motd + + # Set up user SSH keys + mkdir -p /home/$USERNAME/.ssh + echo "$SSH_KEY" > /home/$USERNAME/.ssh/authorized_keys + chmod 700 $HOME/.ssh && chown -R $USERNAME:$USERNAME /home/$USERNAME/.ssh + chmod 400 $HOME/.ssh/authorized_keys && chattr +i $HOME/.ssh/authorized_keys && chattr +i $HOME/.ssh + + xbps-install -Sy grub + grub-install $DRIVE + grub-mkconfig -o /boot/grub/grub.cfg + + xbps-reconfigure -fa +} + +[ $1 = "root" ] && setup_root +[ $1 = "chroot" ] && setup_chroot +[ $1 = "user" ] && setup_user diff --git a/setup b/setup new file mode 100755 index 0000000..013776f --- /dev/null +++ b/setup @@ -0,0 +1,163 @@ +#!/bin/sh +# void setup script - developed by acidvegas (https://git.acid.vegas/void) + +# note: After importing keys: printf "FINGERPRINTHERE:6:" | gpg --import-ownertrust + +set -xev + +# Configuration +CPU=intel # amd or intel +DISPLAY_SERVER=xorg # xorg or blank for none +GFX_DRIVER=intel # amd or intel (leave blank for none) +REMOTE_PORT=2023 # CHANGE THIS + +GIT_URL="https://raw.githubusercontent.com/acidvegas/void/master" + +setup_root() { + useradd -m -s /bin/bash acidvegas && gpasswd -a acidvegas wheel && passwd acidvegas + + wget -O /usr/share/kbd/consolefonts/ohsnap6x11r.psfu $GIT_URL/font/ohsnap6x11r.psfu + wget -O /usr/share/kbd/consolefonts/ohsnap7x12r.psfu $GIT_URL/font/ohsnap7x12r.psfu + wget -O /usr/share/kbd/consolefonts/ohsnap7x14r.psfu $GIT_URL/font/ohsnap7x14r.psfu + + printf "\nnohook resolv.conf\n" >> /etc/dhcpcd.conf + printf "\nipv4only\nnodhcp6\n" >> /etc/dhcpcd.conf # For fixing "dhcpcd: ipv6nd_sendadvertisement: Operation not permitted" error + echo "proc /proc proc defaults,hidepid=2 0 0" >> /etc/fstab && mount -o remount /proc + printf "set boldtext\nset minibar\nset nohelp\nset nowrap\nset quickblank\nset tabsize 4\nunbind ^J main\nset selectedcolor black,red\ninclude \"/usr/share/nano/*.nanorc\"\n" > /etc/nanorc + printf "\nexport HISTFILE=/dev/null\nexport LESSHISTFILE=/dev/null\nexport PYTHONHISTFILE=/dev/null\n" >> /etc/profile + printf "#\!/bin/sh\nclear && (printf \"\" && printf \" E N T E R T H E V O I D\" && printf \"\") | nms -af red\n" > /etc/profile.d/motd.sh + printf "\nFONT=\"ohsnap6x11r\"\n" >> /etc/rc.conf + printf "Defaults lecture = always\nDefaults lecture_file = /etc/sudoers.d/sudoers.lecture\nroot ALL=(ALL) ALL\n%%wheel ALL=(ALL) ALL\n" > /etc/sudoers + printf "\n\033[1m \033[32m\"Bee\" careful \033[34m__\n \033[32mwith sudo! \033[34m// \ \n \\\\\\_/ \033[33m//\n \033[35m''-.._.-''-.._.. \033[33m-(||)(')\n '''\033[0m\n" > /etc/sudoers.d/sudoers.lecture + printf '#!/bin/sh\nexec 2>&1\n[ -r conf ] && . ./conf\nexec dropbear -p CHANGE:ME -w -s -R -F\n' > /etc/sv/dropbear/run + printf "\nhsts=0\n" >> /etc/wgetrc + + ln -sfv /etc/sv/socklog-unix /var/service + ln -sfv /etc/sv/nanoklogd /var/service + ln -sf /etc/sv/dropbear /var/service/ +} + + +setup_packages() { + xbps-install -Suy void-repo-nonfree + + if [ $CPU = "intel" ]; then + xbps-install -y intel-ucode + xbps-reconfigure -f $(xbps-query -s linux | grep pkgver | cut -d " " -f 2) # Must regenerate initramfs + elif [ $CPU = "amd" ]; then + xbps-install -y linux-firmware-amd + fi + + if [ $DISPLAY_SERVER = "xorg" ]; then + if [ $GFX_DRIVER = "intel" ]; then + xbps-install -y linux-firmware-intel mesa-dri vulkan-loader mesa-vulkan-intel intel-video-accel + fi + xbps-install -y xorg libX11-devel libX11 libXft-devel libXft libXinerama-devel libXinerama libXrandr-devel libXrandr + xbps-install -y alacritty dmenu dunst firefox pinentry-dmenu scrot signal-desktop unclutter xclip + xbps-install -y ohsnap-font font-unifont-bdf freefont-ttf noto-fonts-ttf noto-fonts-ttf-extra noto-fonts-cjk noto-fonts-emoji + xbps-install -y alsa-utils cmus ffmpeg id3v2 eyeD3 youtube-dl # Revamp audio setup at some point + xbps-install -y vscode + fi + + # Development + xbps-install -y checkbashisms gcc go make patch pkg-config python3 python3-pip shellcheck + + # Essentials + xbps-install -y curl dropbrear git lxc lxd socklog-void tmux tor tree unzip zip + xbps-install -y bandwhich glow gnupg2-scdaemon lazygit oath-toolkit progress rsync tmate + xbps-install -y earlyoom && ln -sfv /etc/sv/earlyoom /var/service/ + + # Alternatives + xbps-install -y bat btop delta exa + + # Recon + xbps-install -y masscan termshark +} + + +setup_configs() { + wget -O $HOME/.alacritty.toml $GIT_URL/alacritty/.alacritty.toml + wget -O $HOME/.tmux.conf $GIT_URL/tmux/.tmux.conf + + wget -O $HOME/.bashrc $GIT_URL/bash/.bashrc + wget -O $HOME/.bash_aliases $GIT_URL/bash/.bash_aliases + wget -O $HOME/.bash_functions $GIT_URL/bash/.bash_functions + . $HOME/.bashrc # POSIX shell doesn't support source + + mkdir -p $HOME/.config/cmus && wget -O $HOME/.config/cmus/autosave $GIT_URL/cmus/autosave + mkdir -p $HOME/.config/dunst && wget -O $HOME/.config/dunst/dunstrc $GIT_URL/dunst/dunstrc + wget -O $HOME/.gitconfig $GIT_URL/git/.gitconfig + mkdir $HOME/.gnupg && wget -O $HOME/.gnupg/gpg.conf $GIT_URL/gpg/gpg.conf + + if [ $DISPLAY_SERVER = "xorg" ]; then + printf "pinentry-program $HOME/.gnupg/pinentry-wrapper\ndefault-cache-ttl 3600\n" > $HOME/.gnupg/gpg-agent.conf + printf "if [ \"\$PINENTRY_USER_DATA\" = \"dmenu\" ]; then\n\texec /usr/local/bin/pinentry-dmenu \"$@\"\nelse\n\texec /usr/bin/pinentry-curses \"$@\"\nfi\n" > $HOME/.gnupg/pinentry-wrapper && chmod +x $HOME/.gnupg/pinentry-wrapper + fi + chmod 700 $HOME/.gnupg && chmod 600 $HOME/.gnupg/* + + mkdir $HOME/.ssh && touch $HOME/.ssh/config && chown -R $USER $HOME/.ssh && chmod 700 $HOME/.ssh && chmod 600 $HOME/.ssh/config + wget -O $HOME/.xinitrc $GIT_URL/xorg/.xinitrc + + mkdir $HOME/.scripts + for SCRIPT in cmus-now dbc gitremote irc-post-commit-hook mutag pmf shotz statusbar todo torwall; do + wget -O $HOME/.scripts/$SCRIPT $GIT_URL/scripts/$SCRIPT && chmod +x $HOME/.scripts/$SCRIPT + done + + mkdir -p $HOME/.local/share/fonts && wget -O $HOME/.local/share/fonts/BlockZone.ttf $GIT_URL/font/BlockZone.ttf +} + + +setup_fun() { + BUILD=$HOME/dev/build + mkdir -p $BUILD + + sudo xbps-install -y asciiquarium cmatrix no-more-secrets tty-solitaire + + wget -O $HOME/.scripts/irc2ansi.py https://github.com/internet-relay-chat/archive/blob/master/art/irc2ansi.py + wget -O $HOME/.scripts/bomber $GIT_URL/scripts/bomber && chmod +x $HOME/.scripts/bomber + wget -O $HOME/.scripts/pipes https://raw.githubusercontent.com/pipeseroni/pipes.sh/master/pipes.sh && chmod +x $HOME/.scripts/pipes + + git clone https://github.com/AngelJumbo/lavat.git $BUILD/lavat + sudo make -C $BUILD/lavat clean install + + git clone https://github.com/lptstr/fire --recurse $BUILD/fire + sudo make -C $BUILD/fire clean install + + git clone https://github.com/ricoriedel/wipe $BUILD/wipe + cargo build --release --manifest-path $BUILD/wipe/Cargo.toml # Need to install + + git clone https://github.com/pythops/bouncinamation $BUILD/bouncinamation + cargo build --release --manifest-path $BUILD/bouncinamation/Cargo.toml # Need to install + + go install github.com/maaslalani/confetty@latest # Need to revise +} + + +setup_builds() { + BUILD=$HOME/dev/build + mkdir -p $BUILD + + git clone --depth 1 http://git.suckless.org/dwm $BUILD/dwm + wget -O $BUILD/dwm/config.h $GIT_URL/dwm/config.h + wget -O $BUILD/dwm/patch_nosquares.diff $GIT_URL/dwm/patch_nosquares.diff + wget -O $BUILD/dwm/patch_notitles.diff $GIT_URL/dwm/patch_notitles.diff + patch $BUILD/dwm/drw.c $BUILD/dwm/patch_nosquares.diff + patch $BUILD/dwm/dwm.c $BUILD/dwm/patch_notitles.diff + sudo make -C $BUILD/dwm clean install + + go install -v github.com/projectdiscovery/pdtm/cmd/pdtm@latest && pdtm --all +} + + + +if [ "$#" -ne 1 ]; then + echo "usage: $0 [root|config|build|fun]" && exit 1 +fi + +case "$1" in + root) setup_root ;; + config) setup_configs ;; + build) setup_builds ;; + fun) setup_fun ;; + *) echo "usage: $0 [root|config|build|fun]\n"; exit 1 ;; +esac diff --git a/tmux/.tmux.conf b/tmux/.tmux.conf new file mode 100644 index 0000000..c02a5f4 --- /dev/null +++ b/tmux/.tmux.conf @@ -0,0 +1,37 @@ +# Sessions +bind -n C-M-k kill-session +bind -n C-M-t command-prompt -p "New session name:" "rename-session '%%'" +bind -n C-M-n new-session +bind -n C-M-s choose-tree -Z +bind -n C-M-Left switch-client -n +bind -n C-M-Right switch-client -p + +# Tabs +bind -n C-k kill-window +bind -n C-n new-window +bind -n C-t command-prompt -p "New title:" "rename-window '%%'" +bind -n C-Left previous-window +bind -n C-Right next-window +bind -n C-S-Left swap-window -t -1 \; previous-window +bind -n C-S-Right swap-window -t +1 \; next-window + +# Panes +bind -n C-Up split-window -h +bind -n C-Down split-window -v +bind -n C-S-Up select-pane -t :.+ +bind -n C-S-Down select-pane -t :.- + +set -g mouse on + +set -g status-interval 3 +set -g status-style bg=black +set -g status-right-length 100 +set -g status-right "#[fg=yellow]#H#[default] | #[fg=cyan]Disk:#[default] #(df -h | grep '/dev/sda2' | awk '{printf \"%3.0f%\", $5}') | #[fg=cyan]CPU: #[default]#(top -bn1 | grep 'Cpu(s)' | awk '{printf \"%3.0f%\", $2 + $4}') | #[fg=cyan]MEM: #[default]#(free | awk '/^Mem/ {printf \"%3.0f%\", $3/$2 * 100.0}') | %I:%M" + +setw -g window-status-current-style fg=cyan,bg=default +setw -g window-status-activity-style fg=yellow,bg=default +setw -g window-status-style fg=grey,bg=black +setw -g window-status-format "#I: #W" +setw -g window-status-current-format "#[bold]#I: #W" + +set-option -g detach-on-destroy off diff --git a/xorg/.xinitrc b/xorg/.xinitrc new file mode 100644 index 0000000..81ce129 --- /dev/null +++ b/xorg/.xinitrc @@ -0,0 +1,12 @@ +#!/bin/sh +xset +fp /usr/share/fonts/local +xset fp rehash + +dunst & +unclutter & +$HOME/.scripts/statusbar.sh & + +# Example of dual monitor setup +#{ sleep 2; xrandr --output HDMI1 --mode 1920x1080 --output DP1 --mode 1920x1080 --above HDMI1; } & + +exec dwm