shu-san-scripts 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -13,6 +13,12 @@ source "http://rubygems.org"
13
13
  # Command Line Interface Library
14
14
  gem "cri", "~> 2.0.2"
15
15
 
16
+ # Library extensions
17
+ gem "facets", ">= 2.4"
18
+
19
+ # GUID library
20
+ gem "uuidtools", "~> 2.1.2"
21
+
16
22
  ###
17
23
  ### Development Gems. All _additional_ gems required by development (as opposed to
18
24
  ### production environments). If it is required at run-time, it
data/Gemfile.lock CHANGED
@@ -14,6 +14,7 @@ GEM
14
14
  riot (0.12.5)
15
15
  rr
16
16
  rr (1.0.4)
17
+ uuidtools (2.1.2)
17
18
  vclog (1.8.1)
18
19
  ansi (>= 1.2)
19
20
  facets (>= 2.4)
@@ -25,8 +26,10 @@ PLATFORMS
25
26
  DEPENDENCIES
26
27
  bundler (~> 1.0.0)
27
28
  cri (~> 2.0.2)
29
+ facets (>= 2.4)
28
30
  jeweler (~> 1.6.0)
29
31
  minitest
30
32
  riot
33
+ uuidtools (~> 2.1.2)
31
34
  vclog (~> 1.8.1)
32
35
  yard (~> 0.6.0)
data/HISTORY CHANGED
@@ -17,13 +17,25 @@ Changes:
17
17
  * Version bump to 0.0.2. Added infrastructure needed for minimally working version
18
18
 
19
19
 
20
- HEAD / 2011-09-24
20
+ HEAD / 2011-09-25
21
21
 
22
22
  Current Development (David Love)
23
23
 
24
24
  Changes:
25
25
 
26
- * 1 General Enhancements
26
+ * 3 General Enhancements
27
27
 
28
+ * Version bump to 0.0.3
29
+ * Regenerate gemspec for version 0.0.2
28
30
  * Regenerate gemspec for version 0.0.2
29
31
 
32
+ * 1 Bug Fixes
33
+
34
+ * Format options as well as the text description
35
+
36
+ * 3 Patch Enhancements
37
+
38
+ * Add ability to generate the correct ZFS commands. Don't actually act on them yet
39
+ * Added support for sequential UUID's
40
+ * Require the Facets library in the main gem as well
41
+
data/README.rdoc CHANGED
@@ -1,6 +1,6 @@
1
1
  = SHU SAN Scripts
2
2
 
3
- Together these scripts define a ''store'' command, used to simplify the
3
+ Together these scripts define a +store+ command, used to simplify the
4
4
  task of creating iSCSI targets on OpenSolaris (Solaris > 11) based
5
5
  hosts. It has been tested on Nexenta NCP and Open Indiana, but with some
6
6
  modification it could be made to work on FreeBSD as well.
@@ -25,16 +25,16 @@ available can be obtained by
25
25
 
26
26
  once everything has been installed.
27
27
 
28
- **Note:** The scripts assume they are running (or at least have access to)
29
- the ''root'' user role, as they will manipulate your ZFS volumes. You
28
+ *Note:* The scripts assume they are running (or at least have access to)
29
+ the +root+ user role, as they will manipulate your ZFS volumes. You
30
30
  can either install them with the appropriate privileges, or install the
31
- ''sudo'' command to make life easier. With ''sudo''
31
+ +sudo+ command to make life easier. With +sudo+
32
32
 
33
33
  sudo store --help
34
34
 
35
35
  should get you started.
36
36
 
37
- **Warning:** We use these scripts in a *teaching* environment, and so we
37
+ *Warning:* We use these scripts in a _teaching_ environment, and so we
38
38
  assume the host they are running on is somewhat disposable. Your needs
39
39
  may differ...
40
40
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.2
1
+ 0.1.0
@@ -51,7 +51,7 @@ module SANStore::CLI
51
51
  add_command(self.help_command)
52
52
 
53
53
  # Add other commands
54
- #add_command(SANStore::CLI::Commands::NewVol.new)
54
+ add_command(SANStore::CLI::Commands::NewVol.new)
55
55
  #add_command(SANStore::CLI::Commands::ListVols.new)
56
56
  end
57
57
 
@@ -26,5 +26,5 @@ end
26
26
 
27
27
  require 'SANStore/cli/commands/help'
28
28
 
29
- #require 'SANStore/cli/commands/new_vol'
29
+ require 'SANStore/cli/commands/new_vol'
30
30
  #require 'SANStore/cli/commands/list_vols'
@@ -12,90 +12,106 @@
12
12
  # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
13
13
  # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
14
14
 
15
+ # Volume names are based on RFC 4122 UUIDs
16
+ require "uuidtools"
15
17
 
16
- module WhiteCloth::CLI::Commands
18
+ # Use the ZFS library
19
+ require "SANStore/zfs/zfs"
20
+
21
+ # Use the COMStar iSCSI library
22
+ require "SANStore/iSCSI/comstar.rb"
23
+
24
+ module SANStore::CLI::Commands
17
25
 
18
26
  # @author David Love
19
27
  #
20
- # The +bootstrap+ command prepared the basic WhiteCloth realms (if
21
- # needed), and then links the current host to those realms. The basic
22
- # realms consists of
23
- #
24
- # +Realm 0+: *Namespace*. All the named realms stored in this domain.
25
- #
26
- # +Realm 1+: *Realm Handlers*. The basic gateways needed to create/store/update
27
- # other realms.
28
- #
29
- # +Realm 5+: *Realm Code*. Libraries and other code which the realm handlers
30
- # should use by preference when conducting operations on the realms.
31
- #
32
- # If the IP address of a server (or a server name) is given to as an argument
33
- # to this command, then we will use that IP address (name) for as the WhiteCloth
34
- # realm server to contact. Otherwise we will look for the same data from the file
35
- # +/etc/whitecloth.conf+: aborting if the file cannot be found.
36
- #
37
- # Once we have made contact with the server, we look at the basic realms listed
38
- # above, and attempt to ensure they can be found. If not, an attempt is made to
39
- # create the basic realms: aborting if this attempt fails.
40
- #
41
- # Finally, once everything has been set-up, we upload the core realm code (or
42
- # update the existing code)
43
- class Bootstrap < Cri::Command
28
+ # The +new_vol+ command adds a new ZFS volume to the specified volume
29
+ # store, and sets it up as an iSCSI target. Defaults are supplied to
30
+ # all arguments, but can be overridden by the user for slightly
31
+ # customised set-up of the volume store. However, the user interface
32
+ # should be kept as simple as possible.
33
+ class NewVol < Cri::Command
44
34
 
45
35
  # The name of the sub-command (as it appears in the command line app)
46
36
  def name
47
- 'bootstrap'
37
+ 'new_vol'
48
38
  end
49
39
 
50
40
  # The aliases this sub-command is known by
51
41
  def aliases
52
- []
42
+ [
43
+ "new", "add", "add_vol"
44
+ ]
53
45
  end
54
46
 
55
47
  # A short help text describing the purpose of this command
56
48
  def short_desc
57
- 'Create a link between this host and the whitecloth servers.'
49
+ 'Create a new iSCSI volume in the SAN volume store.'
58
50
  end
59
51
 
60
52
  # A longer description, detailing both the purpose and the
61
53
  # use of this command
62
54
  def long_desc
63
- 'Look for the specified server, adding the data required to link the ' +
64
- 'current host to that server. If the found server has not been set-up ' +
65
- 'then this command also performs the setup of the base realms as well. '
55
+ 'By default, this command creates a 20G ZFS volume, and marks it for ' +
56
+ 'sharing as an iSCSI target on the local network.' + "\n\n" +
57
+ 'Warning: By default this commands sets up the iSCSI target with NO ' +
58
+ 'security. This is fine for testing and use in the labs, but obviously ' +
59
+ 'is not ideal if you care about the data stored on this new volume...'
66
60
  end
67
61
 
68
62
  # Show the user the basic syntax of this command
69
63
  def usage
70
- "whitecloth bootstrap [-s server]"
64
+ "store new_volume [--volume-store ZFS_PATH][--name GUID] [--size INTEGER]"
71
65
  end
72
66
 
73
67
  # Define the options for this command
74
68
  def option_definitions
75
69
  [
76
- { :short => 's', :long => 'server', :argument => :optional }
70
+ { :short => 'v', :long => 'volume_store', :argument => :optional,
71
+ :desc => 'specifify the ZFS root of the new iSCSI volume. Defaults to "store/volumes".'
72
+ },
73
+ { :short => 'n', :long => 'name', :argument => :optional,
74
+ :desc => 'the name of the new volume. This must be a valid ZFS volume name, and defaults to ' +
75
+ 'an RFC 4122 GUID.'
76
+ },
77
+ { :short => 's', :long => 'size', :argument => :optional,
78
+ :desc => 'the size of the new iSCSI volume. Note that while ZFS allows you to change the size ' +
79
+ 'of the new volume relatively easily, because the iSCSI initiator sees this volume as a raw ' +
80
+ 'device changing the size later may be very easy or very difficult depending on the initiators ' +
81
+ 'operating system (and the specific file system being used). In other words, choose with care: ' +
82
+ 'by default this command uses a size of 20G, which should be enough for most tasks in the labs.'
83
+ },
77
84
  ]
78
85
  end
79
86
 
80
87
  # Execute the command
81
88
  def run(options, arguments)
89
+
90
+ # Look at the options, and if we don't find any (or some are
91
+ # missing), set them to the default values
92
+ if options[:volume_store].nil? or options[:volume_store].empty? then
93
+ volume_store = "store/volumes"
94
+ options[:volume_store] = volume_store
95
+ end
82
96
 
83
- # The first thing we need to do is to find the relevant server. So we
84
- # check the options and see if they can help
85
- unless options[:server].nil? or options[:server].empty? then
86
- #
87
- else
97
+ if options[:name].nil? or options[:name].empty? then
98
+ name = UUIDTools::UUID.timestamp_create
99
+ options[:name] = name.to_s
100
+ end
88
101
 
89
- # The user has not specified a server, so we will attempt to get one
90
- # from the system configuration
91
- if File.exists?("/etc/whitecloth.conf") then
92
- #
93
-
94
- # Everything has failed, so we abort
95
- else
96
- WhiteCloth::CLI::Logger.instance.log_level(:high, :error, "Cannot locate a WhiteCloth server. Either specify the server to connect to using the 'server' option, or create an appropriate configuration file.")
97
- end
98
- end
102
+ if options[:size].nil? or options[:size].empty? then
103
+ size = "20G"
104
+ options[:size] = size
105
+ end
106
+
107
+ # Ask for a new volume
108
+ ZFS.new_volume(options[:volume_store] + "/" + options[:name], options[:size])
109
+
110
+ # Set the volume up as an iSCSI target
111
+ target_name = COMStar.new_target(options[:volume_store] + "/" + options[:name])
112
+
113
+ # Tell the caller what the new volume name is
114
+ puts target_name
99
115
  end
100
116
 
101
117
  end
@@ -86,7 +86,7 @@ module Cri
86
86
  text << "options:\n"
87
87
  text << "\n"
88
88
  option_definitions.sort { |x,y| x[:long] <=> y[:long] }.each do |opt_def|
89
- text << sprintf(" -%1s --%-10s %s\n", opt_def[:short], opt_def[:long], opt_def[:desc])
89
+ text << sprintf(" -%1s --%-10s %s\n\n", opt_def[:short], opt_def[:long], opt_def[:desc].wrap_and_indent(78, 20).lstrip)
90
90
  end
91
91
  end
92
92
 
@@ -0,0 +1,35 @@
1
+ # Copyright (c) 2010-2011 David Love
2
+ #
3
+ # Permission to use, copy, modify, and/or distribute this software for
4
+ # any purpose with or without fee is hereby granted, provided that the
5
+ # above copyright notice and this permission notice appear in all copies.
6
+ #
7
+ # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8
+ # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9
+ # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
10
+ # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11
+ # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
12
+ # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
13
+ # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
14
+ #
15
+
16
+ # @author David Love
17
+
18
+ require "uuidtools"
19
+
20
+ # Extendes the {UUIDTools::UUID} class, adding the ability to
21
+ # generate sequential UUID's
22
+ class UUIDTools::UUID
23
+
24
+ # Increments the internal UUID representation, returning a
25
+ # new UUID that is different from, but greater, than the
26
+ # current sequence number
27
+ def next
28
+ next_uuid = self.to_i
29
+ next_uuid += 1
30
+
31
+ # Return the newly created UUID
32
+ return UUIDTools::UUID::parse_int(next_uuid)
33
+ end
34
+
35
+ end
@@ -0,0 +1,45 @@
1
+ # Copyright (c) 2010-2011 David Love
2
+ #
3
+ # Permission to use, copy, modify, and/or distribute this software for
4
+ # any purpose with or without fee is hereby granted, provided that the
5
+ # above copyright notice and this permission notice appear in all copies.
6
+ #
7
+ # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8
+ # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9
+ # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
10
+ # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11
+ # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
12
+ # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
13
+ # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
14
+ #
15
+
16
+ # @author David Love
17
+
18
+ # Defines a class capable of creating iSCSI shares using the new
19
+ # COMStar framework. This classes uses the various command line tools,
20
+ # not the C API.
21
+ class COMStar
22
+
23
+ # Create a new, ready to use, iSCSI target. Functionally this is command
24
+ # is equivalent to the old "shareiscsi=on" ZFS volume property.
25
+ def self.new_target(volume_path)
26
+
27
+ # Create a new disk target for the ZFS volume
28
+ disk_target = %x[sbdadm create-lu /dev/zvol/rdsk/#{volume_path}]
29
+
30
+ # Get the GUID of the new disk target from the output of the
31
+ # target creation command
32
+ guid = disk_target.split(/$/)[4].split[0]
33
+
34
+ # Link the new disk target to the iSCSI framework
35
+ vol_frame = %x[stmfadm add-view #{guid}]
36
+
37
+ # Finally create the target...
38
+ target = %x[itadm create-target]
39
+
40
+ #... and return the name to the caller
41
+ target_name = target.split[1]
42
+ end
43
+
44
+ end
45
+
@@ -0,0 +1,36 @@
1
+ # Copyright (c) 2010-2011 David Love
2
+ #
3
+ # Permission to use, copy, modify, and/or distribute this software for
4
+ # any purpose with or without fee is hereby granted, provided that the
5
+ # above copyright notice and this permission notice appear in all copies.
6
+ #
7
+ # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8
+ # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9
+ # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
10
+ # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11
+ # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
12
+ # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
13
+ # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
14
+ #
15
+
16
+ # @author David Love
17
+
18
+ # Defines a class capable of manipulating ZFS volumes. This classes uses
19
+ # the standard command line tools (+zfs+ and +zpool+), not the C API.
20
+ class ZFS
21
+
22
+ # Create a new volume, at the specified location and of the specified
23
+ # size.
24
+ #
25
+ # NOTE: This command currently only supports the creation of sparse
26
+ # volumes. If you really need pre-allocated volumes for some reason,
27
+ # this command needs to be extended
28
+ def self.new_volume(volume_path, volume_size)
29
+
30
+ # Create the volume
31
+ cmd = %x[zfs create -s -V #{volume_size} #{volume_path}]
32
+
33
+ end
34
+
35
+ end
36
+
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{shu-san-scripts}
8
- s.version = "0.0.2"
8
+ s.version = "0.1.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = [%q{David Love}]
12
- s.date = %q{2011-09-23}
12
+ s.date = %q{2011-09-24}
13
13
  s.description = %q{See the README file.}
14
14
  s.email = %q{david@homeunix.org.uk}
15
15
  s.executables = [%q{store}]
@@ -42,6 +42,9 @@ Gem::Specification.new do |s|
42
42
  "lib/SANStore/cri/core_ext.rb",
43
43
  "lib/SANStore/cri/core_ext/string.rb",
44
44
  "lib/SANStore/cri/option_parser.rb",
45
+ "lib/SANStore/helpers/uuid.rb",
46
+ "lib/SANStore/iSCSI/comstar.rb",
47
+ "lib/SANStore/zfs/zfs.rb",
45
48
  "shu-san-scripts.gemspec",
46
49
  "test/helper.rb",
47
50
  "test/test_shu-san-scripts.rb"
@@ -57,6 +60,8 @@ Gem::Specification.new do |s|
57
60
 
58
61
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
59
62
  s.add_runtime_dependency(%q<cri>, ["~> 2.0.2"])
63
+ s.add_runtime_dependency(%q<facets>, [">= 2.4"])
64
+ s.add_runtime_dependency(%q<uuidtools>, ["~> 2.1.2"])
60
65
  s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
61
66
  s.add_development_dependency(%q<jeweler>, ["~> 1.6.0"])
62
67
  s.add_development_dependency(%q<yard>, ["~> 0.6.0"])
@@ -65,6 +70,8 @@ Gem::Specification.new do |s|
65
70
  s.add_development_dependency(%q<riot>, [">= 0"])
66
71
  else
67
72
  s.add_dependency(%q<cri>, ["~> 2.0.2"])
73
+ s.add_dependency(%q<facets>, [">= 2.4"])
74
+ s.add_dependency(%q<uuidtools>, ["~> 2.1.2"])
68
75
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
69
76
  s.add_dependency(%q<jeweler>, ["~> 1.6.0"])
70
77
  s.add_dependency(%q<yard>, ["~> 0.6.0"])
@@ -74,6 +81,8 @@ Gem::Specification.new do |s|
74
81
  end
75
82
  else
76
83
  s.add_dependency(%q<cri>, ["~> 2.0.2"])
84
+ s.add_dependency(%q<facets>, [">= 2.4"])
85
+ s.add_dependency(%q<uuidtools>, ["~> 2.1.2"])
77
86
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
78
87
  s.add_dependency(%q<jeweler>, ["~> 1.6.0"])
79
88
  s.add_dependency(%q<yard>, ["~> 0.6.0"])
metadata CHANGED
@@ -5,9 +5,9 @@ version: !ruby/object:Gem::Version
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
+ - 1
8
9
  - 0
9
- - 2
10
- version: 0.0.2
10
+ version: 0.1.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - David Love
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-09-23 00:00:00 Z
18
+ date: 2011-09-24 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  type: :runtime
@@ -34,8 +34,39 @@ dependencies:
34
34
  name: cri
35
35
  prerelease: false
36
36
  - !ruby/object:Gem::Dependency
37
- type: :development
37
+ type: :runtime
38
38
  requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ hash: 11
44
+ segments:
45
+ - 2
46
+ - 4
47
+ version: "2.4"
48
+ version_requirements: *id002
49
+ name: facets
50
+ prerelease: false
51
+ - !ruby/object:Gem::Dependency
52
+ type: :runtime
53
+ requirement: &id003 !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - ~>
57
+ - !ruby/object:Gem::Version
58
+ hash: 15
59
+ segments:
60
+ - 2
61
+ - 1
62
+ - 2
63
+ version: 2.1.2
64
+ version_requirements: *id003
65
+ name: uuidtools
66
+ prerelease: false
67
+ - !ruby/object:Gem::Dependency
68
+ type: :development
69
+ requirement: &id004 !ruby/object:Gem::Requirement
39
70
  none: false
40
71
  requirements:
41
72
  - - ~>
@@ -46,12 +77,12 @@ dependencies:
46
77
  - 0
47
78
  - 0
48
79
  version: 1.0.0
49
- version_requirements: *id002
80
+ version_requirements: *id004
50
81
  name: bundler
51
82
  prerelease: false
52
83
  - !ruby/object:Gem::Dependency
53
84
  type: :development
54
- requirement: &id003 !ruby/object:Gem::Requirement
85
+ requirement: &id005 !ruby/object:Gem::Requirement
55
86
  none: false
56
87
  requirements:
57
88
  - - ~>
@@ -62,12 +93,12 @@ dependencies:
62
93
  - 6
63
94
  - 0
64
95
  version: 1.6.0
65
- version_requirements: *id003
96
+ version_requirements: *id005
66
97
  name: jeweler
67
98
  prerelease: false
68
99
  - !ruby/object:Gem::Dependency
69
100
  type: :development
70
- requirement: &id004 !ruby/object:Gem::Requirement
101
+ requirement: &id006 !ruby/object:Gem::Requirement
71
102
  none: false
72
103
  requirements:
73
104
  - - ~>
@@ -78,12 +109,12 @@ dependencies:
78
109
  - 6
79
110
  - 0
80
111
  version: 0.6.0
81
- version_requirements: *id004
112
+ version_requirements: *id006
82
113
  name: yard
83
114
  prerelease: false
84
115
  - !ruby/object:Gem::Dependency
85
116
  type: :development
86
- requirement: &id005 !ruby/object:Gem::Requirement
117
+ requirement: &id007 !ruby/object:Gem::Requirement
87
118
  none: false
88
119
  requirements:
89
120
  - - ~>
@@ -94,12 +125,12 @@ dependencies:
94
125
  - 8
95
126
  - 1
96
127
  version: 1.8.1
97
- version_requirements: *id005
128
+ version_requirements: *id007
98
129
  name: vclog
99
130
  prerelease: false
100
131
  - !ruby/object:Gem::Dependency
101
132
  type: :development
102
- requirement: &id006 !ruby/object:Gem::Requirement
133
+ requirement: &id008 !ruby/object:Gem::Requirement
103
134
  none: false
104
135
  requirements:
105
136
  - - ">="
@@ -108,12 +139,12 @@ dependencies:
108
139
  segments:
109
140
  - 0
110
141
  version: "0"
111
- version_requirements: *id006
142
+ version_requirements: *id008
112
143
  name: minitest
113
144
  prerelease: false
114
145
  - !ruby/object:Gem::Dependency
115
146
  type: :development
116
- requirement: &id007 !ruby/object:Gem::Requirement
147
+ requirement: &id009 !ruby/object:Gem::Requirement
117
148
  none: false
118
149
  requirements:
119
150
  - - ">="
@@ -122,7 +153,7 @@ dependencies:
122
153
  segments:
123
154
  - 0
124
155
  version: "0"
125
- version_requirements: *id007
156
+ version_requirements: *id009
126
157
  name: riot
127
158
  prerelease: false
128
159
  description: See the README file.
@@ -159,6 +190,9 @@ files:
159
190
  - lib/SANStore/cri/core_ext.rb
160
191
  - lib/SANStore/cri/core_ext/string.rb
161
192
  - lib/SANStore/cri/option_parser.rb
193
+ - lib/SANStore/helpers/uuid.rb
194
+ - lib/SANStore/iSCSI/comstar.rb
195
+ - lib/SANStore/zfs/zfs.rb
162
196
  - shu-san-scripts.gemspec
163
197
  - test/helper.rb
164
198
  - test/test_shu-san-scripts.rb