Module: Wunderbar

Defined in:
lib/wunderbar/server.rb,
lib/wunderbar/rack.rb,
lib/wunderbar/rails.rb,
lib/wunderbar/logger.rb,
lib/wunderbar/builder.rb,
lib/wunderbar/sinatra.rb,
lib/wunderbar/version.rb,
lib/wunderbar/cssproxy.rb,
lib/wunderbar/cgi-methods.rb,
lib/wunderbar/environment.rb,
lib/wunderbar/job-control.rb,
lib/wunderbar/installation.rb

Overview

run command/block as a background daemon

Defined Under Namespace

Modules: CGI, Options, Rails, SinatraHelpers, Template, VERSION Classes: BuilderBase, CssProxy, JsonBuilder, RackApp, Scope, SpacedMarkup, TextBuilder, XmlMarkup

Constant Summary collapse

CALLERS_TO_IGNORE =
[
  %r{/(wunderbar|webrick)/},
  %r{<internal:},
  %r{/gems/.*/lib/(builder|rack|sinatra|tilt)/}
]
@@unsafe =
false

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.dataObject

Extract data from the script (after __END__)



3
4
5
6
7
8
9
10
11
12
13
# File 'lib/wunderbar/installation.rb', line 3

def self.data
  data = DATA.read 

  # process argument overrides
  data.scan(/^\s*([A-Z]\w*)\s*=\s*(['"]).*\2$/).each do |name, q|
    override = ARGV.find {|arg| arg =~ /--#{name}=(.*)/i}
    data[/^\s*#{name}\s*=\s*(.*)/,1] = $1.inspect if override
  end

  data
end

.debug(*args, &block) ⇒ Object

convenience methods



41
42
43
# File 'lib/wunderbar/logger.rb', line 41

def self.debug(*args, &block)
  logger.debug *args, &block
end

.error(*args, &block) ⇒ Object



53
54
55
# File 'lib/wunderbar/logger.rb', line 53

def self.error(*args, &block)
  logger.error *args, &block
end

.fatal(*args, &block) ⇒ Object



57
58
59
# File 'lib/wunderbar/logger.rb', line 57

def self.fatal(*args, &block)
  logger.fatal *args, &block
end

.html(*args, &block) ⇒ Object

canonical interface



149
150
151
# File 'lib/wunderbar/cgi-methods.rb', line 149

def self.html(*args, &block)
  @queue << [:html, args, block]
end

.info(*args, &block) ⇒ Object



45
46
47
# File 'lib/wunderbar/logger.rb', line 45

def self.info(*args, &block)
  logger.info *args, &block
end

.json(*args, &block) ⇒ Object



157
158
159
# File 'lib/wunderbar/cgi-methods.rb', line 157

def self.json(*args, &block)
  @queue << [:json, args, block]
end

.log_levelObject



32
33
34
35
36
37
38
# File 'lib/wunderbar/logger.rb', line 32

def self.log_level
  return 'debug' if logger.level == Logger::DEBUG
  return 'info'  if logger.level == Logger::INFO
  return 'warn'  if logger.level == Logger::WARN
  return 'error' if logger.level == Logger::ERROR
  return 'fatal' if logger.level == Logger::FATAL
end

.log_level=(level) ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/wunderbar/logger.rb', line 18

def self.log_level=(level)
  return unless level

  case level.to_s.downcase
  when 'debug'; logger.level = Logger::DEBUG
  when 'info';  logger.level = Logger::INFO
  when 'warn';  logger.level = Logger::WARN
  when 'error'; logger.level = Logger::ERROR
  when 'fatal'; logger.level = Logger::FATAL
  else
    warn "Invalid log_level specified: #{level}"
  end
end

.loggerObject



4
5
6
7
8
9
10
11
12
# File 'lib/wunderbar/logger.rb', line 4

def self.logger
  return @logger if @logger
  @logger = Logger.new($stderr)
  @logger.level = Logger::WARN
  @logger.formatter = proc { |severity, datetime, progname, msg|
    "_#{severity} #{msg}\n"
  }
  @logger
end

.logger=(new_logger) ⇒ Object



14
15
16
# File 'lib/wunderbar/logger.rb', line 14

def self.logger= new_logger
  @logger = new_logger
end

.queueObject



165
166
167
# File 'lib/wunderbar/cgi-methods.rb', line 165

def self.queue
  @queue
end

.safe?Boolean

Returns:

  • (Boolean)


14
15
16
# File 'lib/wunderbar/environment.rb', line 14

def self.safe?
  not @@unsafe
end

.text(*args, &block) ⇒ Object



161
162
163
# File 'lib/wunderbar/cgi-methods.rb', line 161

def self.text(*args, &block)
  @queue << [:text, args, block]
end

.unsafe!(mode = true) ⇒ Object



10
11
12
# File 'lib/wunderbar/environment.rb', line 10

def self.unsafe!(mode=true)
  @@unsafe=mode
end

.warn(*args, &block) ⇒ Object



49
50
51
# File 'lib/wunderbar/logger.rb', line 49

def self.warn(*args, &block)
  logger.warn *args, &block
end

.xhtml(*args, &block) ⇒ Object



153
154
155
# File 'lib/wunderbar/cgi-methods.rb', line 153

def self.xhtml(*args, &block)
  @queue << [:xhtml, args, block]
end

Instance Method Details

#submit(cmd = nil) ⇒ Object



3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/wunderbar/job-control.rb', line 3

def submit(cmd=nil)
  fork do
    # detach from tty
    Process.setsid
    fork and exit

    # clear working directory and mask
    Dir.chdir '/'
    File.umask 0000

    # close open files
    STDIN.reopen '/dev/null'
    STDOUT.reopen '/dev/null', 'a'
    STDERR.reopen STDOUT

    # clear environment of cgi cruft
    require 'cgi'
    ENV.delete_if {|key,value| key =~ /^HTTP_/}
    CGI::QueryExtension.public_instance_methods.each do |method|
      ENV.delete method.to_s.upcase
    end

    # setup environment
    ENV['USER'] ||= $USER
    ENV['HOME'] ||= $HOME

    # run cmd and/or block
    system cmd if cmd
    yield if block_given?
  end
end