mirror of https://github.com/akuker/RASCSI.git
719 lines
33 KiB
HTML
719 lines
33 KiB
HTML
{% extends "base.html" %}
|
|
{% block content %}
|
|
|
|
<details>
|
|
<summary class="heading">
|
|
{{ _("Current RaSCSI Configuration") }}
|
|
</summary>
|
|
<ul>
|
|
<li>{{ _("Displays the currently attached devices for each available SCSI ID.") }}</li>
|
|
<li>{{ _("Save and load device configurations, stored as json files in <tt>%(config_dir)s</tt>", config_dir=CFG_DIR) }}</tt></li>
|
|
<li>{{ _("To have a particular device configuration load when RaSCSI starts, save it as <em>default</em>.") }}</li>
|
|
</ul>
|
|
</details>
|
|
|
|
<p><form action="/config/load" method="post">
|
|
<select name="name" required="" width="14">
|
|
{% if config_files %}
|
|
{% for config in config_files|sort %}
|
|
<option value="{{ config }}">
|
|
{{ config.replace(".json", '') }}
|
|
</option>
|
|
{% endfor %}
|
|
{% else %}
|
|
<option disabled>
|
|
{{ _("No saved configurations") }}
|
|
</option>
|
|
{% endif %}
|
|
</select>
|
|
<input name="load" type="submit" value="{{ _("Load") }}" onclick="return confirm('{{ _("Detach all current device and Load configuration?") }}')">
|
|
<input name="delete" type="submit" value="{{ _("Delete") }}" onclick="return confirm('{{ _("Delete configuration file?") }}')">
|
|
</form></p>
|
|
|
|
<p><form action="/config/save" method="post">
|
|
<input name="name" placeholder="default" size="20">
|
|
<input type="submit" value="{{ _("Save") }}">
|
|
</form></p>
|
|
|
|
<table border="black" cellpadding="3">
|
|
<tbody>
|
|
<tr>
|
|
<td><b>{{ _("ID") }}</b></td>
|
|
{% if units %}
|
|
<td><b>{{ _("LUN") }}</b></td>
|
|
{% endif %}
|
|
<td><b>{{ _("Type") }}</b></td>
|
|
<td><b>{{ _("Status") }}</b></td>
|
|
<td><b>{{ _("File") }}</b></td>
|
|
<td><b>{{ _("Product") }}</b></td>
|
|
<td><b>{{ _("Actions") }}</b></td>
|
|
</tr>
|
|
{% for device in devices %}
|
|
<tr>
|
|
{% if device["id"] not in reserved_scsi_ids %}
|
|
<td style="text-align:center">{{ device.id }}</td>
|
|
{% if units %}
|
|
<td style="text-align:center">{{ device.unit }}</td>
|
|
{% endif %}
|
|
<td style="text-align:center">{{ device.device_type }}</td>
|
|
<td style="text-align:center">{{ device.status }}</td>
|
|
<td style="text-align:left">
|
|
{% if "No Media" in device.status %}
|
|
<form action="/scsi/attach" method="post">
|
|
<input name="scsi_id" type="hidden" value="{{ device.id }}">
|
|
<input name="unit" type="hidden" value="{{ device.unit }}">
|
|
<input name="type" type="hidden" value="{{ device.device_type }}">
|
|
<input name="file_size" type="hidden" value="{{ device.size }}">
|
|
<select type="select" name="file_name">
|
|
{% for f in files|sort(attribute='name') %}
|
|
{% if device.device_type == "SCCD" %}
|
|
{% if f["name"].lower().endswith(cdrom_file_suffix) %}
|
|
<option value="{{ f["name"] }}">{{ f["name"].replace(base_dir, '') }}</option>
|
|
{% endif %}
|
|
{% elif device.device_type == "SCRM" %}
|
|
{% if f["name"].lower().endswith(removable_file_suffix) %}
|
|
<option value="{{ f["name"] }}">{{ f["name"].replace(base_dir, '') }}</option>
|
|
{% endif %}
|
|
{% elif device.device_type == "SCMO" %}
|
|
{% if f["name"].lower().endswith(mo_file_suffix) %}
|
|
<option value="{{ f["name"] }}">{{ f["name"].replace(base_dir, '') }}</option>
|
|
{% endif %}
|
|
{% endif %}
|
|
{% endfor %}
|
|
</select>
|
|
<input type="submit" value="{{ _("Attach") }}">
|
|
</form>
|
|
{% else %}
|
|
{{ device.file }}
|
|
{% endif %}
|
|
</td>
|
|
{% if device.vendor == "RaSCSI" %}
|
|
<td style="text-align:center">{{ device.product }}</td>
|
|
{% else %}
|
|
<td style="text-align:center">{{ device.vendor }} {{ device.product }}</td>
|
|
{% endif %}
|
|
<td style="text-align:center">
|
|
{% if device.device_type != "-" %}
|
|
{% if device.device_type in REMOVABLE_DEVICE_TYPES and "No Media" not in device.status %}
|
|
<form action="/scsi/eject" method="post" onsubmit="return confirm('{{ _("Eject Disk? WARNING: On Mac OS, eject the Disk in the Finder instead!") }}')">
|
|
<input name="scsi_id" type="hidden" value="{{ device.id }}">
|
|
<input name="unit" type="hidden" value="{{ device.unit }}">
|
|
<input type="submit" value="{{ _("Eject") }}">
|
|
</form>
|
|
{% else %}
|
|
<form action="/scsi/detach" method="post" onsubmit="return confirm('{{ _("Detach Device?") }}')">
|
|
<input name="scsi_id" type="hidden" value="{{ device.id }}">
|
|
<input name="unit" type="hidden" value="{{ device.unit }}">
|
|
<input type="submit" value="{{ _("Detach") }}">
|
|
</form>
|
|
{% endif %}
|
|
<form action="/scsi/info" method="post">
|
|
<input name="scsi_id" type="hidden" value="{{ device.id }}">
|
|
<input name="unit" type="hidden" value="{{ device.unit }}">
|
|
<input type="submit" value="{{ _("Info") }}">
|
|
</form>
|
|
{% else %}
|
|
<form action="/scsi/reserve" method="post" onsubmit="var memo = prompt('{{ _("Enter a memo for this reservation") }}'); if (memo === null) event.preventDefault(); document.getElementById('memo_{{ device.id }}').value = memo;">
|
|
<input name="scsi_id" type="hidden" value="{{ device.id }}">
|
|
<input name="memo" id="memo_{{ device.id }}" type="hidden" value="">
|
|
<input type="submit" value="{{ _("Reserve") }}">
|
|
</form>
|
|
{% endif %}
|
|
</td>
|
|
{% else %}
|
|
<td class="inactive">{{ device.id }}</td>
|
|
{% if units %}
|
|
<td class="inactive"></td>
|
|
{% endif %}
|
|
<td class="inactive"></td>
|
|
<td class="inactive">{{ _("Reserved ID") }}</td>
|
|
<td class="inactive">{{ RESERVATIONS[device.id] }}</td>
|
|
<td class="inactive"></td>
|
|
<td class="inactive">
|
|
<form action="/scsi/release" method="post">
|
|
<input name="scsi_id" type="hidden" value="{{ device.id }}">
|
|
<input type="submit" value="{{ _("Release") }}">
|
|
</form>
|
|
</td>
|
|
{% endif %}
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
|
|
<p><form action="/scsi/detach_all" method="post" onsubmit="return confirm('{{ _("Detach all SCSI Devices?") }}')">
|
|
<input type="submit" value="{{ _("Detach All Devices") }}">
|
|
</form></p>
|
|
|
|
<hr/>
|
|
|
|
<details>
|
|
<summary class="heading">
|
|
{{ _("Image File Management") }}
|
|
</summary>
|
|
<ul>
|
|
<li>{{ _("Manage image files in the active RaSCSI image directory: <tt>%(directory)s</tt> with a scan depth of %(scan_depth)s.", directory=base_dir, scan_depth=scan_depth) }}</li>
|
|
<li>{{ _("Select a valid SCSI ID and <a href=\"%(url)s\">LUN</a> to attach to. Unless you know what you're doing, always use LUN 0.", url="https://en.wikipedia.org/wiki/Logical_unit_number") }}
|
|
</li>
|
|
<li>{{ _("If RaSCSI was unable to detect the media type associated with the image, you get to choose the type from the dropdown.") }}</li>
|
|
</ul>
|
|
</details>
|
|
|
|
<table border="black" cellpadding="3">
|
|
<tbody>
|
|
<tr style="font-weight: bold;">
|
|
<td>{{ _("File") }}</td>
|
|
<td>{{ _("Size") }}</td>
|
|
<td>{{ _("Parameters and Actions") }}</td>
|
|
</tr>
|
|
{% for file in files|sort(attribute='name') %}
|
|
<tr>
|
|
{% if file["prop"] %}
|
|
<td>
|
|
<details>
|
|
<summary>
|
|
{{ file["name"] }}
|
|
</summary>
|
|
<ul style="list-style: none;">
|
|
{% for key in file["prop"] %}
|
|
<li>{{ key }}: {{ file['prop'][key] }}</li>
|
|
{% endfor %}
|
|
<form action="/files/download" method="post">
|
|
<input name="file" type="hidden" value="{{ CFG_DIR }}/{{ file['name'].replace(base_dir, '') }}.{{ PROPERTIES_SUFFIX }}">
|
|
<input type="submit" value="{{ _("Properties File") }} ↓">
|
|
</form>
|
|
</ul>
|
|
</details>
|
|
</td>
|
|
{% elif file["archive_contents"] %}
|
|
<td>
|
|
<details>
|
|
<summary>
|
|
{{ file["name"] }}
|
|
</summary>
|
|
<ul style="list-style: none;">
|
|
{% for member in file["archive_contents"] %}
|
|
{% if not member["is_properties_file"] %}
|
|
<li>
|
|
{% if member["related_properties_file"] %}
|
|
<details>
|
|
<summary>
|
|
<label>{{ member["path"] }}</label>
|
|
<form action="/files/extract_image" method="post">
|
|
<input name="archive_file" type="hidden" value="{{ file['name'] }}">
|
|
<input name="archive_members" type="hidden" value="{{ member["path"] }}|{{ member["related_properties_file"] }}">
|
|
<input type="submit" value="{{ _("Extract") }}" onclick="processNotify('{{ _("Extracting a single file...") }}')">
|
|
</form>
|
|
</summary>
|
|
<ul style="list-style: none;">
|
|
<li>{{ member["related_properties_file"] }}</li>
|
|
</ul>
|
|
</details>
|
|
{% else %}
|
|
<label>{{ member["path"] }}</label>
|
|
<form action="/files/extract_image" method="post">
|
|
<input name="archive_file" type="hidden" value="{{ file["name"] }}">
|
|
<input name="archive_members" type="hidden" value="{{ member["path"] }}">
|
|
<input type="submit" value="{{ _("Extract") }}" onclick="processNotify('{{ _("Extracting a single file...") }}')">
|
|
</form>
|
|
{% endif %}
|
|
</li>
|
|
{% endif %}
|
|
{% endfor %}
|
|
</ul>
|
|
</details>
|
|
</td>
|
|
{% else %}
|
|
<td>{{ file["name"] }}</td>
|
|
{% endif %}
|
|
<td style="text-align:center">
|
|
<form action="/files/download" method="post">
|
|
<input name="file" type="hidden" value="{{ base_dir }}/{{ file['name'] }}">
|
|
<input type="submit" value="{{ file['size_mb'] }} {{ _("MB") }} ↓">
|
|
</form>
|
|
</td>
|
|
<td>
|
|
{% if file["name"] in attached_images %}
|
|
<center>
|
|
{{ _("Attached!") }}
|
|
</center>
|
|
{% else %}
|
|
{% if file["archive_contents"] %}
|
|
<form action="/files/extract_image" method="post">
|
|
<input name="archive_file" type="hidden" value="{{ file['name'] }}">
|
|
{% set pipe = joiner("|") %}
|
|
<input name="archive_members" type="hidden" value="{% for member in file["archive_contents"] %}{{ pipe() }}{{ member["path"] }}{% endfor %}">
|
|
<input type="submit" value="{{ _("Extract All") }}" onclick="processNotify('{{ _("Extracting all files...") }}')">
|
|
</form>
|
|
{% else %}
|
|
<form action="/scsi/attach" method="post">
|
|
<input name="file_name" type="hidden" value="{{ file['name'] }}">
|
|
<input name="file_size" type="hidden" value="{{ file['size'] }}">
|
|
<label for="id">{{ _("ID") }}</label>
|
|
<select name="scsi_id">
|
|
{% for id in scsi_ids %}
|
|
<option name="id" value="{{id}}"{% if id == recommended_id %} selected{% endif %}>
|
|
{{ id }}
|
|
</option>
|
|
{% endfor %}
|
|
</select>
|
|
<label for="unit">{{ _("LUN") }}</label>
|
|
<input name="unit" type="number" value="0" min="0" max="31" step="1">
|
|
{% if file["detected_type"] != "UNDEFINED" %}
|
|
<input name="type" type="hidden" value="{{ file['detected_type'] }}">
|
|
{{ file['detected_type_name'] }}
|
|
{% else %}
|
|
<select name="type">
|
|
<option selected disabled value="">
|
|
{{ _("Select media type") }}
|
|
</option>
|
|
{% for key, value in device_types.items() %}
|
|
{% if key in DISK_DEVICE_TYPES %}
|
|
<option value="{{ key }}">
|
|
{{ value["name"] }}
|
|
</option>
|
|
{% endif %}
|
|
{% endfor %}
|
|
</select>
|
|
{% endif %}
|
|
<input type="submit" value="{{ _("Attach") }}">
|
|
{% endif %}
|
|
</form>
|
|
<form action="/files/rename" method="post" onsubmit="var new_file_name = prompt('{{ _("Enter new file name for: %(file_name)s", file_name=file["name"]) }}', '{{ file['name'] }}'); if (new_file_name === null) event.preventDefault(); document.getElementById('new_file_name_{{ loop.index }}').value = new_file_name;">
|
|
<input name="file_name" type="hidden" value="{{ file['name'] }}">
|
|
<input name="new_file_name" id="new_file_name_{{ loop.index }}" type="hidden" value="">
|
|
<input type="submit" value="{{ _("Rename") }}">
|
|
</form>
|
|
<form action="/files/copy" method="post" onsubmit="var copy_file_name = prompt('{{ _("Save copy of %(file_name)s as:", file_name=file["name"]) }}', '{{ file['name'] }}'); if (copy_file_name === null) event.preventDefault(); document.getElementById('copy_file_name_{{ loop.index }}').value = copy_file_name;">
|
|
<input name="file_name" type="hidden" value="{{ file['name'] }}">
|
|
<input name="copy_file_name" id="copy_file_name_{{ loop.index }}" type="hidden" value="">
|
|
<input type="submit" value="{{ _("Copy") }}">
|
|
</form>
|
|
<form action="/files/delete" method="post" onsubmit="return confirm('{{ _("Delete file: %(file_name)s?", file_name=file["name"]) }}')">
|
|
<input name="file_name" type="hidden" value="{{ file['name'] }}">
|
|
<input type="submit" value="{{ _("Delete") }}">
|
|
</form>
|
|
{% endif %}
|
|
</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
<p><small>{{ _("%(disk_space)s MB disk space remaining on the Pi", disk_space=free_disk) }}</small></p>
|
|
|
|
<hr/>
|
|
<details>
|
|
<summary class="heading">
|
|
{{ _("Attach Peripheral Device") }}
|
|
</summary>
|
|
<ul>
|
|
<li>{{ _("<a href=\"%(url1)s\">DaynaPORT SCSI/Link</a> and <a href=\"%(url2)s\">X68000 Host Bridge</a> are network devices.", url1="https://github.com/akuker/RASCSI/wiki/Dayna-Port-SCSI-Link", url2="https://github.com/akuker/RASCSI/wiki/X68000#Host_File_System_driver") }}
|
|
</li>
|
|
<ul>
|
|
<li>{{ _("If you have a DHCP setup, choose only the interface you have configured the bridge with. You can ignore the inet field when attaching.") }}</li>
|
|
<li>{{ _("Configure the network bridge by running easyinstall.sh, or follow the <a href=\"%(url)s\">manual steps in the wiki</a>.", url="https://github.com/akuker/RASCSI/wiki/Dayna-Port-SCSI-Link#manual-setup") }}
|
|
{% if bridge_configured %}
|
|
<li>{{ _("The <tt>rascsi_bridge</tt> network bridge is active and ready to be used by an emulated network adapter!") }}</li>
|
|
{% endif %}
|
|
</li>
|
|
</ul>
|
|
<li>{{ _("The Printer and Host Services device are currently supported on compatible Atari systems, and require <a href=\"%(url)s\">driver software</a> to be installed on the host system.", url="https://www.hddriver.net/en/rascsi_tools.html") }}
|
|
</li>
|
|
</ul>
|
|
</details>
|
|
<table border="black" cellpadding="3">
|
|
<tr style="font-weight: bold;">
|
|
<td>{{ _("Peripheral") }}</td>
|
|
<td>{{ _("Parameters and Actions") }}</td>
|
|
</tr>
|
|
{% for type in PERIPHERAL_DEVICE_TYPES %}
|
|
<tr>
|
|
<td>
|
|
<div>{{ device_types[type]["name"] }}</div>
|
|
</td>
|
|
<td>
|
|
<form action="/scsi/attach_device" method="post">
|
|
<input name="type" type="hidden" value="{{ type }}">
|
|
{% for key, value in device_types[type]["params"].items() %}
|
|
<label for="{{ key }}">{{ key }}:</label>
|
|
{% if value.isnumeric() %}
|
|
<input name="{{ key }}" type="number" value="{{ value }}">
|
|
{% elif key == "interface" %}
|
|
<select name="interface">
|
|
{% for if in netinfo["ifs"] %}
|
|
<option value="{{ if }}">
|
|
{{ if }}
|
|
</option>
|
|
{% endfor %}
|
|
</select>
|
|
{% else %}
|
|
<input name="{{ key }}" type="text" size="{{ value|length }}" placeholder="{{ value }}">
|
|
{% endif %}
|
|
{% endfor %}
|
|
<label for="scsi_id">{{ _("SCSI ID:") }}</label>
|
|
<select name="scsi_id">
|
|
{% for id in scsi_ids %}
|
|
<option value="{{ id }}"{% if id == recommended_id %} selected{% endif %}>
|
|
{{ id }}
|
|
</option>
|
|
{% endfor %}
|
|
</select>
|
|
<label for="unit">{{ _("LUN") }}</label>
|
|
<input name="unit" type="number" value="0" min="0" max="31" step="1">
|
|
<input type="submit" value="{{ _("Attach") }}">
|
|
</form>
|
|
</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</table>
|
|
{% if macproxy_configured %}
|
|
<p><small>{{ _("Macproxy is running at %(ip_addr)s (default port 5000)", ip_addr=ip_addr) }}</small></p>
|
|
{% else %}
|
|
<p><small>{{ _("Install <a href=\"%(url)s\">Macproxy</a> to browse the Web with any vintage browser. It's not just for Macs!", url="https://github.com/akuker/RASCSI/wiki/Vintage-Web-Proxy#macproxy") }}</small></p>
|
|
{% endif %}
|
|
|
|
<hr/>
|
|
<details>
|
|
<summary class="heading">
|
|
{{ _("Upload File") }}
|
|
</summary>
|
|
<ul>
|
|
<li>{{ _("Uploads file to <tt>%(directory)s</tt>. The largest file size accepted is %(max_file_size)s MB.", directory=base_dir, max_file_size=max_file_size) }}</li>
|
|
<li>{{ _("For unrecognized file types, try renaming hard drive images to '.hds', CD-ROM images to '.iso', and removable drive images to '.hdr' before uploading.") }}</li>
|
|
<li>{{ _("Recognized file types: %(valid_file_suffix)s", valid_file_suffix=valid_file_suffix) }}</li>
|
|
</ul>
|
|
</details>
|
|
|
|
<table style="border: none">
|
|
<tr style="border: none">
|
|
<td style="border: none; vertical-align:top;">
|
|
<form name="dropper" action="/files/upload" method="post" class="dropzone dz-clickable" enctype="multipart/form-data" id="dropper"></form>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
<script type="application/javascript">
|
|
Dropzone.options.dropper = {
|
|
paramName: 'file',
|
|
acceptedFiles: '{{ valid_file_suffix }}',
|
|
chunking: true,
|
|
forceChunking: true,
|
|
url: '/files/upload',
|
|
maxFilesize: {{ max_file_size }}, // MB
|
|
chunkSize: 1000000, // bytes
|
|
dictDefaultMessage: "{{ _("Drop files here to upload") }}",
|
|
dictFallbackMessage: "{{ _("Your browser does not support drag'n'drop file uploads.") }}",
|
|
dictFallbackText: "{{ _("Please use the fallback form below to upload your files like in the olden days.") }}",
|
|
dictFileTooBig: "{{ _("File is too big: {{filesize}}MB. Max filesize: {{maxFilesize}}MB.") }}",
|
|
dictInvalidFileType: "{{ _("You can't upload files of this type.") }}",
|
|
dictResponseError: "{{ _("Server responded with code: {{statusCode}}") }}",
|
|
dictCancelUpload:" {{ _("Cancel upload") }}",
|
|
dictUploadCanceled: "{{ _("Upload canceled.") }}",
|
|
dictCancelUploadConfirmation: "{{ _("Are you sure you want to cancel this upload?") }}",
|
|
dictRemoveFile: "{{ _("Remove file") }}",
|
|
dictMaxFilesExceeded: "{{ _("You can not upload any more files.") }}",
|
|
dictFileSizeUnits: {
|
|
tb: "{{ _("TB") }}",
|
|
gb: "{{ _("GB") }}",
|
|
mb: "{{ _("MB") }}",
|
|
kb: "{{ _("KB") }}",
|
|
b: "{{ _("B") }}"
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<hr/>
|
|
|
|
<details>
|
|
<summary class="heading">
|
|
{{ _("Download File to Images") }}
|
|
</summary>
|
|
<ul>
|
|
<li>{{ _("Given a URL, download that file to the <tt>%(directory)s</tt> directory.", directory=base_dir) }}</li>
|
|
</ul>
|
|
</details>
|
|
|
|
<table style="border: none">
|
|
<tr style="border: none">
|
|
<td style="border: none; vertical-align:top;">
|
|
<form action="/files/download_to_images" method="post">
|
|
<label for="url">{{ _("URL:") }}</label>
|
|
<input name="url" placeholder="{{ _("URL") }}" required="" type="url">
|
|
<input type="submit" value="{{ _("Download") }}" onclick="processNotify('{{ _("Downloading File to Images...") }}')">
|
|
</form>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<hr/>
|
|
|
|
<details>
|
|
<summary class="heading">
|
|
{{ _("Download File to AppleShare") }}
|
|
</summary>
|
|
<ul>
|
|
<li>{{ _("Given a URL, download that file to the <tt>%(directory)s</tt> directory and share it over AFP.", directory=AFP_DIR) }}</li>
|
|
<li>{{ _("Manage the files you download here through AppleShare on your vintage Mac.") }}</li>
|
|
<li>{{ _("Requires <a href=\"%(url)s\">Netatalk</a> to be installed and configured correctly for your network.", url="https://github.com/akuker/RASCSI/wiki/AFP-File-Sharing") }}</li>
|
|
</ul>
|
|
</details>
|
|
|
|
{% if netatalk_configured %}
|
|
<table style="border: none">
|
|
<tr style="border: none">
|
|
<td style="border: none; vertical-align:top;">
|
|
<form action="/files/download_to_afp" method="post">
|
|
<label for="url">{{ _("URL:") }}</label>
|
|
<input name="url" placeholder="{{ _("URL") }}" required="" type="url">
|
|
<input type="submit" value="{{ _("Download") }}" onclick="processNotify('{{ _("Downloading File to AppleShare...") }}')">
|
|
</form>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
|
|
{% if netatalk_configured == 1 %}
|
|
<p><small>{{ _("The AppleShare server is running. No active connections.") }}</small></p>
|
|
{% elif netatalk_configured == 2 %}
|
|
<p><small>{{ _("%(value)d active AFP connection", value=(netatalk_configured - 1)) }}</small></p>
|
|
{% elif netatalk_configured > 2 %}
|
|
<p><small>{{ _("%(value)d active AFP connections", value=(netatalk_configured - 1)) }}</small></p>
|
|
{% endif %}
|
|
{% else %}
|
|
<p>{{ _("Install <a href=\"%(url)s\">Netatalk</a> to use the AppleShare File Server.", url="https://github.com/akuker/RASCSI/wiki/AFP-File-Sharing") }}</p>
|
|
{% endif %}
|
|
|
|
<hr/>
|
|
|
|
<details>
|
|
<summary class="heading">
|
|
{{ _("Download File and Create CD-ROM image") }}
|
|
</summary>
|
|
<ul>
|
|
<li>{{ _("Create an ISO file system CD-ROM image with the downloaded file, and mount it on the given SCSI ID.") }}</li>
|
|
<li>{{ _("HFS is for Mac OS, Joliet for Windows, and Rock Ridge for POSIX.") }}</li>
|
|
<li>{{ _("On Mac OS, a <a href=\"%(url)s\">compatible CD-ROM driver</a> is required.", url="https://github.com/akuker/RASCSI/wiki/Drive-Setup#Mounting_CD_ISO_or_MO_images") }}</li>
|
|
<li>{{ _("If the downloaded file is a zip archive, we will attempt to unzip it and store the resulting files.") }}</li>
|
|
</ul>
|
|
</details>
|
|
<table style="border: none">
|
|
<tr style="border: none">
|
|
<td style="border: none; vertical-align:top;">
|
|
<label for="scsi_id">{{ _("SCSI ID:") }}</label>
|
|
<form action="/files/download_to_iso" method="post">
|
|
<select name="scsi_id">
|
|
{% for id in scsi_ids %}
|
|
<option value="{{ id }}"{% if id == recommended_id %} selected{% endif %}>
|
|
{{ id }}
|
|
</option>
|
|
{% endfor %}
|
|
</select>
|
|
<label for="url">{{ _("URL:") }}</label>
|
|
<input name="url" placeholder="{{ _("URL") }}" required="" type="url">
|
|
<label for="type">{{ _("Type:") }}</label>
|
|
<select name="type">
|
|
<option value="-hfs">
|
|
HFS
|
|
</option>
|
|
<option value="-iso-level 1">
|
|
ISO-9660 Level 1
|
|
</option>
|
|
<option value="-iso-level 2">
|
|
ISO-9660 Level 2
|
|
</option>
|
|
<option value="-iso-level 3">
|
|
ISO-9660 Level 3
|
|
</option>
|
|
<option value="-J">
|
|
Joliet
|
|
</option>
|
|
<option value="-r">
|
|
Rock Ridge
|
|
</option>
|
|
</select>
|
|
<input type="submit" value="{{ _("Download and Mount CD-ROM image") }}" onclick="processNotify('{{ _("Downloading File and generating CD-ROM image...") }}')">
|
|
</form>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<hr/>
|
|
|
|
<details>
|
|
<summary class="heading">
|
|
{{ _("Create Empty Disk Image File") }}
|
|
</summary>
|
|
<ul>
|
|
<li>{{ _("The Generic image type is recommended for most computer platforms.") }}</li>
|
|
<li>{{ _("APPLE GENUINE (.hda) and NEC GENUINE (.hdn) image types will make RaSCSI behave as a particular drive type that are recognized by Mac and PC98 systems, respectively.") }}</li>
|
|
<li>{{ _("SASI images should only be used on the original Sharp X68000, or other legacy systems that utilize this pre-SCSI standard.") }}</li>
|
|
</ul>
|
|
</details>
|
|
<table style="border: none">
|
|
<tr style="border: none">
|
|
<td style="border: none; vertical-align:top;">
|
|
<form action="/files/create" method="post">
|
|
<label for="file_name">{{ _("File Name:") }}</label>
|
|
<input name="file_name" placeholder="{{ _("File Name") }}" required="" type="text">
|
|
<label for="type">{{ _("Type:") }}</label>
|
|
<select name="type">
|
|
<option value="hds">
|
|
{{ _("SCSI Hard Disk image (Generic) [.hds]") }}
|
|
</option>
|
|
<option value="hda">
|
|
{{ _("SCSI Hard Disk image (APPLE GENUINE) [.hda]") }}
|
|
</option>
|
|
<option value="hdn">
|
|
{{ _("SCSI Hard Disk image (NEC GENUINE) [.hdn]") }}
|
|
</option>
|
|
<option value="hdr">
|
|
{{ _("SCSI Removable Media Disk image (Generic) [.hdr]") }}
|
|
</option>
|
|
<option value="hdf">
|
|
{{ _("SASI Hard Disk image (Legacy) [.hdf]") }}
|
|
</option>
|
|
</select>
|
|
<label for="size">{{ _("Size:") }}</label>
|
|
<input name="size" type="number" placeholder="{{ _("MB") }}" min="1" max="262144" required>
|
|
<input type="submit" value="{{ _("Create") }}">
|
|
</form>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<hr/>
|
|
|
|
<details>
|
|
<summary class="heading">
|
|
{{ _("Create Named Drive") }}
|
|
</summary>
|
|
<ul>
|
|
<li>{{ _("Create pairs of images and properties files from a list of real-life drives.") }}</li>
|
|
<li>{{ _("This will make RaSCSI use certain vendor strings and block sizes that may improve compatibility with certain systems.") }}</li>
|
|
</ul>
|
|
</details>
|
|
<p><a href="/drive/list">{{ _("Create a named disk image that mimics real-life drives") }}</a></p>
|
|
|
|
<hr/>
|
|
|
|
<details>
|
|
<summary class="heading">
|
|
{{ _("Logging") }}
|
|
</summary>
|
|
<ul>
|
|
<li>{{ _("Fetch a certain number of lines of system logs with the given scope.") }}</li>
|
|
</ul>
|
|
</details>
|
|
<table style="border: none">
|
|
<tr style="border: none">
|
|
<td style="border: none; vertical-align:top;">
|
|
<form action="/logs/show" method="post">
|
|
<label for="lines">{{ _("Log Lines:") }}</label>
|
|
<input name="lines" type="number" value="200" min="0" max="99999" step="100">
|
|
<label for="scope">{{ _("Scope:") }}</label>
|
|
<select name="scope">
|
|
<option value="">
|
|
{{ _("All logs") }}
|
|
</option>
|
|
<option value="rascsi">
|
|
rascsi
|
|
</option>
|
|
<option value="rascsi-web">
|
|
rascsi-web
|
|
</option>
|
|
<option value="rascsi-oled">
|
|
rascsi-oled
|
|
</option>
|
|
<option value="rascsi-ctrlboard">
|
|
rascsi-ctrlboard
|
|
</option>
|
|
</select>
|
|
<input type="submit" value="{{ _("Show Logs") }}">
|
|
</form>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<hr/>
|
|
|
|
<details>
|
|
<summary class="heading">
|
|
{{ _("Server Log Level") }}
|
|
</summary>
|
|
<ul>
|
|
<li>{{ _("Change the log level of the RaSCSI backend process.") }}</li>
|
|
<li>{{ _("The current dropdown selection indicates the active log level.") }}</li>
|
|
</ul>
|
|
</details>
|
|
<table style="border: none">
|
|
<tr style="border: none">
|
|
<td style="border: none; vertical-align:top;">
|
|
<form action="/logs/level" method="post">
|
|
<label for="level">{{ _("Log Level:") }}</label>
|
|
<select name="level">
|
|
{% for level in log_levels %}
|
|
<option value="{{ level }}"{% if level == current_log_level %} selected{% endif %}>
|
|
{{ level }}
|
|
</option>
|
|
{% endfor %}
|
|
</select>
|
|
<input type="submit" value="{{ _("Set Log Level") }}">
|
|
</form>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<hr/>
|
|
|
|
<details>
|
|
<summary class="heading">
|
|
{{ _("Language") }}
|
|
</summary>
|
|
<ul>
|
|
<li>{{ _("Change the Web Interface language.") }}</li>
|
|
</ul>
|
|
</details>
|
|
<table style="border: none">
|
|
<tr style="border: none">
|
|
<td style="border: none; vertical-align:top;">
|
|
<form action="/language" method="post">
|
|
<label for="language">{{ _("Language:") }}</label>
|
|
<select name="locale">
|
|
{% for locale in locales %}
|
|
<option value="{{ locale.language }}">
|
|
{{ locale.language }} - {{ locale.display_name }}
|
|
</option>
|
|
{% endfor %}
|
|
</select>
|
|
<input type="submit" value="{{ _("Change Language") }}">
|
|
</form>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<hr/>
|
|
|
|
<details>
|
|
<summary class="heading">
|
|
{{ _("Raspberry Pi Operations") }}
|
|
</summary>
|
|
<ul>
|
|
<li>{{ _("Reboot or shut down the Raspberry Pi that RaSCSI is running on.") }}</li>
|
|
<li>{{ _("IMPORTANT: Always shut down the Pi before turning off the power. Failing to do so may lead to data loss.") }}</li>
|
|
</ul>
|
|
</details>
|
|
<table style="border: none">
|
|
<tr style="border: none">
|
|
<td style="border: none; vertical-align:top;">
|
|
<form action="/pi/reboot" method="post" onclick="if (confirm('{{ _("Reboot the Raspberry Pi?") }}')) shutdownNotify('{{ _("Rebooting the Raspberry Pi...") }}'); else event.preventDefault();">
|
|
<input type="submit" value="{{ _("Reboot Raspberry Pi") }}">
|
|
</form>
|
|
</td>
|
|
<td style="border: none; vertical-align:top;">
|
|
<form action="/pi/shutdown" method="post" onclick="if (confirm('{{ _("Shut down the Raspberry Pi?") }}')) shutdownNotify('{{ _("Shutting down the Raspberry Pi...") }}'); else event.preventDefault();">
|
|
<input type="submit" value="{{ _("Shut Down Raspberry Pi") }}">
|
|
</form>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
|
|
{% endblock content %}
|