From f6d90e96f3dbc7c35536ed9d25bafa842c312389 Mon Sep 17 00:00:00 2001 From: "Glenn Y. Rolland" Date: Wed, 12 Aug 2015 09:29:59 +0200 Subject: [PATCH] Added map validations. --- lib/qasim.rb | 8 ++++---- lib/qasim/map.rb | 20 ++++++++++++++++++-- lib/qasim/map/generic.rb | 28 ++++++++++++++++++++++++++-- lib/qasim/map/ssh.rb | 37 +++++++++++++------------------------ lib/qasim/map/webdav.rb | 6 +++++- spec/map_spec.rb | 29 +++++++++++++++++++++++++++-- 6 files changed, 93 insertions(+), 35 deletions(-) diff --git a/lib/qasim.rb b/lib/qasim.rb index 0cf93e1..94b655b 100644 --- a/lib/qasim.rb +++ b/lib/qasim.rb @@ -2,9 +2,9 @@ require 'qasim/constants' module Qasim - autoload :Config, 'qasim/config' - autoload :Map, 'qasim/map' - autoload :Ui, 'qasim/ui' - autoload :Cli, 'qasim/cli' + autoload :Config, 'qasim/config' + autoload :Map, 'qasim/map' + autoload :Ui, 'qasim/ui' + autoload :Cli, 'qasim/cli' end diff --git a/lib/qasim/map.rb b/lib/qasim/map.rb index 89bba56..be0b7a5 100644 --- a/lib/qasim/map.rb +++ b/lib/qasim/map.rb @@ -1,12 +1,24 @@ require 'fileutils' require 'qasim/map/generic' +require 'qasim/map/ssh' +require 'qasim/map/webdav' module Qasim ; module Map class ParseError < RuntimeError ; end class ConnectError < RuntimeError ; end + def class_for type + plugin = nil + ObjectSpace.each_object(Class) do |cls| + if cls < Qasim::Map::Generic then + plugin = cls if cls.handles.include? type.to_sym + end + end + plugin + end + # # replace magic values withing map lines # @@ -42,7 +54,9 @@ module Qasim ; module Map # Load description from file and create a Map object # def from_file appcfg, filename - config = {} + config = { + type: :ssh # for config V1, we assume SSHFS + } map = nil f = File.open filename @@ -93,6 +107,8 @@ module Qasim ; module Map f.puts "REMOTE_CYPHER=%s" % @cypher end end - module_function :from_file, :env_substitute + module_function :from_file, + :env_substitute, + :class_for end ; end diff --git a/lib/qasim/map/generic.rb b/lib/qasim/map/generic.rb index 21fbdf7..13a24af 100644 --- a/lib/qasim/map/generic.rb +++ b/lib/qasim/map/generic.rb @@ -1,11 +1,10 @@ require 'fileutils' -require 'qasim/map' module Qasim ; module Map end ; end class Qasim::Map::Generic - def initialize config + def initialize params end @@ -14,6 +13,7 @@ class Qasim::Map::Generic # Format : # Hash of (name:Symbol * [value:Object, optional:Boolean]) + def self.parameters { map_name: [nil , true], @@ -22,4 +22,28 @@ class Qasim::Map::Generic } end + # + # Test map liveness (connected & working) + # + def alive? + end + + # + # Test map + # + def mounted? + end + + # + # Mount + # + def mount + end + + # + # Umount + # + def umount + end + end diff --git a/lib/qasim/map/ssh.rb b/lib/qasim/map/ssh.rb index bd5c9e9..2dd64be 100644 --- a/lib/qasim/map/ssh.rb +++ b/lib/qasim/map/ssh.rb @@ -12,13 +12,20 @@ class Qasim::Map::Ssh < Qasim::Map::Generic :name CYPHER_ARCFOUR = :arcfour - CYPHER_AES256CBC = "aes-256-cbc".to_sym - CYPHERS = [ CYPHER_ARCFOUR, CYPHER_AES256CBC ] + CYPHER_AES256CBC = :"aes-256-cbc" + CYPHERS = [ + CYPHER_ARCFOUR, + CYPHER_AES256CBC + ] def self.parameters super end + def self.handles + [ :ssh, :sshfs ] + end + # # Set defaults properties for maps # @@ -37,21 +44,11 @@ class Qasim::Map::Ssh < Qasim::Map::Generic self.load @path end - # - # Test map liveness (how ?) - # FIXME: not implemented - # - def online? - #rdebug "testing online? %s " % self.inspect - #FIXME: test liveness - end - - # # Test if map is connected / mounted # - def connected? + def mounted? f = File.open("/proc/mounts") sshfs_mounted = (f.readlines.select do |line| line =~ /\s+fuse.sshfs\s+/ @@ -79,14 +76,7 @@ class Qasim::Map::Ssh < Qasim::Map::Generic # # Connect map # - def connect &block - puts "[#{File.basename @path}] Connecting..." - puts " #{@user}@#{@host}:#{@port}" - #puts " links = %s" % @links.map{ |k,v| "%s => %s" % [ k, v ] }.join(', ') - # do something - # test server connection - # mount - # + def mount &block # FIXME: test connexion with Net::SSH + timeout or ask password @links.each do |name, remotepath| localpath = File.join ENV['HOME'], "mnt", name @@ -111,7 +101,6 @@ class Qasim::Map::Ssh < Qasim::Map::Generic "-o","Port=%s" % @port, "%s@%s:%s" % [@user,@host,remotepath], localpath ] - #rdebug "command: %s" % [ cmd, cmd_args ].flatten.join(' ') if block_given? then yield name, cmd, cmd_args else @@ -127,8 +116,7 @@ class Qasim::Map::Ssh < Qasim::Map::Generic # # Disconnect map # - def disconnect &block - puts "Disconnecting map #{@path}" + def umount &block @links.each do |name, remotepath| localpath = File.join ENV['HOME'], "mnt", name cmd = "fusermount" @@ -148,3 +136,4 @@ class Qasim::Map::Ssh < Qasim::Map::Generic end end end + diff --git a/lib/qasim/map/webdav.rb b/lib/qasim/map/webdav.rb index 59825fb..d7ff755 100644 --- a/lib/qasim/map/webdav.rb +++ b/lib/qasim/map/webdav.rb @@ -6,7 +6,7 @@ class Qasim::Map::Webdav < Qasim::Map::Generic def initialize end - def requirements + def self.parameters req = super req << :webdav_user # ex: foo req << :webdav_password # ex: bar @@ -14,5 +14,9 @@ class Qasim::Map::Webdav < Qasim::Map::Generic req << :webdav_protocol # ex: http, https req end + + def self.handles + [ :webdav, :fusedav ] + end end diff --git a/spec/map_spec.rb b/spec/map_spec.rb index a4aedd2..6cdbdf0 100644 --- a/spec/map_spec.rb +++ b/spec/map_spec.rb @@ -1,9 +1,17 @@ require_relative 'spec_helper' +require 'minitest/spec' require 'qasim/map' +require 'securerandom' + +class Qasim::Map::Fake < Qasim::Map::Generic + def self.handles + [:fake] + end +end describe Qasim::Map do - describe 'env_substitute' do + describe 'env_substitute' do# {{{ it "returns a normal string unchanged" do str = "5cb0c49325df2d526116ef7b49eb7329" assert_equal Qasim::Map.env_substitute(str), str @@ -35,10 +43,27 @@ describe Qasim::Map do ref = "SOMETHING = OK" assert_equal ref, Qasim::Map.env_substitute(str) end + end# }}} + + describe 'class_for' do + it 'must return a class for given type' do + expected = Qasim::Map::Fake + result = Qasim::Map.class_for 'fake' + + assert_equal expected, result + end + + it 'must return nil when no type found' do + random_string = SecureRandom.hex + expected = nil + result = Qasim::Map.class_for random_string + + assert_equal expected, result + end end - describe 'from_file' do + end end