diff options
| author | 2018-07-13 10:44:07 -0400 | |
|---|---|---|
| committer | 2018-07-13 10:44:07 -0400 | |
| commit | 2da2fed5f9c21288cbe8a807458a8f56272631af (patch) | |
| tree | a6411cfdbd34290e6020ef3598649d7d08c2bd07 /modules/slackware/lib/puppet | |
| parent | 3ce94f1b5124daceb255ad7de4ab58b0c8b69188 (diff) | |
| download | puppet-slackware-master.tar.gz puppet-slackware-master.tar.bz2 puppet-slackware-master.zip | |
Diffstat (limited to 'modules/slackware/lib/puppet')
| -rw-r--r-- | modules/slackware/lib/puppet/provider/package/slackware.rb | 73 | ||||
| -rw-r--r-- | modules/slackware/lib/puppet/provider/service/slackware.rb | 84 |
2 files changed, 157 insertions, 0 deletions
diff --git a/modules/slackware/lib/puppet/provider/package/slackware.rb b/modules/slackware/lib/puppet/provider/package/slackware.rb new file mode 100644 index 0000000..32ab31f --- /dev/null +++ b/modules/slackware/lib/puppet/provider/package/slackware.rb @@ -0,0 +1,73 @@ +# puppet/provider/package/slackware.rb +require 'puppet/provider/package' + +# Slackware Linux pkgtools +Puppet::Type.type(:package).provide :slackware, :parent => Puppet::Provider::Package do + desc "Slackware package maintenance system. Requires `/sbin/removepkg` and `/sbin/upgradepkg`." + + has_feature :installable + has_feature :uninstallable + + # Regex to match Slackware packages + # Name, Version, Architecure, and Build + SLACK_REGEX = /^(.*)-(\d|\w[^-]*)[-]([\w_]+)[-](\d+?.*?)$/ + SLACK_NVAB_FIELDS = [:name, :version, :arch, :build] + + commands :upgradepkg => "/sbin/upgradepkg", + :removepkg => "/sbin/removepkg" + + defaultfor :operatingsystem => :slackware + confine :operatingsystem => :slackware + + + def self.instances + packages = [] + # list the contents of /var/log/packages + cmd = "/bin/ls -1 /var/log/packages/" + execpipe(cmd) do |process| + hash = {} + # now turn each returned line into a package object + process.each_line { |line| + if hash = nvab_to_hash(line) + packages << new(hash) + end + } + end + packages + end + + + def query + self.class.instances.each do |provider| + if provider.name == @resource.name + return provider.properties + end + end + nil + end + + + def install + unless source = @resource[:source] + raise ArgumentError, "You cannot install Slackware packages without a source" + end + upgradepkg("--install-new", source) + end + + + def uninstall + nvab = "#{get(:name)}-#{get(:version)}-#{get(:arch)}-#{get(:build)}" + removepkg(nvab) + end + + + def self.nvab_to_hash(line) + line.chomp! + hash = {} + match = SLACK_REGEX.match(line.split[0]) + SLACK_NVAB_FIELDS.zip(match[1,4]) { |f, v| hash[f] = v } + hash[:provider] = self.name + hash[:ensure] = "present" + hash + end +end diff --git a/modules/slackware/lib/puppet/provider/service/slackware.rb b/modules/slackware/lib/puppet/provider/service/slackware.rb new file mode 100644 index 0000000..4c22554 --- /dev/null +++ b/modules/slackware/lib/puppet/provider/service/slackware.rb @@ -0,0 +1,84 @@ +# Manage Slackware services + +Puppet::Type.type(:service).provide :slackware, :parent => :init do + desc "Manage Slackware's old-school BSD-style init scripts. Services + are enabled or disabled by toggling the executable bit." + + defaultfor :operatingsystem => :slackware + confine :operatingsystem => :slackware + + has_feature :enableable + has_feature :refreshable + + def self.defpath + "/etc/rc.d" + end + + def self.excludes + exclude = [] + # Runlevel init scripts and symlinks thereto + exclude += %w{rc.0 rc.4 rc.6 rc.K rc.M rc.S} + # Additional system init scripts which aren't, strictly + # speaking, services + exclude += %w{rc.inet1 rc.inet2 rc.loop rc.font} + # rc.inet1.conf is a configuration file + exclude += %w{rc.inet1.conf} + end + + def self.instances + get_instances(self.defpath) + end + + def self.get_instances(defpath, exclude = self.excludes) + path = defpath + instances = [] + unless FileTest.directory?(path) + Puppet.debug "Service path #{path} does not exist" + end + + check = [:ensure] + + check << :enable if public_method_defined? :enabled? + + Dir.entries(path).each do |script| + fullpath = File.join(path, script) + next if script =~ /^\./ + next if exclude.include? script + next if FileTest.directory?(fullpath) + next if FileTest.symlink?(fullpath) + name = /^rc\.(.*)$/.match(script)[1] + instances << new(:name => name, :path => path, :hasstatus => :false) + end + instances + end + + def search(name) + paths.each { |path| + fqname_sh = File.join(path,"rc.#{name}") + begin + stat = File.stat(fqname_sh) + rescue + # should probably rescue specific errors... + self.debug("Could not find rc.#{name} in #{path}") + next + end + + # if we've gotten this far, we found a valid script + return fqname_sh + } + raise Puppet::Error, "Could not find init script for '#{name}'" + end + + def enabled? + FileTest.executable?(initscript) + end + + def enable + File.chmod(0755, initscript) if not FileTest.executable?(initscript) + end + + def disable + File.chmod(0644, initscript) if FileTest.executable?(initscript) + end + +end |