Compare commits

..

No commits in common. "a3d827bdb09f8c9677e07f7c808e2da0696cae76" and "ced3168471c0c3cc0edd63270ae373eadf456c44" have entirely different histories.

50 changed files with 108 additions and 541 deletions

View file

@ -11,7 +11,7 @@ prepare:
shards install
build:
shards build --progress --error-trace -Dpreview_mt
shards build --error-trace -Dpreview_mt
@echo SUCCESS
watch:
@ -21,9 +21,6 @@ spec: test
test:
crystal spec --error-trace
format:
crystal tool format
install:
install \
-m 755 \

5
Vagrantfile vendored
View file

@ -1,8 +1,3 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2024 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2024 Glenn Y. Rolland <glenux@glenux.net>
# frozen_string_literal: true
# -*- mode: ruby -*-

View file

@ -3,11 +3,5 @@ require "../../src/commands/mapping_create"
describe GX::Commands::MappingCreate do
context "Initialization" do
it "initializes with a mock FileSystemManager and RootConfig" do
config = GX::Config.new
root_config = GX::Models::RootConfig.new
command = GX::Commands::MappingCreate.new(config)
command.should be_a(GX::Commands::MappingCreate)
end
end
end

View file

@ -3,10 +3,5 @@ require "../../src/commands/mapping_edit"
describe GX::Commands::MappingEdit do
context "Initialization" do
it "initializes with a mock FileSystemManager" do
config = GX::Config.new
command = GX::Commands::MappingEdit.new(config)
command.should be_a(GX::Commands::MappingEdit)
end
end
end

View file

@ -1,108 +1,7 @@
require "../spec_helper"
require "../../src/commands/mapping_list"
require "../../src/models/gocryptfs_config"
require "../../src/models/sshfs_config"
require "../../src/models/httpdirfs_config"
describe GX::Commands::MappingList do
context "Initialization" do
it "initializes with a mock FileSystemManager and RootConfig" do
config = GX::Config.new
root_config = GX::Models::RootConfig.new
command = GX::Commands::MappingList.new(config)
command.should be_a(GX::Commands::MappingList)
end
end
context "Functioning" do
it "lists mappings when there are no filesystems" do
config = GX::Config.new
root_config = GX::Models::RootConfig.new
command = GX::Commands::MappingList.new(config)
output = capture_output do
command.execute
end
output.should include("TYPE")
output.should include("NAME")
output.should include("MOUNTED")
end
it "lists mappings when there are multiple filesystems" do
config = GX::Config.new
root_config = GX::Models::RootConfig.new
gocryptfs_config = GX::Models::GoCryptFSConfig.new(
GX::Parsers::Options::MappingCreateOptions.new(
type: "gocryptfs",
name: "test_gocryptfs",
encrypted_path: "/encrypted/path"
)
)
sshfs_config = GX::Models::SshFSConfig.new(
GX::Parsers::Options::MappingCreateOptions.new(
type: "sshfs",
name: "test_sshfs",
remote_user: "user",
remote_host: "host",
remote_path: "/remote/path"
)
)
httpdirfs_config = GX::Models::HttpDirFSConfig.new(
GX::Parsers::Options::MappingCreateOptions.new(
type: "httpdirfs",
name: "test_httpdirfs",
url: "http://example.com"
)
)
root_config.add_filesystem(gocryptfs_config)
root_config.add_filesystem(sshfs_config)
root_config.add_filesystem(httpdirfs_config)
command = GX::Commands::MappingList.new(config)
output = capture_output do
command.execute
end
output.should include("gocryptfs")
output.should include("test_gocryptfs")
output.should include("false")
output.should include("sshfs")
output.should include("test_sshfs")
output.should include("false")
output.should include("httpdirfs")
output.should include("test_httpdirfs")
output.should include("false")
end
it "ensures the output format is correct" do
config = GX::Config.new
root_config = GX::Models::RootConfig.new
config.instance_variable_set("@root", root_config)
gocryptfs_config = GX::Models::GoCryptFSConfig.new(
GX::Parsers::Options::MappingCreateOptions.new(
type: "gocryptfs",
name: "test_gocryptfs",
encrypted_path: "/encrypted/path"
)
)
root_config.add_filesystem(gocryptfs_config)
command = GX::Commands::MappingList.new(config)
output = capture_output do
command.execute
end
output.should match(/TYPE\s+NAME\s+MOUNTED/)
output.should match(/gocryptfs\s+test_gocryptfs\s+false/)
end
end
end

View file

@ -30,22 +30,13 @@ module GX
Parsers::RootParser.new.build(parser, breadcrumbs, @config)
end
pparser.parse(args)
rescue e : OptionParser::MissingOption
STDERR.puts "ERROR: #{e.message}".colorize(:red)
exit(1)
end
def run
command = CommandFactory.create_command(@config, @config.mode)
abort("ERROR: unknown command for mode #{@config.mode}") if command.nil?
command.execute
rescue e : ArgumentError
STDERR.puts "ERROR: #{e.message}".colorize(:red)
exit(1)
rescue e : Exception
STDERR.puts "ERROR: #{e.message}".colorize(:red)
exit(1)
command.try &.execute
end
end
end

View file

@ -1,8 +1,3 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2024 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2024 Glenn Y. Rolland <glenux@glenux.net>
require "./commands"
module GX

View file

@ -1,6 +1 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2024 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2024 Glenn Y. Rolland <glenux@glenux.net>
require "./commands/*"

View file

@ -1,8 +1,3 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2024 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2024 Glenn Y. Rolland <glenux@glenux.net>
require "../config"
module GX::Commands

View file

@ -1,8 +1,3 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2024 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2024 Glenn Y. Rolland <glenux@glenux.net>
require "./abstract_command"
require "../file_storage"
@ -18,7 +13,7 @@ module GX::Commands
# Override the configuration path if provided
puts "Configuration file path: #{config_file_path}"
puts "Configuration file path: #{@config.path}"
# pp @config
pp @config
@config.path.try do |path|
config_file_path = path
config_dir = File.dirname(path)

View file

@ -1,8 +1,3 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2024 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2024 Glenn Y. Rolland <glenux@glenux.net>
require "./abstract_command"
module GX::Commands

View file

@ -1,8 +1,3 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2024 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2024 Glenn Y. Rolland <glenux@glenux.net>
require "./abstract_command"
module GX::Commands

View file

@ -1,8 +1,3 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2024 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2024 Glenn Y. Rolland <glenux@glenux.net>
require "./abstract_command"
module GX::Commands

View file

@ -1,25 +1,21 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2024 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2024 Glenn Y. Rolland <glenux@glenux.net>
require "./abstract_command"
require "../file_system_manager"
module GX::Commands
class GlobalTui < AbstractCommand
# @file_system_manager : FileSystemManager
@file_system_manager : FileSystemManager
def initialize(@config : GX::Config)
@config.load_from_env
@config.load_from_file
# @file_system_manager = FileSystemManager.new(@config)
@file_system_manager = FileSystemManager.new(@config)
end
def execute
# raise Models::InvalidFilesystemError.new("Invalid filesystem") if filesystem.nil?
# @file_system_manager.mount_or_umount(filesystem)
# @file_system_manager.auto_open(filesystem) if filesystem.mounted? && @config.auto_open?
filesystem = @file_system_manager.choose_filesystem
raise Models::InvalidFilesystemError.new("Invalid filesystem") if filesystem.nil?
@file_system_manager.mount_or_umount(filesystem)
@file_system_manager.auto_open(filesystem) if filesystem.mounted? && @config.auto_open
end
def self.handles_mode

View file

@ -1,14 +1,9 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2024 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2024 Glenn Y. Rolland <glenux@glenux.net>
require "./abstract_command"
require "../config"
module GX::Commands
class GlobalVersion < AbstractCommand
def initialize(config : GX::Config)
def initialize(config : GX::Config) # FIXME
end
def execute

View file

@ -1,57 +1,58 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2024 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2024 Glenn Y. Rolland <glenux@glenux.net>
require "./abstract_command"
require "../models/filesystem_factory"
module GX::Commands
class MappingCreate < AbstractCommand
def initialize(@config : GX::Config)
def initialize(@config : GX::Config) # FIXME
@config.load_from_env
@config.load_from_file
@config.save_to_file
end
def execute
# Assuming mapping_create_options is passed to this command with necessary details
create_options = @config.mapping_create_options
# FIXME: verify that filesystem is valid or return an error
# Assuming create_args is passed to this command with necessary details
create_args = @config.create_args
# Validate required arguments
if create_options.nil?
raise ArgumentError.new("Mapping create options are required")
end
if create_options.name.nil? || create_options.name.try &.empty?
raise ArgumentError.new("Name is required to create a mapping.")
end
if create_options.type.nil? || create_options.type.try &.empty?
raise ArgumentError.new("Type is required to create a mapping.")
if create_args[:name].empty? || create_args[:path].empty?
raise ArgumentError.new("Name and path are required to create a mapping.")
end
# Create the appropriate filesystem config based on the type
filesystem_config = GX::Models::FilesystemFactory.build(create_options)
# Append the new filesystem config to the root config
@config.root.try do |root|
root.filesystems ||= [] of GX::Models::AbstractFilesystemConfig
root.filesystems << filesystem_config
filesystem_config = case create_args[:type]
when "gocryptfs"
GX::Models::GocryptfsConfig.new(
name: create_args[:name],
path: create_args[:path],
encrypted_path: create_args[:encrypted_path]
)
when "sshfs"
GX::Models::SshfsConfig.new(
name: create_args[:name],
path: create_args[:path],
remote_user: create_args[:remote_user],
remote_host: create_args[:remote_host],
remote_path: create_args[:remote_path],
remote_port: create_args[:remote_port]
)
when "httpdirfs"
GX::Models::HttpdirfsConfig.new(
name: create_args[:name],
path: create_args[:path],
url: create_args[:url]
)
else
raise ArgumentError.new("Unsupported mapping type: #{create_args[:type]}")
end
puts "Mapping '#{create_options.name}' created and added to configuration successfully."
# Append the new filesystem config to the root config
@config.root.try &.filesystems << filesystem_config
puts "Mapping '#{create_args[:name]}' created and added to configuration successfully."
end
def self.handles_mode
GX::Types::Mode::MappingCreate
end
# validate create_options.PARAMETER and display error with description if
# missing
macro option_check(create_options, parameter, description)
if create_options.{{ parameter.id }}.nil? || create_options.{{ parameter.id }}.try &.empty?
raise ArgumentError.new("Parameter for " + {{description}} + " is required")
end
end
end
end

View file

@ -1,17 +1,12 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2024 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2024 Glenn Y. Rolland <glenux@glenux.net>
require "./abstract_command"
module GX::Commands
class MappingDelete < AbstractCommand
def initialize(config : GX::Config)
def initialize(config : GX::Config) # FIXME
end
def execute
# TODO: implement
# FIXME: implement
end
def self.handles_mode

View file

@ -1,17 +1,12 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2024 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2024 Glenn Y. Rolland <glenux@glenux.net>
require "./abstract_command"
module GX::Commands
class MappingEdit < AbstractCommand
def initialize(config : GX::Config)
def initialize(config : GX::Config) # FIXME
end
def execute
# TODO: implement
# FIXME: implement
end
def self.handles_mode

View file

@ -1,8 +1,3 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2024 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2024 Glenn Y. Rolland <glenux@glenux.net>
require "./abstract_command"
require "../file_system_manager"
require "tablo"
@ -12,6 +7,7 @@ module GX::Commands
def initialize(@config : GX::Config)
@config.load_from_env
@config.load_from_file
@file_system_manager = FileSystemManager.new(@config)
end
def execute

View file

@ -1,39 +1,25 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2024 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2024 Glenn Y. Rolland <glenux@glenux.net>
require "./abstract_command"
require "../file_system_manager"
module GX::Commands
class MappingMount < AbstractCommand
# @file_system_manager : FileSystemManager
@file_system_manager : FileSystemManager
def initialize(@config : GX::Config)
@config.load_from_env
@config.load_from_file
@file_system_manager = FileSystemManager.new(@config)
end
def execute
# filesystem = @config.root.try &.file_system_manager.choose_filesystem
# raise Models::InvalidFilesystemError.new("Invalid filesystem") if filesystem.nil?
# filesystem.mount
# @file_system_manager.auto_open(filesystem) if filesystem.mounted? && @config.auto_open?
filesystem = @file_system_manager.choose_filesystem
raise Models::InvalidFilesystemError.new("Invalid filesystem") if filesystem.nil?
filesystem.mount
@file_system_manager.auto_open(filesystem) if filesystem.mounted? && @config.auto_open
end
def self.handles_mode
GX::Types::Mode::MappingMount
end
private def _mount_filesystem(filesystem : Models::AbstractFilesystemConfig)
raise Models::InvalidFilesystemError.new("Invalid filesystem") if filesystem.nil?
if filesystem.mounted?
Log.info { "Filesystem already mounted." }
return
end
filesystem.mount
end
end
end

View file

@ -1,40 +1,24 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2024 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2024 Glenn Y. Rolland <glenux@glenux.net>
require "./abstract_command"
require "../file_system_manager"
module GX::Commands
class MappingUmount < AbstractCommand
@file_system_manager : FileSystemManager
def initialize(@config : GX::Config)
@config.load_from_env
@config.load_from_file
@file_system_manager = FileSystemManager.new(@config)
end
def execute
# root = @config.root
# raise "Missing root config" if root.nil?
# filesystem = root.file_system_manager.choose_filesystem
# raise Models::InvalidFilesystemError.new("Invalid filesystem") if filesystem.nil?
# filesystem.umount
filesystem = @file_system_manager.choose_filesystem
raise Models::InvalidFilesystemError.new("Invalid filesystem") if filesystem.nil?
filesystem.umount
end
def self.handles_mode
GX::Types::Mode::MappingUmount
end
# OBSOLETE:
private def umount_filesystem(filesystem : Models::AbstractFilesystemConfig)
raise Models::InvalidFilesystemError.new("Invalid filesystem") if filesystem.nil?
unless filesystem.mounted?
Log.info { "Filesystem is not mounted." }
return
end
filesystem.umount
end
end
end

View file

@ -27,20 +27,20 @@ module GX
record AddArgs, name : String, path : String
record DelArgs, name : String
# getter filesystems : Array(Models::AbstractFilesystemConfig)
getter home_dir : String
getter root : Models::RootConfig?
property? verbose : Bool
property verbose : Bool
property mode : Types::Mode
property path : String?
property args : AddArgs.class | DelArgs.class | NoArgs.class
property? auto_open : Bool
property auto_open : Bool
# TODO: refactor and remove these parts from here
# FIXME: refactor and remove these parts from here
property help_options : Parsers::Options::HelpOptions?
property config_init_options : Parsers::Options::ConfigInitOptions?
property config_options : Parsers::Options::ConfigOptions?
property help_options : Parsers::Options::HelpOptions?
property mapping_create_options : Parsers::Options::MappingCreateOptions?
property mapping_create_options : Parsers::Options::MappingCreateOptions?
def initialize
@ -102,12 +102,7 @@ module GX
file_data = File.read(config_path)
file_patched = Crinja.render(file_data, {"env" => ENV.to_h})
begin
root = Models::RootConfig.from_yaml(file_patched)
rescue ex : YAML::ParseException
STDERR.puts "Error parsing configuration file: #{ex.message}".colorize(:red)
exit(1)
end
root = Models::RootConfig.from_yaml(file_patched)
mount_point_base_safe = root.global.mount_point_base
raise Models::InvalidMountpointError.new("Invalid global mount point") if mount_point_base_safe.nil?
@ -120,15 +115,5 @@ module GX
end
@root = root
end
def save_to_file
return if @path.nil?
if @path
File.write(@path.to_s, @root.to_yaml)
else
Log.error { "Configuration path is nil, cannot save configuration." }
end
Log.info { "Configuration saved to #{@path}" }
end
end
end

View file

@ -1,8 +1,3 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2024 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2024 Glenn Y. Rolland <glenux@glenux.net>
require "baked_file_system"
class FileStorage
@ -10,3 +5,4 @@ class FileStorage
bake_folder "../static"
end

View file

@ -1,8 +1,3 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2024 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2024 Glenn Y. Rolland <glenux@glenux.net>
# require "./models/abstract_filesystem_config"
require "./utils/fzf"
@ -13,6 +8,25 @@ module GX
def initialize(@config : Config)
end
# OBSOLETE:
# def mount_filesystem(filesystem : Models::AbstractFilesystemConfig)
# raise Models::InvalidFilesystemError.new("Invalid filesystem") if filesystem.nil?
# if filesystem.mounted?
# Log.info { "Filesystem already mounted." }
# return
# end
# filesystem.mount
# end
# OBSOLETE:
# def umount_filesystem(filesystem : Models::AbstractFilesystemConfig)
# raise Models::InvalidFilesystemError.new("Invalid filesystem") if filesystem.nil?
# unless filesystem.mounted?
# Log.info { "Filesystem is not mounted." }
# return
# end
# filesystem.umount
# end
def mount_or_umount(selected_filesystem)
if !selected_filesystem.mounted?
@ -23,10 +37,10 @@ module GX
end
def auto_open(filesystem)
# TODO: detect xdg-open and use it if possible
# TODO: detect mailcap and use it if no xdg-open found
# TODO: support user-defined command in configuration
# TODO: detect graphical environment
# FIXME: detect xdg-open and use it if possible
# FIXME: detect mailcap and use it if no xdg-open found
# FIXME: support user-defined command in configuration
# FIXME: detect graphical environment
mount_point_safe = filesystem.mount_point
raise Models::InvalidMountpointError.new("Invalid filesystem") if mount_point_safe.nil?
@ -92,7 +106,7 @@ module GX
}
end
# FIXME: feat: allow to sort by name or by filesystem
# # FIXME: feat: allow to sort by name or by filesystem
sorted_values = names_display.values.sort_by!(&.[:filesystem].name)
result_filesystem_name = Utils::Fzf.run(sorted_values.map(&.[:ansi_name])).strip
selected_filesystem = names_display[result_filesystem_name][:filesystem]

View file

@ -15,15 +15,6 @@ module GX::Models
abstract class AbstractFilesystemConfig
include YAML::Serializable
# include YAML::Serializable::Strict
@@subs = [] of AbstractFilesystemConfig.class
macro inherited
@@subs << {{@type.name.id}}
end
def self.subs
@@subs
end
use_yaml_discriminator "type", {
gocryptfs: GoCryptFSConfig,

View file

@ -1,8 +1,3 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2024 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2024 Glenn Y. Rolland <glenux@glenux.net>
module GX::Models::Concerns
module Base
def mounted? : Bool

View file

@ -1,21 +0,0 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2024 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2024 Glenn Y. Rolland <glenux@glenux.net>
module GX::Models
class FilesystemFactory
def self.build(create_options)
case create_options.type
when "gocryptfs"
GoCryptFSConfig.new(create_options)
when "sshfs"
SshFSConfig.new(create_options)
when "httpdirfs"
HttpDirFSConfig.new(create_options)
else
raise ArgumentError.new("Unsupported mapping type: #{create_options.type}")
end
end
end
end

View file

@ -13,11 +13,6 @@ module GX::Models
include Concerns::Base
def initialize(create_options)
@name = create_options.name.as(String)
@encrypted_path = create_options.encrypted_path.as(String)
end
def _mounted_prefix
"#{encrypted_path}"
end
@ -39,6 +34,5 @@ module GX::Models
)
process.wait
end
def self.name ; "gocryptfs" ; end
end
end

View file

@ -13,11 +13,6 @@ module GX::Models
include Concerns::Base
def initialize(create_options)
@name = create_options.name.as(String)
@url = create_options.url.as(String)
end
def _mounted_prefix
"httpdirfs"
end
@ -39,6 +34,5 @@ module GX::Models
)
process.wait
end
def self.name ; "httpdirfs" ; end
end
end

View file

@ -36,12 +36,5 @@ module GX::Models
@[YAML::Field(key: "filesystems")]
getter filesystems : Array(AbstractFilesystemConfig)
setter filesystems
def initialize(version = "1.0.0", global = GlobalConfig.new, filesystems = [] of AbstractFilesystemConfig)
@version = version
@global = global
@filesystems = filesystems
end
end
end

View file

@ -16,14 +16,6 @@ module GX::Models
include Concerns::Base
def initialize(create_options)
@name = create_options.name.as(String)
@remote_user = create_options.remote_user.as(String)
@remote_host = create_options.remote_host.as(String)
@remote_path = create_options.remote_path.as(String)
@remote_port = create_options.remote_port.as(String)
end
def _mounted_prefix
"#{@remote_user}@#{@remote_host}:#{@remote_path}"
end
@ -49,6 +41,5 @@ module GX::Models
)
process.wait
end
def self.name ; "sshfs" ; end
end
end

View file

@ -1,8 +1,3 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2024 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2024 Glenn Y. Rolland <glenux@glenux.net>
module GX::Parsers
abstract class AbstractParser
abstract def build(parser : OptionParser, ancestors : BreadCrumbs, config : Config)

View file

@ -1,8 +1,3 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2024 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2024 Glenn Y. Rolland <glenux@glenux.net>
require "./base.cr"
module GX::Parsers

View file

@ -1,8 +1,3 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2024 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2024 Glenn Y. Rolland <glenux@glenux.net>
require "./options/config_options"
require "./options/config_init_options"
require "./base"

View file

@ -1,8 +1,3 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2024 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2024 Glenn Y. Rolland <glenux@glenux.net>
require "./base.cr"
require "../utils/parser_lines"
@ -10,6 +5,7 @@ module GX::Parsers
class MappingParser < AbstractParser
def build(parser, ancestors, config)
breadcrumbs = ancestors + "mapping"
create_args = {name: "", path: ""}
delete_args = {name: ""}
mount_args = {name: ""}
umount_args = {name: ""}
@ -28,53 +24,35 @@ module GX::Parsers
parser.on("create", "Create mapping") do
config.mode = Types::Mode::MappingCreate
config.mode = Types::Mode::MappingCreate
config.mapping_create_options = Parsers::Options::MappingCreateOptions.new
# pp parser
parser.banner = Utils.usage_line(breadcrumbs + "create", "Create mapping", true)
parser.separator("\nCreate options")
parser.on("-t", "--type TYPE", "Set filesystem type") do |type|
config.mapping_create_options.try do |opts|
opts.type = type
end
create_args = create_args.merge({type: type})
end
parser.on("-n", "--name NAME", "Set mapping name") do |name|
config.mapping_create_options.try do |opts|
opts.name = name
end
parser.on("-n", "--name", "Set mapping name") do |name|
create_args = create_args.merge({name: name})
end
# Filesystem specific
parser.on("--encrypted-path PATH", "Set encrypted path (for gocryptfs)") do |path|
config.mapping_create_options.try do |opts|
opts.encrypted_path = path
end
create_args = create_args.merge({encrypted_path: path})
end
parser.on("--remote-user USER", "Set SSH user (for sshfs)") do |user|
config.mapping_create_options.try do |opts|
opts.remote_user = user
end
create_args = create_args.merge({remote_user: user})
end
parser.on("--remote-host HOST", "Set SSH host (for sshfs)") do |host|
config.mapping_create_options.try do |opts|
opts.remote_host = host
end
create_args = create_args.merge({remote_host: host})
end
parser.on("--source-path PATH", "Set remote path (for sshfs)") do |path|
config.mapping_create_options.try do |opts|
opts.remote_path = path
end
create_args = create_args.merge({remote_path: path})
end
parser.on("--remote-port PORT", "Set SSH port (for sshfs)") do |port|
config.mapping_create_options.try do |opts|
opts.remote_port = port
end
create_args = create_args.merge({remote_port: port})
end
parser.on("--url URL", "Set URL (for httpdirfs)") do |url|
config.mapping_create_options.try do |opts|
opts.url = url
end
create_args = create_args.merge({url: url})
end
parser.separator(Utils.help_line(breadcrumbs + "create"))
@ -84,19 +62,13 @@ module GX::Parsers
config.mode = Types::Mode::MappingEdit
parser.on("--remote-user USER", "Set SSH user") do |user|
config.mapping_create_options.try do |opts|
opts.remote_user = user
end
create_args = create_args.merge({remote_user: user})
end
parser.on("--remote-host HOST", "Set SSH host") do |host|
config.mapping_create_options.try do |opts|
opts.remote_host = host
end
create_args = create_args.merge({remote_host: host})
end
parser.on("--source-path PATH", "Set remote path") do |path|
config.mapping_create_options.try do |opts|
opts.remote_path = path
end
create_args = create_args.merge({remote_path: path})
end
parser.separator(Utils.help_line(breadcrumbs + "edit"))

View file

@ -1,8 +1,3 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2024 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2024 Glenn Y. Rolland <glenux@glenux.net>
require "option_parser"
module GX::Parsers::Options

View file

@ -1,8 +1,3 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2024 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2024 Glenn Y. Rolland <glenux@glenux.net>
require "option_parser"
module GX::Parsers::Options

View file

@ -1,8 +1,3 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2024 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2024 Glenn Y. Rolland <glenux@glenux.net>
require "option_parser"
module GX::Parsers::Options

View file

@ -1,19 +0,0 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2024 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2024 Glenn Y. Rolland <glenux@glenux.net>
require "option_parser"
module GX::Parsers::Options
class MappingCreateOptions
property type : String?
property name : String?
property encrypted_path : String?
property remote_user : String?
property remote_host : String?
property remote_path : String?
property remote_port : String?
property url : String?
end
end

View file

@ -1,12 +0,0 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2024 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2024 Glenn Y. Rolland <glenux@glenux.net>
require "option_parser"
module GX::Parsers::Options
class MappingDeleteOptions
# Add your options here
end
end

View file

@ -1,12 +0,0 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2024 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2024 Glenn Y. Rolland <glenux@glenux.net>
require "option_parser"
module GX::Parsers::Options
class MappingMountOptions
# Add your options here
end
end

View file

@ -1,12 +0,0 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2024 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2024 Glenn Y. Rolland <glenux@glenux.net>
require "option_parser"
module GX::Parsers::Options
class MappingUmountOptions
# Add your options here
end
end

View file

@ -1,8 +1,3 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2024 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2024 Glenn Y. Rolland <glenux@glenux.net>
require "./base"
require "./config_parser"
require "./mapping_parser"

View file

@ -1,8 +1,3 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2024 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2024 Glenn Y. Rolland <glenux@glenux.net>
module GX::Types
enum Mode
None

View file

@ -1,8 +1,3 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2024 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2024 Glenn Y. Rolland <glenux@glenux.net>
module GX::Utils
class BreadCrumbs
def initialize(base : Array(String))

View file

@ -28,8 +28,7 @@ module GX::Utils
exit(1)
end
# result
output.to_s.strip
result = output.to_s.strip # .split.first?
end
end
end

View file

@ -1,8 +1,3 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2024 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2024 Glenn Y. Rolland <glenux@glenux.net>
require "./breadcrumbs"
module GX::Utils

View file

@ -1,8 +1,3 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2024 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2024 Glenn Y. Rolland <glenux@glenux.net>
require "version_from_shard"
module GX

View file

@ -1,8 +1,4 @@
#!/bin/bash
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2024 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2024 Glenn Y. Rolland <glenux@glenux.net>
# mfm Bash completion script

View file

@ -1,6 +0,0 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2024 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2024 Glenn Y. Rolland <glenux@glenux.net>