2020-12-31 01:39:32 +00:00
{% extends "base.html" %}
2021-11-07 00:25:02 +00:00
{% block content %}
2020-12-31 01:39:32 +00:00
2023-02-15 02:48:53 +00:00
< script type = "application/javascript" >
var processNotify = function(Notification) {
document.getElementById("flash").innerHTML = "< div class = \"info\" > < div > " + Notification + "{{ _(" This process may take a while, and will continue in the background if you navigate away from this page.") }}< / div > < / div > ";
window.scrollTo(0,0);
}
var shutdownNotify = function(Notification) {
document.getElementById("flash").innerHTML = "< div class = \"warning\" > < div > " + Notification + "{{ _(" The Web Interface will become unresponsive momentarily. Reload this page after the Pi has started up again.") }}< / div > < / div > ";
window.scrollTo(0,0);
}
< / script >
2022-11-14 17:32:15 +00:00
< section id = "current-config" >
2021-11-07 00:25:02 +00:00
< details >
< summary class = "heading" >
2022-12-05 17:58:23 +00:00
{{ _("Current PiSCSI Configuration") }}
2021-11-07 00:25:02 +00:00
< / summary >
2021-09-28 20:39:08 +00:00
< ul >
2022-10-07 20:13:29 +00:00
< li > {{ _("Save and load device configurations, stored as json files in < tt > %(config_dir)s< / tt > ", config_dir=CFG_DIR) }}< / li >
2022-12-05 17:58:23 +00:00
< li > {{ _("To have a particular device configuration load when PiSCSI starts, save it as < em > default< / em > .") }}< / li >
2021-09-28 20:39:08 +00:00
< / ul >
2021-11-07 00:25:02 +00:00
< / details >
2022-10-07 20:13:29 +00:00
< p >
2023-01-28 22:34:34 +00:00
< form action = "/config/action" method = "post" id = "config-actions" >
2022-11-14 17:32:15 +00:00
< label for = "config_load_name" > {{ _("File Name:") }}< / label >
2022-10-07 20:13:29 +00:00
< select name = "name" id = "config_load_name" required = "" width = "14" >
2021-11-07 00:25:02 +00:00
{% if config_files %}
2022-02-21 17:27:31 +00:00
{% for config in config_files|sort %}
2021-11-07 00:25:02 +00:00
< option value = "{{ config }}" >
2022-10-07 20:13:29 +00:00
{{ config }}
2021-11-07 00:25:02 +00:00
< / option >
{% endfor %}
{% else %}
< option disabled >
2021-12-26 21:36:12 +00:00
{{ _("No saved configurations") }}
2021-11-07 00:25:02 +00:00
< / option >
{% endif %}
< / select >
2021-12-26 21:36:12 +00:00
< 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 ? " ) } } ' ) " >
2023-01-28 22:34:34 +00:00
< input name = "send" type = "submit" value = "{{ _(" Download " ) } } " >
2022-10-07 20:13:29 +00:00
< / form >
< / p >
< p >
2022-11-14 17:32:15 +00:00
< form action = "/config/save" method = "post" id = "config-save" >
< label for = "config_save_name" > {{ _("File Name:") }}< / label >
< input type = "text" name = "name" id = "config_save_name" value = "default" size = "20" >
2022-10-07 20:13:29 +00:00
.{{ CONFIG_FILE_SUFFIX }}
2021-12-26 21:36:12 +00:00
< input type = "submit" value = "{{ _(" Save " ) } } " >
2022-10-07 20:13:29 +00:00
< / form >
< / p >
2021-11-07 00:25:02 +00:00
2022-11-14 17:32:15 +00:00
< table id = "attached-devices" border = "black" cellpadding = "3" summary = "List of attached devices" >
2021-11-07 00:25:02 +00:00
< tbody >
2020-12-31 01:39:32 +00:00
< tr >
2022-11-14 17:32:15 +00:00
< th class = "id" scope = "col" > {{ _("ID") }}< / th >
2021-11-07 00:25:02 +00:00
{% if units %}
2022-11-14 17:32:15 +00:00
< th class = "unit" scope = "col" > {{ _("LUN") }}< / th >
2021-11-07 00:25:02 +00:00
{% endif %}
2022-11-14 17:32:15 +00:00
< th class = "name" scope = "col" > {{ _("Device") }}< / th >
< th class = "parameters" scope = "col" > {{ _("Parameters") }}< / th >
< th class = "product" scope = "col" > {{ _("Product") }}< / th >
< th class = "actions" scope = "col" > {{ _("Actions") }}< / th >
2020-12-31 01:39:32 +00:00
< / tr >
2022-10-03 18:47:08 +00:00
{% for device in devices | sort(attribute='id') %}
2022-11-14 17:32:15 +00:00
{% if device["id"] in reserved_scsi_ids %}
< tr class = "reserved" >
{% elif device.device_type %}
< tr class = "device-assigned device-{{ device.device_type|lower }}" >
{% else %}
< tr class = "free" >
{% endif %}
2021-09-19 21:29:01 +00:00
{% if device["id"] not in reserved_scsi_ids %}
2022-11-14 17:32:15 +00:00
< td class = "id" align = "center" > {{ device.id }}< / td >
2021-11-07 00:25:02 +00:00
{% if units %}
2022-11-14 17:32:15 +00:00
< td class = "unit" align = "center" > {{ device.unit }}< / td >
2021-11-07 00:25:02 +00:00
{% endif %}
2022-11-14 17:32:15 +00:00
< td class = "name" align = "center" > {{ device.device_name }}< / td >
< td class = "parameters" >
2021-11-09 02:55:04 +00:00
{% 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 }}" >
2022-10-07 20:13:29 +00:00
< label for = "device_list_file_name_{{ device.id }}_{{ device.unit }}" > {{ _("File name") }}< / label >
< select type = "select" name = "file_name" id = "device_list_file_name_{{ device.id }}_{{ device.unit }}" >
2022-02-27 05:46:35 +00:00
{% for f in files|sort(attribute='name') %}
2021-11-09 02:55:04 +00:00
{% if device.device_type == "SCCD" %}
2022-10-07 20:13:29 +00:00
{% if f["name"].lower().endswith(env['cd_suffixes']) %}
< option value = "{{ f[" name " ] } } " > {{ f["name"].replace(env["image_dir"], '') }}< / option >
2021-11-09 02:55:04 +00:00
{% endif %}
{% elif device.device_type == "SCRM" %}
2022-10-07 20:13:29 +00:00
{% if f["name"].lower().endswith(env['rm_suffixes']) %}
< option value = "{{ f[" name " ] } } " > {{ f["name"].replace(env["image_dir"], '') }}< / option >
2021-11-09 02:55:04 +00:00
{% endif %}
{% elif device.device_type == "SCMO" %}
2022-10-07 20:13:29 +00:00
{% if f["name"].lower().endswith(env['mo_suffixes']) %}
< option value = "{{ f[" name " ] } } " > {{ f["name"].replace(env["image_dir"], '') }}< / option >
2021-11-09 02:55:04 +00:00
{% endif %}
{% endif %}
{% endfor %}
< / select >
2021-12-26 21:36:12 +00:00
< input type = "submit" value = "{{ _(" Attach " ) } } " >
2021-11-09 02:55:04 +00:00
< / form >
{% else %}
2022-11-14 17:32:15 +00:00
{% if device.params %}
{% for key in device.params %}
{% if key == "interface" %}
({{device.params[key]}})
{% elif key == "timeout" %}
({{key}}:{{device.params[key]}})
{% else %}
{{device.params[key]}}
{% endif %}
{% endfor %}
{% elif device.file %}
< span class = "filename" > {{ device.file }}< / span >
{% endif %}
2021-11-07 00:25:02 +00:00
{% endif %}
2022-10-03 18:47:08 +00:00
< / td >
2022-11-14 17:32:15 +00:00
< td class = "product" align = "center" >
2022-12-05 17:58:23 +00:00
{% if device.vendor != "PiSCSI" %}
2022-10-03 18:47:08 +00:00
{{ device.vendor }}
{% endif %}
{{ device.product }}
2022-12-05 17:58:23 +00:00
{% if device.vendor != "PiSCSI" %}
2022-10-03 18:47:08 +00:00
{{ device.revision }}
{% endif %}
< / td >
2022-11-14 17:32:15 +00:00
< td class = "actions" align = "center" >
2022-10-07 20:13:29 +00:00
{% if device.id in scsi_ids["occupied_ids"] %}
2021-11-07 00:25:02 +00:00
{% if device.device_type in REMOVABLE_DEVICE_TYPES and "No Media" not in device.status %}
2021-12-26 21:36:12 +00:00
< form action = "/scsi/eject" method = "post" onsubmit = "return confirm('{{ _(" Eject Disk ? WARNING: On Mac OS , eject the Disk in the Finder instead ! " ) } } ' ) " >
2021-11-07 00:25:02 +00:00
< input name = "scsi_id" type = "hidden" value = "{{ device.id }}" >
2021-11-07 02:11:17 +00:00
< input name = "unit" type = "hidden" value = "{{ device.unit }}" >
2021-12-26 21:36:12 +00:00
< input type = "submit" value = "{{ _(" Eject " ) } } " >
Move to protobuf for the webapp, major overhaul to easyinstall.sh, code comment translations (#229)
* Making saving and loading config files work with protobuf
* Formatted the Status column, and fixed the available ID logic
* Updated handling of removed status for devices without image file support
* Comment update
* Fixed typo
* Updated logging
* Updated handling of removed status for devices without image file support
* Comment update
* Fixed typo
* Updated logging
* Better handling of device status
* Updated parameter handling
* Updated setting default interfaces
* Revert "Updated setting default interfaces"
This reverts commit 210abc775d9a79dd0c631cf3877966a2923f4d5b.
* Revert "Updated parameter handling"
This reverts commit 35302addd59f5f5e1cc032888ba32dcbb426a846.
* Abort with a 404 if rascsi is not running. Use any protobuf response to determine whether rascsi is running (should hardly be required anymore due to the other change, but just in case).
* Move id reservation back into __main__
* Remove check for device type when validating Removed image
* Leverage device property data for better status messages
* Remove redundant string sanitation when reading config csv file
* Clean up device list generation
* Cleanup
* Remove duplicates before building valid scsi id list
* Fully translated cfilesystem.h code comments to English; partially translated cfilesystem.cpp
* rascsi supports reserving IDs
* Updated help message
* Replaced BOOL by bool
* Logging update
* Logging update
* Cleanup
* Restructure the easyinstall.sh script to combine the install/update flows, and disallow installing the webapp by itself
* Remove redundant steps handled in Makefile
* Add the functionality to specify connect_type through a parameter
* Add validation to the argument parser allowing only STANDARD and FULLSPEC as options
* Complete translation of code comments for cfilesystem.h; partial translation for cfilesystem.cpp
* Cleanup
* Merge parts of the Network Assistant script by sonique6784; fix the run_choice startup parameter
* Improve on the network setup messages
* Fix routing address
* Add checks for previous configuration; cleanup
* Cleanup
* Remove redundant step in wired setup. Improve messages.
* Cleanup
* Added default parameters to device properties
* Return parameters a device was set up with
* Add flows for configuring custom network settings; adopting some logic by sonique6784
* Improved device initialization
* Updated default parameter handling
* Updated default parameter handling
* Fixed typo
* Comment updates
* Comment update
* Make iso generation work again, and add error handling to urllib actions
* Manage default parameters in the respective device
* Print available network interfaces. Clean up step and improve descriptive messages.
* Make the script clean up previous configurations
* Make the script only show relevant interfaces
* Partial translation of cfilesystem.cpp
* Do not pass empty parameter string
* Added supports_params flag
* Completely translate code comments in cfilesystem.cpp
* Show rascsi-web status after installing
* Refactoring
* Made comparisons more consistent
* Updated error handling
* Updated exception handling
* Made comparisons more consistent
* Updated error handling
* Overlooked code comment translation
* Renaming
* Better error handling for socket connection
* Disable two NEC hd image types due to issue#232
* Comment update
* NEC sectors size must be 512 bytes
* Updated logging
* Updated vendor name handling
* Updated handling of media loading/unloading
* Comment update
* NEC sectors size must be 512 bytes
* Updated logging
* Updated vendor name handling
* Updated handling of media loading/unloading
* Better handling of removable disks in the web ui
* Added stoppable property and stopped status
* Made MO stoppable
* Removed duplicate code
* Removed duplicate code
* Copy read-only property
* Renaming
* Add an assistant for reserving scsi ids
* Don't show action if no device attached
* Implement a device_info app path, and cut down on device columns always shown
* Cleanup
* Removed duplicate code, added START/STOP
* Improved default parameter handling
* Updated load/eject handling
* Logging update
* Fixed typo
* Verified START/STOP UNIT
* Updated logging
* Updated status handling
* Updated status handling
* More status handling updates
* Logging update
* Made instance fields local variables
* Removed duplicate code, added START/STOP
* Improved default parameter handling
* Updated load/eject handling
* Logging update
* Fixed typo
* Verified START/STOP UNIT
* Updated logging
* Updated status handling
* Updated status handling
* More status handling updates
* Logging update
* Made instance fields local variables
* Made disk_t private
* Made some data structures private
* Fixed ARM compile issue
* Fast forward instead of rebase existing git repo
* Fixed ctapdriver initialization issue
* Reset read-only status when opening an image file
* Cleanup
* Cleanup
* Made logging more consistent
* Updated log level
* Cleanup
* Log load/eject on error level for testing
* Revert "Log load/eject on error level for testing"
This reverts commit d35a15ea8e520517d25e1e1054ad1aeda9f85f2e.
* Assume drive is not ready after having been stopped
* Updated status handling
* Make the csv config files store all relevant device data for reading
* Read 9 column csv config files
* Fixed typo
* Rebuild manpage
* Fixed issue #234 (MODE SENSE (10) returns wrong mode parameter header)
* Removed unused code
* Enum data type update
* Removed duplicate range check
* Removed duplicate code
* Removed more duplicate code
* Logging update
* SCCD sector size was not meant to be configurable
* Better error handling for csv reading and writing
* Updated configurable sector size properties
* Removed assertion
* Improved error handling
* Updated error handling
* Re-added special error handling only relevant for SASI
* Added TODOs
* Comment update
* Added override modifier
* Removed obsolete debug flag (related code was not called)
* Comment and logging updates
* Removed obsolete try/catch
* Revert "Removed obsolete try/catch"
This reverts commit 39ca12d8b153c706316ce79f4fec65c9abc60024.
* Comment update
* Removed duplicate code
* Updated error messages, use more foreach loops
* Avoid storing RaSCSI generated product info in config file
* Updated logging
* Logging update
* Save config files in json instead of csv
* Fix bugs with json config loading
* Refactoring & remove unused code
* Refactoring
* Display upper case file endings in file management list
* Only show product vendor for non-RaSCSI devices in the device list
* Translate code comment
* Refactoring
* Fix bad identation
* Improve valid file extension handling
* Add validation when attaching removable media
* Display valid file endings under the file list
* Cleanup
* Don't store 0 block size
* Fix indentation
* Read and write config files in key:pair format
* Add section for controlling logging
* README update
* Added block_count
* Cleanup, fix typos
* Support attaching CD-ROM with custom block size
* Evaluate block size when inserting a media
* rasctl display capacity if available
* Info message update
* Use kwargs for device attachment
* Fix bugs in attach_image kwargs; make config file more readable
* POC for attaching device with profile
* Only list product types valid for the particular image file
* Perform validation of HDD image size based on the product profile
* Implement sidecar config files for drive images.
* Added missing product name to NEC vital product data
* MO block size depends on capacity only
* Better error handling for device sidecar config loading
* Extended property/status display
* Property display update
* Updated error handling
* Handle image sizes in bytes internally
* Revert change
* Resolve bad merge
Co-authored-by: Uwe Seimet <Uwe.Seimet@seimet.de>
2021-09-15 02:51:12 +00:00
< / form >
2022-09-26 00:37:28 +00:00
{% endif %}
2021-12-26 21:36:12 +00:00
< form action = "/scsi/detach" method = "post" onsubmit = "return confirm('{{ _(" Detach Device ? " ) } } ' ) " >
2021-11-07 00:25:02 +00:00
< input name = "scsi_id" type = "hidden" value = "{{ device.id }}" >
2021-11-07 02:11:17 +00:00
< input name = "unit" type = "hidden" value = "{{ device.unit }}" >
2021-12-26 21:36:12 +00:00
< input type = "submit" value = "{{ _(" Detach " ) } } " >
2020-12-31 01:39:32 +00:00
< / form >
2022-10-07 20:13:29 +00:00
{% 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;" >
2021-11-07 02:11:17 +00:00
< input name = "scsi_id" type = "hidden" value = "{{ device.id }}" >
< input name = "memo" id = "memo_{{ device.id }}" type = "hidden" value = "" >
2021-12-26 21:36:12 +00:00
< input type = "submit" value = "{{ _(" Reserve " ) } } " >
2021-11-07 02:11:17 +00:00
< / form >
2022-10-07 20:13:29 +00:00
{% endif %}
2020-12-31 01:39:32 +00:00
< / td >
{% else %}
2022-11-14 17:32:15 +00:00
< td class = "id inactive" > {{ device.id }}< / td >
2021-11-07 00:25:02 +00:00
{% if units %}
2022-11-14 17:32:15 +00:00
< td class = "units inactive" > < / td >
2021-11-07 00:25:02 +00:00
{% endif %}
2022-11-14 17:32:15 +00:00
< td class = "name inactive" > {{ _("Reserved ID") }}< / td >
< td class = "parameters inactive" > {{ RESERVATIONS[device.id] }}< / td >
< td class = "product inactive" > < / td >
< td class = "actions inactive" >
2022-02-21 19:31:38 +00:00
< form action = "/scsi/release" method = "post" >
2021-11-07 02:11:17 +00:00
< input name = "scsi_id" type = "hidden" value = "{{ device.id }}" >
2022-02-21 19:31:38 +00:00
< input type = "submit" value = "{{ _(" Release " ) } } " >
2021-11-07 02:11:17 +00:00
< / form >
< / td >
2020-12-31 01:39:32 +00:00
{% endif %}
< / tr >
{% endfor %}
2021-11-07 00:25:02 +00:00
< / tbody >
< / table >
2022-10-07 20:13:29 +00:00
< p >
2022-11-14 17:32:15 +00:00
< form action = "/scsi/detach_all" method = "post" id = "detach-all-devices" onsubmit = "return confirm('{{ _(" Detach all SCSI Devices ? " ) } } ' ) " >
2022-10-07 20:13:29 +00:00
< input type = "submit" value = "{{ _(" Detach All Devices " ) } } " >
< / form >
2022-11-14 17:32:15 +00:00
< form action = "/scsi/info" method = "post" id = "show-device-info" >
2022-10-07 20:13:29 +00:00
< input type = "submit" value = "{{ _(" Show Device Info " ) } } " >
< / form >
< / p >
2022-11-14 17:32:15 +00:00
< / section >
2021-11-07 00:25:02 +00:00
< hr / >
2022-11-14 17:32:15 +00:00
< section id = "files" >
2021-11-07 00:25:02 +00:00
< details >
< summary class = "heading" >
2021-12-26 21:36:12 +00:00
{{ _("Image File Management") }}
2021-11-07 00:25:02 +00:00
< / summary >
2021-09-28 20:39:08 +00:00
< ul >
2022-12-05 17:58:23 +00:00
< li > {{ _("Manage image files in the active PiSCSI image directory: < tt > %(directory)s< / tt > with a scan depth of %(scan_depth)s.", directory=env["image_dir"], scan_depth=scan_depth) }}< / li >
2022-10-03 19:46:18 +00:00
< li > {{ _("Select a valid SCSI ID and < a href = \"%(url)s\" target = \"_blank\" > 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") }}
2021-11-07 00:25:02 +00:00
< / li >
2022-09-22 00:20:22 +00:00
< li >
{{ _("Recognized image file types:") }}
{% set comma = joiner(", ") %}
{% for extension in valid_image_suffixes %}{{ comma() }}.{{ extension}}{% endfor %}
< / li >
< li >
{{ _("Recognized archive file types:") }}
{% set comma = joiner(", ") %}
{% for extension in ARCHIVE_FILE_SUFFIXES %}{{ comma() }}.{{ extension}}{% endfor %}
< / li >
2021-09-28 20:39:08 +00:00
< / ul >
2021-11-07 00:25:02 +00:00
< / details >
2021-09-28 20:39:08 +00:00
2023-02-25 01:28:58 +00:00
{% if not files|length: %}
< div class = "notice" >
{{ _("The images directory is currently empty.") }}
< / div >
{% else %}
< div >
{% for subdir, group in formatted_image_files.items() %}
2023-05-21 22:27:50 +00:00
< details class = "subdir" { % if subdir = = env [ " image_root_dir " ] + " / " % } open { % endif % } >
2023-02-25 01:28:58 +00:00
< summary class = "dirname" >
{{ subdir }}
< / summary >
2022-11-14 17:32:15 +00:00
< table id = "images" border = "black" cellpadding = "3" summary = "List of files in the image directory" >
2021-11-07 00:25:02 +00:00
< tbody >
2022-10-07 20:13:29 +00:00
< tr >
< th scope = "col" > {{ _("File") }}< / th >
< th scope = "col" > {{ _("Size") }}< / th >
< th scope = "col" > {{ _("Actions") }}< / th >
2020-12-31 01:39:32 +00:00
< / tr >
2023-02-25 01:28:58 +00:00
{% for file in group|sort(attribute='name') %}
2020-12-31 01:39:32 +00:00
< tr >
2021-10-24 06:00:40 +00:00
{% if file["prop"] %}
< td >
2023-02-25 01:28:58 +00:00
< details class = "contents" >
< summary class = "filename" >
2021-11-07 00:25:02 +00:00
{{ file["name"] }}
< / summary >
2022-10-07 20:13:29 +00:00
< ul class = "inline_list" >
2021-10-24 06:00:40 +00:00
{% for key in file["prop"] %}
2021-11-07 00:25:02 +00:00
< li > {{ key }}: {{ file['prop'][key] }}< / li >
2021-10-24 06:00:40 +00:00
{% endfor %}
2023-01-27 02:10:53 +00:00
< form action = "/files/download_config" method = "post" >
< input name = "file" type = "hidden" value = "{{ file['name'] }}.{{ PROPERTIES_SUFFIX }}" >
2021-12-26 21:36:12 +00:00
< input type = "submit" value = "{{ _(" Properties File " ) } } & # 8595 ; " >
2021-11-09 03:10:52 +00:00
< / form >
2021-10-24 06:00:40 +00:00
< / ul >
2021-11-07 00:25:02 +00:00
< / details >
2021-10-24 06:00:40 +00:00
< / td >
2022-08-12 03:19:02 +00:00
{% elif file["archive_contents"] %}
2021-10-26 20:05:15 +00:00
< td >
2023-02-25 01:28:58 +00:00
< details class = "contents" >
< summary class = "filename" >
2021-11-07 00:25:02 +00:00
{{ file["name"] }}
< / summary >
2022-10-07 20:13:29 +00:00
< ul class = "inline_list" >
2022-08-12 03:19:02 +00:00
{% for member in file["archive_contents"] %}
{% if not member["is_properties_file"] %}
2021-11-14 01:38:01 +00:00
< li >
2022-08-12 03:19:02 +00:00
{% if member["related_properties_file"] %}
2023-02-25 01:28:58 +00:00
< details id = "contents" >
< summary class = "filename" >
2022-08-12 03:19:02 +00:00
< label > {{ member["path"] }}< / label >
2022-11-14 17:32:15 +00:00
< form action = "/files/extract_image" method = "post" class = "file-extract" >
2022-08-12 03:19:02 +00:00
< input name = "archive_file" type = "hidden" value = "{{ file['name'] }}" >
< input name = "archive_members" type = "hidden" value = "{{ member[" path " ] } } | { { member [ " related_properties_file " ] } } " >
2022-11-14 17:32:15 +00:00
< input type = "submit" value = "{{ _(" Extract " ) } } " title = "{{ _(" Extract " ) } } " onclick = "processNotify('{{ _(" Extracting a single file . . . " ) } } ' ) " >
2022-08-12 03:19:02 +00:00
< / form >
< / summary >
2022-10-07 20:13:29 +00:00
< ul class = "inline_list" >
2022-08-12 03:19:02 +00:00
< li > {{ member["related_properties_file"] }}< / li >
< / ul >
< / details >
{% else %}
< label > {{ member["path"] }}< / label >
2022-11-14 17:32:15 +00:00
< form action = "/files/extract_image" method = "post" class = "file-extract" >
2022-08-12 03:19:02 +00:00
< input name = "archive_file" type = "hidden" value = "{{ file[" name " ] } } " >
< input name = "archive_members" type = "hidden" value = "{{ member[" path " ] } } " >
2022-11-14 17:32:15 +00:00
< input type = "submit" value = "{{ _(" Extract " ) } } " title = "{{ _(" Extract " ) } } " onclick = "processNotify('{{ _(" Extracting a single file . . . " ) } } ' ) " >
2022-08-12 03:19:02 +00:00
< / form >
{% endif %}
2021-11-14 01:38:01 +00:00
< / li >
{% endif %}
2022-08-12 03:19:02 +00:00
{% endfor %}
2021-10-26 20:05:15 +00:00
< / ul >
2021-11-07 00:25:02 +00:00
< / details >
2021-10-26 20:05:15 +00:00
< / td >
2021-11-07 00:25:02 +00:00
{% else %}
< td > {{ file["name"] }}< / td >
{% endif %}
2022-10-07 20:13:29 +00:00
< td align = "center" >
2023-01-27 02:10:53 +00:00
< form action = "/files/download_image" method = "post" >
2022-10-09 20:50:20 +00:00
< input name = "file" type = "hidden" value = "{{ file['name'] }}" >
2022-09-25 21:37:36 +00:00
< input type = "submit" value = "{{ file['size_mb'] }} {{ _(" MiB " ) } } & # 8595 ; " >
2020-12-31 01:39:32 +00:00
< / form >
< / td >
2021-11-07 00:25:02 +00:00
< td >
{% if file["name"] in attached_images %}
2022-09-27 00:44:41 +00:00
{{ _("In use") }}
2021-11-07 00:25:02 +00:00
{% else %}
2022-08-12 03:19:02 +00:00
{% if file["archive_contents"] %}
2022-11-14 17:32:15 +00:00
< form action = "/files/extract_image" method = "post" class = "file-extract" >
2022-08-12 03:19:02 +00:00
< 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 % } " >
2022-11-14 17:32:15 +00:00
< input type = "submit" value = "{{ _(" Extract " ) } } " title = "{{ _(" Extract " ) } } " onclick = "processNotify('{{ _(" Extracting all files . . . " ) } } ' ) " >
2021-11-07 00:25:02 +00:00
< / form >
{% else %}
2022-11-14 17:32:15 +00:00
< form action = "/scsi/attach" method = "post" class = "file-attach" >
2021-11-07 00:25:02 +00:00
< input name = "file_name" type = "hidden" value = "{{ file['name'] }}" >
< input name = "file_size" type = "hidden" value = "{{ file['size'] }}" >
2022-10-07 20:13:29 +00:00
< label for = "image_list_scsi_id_{{ file[" name " ] } } " > {{ _("ID") }}< / label >
< select name = "scsi_id" id = "image_list_scsi_id_{{ file[" name " ] } } " >
2022-10-06 17:00:57 +00:00
{% for id in scsi_ids["valid_ids"] %}
< option name = "id" value = "{{id}}" { % if id = = scsi_ids [ " recommended_id " ] % } selected { % endif % } >
2021-11-07 00:25:02 +00:00
{{ id }}
< / option >
{% endfor %}
< / select >
2022-10-07 20:13:29 +00:00
< label for = "image_list_unit_{{ file[" name " ] } } " > {{ _("LUN") }}< / label >
< input class = "lun" name = "unit" id = "image_list_unit_{{ file[" name " ] } } " type = "number" value = "0" min = "0" max = "31" step = "1" size = "3" >
2021-11-07 00:25:02 +00:00
{% if file["detected_type"] != "UNDEFINED" %}
< input name = "type" type = "hidden" value = "{{ file['detected_type'] }}" >
2022-02-13 16:28:50 +00:00
{{ file['detected_type_name'] }}
2021-11-07 00:25:02 +00:00
{% else %}
2022-10-07 20:13:29 +00:00
< label for = "image_list_type_{{ file[" name " ] } } " > {{ _("Type") }}< / label >
< select name = "type" id = "image_list_type_{{ file[" name " ] } } " >
2022-02-13 16:28:50 +00:00
< option selected disabled value = "" >
2022-10-07 20:13:29 +00:00
{{ _("Unknown") }}
2021-11-07 00:25:02 +00:00
< / option >
2022-02-13 16:28:50 +00:00
{% for key, value in device_types.items() %}
2022-02-21 17:27:31 +00:00
{% if key in DISK_DEVICE_TYPES %}
2022-02-08 00:48:55 +00:00
< option value = "{{ key }}" >
2022-02-21 17:27:31 +00:00
{{ value["name"] }}
2021-11-07 00:25:02 +00:00
< / option >
2022-02-08 00:48:55 +00:00
{% endif %}
2020-12-31 01:39:32 +00:00
{% endfor %}
2022-02-08 00:48:55 +00:00
< / select >
2021-11-07 00:25:02 +00:00
{% endif %}
2022-11-14 17:32:15 +00:00
< input type = "submit" value = "{{ _(" Attach " ) } } " title = "{{ _(" Attach " ) } } " >
2021-11-07 00:25:02 +00:00
{% endif %}
2020-12-31 01:39:32 +00:00
< / form >
2023-05-21 22:32:19 +00:00
< form action = "/files/rename" method = "post" class = "file-rename" onsubmit = "var new_file_name = prompt('{{ _(" Enter a new file name: " ) } } ' , ' { { file [ " name " ] | replace ( " ' " , " \ \ ' " ) } } ' ) ; if ( new_file_name = == null ) event . preventDefault ( ) ; document . getElementById ( ' new_file_name_ { { subdir } } _ { { loop . index } } ' ) . value = new_file_name;" >
2021-12-14 02:50:36 +00:00
< input name = "file_name" type = "hidden" value = "{{ file['name'] }}" >
2023-03-24 03:07:41 +00:00
< input name = "new_file_name" id = "new_file_name_{{ subdir }}_{{ loop.index }}" type = "hidden" value = "" >
2022-11-14 17:32:15 +00:00
< input type = "submit" value = "{{ _(" Rename " ) } } " title = "{{ _(" Rename " ) } } " >
2021-12-14 02:50:36 +00:00
< / form >
2023-05-21 22:32:19 +00:00
< form action = "/files/copy" method = "post" class = "file-copy" onsubmit = "var copy_file_name = prompt('{{ _(" Enter a file name for the copy: " ) } } ' , ' { { file [ " name " ] | replace ( " ' " , " \ \ ' " ) } } ' ) ; if ( copy_file_name = == null ) event . preventDefault ( ) ; document . getElementById ( ' copy_file_name_ { { subdir } } _ { { loop . index } } ' ) . value = copy_file_name;" >
2022-06-15 02:03:56 +00:00
< input name = "file_name" type = "hidden" value = "{{ file['name'] }}" >
2023-03-24 03:07:41 +00:00
< input name = "copy_file_name" id = "copy_file_name_{{ subdir }}_{{ loop.index }}" type = "hidden" value = "" >
2022-11-14 17:32:15 +00:00
< input type = "submit" value = "{{ _(" Copy " ) } } " title = "{{ _(" Copy " ) } } " >
2022-06-15 02:03:56 +00:00
< / form >
2023-05-21 22:32:19 +00:00
< form action = "/files/delete" method = "post" class = "file-delete" onsubmit = "return confirm('{{ _(" Delete file: % ( file_name ) s ? " , file_name = file["name"]|replace("'", " \ \ ' " ) ) } } ' ) " >
2021-12-14 02:50:36 +00:00
< input name = "file_name" type = "hidden" value = "{{ file['name'] }}" >
2022-11-14 17:32:15 +00:00
< input type = "submit" value = "{{ _(" Delete " ) } } " title = "{{ _(" Delete " ) } } " >
2020-12-31 01:39:32 +00:00
< / form >
2021-11-07 00:25:02 +00:00
{% endif %}
2022-09-27 00:44:41 +00:00
{% if not file["archive_contents"] %}
2022-11-14 17:32:15 +00:00
< form action = "/files/diskinfo" method = "post" class = "file-info" >
2022-09-27 00:44:41 +00:00
< input name = "file_name" type = "hidden" value = "{{ file['name'] }}" >
2022-11-14 17:32:15 +00:00
< input type = "submit" value = "{{ _(" ? " ) } } " title = "{{ _(" Info " ) } } " >
2022-09-27 00:44:41 +00:00
< / form >
{% endif %}
2020-12-31 01:39:32 +00:00
< / td >
< / tr >
{% endfor %}
2021-11-07 00:25:02 +00:00
< / tbody >
< / table >
2023-02-25 01:28:58 +00:00
< / details >
{% endfor %}
< / div >
{% endif %}
2023-05-21 22:27:50 +00:00
< p > < small > {{ _("%(disk_space)s MiB disk space remaining for images", disk_space=env["free_disk_space"]) }}< / small > < / p >
2022-11-14 17:32:15 +00:00
< / section >
2020-12-31 01:39:32 +00:00
2021-11-07 00:25:02 +00:00
< hr / >
2022-11-14 17:32:15 +00:00
2022-12-20 01:21:01 +00:00
< section id = "download-url" >
< details >
< summary class = "heading" >
{{ _("Transfer Files to the PiSCSI") }}
< / summary >
< ul >
< li > {{ _("Disk Images") }} = {{ env["image_dir"] }}< / li >
2023-11-04 09:21:54 +00:00
{% if file_server_dir_exists %}
2022-12-20 01:21:01 +00:00
< li > {{ _("Shared Files") }} = {{ FILE_SERVER_DIR }}< / li >
2023-11-04 09:21:54 +00:00
{% else %}
2023-03-24 03:07:19 +00:00
< li > {{ _("Install a file server and create the shared files directory in order to share files between the Pi and your vintage computers.") }}< / li >
2023-11-04 09:21:54 +00:00
{% endif %}
2022-12-20 01:21:01 +00:00
< / ul >
< / details >
< form action = "/files/download_url" method = "post" >
< label for = "download_url" > {{ _("Download file from URL:") }}< / label >
< input name = "url" id = "download_url" required = "" type = "url" >
2023-11-04 09:21:54 +00:00
< label for = "disk_images" class = "hidden" > {{ _("Disk Images") }}< / label >
2022-12-20 01:21:01 +00:00
< input type = "radio" name = "destination" id = "disk_images" value = "disk_images" checked = "checked" >
2023-11-01 13:28:53 +00:00
< label for = "images_subdir" class = "hidden" > {{ _("Directory") }}< / label >
2023-03-05 00:57:32 +00:00
< select name = "images_subdir" id = "images_subdir" >
{% for dir in images_subdirs %}
2023-11-04 09:21:54 +00:00
< option value = "{{dir}}" > {{env['image_root_dir']}}/{{dir}}< / option >
2023-03-05 00:57:32 +00:00
{% endfor %}
2023-11-04 09:21:54 +00:00
< option value = "" selected > {{env['image_root_dir']}}/< / option >
2023-03-05 00:57:32 +00:00
< / select >
2023-03-24 03:07:19 +00:00
{% if file_server_dir_exists %}
2023-11-04 09:21:54 +00:00
< label for = "shared_files" class = "hidden" > {{ _("Shared Files") }}< / label >
2022-12-20 01:21:01 +00:00
< input type = "radio" name = "destination" id = "shared_files" value = "shared_files" >
2023-11-01 13:28:53 +00:00
< label for = "shared_subdir" class = "hidden" > {{ _("Directory") }}< / label >
2023-03-05 00:57:32 +00:00
< select name = "shared_subdir" id = "shared_subdir" >
{% for dir in shared_subdirs %}
2023-11-04 09:21:54 +00:00
< option value = "{{dir}}" > {{env['shared_root_dir']}}/{{dir}}< / option >
2023-03-05 00:57:32 +00:00
{% endfor %}
2023-11-04 09:21:54 +00:00
< option value = "" selected > {{env['shared_root_dir']}}/< / option >
2023-03-05 00:57:32 +00:00
< / select >
2023-03-24 03:07:19 +00:00
{% endif %}
2022-12-20 01:21:01 +00:00
< input type = "submit" value = "{{ _(" Download " ) } } " onclick = "processNotify('{{ _(" Downloading File . . . " ) } } ' ) " >
< / form >
< / section >
< section id = "upload" >
< a href = "/upload" target = "_blank" > < p > {{ _("Upload Files (new tab)") }}< / p > < / a >
< / section >
2023-02-15 02:48:53 +00:00
< noscript >
< style type = "text/css" >
section#upload { display: none; }
< / style >
2023-02-25 01:28:58 +00:00
< div class = "notice" >
2023-02-15 02:48:53 +00:00
{{ _("The file uploading functionality requires JavaScript.") }}
< / div >
< / noscript >
2022-12-20 01:21:01 +00:00
< hr / >
2022-12-24 00:13:52 +00:00
< section id = "create-iso" >
2021-11-07 00:25:02 +00:00
< details >
< summary class = "heading" >
2023-01-15 15:38:41 +00:00
{{ _("Create CD-ROM Image") }}
2021-11-07 00:25:02 +00:00
< / summary >
2021-09-28 20:39:08 +00:00
< ul >
2021-12-26 21:36:12 +00:00
< li > {{ _("HFS is for Mac OS, Joliet for Windows, and Rock Ridge for POSIX.") }}< / li >
< li > {{ _("If the downloaded file is a zip archive, we will attempt to unzip it and store the resulting files.") }}< / li >
2021-09-28 20:39:08 +00:00
< / ul >
2021-11-07 00:25:02 +00:00
< / details >
2022-10-07 20:13:29 +00:00
2022-12-24 00:13:52 +00:00
< div >
2023-01-15 15:38:41 +00:00
< form action = "/files/create_iso" method = "post" >
< label for = "iso_url" > {{ _("Download file from URL:") }}< / label >
2022-10-07 20:13:29 +00:00
< input name = "url" id = "iso_url" required = "" type = "url" >
2022-12-24 00:13:52 +00:00
< label for = "iso_url_type" > {{ _("Type:") }}< / label >
< select name = "type" id = "iso_url_type" >
< option value = "HFS" >
HFS
< / option >
< option value = "ISO-9660 Level 1" >
ISO-9660 Level 1
< / option >
< option value = "ISO-9660 Level 2" >
ISO-9660 Level 2
< / option >
< option value = "ISO-9660 Level 3" >
ISO-9660 Level 3
< / option >
< option value = "Joliet" >
Joliet
< / option >
< option value = "Rock Ridge" >
Rock Ridge
< / option >
< / select >
2023-01-15 15:38:41 +00:00
< input type = "submit" value = "{{ _(" Create " ) } } " onclick = "processNotify('{{ _(" Downloading file and generating CD-ROM image . . . " ) } } ' ) " >
2022-12-24 00:13:52 +00:00
< / form >
< / div >
< div >
2023-01-15 15:38:41 +00:00
< form action = "/files/create_iso" method = "post" >
< label for = "iso_file" > {{ _("Use local file:") }}< / label >
2022-12-24 00:13:52 +00:00
< select name = "file" id = "iso_file" >
{% for f in files|sort(attribute='name') %}
< option value = "{{ f[" name " ] } } " > {{ f["name"].replace(env["image_dir"], '') }}< / option >
{% endfor %}
< / select >
< label for = "iso_file_type" > {{ _("Type:") }}< / label >
< select name = "type" id = "iso_file_type" >
2022-10-24 02:05:29 +00:00
< option value = "HFS" >
2022-10-07 20:13:29 +00:00
HFS
< / option >
2022-10-24 02:05:29 +00:00
< option value = "ISO-9660 Level 1" >
2022-10-07 20:13:29 +00:00
ISO-9660 Level 1
< / option >
2022-10-24 02:05:29 +00:00
< option value = "ISO-9660 Level 2" >
2022-10-07 20:13:29 +00:00
ISO-9660 Level 2
< / option >
2022-10-24 02:05:29 +00:00
< option value = "ISO-9660 Level 3" >
2022-10-07 20:13:29 +00:00
ISO-9660 Level 3
< / option >
2022-10-24 02:05:29 +00:00
< option value = "Joliet" >
2022-10-07 20:13:29 +00:00
Joliet
< / option >
2022-10-24 02:05:29 +00:00
< option value = "Rock Ridge" >
2022-10-07 20:13:29 +00:00
Rock Ridge
< / option >
< / select >
2023-01-15 15:38:41 +00:00
< input type = "submit" value = "{{ _(" Create " ) } } " onclick = "processNotify('{{ _(" Generating CD-ROM image . . . " ) } } ' ) " >
2022-10-07 20:13:29 +00:00
< / form >
2022-12-24 00:13:52 +00:00
< / div >
2022-11-14 17:32:15 +00:00
< / section >
2021-11-07 00:25:02 +00:00
< hr / >
2022-11-14 17:32:15 +00:00
< section id = "create-image" >
2021-11-07 00:25:02 +00:00
< details >
< summary class = "heading" >
2023-01-15 15:38:41 +00:00
{{ _("Create Empty Disk Image") }}
2021-11-07 00:25:02 +00:00
< / summary >
2021-09-28 20:39:08 +00:00
< ul >
2022-12-05 17:58:23 +00:00
< li > {{ _("Please refer to < a href = \"%(url)s\" target = \"_blank\" > wiki documentation< / a > to learn more about the supported image file types.", url="https://github.com/PiSCSI/piscsi/wiki/Supported-Device-Types#image-types") }}< / li >
2022-11-01 23:43:24 +00:00
< li > {{ _("It is not recommended to use the Lido hard disk driver with the Macintosh Plus.") }}< / li >
2021-09-28 20:39:08 +00:00
< / ul >
2021-11-07 00:25:02 +00:00
< / details >
2022-10-07 20:13:29 +00:00
< form action = "/files/create" method = "post" >
< label for = "image_create_file_name" > {{ _("File Name:") }}< / label >
< input name = "file_name" id = "image_create_file_name" required = "" type = "text" >
< label for = "image_create_type" > {{ _("Type:") }}< / label >
< select name = "type" id = "image_create_type" >
{% for key, value in image_suffixes_to_create.items() %}
< option value = "{{ key }}" >
{{ value }} [.{{ key }}]
< / option >
{% endfor %}
< / select >
< label for = "image_create_size" > {{ _("Size:") }}< / label >
< input name = "size" id = "image_create_size" type = "number" placeholder = "{{ _(" MiB " ) } } " min = "1" max = "262144" required >
< label for = "image_create_drive_name" > {{ _("Masquerade as:") }}< / label >
< select name = "drive_name" id = "image_create_drive_name" >
< option value = "" >
{{ _("None") }}
< / option >
2022-10-25 15:51:04 +00:00
{% for drive in drive_properties["hd_conf"] | sort(attribute='name') %}
2022-10-07 20:13:29 +00:00
< option value = "{{ drive.name }}" >
{{ drive.name }}
< / option >
{% endfor %}
< / select >
2022-11-01 23:43:24 +00:00
< label for = "drive_format" > {{ _("Format as:") }}< / label >
< select name = "drive_format" id = "drive_format" >
< option value = "" >
{{ _("None") }}
< / option >
< option value = "Lido 7.56" >
HFS + Lido
< / option >
< option value = "SpeedTools 3.6" >
HFS + SpeedTools
< / option >
< option value = "FAT16" >
FAT16
< / option >
< option value = "FAT32" >
FAT32
< / option >
< / select >
2022-10-07 20:13:29 +00:00
< input type = "submit" value = "{{ _(" Create " ) } } " >
< / form >
2022-12-20 01:21:01 +00:00
< / section >
2021-11-07 00:25:02 +00:00
2022-12-20 01:21:01 +00:00
< section id = "create-drive" >
< a href = "/drive/list" > < p > {{ _("Create Disk Image With Properties") }}< / p > < / a >
2022-11-14 17:32:15 +00:00
< / section >
2021-09-28 20:39:08 +00:00
2021-11-07 00:25:02 +00:00
< hr / >
2021-09-19 21:29:01 +00:00
2022-12-24 00:13:52 +00:00
< section id = "attach-devices" >
< details >
< summary class = "heading" >
{{ _("Attach Peripheral Device") }}
< / summary >
< ul >
< / li >
{% if bridge_configured %}
< li > {{ _("The < tt > piscsi_bridge< / tt > network bridge is active and ready to be used by an emulated network adapter!") }}< / li >
{% else %}
< li > {{ _("Please configure the < tt > piscsi_bridge< / tt > network bridge before attaching an emulated network adapter!") }}< / li >
{% endif %}
< li > {{ _("To browse the modern web, install a vintage web proxy such as < a href = \"%(url)s\" target = \"_blank\" > Macproxy< / a > .", url="https://github.com/PiSCSI/piscsi/wiki/Vintage-Web-Proxy#macproxy") }}< / li >
< / li >
< li > {{ _("Read more about < a href = \"%(url)s\" target = \"_blank\" > supported device types< / a > on the wiki.", url="https://github.com/PiSCSI/piscsi/wiki/Supported-Device-Types") }}
< / li >
< / ul >
< / details >
< table border = "black" cellpadding = "3" summary = "List of peripheral devices" >
< tr >
< th scope = "col" > {{ _("Device") }}< / th >
< th scope = "col" > {{ _("Key") }}< / th >
< th scope = "col" > {{ _("Parameters and Actions") }}< / th >
< / tr >
{% for type in REMOVABLE_DEVICE_TYPES + PERIPHERAL_DEVICE_TYPES %}
< tr >
< td >
< div > {{ device_types[type]["name"] }}< / div >
< / td >
< td >
< div > {{ type }}< / div >
< / td >
< td >
< form action = "/scsi/attach_device" method = "post" class = "device-attach" >
< input name = "type" type = "hidden" value = "{{ type }}" >
{% for key, value in device_types[type]["params"] | dictsort %}
< label for = "param_{{ type }}_{{ key }}" > {{ key }}:< / label >
{% if value.isnumeric() %}
< input name = "param_{{ key }}" id = "param_{{ type }}_{{ key }}" type = "number" value = "{{ value }}" >
{% elif key == "interface" %}
< select name = "param_{{ key }}" id = "param_{{ type }}_{{ key }}" >
{% for if in netinfo["ifs"] %}
< option value = "{{ if }}" >
{{ if }}
< / option >
{% endfor %}
< / select >
{% else %}
< input name = "param_{{ key }}" id = "param_{{ type }}_{{ key }}" type = "text" size = "{{ value|length }}" placeholder = "{{ value }}" >
{% endif %}
{% endfor %}
{% if type in REMOVABLE_DEVICE_TYPES %}
< label for = "{{ type }}_drive_name" > {{ _("Masquerade as:") }}< / label >
< select name = "drive_name" id = "{{ type }}_drive_name" >
< option value = "" >
{{ _("None") }}
< / option >
{% if type == "SCCD" %}
{% for drive in drive_properties["cd_conf"] | sort(attribute='name') %}
< option value = "{{ drive.name }}" >
{{ drive.name }}
< / option >
{% endfor %}
{% endif %}
{% if type == "SCRM" %}
{% for drive in drive_properties["rm_conf"] | sort(attribute='name') %}
< option value = "{{ drive.name }}" >
{{ drive.name }}
< / option >
{% endfor %}
{% endif %}
{% if type == "SCMO" %}
{% for drive in drive_properties["mo_conf"] | sort(attribute='name') %}
< option value = "{{ drive.name }}" >
{{ drive.name }}
< / option >
{% endfor %}
{% endif %}
< / select >
{% endif %}
< label for = "{{ type }}_scsi_id" > {{ _("ID") }}< / label >
< select name = "scsi_id" id = "{{ type }}_scsi_id" >
{% for id in scsi_ids["valid_ids"] %}
< option value = "{{ id }}" { % if id = = scsi_ids [ " recommended_id " ] % } selected { % endif % } >
{{ id }}
< / option >
{% endfor %}
< / select >
< label for = "{{ type }}_unit" > {{ _("LUN") }}< / label >
< input class = "lun" name = "unit" id = "{{ type }}_unit" type = "number" value = "0" min = "0" max = "31" step = "1" size = "3" >
< input type = "submit" value = "{{ _(" Attach " ) } } " title = "{{ _(" Attach " ) } } " >
< / form >
< / td >
< / tr >
{% endfor %}
< / table >
< / section >
< hr / >
2022-11-14 17:32:15 +00:00
< section id = "manual" >
2022-12-05 17:58:23 +00:00
< a href = "/sys/manpage?app=piscsi" > < p > {{ _("Read the PiSCSI Manual") }}< / p > < / a >
2022-11-14 17:32:15 +00:00
< / section >
2022-10-04 13:38:15 +00:00
2021-11-07 00:25:02 +00:00
{% endblock content %}