1616
1717import json
1818import sys
19+ import subprocess
1920
2021from vyos .utils .process import cmd
2122from vyos .utils .process import rc_cmd
@@ -32,6 +33,26 @@ def _get_raw_data(command: str) -> list:
3233 data = json .loads (json_data )
3334 return data
3435
36+ def _get_container_log_type (name : str ) -> str :
37+ """
38+ Determines the log type for a given container name by inspecting it.
39+ Returns the log type string.
40+ """
41+ try :
42+ container_info_list = _get_raw_data (f'podman container inspect { name } ' )
43+ if not container_info_list :
44+ raise vyos .opmode .Error (f"Container '{ name } ' not found." )
45+ except Exception as e :
46+ raise vyos .opmode .Error (f"Container '{ name } ' not found." ) from e
47+
48+ container_info = container_info_list [0 ]
49+ log_config = container_info .get ('HostConfig' , {}).get ('LogConfig' , {})
50+ log_type = log_config .get ('Type' )
51+
52+ if not log_type :
53+ raise vyos .opmode .InternalError (f"Could not determine log type for container '{ name } '" )
54+ return log_type
55+
3556def add_image (name : str ):
3657 """ Pull image from container registry. If registry authentication
3758 is defined within VyOS CLI, credentials are used to login befroe pull """
@@ -109,6 +130,39 @@ def restart(name: str):
109130 print (f'Container "{ name } " restarted!' )
110131 return output
111132
133+ def show_log (name : str , follow : bool = False , raw : bool = False ):
134+ """
135+ Show or monitor logs for a specific container.
136+ Use --follow to continuously stream logs.
137+ """
138+ log_type = _get_container_log_type (name )
139+ if log_type == 'k8s-file' :
140+ if follow :
141+ log_command_list = ['sudo' , 'podman' , 'logs' , '--follow' , '--names' , name ]
142+ else :
143+ log_command_list = ['sudo' , 'podman' , 'logs' , '--names' , name ]
144+ if log_type == 'journald' :
145+ if follow :
146+ log_command_list = ['journalctl' , '--follow' , '--unit' , f'vyos-container-{ name } .service' ]
147+ else :
148+ log_command_list = ['journalctl' , '-e' , '--no-pager' , '--unit' , f'vyos-container-{ name } .service' ]
149+
150+ process = None
151+ try :
152+ process = subprocess .Popen (log_command_list ,
153+ stdout = sys .stdout ,
154+ stderr = sys .stderr )
155+ process .wait ()
156+ except KeyboardInterrupt :
157+ if process :
158+ process .terminate ()
159+ process .wait ()
160+ return None
161+ except Exception as e :
162+ raise vyos .opmode .InternalError (f"Error starting logging command: { e } " )
163+ return None
164+
165+
112166if __name__ == '__main__' :
113167 try :
114168 res = vyos .opmode .run (sys .modules [__name__ ])
0 commit comments