-
Notifications
You must be signed in to change notification settings - Fork 49
Rework SSH key handling and configuration #76
base: master
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -15,8 +15,8 @@ | |
| from queue import Queue | ||
| import os | ||
| import subprocess | ||
| from .git_helper import SSH_KEY_FILE | ||
| import shlex | ||
| import tempfile | ||
|
|
||
| STATUS_TO_PRIORITY = { | ||
| 'success': 0, | ||
|
|
@@ -453,12 +453,6 @@ def init_local_git_cmds(repo_cfg, git_cfg): | |
| fpath = 'cache/{}/{}'.format(repo_cfg['owner'], repo_cfg['name']) | ||
| url = '[email protected]:{}/{}.git'.format(repo_cfg['owner'], repo_cfg['name']) | ||
|
|
||
| if not os.path.exists(SSH_KEY_FILE): | ||
| os.makedirs(os.path.dirname(SSH_KEY_FILE), exist_ok=True) | ||
| with open(SSH_KEY_FILE, 'w') as fp: | ||
| fp.write(git_cfg['ssh_key']) | ||
| os.chmod(SSH_KEY_FILE, 0o600) | ||
|
|
||
| if not os.path.exists(fpath): | ||
| utils.logged_call(['git', 'init', fpath]) | ||
| utils.logged_call(['git', '-C', fpath, 'remote', 'add', 'origin', url]) | ||
|
|
@@ -488,7 +482,6 @@ def create_merge(state, repo_cfg, branch, git_cfg, ensure_merge_equal=False): | |
| desc = 'Merge conflict' | ||
|
|
||
| if git_cfg['local_git']: | ||
|
|
||
| git_cmd = init_local_git_cmds(repo_cfg, git_cfg) | ||
|
|
||
| utils.logged_call(git_cmd('fetch', 'origin', state.base_ref, | ||
|
|
@@ -959,7 +952,8 @@ def fetch_mergeability(mergeable_que): | |
| mergeable_que.task_done() | ||
|
|
||
|
|
||
| def check_timeout(states, queue_handler): | ||
| def check_timeout(states, queue_handler, tmp_ssh_key): | ||
| # This function holds a reference to tmp_ssh_key to keep it alive | ||
| while True: | ||
| try: | ||
| for repo_label, repo_states in states.items(): | ||
|
|
@@ -1239,13 +1233,23 @@ def queue_handler(): | |
| return process_queue(states, repos, repo_cfgs, logger, buildbot_slots, db, git_cfg) | ||
|
|
||
| os.environ['GIT_SSH'] = os.path.join(os.path.dirname(__file__), 'git_helper.py') | ||
| sshcfg = cfg_git.get('ssh_config_path') | ||
| if sshcfg is not None: | ||
| os.environ['HOMU_SSH_CONFIG'] = sshcfg | ||
| os.environ['GIT_EDITOR'] = 'cat' | ||
|
|
||
| tmp_ssh_key = None | ||
| if git_cfg['local_git']: | ||
| tmp_ssh_key = tempfile.NamedTemporaryFile(prefix='homu-sshkey') | ||
| tmp_ssh_key.write(git_cfg['ssh_key'].encode('utf-8')) | ||
| tmp_ssh_key.flush() | ||
| os.environ['HOMU_GIT_KEY_PATH'] = tmp_ssh_key.name | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This seems like a hack. Passing the filename of the
I would prefer The same thing should be done for Extra fun fact: updating |
||
|
|
||
| from . import server | ||
| Thread(target=server.start, args=[cfg, states, queue_handler, repo_cfgs, repos, logger, buildbot_slots, my_username, db, repo_labels, mergeable_que, gh]).start() | ||
|
|
||
| Thread(target=fetch_mergeability, args=[mergeable_que]).start() | ||
| Thread(target=check_timeout, args=[states, queue_handler]).start() | ||
| Thread(target=check_timeout, args=[states, queue_handler, tmp_ssh_key]).start() | ||
|
|
||
| queue_handler() | ||
|
|
||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It seems bad to not clean up a temporary file with key info, esp. since it's named. It would be nice to use a context manager to automatically close this file (if we have one i.e. if
git_cfg['local_git']), and wrap the thread spawning code in awithblock that uses said context manager.