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