forked from Mirror/pmbootstrap
chroot: combine user.py and root.py into run.py (MR 2252)
These are small related utility functions, combine them together. Signed-off-by: Caleb Connolly <caleb@postmarketos.org>
This commit is contained in:
parent
1d9bbd613e
commit
cf651e56d5
9 changed files with 52 additions and 64 deletions
|
@ -3,7 +3,7 @@
|
||||||
import os
|
import os
|
||||||
from pmb.helpers import logging
|
from pmb.helpers import logging
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
import pmb.chroot.user
|
import pmb.chroot.run
|
||||||
from pmb.core.types import PmbArgs
|
from pmb.core.types import PmbArgs
|
||||||
import pmb.helpers.cli
|
import pmb.helpers.cli
|
||||||
import pmb.parse
|
import pmb.parse
|
||||||
|
|
|
@ -2,8 +2,6 @@
|
||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
from pmb.chroot.init import init, init_keys, UsrMerge
|
from pmb.chroot.init import init, init_keys, UsrMerge
|
||||||
from pmb.chroot.mount import mount, mount_native_into_foreign, remove_mnt_pmbootstrap
|
from pmb.chroot.mount import mount, mount_native_into_foreign, remove_mnt_pmbootstrap
|
||||||
from pmb.chroot.root import root
|
from pmb.chroot.run import root, user, exists as user_exists
|
||||||
from pmb.chroot.user import user
|
|
||||||
from pmb.chroot.user import exists as user_exists
|
|
||||||
from pmb.chroot.shutdown import shutdown
|
from pmb.chroot.shutdown import shutdown
|
||||||
from pmb.chroot.zap import zap
|
from pmb.chroot.zap import zap
|
||||||
|
|
|
@ -86,3 +86,42 @@ def root(args: PmbArgs, cmd: Sequence[PathString], chroot: Chroot=Chroot.native(
|
||||||
return pmb.helpers.run_core.core(args, msg, cmd_sudo, None, output,
|
return pmb.helpers.run_core.core(args, msg, cmd_sudo, None, output,
|
||||||
output_return, check, True,
|
output_return, check, True,
|
||||||
disable_timeout)
|
disable_timeout)
|
||||||
|
|
||||||
|
|
||||||
|
def user(args: PmbArgs, cmd, chroot: Chroot=Chroot.native(), working_dir: Path = Path("/"), output="log",
|
||||||
|
output_return=False, check=None, env={}):
|
||||||
|
"""
|
||||||
|
Run a command inside a chroot as "user". We always use the BusyBox
|
||||||
|
implementation of 'su', because other implementations may override the PATH
|
||||||
|
environment variable (#1071).
|
||||||
|
|
||||||
|
:param env: dict of environment variables to be passed to the command, e.g.
|
||||||
|
{"JOBS": "5"}
|
||||||
|
|
||||||
|
See pmb.helpers.run_core.core() for a detailed description of all other
|
||||||
|
arguments and the return value.
|
||||||
|
"""
|
||||||
|
env = env.copy()
|
||||||
|
pmb.helpers.run_core.add_proxy_env_vars(env)
|
||||||
|
|
||||||
|
if "HOME" not in env:
|
||||||
|
env["HOME"] = "/home/pmos"
|
||||||
|
|
||||||
|
flat_cmd = pmb.helpers.run_core.flat_cmd(cmd, env=env)
|
||||||
|
cmd = ["busybox", "su", "pmos", "-c", flat_cmd]
|
||||||
|
return pmb.chroot.root(args, cmd, chroot, working_dir, output,
|
||||||
|
output_return, check, {},
|
||||||
|
add_proxy_env_vars=False)
|
||||||
|
|
||||||
|
|
||||||
|
def exists(args: PmbArgs, username, chroot: Chroot=Chroot.native()):
|
||||||
|
"""
|
||||||
|
Checks if username exists in the system
|
||||||
|
|
||||||
|
:param username: User name
|
||||||
|
:returns: bool
|
||||||
|
"""
|
||||||
|
output = pmb.chroot.root(args, ["getent", "passwd", username],
|
||||||
|
chroot, output_return=True, check=False)
|
||||||
|
return len(output) > 0
|
||||||
|
|
|
@ -1,46 +0,0 @@
|
||||||
# Copyright 2023 Oliver Smith
|
|
||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
from pathlib import Path
|
|
||||||
import pmb.chroot
|
|
||||||
import pmb.helpers.run
|
|
||||||
import pmb.helpers.run_core
|
|
||||||
from pmb.core import Chroot
|
|
||||||
from pmb.core.types import PathString, PmbArgs
|
|
||||||
|
|
||||||
|
|
||||||
def user(args: PmbArgs, cmd, chroot: Chroot=Chroot.native(), working_dir: Path = Path("/"), output="log",
|
|
||||||
output_return=False, check=None, env={}):
|
|
||||||
"""
|
|
||||||
Run a command inside a chroot as "user". We always use the BusyBox
|
|
||||||
implementation of 'su', because other implementations may override the PATH
|
|
||||||
environment variable (#1071).
|
|
||||||
|
|
||||||
:param env: dict of environment variables to be passed to the command, e.g.
|
|
||||||
{"JOBS": "5"}
|
|
||||||
|
|
||||||
See pmb.helpers.run_core.core() for a detailed description of all other
|
|
||||||
arguments and the return value.
|
|
||||||
"""
|
|
||||||
env = env.copy()
|
|
||||||
pmb.helpers.run_core.add_proxy_env_vars(env)
|
|
||||||
|
|
||||||
if "HOME" not in env:
|
|
||||||
env["HOME"] = "/home/pmos"
|
|
||||||
|
|
||||||
flat_cmd = pmb.helpers.run_core.flat_cmd(cmd, env=env)
|
|
||||||
cmd = ["busybox", "su", "pmos", "-c", flat_cmd]
|
|
||||||
return pmb.chroot.root(args, cmd, chroot, working_dir, output,
|
|
||||||
output_return, check, {},
|
|
||||||
add_proxy_env_vars=False)
|
|
||||||
|
|
||||||
|
|
||||||
def exists(args: PmbArgs, username, chroot: Chroot=Chroot.native()):
|
|
||||||
"""
|
|
||||||
Checks if username exists in the system
|
|
||||||
|
|
||||||
:param username: User name
|
|
||||||
:returns: bool
|
|
||||||
"""
|
|
||||||
output = pmb.chroot.root(args, ["getent", "passwd", username],
|
|
||||||
chroot, output_return=True, check=False)
|
|
||||||
return len(output) > 0
|
|
|
@ -4,7 +4,7 @@ import os
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import List, Sequence
|
from typing import List, Sequence
|
||||||
|
|
||||||
import pmb.chroot.root
|
import pmb.chroot.run
|
||||||
import pmb.config.pmaports
|
import pmb.config.pmaports
|
||||||
from pmb.core.types import PathString, PmbArgs
|
from pmb.core.types import PathString, PmbArgs
|
||||||
import pmb.helpers.cli
|
import pmb.helpers.cli
|
||||||
|
|
|
@ -5,7 +5,7 @@ from pathlib import Path
|
||||||
import socket
|
import socket
|
||||||
import time
|
import time
|
||||||
|
|
||||||
import pmb.chroot.root
|
import pmb.chroot.run
|
||||||
from pmb.core.types import PmbArgs
|
from pmb.core.types import PmbArgs
|
||||||
import pmb.helpers.run
|
import pmb.helpers.run
|
||||||
from pmb.core import Chroot
|
from pmb.core import Chroot
|
||||||
|
@ -33,7 +33,7 @@ def start_nbd_server(args: PmbArgs, ip="172.16.42.2", port=9999):
|
||||||
f"replace the rootfs for "
|
f"replace the rootfs for "
|
||||||
f"{args.device}?"):
|
f"{args.device}?"):
|
||||||
return
|
return
|
||||||
pmb.chroot.root(args, ["cp", rootfs_path2, rootfs_path])
|
pmb.chroot.run(args, ["cp", rootfs_path2, rootfs_path])
|
||||||
logging.info(f"NOTE: Copied device image to {pmb.config.work}"
|
logging.info(f"NOTE: Copied device image to {pmb.config.work}"
|
||||||
f"/images_netboot/. The image will persist \"pmbootstrap "
|
f"/images_netboot/. The image will persist \"pmbootstrap "
|
||||||
f"zap\" for your convenience. Use \"pmbootstrap netboot "
|
f"zap\" for your convenience. Use \"pmbootstrap netboot "
|
||||||
|
@ -61,7 +61,7 @@ def start_nbd_server(args: PmbArgs, ip="172.16.42.2", port=9999):
|
||||||
break
|
break
|
||||||
|
|
||||||
logging.info("Found postmarketOS device, serving image...")
|
logging.info("Found postmarketOS device, serving image...")
|
||||||
pmb.chroot.root(
|
pmb.chroot.run(
|
||||||
args, ["nbd-server", f"{ip}@{port}", rootfs_path, "-d"],
|
args, ["nbd-server", f"{ip}@{port}", rootfs_path, "-d"],
|
||||||
check=False, disable_timeout=True)
|
check=False, disable_timeout=True)
|
||||||
logging.info("nbd-server quit. Connection lost?")
|
logging.info("nbd-server quit. Connection lost?")
|
||||||
|
|
|
@ -5,8 +5,7 @@ from pmb.helpers import logging
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from pmb.core.types import PmbArgs
|
from pmb.core.types import PmbArgs
|
||||||
import pmb.helpers.run
|
import pmb.helpers.run
|
||||||
import pmb.chroot.root
|
import pmb.chroot.run
|
||||||
import pmb.chroot.user
|
|
||||||
import pmb.chroot.other
|
import pmb.chroot.other
|
||||||
import pmb.chroot.apk
|
import pmb.chroot.apk
|
||||||
from pmb.core import Chroot
|
from pmb.core import Chroot
|
||||||
|
@ -167,6 +166,6 @@ def bootimg(args: PmbArgs, path: Path):
|
||||||
output["cmdline"] = f.read().replace('\n', '')
|
output["cmdline"] = f.read().replace('\n', '')
|
||||||
|
|
||||||
# Cleanup
|
# Cleanup
|
||||||
pmb.chroot.root(args, ["rm", "-r", temp_path])
|
pmb.chroot.run(args, ["rm", "-r", temp_path])
|
||||||
|
|
||||||
return output
|
return output
|
||||||
|
|
|
@ -8,8 +8,7 @@ import pytest
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
import pmb_test # noqa
|
import pmb_test # noqa
|
||||||
import pmb.chroot.root
|
import pmb.chroot.run
|
||||||
import pmb.chroot.user
|
|
||||||
import pmb.helpers.run
|
import pmb.helpers.run
|
||||||
import pmb.helpers.run_core
|
import pmb.helpers.run_core
|
||||||
|
|
||||||
|
@ -47,7 +46,7 @@ def test_proxy_chroot_user(args: PmbArgs, monkeypatch):
|
||||||
|
|
||||||
|
|
||||||
def test_proxy_chroot_root(args: PmbArgs, monkeypatch):
|
def test_proxy_chroot_root(args: PmbArgs, monkeypatch):
|
||||||
func = pmb.chroot.root
|
func = pmb.chroot.run
|
||||||
monkeypatch.setattr(os, "environ", {"HTTP_PROXY": "testproxy"})
|
monkeypatch.setattr(os, "environ", {"HTTP_PROXY": "testproxy"})
|
||||||
ret = func(args, ["sh", "-c", 'echo "$HTTP_PROXY"'], output_return=True)
|
ret = func(args, ["sh", "-c", 'echo "$HTTP_PROXY"'], output_return=True)
|
||||||
assert ret == "testproxy\n"
|
assert ret == "testproxy\n"
|
||||||
|
|
|
@ -6,8 +6,7 @@ from pmb.core.types import Env, PmbArgs
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
import pmb_test # noqa
|
import pmb_test # noqa
|
||||||
import pmb.chroot.root
|
import pmb.chroot.run
|
||||||
import pmb.chroot.user
|
|
||||||
import pmb.helpers.run
|
import pmb.helpers.run
|
||||||
import pmb.helpers.run_core
|
import pmb.helpers.run_core
|
||||||
import pmb.helpers.logging
|
import pmb.helpers.logging
|
||||||
|
@ -47,7 +46,7 @@ def test_shell_escape(args: PmbArgs):
|
||||||
assert expected == root
|
assert expected == root
|
||||||
assert cmd == copy
|
assert cmd == copy
|
||||||
|
|
||||||
chroot_root = pmb.chroot.root(args, cmd, output_return=True)
|
chroot_root = pmb.chroot.run(args, cmd, output_return=True)
|
||||||
assert expected == chroot_root
|
assert expected == chroot_root
|
||||||
assert cmd == copy
|
assert cmd == copy
|
||||||
|
|
||||||
|
@ -72,7 +71,7 @@ def test_shell_escape_env(args: PmbArgs):
|
||||||
assert func(args, cmd, output_return=True, env=env) == ret
|
assert func(args, cmd, output_return=True, env=env) == ret
|
||||||
assert cmd == copy
|
assert cmd == copy
|
||||||
|
|
||||||
func = pmb.chroot.root
|
func = pmb.chroot.run
|
||||||
assert func(args, cmd, output_return=True, env=env) == ret
|
assert func(args, cmd, output_return=True, env=env) == ret
|
||||||
assert cmd == copy
|
assert cmd == copy
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue