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 +6 -0
- data/Gemfile.lock +3 -0
- data/HISTORY +14 -2
- data/README.rdoc +5 -5
- data/VERSION +1 -1
- data/lib/SANStore/cli/base.rb +1 -1
- data/lib/SANStore/cli/commands.rb +1 -1
- data/lib/SANStore/cli/commands/new_vol.rb +64 -48
- data/lib/SANStore/cri/command.rb +1 -1
- data/lib/SANStore/helpers/uuid.rb +35 -0
- data/lib/SANStore/iSCSI/comstar.rb +45 -0
- data/lib/SANStore/zfs/zfs.rb +36 -0
- data/shu-san-scripts.gemspec +11 -2
- metadata +49 -15
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-
|
20
|
+
HEAD / 2011-09-25
|
21
21
|
|
22
22
|
Current Development (David Love)
|
23
23
|
|
24
24
|
Changes:
|
25
25
|
|
26
|
-
*
|
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
|
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
|
-
|
29
|
-
the
|
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
|
-
|
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
|
-
|
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
|
1
|
+
0.1.0
|
data/lib/SANStore/cli/base.rb
CHANGED
@@ -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
|
-
|
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 +
|
21
|
-
#
|
22
|
-
#
|
23
|
-
#
|
24
|
-
#
|
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
|
-
'
|
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
|
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
|
-
'
|
64
|
-
'
|
65
|
-
'
|
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
|
-
"
|
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 => '
|
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
|
-
|
84
|
-
|
85
|
-
|
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
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
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
|
data/lib/SANStore/cri/command.rb
CHANGED
@@ -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
|
+
|
data/shu-san-scripts.gemspec
CHANGED
@@ -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
|
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-
|
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
|
-
|
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-
|
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: :
|
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: *
|
80
|
+
version_requirements: *id004
|
50
81
|
name: bundler
|
51
82
|
prerelease: false
|
52
83
|
- !ruby/object:Gem::Dependency
|
53
84
|
type: :development
|
54
|
-
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: *
|
96
|
+
version_requirements: *id005
|
66
97
|
name: jeweler
|
67
98
|
prerelease: false
|
68
99
|
- !ruby/object:Gem::Dependency
|
69
100
|
type: :development
|
70
|
-
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: *
|
112
|
+
version_requirements: *id006
|
82
113
|
name: yard
|
83
114
|
prerelease: false
|
84
115
|
- !ruby/object:Gem::Dependency
|
85
116
|
type: :development
|
86
|
-
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: *
|
128
|
+
version_requirements: *id007
|
98
129
|
name: vclog
|
99
130
|
prerelease: false
|
100
131
|
- !ruby/object:Gem::Dependency
|
101
132
|
type: :development
|
102
|
-
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: *
|
142
|
+
version_requirements: *id008
|
112
143
|
name: minitest
|
113
144
|
prerelease: false
|
114
145
|
- !ruby/object:Gem::Dependency
|
115
146
|
type: :development
|
116
|
-
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: *
|
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
|