/src/wireshark/epan/dissectors/packet-systemd-journal.c
Line | Count | Source |
1 | | /* packet-systemd-journal.c |
2 | | * Routines for systemd journal export (application/vnd.fdo.journal) dissection |
3 | | * Copyright 2018, Gerald Combs <gerald@wireshark.org> |
4 | | * |
5 | | * Wireshark - Network traffic analyzer |
6 | | * By Gerald Combs <gerald@wireshark.org> |
7 | | * Copyright 1998 Gerald Combs |
8 | | * |
9 | | * SPDX-License-Identifier: GPL-2.0-or-later |
10 | | */ |
11 | | |
12 | | /* |
13 | | * Dissector for systemd's mostly-text-based Journal Export Format described |
14 | | * at https://www.freedesktop.org/wiki/Software/systemd/export/. |
15 | | * |
16 | | * Registered MIME type: application/vnd.fdo.journal |
17 | | * |
18 | | * To do: |
19 | | * - Rename systemd_journal to sdjournal? It's easier to type. |
20 | | * - Add an extcap module. |
21 | | * - Add errno strings. |
22 | | * - Pretty-print _CAP_EFFECTIVE |
23 | | * - Handle Journal JSON Format? https://www.freedesktop.org/wiki/Software/systemd/json/ |
24 | | * - Handle raw journal files? https://www.freedesktop.org/wiki/Software/systemd/journal-files/ |
25 | | */ |
26 | | |
27 | | #include <config.h> |
28 | | |
29 | | #include <epan/exceptions.h> |
30 | | #include <epan/packet.h> |
31 | | #include <epan/expert.h> |
32 | | #include <wiretap/wtap.h> |
33 | | #include <wsutil/strtoi.h> |
34 | | #include <wsutil/array.h> |
35 | | |
36 | | #include "packet-syslog.h" |
37 | | |
38 | | void event_register_systemd_journal(void); |
39 | | void event_reg_handoff_systemd_journal(void); |
40 | | |
41 | | /* Initialize the protocol and registered fields */ |
42 | | static int proto_systemd_journal; |
43 | | |
44 | | // Official entries, listed in |
45 | | // https://www.freedesktop.org/software/systemd/man/systemd.journal-fields.html |
46 | | // as of 2018-08. |
47 | | static int hf_sj_message; |
48 | | static int hf_sj_message_id; |
49 | | static int hf_sj_priority; |
50 | | static int hf_sj_code_file; |
51 | | static int hf_sj_code_line; |
52 | | static int hf_sj_code_func; |
53 | | static int hf_sj_errno; |
54 | | static int hf_sj_syslog_facility; |
55 | | static int hf_sj_syslog_identifier; |
56 | | static int hf_sj_syslog_pid; |
57 | | |
58 | | static int hf_sj_pid; |
59 | | static int hf_sj_uid; |
60 | | static int hf_sj_gid; |
61 | | static int hf_sj_comm; |
62 | | static int hf_sj_exe; |
63 | | static int hf_sj_cmdline; |
64 | | static int hf_sj_cap_effective; |
65 | | static int hf_sj_audit_session; |
66 | | static int hf_sj_audit_loginuid; |
67 | | static int hf_sj_systemd_cgroup; |
68 | | static int hf_sj_systemd_slice; |
69 | | static int hf_sj_systemd_unit; |
70 | | static int hf_sj_systemd_user_unit; |
71 | | static int hf_sj_systemd_session; |
72 | | static int hf_sj_systemd_owner_uid; |
73 | | |
74 | | static int hf_sj_selinux_context; |
75 | | static int hf_sj_source_realtime_timestamp; |
76 | | static int hf_sj_boot_id; |
77 | | static int hf_sj_machine_id; |
78 | | static int hf_sj_systemd_invocation_id; |
79 | | static int hf_sj_hostname; |
80 | | static int hf_sj_transport; |
81 | | static int hf_sj_stream_id; |
82 | | static int hf_sj_line_break; |
83 | | |
84 | | static int hf_sj_kernel_device; |
85 | | static int hf_sj_kernel_subsystem; |
86 | | static int hf_sj_udev_sysname; |
87 | | static int hf_sj_udev_devnode; |
88 | | static int hf_sj_udev_devlink; |
89 | | |
90 | | static int hf_sj_coredump_unit; |
91 | | static int hf_sj_coredump_user_unit; |
92 | | static int hf_sj_object_pid; |
93 | | static int hf_sj_object_uid; |
94 | | static int hf_sj_object_gid; |
95 | | static int hf_sj_object_comm; |
96 | | static int hf_sj_object_exe; |
97 | | static int hf_sj_object_cmdline; |
98 | | static int hf_sj_object_audit_session; |
99 | | static int hf_sj_object_audit_loginuid; |
100 | | static int hf_sj_object_cap_effective; |
101 | | static int hf_sj_object_selinux_context; |
102 | | static int hf_sj_object_systemd_cgroup; |
103 | | static int hf_sj_object_systemd_session; |
104 | | static int hf_sj_object_systemd_owner_uid; |
105 | | static int hf_sj_object_systemd_unit; |
106 | | static int hf_sj_object_systemd_user_unit; |
107 | | static int hf_sj_object_systemd_slice; |
108 | | static int hf_sj_object_systemd_user_slice; |
109 | | static int hf_sj_object_systemd_invocation_id; |
110 | | |
111 | | static int hf_sj_cursor; |
112 | | static int hf_sj_realtime_timestamp; |
113 | | static int hf_sj_monotonic_timestamp; |
114 | | |
115 | | // Unofficial(?) fields. Not listed in the documentation but present in logs. |
116 | | static int hf_sj_result; |
117 | | static int hf_sj_source_monotonic_timestamp; |
118 | | static int hf_sj_journal_name; |
119 | | static int hf_sj_journal_path; |
120 | | static int hf_sj_current_use; |
121 | | static int hf_sj_current_use_pretty; |
122 | | static int hf_sj_max_use; |
123 | | static int hf_sj_max_use_pretty; |
124 | | static int hf_sj_disk_keep_free; |
125 | | static int hf_sj_disk_keep_free_pretty; |
126 | | static int hf_sj_disk_available; |
127 | | static int hf_sj_disk_available_pretty; |
128 | | static int hf_sj_limit; |
129 | | static int hf_sj_limit_pretty; |
130 | | static int hf_sj_available; |
131 | | static int hf_sj_available_pretty; |
132 | | static int hf_sj_audit_type; |
133 | | static int hf_sj_audit_id; |
134 | | static int hf_sj_audit_field_apparmor; |
135 | | static int hf_sj_audit_field_operation; |
136 | | static int hf_sj_audit_field_profile; |
137 | | static int hf_sj_audit_field_name; |
138 | | static int hf_sj_seat_id; |
139 | | static int hf_sj_kernel_usec; |
140 | | static int hf_sj_userspace_usec; |
141 | | static int hf_sj_session_id; |
142 | | static int hf_sj_user_id; |
143 | | static int hf_sj_leader; |
144 | | static int hf_sj_job_type; |
145 | | static int hf_sj_job_result; |
146 | | static int hf_sj_user_invocation_id; |
147 | | static int hf_sj_systemd_user_slice; |
148 | | |
149 | | // Metadata. |
150 | | static int hf_sj_binary_data_len; |
151 | | static int hf_sj_unknown_field; |
152 | | static int hf_sj_unknown_field_name; |
153 | | static int hf_sj_unknown_field_value; |
154 | | static int hf_sj_unknown_field_data; |
155 | | static int hf_sj_unhandled_field_type; |
156 | | |
157 | | static expert_field ei_unhandled_field_type; |
158 | | static expert_field ei_nonbinary_field; |
159 | | static expert_field ei_undecoded_field; |
160 | | |
161 | | static dissector_handle_t sje_handle; |
162 | | |
163 | | #define MAX_DATA_SIZE 262144 // WTAP_MAX_PACKET_SIZE_STANDARD. Increase if needed. |
164 | | |
165 | | /* Initialize the subtree pointers */ |
166 | | static int ett_systemd_journal_entry; |
167 | | static int ett_systemd_binary_data; |
168 | | static int ett_systemd_unknown_field; |
169 | | |
170 | | // XXX Use a value_string instead? |
171 | | typedef struct _journal_field_hf_map { |
172 | | int hfid; |
173 | | const char *name; |
174 | | } journal_field_hf_map; |
175 | | |
176 | | static journal_field_hf_map *jf_to_hf; |
177 | | |
178 | 0 | static void init_jf_to_hf_map(void) { |
179 | 0 | journal_field_hf_map jhmap[] = { |
180 | | // Official. |
181 | 0 | { hf_sj_message, "MESSAGE=" }, |
182 | 0 | { hf_sj_message_id, "MESSAGE_ID=" }, |
183 | 0 | { hf_sj_priority, "PRIORITY=" }, |
184 | 0 | { hf_sj_code_file, "CODE_FILE=" }, |
185 | 0 | { hf_sj_code_line, "CODE_LINE=" }, |
186 | 0 | { hf_sj_code_func, "CODE_FUNC=" }, |
187 | 0 | { hf_sj_result, "RESULT=" }, |
188 | 0 | { hf_sj_errno, "ERRNO=" }, |
189 | 0 | { hf_sj_syslog_facility, "SYSLOG_FACILITY=" }, |
190 | 0 | { hf_sj_syslog_identifier, "SYSLOG_IDENTIFIER=" }, |
191 | 0 | { hf_sj_syslog_pid, "SYSLOG_PID=" }, |
192 | |
|
193 | 0 | { hf_sj_pid, "_PID=" }, |
194 | 0 | { hf_sj_uid, "_UID=" }, |
195 | 0 | { hf_sj_gid, "_GID=" }, |
196 | 0 | { hf_sj_comm, "_COMM=" }, |
197 | 0 | { hf_sj_exe, "_EXE=" }, |
198 | 0 | { hf_sj_cmdline, "_CMDLINE=" }, |
199 | 0 | { hf_sj_cap_effective, "_CAP_EFFECTIVE=" }, |
200 | 0 | { hf_sj_audit_session, "_AUDIT_SESSION=" }, |
201 | 0 | { hf_sj_audit_loginuid, "_AUDIT_LOGINUID=" }, |
202 | 0 | { hf_sj_systemd_cgroup, "_SYSTEMD_CGROUP=" }, |
203 | 0 | { hf_sj_systemd_slice, "_SYSTEMD_SLICE=" }, |
204 | 0 | { hf_sj_systemd_unit, "_SYSTEMD_UNIT=" }, |
205 | 0 | { hf_sj_systemd_user_unit, "_SYSTEMD_USER_UNIT=" }, |
206 | 0 | { hf_sj_systemd_session, "_SYSTEMD_SESSION=" }, |
207 | 0 | { hf_sj_systemd_owner_uid, "_SYSTEMD_OWNER_UID=" }, |
208 | |
|
209 | 0 | { hf_sj_selinux_context, "_SELINUX_CONTEXT=" }, |
210 | 0 | { hf_sj_source_realtime_timestamp, "_SOURCE_REALTIME_TIMESTAMP=" }, |
211 | 0 | { hf_sj_source_monotonic_timestamp, "_SOURCE_MONOTONIC_TIMESTAMP=" }, |
212 | 0 | { hf_sj_boot_id, "_BOOT_ID=" }, |
213 | 0 | { hf_sj_machine_id, "_MACHINE_ID=" }, |
214 | 0 | { hf_sj_systemd_invocation_id, "_SYSTEMD_INVOCATION_ID=" }, |
215 | 0 | { hf_sj_hostname, "_HOSTNAME=" }, |
216 | 0 | { hf_sj_transport, "_TRANSPORT=" }, |
217 | 0 | { hf_sj_stream_id, "_STREAM_ID=" }, |
218 | 0 | { hf_sj_line_break, "_LINE_BREAK=" }, |
219 | |
|
220 | 0 | { hf_sj_kernel_device, "_KERNEL_DEVICE=" }, |
221 | 0 | { hf_sj_kernel_subsystem, "_KERNEL_SUBSYSTEM=" }, |
222 | 0 | { hf_sj_udev_sysname, "_UDEV_SYSNAME=" }, |
223 | 0 | { hf_sj_udev_devnode, "_UDEV_DEVNODE=" }, |
224 | 0 | { hf_sj_udev_devlink, "_UDEV_DEVLINK=" }, |
225 | |
|
226 | 0 | { hf_sj_coredump_unit, "COREDUMP_UNIT=" }, |
227 | 0 | { hf_sj_coredump_user_unit, "COREDUMP_USER_UNIT=" }, |
228 | 0 | { hf_sj_object_pid, "OBJECT_PID=" }, |
229 | 0 | { hf_sj_object_uid, "OBJECT_UID=" }, |
230 | 0 | { hf_sj_object_gid, "OBJECT_GID=" }, |
231 | 0 | { hf_sj_object_comm, "OBJECT_COMM=" }, |
232 | 0 | { hf_sj_object_exe, "OBJECT_EXE=" }, |
233 | 0 | { hf_sj_object_cmdline, "OBJECT_CMDLINE=" }, |
234 | 0 | { hf_sj_object_audit_session, "OBJECT_AUDIT_SESSION=" }, |
235 | 0 | { hf_sj_object_audit_loginuid, "OBJECT_AUDIT_LOGINUID=" }, |
236 | 0 | { hf_sj_object_cap_effective, "OBJECT_CAP_EFFECTIVE=" }, |
237 | 0 | { hf_sj_object_selinux_context, "OBJECT_SELINUX_CONTEXT=" }, |
238 | 0 | { hf_sj_object_systemd_cgroup, "OBJECT_SYSTEMD_CGROUP=" }, |
239 | 0 | { hf_sj_object_systemd_session, "OBJECT_SYSTEMD_SESSION=" }, |
240 | 0 | { hf_sj_object_systemd_owner_uid, "OBJECT_SYSTEMD_OWNER_UID=" }, |
241 | 0 | { hf_sj_object_systemd_unit, "OBJECT_SYSTEMD_UNIT=" }, |
242 | 0 | { hf_sj_object_systemd_user_unit, "OBJECT_SYSTEMD_USER_UNIT=" }, |
243 | 0 | { hf_sj_object_systemd_slice, "OBJECT_SYSTEMD_SLICE=" }, |
244 | 0 | { hf_sj_object_systemd_user_slice, "OBJECT_SYSTEMD_USER_SLICE=" }, |
245 | 0 | { hf_sj_object_systemd_invocation_id, "OBJECT_SYSTEMD_INVOCATION_ID=" }, |
246 | |
|
247 | 0 | { hf_sj_cursor, "__CURSOR=" }, |
248 | 0 | { hf_sj_realtime_timestamp, "__REALTIME_TIMESTAMP=" }, |
249 | 0 | { hf_sj_monotonic_timestamp, "__MONOTONIC_TIMESTAMP=" }, |
250 | | |
251 | | // Unofficial? |
252 | 0 | { hf_sj_journal_name, "JOURNAL_NAME=" }, // systemd-journald: Runtime journal (/run/log/journal/) is ... |
253 | 0 | { hf_sj_journal_path, "JOURNAL_PATH=" }, // "" |
254 | 0 | { hf_sj_current_use, "CURRENT_USE=" }, // "" |
255 | 0 | { hf_sj_current_use_pretty, "CURRENT_USE_PRETTY=" }, // "" |
256 | 0 | { hf_sj_max_use, "MAX_USE=" }, // "" |
257 | 0 | { hf_sj_max_use_pretty, "MAX_USE_PRETTY=" }, // "" |
258 | 0 | { hf_sj_disk_keep_free, "DISK_KEEP_FREE=" }, // "" |
259 | 0 | { hf_sj_disk_keep_free_pretty, "DISK_KEEP_FREE_PRETTY=" }, // "" |
260 | 0 | { hf_sj_disk_available, "DISK_AVAILABLE=" }, // "" |
261 | 0 | { hf_sj_disk_available_pretty, "DISK_AVAILABLE_PRETTY=" }, // "" |
262 | 0 | { hf_sj_limit, "LIMIT=" }, // "" |
263 | 0 | { hf_sj_limit_pretty, "LIMIT_PRETTY=" }, // "" |
264 | 0 | { hf_sj_available, "AVAILABLE=" }, // "" |
265 | 0 | { hf_sj_available_pretty, "AVAILABLE_PRETTY=" }, // "" |
266 | 0 | { hf_sj_code_func, "CODE_FUNCTION=" }, // Dup / alias of CODE_FUNC? |
267 | 0 | { hf_sj_systemd_user_unit, "UNIT=" }, // Dup / alias of _SYSTEMD_UNIT? |
268 | 0 | { hf_sj_systemd_user_unit, "USER_UNIT=" }, // Dup / alias of _SYSTEMD_USER_UNIT? |
269 | 0 | { hf_sj_audit_type, "_AUDIT_TYPE=" }, |
270 | 0 | { hf_sj_audit_id, "_AUDIT_ID=" }, |
271 | 0 | { hf_sj_audit_field_apparmor, "_AUDIT_FIELD_APPARMOR=" }, |
272 | 0 | { hf_sj_audit_field_operation, "_AUDIT_FIELD_OPERATION=" }, |
273 | 0 | { hf_sj_audit_field_profile, "_AUDIT_FIELD_PROFILE=" }, |
274 | 0 | { hf_sj_audit_field_name, "_AUDIT_FIELD_NAME=" }, |
275 | 0 | { hf_sj_seat_id, "SEAT_ID=" }, |
276 | 0 | { hf_sj_kernel_usec, "KERNEL_USEC=" }, |
277 | 0 | { hf_sj_userspace_usec, "USERSPACE_USEC=" }, |
278 | 0 | { hf_sj_session_id, "SESSION_ID=" }, |
279 | 0 | { hf_sj_user_id, "USER_ID=" }, |
280 | 0 | { hf_sj_leader, "LEADER=" }, |
281 | 0 | { hf_sj_job_type, "JOB_TYPE=" }, |
282 | 0 | { hf_sj_job_result, "JOB_RESULT=" }, |
283 | 0 | { hf_sj_user_invocation_id, "USER_INVOCATION_ID=" }, |
284 | 0 | { hf_sj_systemd_user_slice, "_SYSTEMD_USER_SLICE=" }, |
285 | 0 | { 0, NULL } |
286 | 0 | }; |
287 | 0 | jf_to_hf = (journal_field_hf_map*) g_memdup2(jhmap, sizeof(jhmap)); |
288 | 0 | } |
289 | | |
290 | | static void |
291 | 0 | dissect_sjle_time_usecs(proto_tree *tree, packet_info* pinfo, int hf_idx, tvbuff_t *tvb, int offset, int len) { |
292 | 0 | uint64_t rt_ts = 0; |
293 | 0 | char *time_str = tvb_format_text(pinfo->pool, tvb, offset, len); |
294 | 0 | bool ok = ws_strtou64(time_str, NULL, &rt_ts); |
295 | 0 | if (ok) { |
296 | 0 | nstime_t ts; |
297 | 0 | ts.secs = (time_t) (rt_ts / 1000000); |
298 | 0 | ts.nsecs = (rt_ts % 1000000) * 1000; |
299 | 0 | proto_tree_add_time(tree, hf_idx, tvb, offset, len, &ts); |
300 | 0 | } else { |
301 | 0 | proto_tree_add_expert_format(tree, NULL, &ei_undecoded_field, tvb, offset, len, "Invalid time value %s", time_str); |
302 | 0 | } |
303 | 0 | } |
304 | | |
305 | | static void |
306 | 0 | dissect_sjle_uint(proto_tree *tree, packet_info* pinfo _U_, int hf_idx, tvbuff_t *tvb, int offset, int len) { |
307 | 0 | uint32_t uint_val; |
308 | 0 | tvb_get_string_uint(tvb, offset, len, ENC_STR_DEC, &uint_val, NULL); |
309 | 0 | proto_tree_add_uint(tree, hf_idx, tvb, offset, len, uint_val); |
310 | 0 | } |
311 | | |
312 | | static void |
313 | 0 | dissect_sjle_int(proto_tree *tree, packet_info* pinfo _U_, int hf_idx, tvbuff_t *tvb, int offset, int len) { |
314 | 0 | int32_t int_val; |
315 | 0 | tvb_get_string_int(tvb, offset, len, ENC_STR_DEC, &int_val, NULL); |
316 | 0 | proto_tree_add_int(tree, hf_idx, tvb, offset, len, int_val); |
317 | 0 | } |
318 | | |
319 | | /* Dissect a line-based journal export entry */ |
320 | | static int |
321 | | dissect_systemd_journal_line_entry(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) |
322 | 0 | { |
323 | 0 | proto_item *ti; |
324 | 0 | proto_tree *sje_tree; |
325 | 0 | unsigned offset = 0, next_offset = 0; |
326 | |
|
327 | 0 | col_set_str(pinfo->cinfo, COL_PROTOCOL, "systemd Journal"); |
328 | 0 | col_clear(pinfo->cinfo, COL_INFO); |
329 | 0 | col_set_str(pinfo->cinfo, COL_INFO, "Journal Entry"); |
330 | |
|
331 | 0 | ti = proto_tree_add_item(tree, proto_systemd_journal, tvb, 0, -1, ENC_NA); |
332 | 0 | sje_tree = proto_item_add_subtree(ti, ett_systemd_journal_entry); |
333 | |
|
334 | 0 | while (tvb_offset_exists(tvb, offset)) { |
335 | 0 | unsigned line_len; |
336 | 0 | tvb_find_line_end_remaining(tvb, offset, &line_len, &next_offset); |
337 | 0 | if (line_len < 3) { |
338 | | // Invalid or zero length. |
339 | | // XXX Add an expert item for non-empty lines. |
340 | 0 | offset = next_offset; |
341 | 0 | continue; |
342 | 0 | } |
343 | 0 | bool found = false; |
344 | 0 | unsigned val_off; |
345 | 0 | if (tvb_find_uint8_length(tvb, offset, line_len, '=', &val_off)) { |
346 | | // Text field. |
347 | | // XXX - We should only need to try the text fields in this case. |
348 | 0 | val_off++; |
349 | 0 | } else { |
350 | 0 | val_off = 0; |
351 | 0 | } |
352 | 0 | unsigned val_len = offset + line_len - val_off; |
353 | |
|
354 | 0 | for (int i = 0; jf_to_hf[i].name; i++) { |
355 | 0 | if (tvb_memeql(tvb, offset, (const uint8_t*) jf_to_hf[i].name, strlen(jf_to_hf[i].name)) == 0) { |
356 | 0 | int hf_idx = jf_to_hf[i].hfid; |
357 | 0 | switch (proto_registrar_get_ftype(hf_idx)) { |
358 | 0 | case FT_ABSOLUTE_TIME: |
359 | 0 | case FT_RELATIVE_TIME: |
360 | 0 | dissect_sjle_time_usecs(sje_tree, pinfo, hf_idx, tvb, val_off, val_len); |
361 | 0 | break; |
362 | 0 | case FT_UINT32: |
363 | 0 | case FT_UINT16: |
364 | 0 | case FT_UINT8: |
365 | 0 | dissect_sjle_uint(sje_tree, pinfo, hf_idx, tvb, val_off, val_len); |
366 | 0 | break; |
367 | 0 | case FT_INT32: |
368 | 0 | case FT_INT16: |
369 | 0 | case FT_INT8: |
370 | 0 | dissect_sjle_int(sje_tree, pinfo, hf_idx, tvb, val_off, val_len); |
371 | 0 | break; |
372 | 0 | case FT_STRING: |
373 | 0 | proto_tree_add_item(sje_tree, jf_to_hf[i].hfid, tvb, val_off, val_len, ENC_UTF_8|ENC_NA); |
374 | 0 | break; |
375 | 0 | default: |
376 | 0 | { |
377 | 0 | proto_item *expert_ti = proto_tree_add_item(sje_tree, hf_sj_unhandled_field_type, tvb, offset, line_len, |
378 | 0 | ENC_UTF_8); |
379 | 0 | expert_add_info(pinfo, expert_ti, &ei_unhandled_field_type); |
380 | 0 | break; |
381 | 0 | } |
382 | 0 | } |
383 | 0 | if (hf_idx == hf_sj_message) { |
384 | 0 | col_clear(pinfo->cinfo, COL_INFO); |
385 | 0 | col_add_str(pinfo->cinfo, COL_INFO, (char *) tvb_get_string_enc(pinfo->pool, tvb, val_off, val_len, ENC_UTF_8)); |
386 | 0 | } |
387 | 0 | found = true; |
388 | 0 | } |
389 | 0 | } |
390 | | |
391 | 0 | if (!found && val_off > offset + 1) { |
392 | 0 | proto_item *unk_ti = proto_tree_add_none_format(sje_tree, hf_sj_unknown_field, tvb, offset, line_len, |
393 | 0 | "Unknown text field: %s", tvb_get_string_enc(pinfo->pool, tvb, offset, val_off - offset - 1, ENC_UTF_8)); |
394 | 0 | proto_tree *unk_tree = proto_item_add_subtree(unk_ti, ett_systemd_unknown_field); |
395 | 0 | proto_tree_add_item(unk_tree, hf_sj_unknown_field_name, tvb, offset, val_off - offset - 1, ENC_UTF_8); |
396 | 0 | proto_tree_add_item(unk_tree, hf_sj_unknown_field_value, tvb, val_off, val_len, ENC_UTF_8); |
397 | 0 | offset = next_offset; |
398 | 0 | continue; |
399 | 0 | } |
400 | | |
401 | | // Try again, looking for binary fields. |
402 | 0 | if (!found) { |
403 | 0 | for (int i = 0; jf_to_hf[i].name; i++) { |
404 | 0 | unsigned noeql_len = (unsigned) strlen(jf_to_hf[i].name) - 1; |
405 | 0 | if (tvb_memeql(tvb, offset, (const uint8_t *) jf_to_hf[i].name, (size_t) noeql_len) == 0 && tvb_memeql(tvb, offset+noeql_len, (const uint8_t *) "\n", 1) == 0) { |
406 | 0 | int hf_idx = jf_to_hf[i].hfid; |
407 | 0 | uint64_t data_len = tvb_get_letoh64(tvb, offset + noeql_len + 1); |
408 | 0 | unsigned data_off = offset + noeql_len + 1 + 8; // \n + data len |
409 | 0 | if (proto_registrar_get_ftype(hf_idx) == FT_STRING) { |
410 | 0 | proto_item *bin_ti = proto_tree_add_item(sje_tree, hf_idx, tvb, data_off, (int) data_len, ENC_UTF_8); |
411 | 0 | proto_tree *bin_tree = proto_item_add_subtree(bin_ti, ett_systemd_binary_data); |
412 | 0 | proto_tree_add_item(bin_tree, hf_sj_binary_data_len, tvb, offset + noeql_len + 1, 8, ENC_LITTLE_ENDIAN); |
413 | 0 | if (hf_idx == hf_sj_message) { |
414 | 0 | col_clear(pinfo->cinfo, COL_INFO); |
415 | 0 | col_add_str(pinfo->cinfo, COL_INFO, tvb_format_text(pinfo->pool, tvb, data_off, (unsigned) data_len)); |
416 | 0 | } |
417 | 0 | } else { |
418 | 0 | proto_item *unk_ti = proto_tree_add_none_format(sje_tree, hf_sj_unknown_field, tvb, offset, line_len, |
419 | 0 | "Unknown data field: %s", tvb_format_text(pinfo->pool, tvb, offset, noeql_len)); |
420 | 0 | proto_tree *unk_tree = proto_item_add_subtree(unk_ti, ett_systemd_unknown_field); |
421 | 0 | proto_item *expert_ti = proto_tree_add_item(unk_tree, hf_sj_unknown_field_name, tvb, offset, noeql_len, ENC_UTF_8); |
422 | 0 | proto_tree_add_item(unk_tree, hf_sj_unknown_field_data, tvb, data_off, (int) data_len, ENC_UTF_8); |
423 | 0 | expert_add_info(pinfo, expert_ti, &ei_nonbinary_field); |
424 | 0 | } |
425 | 0 | if (ckd_add(&next_offset, data_off + 1, data_len)) { |
426 | 0 | next_offset = tvb_reported_length(tvb); |
427 | 0 | } |
428 | 0 | } |
429 | 0 | } |
430 | 0 | } |
431 | 0 | offset = next_offset; |
432 | 0 | } |
433 | | |
434 | 0 | return offset; |
435 | 0 | } |
436 | | |
437 | | /* |
438 | | * Register the protocol with Stratoshark. |
439 | | */ |
440 | | void |
441 | | event_register_systemd_journal(void) |
442 | 0 | { |
443 | 0 | expert_module_t *expert_systemd_journal; |
444 | |
|
445 | 0 | static hf_register_info hf[] = { |
446 | 0 | { &hf_sj_message, |
447 | 0 | { "Message", "systemd_journal.message", |
448 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
449 | 0 | }, |
450 | 0 | { &hf_sj_message_id, |
451 | 0 | { "Message ID", "systemd_journal.message_id", |
452 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
453 | 0 | }, |
454 | 0 | { &hf_sj_priority, |
455 | 0 | { "Priority", "systemd_journal.priority", |
456 | 0 | FT_UINT8, BASE_DEC, VALS(syslog_level_vals), 0x0, NULL, HFILL } |
457 | 0 | }, |
458 | 0 | { &hf_sj_code_file, |
459 | 0 | { "Code file", "systemd_journal.code_file", |
460 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
461 | 0 | }, |
462 | 0 | { &hf_sj_code_line, |
463 | 0 | { "Code line", "systemd_journal.code_line", |
464 | 0 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } |
465 | 0 | }, |
466 | 0 | { &hf_sj_code_func, |
467 | 0 | { "Code func", "systemd_journal.code_func", |
468 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
469 | 0 | }, |
470 | 0 | { &hf_sj_errno, |
471 | 0 | { "Errno", "systemd_journal.errno", |
472 | 0 | FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } |
473 | 0 | }, |
474 | 0 | { &hf_sj_syslog_facility, |
475 | 0 | { "Syslog facility", "systemd_journal.syslog_facility", |
476 | 0 | FT_UINT8, BASE_NONE, VALS(syslog_facility_vals), 0x0, NULL, HFILL } |
477 | 0 | }, |
478 | 0 | { &hf_sj_syslog_identifier, |
479 | 0 | { "Syslog identifier", "systemd_journal.syslog_id", |
480 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
481 | 0 | }, |
482 | 0 | { &hf_sj_syslog_pid, |
483 | 0 | { "Syslog PID", "systemd_journal.syslog_pid", |
484 | 0 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } |
485 | 0 | }, |
486 | |
|
487 | 0 | { &hf_sj_pid, |
488 | 0 | { "PID", "systemd_journal.pid", |
489 | 0 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } |
490 | 0 | }, |
491 | 0 | { &hf_sj_uid, |
492 | 0 | { "UID", "systemd_journal.uid", |
493 | 0 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } |
494 | 0 | }, |
495 | 0 | { &hf_sj_gid, |
496 | 0 | { "GID", "systemd_journal.gid", |
497 | 0 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } |
498 | 0 | }, |
499 | 0 | { &hf_sj_comm, |
500 | 0 | { "Command name", "systemd_journal.comm", |
501 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
502 | 0 | }, |
503 | 0 | { &hf_sj_exe, |
504 | 0 | { "Executable path", "systemd_journal.exe", |
505 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
506 | 0 | }, |
507 | 0 | { &hf_sj_cmdline, |
508 | 0 | { "Command line", "systemd_journal.cmdline", |
509 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
510 | 0 | }, |
511 | 0 | { &hf_sj_cap_effective, |
512 | 0 | { "Effective capability", "systemd_journal.cap_effective", |
513 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
514 | 0 | }, |
515 | 0 | { &hf_sj_audit_session, |
516 | 0 | { "Audit session", "systemd_journal.audit_session", |
517 | 0 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } |
518 | 0 | }, |
519 | 0 | { &hf_sj_audit_loginuid, |
520 | 0 | { "Audit login UID", "systemd_journal.audit_loginuid", |
521 | 0 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } |
522 | 0 | }, |
523 | |
|
524 | 0 | { &hf_sj_systemd_cgroup, |
525 | 0 | { "Systemd cgroup", "systemd_journal.systemd_cgroup", |
526 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
527 | 0 | }, |
528 | 0 | { &hf_sj_systemd_slice, |
529 | 0 | { "Systemd slice", "systemd_journal.systemd_slice", |
530 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
531 | 0 | }, |
532 | 0 | { &hf_sj_systemd_unit, |
533 | 0 | { "Systemd unit", "systemd_journal.systemd_unit", |
534 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
535 | 0 | }, |
536 | 0 | { &hf_sj_systemd_user_unit, |
537 | 0 | { "Systemd user unit", "systemd_journal.systemd_user_unit", |
538 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
539 | 0 | }, |
540 | 0 | { &hf_sj_systemd_session, |
541 | 0 | { "Systemd session", "systemd_journal.systemd_session", |
542 | 0 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } |
543 | 0 | }, |
544 | 0 | { &hf_sj_systemd_owner_uid, |
545 | 0 | { "Systemd owner UID", "systemd_journal.systemd_owner_uid", |
546 | 0 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } |
547 | 0 | }, |
548 | |
|
549 | 0 | { &hf_sj_selinux_context, |
550 | 0 | { "SELinux context", "systemd_journal.selinux_context", |
551 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
552 | 0 | }, |
553 | 0 | { &hf_sj_source_realtime_timestamp, |
554 | 0 | { "Source realtime timestamp", "systemd_journal.source_realtime_timestamp", |
555 | 0 | FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0x0, NULL, HFILL } |
556 | 0 | }, |
557 | 0 | { &hf_sj_boot_id, |
558 | 0 | { "Boot ID", "systemd_journal.boot_id", |
559 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
560 | 0 | }, |
561 | 0 | { &hf_sj_machine_id, |
562 | 0 | { "Machine ID", "systemd_journal.machine_id", |
563 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
564 | 0 | }, |
565 | 0 | { &hf_sj_systemd_invocation_id, |
566 | 0 | { "Systemd invocation ID", "systemd_journal.systemd_invocation_id", |
567 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
568 | 0 | }, |
569 | 0 | { &hf_sj_hostname, |
570 | 0 | { "Hostname", "systemd_journal.hostname", |
571 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
572 | 0 | }, |
573 | 0 | { &hf_sj_transport, |
574 | 0 | { "Transport", "systemd_journal.transport", |
575 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
576 | 0 | }, |
577 | 0 | { &hf_sj_stream_id, |
578 | 0 | { "Stream ID", "systemd_journal.stream_id", |
579 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
580 | 0 | }, |
581 | 0 | { &hf_sj_line_break, |
582 | 0 | { "Line break", "systemd_journal.line_break", |
583 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
584 | 0 | }, |
585 | |
|
586 | 0 | { &hf_sj_kernel_device, |
587 | 0 | { "Kernel device", "systemd_journal.kernel_device", |
588 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
589 | 0 | }, |
590 | 0 | { &hf_sj_kernel_subsystem, |
591 | 0 | { "Kernel subsystem", "systemd_journal.kernel_subsystem", |
592 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
593 | 0 | }, |
594 | 0 | { &hf_sj_udev_sysname, |
595 | 0 | { "Device tree name", "systemd_journal.udev_sysname", |
596 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
597 | 0 | }, |
598 | 0 | { &hf_sj_udev_devnode, |
599 | 0 | { "Device tree node", "systemd_journal.udev_devnode", |
600 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
601 | 0 | }, |
602 | 0 | { &hf_sj_udev_devlink, |
603 | 0 | { "Device tree symlink", "systemd_journal.udev_devlink", |
604 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
605 | 0 | }, |
606 | |
|
607 | 0 | { &hf_sj_coredump_unit, |
608 | 0 | { "Coredump unit", "systemd_journal.coredump_unit", |
609 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
610 | 0 | }, |
611 | 0 | { &hf_sj_coredump_user_unit, |
612 | 0 | { "Coredump user unit", "systemd_journal.coredump_user_unit", |
613 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
614 | 0 | }, |
615 | 0 | { &hf_sj_object_pid, |
616 | 0 | { "Object PID", "systemd_journal.object_pid", |
617 | 0 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } |
618 | 0 | }, |
619 | 0 | { &hf_sj_object_uid, |
620 | 0 | { "Object UID", "systemd_journal.object_uid", |
621 | 0 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } |
622 | 0 | }, |
623 | 0 | { &hf_sj_object_gid, |
624 | 0 | { "Object GID", "systemd_journal.object_gid", |
625 | 0 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } |
626 | 0 | }, |
627 | 0 | { &hf_sj_object_comm, |
628 | 0 | { "Object command name", "systemd_journal.object_comm", |
629 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
630 | 0 | }, |
631 | 0 | { &hf_sj_object_exe, |
632 | 0 | { "Object executable path", "systemd_journal.object_exe", |
633 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
634 | 0 | }, |
635 | 0 | { &hf_sj_object_cmdline, |
636 | 0 | { "Object command line", "systemd_journal.object_cmdline", |
637 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
638 | 0 | }, |
639 | 0 | { &hf_sj_object_audit_session, |
640 | 0 | { "Object audit session", "systemd_journal.object_audit_session", |
641 | 0 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } |
642 | 0 | }, |
643 | 0 | { &hf_sj_object_audit_loginuid, |
644 | 0 | { "Object audit login UID", "systemd_journal.object_audit_loginuid", |
645 | 0 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } |
646 | 0 | }, |
647 | 0 | { &hf_sj_object_cap_effective, |
648 | 0 | { "Object effective capability", "systemd_journal.object_cap_effective", |
649 | 0 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } |
650 | 0 | }, |
651 | 0 | { &hf_sj_object_selinux_context, |
652 | 0 | { "Object SELinux context", "systemd_journal.object_selinux_context", |
653 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
654 | 0 | }, |
655 | 0 | { &hf_sj_object_systemd_cgroup, |
656 | 0 | { "Object systemd cgroup", "systemd_journal.object_systemd_cgroup", |
657 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
658 | 0 | }, |
659 | 0 | { &hf_sj_object_systemd_session, |
660 | 0 | { "Object systemd session", "systemd_journal.object_systemd_session", |
661 | 0 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } |
662 | 0 | }, |
663 | 0 | { &hf_sj_object_systemd_owner_uid, |
664 | 0 | { "Object systemd owner UID", "systemd_journal.object_systemd_owner_uid", |
665 | 0 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } |
666 | 0 | }, |
667 | 0 | { &hf_sj_object_systemd_unit, |
668 | 0 | { "Object systemd unit", "systemd_journal.object_systemd_unit", |
669 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
670 | 0 | }, |
671 | 0 | { &hf_sj_object_systemd_user_unit, |
672 | 0 | { "Object systemd user unit", "systemd_journal.object_systemd_user_unit", |
673 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
674 | 0 | }, |
675 | 0 | { &hf_sj_object_systemd_slice, |
676 | 0 | { "Object systemd slice", "systemd_journal.object_systemd_slice", |
677 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
678 | 0 | }, |
679 | 0 | { &hf_sj_object_systemd_user_slice, |
680 | 0 | { "Object systemd user slice", "systemd_journal.object_systemd_user_slice", |
681 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
682 | 0 | }, |
683 | 0 | { &hf_sj_object_systemd_invocation_id, |
684 | 0 | { "Object systemd invocation ID", "systemd_journal.object_systemd_invocation_id", |
685 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
686 | 0 | }, |
687 | |
|
688 | 0 | { &hf_sj_cursor, |
689 | 0 | { "Cursor", "systemd_journal.cursor", |
690 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
691 | 0 | }, |
692 | 0 | { &hf_sj_realtime_timestamp, |
693 | 0 | { "Realtime Timestamp", "systemd_journal.realtime_timestamp", |
694 | 0 | FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0x0, NULL, HFILL } |
695 | 0 | }, |
696 | 0 | { &hf_sj_monotonic_timestamp, |
697 | 0 | { "Monotonic Timestamp", "systemd_journal.monotonic_timestamp", |
698 | 0 | FT_RELATIVE_TIME, BASE_NONE, NULL, 0x0, NULL, HFILL } |
699 | 0 | }, |
700 | |
|
701 | 0 | { &hf_sj_journal_name, |
702 | 0 | { "Journal name", "systemd_journal.journal_name", |
703 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
704 | 0 | }, |
705 | 0 | { &hf_sj_journal_path, |
706 | 0 | { "Journal path", "systemd_journal.journal_path", |
707 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
708 | 0 | }, |
709 | 0 | { &hf_sj_current_use, |
710 | 0 | { "Current use", "systemd_journal.current_use", |
711 | 0 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } |
712 | 0 | }, |
713 | 0 | { &hf_sj_current_use_pretty, |
714 | 0 | { "Human readable current use", "systemd_journal.current_use_pretty", |
715 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
716 | 0 | }, |
717 | 0 | { &hf_sj_max_use, |
718 | 0 | { "Max use", "systemd_journal.max_use", |
719 | 0 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } |
720 | 0 | }, |
721 | 0 | { &hf_sj_max_use_pretty, |
722 | 0 | { "Human readable max use", "systemd_journal.max_use_pretty", |
723 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
724 | 0 | }, |
725 | 0 | { &hf_sj_disk_keep_free, |
726 | 0 | { "Disk keep free", "systemd_journal.disk_keep_free", |
727 | 0 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } |
728 | 0 | }, |
729 | 0 | { &hf_sj_disk_keep_free_pretty, |
730 | 0 | { "Human readable disk keep free", "systemd_journal.disk_keep_free_pretty", |
731 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
732 | 0 | }, |
733 | 0 | { &hf_sj_disk_available, |
734 | 0 | { "Disk available", "systemd_journal.disk_available", |
735 | 0 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } |
736 | 0 | }, |
737 | 0 | { &hf_sj_disk_available_pretty, |
738 | 0 | { "Human readable disk available", "systemd_journal.disk_available_pretty", |
739 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
740 | 0 | }, |
741 | 0 | { &hf_sj_limit, |
742 | 0 | { "Limit", "systemd_journal.limit", |
743 | 0 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } |
744 | 0 | }, |
745 | 0 | { &hf_sj_limit_pretty, |
746 | 0 | { "Human readable limit", "systemd_journal.limit_pretty", |
747 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
748 | 0 | }, |
749 | 0 | { &hf_sj_available, |
750 | 0 | { "Available", "systemd_journal.available", |
751 | 0 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } |
752 | 0 | }, |
753 | 0 | { &hf_sj_available_pretty, |
754 | 0 | { "Human readable available", "systemd_journal.available_pretty", |
755 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
756 | 0 | }, |
757 | 0 | { &hf_sj_result, |
758 | 0 | { "Result", "systemd_journal.result", |
759 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
760 | 0 | }, |
761 | 0 | { &hf_sj_source_monotonic_timestamp, |
762 | 0 | { "Source monotonic timestamp", "systemd_journal.source_monotonic_timestamp", |
763 | 0 | FT_RELATIVE_TIME, BASE_NONE, NULL, 0x0, NULL, HFILL } |
764 | 0 | }, |
765 | 0 | { &hf_sj_audit_type, |
766 | 0 | { "Audit type", "systemd_journal.audit_type", |
767 | 0 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } |
768 | 0 | }, |
769 | 0 | { &hf_sj_audit_id, |
770 | 0 | { "Audit ID", "systemd_journal.audit_id", |
771 | 0 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } |
772 | 0 | }, |
773 | 0 | { &hf_sj_audit_field_apparmor, |
774 | 0 | { "Audit field AppArmor", "systemd_journal.audit_field_apparmor", |
775 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
776 | 0 | }, |
777 | 0 | { &hf_sj_audit_field_operation, |
778 | 0 | { "Audit field operation", "systemd_journal.audit_field_operation", |
779 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
780 | 0 | }, |
781 | 0 | { &hf_sj_audit_field_profile, |
782 | 0 | { "Audit field profile", "systemd_journal.audit_field_profile", |
783 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
784 | 0 | }, |
785 | 0 | { &hf_sj_audit_field_name, |
786 | 0 | { "Audit field name", "systemd_journal.audit_field_name", |
787 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
788 | 0 | }, |
789 | 0 | { &hf_sj_seat_id, |
790 | 0 | { "Seat ID", "systemd_journal.seat_id", |
791 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
792 | 0 | }, |
793 | 0 | { &hf_sj_kernel_usec, |
794 | 0 | { "Kernel microseconds", "systemd_journal.kernel_usec", |
795 | 0 | FT_RELATIVE_TIME, BASE_NONE, NULL, 0x0, NULL, HFILL } |
796 | 0 | }, |
797 | 0 | { &hf_sj_userspace_usec, |
798 | 0 | { "Userspace microseconds", "systemd_journal.userspace_usec", |
799 | 0 | FT_RELATIVE_TIME, BASE_NONE, NULL, 0x0, NULL, HFILL } |
800 | 0 | }, |
801 | 0 | { &hf_sj_session_id, |
802 | 0 | { "Session ID", "systemd_journal.session_id", |
803 | 0 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } |
804 | 0 | }, |
805 | 0 | { &hf_sj_user_id, |
806 | 0 | { "User ID", "systemd_journal.user_id", |
807 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
808 | 0 | }, |
809 | 0 | { &hf_sj_leader, |
810 | 0 | { "Leader", "systemd_journal.leader", |
811 | 0 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } |
812 | 0 | }, |
813 | 0 | { &hf_sj_job_type, |
814 | 0 | { "Job type", "systemd_journal.job_type", |
815 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
816 | 0 | }, |
817 | 0 | { &hf_sj_job_result, |
818 | 0 | { "Job result", "systemd_journal.job_result", |
819 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
820 | 0 | }, |
821 | 0 | { &hf_sj_user_invocation_id, |
822 | 0 | { "User invocation ID", "systemd_journal.user_invocation_id", |
823 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
824 | 0 | }, |
825 | 0 | { &hf_sj_systemd_user_slice, |
826 | 0 | { "Systemd user slice", "systemd_journal.systemd_user_slice", |
827 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
828 | 0 | }, |
829 | |
|
830 | 0 | { &hf_sj_binary_data_len, |
831 | 0 | { "Binary data length", "systemd_journal.binary_data_len", |
832 | 0 | FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } |
833 | 0 | }, |
834 | 0 | { &hf_sj_unknown_field, |
835 | 0 | { "Unknown field", "systemd_journal.field", |
836 | 0 | FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } |
837 | 0 | }, |
838 | 0 | { &hf_sj_unknown_field_name, |
839 | 0 | { "Field name", "systemd_journal.field.name", |
840 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
841 | 0 | }, |
842 | 0 | { &hf_sj_unknown_field_value, |
843 | 0 | { "Field value", "systemd_journal.field.value", |
844 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
845 | 0 | }, |
846 | 0 | { &hf_sj_unknown_field_data, |
847 | 0 | { "Field data", "systemd_journal.field.data", |
848 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
849 | 0 | }, |
850 | 0 | { &hf_sj_unhandled_field_type, |
851 | 0 | { "Field data", "systemd_journal.unhandled_field_type", |
852 | 0 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } |
853 | 0 | } |
854 | 0 | }; |
855 | | |
856 | | /* Setup protocol subtree array */ |
857 | 0 | static int *ett[] = { |
858 | 0 | &ett_systemd_journal_entry, |
859 | 0 | &ett_systemd_binary_data, |
860 | 0 | &ett_systemd_unknown_field |
861 | 0 | }; |
862 | | |
863 | | /* Setup protocol expert items */ |
864 | 0 | static ei_register_info ei[] = { |
865 | 0 | { &ei_unhandled_field_type, |
866 | 0 | { "systemd_journal.unhandled_field_type.undecoded", PI_UNDECODED, PI_ERROR, |
867 | 0 | "Unhandled field type", EXPFILL } |
868 | 0 | }, |
869 | 0 | { &ei_nonbinary_field, |
870 | 0 | { "systemd_journal.nonbinary_field", PI_UNDECODED, PI_WARN, |
871 | 0 | "Field shouldn't be binary", EXPFILL } |
872 | 0 | }, |
873 | 0 | { &ei_undecoded_field, |
874 | 0 | { "systemd_journal.undecoded_field", PI_UNDECODED, PI_WARN, |
875 | 0 | "Unable to decode field", EXPFILL } |
876 | 0 | } |
877 | 0 | }; |
878 | | |
879 | | /* Register the protocol name and description */ |
880 | 0 | proto_systemd_journal = proto_register_protocol("systemd Journal Entry", "systemd Journal", "systemd_journal"); |
881 | | |
882 | | /* Required function calls to register the header fields and subtrees */ |
883 | 0 | proto_register_field_array(proto_systemd_journal, hf, array_length(hf)); |
884 | 0 | proto_register_subtree_array(ett, array_length(ett)); |
885 | | |
886 | | /* Required function calls to register expert items */ |
887 | 0 | expert_systemd_journal = expert_register_protocol(proto_systemd_journal); |
888 | 0 | expert_register_field_array(expert_systemd_journal, ei, array_length(ei)); |
889 | |
|
890 | 0 | sje_handle = register_dissector("systemd_journal", dissect_systemd_journal_line_entry, |
891 | 0 | proto_systemd_journal); |
892 | |
|
893 | 0 | init_jf_to_hf_map(); |
894 | 0 | } |
895 | | |
896 | 0 | #define BLOCK_TYPE_SYSTEMD_JOURNAL_EXPORT 0x0000009 |
897 | | |
898 | | void |
899 | | event_reg_handoff_systemd_journal(void) |
900 | 0 | { |
901 | 0 | int file_type_subtype_systemd_journal; |
902 | |
|
903 | 0 | file_type_subtype_systemd_journal = wtap_name_to_file_type_subtype("systemd_journal"); |
904 | 0 | if (file_type_subtype_systemd_journal != -1) |
905 | 0 | dissector_add_uint("wtap_fts_rec", file_type_subtype_systemd_journal, sje_handle); |
906 | 0 | dissector_add_uint("pcapng.block_type", BLOCK_TYPE_SYSTEMD_JOURNAL_EXPORT, sje_handle); |
907 | | // It's possible to ship journal entries over HTTP/HTTPS using |
908 | | // systemd-journal-remote. Dissecting them on the wire isn't very |
909 | | // useful since it's easy to end up with a packet containing a |
910 | | // single, huge reassembled journal with many entries. |
911 | 0 | dissector_add_string("media_type", "application/vnd.fdo.journal", sje_handle); |
912 | 0 | } |
913 | | |
914 | | /* |
915 | | * Editor modelines - https://www.wireshark.org/tools/modelines.html |
916 | | * |
917 | | * Local variables: |
918 | | * c-basic-offset: 4 |
919 | | * tab-width: 8 |
920 | | * indent-tabs-mode: nil |
921 | | * End: |
922 | | * |
923 | | * vi: set shiftwidth=4 tabstop=8 expandtab: |
924 | | * :indentSize=4:tabSize=8:noTabs=true: |
925 | | */ |