Sfoglia il codice sorgente

Implement log viewer to read logs from filesystem

0xchocolate 2 anni fa
parent
commit
5ac2576440

+ 1 - 0
applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_config.h

@@ -2,3 +2,4 @@ ADD_SCENE(wifi_marauder, start, Start)
 ADD_SCENE(wifi_marauder, console_output, ConsoleOutput)
 ADD_SCENE(wifi_marauder, text_input, TextInput)
 ADD_SCENE(wifi_marauder, settings_init, SettingsInit)
+ADD_SCENE(wifi_marauder, log_viewer, LogViewer)

+ 1 - 0
applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_console_output.c

@@ -7,6 +7,7 @@ void wifi_marauder_console_output_handle_rx_data_cb(uint8_t* buf, size_t len, vo
     if(app->ok_to_save_logs) {
         if(!app->is_writing_log) {
             app->is_writing_log = true;
+            app->has_saved_logs_this_session = true;
             if(!app->log_file || !storage_file_is_open(app->log_file)) {
                 wifi_marauder_create_log_file(app);
             }

+ 146 - 0
applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_log_viewer.c

@@ -0,0 +1,146 @@
+#include "../wifi_marauder_app_i.h"
+
+void wifi_marauder_scene_log_viewer_widget_callback(
+    GuiButtonType result,
+    InputType type,
+    void* context) {
+    WifiMarauderApp* app = context;
+    if(type == InputTypeShort) {
+        view_dispatcher_send_custom_event(app->view_dispatcher, result);
+    }
+}
+
+static void _read_log_page_into_text_store(WifiMarauderApp* app) {
+    static char temp[257];
+    bzero(temp, sizeof(temp));
+    storage_file_seek(
+        app->log_file, WIFI_MARAUDER_TEXT_BOX_STORE_SIZE * (app->open_log_file_page - 1), true);
+    furi_string_reset(app->text_box_store);
+    for (uint16_t i = 0; i < (WIFI_MARAUDER_TEXT_BOX_STORE_SIZE / (sizeof(temp) - 1)); i++)
+    {
+        uint16_t num_bytes = storage_file_read(app->log_file, temp, sizeof(temp)-1);
+        if (num_bytes == 0) {
+            break;
+        }
+        temp[num_bytes] = '\0';
+        furi_string_cat_str(app->text_box_store, temp);
+    }
+}
+
+void wifi_marauder_scene_log_viewer_setup_widget(WifiMarauderApp* app) {
+    Widget* widget = app->widget;
+
+    if(storage_file_is_open(app->log_file)) {
+        _read_log_page_into_text_store(app);
+    } else if(
+        app->has_saved_logs_this_session &&
+        storage_file_open(app->log_file, app->log_file_path, FSAM_READ, FSOM_OPEN_EXISTING)) {
+        app->open_log_file_num_pages =
+            storage_file_size(app->log_file) / WIFI_MARAUDER_TEXT_BOX_STORE_SIZE +
+            (storage_file_size(app->log_file) % WIFI_MARAUDER_TEXT_BOX_STORE_SIZE != 0);
+        app->open_log_file_page = 1;
+        _read_log_page_into_text_store(app);
+    } else {
+        app->open_log_file_page = 0;
+        app->open_log_file_num_pages = 0;
+    }
+
+    widget_reset(widget);
+
+    if(furi_string_empty(app->text_box_store)) {
+        char help_msg[256];
+        snprintf(
+            help_msg,
+            sizeof(help_msg),
+            "The log is empty! :(\nTry sending a command?\n\nSaving pcaps to flipper sdcard: %s\nSaving logs to flipper sdcard: %s",
+            app->ok_to_save_pcaps ? "ON" : "OFF",
+            app->ok_to_save_logs ? "ON" : "OFF");
+        furi_string_set_str(app->text_box_store, help_msg);
+    }
+
+    widget_add_text_scroll_element(
+        widget, 0, 0, 128, 53, furi_string_get_cstr(app->text_box_store));
+
+    widget_add_button_element(
+        widget, GuiButtonTypeCenter, "Browse", wifi_marauder_scene_log_viewer_widget_callback, app);
+
+    char pagecounter[100];
+    snprintf(
+        pagecounter,
+        sizeof(pagecounter),
+        "%d/%d",
+        app->open_log_file_page,
+        app->open_log_file_num_pages);
+    if(app->open_log_file_page > 1) {
+        widget_add_button_element(
+            widget,
+            GuiButtonTypeLeft,
+            pagecounter,
+            wifi_marauder_scene_log_viewer_widget_callback,
+            app);
+    }
+    if(app->open_log_file_page < app->open_log_file_num_pages) {
+        widget_add_button_element(
+            widget,
+            GuiButtonTypeRight,
+            pagecounter,
+            wifi_marauder_scene_log_viewer_widget_callback,
+            app);
+    }
+}
+
+void wifi_marauder_scene_log_viewer_on_enter(void* context) {
+    WifiMarauderApp* app = context;
+
+    app->open_log_file_page = 0;
+    app->open_log_file_num_pages = 0;
+    wifi_marauder_scene_log_viewer_setup_widget(app);
+
+    view_dispatcher_switch_to_view(app->view_dispatcher, WifiMarauderAppViewWidget);
+}
+
+bool wifi_marauder_scene_log_viewer_on_event(void* context, SceneManagerEvent event) {
+    WifiMarauderApp* app = context;
+    bool consumed = false;
+
+    if(event.type == SceneManagerEventTypeCustom) {
+        if(event.event == GuiButtonTypeCenter) {
+            // Browse
+            FuriString* predefined_filepath = furi_string_alloc_set_str(MARAUDER_APP_FOLDER_LOGS);
+            FuriString* selected_filepath = furi_string_alloc();
+            if(dialog_file_browser_show(
+                   app->dialogs, selected_filepath, predefined_filepath, NULL)) {
+                app->has_saved_logs_this_session = true;
+                strncpy(
+                    app->log_file_path,
+                    furi_string_get_cstr(selected_filepath),
+                    sizeof(app->log_file_path));
+                if(storage_file_is_open(app->log_file)) {
+                    storage_file_close(app->log_file);
+                }
+                wifi_marauder_scene_log_viewer_setup_widget(app);
+            }
+            furi_string_free(selected_filepath);
+            furi_string_free(predefined_filepath);
+            consumed = true;
+        } else if(event.event == GuiButtonTypeRight) {
+            // Advance page
+            ++app->open_log_file_page;
+            wifi_marauder_scene_log_viewer_setup_widget(app);
+        } else if(event.event == GuiButtonTypeLeft) {
+            // Previous page
+            --app->open_log_file_page;
+            wifi_marauder_scene_log_viewer_setup_widget(app);
+        }
+    }
+
+    return consumed;
+}
+
+void wifi_marauder_scene_log_viewer_on_exit(void* context) {
+    WifiMarauderApp* app = context;
+    widget_reset(app->widget);
+    if(storage_file_is_open(app->log_file)) {
+        storage_file_close(app->log_file);
+    }
+}

+ 10 - 0
applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_start.c

@@ -161,6 +161,12 @@ static void wifi_marauder_scene_start_var_list_enter_callback(void* context, uin
                                    item->focus_console;
     app->show_stopscan_tip = item->show_stopscan_tip;
 
+    if(!app->is_command && selected_option_index == 0) {
+        // View Log from start
+        view_dispatcher_send_custom_event(app->view_dispatcher, WifiMarauderEventStartLogViewer);
+        return;
+    }
+
     bool needs_keyboard = (item->needs_keyboard == TOGGLE_ARGS) ? (selected_option_index != 0) :
                                                                   item->needs_keyboard;
     if(needs_keyboard) {
@@ -232,6 +238,10 @@ bool wifi_marauder_scene_start_on_event(void* context, SceneManagerEvent event)
             scene_manager_set_scene_state(
                 app->scene_manager, WifiMarauderSceneStart, app->selected_menu_index);
             scene_manager_next_scene(app->scene_manager, WifiMarauderSceneSettingsInit);
+        } else if(event.event == WifiMarauderEventStartLogViewer) {
+            scene_manager_set_scene_state(
+                app->scene_manager, WifiMarauderSceneStart, app->selected_menu_index);
+            scene_manager_next_scene(app->scene_manager, WifiMarauderSceneLogViewer);
         }
         consumed = true;
     } else if(event.type == SceneManagerEventTypeTick) {

+ 2 - 2
applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_text_input.c

@@ -80,7 +80,7 @@ bool wifi_marauder_scene_text_input_on_event(void* context, SceneManagerEvent ev
         if(event.event == WifiMarauderEventStartConsole) {
             // Point to custom string to send
             app->selected_tx_string = app->text_input_store;
-            scene_manager_next_scene(app->scene_manager, WifiMarauderAppViewConsoleOutput);
+            scene_manager_next_scene(app->scene_manager, WifiMarauderSceneConsoleOutput);
             consumed = true;
         } else if(event.event == WifiMarauderEventSaveSourceMac) {
             if(12 != strlen(app->text_input_store)) {
@@ -138,7 +138,7 @@ bool wifi_marauder_scene_text_input_on_event(void* context, SceneManagerEvent ev
                     app->special_case_input_src_addr,
                     app->special_case_input_dst_addr);
                 app->selected_tx_string = app->text_input_store;
-                scene_manager_next_scene(app->scene_manager, WifiMarauderAppViewConsoleOutput);
+                scene_manager_next_scene(app->scene_manager, WifiMarauderSceneConsoleOutput);
             }
             consumed = true;
         }

+ 4 - 0
applications/external/wifi_marauder_companion/wifi_marauder_app_i.h

@@ -46,16 +46,20 @@ struct WifiMarauderApp {
     Storage* storage;
     File* capture_file;
     File* log_file;
+    char log_file_path[100];
     File* save_pcap_setting_file;
     File* save_logs_setting_file;
     bool need_to_prompt_settings_init;
     int which_prompt;
     bool ok_to_save_pcaps;
     bool ok_to_save_logs;
+    bool has_saved_logs_this_session;
     DialogsApp* dialogs;
 
     VariableItemList* var_item_list;
     Widget* widget;
+    int open_log_file_page;
+    int open_log_file_num_pages;
 
     WifiMarauderUart* uart;
     WifiMarauderUart* lp_uart;

+ 2 - 1
applications/external/wifi_marauder_companion/wifi_marauder_custom_event.h

@@ -6,5 +6,6 @@ typedef enum {
     WifiMarauderEventStartKeyboard,
     WifiMarauderEventSaveSourceMac,
     WifiMarauderEventSaveDestinationMac,
-    WifiMarauderEventStartSettingsInit
+    WifiMarauderEventStartSettingsInit,
+    WifiMarauderEventStartLogViewer
 } WifiMarauderCustomEvent;

+ 2 - 0
applications/external/wifi_marauder_companion/wifi_marauder_pcap.c

@@ -58,5 +58,7 @@ void wifi_marauder_create_log_file(WifiMarauderApp* app) {
 
     if(!storage_file_open(app->log_file, log_file_path, FSAM_WRITE, FSOM_CREATE_ALWAYS)) {
         dialog_message_show_storage_error(app->dialogs, "Cannot open log file");
+    } else {
+        strncpy(app->log_file_path, log_file_path, strlen(log_file_path));
     }
 }