Sha256: 593d0bbc304a33890bbb699cbbe05b345160d82b7dcade3fd266e12e7a5f1695

Contents?: true

Size: 1.98 KB

Versions: 2

Compression:

Stored size: 1.98 KB

Contents

#!/usr/bin/env ruby


Dir.chdir(File.join(File.dirname(__FILE__), '..'))

faf_lib_path = File.expand_path(File.dirname(__FILE__) + "/../lib")
$:.unshift(faf_lib_path) unless $:.include?(faf_lib_path)

# include dependencies without using rubygems (to save memory)
$:.unshift('vendor/daemons-1.1.0/lib')

require 'vendor/daemons-1.1.0/lib/daemons'

require 'ostruct'
require 'optparse'
require 'socket'
require 'etc'
require 'fire_and_forget'

options = OpenStruct.new
options.socket = FireAndForget::DEFAULT_SOCKET
options.gid = Process.egid

OptionParser.new do |opts|
  opts.on("-s", "--socket SOCKET", "Socket") { |v| options.socket = v }
  opts.on("-g", "--socket-group GROUPNAME", "Socket owning group") { |v| options.gid = nil; options.group_name = v }
end.parse!

raise ArgumentError, "You must specify a socket file using -s" unless options.socket
unless options.gid
  if options.group_name
    options.gid = Etc.getgrnam(options.group_name).gid
  end
end

server = nil

begin
  raise Errno::EADDRINUSE if File.exists?(options.socket) and File.socket?(options.socket)
  server = UNIXServer.new(options.socket)
  File.chown(nil, options.gid, options.socket)
  # make the socket group writable
  File.chmod(0770, options.socket)
rescue Errno::EADDRINUSE
  puts "FAF unable to create socket #{options.socket}: file exists"
  exit(1)
end

run = true

server_thread = Thread.new do
  begin
    while run and (session = server.accept)
      request = response = ""

      while l = session.gets
        request << l
      end
      session.close_read

      begin
        response = FAF::Server.parse(request)
      rescue  => e
        response = "ERROR #{e}"
      end
      session.write(response)
      session.close
    end
  ensure
    server.close
    File.unlink(options.socket) if File.exists?(options.socket)
  end
end

['INT', 'TERM'].each do |signal|
  trap(signal) do
    run = false;
    server_thread.exit
  end
end

puts "Fire&Forget process #{$$} listening on #{options.socket} ..."

server_thread.join

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
fire_and_forget-0.3.1 bin/fire_forget
fire_and_forget-0.3.0 bin/fire_forget