Support for folder filter and nested image files (#551)

* Extracted code

* Initial support for (optional) recursive image file listings

* Manpage update

* Added support for image file filter

* Updated filtering

* Made image scan depth configurable

* Code cleanup, initial support for creating nested file

* Check for existing folder

* Cleanup

* Cleanup

* Copy/rename/create

* Updated delete operation

* Delete empty folders

* Code cleanup

* Fixed typo

* Check image file nesting level

* Updated error handling

* Fixed warning

* Renaming

* Error message update

* Interface comment updates

* Added depth to image info

* Fixed scan depth check

* Squashed commit of the following:

commit 94786aec54
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:

    commit 4ae273ccbd
    Author: akuker <34318535+akuker@users.noreply.github.com>
    Date:   Sun Dec 19 22:30:22 2021 -0600

        Loopback tester pcb (#545)

    commit 46c5c1966f
    Author: akuker <34318535+akuker@users.noreply.github.com>
    Date:   Sun Dec 19 22:29:59 2021 -0600

        RaSCSI Zero version 1.0 (#546)

    commit d09df31d67
    Author: Daniel Markstedt <markstedt@gmail.com>
    Date:   Sun Dec 19 20:25:23 2021 -0800

        Remove redundant code from OLED script (#547)

    commit d8828da690
    Author: akuker <34318535+akuker@users.noreply.github.com>
    Date:   Sun Dec 19 21:02:50 2021 -0600

        Added list of sponsors

    commit bcd7e8396d
    Author: Daniel Markstedt <markstedt@gmail.com>
    Date:   Sun Dec 19 15:51:45 2021 -0800

        Second attempt at properly creating the manpage dir (#542)

    commit c887edfc8c
    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

    commit 801aebfb96
    Author: Daniel Markstedt <markstedt@gmail.com>
    Date:   Sun Dec 19 15:47:22 2021 -0800

        More readable message when downloading a file (#531)

    commit 29cf58288f
    Author: Daniel Markstedt <markstedt@gmail.com>
    Date:   Sun Dec 19 15:47:03 2021 -0800

        Add a warning notice when ejecting removable media (#526)

    commit 7efa895239
    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

    commit 39bc485671
    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

commit 693ade2967
Author: Daniel Markstedt <markstedt@gmail.com>
Date:   Mon Dec 20 12:04:23 2021 -0800

    Bump Macproxy version to 21.12.2 (#550)

commit 958fb95908
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>

commit 200bc7251f
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

commit 4ae273ccbd
Author: akuker <34318535+akuker@users.noreply.github.com>
Date:   Sun Dec 19 22:30:22 2021 -0600

    Loopback tester pcb (#545)

commit 46c5c1966f
Author: akuker <34318535+akuker@users.noreply.github.com>
Date:   Sun Dec 19 22:29:59 2021 -0600

    RaSCSI Zero version 1.0 (#546)

commit d09df31d67
Author: Daniel Markstedt <markstedt@gmail.com>
Date:   Sun Dec 19 20:25:23 2021 -0800

    Remove redundant code from OLED script (#547)

commit d8828da690
Author: akuker <34318535+akuker@users.noreply.github.com>
Date:   Sun Dec 19 21:02:50 2021 -0600

    Added list of sponsors

commit bcd7e8396d
Author: Daniel Markstedt <markstedt@gmail.com>
Date:   Sun Dec 19 15:51:45 2021 -0800

    Second attempt at properly creating the manpage dir (#542)

commit c887edfc8c
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

commit 801aebfb96
Author: Daniel Markstedt <markstedt@gmail.com>
Date:   Sun Dec 19 15:47:22 2021 -0800

    More readable message when downloading a file (#531)

commit 29cf58288f
Author: Daniel Markstedt <markstedt@gmail.com>
Date:   Sun Dec 19 15:47:03 2021 -0800

    Add a warning notice when ejecting removable media (#526)

commit 7efa895239
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

commit 39bc485671
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

commit ec31198d83
Author: Uwe Seimet <48174652+uweseimet@users.noreply.github.com>
Date:   Sun Dec 19 11:54:10 2021 +0100

    Optional authentication by access token (#529)

    * Added authentication by access token

    * No authentication is required for getting the rascsi version

    * Added comment

    * Interface description update

    * Manpage update

    * Added error code

    * Enum value update (backwards compatible)

    * Error code update

    * Error code update

    * Added CHECK_AUTHENTICATION

    * Comment update

    * VERSION_INFO also requires authentication

    * rasctl: Made token an optional parameter for -P

    * Fixed interface comment

commit e32211ef73
Author: Uwe Seimet <48174652+uweseimet@users.noreply.github.com>
Date:   Sun Dec 19 11:49:17 2021 +0100

    Recursive image file scan and image file filter (#532)

    * Extracted code

    * Initial support for (optional) recursive image file listings

    * Manpage update

    * Added support for image file filter

    * Updated filtering

    * Made image scan depth configurable

* Squashed commit of the following:

commit 192b14169f
Author: Uwe Seimet <Uwe.Seimet@seimet.de>
Date:   Tue Dec 21 09:19:05 2021 +0100

    Meta data update

commit b319d72601
Author: Uwe Seimet <Uwe.Seimet@seimet.de>
Date:   Tue Dec 21 09:02:39 2021 +0100

    Squashed commit of the following:

    commit 0ab4918c5a59f978f48cf26f431ff809e9ddae33
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Mon Dec 20 16:52:03 2021 +0100

        Scan depth determines availability of folder filter

    commit 16590cc4e4420a348fae610d749082c9d718be0a
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Mon Dec 20 15:47:08 2021 +0100

        Updated operation count check

    commit 82f7c99755f535a7a5c30fe66e377705c5306faa
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Mon Dec 20 15:41:32 2021 +0100

        Only restrict shutdown parameters, not everything if not root

    commit 9bd50d37b11c48b2130e4f6e66d12def88ddc38f
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Mon Dec 20 15:28:08 2021 +0100

        Shutdown functionality is only available if started with root permissions

    commit aa5f3331abf4c178e8ce738c14fd584bd41d1b94
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Mon Dec 20 10:26:14 2021 +0100

        Squashed commit of the following:

        commit 4ae273ccbd
        Author: akuker <34318535+akuker@users.noreply.github.com>
        Date:   Sun Dec 19 22:30:22 2021 -0600

            Loopback tester pcb (#545)

        commit 46c5c1966f
        Author: akuker <34318535+akuker@users.noreply.github.com>
        Date:   Sun Dec 19 22:29:59 2021 -0600

            RaSCSI Zero version 1.0 (#546)

        commit d09df31d67
        Author: Daniel Markstedt <markstedt@gmail.com>
        Date:   Sun Dec 19 20:25:23 2021 -0800

            Remove redundant code from OLED script (#547)

        commit d8828da690
        Author: akuker <34318535+akuker@users.noreply.github.com>
        Date:   Sun Dec 19 21:02:50 2021 -0600

            Added list of sponsors

        commit bcd7e8396d
        Author: Daniel Markstedt <markstedt@gmail.com>
        Date:   Sun Dec 19 15:51:45 2021 -0800

            Second attempt at properly creating the manpage dir (#542)

        commit c887edfc8c
        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

        commit 801aebfb96
        Author: Daniel Markstedt <markstedt@gmail.com>
        Date:   Sun Dec 19 15:47:22 2021 -0800

            More readable message when downloading a file (#531)

        commit 29cf58288f
        Author: Daniel Markstedt <markstedt@gmail.com>
        Date:   Sun Dec 19 15:47:03 2021 -0800

            Add a warning notice when ejecting removable media (#526)

        commit 7efa895239
        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

        commit 39bc485671
        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

    commit a1f4b28f92bd9f7cdba18c04f61d3721fc7c720f
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Sun Dec 19 21:50:15 2021 +0100

        Comment update

    commit 9cbc06caf5f00ce85e0f7f984c871ed614e2e483
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Sun Dec 19 21:49:09 2021 +0100

        Option update

    commit c4aa39c2285c5c72e2ea28ad749f5670dd10e89f
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Sun Dec 19 21:46:37 2021 +0100

        Merged feature_folder_filter

    commit ea386fc74c
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Sun Dec 19 19:05:07 2021 +0100

        Code cleanup

    commit 17c3201135
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Sun Dec 19 19:03:13 2021 +0100

        Removed duplicate code

    commit 296f816dd3
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Sun Dec 19 18:40:49 2021 +0100

        Logging update

    commit 73e0df8557
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Sun Dec 19 17:28:02 2021 +0100

        Code cleanup

    commit 405dbb034c
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Sun Dec 19 17:13:40 2021 +0100

        Removed duplicate cod3

    commit c7c168a942
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Sun Dec 19 17:08:02 2021 +0100

        Added missing condition

    commit 6af5394f78
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Sun Dec 19 16:16:12 2021 +0100

        Updated assertion handling

    commit 632fe1acd8
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Sun Dec 19 14:33:01 2021 +0100

        Updated handling of mandatory parameters

    commit a4e0d506c6
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Sun Dec 19 14:14:09 2021 +0100

        Aded operation parameters

    commit fc783e6a43
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Sun Dec 19 12:38:35 2021 +0100

        Fixed typo

    commit cb1b498459
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Sun Dec 19 12:37:13 2021 +0100

        Interface comment update

    commit e2d4347ce6
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Sun Dec 19 12:35:50 2021 +0100

        Logging update

    commit cecb72df3e
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Sun Dec 19 12:13:44 2021 +0100

        Added operation

    commit bbf153ccd6
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Sun Dec 19 12:09:49 2021 +0100

        Fixed typo

    commit 29fa5c2f96
    Merge: 28a36fa ec31198
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Sun Dec 19 12:07:34 2021 +0100

        Merge branch 'develop' into feature_meta_data

    commit 28a36fa308
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Sat Dec 18 15:51:02 2021 +0100

        Description updates

    commit 73df9f136c
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Sat Dec 18 14:37:58 2021 +0100

        Comment update

    commit c3ea3c8b37
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Sat Dec 18 14:34:48 2021 +0100

        Renaming

    commit 6a84edd0fb
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Sat Dec 18 14:22:31 2021 +0100

        Comment update

    commit c0d6e66afe
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Sat Dec 18 14:20:20 2021 +0100

        Code cleanup

    commit cc81b588eb
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Sat Dec 18 14:18:31 2021 +0100

        Renaming

    commit c88628e12a
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Sat Dec 18 14:17:50 2021 +0100

        Sort map by operation name

    commit b64001e8a4
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Sat Dec 18 13:39:44 2021 +0100

        Data type update

    commit 8177cd3062
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Sat Dec 18 13:37:23 2021 +0100

        Added cast

    commit b8599ba088
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Sat Dec 18 13:35:40 2021 +0100

        Added safeguard against unknown operations

    commit 6b14ba6511
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Sat Dec 18 13:26:21 2021 +0100

        Map operations by ordinal

    commit ee101f2c6b
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Sat Dec 18 13:14:31 2021 +0100

        Comment update

    commit 67c958ed37
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Sat Dec 18 13:13:06 2021 +0100

        Comment update

    commit d1a9c40745
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Sat Dec 18 13:04:58 2021 +0100

        Default value update

    commit d9dbbc0bb3
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Sat Dec 18 12:47:36 2021 +0100

        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

    commit 5d6862b6b0
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Fri Dec 17 23:22:27 2021 +0100

        Description upddate

    commit 69263b3e4b
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Fri Dec 17 23:21:38 2021 +0100

        Description update

    commit 49e14f7078
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Fri Dec 17 23:19:08 2021 +0100

        Removed redundant message field

    commit ff468aafa8
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Fri Dec 17 23:09:18 2021 +0100

        Added support for default value

    commit 2da717a0a0
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Fri Dec 17 22:57:59 2021 +0100

        For completeness sake added permitted boolean values

    commit 5d894d2e4f
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Fri Dec 17 22:53:07 2021 +0100

        Display permitted values

    commit acc7d3cba5
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Fri Dec 17 20:37:03 2021 +0100

        Comment update

    commit f846242aea
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Fri Dec 17 20:35:07 2021 +0100

        Code cleanup

    commit 5a9592f102
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Fri Dec 17 20:24:33 2021 +0100

        Added convenience method

    commit 9d258d9979
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Fri Dec 17 20:05:53 2021 +0100

        Added convenience method

    commit 6c4103989b
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Fri Dec 17 19:45:20 2021 +0100

        Comment update

    commit 7d543451f0
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Fri Dec 17 19:27:50 2021 +0100

        Description updates

    commit f4b0e50e66
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Fri Dec 17 19:23:29 2021 +0100

        Comment update

    commit 35dd3f6282
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Fri Dec 17 19:21:12 2021 +0100

        Type update

    commit 7a94c0e6e0
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Fri Dec 17 19:17:05 2021 +0100

        Manpage update

    commit 4179110bac
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Fri Dec 17 19:13:42 2021 +0100

        rasctl -s returns operation meta data

    commit eed83bb005
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Fri Dec 17 19:05:29 2021 +0100

        Completed meta data

    commit 4a7528d9d3
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Fri Dec 17 18:39:18 2021 +0100

        Sort operations

    commit d3af9a142c
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Fri Dec 17 18:29:22 2021 +0100

        Support for localized descriptions

    commit b4ff4f52ab
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Fri Dec 17 17:53:11 2021 +0100

        Interface update

    commit e8d9e97fe5
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Fri Dec 17 16:59:49 2021 +0100

        Comment update

    commit 22753b1547
    Author: Uwe Seimet <Uwe.Seimet@seimet.de>
    Date:   Fri Dec 17 16:57:39 2021 +0100

        Added messages

commit b3a9292458
Merge: ea3bb83 94786ae
Author: Uwe Seimet <Uwe.Seimet@seimet.de>
Date:   Tue Dec 21 08:57:56 2021 +0100

    Merge branch 'develop' into feature_folder_filter

commit ea3bb8363a
Author: Uwe Seimet <Uwe.Seimet@seimet.de>
Date:   Tue Dec 21 08:53:30 2021 +0100

    Squashed commit of the following:

    commit 94786aec54
    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:

        commit 4ae273ccbd
        Author: akuker <34318535+akuker@users.noreply.github.com>
        Date:   Sun Dec 19 22:30:22 2021 -0600

            Loopback tester pcb (#545)

        commit 46c5c1966f
        Author: akuker <34318535+akuker@users.noreply.github.com>
        Date:   Sun Dec 19 22:29:59 2021 -0600

            RaSCSI Zero version 1.0 (#546)

        commit d09df31d67
        Author: Daniel Markstedt <markstedt@gmail.com>
        Date:   Sun Dec 19 20:25:23 2021 -0800

            Remove redundant code from OLED script (#547)

        commit d8828da690
        Author: akuker <34318535+akuker@users.noreply.github.com>
        Date:   Sun Dec 19 21:02:50 2021 -0600

            Added list of sponsors

        commit bcd7e8396d
        Author: Daniel Markstedt <markstedt@gmail.com>
        Date:   Sun Dec 19 15:51:45 2021 -0800

            Second attempt at properly creating the manpage dir (#542)

        commit c887edfc8c
        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

        commit 801aebfb96
        Author: Daniel Markstedt <markstedt@gmail.com>
        Date:   Sun Dec 19 15:47:22 2021 -0800

            More readable message when downloading a file (#531)

        commit 29cf58288f
        Author: Daniel Markstedt <markstedt@gmail.com>
        Date:   Sun Dec 19 15:47:03 2021 -0800

            Add a warning notice when ejecting removable media (#526)

        commit 7efa895239
        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

        commit 39bc485671
        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

    commit 693ade2967
    Author: Daniel Markstedt <markstedt@gmail.com>
    Date:   Mon Dec 20 12:04:23 2021 -0800

        Bump Macproxy version to 21.12.2 (#550)

    commit 958fb95908
    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>

    commit 200bc7251f
    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

    commit 4ae273ccbd
    Author: akuker <34318535+akuker@users.noreply.github.com>
    Date:   Sun Dec 19 22:30:22 2021 -0600

        Loopback tester pcb (#545)

    commit 46c5c1966f
    Author: akuker <34318535+akuker@users.noreply.github.com>
    Date:   Sun Dec 19 22:29:59 2021 -0600

        RaSCSI Zero version 1.0 (#546)

    commit d09df31d67
    Author: Daniel Markstedt <markstedt@gmail.com>
    Date:   Sun Dec 19 20:25:23 2021 -0800

        Remove redundant code from OLED script (#547)

    commit d8828da690
    Author: akuker <34318535+akuker@users.noreply.github.com>
    Date:   Sun Dec 19 21:02:50 2021 -0600

        Added list of sponsors

    commit bcd7e8396d
    Author: Daniel Markstedt <markstedt@gmail.com>
    Date:   Sun Dec 19 15:51:45 2021 -0800

        Second attempt at properly creating the manpage dir (#542)

    commit c887edfc8c
    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

    commit 801aebfb96
    Author: Daniel Markstedt <markstedt@gmail.com>
    Date:   Sun Dec 19 15:47:22 2021 -0800

        More readable message when downloading a file (#531)

    commit 29cf58288f
    Author: Daniel Markstedt <markstedt@gmail.com>
    Date:   Sun Dec 19 15:47:03 2021 -0800

        Add a warning notice when ejecting removable media (#526)

    commit 7efa895239
    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

    commit 39bc485671
    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

commit 94786aec54
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:

    commit 4ae273ccbd
    Author: akuker <34318535+akuker@users.noreply.github.com>
    Date:   Sun Dec 19 22:30:22 2021 -0600

        Loopback tester pcb (#545)

    commit 46c5c1966f
    Author: akuker <34318535+akuker@users.noreply.github.com>
    Date:   Sun Dec 19 22:29:59 2021 -0600

        RaSCSI Zero version 1.0 (#546)

    commit d09df31d67
    Author: Daniel Markstedt <markstedt@gmail.com>
    Date:   Sun Dec 19 20:25:23 2021 -0800

        Remove redundant code from OLED script (#547)

    commit d8828da690
    Author: akuker <34318535+akuker@users.noreply.github.com>
    Date:   Sun Dec 19 21:02:50 2021 -0600

        Added list of sponsors

    commit bcd7e8396d
    Author: Daniel Markstedt <markstedt@gmail.com>
    Date:   Sun Dec 19 15:51:45 2021 -0800

        Second attempt at properly creating the manpage dir (#542)

    commit c887edfc8c
    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

    commit 801aebfb96
    Author: Daniel Markstedt <markstedt@gmail.com>
    Date:   Sun Dec 19 15:47:22 2021 -0800

        More readable message when downloading a file (#531)

    commit 29cf58288f
    Author: Daniel Markstedt <markstedt@gmail.com>
    Date:   Sun Dec 19 15:47:03 2021 -0800

        Add a warning notice when ejecting removable media (#526)

    commit 7efa895239
    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

    commit 39bc485671
    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

commit 693ade2967
Author: Daniel Markstedt <markstedt@gmail.com>
Date:   Mon Dec 20 12:04:23 2021 -0800

    Bump Macproxy version to 21.12.2 (#550)

commit 958fb95908
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>

commit 200bc7251f
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

commit f59eeb842e
Author: Uwe Seimet <Uwe.Seimet@seimet.de>
Date:   Mon Dec 20 10:25:28 2021 +0100

    Squashed commit of the following:

    commit 4ae273ccbd
    Author: akuker <34318535+akuker@users.noreply.github.com>
    Date:   Sun Dec 19 22:30:22 2021 -0600

        Loopback tester pcb (#545)

    commit 46c5c1966f
    Author: akuker <34318535+akuker@users.noreply.github.com>
    Date:   Sun Dec 19 22:29:59 2021 -0600

        RaSCSI Zero version 1.0 (#546)

    commit d09df31d67
    Author: Daniel Markstedt <markstedt@gmail.com>
    Date:   Sun Dec 19 20:25:23 2021 -0800

        Remove redundant code from OLED script (#547)

    commit d8828da690
    Author: akuker <34318535+akuker@users.noreply.github.com>
    Date:   Sun Dec 19 21:02:50 2021 -0600

        Added list of sponsors

    commit bcd7e8396d
    Author: Daniel Markstedt <markstedt@gmail.com>
    Date:   Sun Dec 19 15:51:45 2021 -0800

        Second attempt at properly creating the manpage dir (#542)

    commit c887edfc8c
    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

    commit 801aebfb96
    Author: Daniel Markstedt <markstedt@gmail.com>
    Date:   Sun Dec 19 15:47:22 2021 -0800

        More readable message when downloading a file (#531)

    commit 29cf58288f
    Author: Daniel Markstedt <markstedt@gmail.com>
    Date:   Sun Dec 19 15:47:03 2021 -0800

        Add a warning notice when ejecting removable media (#526)

    commit 7efa895239
    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

    commit 39bc485671
    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

commit 4ae273ccbd
Author: akuker <34318535+akuker@users.noreply.github.com>
Date:   Sun Dec 19 22:30:22 2021 -0600

    Loopback tester pcb (#545)

commit 46c5c1966f
Author: akuker <34318535+akuker@users.noreply.github.com>
Date:   Sun Dec 19 22:29:59 2021 -0600

    RaSCSI Zero version 1.0 (#546)

commit d09df31d67
Author: Daniel Markstedt <markstedt@gmail.com>
Date:   Sun Dec 19 20:25:23 2021 -0800

    Remove redundant code from OLED script (#547)

commit d8828da690
Author: akuker <34318535+akuker@users.noreply.github.com>
Date:   Sun Dec 19 21:02:50 2021 -0600

    Added list of sponsors

commit bcd7e8396d
Author: Daniel Markstedt <markstedt@gmail.com>
Date:   Sun Dec 19 15:51:45 2021 -0800

    Second attempt at properly creating the manpage dir (#542)

commit c887edfc8c
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

commit 801aebfb96
Author: Daniel Markstedt <markstedt@gmail.com>
Date:   Sun Dec 19 15:47:22 2021 -0800

    More readable message when downloading a file (#531)

commit 29cf58288f
Author: Daniel Markstedt <markstedt@gmail.com>
Date:   Sun Dec 19 15:47:03 2021 -0800

    Add a warning notice when ejecting removable media (#526)

commit 7efa895239
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

commit 39bc485671
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

commit 670356e0e2
Author: Uwe Seimet <Uwe.Seimet@seimet.de>
Date:   Sun Dec 19 20:26:03 2021 +0100

    Code cleanup

commit 4fc8f67975
Author: Uwe Seimet <Uwe.Seimet@seimet.de>
Date:   Sun Dec 19 20:21:10 2021 +0100

    Manpage update

commit 29603a327a
Author: Uwe Seimet <Uwe.Seimet@seimet.de>
Date:   Sun Dec 19 19:49:56 2021 +0100

    Added optional folder name filter

commit ec31198d83
Author: Uwe Seimet <48174652+uweseimet@users.noreply.github.com>
Date:   Sun Dec 19 11:54:10 2021 +0100

    Optional authentication by access token (#529)

    * Added authentication by access token

    * No authentication is required for getting the rascsi version

    * Added comment

    * Interface description update

    * Manpage update

    * Added error code

    * Enum value update (backwards compatible)

    * Error code update

    * Error code update

    * Added CHECK_AUTHENTICATION

    * Comment update

    * VERSION_INFO also requires authentication

    * rasctl: Made token an optional parameter for -P

    * Fixed interface comment

commit e32211ef73
Author: Uwe Seimet <48174652+uweseimet@users.noreply.github.com>
Date:   Sun Dec 19 11:49:17 2021 +0100

    Recursive image file scan and image file filter (#532)

    * Extracted code

    * Initial support for (optional) recursive image file listings

    * Manpage update

    * Added support for image file filter

    * Updated filtering

    * Made image scan depth configurable

* Interface update

* Squashed commit of the following:

commit 6c98228726
Author: Uwe Seimet <Uwe.Seimet@seimet.de>
Date:   Mon Dec 20 22:45:24 2021 +0100

    Fixed scan depth check

commit 87e8b3be6a
Author: Uwe Seimet <Uwe.Seimet@seimet.de>
Date:   Mon Dec 20 20:46:36 2021 +0100

    Added depth to image info

commit 7c08fa6569
Author: Uwe Seimet <Uwe.Seimet@seimet.de>
Date:   Mon Dec 20 20:38:53 2021 +0100

    Interface comment updates

commit 29d919d30e
Author: Uwe Seimet <Uwe.Seimet@seimet.de>
Date:   Mon Dec 20 20:06:02 2021 +0100

    Error message update

commit fe76a1a577
Author: Uwe Seimet <Uwe.Seimet@seimet.de>
Date:   Mon Dec 20 19:56:36 2021 +0100

    Renaming

commit 412b53ddf1
Merge: bf9d906 958fb95
Author: Uwe Seimet <Uwe.Seimet@seimet.de>
Date:   Mon Dec 20 19:50:53 2021 +0100

    Merge branch 'develop' into feature_file_operations_with_folders

commit 958fb95908
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>

commit bf9d90664c
Author: Uwe Seimet <Uwe.Seimet@seimet.de>
Date:   Mon Dec 20 19:42:36 2021 +0100

    Fixed warning

commit 362a90f3dc
Author: Uwe Seimet <Uwe.Seimet@seimet.de>
Date:   Mon Dec 20 19:37:32 2021 +0100

    Updated error handling

commit 66c380bd97
Author: Uwe Seimet <Uwe.Seimet@seimet.de>
Date:   Mon Dec 20 19:33:01 2021 +0100

    Check image file nesting level

commit c98a2b9069
Author: Uwe Seimet <Uwe.Seimet@seimet.de>
Date:   Mon Dec 20 19:06:18 2021 +0100

    Fixed typo

commit a36dabc002
Author: Uwe Seimet <Uwe.Seimet@seimet.de>
Date:   Mon Dec 20 19:03:18 2021 +0100

    Code cleanup

commit 46fc22f72a
Author: Uwe Seimet <Uwe.Seimet@seimet.de>
Date:   Mon Dec 20 18:58:27 2021 +0100

    Delete empty folders

commit d55bf3e06f
Author: Uwe Seimet <Uwe.Seimet@seimet.de>
Date:   Mon Dec 20 18:33:59 2021 +0100

    Updated delete operation

commit 5afce5f50f
Author: Uwe Seimet <Uwe.Seimet@seimet.de>
Date:   Mon Dec 20 18:31:55 2021 +0100

    Copy/rename/create

commit b969d3990a
Author: Uwe Seimet <Uwe.Seimet@seimet.de>
Date:   Mon Dec 20 15:21:17 2021 +0100

    Cleanup

commit 200bc7251f
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

commit 6a6efa6bdd
Author: Uwe Seimet <Uwe.Seimet@seimet.de>
Date:   Mon Dec 20 12:58:29 2021 +0100

    Cleanup

commit 72ab669158
Author: Uwe Seimet <Uwe.Seimet@seimet.de>
Date:   Mon Dec 20 12:58:03 2021 +0100

    Check for existing folder

commit 6a9ac4d0da
Author: Uwe Seimet <Uwe.Seimet@seimet.de>
Date:   Mon Dec 20 12:52:26 2021 +0100

    Code cleanup, initial support for creating nested file

commit 4ae273ccbd
Author: akuker <34318535+akuker@users.noreply.github.com>
Date:   Sun Dec 19 22:30:22 2021 -0600

    Loopback tester pcb (#545)

commit 46c5c1966f
Author: akuker <34318535+akuker@users.noreply.github.com>
Date:   Sun Dec 19 22:29:59 2021 -0600

    RaSCSI Zero version 1.0 (#546)

commit d09df31d67
Author: Daniel Markstedt <markstedt@gmail.com>
Date:   Sun Dec 19 20:25:23 2021 -0800

    Remove redundant code from OLED script (#547)

commit d8828da690
Author: akuker <34318535+akuker@users.noreply.github.com>
Date:   Sun Dec 19 21:02:50 2021 -0600

    Added list of sponsors

commit bcd7e8396d
Author: Daniel Markstedt <markstedt@gmail.com>
Date:   Sun Dec 19 15:51:45 2021 -0800

    Second attempt at properly creating the manpage dir (#542)

commit c887edfc8c
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

commit 801aebfb96
Author: Daniel Markstedt <markstedt@gmail.com>
Date:   Sun Dec 19 15:47:22 2021 -0800

    More readable message when downloading a file (#531)

commit 29cf58288f
Author: Daniel Markstedt <markstedt@gmail.com>
Date:   Sun Dec 19 15:47:03 2021 -0800

    Add a warning notice when ejecting removable media (#526)

commit 7efa895239
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

commit 39bc485671
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

commit ec31198d83
Author: Uwe Seimet <48174652+uweseimet@users.noreply.github.com>
Date:   Sun Dec 19 11:54:10 2021 +0100

    Optional authentication by access token (#529)

    * Added authentication by access token

    * No authentication is required for getting the rascsi version

    * Added comment

    * Interface description update

    * Manpage update

    * Added error code

    * Enum value update (backwards compatible)

    * Error code update

    * Error code update

    * Added CHECK_AUTHENTICATION

    * Comment update

    * VERSION_INFO also requires authentication

    * rasctl: Made token an optional parameter for -P

    * Fixed interface comment

commit e32211ef73
Author: Uwe Seimet <48174652+uweseimet@users.noreply.github.com>
Date:   Sun Dec 19 11:49:17 2021 +0100

    Recursive image file scan and image file filter (#532)

    * Extracted code

    * Initial support for (optional) recursive image file listings

    * Manpage update

    * Added support for image file filter

    * Updated filtering

    * Made image scan depth configurable

* Code cleanup

* Resolved merged issues

* Fixed merge issue

* Comment update

* Message update

* Fixed typo

* Logging update

* Logging update

* Logging update

* Fixed merge issue

* Set pattern param for SERVER_INFO

* Added missing break

* Updated error handling

* Logging update

* Error message update

* Removed initial approach for localization in remote interface

* Resolve merge conflicts

* Made 1 the default scan depth

Co-authored-by: Daniel Markstedt <markstedt@gmail.com>
This commit is contained in:
Uwe Seimet 2021-12-22 09:25:05 +01:00 committed by GitHub
parent e2580d77cf
commit b5f71fb3b8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 254 additions and 141 deletions

View File

@ -58,7 +58,7 @@ The rascsi log level (trace, debug, info, warn, err, critical, off). The default
Enable authentication and read the access token from the specified file. The access token file must be owned by root and must be readable by root only.
.TP
.BR \-R\fI " " \fISCAN_DEPTH
Scan for image files recursively, up to a depth of SCAN_DEPTH. Be careful when using this option with many sub-folders in the default image folder.
Scan for image files recursively, up to a depth of SCAN_DEPTH. Depth 0 means to ignore any folders within the default image filder. Be careful when using this option with many sub-folders in the default image folder. The default depth is 1.
.TP
.BR \-h\fI " " \fI
Show a help page.

View File

@ -73,25 +73,26 @@ OPTIONS
-R SCAN_DEPTH
Scan for image files recursively, up to a depth of SCAN_DEPTH.
Be careful when using this option with many sub-folders in the
default image folder.
Depth 0 means to ignore any folders within the default image
filder. Be careful when using this option with many sub-folders
in the default image folder. The default depth is 1.
-h Show a help page.
-n VENDOR:PRODUCT:REVISION
Set the vendor, product and revision for the device, to be re
turned with the INQUIRY data. A complete set of name components
Set the vendor, product and revision for the device, to be re
turned with the INQUIRY data. A complete set of name components
must be provided. VENDOR may have up to 8, PRODUCT up to 16, RE
VISION up to 4 characters. Padding with blanks to the maxium
length is automatically applied. Once set the name of a device
VISION up to 4 characters. Padding with blanks to the maxium
length is automatically applied. Once set the name of a device
cannot be changed.
-p PORT
The rascsi server port, default is 6868.
-r RESERVED_IDS
Comma-separated list of IDs to reserve. -p TYPE The optional
case-insensitive device type (SAHD, SCHD, SCRM, SCCD, SCMO,
Comma-separated list of IDs to reserve. -p TYPE The optional
case-insensitive device type (SAHD, SCHD, SCRM, SCCD, SCMO,
SCBR, SCDP). If no type is specified for devices that support an
image file, rascsi tries to derive the type from the file exten
sion.
@ -99,17 +100,17 @@ OPTIONS
-v Display the rascsi version.
-IDn[:u] FILE
n is the SCSI ID number (0-7). u (0-31) is the optional LUN
n is the SCSI ID number (0-7). u (0-31) is the optional LUN
(logical unit). The default LUN is 0.
FILE is the name of the image file to use for the SCSI device.
For devices that do not support an image file (SCBR, SCDP) a
FILE is the name of the image file to use for the SCSI device.
For devices that do not support an image file (SCBR, SCDP) a
dummy name must be provided.
-HDn[:u] FILE
n is the SASI ID number (0-15). The effective SASI ID is calcu
lated as n/2, the effective SASI LUN is calculated is the re
mainder of n/2. Alternatively the n:u syntax can be used, where
n is the SASI ID number (0-15). The effective SASI ID is calcu
lated as n/2, the effective SASI LUN is calculated is the re
mainder of n/2. Alternatively the n:u syntax can be used, where
ns is the SASI ID (0-7) and u the LUN (0-1).
FILE is the name of the image file to use for the SASI device.
@ -126,7 +127,7 @@ EXAMPLES
rascsi -ID0 /path/to/harddrive.hda -ID2 /path/to/cdimage.iso
Launch RaSCSI with a removable SCSI drive image as ID 0 and the raw de
vice file /dev/hdb (e.g. a USB stick) and a DaynaPort network adapter
vice file /dev/hdb (e.g. a USB stick) and a DaynaPort network adapter
as ID 6:
rascsi -ID0 -t scrm /dev/hdb -ID6 -t scdp DUMMY_FILENAME

View File

@ -68,7 +68,6 @@ static void *MonThread(void *param);
string current_log_level; // Some versions of spdlog do not support get_log_level()
string access_token;
set<int> reserved_ids;
int scan_depth = 0;
DeviceFactory& device_factory = DeviceFactory::instance();
RascsiImage rascsi_image;
RascsiResponse rascsi_response(&device_factory, &rascsi_image);
@ -1244,10 +1243,12 @@ bool ParseArgument(int argc, char* argv[], int& port)
continue;
case 'R':
if (!GetAsInt(optarg, scan_depth) || scan_depth < 0) {
int depth;
if (!GetAsInt(optarg, depth) || depth < 0) {
cerr << "Invalid image file scan depth " << optarg << endl;
return false;
}
rascsi_image.SetDepth(depth);
continue;
case 'n':
@ -1430,7 +1431,7 @@ static void *MonThread(void *param)
}
if (!PbOperation_IsValid(command.operation())) {
LOGTRACE("Received unknown command %d", command.operation());
LOGERROR("Received unknown command with operation opcode %d", command.operation());
ReturnStatus(fd, false, "Unknown command", UNKNOWN_OPERATION);
continue;
@ -1454,12 +1455,7 @@ static void *MonThread(void *param)
}
case DEFAULT_FOLDER: {
string folder = GetParam(command, "folder");
if (folder.empty()) {
ReturnStatus(fd, false, "Can't set default image folder: Missing folder name");
}
string result = rascsi_image.SetDefaultImageFolder(folder);
string result = rascsi_image.SetDefaultImageFolder(GetParam(command, "folder"));
if (!result.empty()) {
ReturnStatus(fd, false, result);
}
@ -1483,8 +1479,8 @@ static void *MonThread(void *param)
case SERVER_INFO: {
result.set_allocated_server_info(rascsi_response.GetServerInfo(
result, devices, reserved_ids, current_log_level, GetParam(command, "filename_pattern"),
scan_depth));
result, devices, reserved_ids, current_log_level, GetParam(command, "folder_pattern"),
GetParam(command, "file_pattern"), rascsi_image.GetDepth()));
SerializeMessage(fd, result);
break;
}
@ -1503,7 +1499,8 @@ static void *MonThread(void *param)
case DEFAULT_IMAGE_FILES_INFO: {
result.set_allocated_image_files_info(rascsi_response.GetAvailableImages(result,
GetParam(command, "filename_pattern"), scan_depth));
GetParam(command, "folder_pattern"), GetParam(command, "file_pattern"),
rascsi_image.GetDepth()));
SerializeMessage(fd, result);
break;
}
@ -1541,7 +1538,8 @@ static void *MonThread(void *param)
}
case OPERATION_INFO: {
result.set_allocated_operation_info(rascsi_response.GetOperationInfo(result));
result.set_allocated_operation_info(rascsi_response.GetOperationInfo(result,
rascsi_image.GetDepth()));
SerializeMessage(fd, result);
break;
}
@ -1593,7 +1591,7 @@ int main(int argc, char* argv[])
// Get temporary operation info, in order to trigger an assertion on startup if the operation list is incomplete
PbResult pb_operation_info_result;
rascsi_response.GetOperationInfo(pb_operation_info_result);
rascsi_response.GetOperationInfo(pb_operation_info_result, 0);
int actid;
BUS::phase_t phase;

View File

@ -44,10 +44,42 @@ RascsiImage::RascsiImage()
else {
default_image_folder = "/home/pi/images";
}
depth = 1;
}
bool RascsiImage::CheckDepth(const string& filename)
{
return count(filename.begin(), filename.end(), '/') <= depth;
}
bool RascsiImage::CreateImageFolder(int fd, const string& filename)
{
size_t filename_start = filename.rfind('/');
if (filename_start != string::npos) {
string folder = filename.substr(0, filename_start);
// Checking for existence first prevents an error if the top-level folder is a softlink
struct stat st;
if (stat(folder.c_str(), &st)) {
std::error_code error;
filesystem::create_directories(folder, error);
if (error) {
ReturnStatus(fd, false, "Can't create image folder '" + folder + "': " + strerror(errno));
return false;
}
}
}
return true;
}
string RascsiImage::SetDefaultImageFolder(const string& f)
{
if (f.empty()) {
return "Can't set default image folder: Missing folder name";
}
string folder = f;
// If a relative path is specified the path is assumed to be relative to the user's home directory
@ -104,17 +136,19 @@ bool RascsiImage::CreateImage(int fd, const PbCommand& command)
if (filename.empty()) {
return ReturnStatus(fd, false, "Can't create image file: Missing image filename");
}
if (filename.find('/') != string::npos) {
return ReturnStatus(fd, false, "Can't create image file '" + filename + "': Filename must not contain a path");
if (!CheckDepth(filename)) {
return ReturnStatus(fd, false, ("Invalid folder hierarchy depth '" + filename + "'").c_str());
}
filename = default_image_folder + "/" + filename;
if (!IsValidDstFilename(filename)) {
return ReturnStatus(fd, false, "Can't create image file: '" + filename + "': File already exists");
string full_filename = default_image_folder + "/" + filename;
if (!IsValidDstFilename(full_filename)) {
return ReturnStatus(fd, false, "Can't create image file: '" + full_filename + "': File already exists");
}
const string size = GetParam(command, "size");
if (size.empty()) {
return ReturnStatus(fd, false, "Can't create image file '" + filename + "': Missing image size");
return ReturnStatus(fd, false, "Can't create image file '" + full_filename + "': Missing image size");
}
off_t len;
@ -122,20 +156,19 @@ bool RascsiImage::CreateImage(int fd, const PbCommand& command)
len = stoull(size);
}
catch(const invalid_argument& e) {
return ReturnStatus(fd, false, "Can't create image file '" + filename + "': Invalid file size " + size);
return ReturnStatus(fd, false, "Can't create image file '" + full_filename + "': Invalid file size " + size);
}
catch(const out_of_range& e) {
return ReturnStatus(fd, false, "Can't create image file '" + filename + "': Invalid file size " + size);
return ReturnStatus(fd, false, "Can't create image file '" + full_filename + "': Invalid file size " + size);
}
if (len < 512 || (len & 0x1ff)) {
ostringstream error;
error << "Invalid image file size " << len;
error << "Invalid image file size " << len << " (not a multiple of 512)";
return ReturnStatus(fd, false, error.str());
}
struct stat st;
if (!stat(filename.c_str(), &st)) {
return ReturnStatus(fd, false, "Can't create image file '" + filename + "': File already exists");
if (!CreateImageFolder(fd, full_filename)) {
return false;
}
string permission = GetParam(command, "read_only");
@ -143,23 +176,23 @@ bool RascsiImage::CreateImage(int fd, const PbCommand& command)
int permissions = !strcasecmp(permission.c_str(), "true") ?
S_IRUSR | S_IRGRP | S_IROTH : S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
int image_fd = open(filename.c_str(), O_CREAT|O_WRONLY, permissions);
int image_fd = open(full_filename.c_str(), O_CREAT|O_WRONLY, permissions);
if (image_fd == -1) {
return ReturnStatus(fd, false, "Can't create image file '" + filename + "': " + string(strerror(errno)));
return ReturnStatus(fd, false, "Can't create image file '" + full_filename + "': " + string(strerror(errno)));
}
if (fallocate(image_fd, 0, 0, len) == -1) {
if (fallocate(image_fd, 0, 0, len)) {
close(image_fd);
unlink(filename.c_str());
unlink(full_filename.c_str());
return ReturnStatus(fd, false, "Can't allocate space for image file '" + filename + "': " + string(strerror(errno)));
return ReturnStatus(fd, false, "Can't allocate space for image file '" + full_filename + "': " + string(strerror(errno)));
}
close(image_fd);
ostringstream msg;
msg << "Created " << (permissions & S_IWUSR ? "": "read-only ") << "image file '" << filename + "' with a size of " << len << " bytes";
msg << "Created " << (permissions & S_IWUSR ? "": "read-only ") << "image file '" << full_filename + "' with a size of " << len << " bytes";
LOGINFO("%s", msg.str().c_str());
return ReturnStatus(fd);
@ -172,31 +205,45 @@ bool RascsiImage::DeleteImage(int fd, const PbCommand& command)
return ReturnStatus(fd, false, "Missing image filename");
}
if (!IsValidDstFilename(filename)) {
return ReturnStatus(fd, false, "Can't delete image file '" + filename + "': File already exists");
if (!CheckDepth(filename)) {
return ReturnStatus(fd, false, ("Invalid folder hierarchy depth '" + filename + "'").c_str());
}
if (filename.find('/') != string::npos) {
return ReturnStatus(fd, false, "The image filename '" + filename + "' must not contain a path");
}
filename = default_image_folder + "/" + filename;
string full_filename = default_image_folder + "/" + filename;
int id;
int unit;
Filepath filepath;
filepath.SetPath(filename.c_str());
filepath.SetPath(full_filename.c_str());
if (FileSupport::GetIdsForReservedFile(filepath, id, unit)) {
ostringstream msg;
msg << "Can't delete image file '" << filename << "', it is used by device ID " << id << ", unit " << unit;
msg << "Can't delete image file '" << full_filename << "', it is currently being used by device ID " << id << ", unit " << unit;
return ReturnStatus(fd, false, msg.str());
}
if (unlink(filename.c_str())) {
return ReturnStatus(fd, false, "Can't delete image file '" + filename + "': " + string(strerror(errno)));
if (remove(full_filename.c_str())) {
return ReturnStatus(fd, false, "Can't delete image file '" + full_filename + "': " + string(strerror(errno)));
}
LOGINFO("Deleted image file '%s'", filename.c_str());
// Delete empty subfolders
size_t last_slash = filename.rfind('/');
while (last_slash != string::npos) {
string folder = filename.substr(0, last_slash);
string full_folder = default_image_folder + "/" + folder;
std::error_code error;
if (!filesystem::is_empty(full_folder, error) || error) {
break;
}
if (remove(full_folder.c_str())) {
return ReturnStatus(fd, false, "Can't delete empty image folder '" + full_folder + "'");
}
last_slash = folder.rfind('/');
}
LOGINFO("Deleted image file '%s'", full_filename.c_str());
return ReturnStatus(fd);
}
@ -207,9 +254,11 @@ bool RascsiImage::RenameImage(int fd, const PbCommand& command)
if (from.empty()) {
return ReturnStatus(fd, false, "Can't rename image file: Missing source filename");
}
if (from.find('/') != string::npos) {
return ReturnStatus(fd, false, "The source filename '" + from + "' must not contain a path");
if (!CheckDepth(from)) {
return ReturnStatus(fd, false, ("Invalid folder hierarchy depth '" + from + "'").c_str());
}
from = default_image_folder + "/" + from;
if (!IsValidSrcFilename(from)) {
return ReturnStatus(fd, false, "Can't rename image file: '" + from + "': Invalid name or type");
@ -219,14 +268,20 @@ bool RascsiImage::RenameImage(int fd, const PbCommand& command)
if (to.empty()) {
return ReturnStatus(fd, false, "Can't rename image file '" + from + "': Missing destination filename");
}
if (to.find('/') != string::npos) {
return ReturnStatus(fd, false, "The destination filename '" + to + "' must not contain a path");
if (!CheckDepth(to)) {
return ReturnStatus(fd, false, ("Invalid folder hierarchy depth '" + to + "'").c_str());
}
to = default_image_folder + "/" + to;
if (!IsValidDstFilename(to)) {
return ReturnStatus(fd, false, "Can't rename image file '" + from + "' to '" + to + "': File already exists");
}
if (!CreateImageFolder(fd, to)) {
return false;
}
if (rename(from.c_str(), to.c_str())) {
return ReturnStatus(fd, false, "Can't rename image file '" + from + "' to '" + to + "': " + string(strerror(errno)));
}
@ -242,9 +297,11 @@ bool RascsiImage::CopyImage(int fd, const PbCommand& command)
if (from.empty()) {
return ReturnStatus(fd, false, "Can't copy image file: Missing source filename");
}
if (from.find('/') != string::npos) {
return ReturnStatus(fd, false, "The source filename '" + from + "' must not contain a path");
if (!CheckDepth(from)) {
return ReturnStatus(fd, false, ("Invalid folder hierarchy depth '" + from + "'").c_str());
}
from = default_image_folder + "/" + from;
if (!IsValidSrcFilename(from)) {
return ReturnStatus(fd, false, "Can't copy image file: '" + from + "': Invalid name or type");
@ -254,9 +311,11 @@ bool RascsiImage::CopyImage(int fd, const PbCommand& command)
if (to.empty()) {
return ReturnStatus(fd, false, "Can't copy image file '" + from + "': Missing destination filename");
}
if (to.find('/') != string::npos) {
return ReturnStatus(fd, false, "The destination filename '" + to + "' must not contain a path");
if (!CheckDepth(to)) {
return ReturnStatus(fd, false, ("Invalid folder hierarchy depth '" + to + "'").c_str());
}
to = default_image_folder + "/" + to;
if (!IsValidDstFilename(to)) {
return ReturnStatus(fd, false, "Can't copy image file '" + from + "' to '" + to + "': File already exists");
@ -267,6 +326,10 @@ bool RascsiImage::CopyImage(int fd, const PbCommand& command)
return ReturnStatus(fd, false, "Can't access source image file '" + from + "': " + string(strerror(errno)));
}
if (!CreateImageFolder(fd, to)) {
return false;
}
// Symbolic links need a special handling
if ((st.st_mode & S_IFMT) == S_IFLNK) {
if (symlink(filesystem::read_symlink(from).c_str(), to.c_str())) {
@ -318,9 +381,11 @@ bool RascsiImage::SetImagePermissions(int fd, const PbCommand& command)
if (filename.empty()) {
return ReturnStatus(fd, false, "Missing image filename");
}
if (filename.find('/') != string::npos) {
return ReturnStatus(fd, false, "The image filename '" + filename + "' must not contain a path");
if (!CheckDepth(filename)) {
return ReturnStatus(fd, false, ("Invalid folder hierarchy depth '" + filename + "'").c_str());
}
filename = default_image_folder + "/" + filename;
if (!IsValidSrcFilename(filename)) {
return ReturnStatus(fd, false, "Can't modify image file '" + filename + "': Invalid name or type");

View File

@ -22,6 +22,10 @@ public:
RascsiImage();
~RascsiImage() {};
void SetDepth(int depth) { this->depth = depth; }
int GetDepth() { return depth; }
bool CheckDepth(const string&);
bool CreateImageFolder(int, const string&);
string GetDefaultImageFolder() const { return default_image_folder; }
string SetDefaultImageFolder(const string&);
bool IsValidSrcFilename(const string&);
@ -35,4 +39,5 @@ public:
private:
string default_image_folder;
int depth;
};

View File

@ -35,7 +35,7 @@ enum PbOperation {
// Attach devices and return the new device list (PbDevicesInfo)
// Parameters (mutually exclusive):
// "file": The filename relative to the default image folder. It must not contain a slash.
// "file": The filename relative to the default image folder
// "interfaces": A prioritized comma-separated list of interfaces to create a network bridge for.
ATTACH = 1;
@ -54,7 +54,7 @@ enum PbOperation {
// Insert medium
// Parameters:
// "file": The filename, relative to the default image folder. It must not contain a slash.
// "file": The filename, relative to the default image folder
INSERT = 6;
// Eject medium
@ -68,7 +68,8 @@ enum PbOperation {
// Gets the server information (PbServerInfo). Calling this operation should be avoided because it
// may return a lot of data. More specific other operations should be used instead.
// "filename_pattern": Optional filter, only filenames containing the case-insensitive pattern are returned
// "folder_pattern": Optional filter, only folder names containing the case-insensitive pattern are returned
// "file_pattern": Optional filter, only filenames containing the case-insensitive pattern are returned
SERVER_INFO = 10;
// Get rascsi server version (PbVersionInfo)
@ -83,10 +84,11 @@ enum PbOperation {
// Get information on available image files in the default image folder (PbImageFilesInfo)
// Parameters:
// "filename_pattern": Optional filter, only filenames containing the case-insensitive pattern are returned
// "folder_pattern": Optional filter, only folder names containing the case-insensitive pattern are returned
// "file_pattern": Optional filter, only filenames containing the case-insensitive pattern are returned
DEFAULT_IMAGE_FILES_INFO = 14;
// Get information on an image file (not necessarily in the default image folder) based on an absolute path.
// Get information on an image file (not necessarily in the default image folder).
// Parameters:
// "file": The filename. Either an absolute path or a path relative to the default image folder.
IMAGE_FILE_INFO = 15;
@ -126,39 +128,39 @@ enum PbOperation {
// Create an image file. The image file must not yet exist.
// Parameters:
// "file": The filename, relative to the default image folder. It must not contain a slash.
// "file": The filename, relative to the default image folder
// "size": The file size in bytes, must be a multiple of 512
// "read_only": Optional, "true" (case-insensitive) in order to create a read-only file
CREATE_IMAGE = 24;
// Delete an image file.
// Parameters:
// "file": The filename, relative to the default image folder. It must not contain a slash.
// "file": The filename, relative to the default image folder.
DELETE_IMAGE = 25;
// Rename an image file.
// Rename/Move an image file.
// Parameters:
// "from": The old filename, relative to the default image folder. It must not contain a slash.
// "to": The new filename, relative to the default image folder. It must not contain a slash.
// "from": The old filename, relative to the default image folder
// "to": The new filename, relative to the default image folder
// The new filename must not yet exist.
RENAME_IMAGE = 26;
// Copy an image file.
// Parameters:
// "from": The source filename, relative to the default image folder. It must not contain a slash.
// "to": The destination filename, relative to the default image folder. It must not contain a slash.
// "from": The source filename, relative to the default image folder
// "to": The destination filename, relative to the default image folder
// "read_only": Optional, "true" (case-insensitive) in order to create a read-only file
// The destination filename must not yet exist.
COPY_IMAGE = 27;
// Write-protect an image file.
// Parameters:
// "file": The filename, relative to the default image folder. It must not contain a slash.
// "file": The filename, relative to the default image folder
PROTECT_IMAGE = 28;
// Make an image file writable.
// Parameters:
// "file": The filename, relative to the default image folder. It must not contain a slash.
// "file": The filename, relative to the default image folder
UNPROTECT_IMAGE = 29;
// Check whether an authentication token is valid. A client can use this operation in order to
@ -173,9 +175,8 @@ enum PbOperation {
// The operation parameter meta data. The parameter data type is provided by the protobuf API.
message PbOperationParameter {
string name = 1;
// Optional short localized description, key is the lower case locale (e.g. en, de).
// Falling back to "en" is recommended if a description for a particular language is missing.
map<string, string> description = 2;
// Optional short description
string description = 2;
// There is no specific set of permitted values if empty
repeated string permitted_values = 3;
// Optional default value
@ -188,9 +189,8 @@ message PbOperationParameter {
message PbOperationMetaData {
// The operation name at the time the server-side protobuf code was generated.
string server_side_name = 1;
// Optional short localized description, key is the lower case locale (e.g. en, de).
// Falling back to "en" is recommended if a description for a particular language is missing.
map<string, string> description = 2;
// Optional short description
string description = 2;
repeated PbOperationParameter parameters = 3;
}
@ -275,6 +275,8 @@ message PbImageFile {
message PbImageFilesInfo {
string default_image_folder = 1;
repeated PbImageFile image_files = 2;
// The maximum nesting depth, configured with the -R option
int32 depth = 3;
}
// Log level information

View File

@ -141,39 +141,45 @@ bool RascsiResponse::GetImageFile(PbImageFile *image_file, const string& filenam
}
void RascsiResponse::GetAvailableImages(PbImageFilesInfo& image_files_info, const string& default_image_folder,
const string& folder, const string& pattern, int scan_depth) {
string pattern_lower = pattern;
transform(pattern_lower.begin(), pattern_lower.end(), pattern_lower.begin(), ::tolower);
const string& folder, const string& folder_pattern, const string& file_pattern, int scan_depth) {
string folder_pattern_lower = folder_pattern;
transform(folder_pattern_lower.begin(), folder_pattern_lower.end(), folder_pattern_lower.begin(), ::tolower);
string file_pattern_lower = file_pattern;
transform(file_pattern_lower.begin(), file_pattern_lower.end(), file_pattern_lower.begin(), ::tolower);
if (scan_depth-- >= 0) {
DIR *d = opendir(folder.c_str());
if (d) {
struct dirent *dir;
while ((dir = readdir(d))) {
string filename = folder + "/" + dir->d_name;
string name_lower = filename;
if (!pattern.empty()) {
transform(name_lower.begin(), name_lower.end(), name_lower.begin(), ::tolower);
}
bool is_supported_type = dir->d_type == DT_REG || dir->d_type == DT_DIR || dir->d_type == DT_LNK || dir->d_type == DT_BLK;
if (is_supported_type && dir->d_name[0] != '.') {
string name_lower = dir->d_name;
if (!file_pattern.empty()) {
transform(name_lower.begin(), name_lower.end(), name_lower.begin(), ::tolower);
}
string filename = folder + "/" + dir->d_name;
struct stat st;
if (dir->d_type == DT_REG && !stat(filename.c_str(), &st)) {
if (!st.st_size) {
LOGTRACE("File '%s' in image folder '%s' has a size of 0 bytes", dir->d_name, folder.c_str());
LOGWARN("File '%s' in image folder '%s' has a size of 0 bytes", dir->d_name, folder.c_str());
continue;
}
} else if (dir->d_type == DT_LNK && stat(filename.c_str(), &st)) {
LOGTRACE("Symlink '%s' in image folder '%s' is broken", dir->d_name, folder.c_str());
LOGWARN("Symlink '%s' in image folder '%s' is broken", dir->d_name, folder.c_str());
continue;
} else if (dir->d_type == DT_DIR) {
GetAvailableImages(image_files_info, default_image_folder, filename, pattern, scan_depth);
if (folder_pattern_lower.empty() || name_lower.find(folder_pattern_lower) != string::npos) {
GetAvailableImages(image_files_info, default_image_folder, filename, folder_pattern,
file_pattern, scan_depth);
}
continue;
}
if (pattern.empty() || name_lower.find(pattern_lower) != string::npos) {
if (file_pattern_lower.empty() || name_lower.find(file_pattern_lower) != string::npos) {
PbImageFile *image_file = new PbImageFile();
if (GetImageFile(image_file, filename)) {
GetImageFile(image_files_info.add_image_files(), filename.substr(default_image_folder.length() + 1));
@ -188,23 +194,27 @@ void RascsiResponse::GetAvailableImages(PbImageFilesInfo& image_files_info, cons
}
}
PbImageFilesInfo *RascsiResponse::GetAvailableImages(PbResult& result, const string& pattern, int scan_depth)
PbImageFilesInfo *RascsiResponse::GetAvailableImages(PbResult& result, const string& folder_pattern,
const string& file_pattern, int scan_depth)
{
PbImageFilesInfo *image_files_info = new PbImageFilesInfo();
string default_image_folder = rascsi_image->GetDefaultImageFolder();
image_files_info->set_default_image_folder(default_image_folder);
image_files_info->set_depth(scan_depth);
GetAvailableImages(*image_files_info, default_image_folder, default_image_folder, pattern, scan_depth);
GetAvailableImages(*image_files_info, default_image_folder, default_image_folder, folder_pattern,
file_pattern, scan_depth);
result.set_status(true);
return image_files_info;
}
void RascsiResponse::GetAvailableImages(PbResult& result, PbServerInfo& server_info, const string& pattern, int scan_depth)
void RascsiResponse::GetAvailableImages(PbResult& result, PbServerInfo& server_info, const string& folder_pattern,
const string& file_pattern, int scan_depth)
{
PbImageFilesInfo *image_files_info = GetAvailableImages(result, pattern, scan_depth);
PbImageFilesInfo *image_files_info = GetAvailableImages(result, folder_pattern, file_pattern, scan_depth);
image_files_info->set_default_image_folder(rascsi_image->GetDefaultImageFolder());
server_info.set_allocated_image_files_info(image_files_info);
@ -283,19 +293,19 @@ PbDeviceTypesInfo *RascsiResponse::GetDeviceTypesInfo(PbResult& result, const Pb
}
PbServerInfo *RascsiResponse::GetServerInfo(PbResult& result, const vector<Device *>& devices, const set<int>& reserved_ids,
const string& current_log_level, const string& filename_pattern, int scan_depth)
const string& current_log_level, const string& folder_pattern, const string& file_pattern, int scan_depth)
{
PbServerInfo *server_info = new PbServerInfo();
server_info->set_allocated_version_info(GetVersionInfo(result));
server_info->set_allocated_log_level_info(GetLogLevelInfo(result, current_log_level));
GetAllDeviceTypeProperties(*server_info->mutable_device_types_info());
GetAvailableImages(result, *server_info, filename_pattern, scan_depth);
GetAvailableImages(result, *server_info, folder_pattern, file_pattern, scan_depth);
server_info->set_allocated_network_interfaces_info(GetNetworkInterfacesInfo(result));
server_info->set_allocated_mapping_info(GetMappingInfo(result));
GetDevices(*server_info, devices);
server_info->set_allocated_reserved_ids_info(GetReservedIds(result, reserved_ids));
server_info->set_allocated_operation_info(GetOperationInfo(result));
server_info->set_allocated_operation_info(GetOperationInfo(result, scan_depth));
result.set_status(true);
@ -356,7 +366,7 @@ PbMappingInfo *RascsiResponse::GetMappingInfo(PbResult& result)
return mapping_info;
}
PbOperationInfo *RascsiResponse::GetOperationInfo(PbResult& result)
PbOperationInfo *RascsiResponse::GetOperationInfo(PbResult& result, int depth)
{
PbOperationInfo *operation_info = new PbOperationInfo();
@ -391,7 +401,10 @@ PbOperationInfo *RascsiResponse::GetOperationInfo(PbResult& result)
CreateOperation(operation_info, meta_data, UNPROTECT, "Unprotect medium, device-specific parameters are required");
meta_data = new PbOperationMetaData();
AddOperationParameter(meta_data, "filename_pattern", "Pattern for filtering image file names");
if (depth) {
AddOperationParameter(meta_data, "folder_pattern", "Pattern for filtering image folder names");
}
AddOperationParameter(meta_data, "file_pattern", "Pattern for filtering image file names");
CreateOperation(operation_info, meta_data, SERVER_INFO, "Get rascsi server information");
meta_data = new PbOperationMetaData();
@ -404,7 +417,10 @@ PbOperationInfo *RascsiResponse::GetOperationInfo(PbResult& result)
CreateOperation(operation_info, meta_data, DEVICE_TYPES_INFO, "Get device properties by device type");
meta_data = new PbOperationMetaData();
AddOperationParameter(meta_data, "filename_pattern", "Pattern for filtering image file names");
if (depth) {
AddOperationParameter(meta_data, "folder_pattern", "Pattern for filtering image folder names");
}
AddOperationParameter(meta_data, "file_pattern", "Pattern for filtering image file names");
CreateOperation(operation_info, meta_data, DEFAULT_IMAGE_FILES_INFO, "Get information on available image files");
meta_data = new PbOperationMetaData();
@ -463,7 +479,7 @@ PbOperationInfo *RascsiResponse::GetOperationInfo(PbResult& result)
CreateOperation(operation_info, meta_data, RENAME_IMAGE, "Rename image file");
meta_data = new PbOperationMetaData();
AddOperationParameter(meta_data, "from", "Source image file name image file name", "", true);
AddOperationParameter(meta_data, "from", "Source image file name", "", true);
AddOperationParameter(meta_data, "to", "Destination image file name", "", true);
parameter = AddOperationParameter(meta_data, "read_only", "Read-only flag", "false");
parameter->add_permitted_values("true");
@ -497,7 +513,7 @@ void RascsiResponse::CreateOperation(PbOperationInfo *operation_info, PbOperatio
const PbOperation& operation, const string& description)
{
meta_data->set_server_side_name(PbOperation_Name(operation));
(*meta_data->mutable_description())["en"] = description;
meta_data->set_description(description);
int ordinal = PbOperation_descriptor()->FindValueByName(PbOperation_Name(operation))->index();
(*operation_info->mutable_operations())[ordinal] = *meta_data;
}
@ -507,7 +523,7 @@ PbOperationParameter *RascsiResponse::AddOperationParameter(PbOperationMetaData
{
PbOperationParameter *parameter = meta_data->add_parameters();
parameter->set_name(name);
(*parameter->mutable_description())["en"] = description;
parameter->set_description(description);
parameter->set_default_value(default_value);
parameter->set_is_mandatory(is_mandatory);

View File

@ -29,17 +29,18 @@ public:
~RascsiResponse() {};
bool GetImageFile(PbImageFile *, const string&);
PbImageFilesInfo *GetAvailableImages(PbResult&, const string&, int);
PbImageFilesInfo *GetAvailableImages(PbResult&, const string&, const string&, int);
PbReservedIdsInfo *GetReservedIds(PbResult&, const set<int>&);
void GetDevices(PbServerInfo&, const vector<Device *>&);
void GetDevicesInfo(PbResult&, const PbCommand&, const vector<Device *>&, int);
PbDeviceTypesInfo *GetDeviceTypesInfo(PbResult&, const PbCommand&);
PbVersionInfo *GetVersionInfo(PbResult&);
PbServerInfo *GetServerInfo(PbResult&, const vector<Device *>&, const set<int>&, const string&, const string&, int);
PbServerInfo *GetServerInfo(PbResult&, const vector<Device *>&, const set<int>&, const string&, const string&,
const string&, int);
PbNetworkInterfacesInfo *GetNetworkInterfacesInfo(PbResult&);
PbMappingInfo *GetMappingInfo(PbResult&);
PbLogLevelInfo *GetLogLevelInfo(PbResult&, const string&);
PbOperationInfo *GetOperationInfo(PbResult&);
PbOperationInfo *GetOperationInfo(PbResult&, int);
private:
@ -52,8 +53,8 @@ private:
void GetDevice(const Device *, PbDevice *);
void GetAllDeviceTypeProperties(PbDeviceTypesInfo&);
void GetDeviceTypeProperties(PbDeviceTypesInfo&, PbDeviceType);
void GetAvailableImages(PbImageFilesInfo&, const string&, const string&, const string&, int);
void GetAvailableImages(PbResult& result, PbServerInfo&, const string&, int);
void GetAvailableImages(PbImageFilesInfo&, const string&, const string&, const string&, const string&, int);
void GetAvailableImages(PbResult& result, PbServerInfo&, const string&, const string&, int);
void CreateOperation(PbOperationInfo *, PbOperationMetaData *, const PbOperation&, const string&);
PbOperationParameter *AddOperationParameter(PbOperationMetaData *, const string&, const string&,
const string& = "", bool = false);

View File

@ -91,6 +91,23 @@ PbDeviceType ParseType(const char *optarg)
}
}
void SetPatternParams(PbCommand& command, const string& patterns)
{
string folder_pattern;
string file_pattern;
size_t separator_pos = patterns.find(COMPONENT_SEPARATOR);
if (separator_pos != string::npos) {
folder_pattern = patterns.substr(0, separator_pos);
file_pattern = patterns.substr(separator_pos + 1);
}
else {
file_pattern = patterns;
}
AddParam(command, "folder_pattern", folder_pattern);
AddParam(command, "file_pattern", file_pattern);
}
int main(int argc, char* argv[])
{
GOOGLE_PROTOBUF_VERIFY_VERSION;
@ -139,7 +156,7 @@ int main(int argc, char* argv[])
opterr = 1;
int opt;
while ((opt = getopt(argc, argv, "elmosvDINOTVXa:b:c:d:f:h:i:n:p:r:t:u:x:C:E:F:L:R:P::")) != -1) {
while ((opt = getopt(argc, argv, "e::lmos::vDINOTVXa:b:c:d:f:h:i:n:p:r:t:u:x:C:E:F:L:P::R:")) != -1) {
switch (opt) {
case 'i': {
int id;
@ -199,7 +216,10 @@ int main(int argc, char* argv[])
case 'e':
command.set_operation(DEFAULT_IMAGE_FILES_INFO);
break;
if (optarg) {
SetPatternParams(command, optarg);
}
break;
case 'F':
command.set_operation(DEFAULT_FOLDER);
@ -299,7 +319,10 @@ int main(int argc, char* argv[])
case 's':
command.set_operation(SERVER_INFO);
break;
if (optarg) {
SetPatternParams(command, optarg);
}
break;
case 'v':
cout << "rasctl version: " << rascsi_get_version_string() << endl;

View File

@ -127,10 +127,10 @@ void RasctlCommands::CommandReserveIds(const string& reserved_ids)
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));
size_t separator_pos = image_params.find(COMPONENT_SEPARATOR);
if (separator_pos != string::npos) {
AddParam(command, "file", image_params.substr(0, separator_pos));
AddParam(command, "size", image_params.substr(separator_pos + 1));
}
else {
cerr << "Error: Invalid file descriptor '" << image_params << "', format is NAME:SIZE" << endl;
@ -151,10 +151,10 @@ void RasctlCommands::CommandDeleteImage(const string& filename)
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));
size_t separator_pos = image_params.find(COMPONENT_SEPARATOR);
if (separator_pos != string::npos) {
AddParam(command, "from", image_params.substr(0, separator_pos));
AddParam(command, "to", image_params.substr(separator_pos + 1));
}
else {
cerr << "Error: Invalid file descriptor '" << image_params << "', format is CURRENT_NAME:NEW_NAME" << endl;
@ -166,10 +166,10 @@ void RasctlCommands::CommandRenameImage(const string& image_params)
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));
size_t separator_pos = image_params.find(COMPONENT_SEPARATOR);
if (separator_pos != string::npos) {
AddParam(command, "from", image_params.substr(0, separator_pos));
AddParam(command, "to", image_params.substr(separator_pos + 1));
}
else {
cerr << "Error: Invalid file descriptor '" << image_params << "', format is CURRENT_NAME:NEW_NAME" << endl;

View File

@ -230,6 +230,7 @@ void RasctlDisplay::DisplayImageFile(const PbImageFile& image_file_info)
void RasctlDisplay::DisplayImageFiles(const PbImageFilesInfo& image_files_info)
{
cout << "Default image file folder: " << image_files_info.default_image_folder() << endl;
cout << "Supported folder depth: " << image_files_info.depth() << endl;
if (image_files_info.image_files().empty()) {
cout << " No image files available" << endl;
@ -292,12 +293,12 @@ void RasctlDisplay::DisplayOperationInfo(const PbOperationInfo& operation_info)
}
}
cout << "Remote operations supported by rascsi and their parameters:" << endl;
cout << "Operations supported by rascsi server and their parameters:" << endl;
for (const auto& operation : sorted_operations) {
if (!operation.second.server_side_name().empty()) {
cout << " " << operation.first;
if (!operation.second.description().empty()) {
cout << " (" << operation.second.description().at("en") << ")";
cout << " (" << operation.second.description() << ")";
}
cout << endl;
@ -305,7 +306,7 @@ void RasctlDisplay::DisplayOperationInfo(const PbOperationInfo& operation_info)
cout << " " << parameter.name() << ": "
<< (parameter.is_mandatory() ? "mandatory" : "optional");
if (!parameter.description().empty()) {
cout << " (" << parameter.description().at("en") << ")";
cout << " (" << parameter.description() << ")";
}
cout << endl;

View File

@ -337,7 +337,8 @@ int main(int argc, char* argv[])
DWORD prev_sample = 0xFFFFFFFF;
DWORD this_sample = 0;
struct sched_param schparam;
timeval start_time, stop_time;
timeval start_time;
timeval stop_time;
uint64_t loop_count = 0;
timeval time_diff;
uint64_t elapsed_us;