nginx_utils 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/nginx_utils/logrotate.rb +187 -0
- data/lib/nginx_utils/status.rb +28 -0
- data/lib/nginx_utils/version.rb +1 -1
- data/lib/nginx_utils.rb +4 -186
- data/spec/{lib/nginx_utils_spec.rb → nginx_utils/logrotate_spec.rb} +0 -0
- data/spec/nginx_utils/status_spec.rb +23 -0
- data/spec/spec_helper.rb +1 -0
- metadata +9 -5
@@ -0,0 +1,187 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module NginxUtils
|
4
|
+
class Logrotate
|
5
|
+
attr_accessor :logger, :rename_logs, :delete_logs
|
6
|
+
|
7
|
+
def initialize(options={})
|
8
|
+
# Debug
|
9
|
+
# debug: false => Not execute. Only output of logs to STDOUT.
|
10
|
+
# debug: true => Execute rotate logs Nginx. (default)
|
11
|
+
if options[:debug]
|
12
|
+
debug
|
13
|
+
else
|
14
|
+
@execute = true
|
15
|
+
|
16
|
+
# Script log file
|
17
|
+
# not specified => /tmp/nginx_rotate.log (default)
|
18
|
+
# script_log: false => Not output of logs.
|
19
|
+
# script_log: "/path/to/nginx_rotate.log" => /path/to/nginx_rotate.log
|
20
|
+
# script_log: STDOUT => STDOUT
|
21
|
+
set_logger options[:script_log]
|
22
|
+
|
23
|
+
# Script log level
|
24
|
+
# not specified => Logger::DEBUG (default)
|
25
|
+
# log_level: [:fatal|:error|:info|:warn]
|
26
|
+
set_log_level options[:log_level]
|
27
|
+
end
|
28
|
+
|
29
|
+
# Target logs
|
30
|
+
# Log of rename target is "#{root_dir}/**/#{target_logs}"
|
31
|
+
# Log of delete target is "#{root_dir}/**/#{target_logs}.*"
|
32
|
+
# Default parameters are as follows:
|
33
|
+
# - root_dir => /usr/local/nginx
|
34
|
+
# - target_logs => *.log
|
35
|
+
@root_dir = options[:root_dir] || "/usr/local/nginx"
|
36
|
+
@target_logs = options[:target_logs] || "*.log"
|
37
|
+
@rename_logs = Dir.glob(File.join(@root_dir, "**", @target_logs))
|
38
|
+
@delete_logs = Dir.glob(File.join(@root_dir, "**", "#{@target_logs}.*"))
|
39
|
+
|
40
|
+
# Rename prefix
|
41
|
+
# Log of rename target to add the prefix.
|
42
|
+
# File name of the renamed after: "#{filename}.#{prefix}"
|
43
|
+
# Current time default. (YYYYmmddHHMMSS)
|
44
|
+
@prefix = options[:prefix] || Time.now.strftime("%Y%m%d%H%M%S")
|
45
|
+
|
46
|
+
# Retention period
|
47
|
+
# Delete log last modification time has passed the retention period.
|
48
|
+
# Specified unit of day.
|
49
|
+
dates = options[:retention] || 90
|
50
|
+
@retention = Time.now - (dates.to_i * 3600 * 24)
|
51
|
+
|
52
|
+
# PID file of Nginx
|
53
|
+
# The default is "#{root_dir}/logs/nginx.pid".
|
54
|
+
@pid_file = options[:pid_file] || File.join(@root_dir, "logs", "nginx.pid")
|
55
|
+
end
|
56
|
+
|
57
|
+
def config(options={})
|
58
|
+
# Debug
|
59
|
+
unless options[:debug].nil?
|
60
|
+
if options[:debug]
|
61
|
+
debug
|
62
|
+
else
|
63
|
+
debug false
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
# Script log file
|
68
|
+
unless options[:script_log].nil?
|
69
|
+
set_logger options[:script_log]
|
70
|
+
end
|
71
|
+
|
72
|
+
# Script log level
|
73
|
+
unless options[:log_level].nil?
|
74
|
+
set_log_level options[:log_level]
|
75
|
+
end
|
76
|
+
|
77
|
+
# Target logs
|
78
|
+
reglog = false
|
79
|
+
unless options[:root_dir].nil?
|
80
|
+
@root_dir = options[:root_dir]
|
81
|
+
reglob = true
|
82
|
+
end
|
83
|
+
|
84
|
+
unless options[:target_logs].nil?
|
85
|
+
@target_logs = options[:target_logs]
|
86
|
+
reglob = true
|
87
|
+
end
|
88
|
+
|
89
|
+
if reglob
|
90
|
+
@rename_logs = Dir.glob(File.join(@root_dir, "**", @target_logs))
|
91
|
+
@delete_logs = Dir.glob(File.join(@root_dir, "**", "#{@target_logs}.*"))
|
92
|
+
end
|
93
|
+
|
94
|
+
# Rename prefix
|
95
|
+
unless options[:prefix].nil?
|
96
|
+
@prefix = options[:prefix]
|
97
|
+
end
|
98
|
+
|
99
|
+
# Retention period
|
100
|
+
unless options[:retention].nil?
|
101
|
+
@retention = Time.now - (options[:retention].to_i * 3600 * 24)
|
102
|
+
end
|
103
|
+
|
104
|
+
# PID file of Nginx
|
105
|
+
unless options[:pid_file].nil?
|
106
|
+
@pid_file = options[:pid_file]
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def rename
|
111
|
+
@rename_logs.each do |log|
|
112
|
+
after = "#{log}.#{@prefix}"
|
113
|
+
if File.exists? after
|
114
|
+
@logger.warn "File already exists: #{after}" if @logger
|
115
|
+
else
|
116
|
+
File.rename(log, after) if @execute
|
117
|
+
@logger.debug "Rename log file: #{log} to #{after}" if @logger
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
def delete
|
123
|
+
@delete_logs.each do |log|
|
124
|
+
if File.stat(log).mtime < @retention
|
125
|
+
File.unlink(log) if @execute
|
126
|
+
@logger.debug "Delete log file: #{log}" if @logger
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
def restart
|
132
|
+
if File.exists? @pid_file
|
133
|
+
cmd = "kill -USR1 `cat #{@pid_file}`"
|
134
|
+
@logger.debug "Nginx restart command: #{cmd}" if @logger
|
135
|
+
if @execute
|
136
|
+
if system(cmd)
|
137
|
+
@logger.info "Nginx restart is successfully!" if @logger
|
138
|
+
else
|
139
|
+
@logger.error "Nginx restart failed!" if @logger
|
140
|
+
raise "Nginx restart failed!" if @logger == false
|
141
|
+
end
|
142
|
+
end
|
143
|
+
else
|
144
|
+
@logger.warn "Pid file is not found. not restart nginx. (#{@pid_file})" if @logger
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
def execute
|
149
|
+
@logger.info "Nginx logrotate is started!" if @logger
|
150
|
+
rename
|
151
|
+
delete
|
152
|
+
@logger.info "Nginx logrotate is successfully!" if @logger
|
153
|
+
restart
|
154
|
+
end
|
155
|
+
|
156
|
+
private
|
157
|
+
def debug(set=true)
|
158
|
+
if set
|
159
|
+
@execute = false
|
160
|
+
@logger = Logger.new(STDOUT)
|
161
|
+
else
|
162
|
+
@execute = true
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
def set_logger(log)
|
167
|
+
case log
|
168
|
+
when nil then @logger = Logger.new("/tmp/nginx_rotate.log")
|
169
|
+
when false then @logger = false
|
170
|
+
else @logger = Logger.new(log)
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
def set_log_level(level)
|
175
|
+
if @logger
|
176
|
+
case level
|
177
|
+
when :fatal then @logger.level = Logger::FATAL
|
178
|
+
when :error then @logger.level = Logger::ERROR
|
179
|
+
when :warn then @logger.level = Logger::WARN
|
180
|
+
when :info then @logger.level = Logger::INFO
|
181
|
+
when :debug then @logger.level = Logger::DEBUG
|
182
|
+
else @logger.level = Logger::DEBUG
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module NginxUtils
|
4
|
+
module Status
|
5
|
+
class << self
|
6
|
+
def get(options={host: "localhost", port: 80, path: "/nginx_status"})
|
7
|
+
begin
|
8
|
+
req = Net::HTTP::Get.new(options[:path])
|
9
|
+
res = Net::HTTP.start(options[:host], options[:port]){|http| http.request(req)}
|
10
|
+
status = res.body.split("\n")
|
11
|
+
server = status[2].split.map{|i| i.to_i}
|
12
|
+
rww = status[3].split.select{|i| /^[0-9]+$/ =~ i}.map{|i| i.to_i}
|
13
|
+
{
|
14
|
+
active_connection: status[0].split(":").last.gsub(/\s/, "").to_i,
|
15
|
+
accepts: server[0],
|
16
|
+
handled: server[1],
|
17
|
+
requests: server[2],
|
18
|
+
reading: rww[0],
|
19
|
+
writing: rww[1],
|
20
|
+
waiting: rww[2]
|
21
|
+
}
|
22
|
+
rescue
|
23
|
+
raise "Nginx status get failed"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/nginx_utils/version.rb
CHANGED
data/lib/nginx_utils.rb
CHANGED
@@ -1,190 +1,8 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
|
3
|
-
require "nginx_utils/version"
|
4
3
|
require "logger"
|
4
|
+
require "net/http"
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
def initialize(options={})
|
11
|
-
# Debug
|
12
|
-
# debug: false => Not execute. Only output of logs to STDOUT.
|
13
|
-
# debug: true => Execute rotate logs Nginx. (default)
|
14
|
-
if options[:debug]
|
15
|
-
debug
|
16
|
-
else
|
17
|
-
@execute = true
|
18
|
-
|
19
|
-
# Script log file
|
20
|
-
# not specified => /tmp/nginx_rotate.log (default)
|
21
|
-
# script_log: false => Not output of logs.
|
22
|
-
# script_log: "/path/to/nginx_rotate.log" => /path/to/nginx_rotate.log
|
23
|
-
# script_log: STDOUT => STDOUT
|
24
|
-
set_logger options[:script_log]
|
25
|
-
|
26
|
-
# Script log level
|
27
|
-
# not specified => Logger::DEBUG (default)
|
28
|
-
# log_level: [:fatal|:error|:info|:warn]
|
29
|
-
set_log_level options[:log_level]
|
30
|
-
end
|
31
|
-
|
32
|
-
# Target logs
|
33
|
-
# Log of rename target is "#{root_dir}/**/#{target_logs}"
|
34
|
-
# Log of delete target is "#{root_dir}/**/#{target_logs}.*"
|
35
|
-
# Default parameters are as follows:
|
36
|
-
# - root_dir => /usr/local/nginx
|
37
|
-
# - target_logs => *.log
|
38
|
-
@root_dir = options[:root_dir] || "/usr/local/nginx"
|
39
|
-
@target_logs = options[:target_logs] || "*.log"
|
40
|
-
@rename_logs = Dir.glob(File.join(@root_dir, "**", @target_logs))
|
41
|
-
@delete_logs = Dir.glob(File.join(@root_dir, "**", "#{@target_logs}.*"))
|
42
|
-
|
43
|
-
# Rename prefix
|
44
|
-
# Log of rename target to add the prefix.
|
45
|
-
# File name of the renamed after: "#{filename}.#{prefix}"
|
46
|
-
# Current time default. (YYYYmmddHHMMSS)
|
47
|
-
@prefix = options[:prefix] || Time.now.strftime("%Y%m%d%H%M%S")
|
48
|
-
|
49
|
-
# Retention period
|
50
|
-
# Delete log last modification time has passed the retention period.
|
51
|
-
# Specified unit of day.
|
52
|
-
dates = options[:retention] || 90
|
53
|
-
@retention = Time.now - (dates.to_i * 3600 * 24)
|
54
|
-
|
55
|
-
# PID file of Nginx
|
56
|
-
# The default is "#{root_dir}/logs/nginx.pid".
|
57
|
-
@pid_file = options[:pid_file] || File.join(@root_dir, "logs", "nginx.pid")
|
58
|
-
end
|
59
|
-
|
60
|
-
def config(options={})
|
61
|
-
# Debug
|
62
|
-
unless options[:debug].nil?
|
63
|
-
if options[:debug]
|
64
|
-
debug
|
65
|
-
else
|
66
|
-
debug false
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
# Script log file
|
71
|
-
unless options[:script_log].nil?
|
72
|
-
set_logger options[:script_log]
|
73
|
-
end
|
74
|
-
|
75
|
-
# Script log level
|
76
|
-
unless options[:log_level].nil?
|
77
|
-
set_log_level options[:log_level]
|
78
|
-
end
|
79
|
-
|
80
|
-
# Target logs
|
81
|
-
reglog = false
|
82
|
-
unless options[:root_dir].nil?
|
83
|
-
@root_dir = options[:root_dir]
|
84
|
-
reglob = true
|
85
|
-
end
|
86
|
-
|
87
|
-
unless options[:target_logs].nil?
|
88
|
-
@target_logs = options[:target_logs]
|
89
|
-
reglob = true
|
90
|
-
end
|
91
|
-
|
92
|
-
if reglob
|
93
|
-
@rename_logs = Dir.glob(File.join(@root_dir, "**", @target_logs))
|
94
|
-
@delete_logs = Dir.glob(File.join(@root_dir, "**", "#{@target_logs}.*"))
|
95
|
-
end
|
96
|
-
|
97
|
-
# Rename prefix
|
98
|
-
unless options[:prefix].nil?
|
99
|
-
@prefix = options[:prefix]
|
100
|
-
end
|
101
|
-
|
102
|
-
# Retention period
|
103
|
-
unless options[:retention].nil?
|
104
|
-
@retention = Time.now - (options[:retention].to_i * 3600 * 24)
|
105
|
-
end
|
106
|
-
|
107
|
-
# PID file of Nginx
|
108
|
-
unless options[:pid_file].nil?
|
109
|
-
@pid_file = options[:pid_file]
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
def rename
|
114
|
-
@rename_logs.each do |log|
|
115
|
-
after = "#{log}.#{@prefix}"
|
116
|
-
if File.exists? after
|
117
|
-
@logger.warn "File already exists: #{after}" if @logger
|
118
|
-
else
|
119
|
-
File.rename(log, after) if @execute
|
120
|
-
@logger.debug "Rename log file: #{log} to #{after}" if @logger
|
121
|
-
end
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
def delete
|
126
|
-
@delete_logs.each do |log|
|
127
|
-
if File.stat(log).mtime < @retention
|
128
|
-
File.unlink(log) if @execute
|
129
|
-
@logger.debug "Delete log file: #{log}" if @logger
|
130
|
-
end
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
|
-
def restart
|
135
|
-
if File.exists? @pid_file
|
136
|
-
cmd = "kill -USR1 `cat #{@pid_file}`"
|
137
|
-
@logger.debug "Nginx restart command: #{cmd}" if @logger
|
138
|
-
if @execute
|
139
|
-
if system(cmd)
|
140
|
-
@logger.info "Nginx restart is successfully!" if @logger
|
141
|
-
else
|
142
|
-
@logger.error "Nginx restart failed!" if @logger
|
143
|
-
raise "Nginx restart failed!" if @logger == false
|
144
|
-
end
|
145
|
-
end
|
146
|
-
else
|
147
|
-
@logger.warn "Pid file is not found. not restart nginx. (#{@pid_file})" if @logger
|
148
|
-
end
|
149
|
-
end
|
150
|
-
|
151
|
-
def execute
|
152
|
-
@logger.info "Nginx logrotate is started!" if @logger
|
153
|
-
rename
|
154
|
-
delete
|
155
|
-
@logger.info "Nginx logrotate is successfully!" if @logger
|
156
|
-
restart
|
157
|
-
end
|
158
|
-
|
159
|
-
private
|
160
|
-
def debug(set=true)
|
161
|
-
if set
|
162
|
-
@execute = false
|
163
|
-
@logger = Logger.new(STDOUT)
|
164
|
-
else
|
165
|
-
@execute = true
|
166
|
-
end
|
167
|
-
end
|
168
|
-
|
169
|
-
def set_logger(log)
|
170
|
-
case log
|
171
|
-
when nil then @logger = Logger.new("/tmp/nginx_rotate.log")
|
172
|
-
when false then @logger = false
|
173
|
-
else @logger = Logger.new(log)
|
174
|
-
end
|
175
|
-
end
|
176
|
-
|
177
|
-
def set_log_level(level)
|
178
|
-
if @logger
|
179
|
-
case level
|
180
|
-
when :fatal then @logger.level = Logger::FATAL
|
181
|
-
when :error then @logger.level = Logger::ERROR
|
182
|
-
when :warn then @logger.level = Logger::WARN
|
183
|
-
when :info then @logger.level = Logger::INFO
|
184
|
-
when :debug then @logger.level = Logger::DEBUG
|
185
|
-
else @logger.level = Logger::DEBUG
|
186
|
-
end
|
187
|
-
end
|
188
|
-
end
|
189
|
-
end
|
190
|
-
end
|
6
|
+
require "nginx_utils/version"
|
7
|
+
require "nginx_utils/logrotate"
|
8
|
+
require "nginx_utils/status"
|
File without changes
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require "spec_helper"
|
4
|
+
|
5
|
+
describe NginxUtils do
|
6
|
+
describe "Status" do
|
7
|
+
describe ".get" do
|
8
|
+
it "should get status" do
|
9
|
+
body = "Active connections: 1 \nserver accepts handled requests\n 4 5 51 \nReading: 1 Writing: 3 Waiting: 2 \n"
|
10
|
+
status = {active_connection: 1, accepts: 4, handled: 5, requests: 51, reading: 1, writing: 3, waiting: 2}
|
11
|
+
response = OpenStruct.new(body: body)
|
12
|
+
Net::HTTP.should_receive(:start).and_return(response)
|
13
|
+
expect(NginxUtils::Status.get).to eq(status)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should generate an exception if status get fails" do
|
17
|
+
res = OpenStruct.new(body: "invalid content")
|
18
|
+
Net::HTTP.should_receive(:start).and_return(res)
|
19
|
+
expect(proc{NginxUtils::Status.get}).to raise_error("Nginx status get failed")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nginx_utils
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -89,9 +89,12 @@ files:
|
|
89
89
|
- README.md
|
90
90
|
- Rakefile
|
91
91
|
- lib/nginx_utils.rb
|
92
|
+
- lib/nginx_utils/logrotate.rb
|
93
|
+
- lib/nginx_utils/status.rb
|
92
94
|
- lib/nginx_utils/version.rb
|
93
95
|
- nginx_utils.gemspec
|
94
|
-
- spec/
|
96
|
+
- spec/nginx_utils/logrotate_spec.rb
|
97
|
+
- spec/nginx_utils/status_spec.rb
|
95
98
|
- spec/spec_helper.rb
|
96
99
|
homepage: https://github.com/i2bskn/nginx_utils
|
97
100
|
licenses:
|
@@ -108,7 +111,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
108
111
|
version: '0'
|
109
112
|
segments:
|
110
113
|
- 0
|
111
|
-
hash:
|
114
|
+
hash: 17147575815869233
|
112
115
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
113
116
|
none: false
|
114
117
|
requirements:
|
@@ -117,7 +120,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
117
120
|
version: '0'
|
118
121
|
segments:
|
119
122
|
- 0
|
120
|
-
hash:
|
123
|
+
hash: 17147575815869233
|
121
124
|
requirements: []
|
122
125
|
rubyforge_project:
|
123
126
|
rubygems_version: 1.8.23
|
@@ -125,5 +128,6 @@ signing_key:
|
|
125
128
|
specification_version: 3
|
126
129
|
summary: Nginx utilities
|
127
130
|
test_files:
|
128
|
-
- spec/
|
131
|
+
- spec/nginx_utils/logrotate_spec.rb
|
132
|
+
- spec/nginx_utils/status_spec.rb
|
129
133
|
- spec/spec_helper.rb
|