Compare commits

...

8 commits

Author SHA1 Message Date
fca2564987 Merge branch 'feature/1-add-support-for-fs-crud' of code.apps.glenux.net:glenux/mfm into feature/1-add-support-for-fs-crud
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-11-26 16:33:26 +01:00
7dec0da91c feat: add scaffold for operations (command design pattern) 2023-11-26 16:32:57 +01:00
de8c777a3c feat: add base structure for commands 2023-11-26 16:32:57 +01:00
1ce05411e0 feat: add scaffold for operations (command design pattern) 2023-11-26 16:32:57 +01:00
9cce357dd0 Merge branch 'feature/1-add-support-for-fs-crud' of code.apps.glenux.net:glenux/mfm into feature/1-add-support-for-fs-crud
All checks were successful
continuous-integration/drone/pr Build is passing
continuous-integration/drone/push Build is passing
2023-11-26 16:05:17 +01:00
fb168d5308 feat: add base structure for commands 2023-11-26 16:05:01 +01:00
4730c77992 feat: add scaffold for operations (command design pattern) 2023-11-24 20:15:44 +01:00
1697750abd feat: add scaffold for operations (command design pattern)
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
2023-11-21 00:26:17 +01:00
31 changed files with 358 additions and 91 deletions

View file

@ -8,6 +8,8 @@ require "./config"
require "./fzf"
require "./version"
require "./operations"
module GX
class Cli
Log = ::Log.for("cli")
@ -149,8 +151,13 @@ module GX
return false
end
alias FsTuple = NamedTuple(
filesystem: Models::Filesystems::AbstractConfig,
ansi_name: String
)
def choose_filesystem()
names_display = {} of String => NamedTuple(filesystem: Models::AbstractFilesystemConfig, ansi_name: String)
names_display = {} of String => FsTuple
config_root = @config.root
return if config_root.nil?

View file

@ -26,7 +26,6 @@ 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?
@ -44,7 +43,7 @@ module GX
@auto_open = false
@mode = Mode::Mount
@filesystems = [] of Models::AbstractFilesystemConfig
@filesystems = [] of Models::Filesystems::AbstractConfig
@path = nil
@args = NoArgs
@ -62,10 +61,10 @@ module GX
possible_files.each do |file_path|
if File.exists?(file_path)
Log.info { "Configuration file found: #{file_path}" }
Log.info { "Configuration file found: #{file_path}" } if @verbose
return file_path if File.exists?(file_path)
else
Log.debug { "Configuration file not found: #{file_path}" }
Log.debug { "Configuration file not found: #{file_path}" } if @verbose
end
end

View file

@ -5,7 +5,8 @@
require "./models/root_config"
require "./models/global_config"
require "./models/gocryptfs_config"
require "./models/sshfs_config"
require "./models/httpdirfs_config"
require "./models/abstract_filesystem_config"
require "./models/filesystems/gocryptfs_config"
require "./models/filesystems/sshfs_config"
require "./models/filesystems/httpdirfs_config"
require "./models/filesystems/abstract_config"
require "./models/exceptions"

View file

@ -1,56 +0,0 @@
module GX::Models::Concerns
module Base
def mounted?() : Bool
mount_point_safe = @mount_point
raise InvalidMountpointError.new("Invalid mountpoint value") if mount_point_safe.nil?
`mount`.includes?(" on #{mount_point_safe} type ")
end
def umount() : Nil
mount_point_safe = @mount_point
raise InvalidMountpointError.new("Invalid mountpoint value") if mount_point_safe.nil?
system("fusermount -u #{mount_point_safe.shellescape}")
fusermount_status = $?
if fusermount_status.success?
puts "Models #{name} is now closed.".colorize(:green)
else
puts "Error: Unable to unmount filesystem #{name} (exit code: #{fusermount_status.exit_code}).".colorize(:red)
end
end
def mount_point?()
!mount_point.nil?
end
def mount()
_mount_wrapper() do
_mount_action
end
end
def _mount_wrapper(&block) : Nil
mount_point_safe = mount_point
return if mount_point_safe.nil?
Dir.mkdir_p(mount_point_safe) unless Dir.exists?(mount_point_safe)
if mounted?
puts "Already mounted. Skipping.".colorize(:yellow)
return
end
result_status = yield
if result_status.success?
puts "Models #{name} is now available on #{mount_point_safe}".colorize(:green)
else
puts "Error mounting the vault".colorize(:red)
return
end
end
end
end

15
src/models/exceptions.cr Normal file
View file

@ -0,0 +1,15 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2023 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2023 Glenn Y. Rolland <glenux@glenux.net>
require "yaml"
module GX::Models
class InvalidFilesystemError < Exception
end
class InvalidMountpointError < Exception
end
end

View file

@ -5,14 +5,8 @@
require "yaml"
module GX::Models
class InvalidFilesystemError < Exception
end
class InvalidMountpointError < Exception
end
abstract class AbstractFilesystemConfig
module GX::Models::Filesystems
abstract class AbstractConfig
include YAML::Serializable
# include YAML::Serializable::Strict

View file

@ -0,0 +1,14 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2023 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2023 Glenn Y. Rolland <glenux@glenux.net>
module GX::Models::Concerns
module Mount
def mount()
_mount_wrapper() do
_mount_action
end
end
end
end

View file

@ -0,0 +1,14 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2023 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2023 Glenn Y. Rolland <glenux@glenux.net>
module GX::Models::Concerns
module MountPoint
def mount_point?()
!mount_point.nil?
end
end
end

View file

@ -0,0 +1,29 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2023 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2023 Glenn Y. Rolland <glenux@glenux.net>
module GX::Models::Concerns
module MountWrapper
def _mount_wrapper(&block) : Nil
mount_point_safe = mount_point
return if mount_point_safe.nil?
Dir.mkdir_p(mount_point_safe) unless Dir.exists?(mount_point_safe)
if mounted?
puts "Already mounted. Skipping.".colorize(:yellow)
return
end
result_status = yield
if result_status.success?
puts "Models #{name} is now available on #{mount_point_safe}".colorize(:green)
else
puts "Error mounting the vault".colorize(:red)
return
end
end
end
end

View file

@ -0,0 +1,17 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2023 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2023 Glenn Y. Rolland <glenux@glenux.net>
module GX::Models::Concerns
module Mounted
def mounted?() : Bool
mount_point_safe = @mount_point
raise InvalidMountpointError.new("Invalid mountpoint value") if mount_point_safe.nil?
`mount`.includes?(" on #{mount_point_safe} type ")
end
end
end

View file

@ -0,0 +1,23 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2023 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2023 Glenn Y. Rolland <glenux@glenux.net>
module GX::Models::Concerns
module Umount
def umount() : Nil
mount_point_safe = @mount_point
raise InvalidMountpointError.new("Invalid mountpoint value") if mount_point_safe.nil?
system("fusermount -u #{mount_point_safe.shellescape}")
fusermount_status = $?
if fusermount_status.success?
puts "Models #{name} is now closed.".colorize(:green)
else
puts "Error: Unable to unmount filesystem #{name} (exit code: #{fusermount_status.exit_code}).".colorize(:red)
end
end
end
end

View file

@ -4,14 +4,22 @@
# Copyright © 2023 Glenn Y. Rolland <glenux@glenux.net>
require "shellwords"
require "./abstract_filesystem_config"
require "./concerns/base"
require "./abstract_config"
require "./concerns/mount_wrapper"
require "./concerns/mounted"
require "./concerns/mount"
require "./concerns/umount"
require "./concerns/mount_point"
module GX::Models
class GoCryptFSConfig < AbstractFilesystemConfig
module GX::Models::Filesystems
class GoCryptFSConfig < AbstractConfig
getter encrypted_path : String = ""
include Concerns::Base
include Concerns::Mount
include Concerns::Mounted
include Concerns::MountPoint
include Concerns::MountWrapper
include Concerns::Umount
def _mounted_prefix()
"#{encrypted_path}"

View file

@ -4,14 +4,23 @@
# Copyright © 2023 Glenn Y. Rolland <glenux@glenux.net>
require "shellwords"
require "./abstract_filesystem_config"
require "./concerns/base"
module GX::Models
class HttpDirFSConfig < AbstractFilesystemConfig
require "./abstract_config"
require "./concerns/mount_wrapper"
require "./concerns/mounted"
require "./concerns/mount"
require "./concerns/umount"
require "./concerns/mount_point"
module GX::Models::Filesystems
class HttpDirFSConfig < AbstractConfig
getter url : String = ""
include Concerns::Base
include Concerns::Mount
include Concerns::Mounted
include Concerns::MountPoint
include Concerns::MountWrapper
include Concerns::Umount
def _mounted_prefix()
"httpdirfs"

View file

@ -4,17 +4,25 @@
# Copyright © 2023 Glenn Y. Rolland <glenux@glenux.net>
require "shellwords"
require "./abstract_filesystem_config"
require "./concerns/base"
require "./abstract_config"
require "./concerns/mount_wrapper"
require "./concerns/mounted"
require "./concerns/mount"
require "./concerns/umount"
require "./concerns/mount_point"
module GX::Models
class SshFSConfig < AbstractFilesystemConfig
module GX::Models::Filesystems
class SshFSConfig < AbstractConfig
getter remote_path : String = ""
getter remote_user : String = ""
getter remote_host : String = ""
getter remote_port : String = "22"
include Concerns::Base
include Concerns::Mount
include Concerns::Mounted
include Concerns::MountPoint
include Concerns::MountWrapper
include Concerns::Umount
def _mounted_prefix()
"#{@remote_user}@#{@remote_host}:#{@remote_path}"

View file

@ -4,7 +4,7 @@
# Copyright © 2023 Glenn Y. Rolland <glenux@glenux.net>
require "yaml"
require "./abstract_filesystem_config"
require "./filesystems/abstract_config"
module GX::Models
class InvalidEnvironmentError < Exception

View file

@ -4,7 +4,7 @@
# Copyright © 2023 Glenn Y. Rolland <glenux@glenux.net>
require "yaml"
require "./abstract_filesystem_config"
require "./filesystems/abstract_config"
require "./global_config"
module GX::Models
@ -35,7 +35,7 @@ module GX::Models
getter global : GlobalConfig
@[YAML::Field(key: "filesystems")]
getter filesystems : Array(AbstractFilesystemConfig)
getter filesystems : Array(Filesystems::AbstractConfig)
end
end

2
src/operations.cr Normal file
View file

@ -0,0 +1,2 @@
require "./operations/*"

View file

@ -0,0 +1,8 @@
module GX
module Operations
abstract class AbstractCommand
abstract def execute()
end
end
end

View file

@ -0,0 +1,12 @@
require "./abstract_command"
module GX
module Operations
class FilesystemCreateCommand < AbstractCommand
def execute()
raise "Not Implemented"
end
end
end
end

View file

@ -0,0 +1,12 @@
require "./abstract_command"
module GX
module Operations
class FilesystemDeleteCommand < AbstractCommand
def execute()
raise "Not Implemented"
end
end
end
end

View file

@ -0,0 +1,12 @@
require "./abstract_command"
module GX
module Operations
class FilesystemEditCommand < AbstractCommand
def execute()
raise "Not Implemented"
end
end
end
end

View file

@ -0,0 +1,12 @@
require "./abstract_command"
module GX
module Operations
class FilesystemMountCommand < AbstractCommand
def execute()
raise "Not Implemented"
end
end
end
end

View file

@ -0,0 +1,12 @@
require "./abstract_command"
module GX
module Operations
class FilesystemUmountCommand < AbstractCommand
def execute()
raise "Not Implemented"
end
end
end
end

View file

@ -0,0 +1,14 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2023 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2023 Glenn Y. Rolland <glenux@glenux.net>
require "../abstract_command"
module GX::Operations::Filesystems
class CreateCommand < AbstractCommand
def execute()
raise NotImplementedError.new("CreateCommand is not Implemented")
end
end
end

View file

@ -0,0 +1,14 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2023 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2023 Glenn Y. Rolland <glenux@glenux.net>
require "../abstract_command"
module GX::Operations::Filesystems
class DeleteCommand < AbstractCommand
def execute()
raise NotImplementedError.new("DeleteCommand is not Implemented")
end
end
end

View file

@ -0,0 +1,14 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2023 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2023 Glenn Y. Rolland <glenux@glenux.net>
require "../abstract_command"
module GX::Operations::Filesystems
class EditCommand < AbstractCommand
def execute()
raise NotImplementedError.new("EditCommand is not Implemented")
end
end
end

View file

@ -0,0 +1,15 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2023 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2023 Glenn Y. Rolland <glenux@glenux.net>
require "../abstract_command"
module GX::Operations::Filesystems
class ListCommand < AbstractCommand
def execute()
raise NotImplementedError.new("ListCommand is not Implemented")
end
end
end

View file

@ -0,0 +1,14 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2023 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2023 Glenn Y. Rolland <glenux@glenux.net>
require "../abstract_command"
module GX::Operations::Filesystems
class MountCommand < AbstractCommand
def execute()
raise NotImplementedError.new("MountCommand is not Implemented")
end
end
end

View file

@ -0,0 +1,15 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2023 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2023 Glenn Y. Rolland <glenux@glenux.net>
require "../abstract_command"
module GX::Operations::Filesystems
class SelectCommand < AbstractCommand
def execute()
raise NotImplementedError.new("SelectCommand is not Implemented")
end
end
end

View file

@ -0,0 +1,14 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2023 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2023 Glenn Y. Rolland <glenux@glenux.net>
require "../abstract_command"
module GX::Operations::Filesystems
class UmountCommand < AbstractCommand
def execute()
raise NotImplementedError.new("UmountCommand is not Implemented")
end
end
end

View file

@ -0,0 +1,15 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# SPDX-FileCopyrightText: 2023 Glenn Y. Rolland <glenux@glenux.net>
# Copyright © 2023 Glenn Y. Rolland <glenux@glenux.net>
require "../abstract_command"
module GX::Operations::Global
class EditCommand < AbstractCommand
def execute()
raise NotImplementedError.new("EditCommand is not Implemented")
end
end
end