16
16
17
17
import json
18
18
import sys
19
+ import subprocess
19
20
20
21
from vyos .utils .process import cmd
21
22
from vyos .utils .process import rc_cmd
@@ -32,6 +33,26 @@ def _get_raw_data(command: str) -> list:
32
33
data = json .loads (json_data )
33
34
return data
34
35
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
+
35
56
def add_image (name : str ):
36
57
""" Pull image from container registry. If registry authentication
37
58
is defined within VyOS CLI, credentials are used to login befroe pull """
@@ -109,6 +130,39 @@ def restart(name: str):
109
130
print (f'Container "{ name } " restarted!' )
110
131
return output
111
132
133
+ def show_log (name : str , follow : bool = False , ** kwargs ):
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
+
112
166
if __name__ == '__main__' :
113
167
try :
114
168
res = vyos .opmode .run (sys .modules [__name__ ])
0 commit comments