2020-07-30 02:09:05 +02:00
|
|
|
# Allows a mentor to ssh into a DigitalOcean droplet. This is designed to be
|
2017-11-28 17:50:56 +01:00
|
|
|
# executed on the target machine.
|
|
|
|
#
|
|
|
|
# This script takes the username of the mentor as an argument:
|
|
|
|
#
|
|
|
|
# $ python3 add_mentor.py <mentor's username>
|
|
|
|
#
|
2020-10-23 02:43:28 +02:00
|
|
|
# Alternatively you can pass in --remove to remove their SSH key from the
|
2017-11-28 17:50:56 +01:00
|
|
|
# machine:
|
|
|
|
#
|
|
|
|
# $ python3 add_mentor.py --remove <mentor's username>
|
|
|
|
import os
|
2020-06-11 00:54:34 +02:00
|
|
|
import re
|
|
|
|
import socket
|
2017-11-28 17:50:56 +01:00
|
|
|
import sys
|
|
|
|
from argparse import ArgumentParser
|
|
|
|
from typing import List
|
|
|
|
|
|
|
|
import requests
|
|
|
|
|
2021-02-12 08:20:45 +01:00
|
|
|
parser = ArgumentParser(description="Give a mentor ssh access to this machine.")
|
|
|
|
parser.add_argument("username", help="GitHub username of the mentor.")
|
|
|
|
parser.add_argument("--remove", help="Remove his/her key from the machine.", action="store_true")
|
2017-11-28 17:50:56 +01:00
|
|
|
|
|
|
|
# Wrap keys with line comments for easier key removal.
|
|
|
|
append_key = """\
|
|
|
|
#<{username}>{{{{
|
|
|
|
{key}
|
|
|
|
#}}}}<{username}>
|
|
|
|
"""
|
|
|
|
|
2021-02-12 08:19:30 +01:00
|
|
|
|
2017-11-28 17:50:56 +01:00
|
|
|
def get_mentor_keys(username: str) -> List[str]:
|
2021-02-12 08:20:45 +01:00
|
|
|
url = f"https://api.github.com/users/{username}/keys"
|
2017-11-28 17:50:56 +01:00
|
|
|
|
|
|
|
r = requests.get(url)
|
|
|
|
if r.status_code != 200:
|
2021-02-12 08:20:45 +01:00
|
|
|
print("Cannot connect to GitHub...")
|
2017-11-28 17:50:56 +01:00
|
|
|
sys.exit(1)
|
|
|
|
|
|
|
|
keys = r.json()
|
|
|
|
if not keys:
|
2020-06-09 00:25:09 +02:00
|
|
|
print(f'Mentor "{username}" has no public key.')
|
2017-11-28 17:50:56 +01:00
|
|
|
sys.exit(1)
|
|
|
|
|
2021-02-12 08:20:45 +01:00
|
|
|
return [key["key"] for key in keys]
|
2017-11-28 17:50:56 +01:00
|
|
|
|
|
|
|
|
2021-02-12 08:20:45 +01:00
|
|
|
if __name__ == "__main__":
|
2017-11-28 17:50:56 +01:00
|
|
|
args = parser.parse_args()
|
2021-02-12 08:20:45 +01:00
|
|
|
authorized_keys = os.path.expanduser("~/.ssh/authorized_keys")
|
2017-11-28 17:50:56 +01:00
|
|
|
|
|
|
|
if args.remove:
|
2021-02-12 08:19:30 +01:00
|
|
|
remove_re = re.compile(
|
2023-08-03 00:28:59 +02:00
|
|
|
rf"#<{args.username}>{{{{.+}}}}<{args.username}>(\n)?", re.DOTALL | re.MULTILINE
|
2021-02-12 08:19:30 +01:00
|
|
|
)
|
2017-11-28 17:50:56 +01:00
|
|
|
|
2021-02-12 08:20:45 +01:00
|
|
|
with open(authorized_keys, "r+") as f:
|
2017-11-28 17:50:56 +01:00
|
|
|
old_content = f.read()
|
2021-02-12 08:20:45 +01:00
|
|
|
new_content = re.sub(remove_re, "", old_content)
|
2017-11-28 17:50:56 +01:00
|
|
|
f.seek(0)
|
|
|
|
f.write(new_content)
|
|
|
|
f.truncate()
|
|
|
|
|
2021-02-12 08:20:45 +01:00
|
|
|
print(f"Successfully removed {args.username}' SSH key!")
|
2017-11-28 17:50:56 +01:00
|
|
|
|
|
|
|
else:
|
|
|
|
keys = get_mentor_keys(args.username)
|
2021-02-12 08:20:45 +01:00
|
|
|
with open(authorized_keys, "a") as f:
|
2017-11-28 17:50:56 +01:00
|
|
|
for key in keys:
|
|
|
|
f.write(append_key.format(username=args.username, key=key))
|
|
|
|
|
2021-02-12 08:20:45 +01:00
|
|
|
print(f"Successfully added {args.username}'s SSH key!")
|
|
|
|
print("Can you let your mentor know that they can connect to this machine with:\n")
|
|
|
|
print(f" $ ssh zulipdev@{socket.gethostname()}\n")
|