Skip to content

Commit 3574d29

Browse files
authored
Release 3.3.0
2 parents eee86fa + de70a6e commit 3574d29

2 files changed

Lines changed: 131 additions & 66 deletions

File tree

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3.2.0
1+
3.3.0

resources/lib/service.rb

Lines changed: 130 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -208,24 +208,26 @@ def execute()
208208

209209
# Paint service list
210210
if $parser.data[:show_runtime] && $parser.data[:show_memory]
211-
printf("=========================================== Services ===========================================\n")
212-
printf("%-33s %-33s %-20s%-10s\n", "Service", "Status(#{node_name})", "Runtime", "Memory")
213-
printf("------------------------------------------------------------------------------------------------\n")
211+
printf("=========================================== Services =====================================================\n")
212+
printf("%-33s %-33s %-15s %-10s %-33s\n", "Service", "Status(#{node_name})", "Runtime", "Memory", "Cgroup")
213+
printf("----------------------------------------------------------------------------------------------------------\n")
214214
elsif $parser.data[:show_runtime]
215-
printf("================================= Services ==================================\n")
216-
printf("%-33s %-33s %-10s\n", "Service", "Status(#{node_name})", "Runtime")
217-
printf("-----------------------------------------------------------------------------\n")
215+
printf("================================= Services =========================================\n")
216+
printf("%-33s %-33s %-10s %-33s\n", "Service", "Status(#{node_name})", "Runtime", "Cgroup")
217+
printf("------------------------------------------------------------------------------------\n")
218218
elsif $parser.data[:show_memory]
219-
printf("================================= Services ==================================\n")
220-
printf("%-33s %-33s %-10s\n", "Service", "Status(#{node_name})", "Memory")
221-
printf("-----------------------------------------------------------------------------\n")
219+
printf("================================= Services ========================================\n")
220+
printf("%-33s %-33s %-10s %-33s\n", "Service", "Status(#{node_name})", "Memory", "Cgroup")
221+
printf("-----------------------------------------------------------------------------------\n")
222222
else
223223
printf("=========================== Services ============================\n")
224224
printf("%-33s %-10s\n", "Service", "Status(#{node_name})")
225225
printf("-----------------------------------------------------------------\n")
226226
end
227227

228228
services.uniq.sort.each do |systemd_service, enabled|
229+
cgroup = get_cgroup(systemd_service) || "N/A"
230+
229231
if systemd_service == 'snort3' # Special check for intrusion sensor
230232
status_output = `service snort3 status 2>/dev/null`
231233
if $?.success?
@@ -235,14 +237,14 @@ def execute()
235237
snort_processes = `ps aux | grep snort | grep -v grep`
236238
runtimes = []
237239
total_rss_kb = 0
238-
240+
239241
snort_processes.each_line do |line|
240242
parts = line.split
241243
next unless parts.size >= 6
242-
244+
243245
rss_kb = parts[5].to_i
244246
total_rss_kb += rss_kb
245-
247+
246248
pid = parts[1]
247249
etime = `ps -p #{pid} -o etime=`.strip
248250
if etime =~ /^(\d+)-(\d+):(\d+):/
@@ -261,132 +263,168 @@ def execute()
261263
runtimes << etime
262264
end
263265
end
264-
memory_used = if total_rss_kb > 0
265-
kb = total_rss_kb
266-
if kb > 1048576
267-
"#{(kb / 1024.0 / 1024.0).round(2)}G"
268-
elsif kb > 1024
269-
"#{(kb / 1024.0).round(2)}M"
270-
else
271-
"#{kb}K"
272-
end
273-
else
274-
"0B"
275-
end
266+
267+
memory_used =
268+
if total_rss_kb > 0
269+
kb = total_rss_kb
270+
if kb > 1_048_576
271+
"#{(kb / 1024.0 / 1024.0).round(2)}G"
272+
elsif kb > 1024
273+
"#{(kb / 1024.0).round(2)}M"
274+
else
275+
"#{kb}K"
276+
end
277+
else
278+
"0B"
279+
end
280+
276281
runtime = runtimes.min || "N/A"
277-
total_memory += total_rss_kb * 1024 # in bytes
282+
total_memory += total_rss_kb * 1024 # bytes
283+
278284
if $parser.data[:show_runtime] && $parser.data[:show_memory]
279285
if runtime.match?(/^\d+\s*s/)
280-
printf("%-33s #{green}%-33s#{reset}#{blink}%-20s#{reset} %-10s\n", "#{systemd_service}:", ret, runtime, memory_used)
286+
printf("%-33s #{green}%-33s#{reset} #{blink}%-15s#{reset} %-10s %-25s\n",
287+
"#{systemd_service}:", ret, runtime, memory_used, cgroup)
281288
else
282-
printf("%-33s #{green}%-33s#{reset}%-20s %-10s\n", "#{systemd_service}:", ret, runtime, memory_used)
289+
printf("%-33s #{green}%-33s#{reset} %-15s %-10s %-25s\n",
290+
"#{systemd_service}:", ret, runtime, memory_used, cgroup)
283291
end
284292
elsif $parser.data[:show_runtime]
285293
if runtime.match?(/^\d+\s*s/)
286-
printf("%-33s #{green}%-33s#{reset}#{blink}%-10s#{reset}\n", "#{systemd_service}:", ret, runtime)
294+
printf("%-33s #{green}%-33s#{reset} #{blink}%-15s#{reset} %-25s\n",
295+
"#{systemd_service}:", ret, runtime, cgroup)
287296
else
288-
printf("%-33s #{green}%-33s#{reset}%-10s\n", "#{systemd_service}:", ret, runtime)
297+
printf("%-33s #{green}%-33s#{reset} %-15s %-25s\n",
298+
"#{systemd_service}:", ret, runtime, cgroup)
289299
end
290300
elsif $parser.data[:show_memory]
291-
printf("%-33s #{green}%-33s#{reset}%-10s\n", "#{systemd_service}:", ret, memory_used)
301+
printf("%-33s #{green}%-33s#{reset} %-10s %-25s\n",
302+
"#{systemd_service}:", ret, memory_used, cgroup)
292303
else
293-
printf("%-33s #{green}%-10s#{reset}\n", "#{systemd_service}:", ret)
304+
printf("%-33s #{green}%-33s#{reset} %-25s\n",
305+
"#{systemd_service}:", ret, cgroup)
294306
end
295307
else
296308
ret = "not running!!"
297309
errors += 1
298310
runtime = "N/A"
299311
memory_used = "0B"
312+
300313
if $parser.data[:show_runtime] && $parser.data[:show_memory]
301-
printf("%-33s #{red}%-33s#{reset}%-20s %-10s\n", "#{systemd_service}:", ret, runtime, memory_used)
314+
printf("%-33s #{red}%-33s#{reset} %-15s %-10s %-25s\n",
315+
"#{systemd_service}:", ret, runtime, memory_used, cgroup)
302316
elsif $parser.data[:show_runtime]
303-
printf("%-33s #{red}%-33s#{reset}%-10s\n", "#{systemd_service}:", ret, runtime)
317+
printf("%-33s #{red}%-33s#{reset} %-15s %-25s\n",
318+
"#{systemd_service}:", ret, runtime, cgroup)
304319
elsif $parser.data[:show_memory]
305-
printf("%-33s #{red}%-33s#{reset}%-10s\n", "#{systemd_service}:", ret, memory_used)
320+
printf("%-33s #{red}%-33s#{reset} %-10s %-25s\n",
321+
"#{systemd_service}:", ret, memory_used, cgroup)
306322
else
307-
printf("%-33s #{red}%-10s#{reset}\n", "#{systemd_service}:", ret)
323+
printf("%-33s #{red}%-33s#{reset} %-25s\n",
324+
"#{systemd_service}:", ret, cgroup)
308325
end
309326
end
327+
310328
elsif system("systemctl status #{systemd_service} &>/dev/null")
311329
ret = "running"
312-
running = running + 1
330+
running += 1
313331

314332
runtime = `systemctl status #{systemd_service} | grep 'Active:' | awk '{for(i=9;i<=NF;i++) printf $i " "; print ""}'`.strip
315333
memory_used = `systemctl status #{systemd_service} | grep 'Memory:' | sed 's/.*Memory:[[:space:]]*//'`.strip
334+
memory_used = memory_used = '0B' if memory_used.to_s.empty?
316335
total_memory += parse_memory_to_bytes(memory_used)
317336

318337
if $parser.data[:show_runtime] && $parser.data[:show_memory]
319-
# Blink when runtime is less than a minute
320338
if runtime.match?(/^\d+\s*s/)
321-
printf("%-33s #{green}%-33s#{reset}#{blink}%-20s#{reset} %-10s\n", "#{systemd_service}:", ret, runtime, memory_used)
339+
printf("%-33s #{green}%-33s#{reset} #{blink}%-15s#{reset} %-10s %-25s\n",
340+
"#{systemd_service}:", ret, runtime, memory_used, cgroup)
322341
else
323-
printf("%-33s #{green}%-33s#{reset}%-20s %-10s\n", "#{systemd_service}:", ret, runtime, memory_used)
342+
printf("%-33s #{green}%-33s#{reset} %-15s %-10s %-25s\n",
343+
"#{systemd_service}:", ret, runtime, memory_used, cgroup)
324344
end
325345
elsif $parser.data[:show_runtime]
326-
# Blink when runtime is less than a minute
327346
if runtime.match?(/^\d+\s*s/)
328-
printf("%-33s #{green}%-33s#{reset}#{blink}%-10s#{reset}\n", "#{systemd_service}:", ret, runtime)
347+
printf("%-33s #{green}%-33s#{reset} #{blink}%-15s#{reset} %-25s\n",
348+
"#{systemd_service}:", ret, runtime, cgroup)
329349
else
330-
printf("%-33s #{green}%-33s#{reset}%-10s\n", "#{systemd_service}:", ret, runtime)
350+
printf("%-33s #{green}%-33s#{reset} %-15s %-25s\n",
351+
"#{systemd_service}:", ret, runtime, cgroup)
331352
end
332353
elsif $parser.data[:show_memory]
333-
printf("%-33s #{green}%-33s#{reset}%-10s\n", "#{systemd_service}:", ret, memory_used)
354+
printf("%-33s #{green}%-33s#{reset} %-10s %-25s\n",
355+
"#{systemd_service}:", ret, memory_used, cgroup)
334356
else
335-
printf("%-33s #{green}%-10s#{reset}\n", "#{systemd_service}:", ret)
357+
printf("%-33s #{green}%-33s#{reset} %-25s\n",
358+
"#{systemd_service}:", ret, cgroup)
336359
end
360+
337361
elsif !enabled
338362
ret = "not running"
339-
stopped = stopped + 1
363+
stopped += 1
340364
runtime = "N/A"
341365
memory_used = "0B"
342366

343367
if $parser.data[:show_runtime] && $parser.data[:show_memory]
344-
printf("%-33s #{yellow}%-33s#{reset}%-20s %-10s\n", "#{systemd_service}:", ret, runtime, memory_used)
368+
printf("%-33s #{yellow}%-33s#{reset} %-15s %-10s %-25s\n",
369+
"#{systemd_service}:", ret, runtime, memory_used, cgroup)
345370
elsif $parser.data[:show_runtime]
346-
printf("%-33s #{yellow}%-33s#{reset}%-10s\n", "#{systemd_service}:", ret, runtime)
371+
printf("%-33s #{yellow}%-33s#{reset} %-15s %-25s\n",
372+
"#{systemd_service}:", ret, runtime, cgroup)
347373
elsif $parser.data[:show_memory]
348-
printf("%-33s #{yellow}%-33s#{reset}%-10s\n", "#{systemd_service}:", ret, memory_used)
374+
printf("%-33s #{yellow}%-33s#{reset} %-10s %-25s\n",
375+
"#{systemd_service}:", ret, memory_used, cgroup)
349376
else
350-
printf("%-33s #{yellow}%-10s#{reset}\n", "#{systemd_service}:", ret)
377+
printf("%-33s #{yellow}%-33s#{reset} %-25s\n",
378+
"#{systemd_service}:", ret, cgroup)
351379
end
380+
352381
elsif (external_services.include?(systemd_service) && external_services[systemd_service] == "external") ||
353-
(systemd_service == 'minio' && external_services.include?('s3') && external_services['s3'] == 'external')
382+
(systemd_service == 'minio' && external_services.include?('s3') && external_services['s3'] == 'external')
354383
ret = "external"
355-
external = external + 1
384+
external += 1
356385
runtime = "N/A"
357386
memory_used = "0B"
358387

359388
if $parser.data[:show_runtime] && $parser.data[:show_memory]
360-
printf("%-33s #{blue}%-33s#{reset}%-20s %-10s\n", "#{systemd_service}:", ret, runtime, memory_used)
389+
printf("%-33s #{blue}%-33s#{reset} %-15s %-10s %-25s\n",
390+
"#{systemd_service}:", ret, runtime, memory_used, cgroup)
361391
elsif $parser.data[:show_runtime]
362-
printf("%-33s #{blue}%-33s#{reset}%-10s\n", "#{systemd_service}:", ret, runtime)
392+
printf("%-33s #{blue}%-33s#{reset} %-15s %-25s\n",
393+
"#{systemd_service}:", ret, runtime, cgroup)
363394
elsif $parser.data[:show_memory]
364-
printf("%-33s #{blue}%-33s#{reset}%-10s\n", "#{systemd_service}:", ret, memory_used)
395+
printf("%-33s #{blue}%-33s#{reset} %-10s %-25s\n",
396+
"#{systemd_service}:", ret, memory_used, cgroup)
365397
else
366-
printf("%-33s #{blue}%-10s#{reset}\n", "#{systemd_service}:", ret)
398+
printf("%-33s #{blue}%-33s#{reset} %-25s\n",
399+
"#{systemd_service}:", ret, cgroup)
367400
end
401+
368402
else
369403
ret = "not running!!"
370-
errors = errors + 1
404+
errors += 1
371405
runtime = "N/A"
372406
memory_used = "0B"
373407

374408
if $parser.data[:show_runtime] && $parser.data[:show_memory]
375-
printf("%-33s #{red}%-33s#{reset}%-20s %-10s\n", "#{systemd_service}:", ret, runtime, memory_used)
409+
printf("%-33s #{red}%-33s#{reset} %-15s %-10s %-25s\n",
410+
"#{systemd_service}:", ret, runtime, memory_used, cgroup)
376411
elsif $parser.data[:show_runtime]
377-
printf("%-33s #{red}%-33s#{reset}%-10s\n", "#{systemd_service}:", ret, runtime)
412+
printf("%-33s #{red}%-33s#{reset} %-15s %-25s\n",
413+
"#{systemd_service}:", ret, runtime, cgroup)
378414
elsif $parser.data[:show_memory]
379-
printf("%-33s #{red}%-33s#{reset}%-10s\n", "#{systemd_service}:", ret, memory_used)
415+
printf("%-33s #{red}%-33s#{reset} %-10s %-25s\n",
416+
"#{systemd_service}:", ret, memory_used, cgroup)
380417
else
381-
printf("%-33s #{red}%-10s#{reset}\n", "#{systemd_service}:", ret)
418+
printf("%-33s #{red}%-33s#{reset} %-25s\n",
419+
"#{systemd_service}:", ret, cgroup)
382420
end
383421
end
384422
end
385423

386424
if $parser.data[:show_runtime] && $parser.data[:show_memory]
387-
printf("------------------------------------------------------------------------------------------------\n")
425+
printf("----------------------------------------------------------------------------------------------------------\n")
388426
elsif $parser.data[:show_runtime] || $parser.data[:show_memory]
389-
printf("-----------------------------------------------------------------------------\n")
427+
printf("------------------------------------------------------------------------------------\n")
390428
else
391429
printf("-----------------------------------------------------------------\n")
392430
end
@@ -413,12 +451,12 @@ def execute()
413451
end
414452

415453
if $parser.data[:show_runtime] && $parser.data[:show_memory]
416-
printf("------------------------------------------------------------------------------------------------\n")
454+
printf("----------------------------------------------------------------------------------------------------------\n")
417455
elsif $parser.data[:show_runtime] || $parser.data[:show_memory]
418-
printf("-----------------------------------------------------------------------------\n")
456+
printf("------------------------------------------------------------------------------------\n")
419457
else
420458
printf("-----------------------------------------------------------------\n")
421-
end
459+
end
422460
printf("Running: #{running} / Stopped: #{stopped} / External: #{external} / Errors: #{errors}\n\n")
423461
manager_node = utils.get_node(node_name)
424462
if manager_node
@@ -451,6 +489,33 @@ def parse_memory_to_bytes(memory_str)
451489
0
452490
end
453491
end
492+
493+
# Return cgroup path for a systemd unit, or nil if unknown
494+
def get_cgroup(unit)
495+
# Normalize unit name
496+
unit = unit.include?('.') ? unit : "#{unit}.service"
497+
498+
if unit == "snort3.service"
499+
pid = `pgrep -o snort`.strip
500+
return "N/A" if pid.empty?
501+
502+
path = "/proc/#{pid}/cgroup"
503+
return "N/A" unless File.exist?(path)
504+
505+
# Read cgroup file and find the slice
506+
cg_lines = File.read(path).split("\n")
507+
slices = cg_lines.map { |l| l.split(":").last.split("/") }.flatten.select { |p| p.end_with?(".slice") }
508+
slice = slices.last
509+
return slice || "N/A"
510+
end
511+
512+
cg = `systemctl show #{unit} -p ControlGroup --value 2>/dev/null`.strip
513+
return "N/A" if cg.empty?
514+
515+
parts = cg.split('/')
516+
slice = parts.find { |p| p.end_with?('.slice') }
517+
slice || cg || "N/A"
518+
end
454519
end
455520

456521
class ServiceEnableCmd < CmdParse::Command

0 commit comments

Comments
 (0)