| const { spawnSync } = require('child_process'); |
| const md5File = require('md5-file'); |
| const https = require('https'); |
| |
| function OpenFileHandler() { |
| console.log('Will open a dialog box ...'); |
| const options = { |
| title: 'Open a file or folder', |
| }; |
| let x = dialog.showOpenDialogSync(options) + ''; // Convert to string |
| console.log('file name: ' + x) |
| |
| // Determine file type |
| let is_asio_log = false; |
| const data = fs.readFileSync(x, {encoding: 'utf-8'}); |
| let lines = data.split('\n'); |
| for (let i = 0; i < lines.length; i++) { |
| if (lines[i].indexOf('@asio') == 0) { |
| is_asio_log = true; |
| break; |
| } |
| } |
| |
| if (is_asio_log) { |
| ShowBlocker('Loading Boost ASIO handler tracking log'); |
| console.log('This file is a Boost Asio handler tracking log'); |
| ParseBoostHandlerTimeline(data); |
| OnGroupByConditionChanged_ASIO(); |
| if (boost_asio_handler_timeline_view.IsEmpty() == false) { |
| boost_asio_handler_timeline_view.CurrentFileName = x; |
| HideWelcomeScreen(); |
| ShowASIOTimeline(); |
| ShowNavigation(); |
| UpdateFileNamesString(); |
| } |
| HideBlocker(); |
| return; |
| } |
| |
| OpenDBusPcapFile(x); |
| |
| UpdateLayout(); |
| } |
| |
| // The file may be either DBus dump or Boost Asio handler log |
| document.getElementById('btn_open_file') |
| .addEventListener('click', OpenFileHandler); |
| document.getElementById('btn_open_file2') |
| .addEventListener('click', OpenFileHandler); |
| |
| document.getElementById('bah1').addEventListener( |
| 'click', OnGroupByConditionChanged_ASIO); |
| document.getElementById('bah2').addEventListener( |
| 'click', OnGroupByConditionChanged_ASIO); |
| document.getElementById('bah3').addEventListener( |
| 'click', OnGroupByConditionChanged_ASIO); |
| |
| // UI elements |
| var g_group_by_dbus = document.getElementById('span_group_by_dbus'); |
| var g_group_by_ipmi = document.getElementById('span_group_by_ipmi'); |
| var g_group_by_asio = |
| document.getElementById('span_group_by_boost_asio_handler') |
| var g_canvas_ipmi = document.getElementById('my_canvas_ipmi'); |
| var g_canvas_dbus = document.getElementById('my_canvas_dbus'); |
| var g_canvas_asio = document.getElementById('my_canvas_boost_asio_handler'); |
| |
| var g_dbus_pcap_status_content = document.getElementById('dbus_pcap_status_content'); |
| var g_dbus_pcap_error_content = document.getElementById('dbus_pcap_error_content'); |
| var g_btn_download_dbus_pcap = document.getElementById('btn_download_dbus_pcap'); |
| var g_welcome_screen_content = document.getElementById('welcome_screen_content'); |
| var g_scapy_error_content = document.getElementById('scapy_error_content'); |
| |
| var g_btn_zoom_reset = document.getElementById('btn_zoom_reset'); |
| |
| function DownloadDbusPcap() { |
| const url = 'https://raw.githubusercontent.com/openbmc/openbmc-tools/08ce0a5bad2b5c970af567c2e9888d444afe3946/dbus-pcap/dbus-pcap'; |
| |
| https.get(url, (res) => { |
| const path = 'dbus-pcap'; |
| const file_path = fs.createWriteStream(path); |
| res.pipe(file_path); |
| file_path.on('finish', () => { |
| file_path.close(); |
| alert("dbus-pcap download complete!"); |
| CheckDbusPcapPresence(); |
| }); |
| }); |
| } |
| |
| g_btn_download_dbus_pcap.addEventListener( |
| 'click', DownloadDbusPcap); |
| |
| function ShowDBusTimeline() { |
| g_canvas_dbus.style.display = 'block'; |
| g_group_by_dbus.style.display = 'block'; |
| } |
| function ShowIPMITimeline() { |
| g_canvas_ipmi.style.display = 'block'; |
| g_group_by_ipmi.style.display = 'block'; |
| } |
| function ShowASIOTimeline() { |
| g_canvas_asio.style.display = 'block'; |
| g_group_by_asio.style.display = 'block'; |
| } |
| |
| // Make sure the user has scapy.all installed |
| function IsPythonInstallationOK() { |
| const x = spawnSync('python3', ['-m', 'scapy.all']); |
| return (x.status == 0); |
| } |
| |
| function IsDbusPcapPresent() { |
| // This should exist if the openbmc-tools repository |
| // is checked out as a whole |
| const dbus_pcap = '../dbus-pcap/dbus-pcap'; |
| |
| if (fs.existsSync('dbus-pcap')) { |
| return true; |
| } else if (fs.existsSync(dbus_pcap)) { // Create symlink |
| fs.symlinkSync(dbus_pcap, './dbus-pcap'); |
| return true; |
| } else { |
| return false; |
| } |
| } |
| |
| function CheckDependencies() { |
| g_dbus_pcap_status_content.style.display = 'none'; |
| g_dbus_pcap_error_content.style.display = 'none'; |
| g_scapy_error_content.style.display = 'none'; |
| g_welcome_screen_content.style.display = 'none'; |
| |
| const dbus_pcap_ok = IsDbusPcapPresent(); |
| if (!dbus_pcap_ok) { |
| g_dbus_pcap_error_content.style.display = 'block'; |
| } |
| |
| const scapy_ok = IsPythonInstallationOK(); |
| if (!scapy_ok) { |
| g_scapy_error_content.style.display = 'block'; |
| } |
| |
| let msg = ""; |
| if (dbus_pcap_ok) { |
| msg += 'dbus-pcap found, md5sum: ' + |
| md5File.sync('dbus-pcap'); |
| g_dbus_pcap_status_content.style.display = 'block'; |
| g_dbus_pcap_status_content.textContent = msg; |
| } |
| |
| if (dbus_pcap_ok && scapy_ok) { |
| g_welcome_screen_content.style.display = 'block'; |
| } |
| } |
| |
| function Init() { |
| console.log('[Init] Initialization'); |
| ipmi_timeline_view.Canvas = document.getElementById('my_canvas_ipmi'); |
| dbus_timeline_view.Canvas = document.getElementById('my_canvas_dbus'); |
| boost_asio_handler_timeline_view.Canvas = |
| document.getElementById('my_canvas_boost_asio_handler'); |
| |
| // Hide all canvases until the user loads files |
| ipmi_timeline_view.Canvas.style.display = 'none'; |
| dbus_timeline_view.Canvas.style.display = 'none'; |
| boost_asio_handler_timeline_view.Canvas.style.display = 'none'; |
| |
| let v1 = ipmi_timeline_view; |
| let v2 = dbus_timeline_view; |
| let v3 = boost_asio_handler_timeline_view; |
| |
| // Link views |
| v1.linked_views = [v2, v3]; |
| v2.linked_views = [v1, v3]; |
| v3.linked_views = [v1, v2]; |
| |
| // Set accent color |
| v1.AccentColor = 'rgba(0,224,224,0.5)'; |
| v2.AccentColor = 'rgba(0,128,0, 0.5)'; |
| v3.AccentColor = '#E22'; |
| |
| CheckDependencies(); |
| } |
| |
| var g_WelcomeScreen = document.getElementById('welcome_screen'); |
| function HideWelcomeScreen() { |
| g_WelcomeScreen.style.display = 'none'; |
| } |
| |
| var g_Blocker = document.getElementById('blocker'); |
| var g_BlockerCaption = document.getElementById('blocker_caption'); |
| function HideBlocker() { |
| g_Blocker.style.display = 'none'; |
| } |
| function ShowBlocker(msg) { |
| g_Blocker.style.display = 'block'; |
| g_BlockerCaption.textContent = msg; |
| } |
| |
| var g_Navigation = document.getElementById('div_navi_and_replay'); |
| function ShowNavigation() { |
| g_Navigation.style.display = 'block'; |
| } |
| |
| function UpdateFileNamesString() { |
| let tmp = []; |
| if (ipmi_timeline_view.CurrentFileName != '') { |
| tmp.push('IPMI timeline: ' + ipmi_timeline_view.CurrentFileName) |
| } |
| if (dbus_timeline_view.CurrentFileName != '') { |
| tmp.push('DBus timeline: ' + dbus_timeline_view.CurrentFileName) |
| } |
| if (boost_asio_handler_timeline_view.CurrentFileName != '') { |
| tmp.push( |
| 'ASIO timeline: ' + boost_asio_handler_timeline_view.CurrentFileName); |
| } |
| let s = tmp.join('<br/>'); |
| document.getElementById('capture_info').innerHTML = s; |
| } |
| |
| var g_cb_debug_info = document.getElementById('cb_debuginfo'); |
| |
| |
| Init(); |