lib/freyr/service_info.rb in freyr-0.4.2 vs lib/freyr/service_info.rb in freyr-0.5.0

- old
+ new

@@ -1,72 +1,170 @@ module Freyr class ServiceInfo attr_reader :groups - - class << self - def add_service_method *methods - Service.send :add_service_method, *methods - Command.send :add_service_method, *methods - methods.each do |method| - ATTRS << methods + ROOT_PIDS = '/var/run/freyr'.freeze + USER_PIDS = File.expand_path('.freyr', '~').freeze + ROOT_LOGS = '/var/log/freyr'.freeze + USER_LOGS = USER_PIDS + failed = [] + [ROOT_PIDS,USER_PIDS,ROOT_LOGS,USER_LOGS].each do |dir| + begin + FileUtils.mkdir_p(dir) + rescue Errno::EACCES => e + failed << dir + end + end + + module Base + + module ClassMethods + + def add_service_method *methods + Service.send :add_service_method, *methods + Command.send :add_service_method, *methods + methods.each do |method| + InstanceMethods.instance_eval do + define_method method do |*args| + val = args + val = val.first if val.size < 2 + if val + MODIFIERS[method].each do |mod| + val = send(mod,val) + end + instance_variable_set("@#{method}",val) + else + instance_variable_get("@#{method}") + end + end + + end + + end end + end + + module InstanceMethods + + end + + def self.included(receiver) + receiver.extend ClassMethods + receiver.send :include, InstanceMethods + end end + include Base + + MODIFIERS = Hash.new {|h,k| h[k] = []} + MODIFIERS[:start] << :_sudo_checker + MODIFIERS[:stop] << :_sudo_checker + MODIFIERS[:restart] << :_sudo_checker ATTRS = [] - add_service_method :name,:dir,:log_cmd,:log,:err_log_cmd,:err_log,:umask, + attr_reader :defined_in + add_service_method :start,:name,:dir,:log_cmd,:log,:err_log_cmd,:err_log,:umask, :uid,:gid,:chroot,:proc_match,:restart,:stop,:stop_sig, - :restart_sig,:sudo,:groups,:ping,:also,:dependencies,:read_log - + :restart_sig,:sudo,:groups,:ping,:also,:dependencies,:read_log, + :pid_file, :dont_write_log,:env, :rvm + alias log_file log def initialize(name=nil, args={}, &block) @groups = [] @also = [] @dependencies = [] + @defined_in = [] if name.is_a?(Hash) @name = name.keys.first @groups << name[@name] else @name = name end + + @service = Service.new(self) - instance_eval(&block) + instance_eval(&block) if block_given? end def use_sudo @sudo = true end + + def env val=nil + raise TypeError, 'environment must be a hash' unless val.is_a?(Hash) || val.nil? + if val = super + val + else + {} + end + end + def pid_file val=nil + if val = super + val + else + if @sudo + File.join(ROOT_PIDS,"#{@name}.pid") + else + File.join(USER_PIDS,"#{@name}.pid") + end + end + end + + def read_log val=nil + @dont_write_log = true + super + end + + def log val=nil + val = if val = super + val + else + if @read_log + @read_log + else + if @sudo + File.join(ROOT_LOGS,"#{@name}.log") + else + File.join(USER_LOGS,"#{@name}.log") + end + end + end + + val =~ /^\// ? val : File.join(dir,val) + end + + def dir val=nil + if val + val.sub! /(.)\/$/, '\1' # remove tailing slash + Service.by_dir[val] = @service + end + + if val = super + val + else + '/' + end + end + def group(*val) + val.each do |group| + Service.by_selector[group] << @service + end @groups |= val end def requires *val @dependencies |= val end def also_as(*val) + val.each do |aliaz| + Service.by_selector[aliaz] = Service.by_selector[name] + Service.by_name[aliaz] = Service.by_name[name] + end @also |= val end - MODIFIERS = Hash.new {|h,k| h[k] = []} - MODIFIERS[:start] << :_sudo_checker - MODIFIERS[:stop] << :_sudo_checker - MODIFIERS[:restart] << :_sudo_checker - - def method_missing key, val=nil - key = key.to_s.gsub(/\=$/,'').to_sym - - if val - MODIFIERS[key].each do |modifier| - val = send(modifier,val) - end - instance_variable_set("@#{key}", val) - else - instance_variable_get("@#{key}") - end - end - SUDO_MATCHER = /^sudo\s+/ private # If someone doesn't explicitly not want the script running as admin @@ -83,17 +181,19 @@ class << self def from_file file @file_path = file file = File.expand_path(file) + Freyr.logger.debug("adding file") {file} return [] unless File.exist?(file) @added_services = [] - instance_eval(File.open(file).read) + @namespace = nil + instance_eval(File.open(file).read,file,0) @added_services end - def method_missing name, *args + def method_missing name, *args, &blk STDERR.puts "Freyr doesn't support #{name} as used in #{@file_path}" end private @@ -101,27 +201,25 @@ @namespace = name end def group name, *services services.each do |s| - services = Service[s] - if services - services.each do |service| - service.service_info.group(name) - end - else - STDERR.puts "Service #{s} not found, can't add to group #{name} as attempted in #{@file_path}" + service s do + group name end end end def service name=nil, &blk name = "#{@namespace}:#{name}" if @namespace - if service = Service[name] - service.service_info.instance_eval(&blk) + if service = Service.s[name] + service_info = service.info else - @added_services << new(name,&blk) + service_info = new(name) end + @added_services << service_info + service_info.defined_in << @file_path + service_info.instance_eval(&blk) end end end end \ No newline at end of file