snapshot of https://github.com/zulip/zulip.git @ 48c69911c7dd4e03b20552eb3bd77ad8151c1357 (2026-09-15)
Some checks failed
Code scanning / CodeQL (push) Failing after 15s
Zulip production suite / Ubuntu 22.04 production build (push) Failing after 26s
Zulip production suite / Debian 12 production install with custom db name and user (push) Has been skipped
Zulip production suite / Ubuntu 22.04 production install and PostgreSQL upgrade with pgroonga (push) Has been skipped
Zulip production suite / Ubuntu 24.04 production install (push) Has been skipped
Zulip production suite / Ubuntu 26.04 production install (push) Has been skipped
Zulip production suite / Debian 13 production install (push) Has been skipped
Zulip production suite / 7.0 Version Upgrade (push) Has been skipped
Zulip production suite / 8.0 Version Upgrade (push) Has been skipped
Zulip production suite / 6.0 Version Upgrade (push) Has been skipped
Zulip production suite / 10.0 Version Upgrade (push) Has been skipped
Zulip production suite / 9.0 Version Upgrade (push) Has been skipped
Zulip production suite / 12.0 Version Upgrade (push) Has been skipped
Zulip production suite / 11.0 Version Upgrade (push) Has been skipped
GitHub Actions Security Analysis with zizmor / zizmor (push) Failing after 3s
Zulip CI / Debian 12 (Python 3.11, backend + documentation) (push) Failing after 26s
Zulip CI / Ubuntu 22.04 (Python 3.10, backend + frontend) (push) Failing after 3s
Zulip CI / Ubuntu 24.04 (Python 3.12, backend) (push) Failing after 25s
Zulip CI / Ubuntu 26.04 (Python 3.14, backend) (push) Failing after 25s
Zulip CI / Debian 13 (Python 3.13, backend) (push) Failing after 28s
Zulip production suite / Required jobs (push) Has been cancelled
Zulip CI / Required jobs (push) Has been cancelled
API Documentation Update Check / check-feature-level-updated (push) Has been cancelled
API Documentation Update Check / notify-if-api-docs-changed (push) Has been cancelled
Some checks failed
Code scanning / CodeQL (push) Failing after 15s
Zulip production suite / Ubuntu 22.04 production build (push) Failing after 26s
Zulip production suite / Debian 12 production install with custom db name and user (push) Has been skipped
Zulip production suite / Ubuntu 22.04 production install and PostgreSQL upgrade with pgroonga (push) Has been skipped
Zulip production suite / Ubuntu 24.04 production install (push) Has been skipped
Zulip production suite / Ubuntu 26.04 production install (push) Has been skipped
Zulip production suite / Debian 13 production install (push) Has been skipped
Zulip production suite / 7.0 Version Upgrade (push) Has been skipped
Zulip production suite / 8.0 Version Upgrade (push) Has been skipped
Zulip production suite / 6.0 Version Upgrade (push) Has been skipped
Zulip production suite / 10.0 Version Upgrade (push) Has been skipped
Zulip production suite / 9.0 Version Upgrade (push) Has been skipped
Zulip production suite / 12.0 Version Upgrade (push) Has been skipped
Zulip production suite / 11.0 Version Upgrade (push) Has been skipped
GitHub Actions Security Analysis with zizmor / zizmor (push) Failing after 3s
Zulip CI / Debian 12 (Python 3.11, backend + documentation) (push) Failing after 26s
Zulip CI / Ubuntu 22.04 (Python 3.10, backend + frontend) (push) Failing after 3s
Zulip CI / Ubuntu 24.04 (Python 3.12, backend) (push) Failing after 25s
Zulip CI / Ubuntu 26.04 (Python 3.14, backend) (push) Failing after 25s
Zulip CI / Debian 13 (Python 3.13, backend) (push) Failing after 28s
Zulip production suite / Required jobs (push) Has been cancelled
Zulip CI / Required jobs (push) Has been cancelled
API Documentation Update Check / check-feature-level-updated (push) Has been cancelled
API Documentation Update Check / notify-if-api-docs-changed (push) Has been cancelled
This commit is contained in:
73
tools/droplets/add_mentor.py
Normal file
73
tools/droplets/add_mentor.py
Normal file
@@ -0,0 +1,73 @@
|
||||
# Allows a mentor to ssh into a DigitalOcean droplet. This is designed to be
|
||||
# executed on the target machine.
|
||||
#
|
||||
# This script takes the username of the mentor as an argument:
|
||||
#
|
||||
# $ python3 add_mentor.py <mentor's username>
|
||||
#
|
||||
# Alternatively you can pass in --remove to remove their SSH key from the
|
||||
# machine:
|
||||
#
|
||||
# $ python3 add_mentor.py --remove <mentor's username>
|
||||
import os
|
||||
import re
|
||||
import socket
|
||||
import sys
|
||||
from argparse import ArgumentParser
|
||||
|
||||
import requests
|
||||
|
||||
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")
|
||||
|
||||
# Wrap keys with line comments for easier key removal.
|
||||
append_key = """\
|
||||
#<{username}>{{{{
|
||||
{key}
|
||||
#}}}}<{username}>
|
||||
"""
|
||||
|
||||
|
||||
def get_mentor_keys(username: str) -> list[str]:
|
||||
url = f"https://api.github.com/users/{username}/keys"
|
||||
|
||||
r = requests.get(url)
|
||||
if r.status_code != 200:
|
||||
print("Cannot connect to GitHub...")
|
||||
sys.exit(1)
|
||||
|
||||
keys = r.json()
|
||||
if not keys:
|
||||
print(f'Mentor "{username}" has no public key.')
|
||||
sys.exit(1)
|
||||
|
||||
return [key["key"] for key in keys]
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
args = parser.parse_args()
|
||||
authorized_keys = os.path.expanduser("~/.ssh/authorized_keys")
|
||||
|
||||
if args.remove:
|
||||
remove_re = re.compile(
|
||||
rf"#<{args.username}>{{{{.+}}}}<{args.username}>(\n)?", re.DOTALL | re.MULTILINE
|
||||
)
|
||||
|
||||
with open(authorized_keys, "r+") as f:
|
||||
old_content = f.read()
|
||||
new_content = re.sub(remove_re, "", old_content)
|
||||
f.seek(0)
|
||||
f.write(new_content)
|
||||
f.truncate()
|
||||
|
||||
print(f"Successfully removed {args.username}' SSH key!")
|
||||
|
||||
else:
|
||||
keys = get_mentor_keys(args.username)
|
||||
with open(authorized_keys, "a") as f:
|
||||
f.writelines(append_key.format(username=args.username, key=key) for key in keys)
|
||||
|
||||
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")
|
||||
Reference in New Issue
Block a user