返回 last30days-skill
setup-pass.sh
根目录 / skills / last30days / scripts / setup-pass.sh
1 #!/usr/bin/env bash
2 # Store last30days API keys in a pass(1) store.
3 #
4 # Keys are stored at pass path `last30days/<KEY>` (the Linux/Unix analog of the
5 # Keychain `last30days-<KEY>` convention). The lib/env.py loader picks them up
6 # automatically as a lowest-priority credential source wherever `pass` exists.
7 # Honors PASSWORD_STORE_DIR; override the path prefix with LAST30DAYS_PASS_PREFIX
8 # (must match what the loader uses).
9 #
10 # Usage:
11 # ./setup-pass.sh # interactive: prompts for each key
12 # ./setup-pass.sh KEY [KEY..] # prompt only for the listed keys
13 # ./setup-pass.sh --list # list which last30days/* entries exist
14 # ./setup-pass.sh --delete KEY # remove a stored key
15 #
16 # Existing values are shown as "(set)" and skipped unless --replace is passed.
17 # Skip any prompt with empty input.
18
19 set -euo pipefail
20
21 PREFIX="${LAST30DAYS_PASS_PREFIX:-last30days/}"
22 # Mirrors lib/env.py::KEYCHAIN_KEYS — kept in sync via
23 # tests/test_env_pass.py::test_pass_keys_match_setup_script.
24 ALL_KEYS=(
25 OPENAI_API_KEY
26 XAI_API_KEY
27 GOOGLE_API_KEY
28 GEMINI_API_KEY
29 GOOGLE_GENAI_API_KEY
30 SCRAPECREATORS_API_KEY
31 APIFY_API_TOKEN
32 AUTH_TOKEN
33 CT0
34 BSKY_HANDLE
35 BSKY_APP_PASSWORD
36 TRUTHSOCIAL_TOKEN
37 BRAVE_API_KEY
38 EXA_API_KEY
39 SERPER_API_KEY
40 OPENROUTER_API_KEY
41 PERPLEXITY_API_KEY
42 PARALLEL_API_KEY
43 XQUIK_API_KEY
44 XIAOHONGSHU_API_BASE
45 GITHUB_TOKEN
46 BRIGHTDATA_API_KEY
47 X_BEARER_TOKEN
48 )
49
50 REPLACE=0
51 ACTION="prompt"
52 TARGETS=()
53
54 while [[ $# -gt 0 ]]; do
55 case "$1" in
56 --list) ACTION="list"; shift ;;
57 --delete) ACTION="delete"; shift ;;
58 --replace) REPLACE=1; shift ;;
59 --help|-h) sed -n '2,/^$/p' "$0" | sed 's/^# //; s/^#//'; exit 0 ;;
60 -*) echo "unknown flag: $1" >&2; exit 2 ;;
61 *) TARGETS+=("$1"); shift ;;
62 esac
63 done
64
65 # Checked after flag parsing so `--help` works on a box without pass installed.
66 if ! command -v pass >/dev/null 2>&1; then
67 echo "setup-pass.sh requires the pass(1) password manager (not found on PATH)." >&2
68 exit 1
69 fi
70
71 case "$ACTION" in
72 list)
73 echo "Stored ${PREFIX}* pass entries:"
74 for key in "${ALL_KEYS[@]}"; do
75 if pass show "${PREFIX}${key}" >/dev/null 2>&1; then
76 echo " $key"
77 fi
78 done
79 exit 0
80 ;;
81 delete)
82 if [[ ${#TARGETS[@]} -eq 0 ]]; then
83 echo "--delete needs at least one KEY name" >&2; exit 2
84 fi
85 for key in "${TARGETS[@]}"; do
86 if pass rm -f "${PREFIX}${key}" >/dev/null 2>&1; then
87 echo "deleted: $key"
88 else
89 echo "not found: $key"
90 fi
91 done
92 exit 0
93 ;;
94 esac
95
96 if [[ ${#TARGETS[@]} -eq 0 ]]; then
97 TARGETS=("${ALL_KEYS[@]}")
98 fi
99
100 added=0; skipped=0; replaced=0
101 for key in "${TARGETS[@]}"; do
102 if pass show "${PREFIX}${key}" >/dev/null 2>&1; then
103 existing=1
104 else
105 existing=0
106 fi
107 if [[ "$existing" -eq 1 && "$REPLACE" -eq 0 ]]; then
108 printf " %-28s (set, skipping — use --replace to overwrite)\n" "$key"
109 skipped=$((skipped + 1))
110 continue
111 fi
112 printf " %-28s " "$key"
113 IFS= read -rs value
114 echo
115 if [[ -z "$value" ]]; then
116 skipped=$((skipped + 1))
117 continue
118 fi
119 # Don't let one failed insert (gpg misconfig, missing store key, disk) abort
120 # the whole batch under `set -e`; report it and move on.
121 if ! printf '%s\n' "$value" | pass insert -m -f "${PREFIX}${key}" >/dev/null; then
122 echo " failed: $key (pass insert error)" >&2
123 skipped=$((skipped + 1))
124 continue
125 fi
126 if [[ "$existing" -eq 1 ]]; then
127 replaced=$((replaced + 1))
128 else
129 added=$((added + 1))
130 fi
131 done
132
133 echo
134 echo "Done. added=$added replaced=$replaced skipped=$skipped"
135 echo "Verify with: $0 --list"
136
136 lines BASH