485f025a5171a0721bb0cb10c3676f96393715f3
[shellsnippets/shellsnippets.git] / posix / sysadmin / agents.sh
1 # $Id: agents.sh 4522 2015-09-08 12:36:52Z tglase $
2 #-
3 # Copyright © 2009, 2012, 2015
4 #       Thorsten Glaser <t.glaser@tarent.de>
5 #
6 # Provided that these terms and disclaimer and all copyright notices
7 # are retained or reproduced in an accompanying document, permission
8 # is granted to deal in this work without restriction, including un‐
9 # limited rights to use, publicly perform, distribute, sell, modify,
10 # merge, give away, or sublicence.
11 #
12 # This work is provided “AS IS” and WITHOUT WARRANTY of any kind, to
13 # the utmost extent permitted by applicable law, neither express nor
14 # implied; without malicious intent or gross negligence. In no event
15 # may a licensor, author or contributor be held liable for indirect,
16 # direct, other damage, loss, or other issues arising in any way out
17 # of dealing in the work, even if advised of the possibility of such
18 # damage or existence of a defect, except proven that it results out
19 # of said person’s immediate fault when using the work as intended.
20 #-
21 # /etc/profile.d/agents.sh (sourced by /etc/profile on Debian and derivates)
22 # • install gpg and ssh skeleton files
23 # • load gpg-agent and ssh-agent, unless already there
24
25 test -n "$USER_ID" || USER_ID=$(id -u)
26 mkdir -p "$HOME/.ssh" "$HOME/.gnupg"
27 chmod 0700 "$HOME/.ssh" "$HOME/.gnupg"
28
29 for PID_FILE in .gnupg/gpg.conf .gnupg/gpg-agent.conf .ssh/config; do
30         test -s /etc/skel/$PID_FILE || continue
31
32         # list of known MD5 hashes of templates deployed by us
33         # + note the spaces at beginning and end of md5list! +
34         case $PID_FILE in
35         .gnupg/gpg.conf)
36                 _md5list=" 2b7d7e47afb59ec164cf0ab512bb4ddc c8b796ed85a79e458a564645dcf38281 d5c4f4335d1eab08bfc9afe7ab494801 e6af3b74078a49db14f2f79fa82b7d3a 1f5d00be735cd1b1a57960c0128d2368 e51c210618d7dbc93c63e456d4dd4af1 7dfefaad0f417b7f50da1d80f8f0759b 07826f04f9e3b700e0f45da360d25877 "
37                 ;;
38         .gnupg/gpg-agent.conf)
39                 _md5list=" e7e9b7940f07c3cb447b30da27914f8d "
40                 ;;
41         *)
42                 _md5list=
43                 ;;
44         esac
45
46         if test -s "$HOME/$PID_FILE"; then
47                 _md5=$( (fgrep -v '$Id' "$HOME/$PID_FILE" | md5sum) 2>&1 || \
48                     echo fail)
49                 case $_md5list in
50                 *\ ${_md5%% *}\ *)
51                         # MD5 matches, remove file
52                         rm -f "$HOME/$PID_FILE"
53                         ;;
54                 *)
55                         # MD5 does not match, do not touch file
56                         continue
57                         ;;
58                 esac
59         fi
60
61         # file does not exist or was removed by us, install template
62         cp /etc/skel/$PID_FILE "$HOME/$PID_FILE"
63         chmod 0600 "$HOME/$PID_FILE"
64 done
65 unset _md5
66 unset _md5list
67
68 PID_FILE="/dev/shm/.ssh-$USER_ID"
69 test -n "$SSH_AGENT_PID" || test -z "$SSH_CONNECTION" || SSH_AGENT_PID=fwd
70 if test -n "$SSH_AUTH_SOCK"; then
71         test -S "$SSH_AUTH_SOCK" || SSH_AGENT_PID=
72 else
73         SSH_AGENT_PID=
74 fi
75 if test -z "$SSH_AGENT_PID" && \
76     test -d "$PID_FILE/." && test -O "$PID_FILE/." && \
77     test -s "$PID_FILE/info" && test -O "$PID_FILE/info"; then
78         chmod -R go-rwx "$PID_FILE"
79         . "$PID_FILE/info"
80 fi
81 if test -z "$SSH_AUTH_SOCK" || test -z "$SSH_AGENT_PID" || \
82     test \! -S "$SSH_AUTH_SOCK"; then
83         unset SSH_AUTH_SOCK SSH_AGENT_PID
84         eval $(ssh-agent -s)
85 fi
86 if test -d "$PID_FILE/." && test -O "$PID_FILE/."; then
87         : wonderful
88 else
89         rm -rf "$PID_FILE"
90         mkdir -p "$PID_FILE" && test -d "$PID_FILE/." && \
91             test -O "$PID_FILE/." && chmod -R go-rwx "$PID_FILE" || \
92             rm -rf "$PID_FILE"
93 fi
94 if test -d "$PID_FILE/." && test -O "$PID_FILE/."; then
95         rm -f "$PID_FILE/info"
96         :>"$PID_FILE/info"
97         chmod 0600 "$PID_FILE/info"
98 fi
99 if test -f "$PID_FILE/info" && test -O "$PID_FILE/info" &&
100     test -n "$SSH_AGENT_PID" && test -n "$SSH_AUTH_SOCK"; then
101         echo "SSH_AGENT_PID=$SSH_AGENT_PID" >>"$PID_FILE/info"
102         echo "SSH_AUTH_SOCK=$SSH_AUTH_SOCK" >>"$PID_FILE/info"
103         export SSH_AUTH_SOCK SSH_AGENT_PID
104 else
105         rm -f "$PID_FILE/info"
106         unset SSH_AUTH_SOCK SSH_AGENT_PID
107 fi
108
109 : "${GNUPGHOME:=$HOME/.gnupg}"
110 GPG_TTY=$(tty); export GPG_TTY
111 find_gpg_agent() {
112         local PID_FILE="$GNUPGHOME/gpg-agent-info-$(hostname)"
113
114         test -d "$GNUPGHOME" || return 0
115         export GNUPGHOME
116
117         test -n "$GPG_AGENT_INFO" && test -S "${GPG_AGENT_INFO%%:*}" && \
118             gpg-agent 2>/dev/null && return 0
119
120         unset GPG_AGENT_INFO
121         if test -s "$PID_FILE"; then
122                 . "$PID_FILE"
123                 export GPG_AGENT_INFO
124                 test -n "$GPG_AGENT_INFO" && \
125                     test -S "${GPG_AGENT_INFO%%:*}" && \
126                     gpg-agent 2>/dev/null && return 0
127                 rm -f "$PID_FILE"
128         fi
129
130         unset GPG_AGENT_INFO
131         eval $(gpg-agent --daemon --sh)
132         : "${GPG_AGENT_INFO:=$GNUPGHOME/S.gpg-agent:0:1}"
133         export GPG_AGENT_INFO
134         if test -n "$GPG_AGENT_INFO" && test -S "${GPG_AGENT_INFO%%:*}" && \
135             gpg-agent 2>/dev/null; then
136                 echo "GPG_AGENT_INFO=$GPG_AGENT_INFO" >"$PID_FILE"
137                 return 0
138         fi
139
140         unset GPG_AGENT_INFO
141         return 0
142 }
143 find_gpg_agent
144 unset -f find_gpg_agent
145
146 :