summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorJames Shubin <james@shubin.ca>2014-03-13 11:45:26 -0400
committerJames Shubin <james@shubin.ca>2014-03-16 22:39:08 -0400
commitc7a6ef2c0267540ab2b272872648476255557dc6 (patch)
treefb8c109ded939d3092bccc91a0456f4e92e62d46 /lib
parent05576cd410bb2616ce72e3e9e24850f911cbb6dc (diff)
downloadpuppet-gluster-c7a6ef2c0267540ab2b272872648476255557dc6.tar.gz
puppet-gluster-c7a6ef2c0267540ab2b272872648476255557dc6.tar.xz
puppet-gluster-c7a6ef2c0267540ab2b272872648476255557dc6.zip
Add automatic generation of fs UUID's per brick filesystem.
This automatically generates UUID's for each physical filesystem, or alternatively, you can specify one manually with the $fsuuid argument. This will make a _big_ difference when using gluster::simple to automatically deploy a large cluster of physical machines, since you don't have to manually generate one uuid per device (which is time consuming and could be a lot to do and a lot to maintain).
Diffstat (limited to 'lib')
-rw-r--r--lib/facter/gluster_fsuuid.rb144
1 files changed, 144 insertions, 0 deletions
diff --git a/lib/facter/gluster_fsuuid.rb b/lib/facter/gluster_fsuuid.rb
new file mode 100644
index 0000000..4ed48dc
--- /dev/null
+++ b/lib/facter/gluster_fsuuid.rb
@@ -0,0 +1,144 @@
+# GlusterFS module by James
+# Copyright (C) 2010-2013+ James Shubin
+# Written by James Shubin <james@shubin.ca>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+require 'facter'
+require 'digest/sha1'
+
+# TODO: the ruby uuid method can be used when newer ruby versions are used here
+# require 'securerandom'
+# SecureRandom.uuid
+
+# uuid regexp
+regexp = /^[a-f0-9]{8}\-[a-f0-9]{4}\-[a-f0-9]{4}\-[a-f0-9]{4}\-[a-f0-9]{12}$/
+fqdn = Facter.value('fqdn') # this could be nil !
+
+# find the module_vardir
+dir = Facter.value('puppet_vardirtmp') # nil if missing
+if dir.nil? # let puppet decide if present!
+ dir = Facter.value('puppet_vardir')
+ if dir.nil?
+ var = nil
+ else
+ var = dir.gsub(/\/$/, '')+'/'+'tmp/' # ensure trailing slash
+ end
+else
+ var = dir.gsub(/\/$/, '')+'/'
+end
+
+if var.nil?
+ # if we can't get a valid vardirtmp, then we can't continue
+ module_vardir = nil
+ valid_brickdir = nil
+ uuiddir = nil
+else
+ module_vardir = var+'gluster/'
+ valid_brickdir = module_vardir.gsub(/\/$/, '')+'/brick/'
+ uuiddir = valid_brickdir+'fsuuid/' # safe dir that won't get purged...
+end
+
+# NOTE: module specific mkdirs, needed to ensure there is no blocking/deadlock!
+if not(var.nil?) and not File.directory?(var)
+ Dir::mkdir(var)
+end
+
+if not(module_vardir.nil?) and not File.directory?(module_vardir)
+ Dir::mkdir(module_vardir)
+end
+
+found = {}
+
+# generate uuid and parent directory if they don't already exist...
+if not(module_vardir.nil?) and File.directory?(module_vardir)
+ if not File.directory?(uuiddir)
+ Dir::mkdir(uuiddir)
+ end
+
+ # loop through brick dir, looking for brick names to make fsuuid's for!
+ if not(valid_brickdir.nil?) and File.directory?(valid_brickdir) and File.directory?(uuiddir)
+ Dir.glob(valid_brickdir+'*.*').each do |f|
+ b = File.basename(f)
+ g = b.split('.') # $name.group
+
+ group = g.pop() # pop off suffix (the group name)
+
+ if g.length >= 1
+ # NOTE: some of this code is unnecessary, but i
+ # kept it because it matches the brick parsing.
+
+ x = g.join('.') # in case value had dots in it.
+
+ brick = File.open(f, 'r').read.strip # read into str
+ # eg: annex1.example.com:/storage1a
+ split = brick.split(':') # do some $name parsing
+ host = split[0] # host fqdn
+ # NOTE: technically $path should be everything BUT split[0]. This
+ # lets our $path include colons if for some reason they're needed.
+ #path = split[1] # brick mount or storage path
+ path = brick.slice(host.length+1, brick.length-host.length-1)
+
+ # if fqdn is nil, generate for everyone...
+ # (other hosts data will just be unused...)
+ if not(fqdn.nil?)
+ # otherwise, skip hosts that aren't us!
+ if host != fqdn
+ next
+ end
+ end
+
+ uuidfile = uuiddir + b
+ # we sha1 to prevent weird characters in facter
+ key = Digest::SHA1.hexdigest(host + ':' + path + '.' + group)
+
+ # create an fsuuid for each brick and store it
+ # in our vardir if it doesn't already exist...
+ if not File.exist?(uuidfile)
+ result = system("/usr/bin/uuidgen > '" + uuidfile + "'")
+ if not(result)
+ # TODO: print warning
+ end
+ end
+
+ # create facts from all the uuid files found...
+ uuid = File.open(uuidfile, 'r').read.strip.downcase # read into str
+ if uuid.length == 36 and regexp.match(uuid)
+ # avoid: http://projects.puppetlabs.com/issues/22455
+ found[key] = uuid
+ # TODO: print warning on else...
+ end
+ end
+ end
+ end
+end
+
+found.keys.each do |x|
+ Facter.add('gluster_brick_fsuuid_'+x) do
+ #confine :operatingsystem => %w{CentOS, RedHat, Fedora}
+ setcode {
+ found[x]
+ }
+ end
+end
+
+# list of generated gluster_brick_fsuuid's
+Facter.add('gluster_brick_fsuuid_facts') do
+ #confine :operatingsystem => %w{CentOS, RedHat, Fedora}
+ setcode {
+ found.keys.collect {|x| 'gluster_brick_fsuuid_'+x }.join(',')
+ }
+end
+
+# vim: ts=8