blob: a7f209ecaf2d7b1f28164ebb4b538abeaa622560 [file] [log] [blame]
Sui Chenb53fa1b2022-05-26 00:16:42 -07001const { ipcRenderer } = require('electron');
Sui Chenb65280f2020-06-30 18:14:03 -07002const { spawnSync } = require('child_process');
3const md5File = require('md5-file');
4const https = require('https');
5
Sui Chenb53fa1b2022-05-26 00:16:42 -07006ipcRenderer.on('filename', (event, x) => {
Sui Chenb65280f2020-06-30 18:14:03 -07007 // Determine file type
8 let is_asio_log = false;
9 const data = fs.readFileSync(x, {encoding: 'utf-8'});
10 let lines = data.split('\n');
11 for (let i = 0; i < lines.length; i++) {
12 if (lines[i].indexOf('@asio') == 0) {
13 is_asio_log = true;
14 break;
15 }
16 }
17
18 if (is_asio_log) {
19 ShowBlocker('Loading Boost ASIO handler tracking log');
20 console.log('This file is a Boost Asio handler tracking log');
21 ParseBoostHandlerTimeline(data);
22 OnGroupByConditionChanged_ASIO();
23 if (boost_asio_handler_timeline_view.IsEmpty() == false) {
24 boost_asio_handler_timeline_view.CurrentFileName = x;
25 HideWelcomeScreen();
26 ShowASIOTimeline();
27 ShowNavigation();
28 UpdateFileNamesString();
29 }
30 HideBlocker();
31 return;
32 }
33
34 OpenDBusPcapFile(x);
Sui Chenb65280f2020-06-30 18:14:03 -070035 UpdateLayout();
Sui Chenb53fa1b2022-05-26 00:16:42 -070036});
37
38function OpenFileHandler() {
39 ipcRenderer.send('file-request');
Sui Chenb65280f2020-06-30 18:14:03 -070040}
41
42// The file may be either DBus dump or Boost Asio handler log
43document.getElementById('btn_open_file')
44 .addEventListener('click', OpenFileHandler);
45document.getElementById('btn_open_file2')
46 .addEventListener('click', OpenFileHandler);
47
48document.getElementById('bah1').addEventListener(
49 'click', OnGroupByConditionChanged_ASIO);
50document.getElementById('bah2').addEventListener(
51 'click', OnGroupByConditionChanged_ASIO);
52document.getElementById('bah3').addEventListener(
53 'click', OnGroupByConditionChanged_ASIO);
54
55// UI elements
56var g_group_by_dbus = document.getElementById('span_group_by_dbus');
57var g_group_by_ipmi = document.getElementById('span_group_by_ipmi');
58var g_group_by_asio =
59 document.getElementById('span_group_by_boost_asio_handler')
60var g_canvas_ipmi = document.getElementById('my_canvas_ipmi');
61var g_canvas_dbus = document.getElementById('my_canvas_dbus');
62var g_canvas_asio = document.getElementById('my_canvas_boost_asio_handler');
63
64var g_dbus_pcap_status_content = document.getElementById('dbus_pcap_status_content');
65var g_dbus_pcap_error_content = document.getElementById('dbus_pcap_error_content');
66var g_btn_download_dbus_pcap = document.getElementById('btn_download_dbus_pcap');
67var g_welcome_screen_content = document.getElementById('welcome_screen_content');
68var g_scapy_error_content = document.getElementById('scapy_error_content');
69
70var g_btn_zoom_reset = document.getElementById('btn_zoom_reset');
71
72function DownloadDbusPcap() {
73 const url = 'https://raw.githubusercontent.com/openbmc/openbmc-tools/08ce0a5bad2b5c970af567c2e9888d444afe3946/dbus-pcap/dbus-pcap';
74
75 https.get(url, (res) => {
76 const path = 'dbus-pcap';
77 const file_path = fs.createWriteStream(path);
78 res.pipe(file_path);
79 file_path.on('finish', () => {
80 file_path.close();
81 alert("dbus-pcap download complete!");
82 CheckDbusPcapPresence();
83 });
84 });
85}
86
87g_btn_download_dbus_pcap.addEventListener(
88 'click', DownloadDbusPcap);
89
90function ShowDBusTimeline() {
91 g_canvas_dbus.style.display = 'block';
92 g_group_by_dbus.style.display = 'block';
93}
94function ShowIPMITimeline() {
95 g_canvas_ipmi.style.display = 'block';
96 g_group_by_ipmi.style.display = 'block';
97}
98function ShowASIOTimeline() {
99 g_canvas_asio.style.display = 'block';
100 g_group_by_asio.style.display = 'block';
101}
102
103// Make sure the user has scapy.all installed
104function IsPythonInstallationOK() {
105 const x = spawnSync('python3', ['-m', 'scapy.all']);
106 return (x.status == 0);
107}
108
109function IsDbusPcapPresent() {
110 // This should exist if the openbmc-tools repository
111 // is checked out as a whole
112 const dbus_pcap = '../dbus-pcap/dbus-pcap';
113
114 if (fs.existsSync('dbus-pcap')) {
115 return true;
116 } else if (fs.existsSync(dbus_pcap)) { // Create symlink
117 fs.symlinkSync(dbus_pcap, './dbus-pcap');
118 return true;
119 } else {
120 return false;
121 }
122}
123
124function CheckDependencies() {
125 g_dbus_pcap_status_content.style.display = 'none';
126 g_dbus_pcap_error_content.style.display = 'none';
127 g_scapy_error_content.style.display = 'none';
128 g_welcome_screen_content.style.display = 'none';
129
130 const dbus_pcap_ok = IsDbusPcapPresent();
131 if (!dbus_pcap_ok) {
132 g_dbus_pcap_error_content.style.display = 'block';
133 }
134
135 const scapy_ok = IsPythonInstallationOK();
136 if (!scapy_ok) {
137 g_scapy_error_content.style.display = 'block';
138 }
139
140 let msg = "";
141 if (dbus_pcap_ok) {
142 msg += 'dbus-pcap found, md5sum: ' +
143 md5File.sync('dbus-pcap');
144 g_dbus_pcap_status_content.style.display = 'block';
145 g_dbus_pcap_status_content.textContent = msg;
146 }
147
148 if (dbus_pcap_ok && scapy_ok) {
149 g_welcome_screen_content.style.display = 'block';
150 }
151}
152
153function Init() {
154 console.log('[Init] Initialization');
155 ipmi_timeline_view.Canvas = document.getElementById('my_canvas_ipmi');
156 dbus_timeline_view.Canvas = document.getElementById('my_canvas_dbus');
157 boost_asio_handler_timeline_view.Canvas =
158 document.getElementById('my_canvas_boost_asio_handler');
159
160 // Hide all canvases until the user loads files
161 ipmi_timeline_view.Canvas.style.display = 'none';
162 dbus_timeline_view.Canvas.style.display = 'none';
163 boost_asio_handler_timeline_view.Canvas.style.display = 'none';
164
165 let v1 = ipmi_timeline_view;
166 let v2 = dbus_timeline_view;
167 let v3 = boost_asio_handler_timeline_view;
168
169 // Link views
170 v1.linked_views = [v2, v3];
171 v2.linked_views = [v1, v3];
172 v3.linked_views = [v1, v2];
173
174 // Set accent color
175 v1.AccentColor = 'rgba(0,224,224,0.5)';
176 v2.AccentColor = 'rgba(0,128,0, 0.5)';
177 v3.AccentColor = '#E22';
178
179 CheckDependencies();
Sui Chenc403b032022-03-06 18:03:12 -0800180
181 DragElement(document.getElementById("highlighted_messages"));
Sui Chenb65280f2020-06-30 18:14:03 -0700182}
183
184var g_WelcomeScreen = document.getElementById('welcome_screen');
185function HideWelcomeScreen() {
186 g_WelcomeScreen.style.display = 'none';
187}
188
189var g_Blocker = document.getElementById('blocker');
190var g_BlockerCaption = document.getElementById('blocker_caption');
191function HideBlocker() {
192 g_Blocker.style.display = 'none';
193}
194function ShowBlocker(msg) {
195 g_Blocker.style.display = 'block';
196 g_BlockerCaption.textContent = msg;
197}
198
199var g_Navigation = document.getElementById('div_navi_and_replay');
200function ShowNavigation() {
201 g_Navigation.style.display = 'block';
202}
203
204function UpdateFileNamesString() {
205 let tmp = [];
206 if (ipmi_timeline_view.CurrentFileName != '') {
207 tmp.push('IPMI timeline: ' + ipmi_timeline_view.CurrentFileName)
208 }
209 if (dbus_timeline_view.CurrentFileName != '') {
210 tmp.push('DBus timeline: ' + dbus_timeline_view.CurrentFileName)
211 }
212 if (boost_asio_handler_timeline_view.CurrentFileName != '') {
213 tmp.push(
214 'ASIO timeline: ' + boost_asio_handler_timeline_view.CurrentFileName);
215 }
216 let s = tmp.join('<br/>');
217 document.getElementById('capture_info').innerHTML = s;
218}
219
220var g_cb_debug_info = document.getElementById('cb_debuginfo');
221
222
223Init();