Skip to content

Commit cce2d80

Browse files
committed
feat: add configurable check interval (AWS_SSO_REFRESH_INTERVAL)
- Add AWS_SSO_REFRESH_INTERVAL environment variable (default: 10m, min: 1m, max: 60m) - Pass both THRESHOLD and INTERVAL env vars to LaunchAgent for dynamic updates - Update status display to show actual interval from plist - Add validation for both configuration values - Update README with new configuration option - Bump version to 1.0.3
1 parent 630fff9 commit cce2d80

File tree

2 files changed

+105
-25
lines changed

2 files changed

+105
-25
lines changed

README.md

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ aws-sso-refresh status
4040
# Run a refresh check manually
4141
aws-sso-refresh
4242

43-
# Install the background daemon (runs every 10 minutes)
43+
# Install the background daemon (default: checks every 10 minutes)
4444
aws-sso-refresh install
4545

4646
# View the refresh log
@@ -83,7 +83,17 @@ By default, sessions are refreshed when they have less than 30 minutes remaining
8383
export AWS_SSO_REFRESH_THRESHOLD=60 # Refresh when < 60 minutes remaining
8484
```
8585

86-
Add this to your `~/.zshrc` or `~/.bashrc` to persist.
86+
### Check Interval
87+
88+
By default, the daemon checks sessions every 10 minutes. Customize this with:
89+
90+
```bash
91+
export AWS_SSO_REFRESH_INTERVAL=5 # Check every 5 minutes (min: 1, max: 60)
92+
```
93+
94+
**Note:** After changing these values, run `aws-sso-refresh uninstall` and `aws-sso-refresh install` to update the daemon configuration.
95+
96+
Add these exports to your `~/.zshrc` or `~/.bashrc` to persist them.
8797

8898
### AWS Config
8999

bin/aws-sso-refresh

Lines changed: 93 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,24 @@
66
# so you never hit "token expired" errors.
77
#
88
# Usage:
9-
# aws-sso-refresh Run refresh check (default)
10-
# aws-sso-refresh status Show all sessions with expiry times
11-
# aws-sso-refresh install Install and start the background daemon
12-
# aws-sso-refresh uninstall Remove the background daemon
13-
# aws-sso-refresh logs Tail the refresh log
14-
# aws-sso-refresh help Show this help message
9+
# aws-sso-refresh Show session status (default)
10+
# aws-sso-refresh status Show all sessions with expiry times
11+
# aws-sso-refresh refresh Check and refresh expiring sessions
12+
# aws-sso-refresh refresh -f Force refresh all sessions now
13+
# aws-sso-refresh install Install and start the background daemon
14+
# aws-sso-refresh uninstall Remove the background daemon
15+
# aws-sso-refresh logs Tail the refresh log
16+
# aws-sso-refresh help Show this help message
1517
#
1618

1719
set -eo pipefail
1820

1921
# Version
20-
VERSION="1.0.2"
22+
VERSION="1.0.3"
2123

2224
# Configuration
2325
REFRESH_THRESHOLD_MINUTES="${AWS_SSO_REFRESH_THRESHOLD:-30}"
26+
REFRESH_INTERVAL_MINUTES="${AWS_SSO_REFRESH_INTERVAL:-10}"
2427
SSO_CACHE_DIR="$HOME/.aws/sso/cache"
2528
AWS_CONFIG="$HOME/.aws/config"
2629
LOG_DIR="$HOME/.local/share/aws-sso-refresh"
@@ -54,6 +57,17 @@ if ((BASH_VERSINFO[0] < 4)); then
5457
exit 1
5558
fi
5659

60+
# Validate configuration
61+
if [[ $REFRESH_INTERVAL_MINUTES -lt 1 || $REFRESH_INTERVAL_MINUTES -gt 60 ]]; then
62+
echo "Error: AWS_SSO_REFRESH_INTERVAL must be between 1 and 60 minutes (got: $REFRESH_INTERVAL_MINUTES)"
63+
exit 1
64+
fi
65+
66+
if [[ $REFRESH_THRESHOLD_MINUTES -lt 1 ]]; then
67+
echo "Error: AWS_SSO_REFRESH_THRESHOLD must be at least 1 minute (got: $REFRESH_THRESHOLD_MINUTES)"
68+
exit 1
69+
fi
70+
5771
# Ensure log directory exists
5872
mkdir -p "$LOG_DIR"
5973

@@ -175,9 +189,11 @@ get_session_info() {
175189
}
176190

177191
# Check and refresh a single session
192+
# Args: cache_file session_name [force]
178193
check_and_refresh_session() {
179194
local cache_file="$1"
180195
local session_name="$2"
196+
local force="${3:-false}"
181197

182198
# Parse the cache file
183199
local expires_at
@@ -194,7 +210,15 @@ check_and_refresh_session() {
194210
minutes_until_expiry=$((seconds_until_expiry / 60))
195211

196212
# Check if we need to refresh
197-
if [[ $minutes_until_expiry -le $REFRESH_THRESHOLD_MINUTES ]]; then
213+
if [[ "$force" == "true" ]]; then
214+
log "Session '$session_name' force refresh requested (${minutes_until_expiry}m remaining). Refreshing..."
215+
# Perform the refresh
216+
if aws sso login --sso-session "$session_name" 2>&1 | tee -a "$LOG_FILE"; then
217+
log "Successfully refreshed session '$session_name'"
218+
else
219+
log "ERROR: Failed to refresh session '$session_name'"
220+
fi
221+
elif [[ $minutes_until_expiry -le $REFRESH_THRESHOLD_MINUTES ]]; then
198222
if [[ $minutes_until_expiry -le 0 ]]; then
199223
log "Session '$session_name' has EXPIRED. Refreshing..."
200224
else
@@ -217,7 +241,26 @@ check_and_refresh_session() {
217241
# ============================================================================
218242

219243
cmd_refresh() {
220-
log "=== AWS SSO Refresh Check Starting ==="
244+
local force="false"
245+
246+
# Parse flags
247+
while [[ $# -gt 0 ]]; do
248+
case "$1" in
249+
-f|--force)
250+
force="true"
251+
shift
252+
;;
253+
*)
254+
shift
255+
;;
256+
esac
257+
done
258+
259+
if [[ "$force" == "true" ]]; then
260+
log "=== AWS SSO Force Refresh Starting ==="
261+
else
262+
log "=== AWS SSO Refresh Check Starting ==="
263+
fi
221264

222265
# Build the URL -> session name mapping
223266
build_session_map
@@ -249,7 +292,7 @@ cmd_refresh() {
249292
continue
250293
fi
251294

252-
check_and_refresh_session "$cache_file" "$session_name"
295+
check_and_refresh_session "$cache_file" "$session_name" "$force"
253296

254297
# Mark session as checked
255298
checked_sessions["$session_name"]=1
@@ -305,7 +348,15 @@ cmd_status() {
305348
else
306349
echo -e "${BOLD}Daemon:${NC} ${GREEN}loaded${NC} (waiting for next interval)"
307350
fi
308-
echo -e "${BOLD}Interval:${NC} every 10 minutes"
351+
# Read interval from plist if it exists, otherwise use current config
352+
local interval_seconds interval_minutes
353+
if [[ -f "$PLIST_PATH" ]]; then
354+
interval_seconds=$(defaults read "$PLIST_PATH" StartInterval 2>/dev/null || echo "600")
355+
interval_minutes=$((interval_seconds / 60))
356+
echo -e "${BOLD}Interval:${NC} every ${interval_minutes}m"
357+
else
358+
echo -e "${BOLD}Interval:${NC} every ${REFRESH_INTERVAL_MINUTES}m"
359+
fi
309360
echo -e "${BOLD}Threshold:${NC} refresh when < ${REFRESH_THRESHOLD_MINUTES}m remaining"
310361
else
311362
echo -e "${BOLD}Daemon:${NC} ${YELLOW}not installed${NC}"
@@ -334,6 +385,9 @@ cmd_install() {
334385
exit 1
335386
fi
336387

388+
# Calculate interval in seconds
389+
local interval_seconds=$((REFRESH_INTERVAL_MINUTES * 60))
390+
337391
# Create plist
338392
cat > "$PLIST_PATH" << EOF
339393
<?xml version="1.0" encoding="UTF-8"?>
@@ -347,10 +401,11 @@ cmd_install() {
347401
<array>
348402
<string>${bash_path}</string>
349403
<string>${script_path}</string>
404+
<string>refresh</string>
350405
</array>
351406
352407
<key>StartInterval</key>
353-
<integer>600</integer>
408+
<integer>${interval_seconds}</integer>
354409
355410
<key>RunAtLoad</key>
356411
<true/>
@@ -359,6 +414,10 @@ cmd_install() {
359414
<dict>
360415
<key>PATH</key>
361416
<string>/usr/local/bin:/usr/bin:/bin:/opt/homebrew/bin</string>
417+
<key>AWS_SSO_REFRESH_THRESHOLD</key>
418+
<string>${REFRESH_THRESHOLD_MINUTES}</string>
419+
<key>AWS_SSO_REFRESH_INTERVAL</key>
420+
<string>${REFRESH_INTERVAL_MINUTES}</string>
362421
</dict>
363422
364423
<key>StandardOutPath</key>
@@ -379,7 +438,7 @@ EOF
379438
echo -e "${GREEN}Daemon installed successfully!${NC}"
380439
echo ""
381440
echo "The daemon will:"
382-
echo " • Run every 10 minutes"
441+
echo " • Run every ${REFRESH_INTERVAL_MINUTES} minutes"
383442
echo " • Refresh sessions expiring within ${REFRESH_THRESHOLD_MINUTES} minutes"
384443
echo " • Log to $LOG_FILE"
385444
echo ""
@@ -427,26 +486,36 @@ cmd_help() {
427486
echo "Automatically refresh AWS SSO sessions before they expire."
428487
echo ""
429488
echo -e "${BOLD}USAGE:${NC}"
430-
echo " aws-sso-refresh [COMMAND]"
489+
echo " aws-sso-refresh [COMMAND] [OPTIONS]"
431490
echo ""
432491
echo -e "${BOLD}COMMANDS:${NC}"
433-
echo " (none) Run refresh check now"
492+
echo " (none) Show session status (default)"
434493
echo " status Show all sessions with expiry times"
494+
echo " refresh Check and refresh expiring sessions"
435495
echo " install Install and start the background daemon"
436496
echo " uninstall Remove the background daemon"
437497
echo " logs Follow the refresh log"
438498
echo " help Show this help message"
439499
echo " version Show version"
440500
echo ""
501+
echo -e "${BOLD}OPTIONS:${NC}"
502+
echo " -f, --force Force refresh all sessions (use with 'refresh')"
503+
echo ""
441504
echo -e "${BOLD}CONFIGURATION:${NC}"
442505
echo " Set AWS_SSO_REFRESH_THRESHOLD to change the refresh threshold"
443506
echo " (default: 30 minutes before expiry)"
444507
echo ""
445-
echo " Example: export AWS_SSO_REFRESH_THRESHOLD=60"
508+
echo " Set AWS_SSO_REFRESH_INTERVAL to change how often to check"
509+
echo " (default: 10 minutes, min: 1, max: 60)"
510+
echo ""
511+
echo " Examples:"
512+
echo " export AWS_SSO_REFRESH_THRESHOLD=5 # Refresh 5m before expiry"
513+
echo " export AWS_SSO_REFRESH_INTERVAL=5 # Check every 5 minutes"
446514
echo ""
447515
echo -e "${BOLD}EXAMPLES:${NC}"
448-
echo " aws-sso-refresh # Check and refresh expiring sessions"
449-
echo " aws-sso-refresh status # See all session statuses"
516+
echo " aws-sso-refresh # Show session status"
517+
echo " aws-sso-refresh refresh # Check and refresh expiring sessions"
518+
echo " aws-sso-refresh refresh -f # Force refresh all sessions now"
450519
echo " aws-sso-refresh install # Enable automatic background refresh"
451520
echo " aws-sso-refresh logs # Watch the refresh log"
452521
echo ""
@@ -467,12 +536,16 @@ cmd_version() {
467536
# ============================================================================
468537

469538
main() {
470-
local command="${1:-refresh}"
539+
local command="${1:-status}"
471540

472541
case "$command" in
473-
status)
542+
status|"")
474543
cmd_status
475544
;;
545+
refresh)
546+
shift
547+
cmd_refresh "$@"
548+
;;
476549
install)
477550
cmd_install
478551
;;
@@ -488,9 +561,6 @@ main() {
488561
version|--version|-v)
489562
cmd_version
490563
;;
491-
refresh|"")
492-
cmd_refresh
493-
;;
494564
*)
495565
echo -e "${RED}Unknown command: $command${NC}"
496566
echo ""

0 commit comments

Comments
 (0)