mirror of
https://github.com/akuker/RASCSI.git
synced 2024-06-02 11:41:34 +00:00
0b78f09f8d
Add bridge-utils Minor fixes to easyinstall Can now save config, detach all devices Bridge script error out if any command fails
165 lines
4.6 KiB
Python
165 lines
4.6 KiB
Python
import fnmatch
|
|
import os
|
|
import subprocess
|
|
import re
|
|
|
|
from settings import *
|
|
|
|
valid_file_types = ["*.hda", "*.iso", "*.cdr", "*.zip"]
|
|
valid_file_types = r"|".join([fnmatch.translate(x) for x in valid_file_types])
|
|
# List of SCSI ID's you'd like to exclude - eg if you are on a Mac, the System is usually 7
|
|
EXCLUDE_SCSI_IDS = [7]
|
|
|
|
|
|
def is_active():
|
|
process = subprocess.run(["systemctl", "is-active", "rascsi"], capture_output=True)
|
|
return process.stdout.decode("utf-8").strip() == "active"
|
|
|
|
|
|
def list_files():
|
|
files_list = []
|
|
for path, dirs, files in os.walk(base_dir):
|
|
# Only list valid file types
|
|
files = [f for f in files if re.match(valid_file_types, f)]
|
|
files_list.extend(
|
|
[
|
|
(
|
|
os.path.join(path, file),
|
|
# TODO: move formatting to template
|
|
"{:,.0f}".format(
|
|
os.path.getsize(os.path.join(path, file)) / float(1 << 20)
|
|
)
|
|
+ " MB",
|
|
)
|
|
for file in files
|
|
]
|
|
)
|
|
return files_list
|
|
|
|
|
|
def list_config_files():
|
|
files_list = []
|
|
for root, dirs, files in os.walk(base_dir):
|
|
for file in files:
|
|
if file.endswith(".csv"):
|
|
files_list.append(file)
|
|
return files_list
|
|
|
|
|
|
def get_valid_scsi_ids(devices):
|
|
invalid_list = EXCLUDE_SCSI_IDS.copy()
|
|
for device in devices:
|
|
if device["file"] != "NO MEDIA" and device["file"] != "-":
|
|
invalid_list.append(int(device["id"]))
|
|
|
|
valid_list = list(range(8))
|
|
for id in invalid_list:
|
|
valid_list.remove(id)
|
|
valid_list.reverse()
|
|
|
|
return valid_list
|
|
|
|
|
|
def get_type(scsi_id):
|
|
return list_devices()[int(scsi_id)]["type"]
|
|
|
|
|
|
def attach_image(scsi_id, image, device_type):
|
|
if device_type == "SCCD" and get_type(scsi_id) == "SCCD":
|
|
return insert(scsi_id, image)
|
|
elif device_type == "SCDP":
|
|
attach_daynaport(scsi_id)
|
|
else:
|
|
if device_type == "SCCD":
|
|
device_type = "cd"
|
|
return subprocess.run(
|
|
["rasctl", "-c", "attach", "-t", device_type, "-i", scsi_id, "-f", image],
|
|
capture_output=True,
|
|
)
|
|
|
|
|
|
def detach_by_id(scsi_id):
|
|
return subprocess.run(["rasctl", "-c" "detach", "-i", scsi_id], capture_output=True)
|
|
|
|
|
|
def detach_all():
|
|
for scsi_id in range(0, 7):
|
|
subprocess.run(["rasctl", "-c" "detach", "-i", str(scsi_id)])
|
|
|
|
|
|
def disconnect_by_id(scsi_id):
|
|
return subprocess.run(
|
|
["rasctl", "-c", "disconnect", "-i", scsi_id], capture_output=True
|
|
)
|
|
|
|
|
|
def eject_by_id(scsi_id):
|
|
return subprocess.run(["rasctl", "-i", scsi_id, "-c", "eject"])
|
|
|
|
|
|
def insert(scsi_id, image):
|
|
return subprocess.run(
|
|
["rasctl", "-i", scsi_id, "-c", "insert", "-f", image], capture_output=True
|
|
)
|
|
|
|
|
|
def attach_daynaport(scsi_id):
|
|
return subprocess.run(
|
|
["rasctl", "-i", scsi_id, "-c", "attach", "-t", "daynaport"],
|
|
capture_output=True,
|
|
)
|
|
|
|
|
|
def is_bridge_setup(interface):
|
|
process = subprocess.run(["brctl", "show"], capture_output=True)
|
|
output = process.stdout.decode("utf-8")
|
|
if "rascsi_bridge" in output and interface in output:
|
|
return True
|
|
return False
|
|
|
|
|
|
def daynaport_setup_bridge(interface):
|
|
return subprocess.run(
|
|
[f"{base_dir}../RASCSI/src/raspberrypi/setup_bridge.sh", interface],
|
|
capture_output=True,
|
|
)
|
|
|
|
|
|
def rascsi_service(action):
|
|
# start/stop/restart
|
|
return (
|
|
subprocess.run(["sudo", "/bin/systemctl", action, "rascsi.service"]).returncode
|
|
== 0
|
|
)
|
|
|
|
|
|
def list_devices():
|
|
device_list = []
|
|
for id in range(8):
|
|
device_list.append({"id": str(id), "un": "-", "type": "-", "file": "-"})
|
|
output = subprocess.run(["rasctl", "-l"], capture_output=True).stdout.decode(
|
|
"utf-8"
|
|
)
|
|
for line in output.splitlines():
|
|
# Valid line to process, continue
|
|
if (
|
|
not line.startswith("+")
|
|
and not line.startswith("| ID |")
|
|
and (
|
|
not line.startswith("No device is installed.")
|
|
or line.startswith("No images currently attached.")
|
|
)
|
|
and len(line) > 0
|
|
):
|
|
line.rstrip()
|
|
device = {}
|
|
segments = line.split("|")
|
|
if len(segments) > 4:
|
|
idx = int(segments[1].strip())
|
|
device_list[idx]["id"] = str(idx)
|
|
device_list[idx]["un"] = segments[2].strip()
|
|
device_list[idx]["type"] = segments[3].strip()
|
|
device_list[idx]["file"] = segments[4].strip()
|
|
|
|
return device_list
|