mirror of
https://gitlab.postmarketos.org/postmarketOS/pmbootstrap.git
synced 2025-07-24 21:15:10 +03:00
The Type | OtherType syntax for writing unions was introduced in Python
3.10. We want to support Python 3.7, so use an Optional type hint
instead which declares the same thing and is supported by 3.7.
Fixes: d31313f7
("Don't use 'sudo' when running as root")
Reviewed-by: Luca Weiss <luca@z3ntu.xyz>
Link: https://lists.sr.ht/~postmarketos/pmbootstrap-devel/%3C20230605063142.6843-1-newbyte@postmarketos.org%3E
36 lines
1.2 KiB
Python
36 lines
1.2 KiB
Python
# Copyright 2023 Anjandev Momi
|
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
import os
|
|
import shutil
|
|
from functools import lru_cache
|
|
from typing import Optional
|
|
|
|
|
|
@lru_cache()
|
|
def which_sudo() -> Optional[str]:
|
|
"""Returns a command required to run commands as root, if any.
|
|
|
|
Find whether sudo or doas is installed for commands that require root.
|
|
Allows user to override preferred sudo with PMB_SUDO env variable.
|
|
"""
|
|
|
|
if os.getuid() == 0:
|
|
return None
|
|
|
|
supported_sudos = ['doas', 'sudo']
|
|
|
|
user_set_sudo = os.getenv("PMB_SUDO")
|
|
if user_set_sudo is not None:
|
|
if shutil.which(user_set_sudo) is None:
|
|
raise RuntimeError("PMB_SUDO environmental variable is set to"
|
|
f" {user_set_sudo} but pmbootstrap cannot find"
|
|
" this command on your system.")
|
|
return user_set_sudo
|
|
|
|
for sudo in supported_sudos:
|
|
if shutil.which(sudo) is not None:
|
|
return sudo
|
|
|
|
raise RuntimeError("Can't find sudo or doas required to run pmbootstrap."
|
|
" Please install sudo, doas, or specify your own sudo"
|
|
" with the PMB_SUDO environmental variable.")
|