2015-09-20 11:34:06 +00:00
|
|
|
# encoding: utf-8
|
|
|
|
#
|
|
|
|
# This is heavily based on:
|
|
|
|
#
|
|
|
|
# OHAI https://github.com/chef/ohai
|
|
|
|
# by Adam Jacob, Chef Software Inc
|
|
|
|
#
|
|
|
|
|
2015-09-26 11:12:52 +00:00
|
|
|
require 'vulcano/plugins/backend_detect_darwin'
|
|
|
|
require 'vulcano/plugins/backend_detect_linux'
|
|
|
|
require 'vulcano/plugins/backend_detect_unix'
|
|
|
|
require 'vulcano/plugins/backend_detect_windows'
|
|
|
|
|
2015-09-20 11:34:06 +00:00
|
|
|
class Vulcano::Plugins::Backend
|
|
|
|
class OSCommon
|
2015-09-26 11:12:52 +00:00
|
|
|
include DetectDarwin
|
|
|
|
include DetectLinux
|
|
|
|
include DetectUnix
|
|
|
|
include DetectWindows
|
|
|
|
|
2015-09-20 11:34:06 +00:00
|
|
|
def initialize(backend, platform = nil)
|
|
|
|
@backend = backend
|
|
|
|
@platform = platform || {}
|
|
|
|
detect_family
|
|
|
|
end
|
|
|
|
|
|
|
|
def [](key)
|
|
|
|
@platform[key]
|
|
|
|
end
|
|
|
|
|
2015-09-27 21:55:00 +00:00
|
|
|
REDHAT_FAMILY = %w{
|
|
|
|
redhat oracle centos fedora
|
|
|
|
}
|
|
|
|
|
|
|
|
DEBIAN_FAMILY = %w{
|
|
|
|
debian ubuntu linuxmint raspbian
|
|
|
|
}
|
|
|
|
|
|
|
|
SUSE_FAMILY = %w{
|
|
|
|
suse opensuse
|
|
|
|
}
|
|
|
|
|
|
|
|
LINUX_FAMILY = %w{gentoo arch slackware exherbo alpine coreos} +
|
|
|
|
REDHAT_FAMILY + DEBIAN_FAMILY + SUSE_FAMILY
|
|
|
|
|
|
|
|
OSX_FAMILY = %{darwin mac_os_x}
|
|
|
|
|
|
|
|
SOLARIS_FAMILY = %w{
|
|
|
|
solaris smartos openindiana opensolaris solaris2 nexentacore
|
|
|
|
}
|
|
|
|
|
|
|
|
BSD_FAMILY = %w{freebsd netbsd openbsd}
|
|
|
|
|
|
|
|
UNIX_FAMILY = %w{unix aix} + LINUX_FAMILY + OSX_FAMILY + SOLARIS_FAMILY
|
|
|
|
|
|
|
|
# Helper methods to check the OS type
|
|
|
|
def unix?
|
|
|
|
UNIX_FAMILY.include?(@platform[:family])
|
|
|
|
end
|
|
|
|
|
|
|
|
def bsd?
|
|
|
|
BSD_FAMILY.include?(@platform[:family])
|
|
|
|
end
|
|
|
|
|
|
|
|
def solaris?
|
|
|
|
SOLARIS_FAMILY.include?(@platform[:family])
|
|
|
|
end
|
|
|
|
|
|
|
|
def linux?
|
|
|
|
LINUX_FAMILY.include?(@platform[:family])
|
|
|
|
end
|
|
|
|
|
2015-09-20 11:34:06 +00:00
|
|
|
private
|
|
|
|
|
|
|
|
def detect_family
|
|
|
|
# if some information is already defined, try to verify it
|
|
|
|
# with the remaining detection
|
|
|
|
unless @platform[:family].nil?
|
|
|
|
# return ok if the preconfigured family yielded a good result
|
|
|
|
return true if detect_family_type
|
|
|
|
# if not, reset the platform to presets and run the full detection
|
|
|
|
# TODO: print an error message in this case, as the instantiating
|
|
|
|
# backend is doing something wrong
|
|
|
|
@platform = {}
|
|
|
|
end
|
2015-09-22 17:34:09 +00:00
|
|
|
|
|
|
|
# TODO: extend base implementation for detecting the family type
|
|
|
|
# to Windows and others
|
|
|
|
case uname_s
|
|
|
|
when /linux/i
|
|
|
|
@platform[:family] = 'linux'
|
|
|
|
when /./
|
|
|
|
@platform[:family] = 'unix'
|
|
|
|
else
|
|
|
|
# Don't know what this is
|
|
|
|
@platform[:family] = nil
|
|
|
|
end
|
|
|
|
|
|
|
|
# try to detect the platform
|
|
|
|
return nil unless @platform[:family].nil?
|
|
|
|
detect_family_type
|
2015-09-20 11:34:06 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
def detect_family_type
|
2015-09-22 17:34:09 +00:00
|
|
|
pf = @platform[:family]
|
|
|
|
|
|
|
|
return detect_windos if pf == 'windows'
|
|
|
|
return detect_darwin if pf == 'darwin'
|
|
|
|
|
|
|
|
if %w{freebsd netbsd openbsd aix solaris2}.include?(pf)
|
|
|
|
return detect_via_uname
|
2015-09-20 11:34:06 +00:00
|
|
|
end
|
2015-09-22 17:34:09 +00:00
|
|
|
|
|
|
|
# unix based systems combine the above
|
|
|
|
return true if pf == 'unix' and (detect_darwin or detect_via_uname)
|
|
|
|
|
2015-09-26 11:12:52 +00:00
|
|
|
# if we arrive here, we most likey have a regular linux
|
2015-09-22 17:34:09 +00:00
|
|
|
detect_linux
|
2015-09-20 11:34:06 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
def get_config(path)
|
|
|
|
res = @backend.run_command("test -f #{path} && cat #{path}")
|
|
|
|
# ignore files that can't be read
|
|
|
|
return nil if res.exit_status != 0
|
|
|
|
res.stdout
|
|
|
|
end
|
|
|
|
|
|
|
|
def unix_file?(path)
|
|
|
|
@backend.run_command("test -f #{path}").exit_status == 0
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|