dotfiles/emacs/.emacs.d/config/init-aws.el

73 lines
2.4 KiB
EmacsLisp

;; -*- lexical-binding: t; -*-
;; Manage AWS profiles
(defvar aws-profiles '("default")
"AWS profile names")
(defvar aws-current-profile nil
"Currently active AWS profile")
(defun aws-local-profile ()
(make-local-variable 'aws-current-profile))
(add-hook 'eshell-mode-hook #'aws-local-profile)
(add-hook 'vterm-mode-hook #'aws-local-profile)
(add-hook 'term-mode-hook #'aws-local-profile)
(defun aws-list-profiles ()
(when (not (executable-find "aws"))
(user-error "Unable to find executable \"aws\"!"))
(let ((profile-string (shell-command-to-string "aws configure list-profiles")))
(s-split "\n" profile-string)))
(defun aws-switch-profile (profile)
(interactive (list (completing-read "Profile: " (aws-list-profiles))))
(setenv "AWS_PROFILE" profile)
(when (eq major-mode 'vterm-mode)
(vterm-send-C-e)
(vterm-send-C-u)
(vterm-send-string (format "export AWS_PROFILE=%s\n" profile)))
(setq aws-current-profile profile))
(defun aws-sso-login ()
(interactive)
(async-shell-command "AWS_PROFILE=default aws sso login"))
(add-hook 'emacs-startup-hook
(lambda ()
(aws-switch-profile "default")))
;; A command to MFA to AWS
(defun aws-mfa (mfa-token)
(interactive (list
(let ((prompt (if aws-current-profile
(format "MFA code for %s: " aws-current-profile)
"MFA code: ")))
(read-from-minibuffer prompt))))
(let ((proc (start-process "aws-mfa"
"*aws-mfa*"
"aws-mfa"
"--force")))
(set-process-sentinel
proc
(make-success-err-msg-sentinel "*aws-mfa*"
"AWS MFA succeeded"
"AWS MFA failed, check *aws-mfa* buffer for details"))
(process-send-string proc (concat mfa-token "\n"))))
(define-minor-mode aws-modeline-mode
"Displays the current AWS profile in the modeline." :global t
(if aws-modeline-mode
(add-to-list 'mode-line-misc-info
'(:eval (format "AWS:%s " (or aws-current-profile "default"))))
(setq mode-line-misc-info
(delete '(:eval (format "AWS:%s " (or aws-current-profile "default")))
mode-line-misc-info))))
(add-hook 'after-init-hook #'aws-modeline-mode)
;; A dired interface to S3
(use-package s3ed
:commands (s3ed-find-file
s3ed-save-file))
(provide 'init-aws)