mirror of
https://github.com/jupyterhub/the-littlest-jupyterhub.git
synced 2025-12-18 21:54:05 +08:00
Call conda more resiliently
This commit is contained in:
@@ -4,6 +4,10 @@ Wrap conda commandline program
|
|||||||
import os
|
import os
|
||||||
import subprocess
|
import subprocess
|
||||||
import json
|
import json
|
||||||
|
import sys
|
||||||
|
|
||||||
|
# Use sys.executable to call conda to avoid needing to fudge PATH
|
||||||
|
CONDA_EXECUTABLE = [sys.executable, '-m', 'conda']
|
||||||
|
|
||||||
|
|
||||||
def ensure_conda_env(prefix):
|
def ensure_conda_env(prefix):
|
||||||
@@ -13,7 +17,7 @@ def ensure_conda_env(prefix):
|
|||||||
abspath = os.path.abspath(prefix)
|
abspath = os.path.abspath(prefix)
|
||||||
try:
|
try:
|
||||||
output = json.loads(
|
output = json.loads(
|
||||||
subprocess.check_output(['conda', 'create', '--json', '--prefix', abspath]).decode()
|
subprocess.check_output(CONDA_EXECUTABLE + ['create', '--json', '--prefix', abspath]).decode()
|
||||||
)
|
)
|
||||||
except subprocess.CalledProcessError as e:
|
except subprocess.CalledProcessError as e:
|
||||||
output = json.loads(e.output.decode())
|
output = json.loads(e.output.decode())
|
||||||
@@ -31,8 +35,8 @@ def ensure_conda_packages(prefix, packages):
|
|||||||
abspath = os.path.abspath(prefix)
|
abspath = os.path.abspath(prefix)
|
||||||
# Let subprocess errors propagate
|
# Let subprocess errors propagate
|
||||||
# FIXME: raise different exception when using
|
# FIXME: raise different exception when using
|
||||||
raw_output = subprocess.check_output([
|
raw_output = subprocess.check_output(CONDA_EXECUTABLE + [
|
||||||
'conda', 'install',
|
'install',
|
||||||
'--json',
|
'--json',
|
||||||
'--prefix', abspath
|
'--prefix', abspath
|
||||||
] + packages).decode()
|
] + packages).decode()
|
||||||
|
|||||||
59
tljh/systemd.py
Normal file
59
tljh/systemd.py
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
"""
|
||||||
|
Wraps systemctl to install, uninstall, start & stop systemd services.
|
||||||
|
|
||||||
|
We use sudo + subprocess calls for everything. This works when we
|
||||||
|
are running as root & as normal user (with arbitrary sudo privileges).
|
||||||
|
Arbitrary sudo privileges suck, but are better than running the whole
|
||||||
|
process as root.
|
||||||
|
|
||||||
|
If we use a debian package instead, we can get rid of all this code.
|
||||||
|
"""
|
||||||
|
import subprocess
|
||||||
|
import os
|
||||||
|
|
||||||
|
|
||||||
|
def reload_daemon():
|
||||||
|
"""
|
||||||
|
Equivalent to systemctl daemon-reload.
|
||||||
|
|
||||||
|
Makes systemd discover new units.
|
||||||
|
"""
|
||||||
|
subprocess.run([
|
||||||
|
'sudo',
|
||||||
|
'systemctl',
|
||||||
|
'daemon-reload'
|
||||||
|
], check=True)
|
||||||
|
|
||||||
|
|
||||||
|
def install_unit(name, unit, path='/etc/systemd/system'):
|
||||||
|
"""
|
||||||
|
Install unit wih given name
|
||||||
|
"""
|
||||||
|
subprocess.run([
|
||||||
|
'sudo',
|
||||||
|
'tee',
|
||||||
|
os.path.join(path, name)
|
||||||
|
], input=unit.encode('utf-8'), check=True)
|
||||||
|
|
||||||
|
|
||||||
|
def uninstall_unit(name, path='/etc/systemd/system'):
|
||||||
|
"""
|
||||||
|
Uninstall unit with given name
|
||||||
|
"""
|
||||||
|
subprocess.run([
|
||||||
|
'sudo',
|
||||||
|
'rm',
|
||||||
|
os.path.join(path, name)
|
||||||
|
], check=True)
|
||||||
|
|
||||||
|
|
||||||
|
def start_service(name):
|
||||||
|
"""
|
||||||
|
Start service with given name.
|
||||||
|
"""
|
||||||
|
subprocess.run([
|
||||||
|
'sudo',
|
||||||
|
'systemctl',
|
||||||
|
'start',
|
||||||
|
name
|
||||||
|
], check=True)
|
||||||
Reference in New Issue
Block a user