#!/usr/bin/env ruby
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/

begin
  load File.expand_path('../bin/spring', __dir__)
rescue LoadError => e
  raise if e.message.exclude?('spring')
end

dir = File.expand_path(File.join(File.dirname(__FILE__), '..'))
Dir.chdir dir

require 'bundler'
require 'daemons'

def before_fork
  # remember open file handles
  @files_to_reopen = []
  ObjectSpace.each_object(File) do |file|
    @files_to_reopen << file if !file.closed?
  end
end

def after_fork(dir)
  Dir.chdir dir

  # Re-open file handles
  @files_to_reopen.each do |file|
    file.reopen file.path, 'a+'
    file.sync = true
  end

  # Spring redirects STDOUT and STDERR to /dev/null
  # before we get here. This causes the `reopen` lines
  # below to fail because the handles are already
  # opened for write
  if defined?(Spring)
    $stdout.close
    $stderr.close
  end

  $stdout.reopen("#{dir}/log/scheduler_out.log", 'w')
  $stderr.reopen("#{dir}/log/scheduler_err.log", 'w')
end

before_fork

daemon_options = {
  multiple:  false,
  dir_mode:  :normal,
  dir:       File.join(dir, 'tmp', 'pids'),
  backtrace: true
}

Daemons.run_proc('scheduler', daemon_options) do

  after_fork(dir)

  require File.join(dir, 'config', 'environment')

  Rails.logger.info 'Scheduler started.'
  at_exit do

    # use process title for stop log entry
    # if differs from default process title
    title = 'Scheduler'
    if $PROGRAM_NAME != 'scheduler.rb'
      title = $PROGRAM_NAME
    end

    Rails.logger.info "#{title} stopped."
  end

  begin
    Scheduler.threads
  rescue Interrupt
    nil
  end
end