hotdog 0.0.7 → 0.1.0
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.
- checksums.yaml +4 -4
- data/README.md +0 -6
- data/lib/hotdog/application.rb +11 -34
- data/lib/hotdog/commands.rb +199 -232
- data/lib/hotdog/commands/hosts.rb +3 -24
- data/lib/hotdog/commands/search.rb +1 -3
- data/lib/hotdog/commands/tags.rb +4 -12
- data/lib/hotdog/version.rb +1 -1
- metadata +2 -7
- data/lib/hotdog/commands/destroy.rb +0 -21
- data/lib/hotdog/commands/gc.rb +0 -19
- data/lib/hotdog/commands/init.rb +0 -47
- data/lib/hotdog/commands/rm.rb +0 -19
- data/lib/hotdog/commands/update.rb +0 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c02920ad489cbbbf48668151aa47add9a237cc07
|
4
|
+
data.tar.gz: 135a3312a19650537706eac8d00e7ec27fe503bc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ad15864f8d0cb38904e9e377c8c416aa28432ab032d8c109161bffa578e165bb572165658f260a10f6eb50dee59ed950f5b647aec165767eace829c03f80d0f9
|
7
|
+
data.tar.gz: 0b452f257046f22a261deada1cba9e53e6e7aec8ef60dcbdc43991c4dabcf567a38888a72215d7d50a5cd1d7dd838f45723f017a978991b75f8e7add94f99668
|
data/README.md
CHANGED
data/lib/hotdog/application.rb
CHANGED
@@ -2,8 +2,6 @@
|
|
2
2
|
|
3
3
|
require "logger"
|
4
4
|
require "optparse"
|
5
|
-
require "shellwords"
|
6
|
-
require "sqlite3"
|
7
5
|
require "yaml"
|
8
6
|
require "hotdog/commands"
|
9
7
|
require "hotdog/formatters"
|
@@ -11,34 +9,34 @@ require "hotdog/formatters"
|
|
11
9
|
module Hotdog
|
12
10
|
class Application
|
13
11
|
def initialize()
|
14
|
-
@confdir = find_confdir(File.expand_path("."))
|
15
12
|
@optparse = OptionParser.new
|
16
13
|
@options = {
|
14
|
+
api_key: ENV["DATADOG_API_KEY"],
|
15
|
+
application_key: ENV["DATADOG_APPLICATION_KEY"],
|
16
|
+
application: self,
|
17
|
+
confdir: find_confdir(File.expand_path(".")),
|
17
18
|
debug: false,
|
18
|
-
|
19
|
-
minimum_expiry: 3600, # 1 hour
|
20
|
-
random_expiry: 5940, # 99 hours
|
19
|
+
expiry: 180,
|
21
20
|
fixed_string: false,
|
22
21
|
force: false,
|
23
22
|
format: "plain",
|
24
23
|
headers: false,
|
25
24
|
listing: false,
|
26
|
-
logger: Logger.new(STDERR)
|
25
|
+
logger: Logger.new(STDERR).tap { |logger|
|
26
|
+
logger.level = Logger::INFO
|
27
|
+
},
|
27
28
|
max_time: 5,
|
28
|
-
api_key: ENV["DATADOG_API_KEY"],
|
29
|
-
application_key: ENV["DATADOG_APPLICATION_KEY"],
|
30
29
|
print0: false,
|
31
30
|
print1: true,
|
32
31
|
tags: [],
|
33
32
|
verbose: false,
|
34
33
|
}
|
35
|
-
@options[:logger].level = Logger::INFO
|
36
34
|
define_options
|
37
35
|
end
|
38
36
|
attr_reader :options
|
39
37
|
|
40
38
|
def main(argv=[])
|
41
|
-
config = File.join(
|
39
|
+
config = File.join(options[:confdir], "config.yml")
|
42
40
|
if File.file?(config)
|
43
41
|
loaded = YAML.load(File.read(config))
|
44
42
|
if Hash === loaded
|
@@ -63,28 +61,16 @@ module Hotdog
|
|
63
61
|
options[:logger].level = Logger::INFO
|
64
62
|
end
|
65
63
|
|
66
|
-
sqlite = File.expand_path(File.join(@confdir, "#{options[:environment]}.db"))
|
67
|
-
FileUtils.mkdir_p(File.dirname(sqlite))
|
68
|
-
@db = SQLite3::Database.new(sqlite)
|
69
|
-
@db.synchronous = "off"
|
70
|
-
|
71
64
|
begin
|
72
65
|
command = ( args.shift || "help" )
|
73
|
-
|
74
|
-
|
75
|
-
exit(2)
|
66
|
+
get_command(command).new(@options.dup).tap do |cmd|
|
67
|
+
cmd.run(args)
|
76
68
|
end
|
77
69
|
rescue Errno::EPIPE
|
78
70
|
# nop
|
79
71
|
end
|
80
72
|
end
|
81
73
|
|
82
|
-
def run_command(command, args=[])
|
83
|
-
get_command(command).new(@db, options.merge(application: self)).tap do |c|
|
84
|
-
c.run(args)
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
74
|
private
|
89
75
|
def define_options
|
90
76
|
@optparse.on("--api-key API_KEY", "Datadog API key") do |api_key|
|
@@ -99,15 +85,9 @@ module Hotdog
|
|
99
85
|
@optparse.on("-1", "Use newline as separator") do |v|
|
100
86
|
options[:print1] = v
|
101
87
|
end
|
102
|
-
@optparse.on("-B", "--blocking", "Enable blocking mode") do
|
103
|
-
options[:max_time] = -1
|
104
|
-
end
|
105
88
|
@optparse.on("-d", "--[no-]debug", "Enable debug mode") do |v|
|
106
89
|
options[:debug] = v
|
107
90
|
end
|
108
|
-
@optparse.on("-E ENVIRONMENT", "--environment ENVIRONMENT", "Specify environment") do |environment|
|
109
|
-
options[:environment] = environment
|
110
|
-
end
|
111
91
|
@optparse.on("--fixed-string", "Interpret pattern as fixed string") do |v|
|
112
92
|
options[:fixed_string] = v
|
113
93
|
end
|
@@ -126,9 +106,6 @@ module Hotdog
|
|
126
106
|
@optparse.on("-a TAG", "-t TAG", "--tag TAG", "Use specified tag name/value") do |tag|
|
127
107
|
options[:tags] += [tag]
|
128
108
|
end
|
129
|
-
@optparse.on("-m SECONDS", "--max-time SECONDS", Integer, "Maximum time in seconds") do |seconds|
|
130
|
-
options[:max_time] = seconds
|
131
|
-
end
|
132
109
|
@optparse.on("-V", "--[no-]verbose", "Enable verbose mode") do |v|
|
133
110
|
options[:verbose] = v
|
134
111
|
end
|
data/lib/hotdog/commands.rb
CHANGED
@@ -1,25 +1,32 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
+
require "fileutils"
|
3
4
|
require "dogapi"
|
4
|
-
require "
|
5
|
+
require "json"
|
6
|
+
require "sqlite3"
|
5
7
|
|
6
8
|
module Hotdog
|
7
9
|
module Commands
|
8
10
|
class BaseCommand
|
9
|
-
def initialize(
|
10
|
-
@
|
11
|
+
def initialize(options={})
|
12
|
+
@application = options[:application]
|
13
|
+
@confdir = options[:confdir]
|
14
|
+
@expiry = options[:expiry]
|
11
15
|
@fixed_string = options[:fixed_string]
|
16
|
+
@force = options[:force]
|
12
17
|
@formatter = options[:formatter]
|
18
|
+
@listing = options[:listing]
|
13
19
|
@logger = options[:logger]
|
14
20
|
@tags = options[:tags]
|
15
|
-
@application = options[:application]
|
16
21
|
@options = options
|
17
22
|
@dog = Dogapi::Client.new(options[:api_key], options[:application_key])
|
18
|
-
@started_at = Time.new
|
19
|
-
@suspended = false
|
20
23
|
end
|
21
24
|
attr_reader :application
|
25
|
+
attr_reader :confdir
|
26
|
+
attr_reader :expiry
|
27
|
+
attr_reader :force
|
22
28
|
attr_reader :formatter
|
29
|
+
attr_reader :listing
|
23
30
|
attr_reader :logger
|
24
31
|
attr_reader :tags
|
25
32
|
attr_reader :options
|
@@ -29,6 +36,7 @@ module Hotdog
|
|
29
36
|
end
|
30
37
|
|
31
38
|
def execute(query, *args)
|
39
|
+
update_db
|
32
40
|
q = query.strip
|
33
41
|
if 0 < args.length
|
34
42
|
q += " -- VALUES (#{args.map { |arg| Array === arg ? "(#{arg.join(", ")})" : arg.inspect }.join(", ")})"
|
@@ -41,10 +49,6 @@ module Hotdog
|
|
41
49
|
@fixed_string
|
42
50
|
end
|
43
51
|
|
44
|
-
def suspended?()
|
45
|
-
@suspended
|
46
|
-
end
|
47
|
-
|
48
52
|
private
|
49
53
|
def format(result, options={})
|
50
54
|
@formatter.format(result, @options.merge(options))
|
@@ -55,285 +59,248 @@ module Hotdog
|
|
55
59
|
end
|
56
60
|
|
57
61
|
def get_hosts(hosts=[])
|
62
|
+
update_db
|
58
63
|
if 0 < tags.length
|
59
64
|
result = hosts.map { |host_id|
|
60
|
-
update_host_tags(host_id, @options.merge(tags: tags))
|
61
65
|
tags.map { |tag|
|
62
66
|
tag_name, tag_value = tag.split(":", 2)
|
63
67
|
case tag_name
|
64
|
-
when "expires_at"
|
65
|
-
@get_hosts_q6 ||= @db.prepare(<<-EOS)
|
66
|
-
SELECT expires_at FROM hosts_tags WHERE host_id = ? LIMIT 1;
|
67
|
-
EOS
|
68
|
-
logger.debug("get_hosts_q6(%s)" % [host_id.inspect])
|
69
|
-
@get_hosts_q6.execute(host_id).map { |row| Time.at(row.first).strftime("%Y-%m-%dT%H:%M:%S") }.first
|
70
68
|
when "host"
|
71
|
-
@
|
72
|
-
SELECT name FROM hosts WHERE id = ? LIMIT 1;
|
73
|
-
EOS
|
74
|
-
logger.debug("get_hosts_q1(%s)" % [host_id.inspect])
|
75
|
-
@get_hosts_q1.execute(host_id).map { |row| row.first }.first
|
69
|
+
select_name_from_hosts_by_id(@db, host_id)
|
76
70
|
else
|
77
|
-
if
|
78
|
-
@
|
79
|
-
SELECT tags.value FROM hosts_tags
|
80
|
-
INNER JOIN tags ON hosts_tags.tag_id = tags.id
|
81
|
-
WHERE hosts_tags.host_id = ? AND tags.name = ?;
|
82
|
-
EOS
|
83
|
-
logger.debug("get_hosts_q2(%s, %s)" % [host_id.inspect, tag_name.inspect])
|
84
|
-
@get_hosts_q2.execute(host_id, tag_name).map { |row| row.first }.join(",")
|
71
|
+
if glob?(tag_name)
|
72
|
+
select_tag_values_from_hosts_tags_by_host_id_and_tag_name_glob(@db, host_id, tag_name)
|
85
73
|
else
|
86
|
-
@
|
87
|
-
SELECT tags.value FROM hosts_tags
|
88
|
-
INNER JOIN tags ON hosts_tags.tag_id = tags.id
|
89
|
-
WHERE hosts_tags.host_id = ? AND tags.name GLOB ?;
|
90
|
-
EOS
|
91
|
-
logger.debug("get_hosts_q5(%s, %s)", host_id.inspect, tag_name.inspect)
|
92
|
-
@get_hosts_q5.execute(host_id, tag_name).map { |row| row.first }.join(",")
|
74
|
+
select_tag_values_from_hosts_tags_by_host_id_and_tag_name(@db, host_id, tag_name)
|
93
75
|
end
|
94
76
|
end
|
95
77
|
}
|
96
78
|
}
|
97
79
|
fields = tags
|
98
80
|
else
|
99
|
-
if
|
100
|
-
|
81
|
+
if @listing
|
101
82
|
fields = []
|
102
|
-
hosts = execute(
|
103
|
-
SELECT id, name FROM hosts WHERE id IN (%s) ORDER BY name;
|
104
|
-
EOS
|
83
|
+
hosts = execute("SELECT id, name FROM hosts WHERE id IN (%s)" % hosts.map { "?" }.join(", "), hosts)
|
105
84
|
result = hosts.map { |host_id, host_name|
|
106
|
-
|
107
|
-
@get_hosts_q3 ||= @db.prepare(<<-EOS)
|
108
|
-
SELECT DISTINCT tags.name FROM hosts_tags
|
109
|
-
INNER JOIN tags ON hosts_tags.tag_id = tags.id
|
110
|
-
WHERE hosts_tags.host_id = ?;
|
111
|
-
EOS
|
112
|
-
logger.debug("get_hosts_q3(%s)" % [host_id.inspect])
|
113
|
-
tag_names = @get_hosts_q3.execute(host_id).map { |row| row.first }
|
85
|
+
tag_names = select_tag_names_from_hosts_tags_by_host_id(@db, host_id)
|
114
86
|
tag_names.each do |tag_name|
|
115
87
|
fields << tag_name unless fields.index(tag_name)
|
116
88
|
end
|
117
89
|
[host_name] + fields.map { |tag_name|
|
118
|
-
@
|
119
|
-
SELECT tags.value FROM hosts_tags
|
120
|
-
INNER JOIN tags ON hosts_tags.tag_id = tags.id
|
121
|
-
WHERE hosts_tags.host_id = ? AND tags.name = ?;
|
122
|
-
EOS
|
123
|
-
logger.debug("get_hosts_q4(%s, %s)" % [host_id.inspect, tag_name.inspect])
|
124
|
-
@get_hosts_q4.execute(host_id, tag_name).map { |row| row.first }.join(",")
|
90
|
+
select_tag_values_from_hosts_tags_by_host_id_and_tag_name(@db, host_id, tag_name)
|
125
91
|
}
|
126
92
|
}
|
127
93
|
fields = ["host"] + fields
|
128
94
|
else
|
129
95
|
fields = ["host"]
|
130
|
-
result = execute(
|
131
|
-
SELECT name FROM hosts WHERE id IN (%s) ORDER BY name;
|
132
|
-
EOS
|
96
|
+
result = execute("SELECT name FROM hosts WHERE id IN (%s)" % hosts.map { "?" }.join(", "), hosts)
|
133
97
|
end
|
134
98
|
end
|
135
99
|
[result, fields]
|
136
100
|
end
|
137
101
|
|
138
|
-
def
|
139
|
-
if
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
else
|
154
|
-
logger.debug("expires_at not found. start updateing.")
|
102
|
+
def update_db(options={})
|
103
|
+
if @db.nil?
|
104
|
+
FileUtils.mkdir_p(confdir)
|
105
|
+
persistent = File.join(confdir, "persistent.db")
|
106
|
+
|
107
|
+
if not @force and File.exist?(persistent) and Time.new < File.mtime(persistent) + expiry
|
108
|
+
begin
|
109
|
+
persistent_db = SQLite3::Database.new(persistent)
|
110
|
+
persistent_db.execute("SELECT id, name FROM hosts LIMIT 1")
|
111
|
+
persistent_db.execute("SELECT id, name, value FROM tags LIMIT 1")
|
112
|
+
persistent_db.execute("SELECT host_id, tag_id FROM hosts_tags LIMIT 1")
|
113
|
+
@db = persistent_db
|
114
|
+
return
|
115
|
+
rescue SQLite3::SQLException
|
116
|
+
persistent_db.close()
|
155
117
|
end
|
156
118
|
end
|
157
119
|
|
158
|
-
|
159
|
-
|
120
|
+
memory_db = SQLite3::Database.new(":memory:")
|
121
|
+
create_table_hosts(memory_db)
|
122
|
+
create_index_hosts(memory_db)
|
123
|
+
create_table_tags(memory_db)
|
124
|
+
create_index_tags(memory_db)
|
125
|
+
create_table_hosts_tags(memory_db)
|
126
|
+
create_index_hosts_tags(memory_db)
|
127
|
+
|
128
|
+
code, result = @dog.all_tags()
|
129
|
+
logger.debug("dog.all_tags() #==> [%s, ...]" % [code.inspect])
|
160
130
|
if code.to_i / 100 != 2
|
161
|
-
raise("dog.
|
131
|
+
raise("dog.all_tags() returns (%s: ...)" % [code.inspect])
|
162
132
|
end
|
163
133
|
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
@update_hosts_q2 ||= @db.prepare("INSERT OR IGNORE INTO hosts (name) VALUES (?);")
|
172
|
-
logger.debug("update_hosts_q2(%s)" % [host_name.inspect])
|
173
|
-
@update_hosts_q2.execute(host_name)
|
174
|
-
update_host_tags(host_name, options)
|
175
|
-
|
176
|
-
elapsed_time = Time.new - @started_at
|
177
|
-
if 0 < options[:max_time] and options[:max_time] < elapsed_time
|
178
|
-
length = result["results"]["hosts"].length
|
179
|
-
logger.info("update_host_tags: exceeded maximum time (#{options[:max_time]} < #{elapsed_time}) after #{i+1}/#{length}. will resume on next run.")
|
180
|
-
suspend_host_tags
|
181
|
-
break
|
134
|
+
result["tags"].each do |tag, hosts|
|
135
|
+
tag_name, tag_value = tag.split(":", 2)
|
136
|
+
tag_value ||= ""
|
137
|
+
insert_or_ignore_into_tags(memory_db, tag_name, tag_value)
|
138
|
+
hosts.each do |host_name|
|
139
|
+
insert_or_ignore_into_hosts(memory_db, host_name)
|
140
|
+
insert_or_replace_into_hosts_tags(memory_db, host_name, tag_name, tag_value)
|
182
141
|
end
|
183
142
|
end
|
143
|
+
|
144
|
+
# backup in-memory db to file
|
145
|
+
FileUtils.rm_f(persistent)
|
146
|
+
persistent_db = SQLite3::Database.new(persistent)
|
147
|
+
copy_db(memory_db, persistent_db)
|
148
|
+
persistent_db.close
|
149
|
+
@db = memory_db
|
150
|
+
else
|
151
|
+
@db
|
184
152
|
end
|
185
153
|
end
|
186
154
|
|
187
|
-
def
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
EOS
|
197
|
-
logger.debug("update_tags_q1()")
|
198
|
-
hosts = @update_tags_q1.execute().map { |row| row.first }
|
199
|
-
else
|
200
|
-
@update_tags_q2 ||= @db.prepare(<<-EOS)
|
201
|
-
SELECT DISTINCT hosts_tags.host_id FROM hosts_tags
|
202
|
-
WHERE hosts_tags.expires_at < ?;
|
203
|
-
EOS
|
204
|
-
logger.debug("update_tags_q2(%s)" % [Time.new.to_i])
|
205
|
-
hosts = @update_tags_q2.execute(Time.new.to_i).map { |row| row.first }
|
155
|
+
def copy_db(src, dst)
|
156
|
+
# create index later for better insert performance
|
157
|
+
dst.transaction do
|
158
|
+
create_table_hosts(dst)
|
159
|
+
create_table_tags(dst)
|
160
|
+
create_table_hosts_tags(dst)
|
161
|
+
|
162
|
+
select_from_hosts(src).each do |host_id, host_name|
|
163
|
+
insert_into_hosts(dst, host_id, host_name)
|
206
164
|
end
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
update_host_tags(host_id, options)
|
213
|
-
|
214
|
-
elapsed_time = Time.new - @started_at
|
215
|
-
if 0 < options[:max_time] and options[:max_time] < elapsed_time
|
216
|
-
length = hosts.length
|
217
|
-
logger.info("update_host_tags: exceeded maximum time (#{options[:max_time]} < #{elapsed_time}) after #{i+1}/#{length}. will resume on next run.")
|
218
|
-
suspend_host_tags
|
219
|
-
break
|
220
|
-
end
|
165
|
+
select_from_tags(src).each do |tag_id, tag_name, tag_value|
|
166
|
+
insert_into_tags(dst, tag_id, tag_name, tag_value)
|
167
|
+
end
|
168
|
+
select_from_hosts_tags(src).each do |host_id, tag_id|
|
169
|
+
insert_into_hosts_tags(dst, host_id, tag_id)
|
221
170
|
end
|
171
|
+
|
172
|
+
create_index_hosts(dst)
|
173
|
+
create_index_tags(dst)
|
174
|
+
create_index_hosts_tags(dst)
|
222
175
|
end
|
223
176
|
end
|
224
177
|
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
EMPTY_TAG_VALUE = ""
|
229
|
-
EMPTY_EXPIRES_AT = Time.at(0).to_i
|
230
|
-
|
231
|
-
def suspend_host_tags()
|
232
|
-
@db.transaction do
|
233
|
-
@suspended = true
|
234
|
-
@suspend_host_tags_q1 ||= @db.prepare("INSERT OR IGNORE INTO hosts (name) VALUES (?);")
|
235
|
-
logger.debug("suspend_host_tags_q1(%s)" % [EMPTY_HOST_NAME.inspect])
|
236
|
-
@suspend_host_tags_q1.execute(EMPTY_HOST_NAME)
|
237
|
-
@suspend_host_tags_q2 ||= @db.prepare("INSERT OR IGNORE INTO tags (name, value) VALUES (?, ?);")
|
238
|
-
logger.debug("suspend_host_tags_q2(%s, %s)" % [EMPTY_TAG_NAME.inspect, EMPTY_TAG_VALUE.inspect])
|
239
|
-
@suspend_host_tags_q2.execute(EMPTY_TAG_NAME, EMPTY_TAG_VALUE)
|
240
|
-
@suspend_host_tags_q3 ||= @db.prepare(<<-EOS)
|
241
|
-
INSERT OR REPLACE INTO hosts_tags (host_id, tag_id, expires_at)
|
242
|
-
SELECT host.id, tag.id, ? FROM
|
243
|
-
( SELECT id FROM hosts WHERE name = ?) AS host,
|
244
|
-
( SELECT id FROM tags WHERE name = ? AND value = ? ) AS tag;
|
245
|
-
EOS
|
246
|
-
logger.debug("suspend_host_tags_q3(%s, %s, %s, %s)" % [EMPTY_EXPIRES_AT.inspect, EMPTY_HOST_NAME.inspect, EMPTY_TAG_NAME.inspect, EMPTY_TAG_VALUE.inspect])
|
247
|
-
@suspend_host_tags_q3.execute(EMPTY_EXPIRES_AT, EMPTY_HOST_NAME, EMPTY_TAG_NAME, EMPTY_TAG_VALUE)
|
248
|
-
end
|
178
|
+
def select_from_hosts(db)
|
179
|
+
logger.debug("select_from_hosts()")
|
180
|
+
db.execute("SELECT id, name FROM hosts")
|
249
181
|
end
|
250
182
|
|
251
|
-
def
|
252
|
-
|
253
|
-
|
254
|
-
|
183
|
+
def select_from_tags(db)
|
184
|
+
logger.debug("select_from_tags()")
|
185
|
+
db.execute("SELECT id, name, value FROM tags")
|
186
|
+
end
|
187
|
+
|
188
|
+
def select_from_hosts_tags(db)
|
189
|
+
logger.debug("select_from_hosts_tags()")
|
190
|
+
db.execute("SELECT host_id, tag_id FROM hosts_tags")
|
191
|
+
end
|
192
|
+
|
193
|
+
def create_table_hosts(db)
|
194
|
+
logger.debug("create_table_hosts()")
|
195
|
+
db.execute(<<-EOS)
|
196
|
+
CREATE TABLE IF NOT EXISTS hosts (
|
197
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
198
|
+
name VARCHAR(255) NOT NULL
|
199
|
+
);
|
255
200
|
EOS
|
256
|
-
logger.debug("resume_host_tags_q1(%s, %s, %s)" % [EMPTY_HOST_NAME.inspect, EMPTY_TAG_NAME.inspect, EMPTY_TAG_VALUE.inspect])
|
257
|
-
@resume_host_tags_q1.execute(EMPTY_HOST_NAME, EMPTY_TAG_NAME, EMPTY_TAG_VALUE)
|
258
201
|
end
|
259
202
|
|
260
|
-
def
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
else
|
265
|
-
if Integer === host_name
|
266
|
-
host_id = host_name
|
267
|
-
@update_host_tags_q1 ||= @db.prepare("SELECT name FROM hosts WHERE id = ? LIMIT 1;")
|
268
|
-
logger.debug("update_host_tags_q1(%s)" % [host_id.inspect])
|
269
|
-
host_name = @update_host_tags_q1.execute(host_id).map { |row| row.first }.first
|
270
|
-
else
|
271
|
-
@update_host_tags_q2 ||= @db.prepare("SELECT id, name FROM hosts WHERE LOWER(name) = LOWER(?) LIMIT 1;")
|
272
|
-
logger.debug("update_host_tags_q2(%s)" % [host_name.inspect])
|
273
|
-
host_id, host_name = @update_host_tags_q2.execute(host_name).map { |row| row }.first
|
274
|
-
end
|
203
|
+
def create_index_hosts(db)
|
204
|
+
logger.debug("create_index_hosts()")
|
205
|
+
db.execute("CREATE UNIQUE INDEX IF NOT EXISTS hosts_name ON hosts ( name )")
|
206
|
+
end
|
275
207
|
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
logger.debug("%s: average expires_at was %s. start updating." % [host_name, Time.at(expires_at)])
|
287
|
-
end
|
288
|
-
else
|
289
|
-
logger.debug("%s: expires_at not found. start updateing." % [host_name])
|
290
|
-
end
|
291
|
-
end
|
208
|
+
def create_table_tags(db)
|
209
|
+
logger.debug("create_table_tags()")
|
210
|
+
db.execute(<<-EOS)
|
211
|
+
CREATE TABLE IF NOT EXISTS tags (
|
212
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
213
|
+
name VARCHAR(200) NOT NULL,
|
214
|
+
value VARCHAR(200) NOT NULL DEFAULT ""
|
215
|
+
);
|
216
|
+
EOS
|
217
|
+
end
|
292
218
|
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
when 404 # host not found on datadog
|
298
|
-
@update_host_tags_q7 ||= @db.prepare("DELETE FROM hosts_tags WHERE host_id IN ( SELECT id FROM hosts WHERE LOWER(name) = LOWER(?) );")
|
299
|
-
logger.debug("update_host_tags_q7(%s)" % [host_name.inspect])
|
300
|
-
@update_host_tags_q7.execute(host_name)
|
301
|
-
end
|
302
|
-
raise("dog.host_tags(%s) returns (%s: %s)" % [host_name.inspect, code.inspect, result.inspect])
|
303
|
-
end
|
219
|
+
def create_index_tags(db)
|
220
|
+
logger.debug("create_index_tags()")
|
221
|
+
db.execute("CREATE UNIQUE INDEX IF NOT EXISTS tags_name_value ON tags ( name, value )")
|
222
|
+
end
|
304
223
|
|
305
|
-
|
306
|
-
|
224
|
+
def create_table_hosts_tags(db)
|
225
|
+
logger.debug("create_table_hosts_tags()")
|
226
|
+
db.execute(<<-EOS)
|
227
|
+
CREATE TABLE IF NOT EXISTS hosts_tags (
|
228
|
+
host_id INTEGER NOT NULL,
|
229
|
+
tag_id INTEGER NOT NULL
|
230
|
+
);
|
231
|
+
EOS
|
232
|
+
end
|
307
233
|
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
234
|
+
def create_index_hosts_tags(db)
|
235
|
+
logger.debug("create_index_hosts_tags()")
|
236
|
+
db.execute("CREATE UNIQUE INDEX IF NOT EXISTS hosts_tags_host_id_tag_id ON hosts_tags ( host_id, tag_id )")
|
237
|
+
end
|
312
238
|
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
logger.debug("update_host_tags_q4(%s, %s)" % [tag_name.inspect, tag_value.inspect])
|
318
|
-
@update_host_tags_q4.execute(tag_name, tag_value)
|
319
|
-
@update_host_tags_q5 ||= @db.prepare(<<-EOS)
|
320
|
-
INSERT OR REPLACE INTO hosts_tags (host_id, tag_id, expires_at)
|
321
|
-
SELECT host.id, tag.id, ? FROM
|
322
|
-
( SELECT id FROM hosts WHERE name = ? ) AS host,
|
323
|
-
( SELECT id FROM tags WHERE name = ? AND value = ? ) AS tag;
|
324
|
-
EOS
|
325
|
-
logger.debug("update_host_tags_q5(%s, %s)" % [expires_at, host_name, tag_name, tag_value])
|
326
|
-
@update_host_tags_q5.execute(expires_at, host_name, tag_name, tag_value)
|
327
|
-
end
|
328
|
-
end
|
239
|
+
def insert_into_tags(db, tag_id, tag_name, tag_value)
|
240
|
+
logger.debug("insert_into_tags(%s, %s, %s)" % [tag_id.inspect, tag_name.inspect, tag_value.inspect])
|
241
|
+
db.execute("INSERT INTO tags (id, name, value) VALUES (?, ?, ?)", tag_id, tag_name, tag_value)
|
242
|
+
end
|
329
243
|
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
244
|
+
def insert_or_ignore_into_tags(db, tag_name, tag_value)
|
245
|
+
logger.debug("insert_or_ignore_into_tags(%s, %s)" % [tag_name.inspect, tag_value.inspect])
|
246
|
+
db.execute("INSERT OR IGNORE INTO tags (name, value) VALUES (?, ?)", tag_name, tag_value)
|
247
|
+
end
|
248
|
+
|
249
|
+
def insert_into_hosts(db, host_id, host_name)
|
250
|
+
logger.debug("insert_into_hosts(%s, %s)" % [host_id.inspect, host_name.inspect])
|
251
|
+
db.execute("INSERT INTO hosts (id, name) VALUES (?, ?)", host_id, host_name)
|
252
|
+
end
|
253
|
+
|
254
|
+
def insert_or_ignore_into_hosts(db, host_name)
|
255
|
+
logger.debug("insert_or_ignore_into_hosts(%s)" % [host_name.inspect])
|
256
|
+
db.execute("INSERT OR IGNORE INTO hosts (name) VALUES (?)", host_name)
|
257
|
+
end
|
258
|
+
|
259
|
+
def insert_into_hosts_tags(db, host_id, tag_id)
|
260
|
+
logger.debug("insert_into_hosts_tags(%s, %s)" % [host_id.inspect, tag_id.inspect])
|
261
|
+
db.execute("INSERT INTO hosts_tags (host_id, tag_id) VALUES (?, ?)", host_id, tag_id)
|
262
|
+
end
|
263
|
+
|
264
|
+
def insert_or_replace_into_hosts_tags(db, host_name, tag_name, tag_value)
|
265
|
+
logger.debug("insert_or_replace_into_hosts_tags(%s, %s, %s)" % [host_name.inspect, tag_name.inspect, tag_value.inspect])
|
266
|
+
db.execute(<<-EOS, host_name, tag_name, tag_value)
|
267
|
+
INSERT OR REPLACE INTO hosts_tags (host_id, tag_id)
|
268
|
+
SELECT host.id, tag.id FROM
|
269
|
+
( SELECT id FROM hosts WHERE name = ? ) AS host,
|
270
|
+
( SELECT id FROM tags WHERE name = ? AND value = ? ) AS tag;
|
271
|
+
EOS
|
272
|
+
end
|
273
|
+
|
274
|
+
def select_name_from_hosts_by_id(db, host_id)
|
275
|
+
logger.debug("select_name_from_hosts_by_id(%s)" % [host_id.inspect])
|
276
|
+
db.execute("SELECT name FROM hosts WHERE id = ? LIMIT 1", host_id).map { |row| row.first }.first
|
277
|
+
end
|
278
|
+
|
279
|
+
def select_tag_values_from_hosts_tags_by_host_id_and_tag_name_glob(db, host_id, tag_name)
|
280
|
+
logger.debug("select_tag_values_from_hosts_tags_by_host_id_and_tag_name_glob(%s, %s)", host_id.inspect, tag_name.inspect)
|
281
|
+
db.execute(<<-EOS, host_id, tag_name).map { |row| row.first }.join(",")
|
282
|
+
SELECT tags.value FROM hosts_tags
|
283
|
+
INNER JOIN tags ON hosts_tags.tag_id = tags.id
|
284
|
+
WHERE hosts_tags.host_id = ? AND tags.name GLOB ?;
|
285
|
+
EOS
|
286
|
+
end
|
287
|
+
|
288
|
+
def select_tag_values_from_hosts_tags_by_host_id_and_tag_name(db, host_id, tag_name)
|
289
|
+
logger.debug("select_tag_values_from_hosts_tags_by_host_id_and_tag_name(%s, %s)" % [host_id.inspect, tag_name.inspect])
|
290
|
+
db.execute(<<-EOS, host_id, tag_name).map { |row| row.first }.join(",")
|
291
|
+
SELECT tags.value FROM hosts_tags
|
292
|
+
INNER JOIN tags ON hosts_tags.tag_id = tags.id
|
293
|
+
WHERE hosts_tags.host_id = ? AND tags.name = ?;
|
294
|
+
EOS
|
295
|
+
end
|
296
|
+
|
297
|
+
def select_tag_names_from_hosts_tags_by_host_id(db, host_id)
|
298
|
+
logger.debug("select_tag_names_from_hosts_tags_by_host_id(%s)" % [host_id.inspect])
|
299
|
+
db.execute(<<-EOS, host_id).map { |row| row.first }
|
300
|
+
SELECT DISTINCT tags.name FROM hosts_tags
|
301
|
+
INNER JOIN tags ON hosts_tags.tag_id = tags.id
|
302
|
+
WHERE hosts_tags.host_id = ?;
|
303
|
+
EOS
|
337
304
|
end
|
338
305
|
end
|
339
306
|
end
|
@@ -4,43 +4,22 @@ module Hotdog
|
|
4
4
|
module Commands
|
5
5
|
class Hosts < BaseCommand
|
6
6
|
def run(args=[])
|
7
|
-
application.run_command("init")
|
8
|
-
|
9
7
|
if args.empty?
|
10
|
-
|
11
|
-
@hosts_q1 ||= @db.prepare(<<-EOS)
|
12
|
-
SELECT DISTINCT host_id FROM hosts_tags;
|
13
|
-
EOS
|
14
|
-
logger.debug("hosts_q1()")
|
15
|
-
result = @hosts_q1.execute().to_a.reduce(:+)
|
8
|
+
result = execute("SELECT DISTINCT host_id FROM hosts_tags").to_a.reduce(:+)
|
16
9
|
else
|
17
|
-
if args.map { |host_name| glob?(host_name) }.any?
|
18
|
-
update_hosts(@options.dup)
|
19
|
-
else
|
20
|
-
args.each do |host_name|
|
21
|
-
@hosts_q4 ||= @db.prepare("INSERT OR IGNORE INTO hosts (name) VALUES (?);")
|
22
|
-
logger.debug("hosts_q4(%s)" % [host_name.inspect])
|
23
|
-
@hosts_q4.execute(host_name)
|
24
|
-
update_host_tags(host_name, @options.dup)
|
25
|
-
end
|
26
|
-
end
|
27
10
|
result = args.map { |host_name|
|
28
11
|
if glob?(host_name)
|
29
|
-
|
12
|
+
execute(<<-EOS, host_name).map { |row| row.first }
|
30
13
|
SELECT DISTINCT hosts_tags.host_id FROM hosts_tags
|
31
14
|
INNER JOIN hosts ON hosts_tags.host_id = hosts.id
|
32
15
|
WHERE LOWER(hosts.name) GLOB LOWER(?);
|
33
16
|
EOS
|
34
|
-
logger.debug("hosts_q2(%s)" % [host_name.inspect])
|
35
|
-
@hosts_q2.execute(host_name).map { |row| row.first }
|
36
17
|
else
|
37
|
-
|
18
|
+
execute(<<-EOS, host_name).map { |row| row.first }
|
38
19
|
SELECT DISTINCT hosts_tags.host_id FROM hosts_tags
|
39
20
|
INNER JOIN hosts ON hosts_tags.host_id = hosts.id
|
40
21
|
WHERE LOWER(hosts.name) = LOWER(?);
|
41
22
|
EOS
|
42
|
-
logger.debug("hosts_q3(%s)" % [host_name.inspect])
|
43
|
-
@hosts_q3.execute(host_name).map { |row| row.first }
|
44
23
|
end
|
45
24
|
}.reduce(:+)
|
46
25
|
end
|
@@ -7,20 +7,18 @@ module Hotdog
|
|
7
7
|
module Commands
|
8
8
|
class Search < BaseCommand
|
9
9
|
def run(args=[])
|
10
|
-
application.run_command("init")
|
11
10
|
expression = args.join(" ").strip
|
12
11
|
if expression.empty?
|
13
12
|
exit(1)
|
14
13
|
end
|
15
14
|
|
16
|
-
update_hosts(@options.dup)
|
17
|
-
|
18
15
|
begin
|
19
16
|
node = parse(expression)
|
20
17
|
rescue Parslet::ParseFailed => error
|
21
18
|
STDERR.puts("syntax error: " + error.cause.ascii_tree)
|
22
19
|
exit(1)
|
23
20
|
end
|
21
|
+
|
24
22
|
result = evaluate(node, self).sort
|
25
23
|
if 0 < result.length
|
26
24
|
result, fields = get_hosts(result)
|
data/lib/hotdog/commands/tags.rb
CHANGED
@@ -4,8 +4,6 @@ module Hotdog
|
|
4
4
|
module Commands
|
5
5
|
class Tags < BaseCommand
|
6
6
|
def run(args=[])
|
7
|
-
application.run_command("init")
|
8
|
-
update_tags(@options.dup)
|
9
7
|
if 0 < tags.length
|
10
8
|
fields = tags.map { |tag|
|
11
9
|
tag_name, tag_value = tag.split(":", 2)
|
@@ -13,21 +11,17 @@ module Hotdog
|
|
13
11
|
}
|
14
12
|
result1 = fields.map { |tag_name|
|
15
13
|
if not glob?(tag_name)
|
16
|
-
|
14
|
+
execute(<<-EOS, tag_name).map { |row| row.join(",") }
|
17
15
|
SELECT DISTINCT tags.value FROM hosts_tags
|
18
16
|
INNER JOIN tags ON hosts_tags.tag_id = tags.id
|
19
17
|
WHERE tags.name = LOWER(?);
|
20
18
|
EOS
|
21
|
-
logger.debug("tags_q1(%s)" % [tag_name.inspect])
|
22
|
-
@tags_q1.execute(tag_name).map { |row| row.join(",") }
|
23
19
|
else
|
24
|
-
|
20
|
+
execute(<<-EOS, tag_name).map { |row| row.join(",") }
|
25
21
|
SELECT DISTINCT tags.value FROM hosts_tags
|
26
22
|
INNER JOIN tags ON hosts_tags.tag_id = tags.id
|
27
23
|
WHERE tags.name GLOB LOWER(?);
|
28
24
|
EOS
|
29
|
-
logger.debug("tags_q2(%s)" % [tag_name.inspect])
|
30
|
-
@tags_q2.execute(tag_name).map { |row| row.join(",") }
|
31
25
|
end
|
32
26
|
}
|
33
27
|
result = (0..result1.reduce(0) { |max, values| [max, values.length].max }).map { |field_index|
|
@@ -35,12 +29,10 @@ module Hotdog
|
|
35
29
|
}
|
36
30
|
else
|
37
31
|
fields = ["tag"]
|
38
|
-
|
39
|
-
SELECT tags.name, tags.value FROM hosts_tags
|
32
|
+
result = execute(<<-EOS).map { |name, value| [0 < value.length ? "#{name}:#{value}" : name] }
|
33
|
+
SELECT DISTINCT tags.name, tags.value FROM hosts_tags
|
40
34
|
INNER JOIN tags ON hosts_tags.tag_id = tags.id;
|
41
35
|
EOS
|
42
|
-
logger.debug("tags_q3()")
|
43
|
-
result = @tags_q3.execute().map { |name, value| [0 < value.length ? "#{name}:#{value}" : name] }
|
44
36
|
end
|
45
37
|
if 0 < result.length
|
46
38
|
STDOUT.print(format(result, fields: fields))
|
data/lib/hotdog/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hotdog
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yamashita Yuu
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-01-
|
11
|
+
date: 2015-01-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -97,16 +97,11 @@ files:
|
|
97
97
|
- hotdog.gemspec
|
98
98
|
- lib/hotdog/application.rb
|
99
99
|
- lib/hotdog/commands.rb
|
100
|
-
- lib/hotdog/commands/destroy.rb
|
101
|
-
- lib/hotdog/commands/gc.rb
|
102
100
|
- lib/hotdog/commands/help.rb
|
103
101
|
- lib/hotdog/commands/hosts.rb
|
104
|
-
- lib/hotdog/commands/init.rb
|
105
102
|
- lib/hotdog/commands/ls.rb
|
106
|
-
- lib/hotdog/commands/rm.rb
|
107
103
|
- lib/hotdog/commands/search.rb
|
108
104
|
- lib/hotdog/commands/tags.rb
|
109
|
-
- lib/hotdog/commands/update.rb
|
110
105
|
- lib/hotdog/formatters.rb
|
111
106
|
- lib/hotdog/formatters/json.rb
|
112
107
|
- lib/hotdog/formatters/plain.rb
|
@@ -1,21 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
module Hotdog
|
4
|
-
module Commands
|
5
|
-
class Destroy < BaseCommand
|
6
|
-
def run(args=[])
|
7
|
-
execute(<<-EOS)
|
8
|
-
DROP TABLE IF EXISTS hosts;
|
9
|
-
EOS
|
10
|
-
execute(<<-EOS)
|
11
|
-
DROP TABLE IF EXISTS tags;
|
12
|
-
EOS
|
13
|
-
execute(<<-EOS)
|
14
|
-
DROP TABLE IF EXISTS hosts_tags;
|
15
|
-
EOS
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
# vim:set ft=ruby :
|
data/lib/hotdog/commands/gc.rb
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
module Hotdog
|
4
|
-
module Commands
|
5
|
-
class Gc < BaseCommand
|
6
|
-
def run(args=[])
|
7
|
-
application.run_command("init")
|
8
|
-
execute(<<-EOS)
|
9
|
-
DELETE FROM hosts WHERE id NOT IN ( SELECT DISTINCT host_id FROM hosts_tags );
|
10
|
-
EOS
|
11
|
-
execute(<<-EOS)
|
12
|
-
DELETE FROM tags WHERE id NOT IN ( SELECT DISTINCT tag_id FROM hosts_tags );
|
13
|
-
EOS
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
# vim:set ft=ruby :
|
data/lib/hotdog/commands/init.rb
DELETED
@@ -1,47 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
module Hotdog
|
4
|
-
module Commands
|
5
|
-
class Init < BaseCommand
|
6
|
-
def run(args=[])
|
7
|
-
execute(<<-EOS)
|
8
|
-
CREATE TABLE IF NOT EXISTS hosts (
|
9
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
10
|
-
name VARCHAR(255) NOT NULL
|
11
|
-
);
|
12
|
-
EOS
|
13
|
-
execute(<<-EOS)
|
14
|
-
CREATE UNIQUE INDEX IF NOT EXISTS hosts_name ON hosts ( name );
|
15
|
-
EOS
|
16
|
-
execute(<<-EOS)
|
17
|
-
CREATE TABLE IF NOT EXISTS tags (
|
18
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
19
|
-
name VARCHAR(200) NOT NULL,
|
20
|
-
value VARCHAR(200) NOT NULL DEFAULT ""
|
21
|
-
);
|
22
|
-
EOS
|
23
|
-
execute(<<-EOS)
|
24
|
-
CREATE UNIQUE INDEX IF NOT EXISTS tags_name_value ON tags ( name, value );
|
25
|
-
EOS
|
26
|
-
execute(<<-EOS)
|
27
|
-
CREATE TABLE IF NOT EXISTS hosts_tags (
|
28
|
-
host_id INTEGER NOT NULL,
|
29
|
-
tag_id INTEGER NOT NULL,
|
30
|
-
expires_at INTEGER NOT NULL
|
31
|
-
);
|
32
|
-
EOS
|
33
|
-
execute(<<-EOS)
|
34
|
-
CREATE UNIQUE INDEX IF NOT EXISTS hosts_tags_host_id_tag_id ON hosts_tags ( host_id, tag_id );
|
35
|
-
EOS
|
36
|
-
execute(<<-EOS)
|
37
|
-
CREATE INDEX IF NOT EXISTS hosts_tags_expires_at ON hosts_tags ( expires_at );
|
38
|
-
EOS
|
39
|
-
execute(<<-EOS)
|
40
|
-
CREATE INDEX IF NOT EXISTS hosts_tags_host_id_expires_at ON hosts_tags ( host_id, expires_at );
|
41
|
-
EOS
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
# vim:set ft=ruby :
|
data/lib/hotdog/commands/rm.rb
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
module Hotdog
|
4
|
-
module Commands
|
5
|
-
class Rm < BaseCommand
|
6
|
-
def run(args=[])
|
7
|
-
execute(<<-EOS % args.map { "?" }.join(", "), args).map { |row| row.first }
|
8
|
-
DELETE FROM hosts_tags
|
9
|
-
WHERE host_id IN
|
10
|
-
( SELECT hosts_tags.host_id FROM hosts_tags
|
11
|
-
INNER JOIN hosts ON hosts_tags.host_id = hosts.id
|
12
|
-
WHERE hosts.name NOT IN (%s) );
|
13
|
-
EOS
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
# vim:set ft=ruby :
|
@@ -1,21 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
module Hotdog
|
4
|
-
module Commands
|
5
|
-
class Update < BaseCommand
|
6
|
-
def run(args=[])
|
7
|
-
application.run_command("init")
|
8
|
-
options[:max_time] = -1
|
9
|
-
if 0 < args.length
|
10
|
-
args.each do |host_name|
|
11
|
-
update_host_tags(host_name, @options.dup)
|
12
|
-
end
|
13
|
-
else
|
14
|
-
update_hosts(@options.dup)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
# vim:set ft=ruby :
|