dotfiles/scripts/jj
rpriven 5b6af65def
Organize scripts and clean up dotfiles
Changes:
- Added 80+ scripts with organized structure
  - payloads/ for third-party pentesting tools
  - pentesting/ for custom security scripts
  - Daily drivers remain flat for fast access
- Converted wes() function to proper script
- Removed .sh extensions from pentesting scripts
- Cleaned up aliases (removed 31 redundant lines)
- Added kanata/, build artifacts to gitignore
- Removed old fre.sh scripts and empty a.out
- Updated configs: helix, tmux, zsh, ulauncher, redshift

Security: All sensitive data excluded via gitignore
2025-11-07 14:48:21 -07:00

219 lines
5.1 KiB
Bash
Executable file

#!/usr/bin/env bash
set -euo pipefail
# Script Name: jj
# Description: JSON formatting and querying tool (upgrade from alias)
# Usage: jj # Format clipboard JSON
# jj '.users[0].name' # jq query on clipboard
# jj -v # Validate JSON
# jj -f file.json # Format file in place
# jj -c # Compact JSON (remove whitespace)
# cat file.json | jj # Format from stdin
VERSION="1.0.0"
show_help() {
echo -e "\033[1mjj\033[0m - JSON Formatting & Querying Tool v${VERSION}"
echo
echo -e "\033[1mUSAGE:\033[0m"
echo " jj [OPTIONS] [JQ_QUERY]"
echo
echo -e "\033[1mOPTIONS:\033[0m"
echo -e " \033[0;36m-v, --validate\033[0m Validate JSON only (no output)"
echo -e " \033[0;36m-f, --file\033[0m Format file in place"
echo -e " \033[0;36m-c, --compact\033[0m Compact JSON (remove whitespace)"
echo -e " \033[0;36m-i, --stdin\033[0m Read from stdin instead of clipboard"
echo -e " \033[0;36m-o, --output\033[0m Write to clipboard (default: stdout)"
echo -e " \033[0;36m-h, --help\033[0m Show this help message"
echo
echo -e "\033[1mEXAMPLES:\033[0m"
echo " jj # Format clipboard JSON"
echo " jj '.users[0].name' # Query clipboard with jq"
echo " jj -v # Validate clipboard JSON"
echo " jj -f data.json # Format file in place"
echo " jj -c # Compact clipboard JSON"
echo " cat file.json | jj # Format from stdin"
echo " curl api.com | jj '.data' # Query API response"
echo
echo -e "\033[1mNOTE:\033[0m"
echo " Requires jq to be installed for querying"
}
# Clipboard functions
clip_get() {
if command -v xsel &>/dev/null; then
xsel --output --clipboard
elif command -v xclip &>/dev/null; then
xclip -selection clipboard -o
else
echo "Error: No clipboard tool found" >&2
return 1
fi
}
clip_set() {
if command -v xsel &>/dev/null; then
xsel --input --clipboard
elif command -v xclip &>/dev/null; then
xclip -selection clipboard
else
echo "Error: No clipboard tool found" >&2
return 1
fi
}
# Get input (clipboard or stdin)
get_input() {
if [[ "${use_stdin}" == "true" ]] || [[ ! -t 0 ]]; then
# Use stdin if explicitly requested OR if stdin is not a terminal (piped)
cat
else
clip_get
fi
}
# Validate JSON
validate_json() {
local input=$1
if echo "$input" | jq empty 2>/dev/null; then
echo -e "\033[0;32m✓\033[0m Valid JSON"
return 0
else
echo -e "\033[0;31m✗\033[0m Invalid JSON:" >&2
echo "$input" | jq empty 2>&1 | sed 's/^/ /' >&2
return 1
fi
}
# Format JSON (pretty print)
format_json() {
local input=$1
echo "$input" | jq .
}
# Compact JSON
compact_json() {
local input=$1
echo "$input" | jq -c .
}
# Query JSON with jq
query_json() {
local input=$1
local query=$2
echo "$input" | jq "$query"
}
# Parse arguments
mode="format"
use_stdin=false
to_clipboard=false
file_path=""
jq_query=""
while [[ $# -gt 0 ]]; do
case $1 in
-v|--validate)
mode="validate"
shift
;;
-f|--file)
mode="file"
file_path="$2"
shift 2
;;
-c|--compact)
mode="compact"
shift
;;
-i|--stdin)
use_stdin=true
shift
;;
-o|--output)
to_clipboard=true
shift
;;
-h|--help)
show_help
exit 0
;;
*)
# Assume it's a jq query
jq_query="$1"
mode="query"
shift
;;
esac
done
# Check if jq is installed
if ! command -v jq &>/dev/null; then
echo -e "\033[0;31mError:\033[0m jq is not installed" >&2
echo "Install it with: sudo apt install jq" >&2
exit 1
fi
# Main logic
case "$mode" in
validate)
input=$(get_input)
validate_json "$input"
;;
file)
if [[ ! -f "$file_path" ]]; then
echo -e "\033[0;31mError:\033[0m File not found: $file_path" >&2
exit 1
fi
# Validate first
if ! jq empty "$file_path" 2>/dev/null; then
echo -e "\033[0;31mError:\033[0m Invalid JSON in file" >&2
jq empty "$file_path" 2>&1 | sed 's/^/ /' >&2
exit 1
fi
# Format in place
temp_file=$(mktemp)
jq . "$file_path" > "$temp_file"
mv "$temp_file" "$file_path"
echo -e "\033[0;32m✓\033[0m Formatted: $file_path"
;;
compact)
input=$(get_input)
output=$(compact_json "$input")
if [[ "$to_clipboard" == "true" ]]; then
echo -n "$output" | clip_set
echo -e "\033[0;32m✓\033[0m Copied compacted JSON to clipboard"
else
echo "$output"
fi
;;
query)
input=$(get_input)
output=$(query_json "$input" "$jq_query")
if [[ "$to_clipboard" == "true" ]]; then
echo -n "$output" | clip_set
echo -e "\033[0;32m✓\033[0m Copied query result to clipboard"
else
echo "$output"
fi
;;
format)
input=$(get_input)
output=$(format_json "$input")
if [[ "$to_clipboard" == "true" ]]; then
echo -n "$output" | clip_set
echo -e "\033[0;32m✓\033[0m Copied formatted JSON to clipboard"
else
echo "$output"
fi
;;
esac