shu-san-scripts 0.0.2 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|