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
1719set -eo pipefail
1820
1921# Version
20- VERSION=" 1.0.2 "
22+ VERSION=" 1.0.3 "
2123
2224# Configuration
2325REFRESH_THRESHOLD_MINUTES=" ${AWS_SSO_REFRESH_THRESHOLD:- 30} "
26+ REFRESH_INTERVAL_MINUTES=" ${AWS_SSO_REFRESH_INTERVAL:- 10} "
2427SSO_CACHE_DIR=" $HOME /.aws/sso/cache"
2528AWS_CONFIG=" $HOME /.aws/config"
2629LOG_DIR=" $HOME /.local/share/aws-sso-refresh"
@@ -54,6 +57,17 @@ if ((BASH_VERSINFO[0] < 4)); then
5457 exit 1
5558fi
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
5872mkdir -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]
178193check_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
219243cmd_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>
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
469538main () {
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