Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Authorized key fixes #524

Merged
merged 2 commits into from
Jul 2, 2012
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
35 changes: 24 additions & 11 deletions library/authorized_key
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,12 @@ def get_params():
global msg

msg = "reading params"
with file(sys.argv[1]) as f: #read the args file
argfile = sys.argv[1]
try:
f = open(argfile,"r")
args = f.read()
finally:
f.close()

msg = "writing syslog."
syslog.openlog('ansible-%s' % os.path.basename(__file__))
Expand All @@ -91,22 +95,23 @@ def get_params():

return params

def keyfile(user, create=False):
def keyfile(user, write=False):
"""Calculate name of authorized keys file, optionally creating the
directories and file, properly setting permissions.

:param str user: name of user in passwd file
:param bool create: make directories and authorized key file if True
:param bool write: if True, write changes to authorized_keys file (creating directories if needed)
:return: full path string to authorized_keys for user
"""

global msg
msg = "Reading system user entry."
user_entry = pwd.getpwnam(user)
msg = "Calculating special directories"
homedir = user_entry.pw_dir
sshdir = join(homedir, ".ssh")
keysfile = join(sshdir, "authorized_keys")
if not create: return keysfile
if not write: return keysfile

#create directories and files for authorized keys
msg = "Reading user and group info."
Expand All @@ -118,8 +123,10 @@ def keyfile(user, create=False):
os.chmod(sshdir, 0700)
msg = "Touching authorized keys file."
if not exists( keysfile):
with file(keysfile, "w") as f:
f.write("#Authorized Keys File created by Ansible.")
try:
f = open(keysfile, "w") #touches file so we can set ownership and perms
finally:
f.close()
os.chown(keysfile, uid, gid)
os.chmod(keysfile, 0600)
return keysfile
Expand All @@ -128,15 +135,21 @@ def readkeys( filename):
global msg
msg = "Reading authorized_keys."
if not isfile(filename): return []
with file(filename) as f:
try:
f = open(filename)
keys = [line.rstrip() for line in f.readlines()]
finally:
f.close()
return keys

def writekeys( filename, keys):
global msg
msg = "Writing authorized_keys."
with file(filename,"w") as f:
try:
f = open(filename,"w")
f.writelines( (key + "\n" for key in keys) )
finally:
f.close()

def enforce_state( params):
"""Add or remove key.
Expand All @@ -153,19 +166,19 @@ def enforce_state( params):
state = params.get("state", "present")

#== check current state
params["keyfile"] = keyfile(user)
params["keyfile"] = keyfile(user, write=False) #just get the filename, don't create file
keys = readkeys( params["keyfile"])
present = key in keys

#== handle idempotent state=present
if state=="present":
if present: return False #nothing to do
keys.append(key)
writekeys(keyfile(user,create=True), keys)
writekeys(keyfile(user,write=True), keys)
elif state=="absent":
if not present: return False #nothing to do
keys.remove(key)
writekeys(keyfile(user,create=True), keys)
writekeys(keyfile(user,write=True), keys)
else:
msg = "Invalid param: state."
raise StandardError(msg)
Expand Down