diff --git a/.gitignore b/.gitignore index a392386..b2bd4e4 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ matlab mymenu vim/.vim/bundle wm +wallpapers diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..c9a5d39 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,8 @@ +{ + "search.exclude": { + "**/node_modules": true, + "**/bower_components": true, + "**/*.code-search": true, + "**/misc/.local": true + } +} diff --git a/bspwm/.config/bspwm/.DNH-Latitude-7480 b/bspwm/.config/bspwm/.DNH-Latitude-7480 deleted file mode 100644 index d505cdb..0000000 --- a/bspwm/.config/bspwm/.DNH-Latitude-7480 +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/sh -# put machine dependent stuff here - -bspc rule -a Plank layer=normal manage=on border=off focus=off locked=on - -pkill -x wallpaper.sh -wallpaper.sh & - -stalonetray -i 24 -geometry 1x1-430+0 & -nm-applet & - -#redshift -m randr -r -l 52.0685:4.5094 -t 5700:2700 & -panel & - diff --git a/bspwm/.config/bspwm/bspwmrc b/bspwm/.config/bspwm/bspwmrc index cb1bd16..3afa124 100755 --- a/bspwm/.config/bspwm/bspwmrc +++ b/bspwm/.config/bspwm/bspwmrc @@ -1,4 +1,6 @@ #!/bin/zsh +export XCURSOR_SIZE=64 + HOST=$(cat /etc/hostname) @@ -90,6 +92,7 @@ dunst & # bspc monitor $MON1 -d 6 7 8 9 10 #fi +pkill panel setsid panel & # if type "xrandr"; then # for m in $(xrandr --query | grep " connected" | cut -d" " -f1); do diff --git a/bspwm/.config/bspwm/emilia.bspwm.sh b/bspwm/.config/bspwm/emilia.bspwm.sh index d784b92..5464a59 100644 --- a/bspwm/.config/bspwm/emilia.bspwm.sh +++ b/bspwm/.config/bspwm/emilia.bspwm.sh @@ -9,17 +9,20 @@ nm-applet & blueman-applet & pkill redshift -redshift-gtk -m randr -r -l 52.0685:4.5094 -t 5700:2700 & +redshift-gtk -m randr -r -l 52.0685:4.5094 -t 5700:1500 & pkill picom picom --config /dev/null --backend glx --xrender-sync-fence --vsync -b pkill stalonetray -stalonetray & +# stalonetray & +# somehow the above command renders stalonetray wrapping top right corner to top left corner +stalonetray -i 24 -geometry 1x1-1+0 & lxsession & -xautolock -corners "0000" -time 5 -locker lock.sh &! +# top right corner prevent xautolock from kicking in +xautolock -corners "0-00" -time 5 -locker lock.sh &! setxkbmap -option caps:escape # after factory resetting my monitors, things got twisted @@ -28,5 +31,7 @@ setxkbmap -option caps:escape # bspc monitor HDMI-0 -d 6 7 8 9 10 bspc monitor HDMI-0 -d 1 2 3 4 5 6 7 8 9 10 -sudo fix_bluetooth +# sudo fix_bluetooth +cc_token_monitor & + (sleep 5 && journalctl -S "$(date "+%F %T")" --no-pager -f -u earlyoom.service | grep --line-buffered "sending" | notifier "EarlyOOM" &) diff --git a/rofi/.config/rofi/config.rasi.emilia b/rofi/.config/rofi/config.rasi.emilia new file mode 100644 index 0000000..eb4741a --- /dev/null +++ b/rofi/.config/rofi/config.rasi.emilia @@ -0,0 +1,165 @@ +/* +rofi.modi: combi,run,window,ssh,drun +rofi.width: 100 +rofi.lines: 24 +rofi.font: Operator Mono 14 +rofi.color-normal: #00fdf6e3,#ffffff,#00eee8d5,#268bd2,#eee8d5 +rofi.color-window: #DD000000,#000000,#00000000 +rofi.bw: 0 +rofi.padding: 400 +rofi.combi-modi: window,run,ssh,drun +*/ +configuration { +/* modes: "window,drun,run,ssh";*/ + font: "Operator Mono 14"; +/* location: 0;*/ +/* yoffset: 0;*/ +/* xoffset: 0;*/ +/* fixed-num-lines: true;*/ +/* show-icons: false;*/ +/* terminal: "rofi-sensible-terminal";*/ +/* ssh-client: "ssh";*/ +/* ssh-command: "{terminal} -e {ssh-client} {host} [-p {port}]";*/ +/* run-command: "{cmd}";*/ +/* run-list-command: "";*/ +/* run-shell-command: "{terminal} -e {cmd}";*/ +/* window-command: "wmctrl -i -R {window}";*/ +/* window-match-fields: "all";*/ +/* icon-theme: ;*/ +/* drun-match-fields: "name,generic,exec,categories,keywords";*/ +/* drun-categories: ;*/ +/* drun-show-actions: false;*/ +/* drun-display-format: "{name} [({generic})]";*/ +/* drun-url-launcher: "xdg-open";*/ +/* disable-history: false;*/ +/* ignored-prefixes: "";*/ +/* sort: false;*/ +/* sorting-method: "normal";*/ +/* case-sensitive: false;*/ +/* cycle: true;*/ +/* sidebar-mode: false;*/ +/* hover-select: false;*/ +/* eh: 1;*/ +/* auto-select: false;*/ +/* parse-hosts: false;*/ +/* parse-known-hosts: true;*/ +/* combi-modes: "window,run";*/ +/* matching: "normal";*/ +/* tokenize: true;*/ +/* m: "-5";*/ +/* filter: ;*/ +/* dpi: -1;*/ +/* threads: 0;*/ +/* scroll-method: 0;*/ +/* window-format: "{w} {c} {t}";*/ +/* click-to-exit: true;*/ +/* max-history-size: 25;*/ +/* combi-hide-mode-prefix: false;*/ +/* combi-display-format: "{mode} {text}";*/ +/* matching-negate-char: '-' /* unsupported */;*/ +/* cache-dir: ;*/ +/* window-thumbnail: false;*/ +/* drun-use-desktop-cache: false;*/ +/* drun-reload-desktop-cache: false;*/ +/* normalize-match: false;*/ +/* steal-focus: false;*/ +/* application-fallback-icon: ;*/ +/* refilter-timeout-limit: 8192;*/ +/* xserver-i300-workaround: false;*/ +/* pid: "/run/user/1000/rofi.pid";*/ +/* display-window: ;*/ +/* display-windowcd: ;*/ +/* display-run: ;*/ +/* display-ssh: ;*/ +/* display-drun: ;*/ +/* display-combi: ;*/ +/* display-keys: ;*/ +/* display-filebrowser: ;*/ +/* kb-primary-paste: "Control+V,Shift+Insert";*/ +/* kb-secondary-paste: "Control+v,Insert";*/ +/* kb-clear-line: "Control+w";*/ +/* kb-move-front: "Control+a";*/ +/* kb-move-end: "Control+e";*/ +/* kb-move-word-back: "Alt+b,Control+Left";*/ +/* kb-move-word-forward: "Alt+f,Control+Right";*/ +/* kb-move-char-back: "Left,Control+b";*/ +/* kb-move-char-forward: "Right,Control+f";*/ +/* kb-remove-word-back: "Control+Alt+h,Control+BackSpace";*/ +/* kb-remove-word-forward: "Control+Alt+d";*/ +/* kb-remove-char-forward: "Delete,Control+d";*/ +/* kb-remove-char-back: "BackSpace,Shift+BackSpace,Control+h";*/ +/* kb-remove-to-eol: "Control+k";*/ +/* kb-remove-to-sol: "Control+u";*/ +/* kb-accept-entry: "Control+j,Control+m,Return,KP_Enter";*/ +/* kb-accept-custom: "Control+Return";*/ +/* kb-accept-custom-alt: "Control+Shift+Return";*/ +/* kb-accept-alt: "Shift+Return";*/ +/* kb-delete-entry: "Shift+Delete";*/ +/* kb-mode-next: "Shift+Right,Control+Tab";*/ +/* kb-mode-previous: "Shift+Left,Control+ISO_Left_Tab";*/ +/* kb-mode-complete: "Control+l";*/ +/* kb-row-left: "Control+Page_Up";*/ +/* kb-row-right: "Control+Page_Down";*/ +/* kb-row-up: "Up,Control+p";*/ +/* kb-row-down: "Down,Control+n";*/ +/* kb-row-tab: "";*/ +/* kb-element-next: "Tab";*/ +/* kb-element-prev: "ISO_Left_Tab";*/ +/* kb-page-prev: "Page_Up";*/ +/* kb-page-next: "Page_Down";*/ +/* kb-row-first: "Home,KP_Home";*/ +/* kb-row-last: "End,KP_End";*/ +/* kb-row-select: "Control+space";*/ +/* kb-screenshot: "Alt+S";*/ +/* kb-ellipsize: "Alt+period";*/ +/* kb-toggle-case-sensitivity: "grave,dead_grave";*/ +/* kb-toggle-sort: "Alt+grave";*/ +/* kb-cancel: "Escape,Control+g,Control+bracketleft";*/ +/* kb-custom-1: "Alt+1";*/ +/* kb-custom-2: "Alt+2";*/ +/* kb-custom-3: "Alt+3";*/ +/* kb-custom-4: "Alt+4";*/ +/* kb-custom-5: "Alt+5";*/ +/* kb-custom-6: "Alt+6";*/ +/* kb-custom-7: "Alt+7";*/ +/* kb-custom-8: "Alt+8";*/ +/* kb-custom-9: "Alt+9";*/ +/* kb-custom-10: "Alt+0";*/ +/* kb-custom-11: "Alt+exclam";*/ +/* kb-custom-12: "Alt+at";*/ +/* kb-custom-13: "Alt+numbersign";*/ +/* kb-custom-14: "Alt+dollar";*/ +/* kb-custom-15: "Alt+percent";*/ +/* kb-custom-16: "Alt+dead_circumflex";*/ +/* kb-custom-17: "Alt+ampersand";*/ +/* kb-custom-18: "Alt+asterisk";*/ +/* kb-custom-19: "Alt+parenleft";*/ +/* kb-select-1: "Super+1";*/ +/* kb-select-2: "Super+2";*/ +/* kb-select-3: "Super+3";*/ +/* kb-select-4: "Super+4";*/ +/* kb-select-5: "Super+5";*/ +/* kb-select-6: "Super+6";*/ +/* kb-select-7: "Super+7";*/ +/* kb-select-8: "Super+8";*/ +/* kb-select-9: "Super+9";*/ +/* kb-select-10: "Super+0";*/ +/* ml-row-left: "ScrollLeft";*/ +/* ml-row-right: "ScrollRight";*/ +/* ml-row-up: "ScrollUp";*/ +/* ml-row-down: "ScrollDown";*/ +/* me-select-entry: "MousePrimary";*/ +/* me-accept-entry: "MouseDPrimary";*/ +/* me-accept-custom: "Control+MouseDPrimary";*/ + timeout { + action: "kb-cancel"; + delay: 0; + } + filebrowser { + directories-first: true; + sorting-method: "name"; + } +} + +@theme "gruvbox-dark-hard.rasi" +/* @theme "sidebar-v2.rasi" */ diff --git a/rofi/.config/rofi/gruvbox-common.rasi b/rofi/.config/rofi/gruvbox-common.rasi new file mode 100644 index 0000000..69330e2 --- /dev/null +++ b/rofi/.config/rofi/gruvbox-common.rasi @@ -0,0 +1,131 @@ +/* ========================================================================== + File: gruvbox-common.rasi + Desc: Shared rules between all gruvbox themes + Author: bardisty + Source: https://github.com/bardisty/gruvbox-rofi + Modified: Mon Feb 12 2018 06:06:47 PST -0800 + ========================================================================== */ + +window { + background-color: @background; + border: 2; + padding: 2; +} + +mainbox { + border: 0; + padding: 0; +} + +message { + border: 2px 0 0; + border-color: @separatorcolor; + padding: 1px; +} + +textbox { + highlight: @highlight; + text-color: @foreground; +} + +listview { + border: 2px solid 0 0; + padding: 2px 0 0; + border-color: @separatorcolor; + spacing: 2px; + scrollbar: @scrollbar; +} + +element { + border: 0; + padding: 2px; +} + +element.normal.normal { + background-color: @normal-background; + text-color: @normal-foreground; +} + +element.normal.urgent { + background-color: @urgent-background; + text-color: @urgent-foreground; +} + +element.normal.active { + background-color: @active-background; + text-color: @active-foreground; +} + +element.selected.normal { + background-color: @selected-normal-background; + text-color: @selected-normal-foreground; +} + +element.selected.urgent { + background-color: @selected-urgent-background; + text-color: @selected-urgent-foreground; +} + +element.selected.active { + background-color: @selected-active-background; + text-color: @selected-active-foreground; +} + +element.alternate.normal { + background-color: @alternate-normal-background; + text-color: @alternate-normal-foreground; +} + +element.alternate.urgent { + background-color: @alternate-urgent-background; + text-color: @alternate-urgent-foreground; +} + +element.alternate.active { + background-color: @alternate-active-background; + text-color: @alternate-active-foreground; +} + +scrollbar { + width: 4px; + border: 0; + handle-color: @scrollbar-handle; + handle-width: 8px; + padding: 0; +} + +mode-switcher { + border: 2px 0 0; + border-color: @separatorcolor; +} + +inputbar { + spacing: 0; + text-color: @normal-foreground; + padding: 2px; + children: [ prompt, textbox-prompt-sep, entry, case-indicator ]; +} + +case-indicator, +entry, +prompt, +button { + spacing: 0; + text-color: @normal-foreground; +} + +button.selected { + background-color: @selected-normal-background; + text-color: @selected-normal-foreground; +} + +textbox-prompt-sep { + expand: false; + str: ":"; + text-color: @normal-foreground; + margin: 0 0.3em 0 0; +} +element-text, element-icon { + background-color: inherit; + text-color: inherit; +} diff --git a/rofi/.config/rofi/gruvbox-dark-hard.rasi b/rofi/.config/rofi/gruvbox-dark-hard.rasi new file mode 100644 index 0000000..f09507e --- /dev/null +++ b/rofi/.config/rofi/gruvbox-dark-hard.rasi @@ -0,0 +1,62 @@ +/* ========================================================================== + Rofi color theme + + Based on the Gruvbox color scheme for Vim by morhetz + https://github.com/morhetz/gruvbox + + File: gruvbox-dark-hard.rasi + Desc: Gruvbox dark (hard contrast) color theme for Rofi + Author: bardisty + Source: https://github.com/bardisty/gruvbox-rofi + Modified: Mon Feb 12 2018 06:04:26 PST -0800 + ========================================================================== */ + +* { + /* Theme settings */ + highlight: bold italic; + scrollbar: true; + + /* Gruvbox dark colors */ + gruvbox-dark-bg0-hard: #1d2021; + gruvbox-dark-bg0: #282828; + gruvbox-dark-bg2: #504945; + gruvbox-dark-fg0: #fbf1c7; + gruvbox-dark-fg1: #ebdbb2; + gruvbox-dark-red-dark: #cc241d; + gruvbox-dark-red-light: #fb4934; + gruvbox-dark-yellow-dark: #d79921; + gruvbox-dark-yellow-light: #fabd2f; + gruvbox-dark-gray: #a89984; + + /* Theme colors */ + background: @gruvbox-dark-bg0-hard; + background-color: @background; + foreground: @gruvbox-dark-fg1; + border-color: @gruvbox-dark-gray; + separatorcolor: @border-color; + scrollbar-handle: @border-color; + + normal-background: @background; + normal-foreground: @foreground; + alternate-normal-background: @gruvbox-dark-bg0; + alternate-normal-foreground: @foreground; + selected-normal-background: @gruvbox-dark-bg2; + selected-normal-foreground: @gruvbox-dark-fg0; + + active-background: @gruvbox-dark-yellow-dark; + active-foreground: @background; + alternate-active-background: @active-background; + alternate-active-foreground: @active-foreground; + selected-active-background: @gruvbox-dark-yellow-light; + selected-active-foreground: @active-foreground; + + urgent-background: @gruvbox-dark-red-dark; + urgent-foreground: @background; + alternate-urgent-background: @urgent-background; + alternate-urgent-foreground: @urgent-foreground; + selected-urgent-background: @gruvbox-dark-red-light; + selected-urgent-foreground: @urgent-foreground; +} + +@import "gruvbox-common.rasi" + diff --git a/rofi/.config/rofi/sidebar-v2.rasi b/rofi/.config/rofi/sidebar-v2.rasi new file mode 100644 index 0000000..e0ee824 --- /dev/null +++ b/rofi/.config/rofi/sidebar-v2.rasi @@ -0,0 +1,125 @@ +/** + * ROFI Color theme + * User: Qball + * Copyright: Dave Davenport + */ + +* { + background-color: transparent; + // Bold, Italic, Underline + highlight: bold #ffffff; +} +window { + background-color: black / 80%; + border-color: white; + border-radius: 0 15mm 15mm 0; + + padding: 10mm; + + height: 100%; + width: 150mm; + border: 1mm 1mm 1mm 0px; + text-color: white; + + + location: west; + anchor: west; +} +inputbar { + background-color: transparent; + text-color: black; + children: [prompt, entry, textbox-end]; + spacing: 1mm; +} +prompt { + border-radius: 5mm 0mm 0mm 5mm; + width: 15mm; +} +textbox-end { + border-radius: 0mm 5mm 5mm 0mm; + width: 15mm; + expand: false; +} +entry { + background-color: grey; +} +prompt, entry, textbox-end, num-filtered-rows { + background-color: white; + text-color: inherit; + padding: 2mm; + vertical-align: 0.5; +} +element { + border-radius: 5mm; + children: [element-icon]; +} +textbox-current-entry { + border-radius: 5mm; + background-color: lightgreen; + text-color: black; + placeholder: "n/a"; + padding: 2mm; + horizontal-align: 0.5; + } +element-icon { + expand: true; + size: 10mm; + vertial-align: 0.5; + horizontal-align: 0.5; + padding: 2mm; +} + + +mainbox { + expand: true; + background-color: transparent; + spacing: 5mm; + children: [ + inputbar, + listview, + icon-current-entry, + textbox-current-entry + ]; +} +icon-current-entry { + size: 100mm; + } +listview { + padding: 0em; + dynamic: false; + lines: 0; + columns: 8; + flow: horizontal; +} +element selected normal { + background-color: MediumSlateBlue; +} +element normal active { + text-color: MediumTurquoise; +} +element normal urgent { + text-color: red; +} +element alternate normal { +} +element alternate active { + text-color: MediumTurquoise; +} +element alternate urgent { + text-color: MediumVioletRed; +} +element selected active { + background-color: MediumTurquoise; + text-color: black; +} +element selected urgent { + background-color: MediumVioletRed; + text-color: black; +} +error-message { + expand: true; + background-color: red; + border-color: darkred; + border: 2px; + padding: 1em; +} diff --git a/scripts/bin/ban_hackers b/scripts/bin/ban_hackers new file mode 100755 index 0000000..f8fd28f --- /dev/null +++ b/scripts/bin/ban_hackers @@ -0,0 +1,13 @@ +#!/bin/bash + +# File containing the IP addresses +IP_FILE="/home/dino/unique_ssh_hacker_ip_addresses.txt" + +# Loop through each IP address in the file and add an iptables rule to ban it +while IFS= read -r ip; do + sudo iptables -A INPUT -s "$ip" -j DROP +done < "$IP_FILE" + +# Save the iptables rules +sudo iptables-save + diff --git a/scripts/bin/big_screen_off b/scripts/bin/big_screen_off new file mode 100755 index 0000000..d06405f --- /dev/null +++ b/scripts/bin/big_screen_off @@ -0,0 +1,6 @@ +#!/bin/bash + +xrandr --output DP-2 --off +bspc monitor DP-0 -d 1 2 3 4 5 6 7 8 9 10 +pkill panel +panel &! diff --git a/scripts/bin/big_screen_on b/scripts/bin/big_screen_on new file mode 100755 index 0000000..3287b55 --- /dev/null +++ b/scripts/bin/big_screen_on @@ -0,0 +1,5 @@ +#/bin/bash +xrandr --output DP-2 --auto +setup_monitors +pkill panel +panel &! diff --git a/scripts/bin/cc_token_monitor b/scripts/bin/cc_token_monitor new file mode 100755 index 0000000..8353be4 --- /dev/null +++ b/scripts/bin/cc_token_monitor @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +while true; +do + cost=$(npx ccusage@latest daily --order desc --json | jq ".daily[0].modelBreakdowns[0].cost") + to_fifo "Q Claude Code Today: \$ $(printf '%.2f' "$cost")" + sleep 15 +done diff --git a/scripts/bin/chill b/scripts/bin/chill new file mode 100755 index 0000000..89459a8 --- /dev/null +++ b/scripts/bin/chill @@ -0,0 +1,9 @@ +#!/bin/bash + +set -x + +while true; do + ipmitool -I lanplus -H 192.168.50.138 -U USERID -P PASSW0RD raw 0x3a 0x07 0x01 0x12 0x01 + ipmitool -I lanplus -H 192.168.50.138 -U USERID -P PASSW0RD raw 0x3a 0x07 0x02 0x12 0x01 + sleep 2 +done diff --git a/scripts/bin/clear_partial_yay_cache b/scripts/bin/clear_partial_yay_cache new file mode 100755 index 0000000..dc95d3c --- /dev/null +++ b/scripts/bin/clear_partial_yay_cache @@ -0,0 +1,5 @@ +#!/bin/sh +# copy pasted from: https://gist.github.com/luukvbaal/2c697b5e068471ee989bff8a56507142 +yaycache="$(find /home/$USER/.cache/yay -maxdepth 1 -type d | awk '{ print "-c " $1 }' | tail -n +2)" +echo "==> Keep last 2 installed versions" +/usr/bin/paccache -rvk2 -c /var/cache/pacman/pkg $yaycache diff --git a/scripts/bin/fix_bluetooth b/scripts/bin/fix_bluetooth new file mode 100755 index 0000000..f191f1e --- /dev/null +++ b/scripts/bin/fix_bluetooth @@ -0,0 +1,8 @@ +#!/bin/bash + +sudo rmmod btusb +sudo rmmod btintel + +sudo modprobe btintel +sudo modprobe btusb + diff --git a/scripts/bin/geth-size b/scripts/bin/geth-size new file mode 100755 index 0000000..e553e08 --- /dev/null +++ b/scripts/bin/geth-size @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +du -sh /data4/geth-data-volume | grep -Po "\d{1,4}G" diff --git a/scripts/bin/list-efi-vars b/scripts/bin/list-efi-vars new file mode 100755 index 0000000..586fd11 --- /dev/null +++ b/scripts/bin/list-efi-vars @@ -0,0 +1,24 @@ +#!/usr/bin/python3 +import os + +efivars_path = '/sys/firmware/efi/efivars' + + + +for root, dirs, files in os.walk(efivars_path): + for efi_filename in files: + with open(os.path.join(root, efi_filename), mode='rb') as f: + print(efi_filename) + value = f.read() + try: + value = value.decode('utf-8') + print('STR:') + print(value) + except UnicodeDecodeError as exc: + # print(exc) + print('HEX:') + print(value.hex()) + + print('--------') + +# print(b'danaher'.hex()) diff --git a/scripts/bin/monitor_mi50_temp.sh b/scripts/bin/monitor_mi50_temp.sh new file mode 100755 index 0000000..0100d29 --- /dev/null +++ b/scripts/bin/monitor_mi50_temp.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash +# monitor_mi50_temp.sh +# Continuously monitor AMD MI50 GPU temperature + +set -euo pipefail + +# Check dependencies +if ! command -v rocm-smi &>/dev/null; then + echo "Error: rocm-smi not found. Install with: sudo pacman -S rocm-smi" + exit 1 +fi + +INTERVAL=${1:-5} # seconds between updates + +echo "Monitoring MI50 temperature every ${INTERVAL}s (press Ctrl+C to stop)" +echo "-------------------------------------------------------------" + +# Loop forever +while true; do + clear + date '+%Y-%m-%d %H:%M:%S' + echo "-------------------------------------------------------------" + + # Print temperature and power info + rocm-smi --showtemp --showpower --showfan --showvoltage | grep -E "GPU\[[0-9]+\]|Temperature|Power|Fan|Voltage" + + sleep "$INTERVAL" +done + diff --git a/scripts/bin/organize_media.py b/scripts/bin/organize_media.py index 9a7da85..a1ae40b 100755 --- a/scripts/bin/organize_media.py +++ b/scripts/bin/organize_media.py @@ -49,6 +49,7 @@ re.compile(r"^(?P\d{4}-\d{2}-\d{2})\s+\d{2}\.\d{2}\.\d{2}.*$", re.IGNORECASE), re.compile(r"^(VID|VIDEOPLAYER)-(?P\d{8})-.*$", re.IGNORECASE), re.compile(r"^IMG_(?P\d{8})_\d{6}.*$", re.IGNORECASE), + re.compile(r"VID_(?P\d{8})_\d{6}\..*$", re.IGNORECASE), ] # ── helpers ──────────────────────────────────────────────────────────────── # diff --git a/scripts/bin/pacman_future_conflit_check.py b/scripts/bin/pacman_future_conflit_check.py new file mode 100644 index 0000000..211455b --- /dev/null +++ b/scripts/bin/pacman_future_conflit_check.py @@ -0,0 +1,91 @@ +"""The following command checks which packages have a dependency on a given package checking through +all packages even though not installed locally: +pacman -Sii nodejs-lts-gallium | grep "Req" | sed -e 's/Required By : //g' + +This returns a string of packages separated by spaces and some prefix. + +This script does the same thing but then in python and tells you which packages you currently have +installed of those. This is inspired by getting "warning: removing 'nodejs' from target list because +it conflicts with 'nodejs-lts-gallium'" why trying to run pacman -Syu today. +The warning does not help, it should tell me where the warning is coming from. +""" + +import sys +import subprocess +from typing import List + + +def run(cmd: str, timeout=None) -> subprocess.CompletedProcess: + return subprocess.run(cmd, + shell=True, + stderr=subprocess.PIPE, + stdout=subprocess.PIPE, + universal_newlines=True, + timeout=timeout) + + +def query_required_by_for_package(package_name: str) -> List[str]: + """Returns list of 'Required By'-packages for which given package""" + + cmd = f'pacman -Sii {package_name} | grep "Required By" | tr -s \' \' | sed -e \'s/Required By : //g\'' + res = run(cmd) + packages: list = res.stdout.strip().split(' ') + return packages + + +def pacman_Qq() -> List[str]: + """Returns all installed packages""" + + cmd = 'pacman -Qq' + res = run(cmd) + packages: list = res.stdout.strip().split('\n') + return packages + + +def pacman_Sii_depends_on(package: str) -> List[str]: + """Returns 'Depends On'-packages based on package info from the database, so not based on + currently installed package so potentially there can be a difference, for instance when in the + next version a depends on is added/changed than this is only reflected by -Sii instead of -Qi + which looks only at currently installed. This also helps because it does not require you to have + the package already installed because it looks in the pacman database.""" + + cmd = f'pacman -Sii {package} | grep "Depends On" | tr -s \' \' | sed -e \'s/Depends On : //g\'' + res = run(cmd) + packages: list = res.stdout.strip().split(' ') + return packages + + +def find_out(package_name: str): + packages = query_required_by_for_package(given_package) + # print(packages) + + installed_packages = pacman_Qq() + # print(installed_packages) + + # intersection of installed packages and required-by-packages-for-given-package + intersection = set(packages).intersection(installed_packages) + + true_candidates = [] + + for candidate_pkg in intersection: + candidate_depends_on_pkgs = pacman_Sii_depends_on(candidate_pkg) + if candidate_depends_on_pkgs: + if given_package in candidate_depends_on_pkgs: + true_candidates.append(candidate_pkg) + + print( + f'for given package {given_package} these packages are currently installed for which (future or currently installed) versions depend on this package:' + ) + for true_candidate in true_candidates: + print(true_candidate) + + +if __name__ == "__main__": + try: + given_package = sys.argv[1] + except IndexError: + print(f'usage: python3 {__file__} ') + sys.exit(1) + + find_out(given_package) + sys.exit(0) diff --git a/scripts/bin/pushover b/scripts/bin/pushover new file mode 100755 index 0000000..ddc9723 --- /dev/null +++ b/scripts/bin/pushover @@ -0,0 +1,51 @@ +#!/usr/bin/env bash +# push/send message ios and android using API from my Linux box + +set -euo pipefail + +# Bash function to push notification to my iPhone +# yes you can push/send message android too using the same function +stdin_message="" +if [[ ! -t 0 ]]; then + stdin_message="$(cat)" +fi + +if [[ -n "$stdin_message" ]]; then + t="${1:-cli-app}" + m="$stdin_message" +elif [[ $# -eq 0 ]]; then + t="cli-app" + m="" +elif [[ $# -eq 1 ]]; then + t="cli-app" + m="$1" +else + t="$1" + m="$2" +fi + +if [[ -z "$m" ]]; then + printf 'Usage: %s [title] message\n' "$(basename "$0")" >&2 + printf ' or: command | %s [title]\n' "$(basename "$0")" >&2 + exit 2 +fi + +# Take env vars from ~/.pushover.env +env_file="$HOME/.pushover.env" + +if [[ -f "$env_file" ]]; then + # shellcheck disable=SC1090 + source "$env_file" +fi + +: "${PUSHOVER_TOKEN:?PUSHOVER_TOKEN is not set}" +: "${PUSHOVER_USER:?PUSHOVER_USER is not set}" + +if [[ -n "$m" ]]; then + curl -fsS \ + --form-string "token=${PUSHOVER_TOKEN}" \ + --form-string "user=${PUSHOVER_USER}" \ + --form-string "title=$t" \ + --form-string "message=$m" \ + https://api.pushover.net/1/messages.json +fi diff --git a/scripts/bin/tmux-fans.sh b/scripts/bin/tmux-fans.sh new file mode 100755 index 0000000..0e67c9c --- /dev/null +++ b/scripts/bin/tmux-fans.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Ensure we're inside tmux +if [[ -z "${TMUX:-}" ]]; then + echo "Please run this from inside an existing tmux session." >&2 + exit 1 +fi + +# Create a new window named "fans" +tmux new-window -n fans + +# Pane 1 (top-left): sensors watcher +tmux send-keys 'watch -n1 sensors it8792-isa-0a60' C-m + +# Split horizontally for Pane 2 (top-right): pwm3 watcher +tmux split-window -h +tmux send-keys 'watch -n0.1 -- cat /sys/class/hwmon/hwmon4/pwm3' C-m + +# Split Pane 1 vertically for Pane 3 (bottom-left): fancontrol (sudo) +tmux select-pane -L # go back to left/top pane +tmux split-window -v +tmux send-keys 'sudo fancontrol' C-m + +# Split Pane 2 vertically for Pane 4 (bottom-right): blank for typing +tmux select-pane -R # go to right/top pane +tmux split-window -v +# leave this pane blank for manual commands + +# Make it tidy +tmux select-layout tiled +tmux select-pane -L # put cursor on the blank pane (bottom-right after tiled may vary) + diff --git a/scripts/bin/volume-notification b/scripts/bin/volume-notification new file mode 100755 index 0000000..0b84dcb --- /dev/null +++ b/scripts/bin/volume-notification @@ -0,0 +1,22 @@ +#!/bin/bash + +# Get the current volume +VOLUME=$(pamixer --get-volume) + +# Send notification using dunst +dunstify -t 1000 -r 2593 -u low "Volume: ${VOLUME}%" + +# Update volume icon (optional) +if [ "$VOLUME" -eq 0 ]; then + ICON="audio-volume-muted" +elif [ "$VOLUME" -lt 30 ]; then + ICON="audio-volume-low" +elif [ "$VOLUME" -lt 70 ]; then + ICON="audio-volume-medium" +else + ICON="audio-volume-high" +fi + +# Send notification with an icon +dunstify -i "$ICON" -t 1000 -r 2593 -u low "Volume: ${VOLUME}%" + diff --git a/scripts/bin/wallpaper.sh b/scripts/bin/wallpaper.sh index ce16855..74290a6 100755 --- a/scripts/bin/wallpaper.sh +++ b/scripts/bin/wallpaper.sh @@ -1,5 +1,5 @@ #!/bin/bash while true; do - find -L /home/dino/dotfiles/wallpapers/Pictures/Wallpapers -maxdepth 1 -type f \( -name '*.jpg' -o -name '*.png' \) -print0 | shuf -n1 -z | xargs -0 -I {} feh --bg-fill "{}" + find -L ~/Pictures/Wallpapers -maxdepth 1 -type f \( -name '*.jpg' -o -name '*.png' \) -print0 | shuf -n1 -z | xargs -0 -I {} feh --bg-fill "{}" sleep 2m done diff --git a/sxhkd/.config/sxhkd/sxhkdrc b/sxhkd/.config/sxhkd/sxhkdrc index 771a875..2652c70 100644 --- a/sxhkd/.config/sxhkd/sxhkdrc +++ b/sxhkd/.config/sxhkd/sxhkdrc @@ -156,6 +156,9 @@ shift + alt + m super + n feh ~/mollie-retry-schema.png +super + r + bspc node @/ -R 90 + # Volume XF86Audio{RaiseVolume,LowerVolume,Mute} volumectl {up 2, down 2, toggle-mute}; \ diff --git a/xfiles/.xbindkeysrc b/xfiles/.xbindkeysrc index 5d192ca..10725e0 100644 --- a/xfiles/.xbindkeysrc +++ b/xfiles/.xbindkeysrc @@ -6,9 +6,9 @@ # b:9 # thumb wheel up => increase volume -"pactl set-sink-volume @DEFAULT_SINK@ +2%" - b:6 +# "pactl set-sink-volume @DEFAULT_SINK@ +2%" +# b:6 # thumb wheel down => lower volume -"pactl set-sink-volume @DEFAULT_SINK@ -2%" - b:7 +# "pactl set-sink-volume @DEFAULT_SINK@ -2%" +# b:7 diff --git a/zsh/.zshrc b/zsh/.zshrc index 6a6c2b5..883a206 100644 --- a/zsh/.zshrc +++ b/zsh/.zshrc @@ -1,5 +1,7 @@ # If you come from bash you might have to change your $PATH. # export PATH=$HOME/bin:/usr/local/bin:$PATH +export PATH="$HOME/.viazshrc:$PATH" + export PATH=$HOME/bin:$PATH:$HOME/.local/bin export ZSH="$HOME/.oh-my-zsh" @@ -108,3 +110,6 @@ fi . ~/bin/tmux-auto-window-name source $ZSH/oh-my-zsh.sh + +# opencode +export PATH=/home/dino/.opencode/bin:$PATH