mirror of
https://github.com/akuker/RASCSI.git
synced 2024-06-01 04:41:38 +00:00
ea3bb8363a
commit94786aec54
Author: Uwe Seimet <48174652+uweseimet@users.noreply.github.com> Date: Tue Dec 21 08:43:21 2021 +0100 Added support for operation meta data, code cleanup (#534) * Added messages * Comment update * Interface update * Support for localized descriptions * Sort operations * Completed meta data * rasctl -s returns operation meta data * Manpage update * Type update * Comment update * Description updates * Comment update * Added convenience method * Added convenience method * Code cleanup * Comment update * Display permitted values * For completeness sake added permitted boolean values * Added support for default value * Removed redundant message field * Description update * Description upddate * Squashed commit of the following: commit 8171c6ea27982c736c30c0db69a7fdde07ee10ce Author: Uwe Seimet <Uwe.Seimet@seimet.de> Date: Sat Dec 18 12:43:14 2021 +0100 The data type is implicit commit fb01dc9d82e8ff7456b05a0cb9d08069adacc64c Author: Uwe Seimet <Uwe.Seimet@seimet.de> Date: Sat Dec 18 12:37:49 2021 +0100 Renaming commit 057dbf1aca7be3f7e76a5ff89a582a276b6d3089 Author: Uwe Seimet <Uwe.Seimet@seimet.de> Date: Sat Dec 18 12:29:54 2021 +0100 Comment update commit 5f699aad2f835f72accdb445d1e59f094aeb108f Author: Uwe Seimet <Uwe.Seimet@seimet.de> Date: Sat Dec 18 12:24:25 2021 +0100 Signature update commit cbcf8b09f9d1ba7b82f816269bcfe91d9f00eb6e Author: Uwe Seimet <Uwe.Seimet@seimet.de> Date: Sat Dec 18 12:22:45 2021 +0100 Signature update commit a8148ef802ca809e5a305d2caa69856c9033d932 Author: Uwe Seimet <Uwe.Seimet@seimet.de> Date: Sat Dec 18 12:16:46 2021 +0100 Comment update commit ce685a92d4827e131d80d10ecd56e2b3baf173f8 Author: Uwe Seimet <Uwe.Seimet@seimet.de> Date: Sat Dec 18 12:15:46 2021 +0100 Use map instead of list commit 454c0438f3589904f5dbe5253963dd200ea416dd Author: Uwe Seimet <Uwe.Seimet@seimet.de> Date: Sat Dec 18 10:47:36 2021 +0100 Updated size check commit b386dbba4b0262f4f6f02aecb2a1daeffd41f4a2 Author: Uwe Seimet <Uwe.Seimet@seimet.de> Date: Sat Dec 18 01:23:43 2021 +0100 Initial improvements * Default value update * Comment update * Comment update * Map operations by ordinal * Added safeguard against unknown operations * Added cast * Data type update * Sort map by operation name * Renaming * Code cleanup * Comment update * Renaming * Comment update * Description updates * Fixed typo * Added operation * Logging update * Interface comment update * Fixed typo * Aded operation parameters * Updated handling of mandatory parameters * Updated assertion handling * Added missing condition * Removed duplicate cod3 * Code cleanup * Logging update * Removed duplicate code * Code cleanup * Squashed commit of the following: commit4ae273ccbd
Author: akuker <34318535+akuker@users.noreply.github.com> Date: Sun Dec 19 22:30:22 2021 -0600 Loopback tester pcb (#545) commit46c5c1966f
Author: akuker <34318535+akuker@users.noreply.github.com> Date: Sun Dec 19 22:29:59 2021 -0600 RaSCSI Zero version 1.0 (#546) commitd09df31d67
Author: Daniel Markstedt <markstedt@gmail.com> Date: Sun Dec 19 20:25:23 2021 -0800 Remove redundant code from OLED script (#547) commitd8828da690
Author: akuker <34318535+akuker@users.noreply.github.com> Date: Sun Dec 19 21:02:50 2021 -0600 Added list of sponsors commitbcd7e8396d
Author: Daniel Markstedt <markstedt@gmail.com> Date: Sun Dec 19 15:51:45 2021 -0800 Second attempt at properly creating the manpage dir (#542) commitc887edfc8c
Author: Daniel Markstedt <markstedt@gmail.com> Date: Sun Dec 19 15:50:03 2021 -0800 Remove special elevated privileges for the Web Interface (#536) * Use the pi_shutdown method to restart the rascsi service * Use the pi_shutdown method to restart the rascsi service * Remove modifications to sudoers no longer needed * Introduce sleeps attempting to connect to socket; reduce overall number of retries * Remove systemd helped methods and the functionality that depends on it * Attempts to speed up splash code * Remove unneccessary verbosity * Attempt to optimize service definition commit801aebfb96
Author: Daniel Markstedt <markstedt@gmail.com> Date: Sun Dec 19 15:47:22 2021 -0800 More readable message when downloading a file (#531) commit29cf58288f
Author: Daniel Markstedt <markstedt@gmail.com> Date: Sun Dec 19 15:47:03 2021 -0800 Add a warning notice when ejecting removable media (#526) commit7efa895239
Author: Daniel Markstedt <markstedt@gmail.com> Date: Sun Dec 19 15:46:22 2021 -0800 Unzip zipfiles before storing to iso (#525) * Unzip zipfiles before storing to iso * Add helptext * Skip unzip for MacZip format * Should not be an fstring commit39bc485671
Author: Daniel Markstedt <markstedt@gmail.com> Date: Sun Dec 19 15:28:22 2021 -0800 Add pip3 to global dependencies; remove duplicates from monitor_rascs… (#523) * Add pip3 to global dependencies; remove duplicates from monitor_rascsi dependencies * Cleanup * Shutdown functionality is only available if started with root permissions * Only restrict shutdown parameters, not everything if not root * Updated operation count check commit693ade2967
Author: Daniel Markstedt <markstedt@gmail.com> Date: Mon Dec 20 12:04:23 2021 -0800 Bump Macproxy version to 21.12.2 (#550) commit958fb95908
Author: akuker <34318535+akuker@users.noreply.github.com> Date: Mon Dec 20 12:50:14 2021 -0600 Adjust bus settle delay to match SCSI standard (#544) * Move the GCC v10 compiler flags into makefile instead of easyinstall.sh * #504 - Update the bus settle time to match the SCSI standard Co-authored-by: RaSCSI User <user@rascsi.com> commit200bc7251f
Author: Daniel Markstedt <markstedt@gmail.com> Date: Mon Dec 20 06:20:22 2021 -0800 More helpful error message when IP does not resolve for OLED screen (#541) * More helpful error message * Remove confusing fallback IP * Tweak message commit4ae273ccbd
Author: akuker <34318535+akuker@users.noreply.github.com> Date: Sun Dec 19 22:30:22 2021 -0600 Loopback tester pcb (#545) commit46c5c1966f
Author: akuker <34318535+akuker@users.noreply.github.com> Date: Sun Dec 19 22:29:59 2021 -0600 RaSCSI Zero version 1.0 (#546) commitd09df31d67
Author: Daniel Markstedt <markstedt@gmail.com> Date: Sun Dec 19 20:25:23 2021 -0800 Remove redundant code from OLED script (#547) commitd8828da690
Author: akuker <34318535+akuker@users.noreply.github.com> Date: Sun Dec 19 21:02:50 2021 -0600 Added list of sponsors commitbcd7e8396d
Author: Daniel Markstedt <markstedt@gmail.com> Date: Sun Dec 19 15:51:45 2021 -0800 Second attempt at properly creating the manpage dir (#542) commitc887edfc8c
Author: Daniel Markstedt <markstedt@gmail.com> Date: Sun Dec 19 15:50:03 2021 -0800 Remove special elevated privileges for the Web Interface (#536) * Use the pi_shutdown method to restart the rascsi service * Use the pi_shutdown method to restart the rascsi service * Remove modifications to sudoers no longer needed * Introduce sleeps attempting to connect to socket; reduce overall number of retries * Remove systemd helped methods and the functionality that depends on it * Attempts to speed up splash code * Remove unneccessary verbosity * Attempt to optimize service definition commit801aebfb96
Author: Daniel Markstedt <markstedt@gmail.com> Date: Sun Dec 19 15:47:22 2021 -0800 More readable message when downloading a file (#531) commit29cf58288f
Author: Daniel Markstedt <markstedt@gmail.com> Date: Sun Dec 19 15:47:03 2021 -0800 Add a warning notice when ejecting removable media (#526) commit7efa895239
Author: Daniel Markstedt <markstedt@gmail.com> Date: Sun Dec 19 15:46:22 2021 -0800 Unzip zipfiles before storing to iso (#525) * Unzip zipfiles before storing to iso * Add helptext * Skip unzip for MacZip format * Should not be an fstring commit39bc485671
Author: Daniel Markstedt <markstedt@gmail.com> Date: Sun Dec 19 15:28:22 2021 -0800 Add pip3 to global dependencies; remove duplicates from monitor_rascs… (#523) * Add pip3 to global dependencies; remove duplicates from monitor_rascsi dependencies * Cleanup
289 lines
6.9 KiB
C++
289 lines
6.9 KiB
C++
//---------------------------------------------------------------------------
|
|
//
|
|
// SCSI Target Emulator RaSCSI (*^..^*)
|
|
// for Raspberry Pi
|
|
//
|
|
// Copyright (C) 2021 Uwe Seimet
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
#include <netdb.h>
|
|
#include "os.h"
|
|
#include "exceptions.h"
|
|
#include "protobuf_util.h"
|
|
#include "rasutil.h"
|
|
#include "rasctl_commands.h"
|
|
#include "rascsi_interface.pb.h"
|
|
#include <sstream>
|
|
#include <iostream>
|
|
#include <list>
|
|
|
|
// Separator for the INQUIRY name components
|
|
#define COMPONENT_SEPARATOR ':'
|
|
|
|
using namespace std;
|
|
using namespace rascsi_interface;
|
|
using namespace protobuf_util;
|
|
|
|
RasctlCommands::RasctlCommands(PbCommand& command, const string& hostname, int port, const string& token)
|
|
{
|
|
this->command = command;
|
|
this->hostname = hostname;
|
|
this->port = port;
|
|
this->token = token;
|
|
}
|
|
|
|
void RasctlCommands::SendCommand()
|
|
{
|
|
if (!token.empty()) {
|
|
AddParam(command, "token", token);
|
|
}
|
|
|
|
// Send command
|
|
int fd = -1;
|
|
try {
|
|
struct hostent *host = gethostbyname(hostname.c_str());
|
|
if (!host) {
|
|
throw io_exception("Can't resolve hostname '" + hostname + "'");
|
|
}
|
|
|
|
fd = socket(AF_INET, SOCK_STREAM, 0);
|
|
if (fd < 0) {
|
|
throw io_exception("Can't create socket");
|
|
}
|
|
|
|
struct sockaddr_in server;
|
|
memset(&server, 0, sizeof(server));
|
|
server.sin_family = AF_INET;
|
|
server.sin_port = htons(port);
|
|
server.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
|
|
memcpy(&server.sin_addr.s_addr, host->h_addr, host->h_length);
|
|
|
|
if (connect(fd, (struct sockaddr *)&server, sizeof(struct sockaddr_in)) < 0) {
|
|
ostringstream error;
|
|
error << "Can't connect to rascsi process on host '" << hostname << "', port " << port;
|
|
throw io_exception(error.str());
|
|
}
|
|
|
|
if (write(fd, "RASCSI", 6) != 6) {
|
|
throw io_exception("Can't write magic");
|
|
}
|
|
|
|
SerializeMessage(fd, command);
|
|
}
|
|
catch(const io_exception& e) {
|
|
cerr << "Error: " << e.getmsg() << endl;
|
|
|
|
if (fd >= 0) {
|
|
close(fd);
|
|
}
|
|
|
|
exit(fd < 0 ? ENOTCONN : EXIT_FAILURE);
|
|
}
|
|
|
|
// Receive result
|
|
try {
|
|
DeserializeMessage(fd, result);
|
|
|
|
if (!result.status()) {
|
|
throw io_exception(result.msg());
|
|
}
|
|
}
|
|
catch(const io_exception& e) {
|
|
close(fd);
|
|
|
|
cerr << "Error: " << e.getmsg() << endl;
|
|
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
close(fd);
|
|
|
|
if (!result.msg().empty()) {
|
|
cout << result.msg() << endl;
|
|
}
|
|
}
|
|
|
|
void RasctlCommands::CommandDevicesInfo()
|
|
{
|
|
SendCommand();
|
|
|
|
rasctl_display.DisplayDevices(result.devices_info());
|
|
}
|
|
|
|
void RasctlCommands::CommandLogLevel(const string& log_level)
|
|
{
|
|
AddParam(command, "level", log_level);
|
|
|
|
SendCommand();
|
|
}
|
|
|
|
void RasctlCommands::CommandReserveIds(const string& reserved_ids)
|
|
{
|
|
AddParam(command, "ids", reserved_ids);
|
|
|
|
SendCommand();
|
|
}
|
|
|
|
void RasctlCommands::CommandCreateImage(const string& image_params)
|
|
{
|
|
size_t separatorPos = image_params.find(COMPONENT_SEPARATOR);
|
|
if (separatorPos != string::npos) {
|
|
AddParam(command, "file", image_params.substr(0, separatorPos));
|
|
AddParam(command, "size", image_params.substr(separatorPos + 1));
|
|
}
|
|
else {
|
|
cerr << "Error: Invalid file descriptor '" << image_params << "', format is NAME:SIZE" << endl;
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
AddParam(command, "read_only", "false");
|
|
|
|
SendCommand();
|
|
}
|
|
|
|
void RasctlCommands::CommandDeleteImage(const string& filename)
|
|
{
|
|
AddParam(command, "file", filename);
|
|
|
|
SendCommand();
|
|
}
|
|
|
|
void RasctlCommands::CommandRenameImage(const string& image_params)
|
|
{
|
|
size_t separatorPos = image_params.find(COMPONENT_SEPARATOR);
|
|
if (separatorPos != string::npos) {
|
|
AddParam(command, "from", image_params.substr(0, separatorPos));
|
|
AddParam(command, "to", image_params.substr(separatorPos + 1));
|
|
}
|
|
else {
|
|
cerr << "Error: Invalid file descriptor '" << image_params << "', format is CURRENT_NAME:NEW_NAME" << endl;
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
SendCommand();
|
|
}
|
|
|
|
void RasctlCommands::CommandCopyImage(const string& image_params)
|
|
{
|
|
size_t separatorPos = image_params.find(COMPONENT_SEPARATOR);
|
|
if (separatorPos != string::npos) {
|
|
AddParam(command, "from", image_params.substr(0, separatorPos));
|
|
AddParam(command, "to", image_params.substr(separatorPos + 1));
|
|
}
|
|
else {
|
|
cerr << "Error: Invalid file descriptor '" << image_params << "', format is CURRENT_NAME:NEW_NAME" << endl;
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
SendCommand();
|
|
}
|
|
|
|
void RasctlCommands::CommandDefaultImageFolder(const string& folder)
|
|
{
|
|
AddParam(command, "folder", folder);
|
|
|
|
SendCommand();
|
|
}
|
|
|
|
void RasctlCommands::CommandDeviceInfo()
|
|
{
|
|
SendCommand();
|
|
|
|
for (const auto& device : result.devices_info().devices()) {
|
|
rasctl_display.DisplayDeviceInfo(device);
|
|
}
|
|
}
|
|
|
|
void RasctlCommands::CommandDeviceTypesInfo()
|
|
{
|
|
SendCommand();
|
|
|
|
rasctl_display.DisplayDeviceTypesInfo(result.device_types_info());
|
|
}
|
|
|
|
void RasctlCommands::CommandVersionInfo()
|
|
{
|
|
SendCommand();
|
|
|
|
rasctl_display.DisplayVersionInfo(result.version_info());
|
|
}
|
|
|
|
void RasctlCommands::CommandServerInfo()
|
|
{
|
|
SendCommand();
|
|
|
|
PbServerInfo server_info = result.server_info();
|
|
|
|
rasctl_display.DisplayVersionInfo(server_info.version_info());
|
|
rasctl_display.DisplayLogLevelInfo(server_info.log_level_info());
|
|
rasctl_display.DisplayImageFiles(server_info.image_files_info());
|
|
rasctl_display.DisplayMappingInfo(server_info.mapping_info());
|
|
rasctl_display.DisplayNetworkInterfaces(server_info.network_interfaces_info());
|
|
rasctl_display.DisplayDeviceTypesInfo(server_info.device_types_info());
|
|
rasctl_display.DisplayReservedIdsInfo(server_info.reserved_ids_info());
|
|
rasctl_display.DisplayOperationInfo(server_info.operation_info());
|
|
|
|
if (server_info.devices_info().devices_size()) {
|
|
list<PbDevice> sorted_devices = { server_info.devices_info().devices().begin(), server_info.devices_info().devices().end() };
|
|
sorted_devices.sort([](const auto& a, const auto& b) { return a.id() < b.id(); });
|
|
|
|
cout << "Attached devices:" << endl;
|
|
|
|
for (const auto& device : sorted_devices) {
|
|
rasctl_display.DisplayDeviceInfo(device);
|
|
}
|
|
}
|
|
}
|
|
|
|
void RasctlCommands::CommandDefaultImageFilesInfo()
|
|
{
|
|
SendCommand();
|
|
|
|
rasctl_display.DisplayImageFiles(result.image_files_info());
|
|
}
|
|
|
|
void RasctlCommands::CommandImageFileInfo(const string& filename)
|
|
{
|
|
AddParam(command, "file", filename);
|
|
|
|
SendCommand();
|
|
|
|
rasctl_display.DisplayImageFile(result.image_file_info());
|
|
}
|
|
|
|
void RasctlCommands::CommandNetworkInterfacesInfo()
|
|
{
|
|
SendCommand();
|
|
|
|
rasctl_display.DisplayNetworkInterfaces(result.network_interfaces_info());
|
|
}
|
|
|
|
void RasctlCommands::CommandLogLevelInfo()
|
|
{
|
|
SendCommand();
|
|
|
|
rasctl_display.DisplayLogLevelInfo(result.log_level_info());
|
|
}
|
|
|
|
void RasctlCommands::CommandReservedIdsInfo()
|
|
{
|
|
SendCommand();
|
|
|
|
rasctl_display.DisplayReservedIdsInfo(result.reserved_ids_info());
|
|
}
|
|
|
|
void RasctlCommands::CommandMappingInfo()
|
|
{
|
|
SendCommand();
|
|
|
|
rasctl_display.DisplayMappingInfo(result.mapping_info());
|
|
}
|
|
|
|
void RasctlCommands::CommandOperationInfo()
|
|
{
|
|
SendCommand();
|
|
|
|
rasctl_display.DisplayOperationInfo(result.operation_info());
|
|
}
|