@@ -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
454519end
455520
456521class ServiceEnableCmd < CmdParse ::Command
0 commit comments