Class: Unicorn::Util

Inherits:
Object
  • Object
show all
Defined in:
lib/unicorn/util.rb

Class Method Summary collapse

Class Method Details

.chown_logs(uid, gid) ⇒ Object



29
30
31
32
33
# File 'lib/unicorn/util.rb', line 29

def chown_logs(uid, gid)
  ObjectSpace.each_object(File) do |fp|
    fp.chown(uid, gid) if is_log?(fp)
  end
end

.is_log?(fp) ⇒ Boolean

Returns:

  • (Boolean)


20
21
22
23
24
25
26
27
# File 'lib/unicorn/util.rb', line 20

def is_log?(fp)
  append_flags = File::WRONLY | File::APPEND

  ! fp.closed? &&
    fp.sync &&
    fp.path[0] == ?/ &&
    (fp.fcntl(Fcntl::F_GETFL) & append_flags) == append_flags
end

.reopen_logsObject

This reopens ALL logfiles in the process that have been rotated using logrotate(8) (without copytruncate) or similar tools. A File object is considered for reopening if it is:

1) opened with the O_APPEND and O_WRONLY flags
2) opened with an absolute path (starts with "/")
3) the current open file handle does not match its original open path
4) unbuffered (as far as userspace buffering goes, not O_SYNC)

Returns the number of files reopened



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/unicorn/util.rb', line 43

def reopen_logs
  nr = 0

  ObjectSpace.each_object(File) do |fp|
    is_log?(fp) or next
    orig_st = fp.stat
    begin
      b = File.stat(fp.path)
      next if orig_st.ino == b.ino && orig_st.dev == b.dev
    rescue Errno::ENOENT
    end

    open_arg = 'a'
    if fp.respond_to?(:external_encoding) && enc = fp.external_encoding
      open_arg << ":#{enc.to_s}"
      enc = fp.internal_encoding and open_arg << ":#{enc.to_s}"
    end
    fp.reopen(fp.path, open_arg)
    fp.sync = true
    new_st = fp.stat
    if orig_st.uid != new_st.uid || orig_st.gid != new_st.gid
      fp.chown(orig_st.uid, orig_st.gid)
    end
    nr += 1
  end # each_object
  nr
end

.tmpioObject

creates and returns a new File object. The File is unlinked immediately, switched to binary mode, and userspace output buffering is disabled



74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/unicorn/util.rb', line 74

def tmpio
  fp = begin
    TmpIO.open("#{Dir::tmpdir}/#{rand}",
               File::RDWR|File::CREAT|File::EXCL, 0600)
  rescue Errno::EEXIST
    retry
  end
  File.unlink(fp.path)
  fp.binmode
  fp.sync = true
  fp
end