mirror of
https://github.com/akuker/RASCSI.git
synced 2024-06-12 00:29:29 +00:00
ea4486d1c0
* Move to bjoern * Stream upload * wip * Streams * check for filename * Allow easyinstall to be scripted * Tell user we're done * show help * ignore hfdisk * fix var * Allow override of remote by setting GIT_REMOTE, default to origin * Better handling of local changes * Give user more info * Fix #156 - show all supported types in web interface * *.mos does not seem to be valid - ractl throws error * Try some minor optomizations Error handling
165 lines
4.6 KiB
Python
165 lines
4.6 KiB
Python
import fnmatch
|
|
import subprocess
|
|
import re
|
|
|
|
from settings import *
|
|
|
|
|
|
valid_file_suffix = ["*.hda", "*.hdn", "*.hdi", "*.nhd", "*.hdf", "*.hds", "*.iso", "*.cdr", "*.zip"]
|
|
valid_file_types = r"|".join([fnmatch.translate(x) for x in valid_file_suffix])
|
|
# 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
|