mirror of
https://github.com/kawasaki/pyscrlink.git
synced 2025-07-21 09:31:21 +02:00
bluepy_helper_cap.py: Check tools out of PATH
It was informed that the required tools setcap and getcap are not placed in /usr/bin in some user environment. They can not be executed since they are out of PATH. To allow the script to execute the commands out of PATH, have the script find the tools. Keep the found paths of each command in the dictionary 'tools', and refer it to execute the commands. Signed-off-by: Shin'ichiro Kawasaki <kawasaki@juno.dti.ne.jp>
This commit is contained in:
@@ -22,10 +22,26 @@ logger.propagate = False
|
||||
# Check dependent tools
|
||||
DEPENDENT_TOOLS = {
|
||||
"setcap": "libcap2-bin (Ubuntu) or libcap (Arch)",
|
||||
"getcap": "libcap2-bin (Ubuntu) or libcap (Arch)",
|
||||
}
|
||||
|
||||
tools = {}
|
||||
|
||||
for cmd in DEPENDENT_TOOLS:
|
||||
if not shutil.which(cmd):
|
||||
# find the tools in PATH
|
||||
path = shutil.which(cmd)
|
||||
if path:
|
||||
tools[cmd] = path
|
||||
logger.debug(f"{cmd} found: {path}")
|
||||
continue
|
||||
# find the tools out of PATH but in major directories
|
||||
for d in ["/usr/bin", "/bin", "/usr/sbin", "/sbin"]:
|
||||
path = d + '/' + cmd
|
||||
if os.path.isfile(path) and os.access(path, os.X_OK):
|
||||
tools[cmd] = path
|
||||
logger.debug(f"{cmd} found: {path}")
|
||||
break
|
||||
if not cmd in tools:
|
||||
print(f"'{cmd}' not found. Install package {DEPENDENT_TOOLS[cmd]}.")
|
||||
sys.exit(1)
|
||||
|
||||
@@ -42,7 +58,7 @@ def helper_path():
|
||||
|
||||
def is_set():
|
||||
path = helper_path()
|
||||
p = subprocess.run(["getcap", path], stdout=subprocess.PIPE)
|
||||
p = subprocess.run([tools["getcap"], path], stdout=subprocess.PIPE)
|
||||
if p.returncode != 0:
|
||||
logger.error(f"Failed to get capability of {path}")
|
||||
return False
|
||||
@@ -53,8 +69,8 @@ def setcap():
|
||||
path = helper_path()
|
||||
if is_set():
|
||||
return True
|
||||
p = subprocess.run(["sudo", "setcap", "cap_net_raw,cap_net_admin+eip",
|
||||
path])
|
||||
p = subprocess.run(["sudo", tools["setcap"],
|
||||
"cap_net_raw,cap_net_admin+eip", path])
|
||||
if p.returncode !=0:
|
||||
logger.error(f"Failed to set capability to {path}")
|
||||
return False
|
||||
|
Reference in New Issue
Block a user