oscura 0.5.1__py3-none-any.whl → 0.7.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (497) hide show
  1. oscura/__init__.py +169 -167
  2. oscura/analyzers/__init__.py +3 -0
  3. oscura/analyzers/classification.py +659 -0
  4. oscura/analyzers/digital/edges.py +325 -65
  5. oscura/analyzers/digital/quality.py +293 -166
  6. oscura/analyzers/digital/timing.py +260 -115
  7. oscura/analyzers/digital/timing_numba.py +334 -0
  8. oscura/analyzers/entropy.py +605 -0
  9. oscura/analyzers/eye/diagram.py +176 -109
  10. oscura/analyzers/eye/metrics.py +5 -5
  11. oscura/analyzers/jitter/__init__.py +6 -4
  12. oscura/analyzers/jitter/ber.py +52 -52
  13. oscura/analyzers/jitter/classification.py +156 -0
  14. oscura/analyzers/jitter/decomposition.py +163 -113
  15. oscura/analyzers/jitter/spectrum.py +80 -64
  16. oscura/analyzers/ml/__init__.py +39 -0
  17. oscura/analyzers/ml/features.py +600 -0
  18. oscura/analyzers/ml/signal_classifier.py +604 -0
  19. oscura/analyzers/packet/daq.py +246 -158
  20. oscura/analyzers/packet/parser.py +12 -1
  21. oscura/analyzers/packet/payload.py +50 -2110
  22. oscura/analyzers/packet/payload_analysis.py +361 -181
  23. oscura/analyzers/packet/payload_patterns.py +133 -70
  24. oscura/analyzers/packet/stream.py +84 -23
  25. oscura/analyzers/patterns/__init__.py +26 -5
  26. oscura/analyzers/patterns/anomaly_detection.py +908 -0
  27. oscura/analyzers/patterns/clustering.py +169 -108
  28. oscura/analyzers/patterns/clustering_optimized.py +227 -0
  29. oscura/analyzers/patterns/discovery.py +1 -1
  30. oscura/analyzers/patterns/matching.py +581 -197
  31. oscura/analyzers/patterns/pattern_mining.py +778 -0
  32. oscura/analyzers/patterns/periodic.py +121 -38
  33. oscura/analyzers/patterns/sequences.py +175 -78
  34. oscura/analyzers/power/conduction.py +1 -1
  35. oscura/analyzers/power/soa.py +6 -6
  36. oscura/analyzers/power/switching.py +250 -110
  37. oscura/analyzers/protocol/__init__.py +17 -1
  38. oscura/analyzers/protocols/base.py +6 -6
  39. oscura/analyzers/protocols/ble/__init__.py +38 -0
  40. oscura/analyzers/protocols/ble/analyzer.py +809 -0
  41. oscura/analyzers/protocols/ble/uuids.py +288 -0
  42. oscura/analyzers/protocols/can.py +257 -127
  43. oscura/analyzers/protocols/can_fd.py +107 -80
  44. oscura/analyzers/protocols/flexray.py +139 -80
  45. oscura/analyzers/protocols/hdlc.py +93 -58
  46. oscura/analyzers/protocols/i2c.py +247 -106
  47. oscura/analyzers/protocols/i2s.py +138 -86
  48. oscura/analyzers/protocols/industrial/__init__.py +40 -0
  49. oscura/analyzers/protocols/industrial/bacnet/__init__.py +33 -0
  50. oscura/analyzers/protocols/industrial/bacnet/analyzer.py +708 -0
  51. oscura/analyzers/protocols/industrial/bacnet/encoding.py +412 -0
  52. oscura/analyzers/protocols/industrial/bacnet/services.py +622 -0
  53. oscura/analyzers/protocols/industrial/ethercat/__init__.py +30 -0
  54. oscura/analyzers/protocols/industrial/ethercat/analyzer.py +474 -0
  55. oscura/analyzers/protocols/industrial/ethercat/mailbox.py +339 -0
  56. oscura/analyzers/protocols/industrial/ethercat/topology.py +166 -0
  57. oscura/analyzers/protocols/industrial/modbus/__init__.py +31 -0
  58. oscura/analyzers/protocols/industrial/modbus/analyzer.py +525 -0
  59. oscura/analyzers/protocols/industrial/modbus/crc.py +79 -0
  60. oscura/analyzers/protocols/industrial/modbus/functions.py +436 -0
  61. oscura/analyzers/protocols/industrial/opcua/__init__.py +21 -0
  62. oscura/analyzers/protocols/industrial/opcua/analyzer.py +552 -0
  63. oscura/analyzers/protocols/industrial/opcua/datatypes.py +446 -0
  64. oscura/analyzers/protocols/industrial/opcua/services.py +264 -0
  65. oscura/analyzers/protocols/industrial/profinet/__init__.py +23 -0
  66. oscura/analyzers/protocols/industrial/profinet/analyzer.py +441 -0
  67. oscura/analyzers/protocols/industrial/profinet/dcp.py +263 -0
  68. oscura/analyzers/protocols/industrial/profinet/ptcp.py +200 -0
  69. oscura/analyzers/protocols/jtag.py +180 -98
  70. oscura/analyzers/protocols/lin.py +219 -114
  71. oscura/analyzers/protocols/manchester.py +4 -4
  72. oscura/analyzers/protocols/onewire.py +253 -149
  73. oscura/analyzers/protocols/parallel_bus/__init__.py +20 -0
  74. oscura/analyzers/protocols/parallel_bus/centronics.py +92 -0
  75. oscura/analyzers/protocols/parallel_bus/gpib.py +137 -0
  76. oscura/analyzers/protocols/spi.py +192 -95
  77. oscura/analyzers/protocols/swd.py +321 -167
  78. oscura/analyzers/protocols/uart.py +267 -125
  79. oscura/analyzers/protocols/usb.py +235 -131
  80. oscura/analyzers/side_channel/power.py +17 -12
  81. oscura/analyzers/signal/__init__.py +15 -0
  82. oscura/analyzers/signal/timing_analysis.py +1086 -0
  83. oscura/analyzers/signal_integrity/__init__.py +4 -1
  84. oscura/analyzers/signal_integrity/sparams.py +2 -19
  85. oscura/analyzers/spectral/chunked.py +129 -60
  86. oscura/analyzers/spectral/chunked_fft.py +300 -94
  87. oscura/analyzers/spectral/chunked_wavelet.py +100 -80
  88. oscura/analyzers/statistical/checksum.py +376 -217
  89. oscura/analyzers/statistical/classification.py +229 -107
  90. oscura/analyzers/statistical/entropy.py +78 -53
  91. oscura/analyzers/statistics/correlation.py +407 -211
  92. oscura/analyzers/statistics/outliers.py +2 -2
  93. oscura/analyzers/statistics/streaming.py +30 -5
  94. oscura/analyzers/validation.py +216 -101
  95. oscura/analyzers/waveform/measurements.py +9 -0
  96. oscura/analyzers/waveform/measurements_with_uncertainty.py +31 -15
  97. oscura/analyzers/waveform/spectral.py +500 -228
  98. oscura/api/__init__.py +31 -5
  99. oscura/api/dsl/__init__.py +582 -0
  100. oscura/{dsl → api/dsl}/commands.py +43 -76
  101. oscura/{dsl → api/dsl}/interpreter.py +26 -51
  102. oscura/{dsl → api/dsl}/parser.py +107 -77
  103. oscura/{dsl → api/dsl}/repl.py +2 -2
  104. oscura/api/dsl.py +1 -1
  105. oscura/{integrations → api/integrations}/__init__.py +1 -1
  106. oscura/{integrations → api/integrations}/llm.py +201 -102
  107. oscura/api/operators.py +3 -3
  108. oscura/api/optimization.py +144 -30
  109. oscura/api/rest_server.py +921 -0
  110. oscura/api/server/__init__.py +17 -0
  111. oscura/api/server/dashboard.py +850 -0
  112. oscura/api/server/static/README.md +34 -0
  113. oscura/api/server/templates/base.html +181 -0
  114. oscura/api/server/templates/export.html +120 -0
  115. oscura/api/server/templates/home.html +284 -0
  116. oscura/api/server/templates/protocols.html +58 -0
  117. oscura/api/server/templates/reports.html +43 -0
  118. oscura/api/server/templates/session_detail.html +89 -0
  119. oscura/api/server/templates/sessions.html +83 -0
  120. oscura/api/server/templates/waveforms.html +73 -0
  121. oscura/automotive/__init__.py +8 -1
  122. oscura/automotive/can/__init__.py +10 -0
  123. oscura/automotive/can/checksum.py +3 -1
  124. oscura/automotive/can/dbc_generator.py +590 -0
  125. oscura/automotive/can/message_wrapper.py +121 -74
  126. oscura/automotive/can/patterns.py +98 -21
  127. oscura/automotive/can/session.py +292 -56
  128. oscura/automotive/can/state_machine.py +6 -3
  129. oscura/automotive/can/stimulus_response.py +97 -75
  130. oscura/automotive/dbc/__init__.py +10 -2
  131. oscura/automotive/dbc/generator.py +84 -56
  132. oscura/automotive/dbc/parser.py +6 -6
  133. oscura/automotive/dtc/data.json +17 -102
  134. oscura/automotive/dtc/database.py +2 -2
  135. oscura/automotive/flexray/__init__.py +31 -0
  136. oscura/automotive/flexray/analyzer.py +504 -0
  137. oscura/automotive/flexray/crc.py +185 -0
  138. oscura/automotive/flexray/fibex.py +449 -0
  139. oscura/automotive/j1939/__init__.py +45 -8
  140. oscura/automotive/j1939/analyzer.py +605 -0
  141. oscura/automotive/j1939/spns.py +326 -0
  142. oscura/automotive/j1939/transport.py +306 -0
  143. oscura/automotive/lin/__init__.py +47 -0
  144. oscura/automotive/lin/analyzer.py +612 -0
  145. oscura/automotive/loaders/blf.py +13 -2
  146. oscura/automotive/loaders/csv_can.py +143 -72
  147. oscura/automotive/loaders/dispatcher.py +50 -2
  148. oscura/automotive/loaders/mdf.py +86 -45
  149. oscura/automotive/loaders/pcap.py +111 -61
  150. oscura/automotive/uds/__init__.py +4 -0
  151. oscura/automotive/uds/analyzer.py +725 -0
  152. oscura/automotive/uds/decoder.py +140 -58
  153. oscura/automotive/uds/models.py +7 -1
  154. oscura/automotive/visualization.py +1 -1
  155. oscura/cli/analyze.py +348 -0
  156. oscura/cli/batch.py +142 -122
  157. oscura/cli/benchmark.py +275 -0
  158. oscura/cli/characterize.py +137 -82
  159. oscura/cli/compare.py +224 -131
  160. oscura/cli/completion.py +250 -0
  161. oscura/cli/config_cmd.py +361 -0
  162. oscura/cli/decode.py +164 -87
  163. oscura/cli/export.py +286 -0
  164. oscura/cli/main.py +115 -31
  165. oscura/{onboarding → cli/onboarding}/__init__.py +3 -3
  166. oscura/{onboarding → cli/onboarding}/help.py +80 -58
  167. oscura/{onboarding → cli/onboarding}/tutorials.py +97 -72
  168. oscura/{onboarding → cli/onboarding}/wizard.py +55 -36
  169. oscura/cli/progress.py +147 -0
  170. oscura/cli/shell.py +157 -135
  171. oscura/cli/validate_cmd.py +204 -0
  172. oscura/cli/visualize.py +158 -0
  173. oscura/convenience.py +125 -79
  174. oscura/core/__init__.py +4 -2
  175. oscura/core/backend_selector.py +3 -3
  176. oscura/core/cache.py +126 -15
  177. oscura/core/cancellation.py +1 -1
  178. oscura/{config → core/config}/__init__.py +20 -11
  179. oscura/{config → core/config}/defaults.py +1 -1
  180. oscura/{config → core/config}/loader.py +7 -5
  181. oscura/{config → core/config}/memory.py +5 -5
  182. oscura/{config → core/config}/migration.py +1 -1
  183. oscura/{config → core/config}/pipeline.py +99 -23
  184. oscura/{config → core/config}/preferences.py +1 -1
  185. oscura/{config → core/config}/protocol.py +3 -3
  186. oscura/{config → core/config}/schema.py +426 -272
  187. oscura/{config → core/config}/settings.py +1 -1
  188. oscura/{config → core/config}/thresholds.py +195 -153
  189. oscura/core/correlation.py +5 -6
  190. oscura/core/cross_domain.py +0 -2
  191. oscura/core/debug.py +9 -5
  192. oscura/{extensibility → core/extensibility}/docs.py +158 -70
  193. oscura/{extensibility → core/extensibility}/extensions.py +160 -76
  194. oscura/{extensibility → core/extensibility}/logging.py +1 -1
  195. oscura/{extensibility → core/extensibility}/measurements.py +1 -1
  196. oscura/{extensibility → core/extensibility}/plugins.py +1 -1
  197. oscura/{extensibility → core/extensibility}/templates.py +73 -3
  198. oscura/{extensibility → core/extensibility}/validation.py +1 -1
  199. oscura/core/gpu_backend.py +11 -7
  200. oscura/core/log_query.py +101 -11
  201. oscura/core/logging.py +126 -54
  202. oscura/core/logging_advanced.py +5 -5
  203. oscura/core/memory_limits.py +108 -70
  204. oscura/core/memory_monitor.py +2 -2
  205. oscura/core/memory_progress.py +7 -7
  206. oscura/core/memory_warnings.py +1 -1
  207. oscura/core/numba_backend.py +13 -13
  208. oscura/{plugins → core/plugins}/__init__.py +9 -9
  209. oscura/{plugins → core/plugins}/base.py +7 -7
  210. oscura/{plugins → core/plugins}/cli.py +3 -3
  211. oscura/{plugins → core/plugins}/discovery.py +186 -106
  212. oscura/{plugins → core/plugins}/lifecycle.py +1 -1
  213. oscura/{plugins → core/plugins}/manager.py +7 -7
  214. oscura/{plugins → core/plugins}/registry.py +3 -3
  215. oscura/{plugins → core/plugins}/versioning.py +1 -1
  216. oscura/core/progress.py +16 -1
  217. oscura/core/provenance.py +8 -2
  218. oscura/{schemas → core/schemas}/__init__.py +2 -2
  219. oscura/{schemas → core/schemas}/device_mapping.json +2 -8
  220. oscura/{schemas → core/schemas}/packet_format.json +4 -24
  221. oscura/{schemas → core/schemas}/protocol_definition.json +2 -12
  222. oscura/core/types.py +4 -0
  223. oscura/core/uncertainty.py +3 -3
  224. oscura/correlation/__init__.py +52 -0
  225. oscura/correlation/multi_protocol.py +811 -0
  226. oscura/discovery/auto_decoder.py +117 -35
  227. oscura/discovery/comparison.py +191 -86
  228. oscura/discovery/quality_validator.py +155 -68
  229. oscura/discovery/signal_detector.py +196 -79
  230. oscura/export/__init__.py +18 -8
  231. oscura/export/kaitai_struct.py +513 -0
  232. oscura/export/scapy_layer.py +801 -0
  233. oscura/export/wireshark/generator.py +1 -1
  234. oscura/export/wireshark/templates/dissector.lua.j2 +2 -2
  235. oscura/export/wireshark_dissector.py +746 -0
  236. oscura/guidance/wizard.py +207 -111
  237. oscura/hardware/__init__.py +19 -0
  238. oscura/{acquisition → hardware/acquisition}/__init__.py +4 -4
  239. oscura/{acquisition → hardware/acquisition}/file.py +2 -2
  240. oscura/{acquisition → hardware/acquisition}/hardware.py +7 -7
  241. oscura/{acquisition → hardware/acquisition}/saleae.py +15 -12
  242. oscura/{acquisition → hardware/acquisition}/socketcan.py +1 -1
  243. oscura/{acquisition → hardware/acquisition}/streaming.py +2 -2
  244. oscura/{acquisition → hardware/acquisition}/synthetic.py +3 -3
  245. oscura/{acquisition → hardware/acquisition}/visa.py +33 -11
  246. oscura/hardware/firmware/__init__.py +29 -0
  247. oscura/hardware/firmware/pattern_recognition.py +874 -0
  248. oscura/hardware/hal_detector.py +736 -0
  249. oscura/hardware/security/__init__.py +37 -0
  250. oscura/hardware/security/side_channel_detector.py +1126 -0
  251. oscura/inference/__init__.py +4 -0
  252. oscura/inference/active_learning/observation_table.py +4 -1
  253. oscura/inference/alignment.py +216 -123
  254. oscura/inference/bayesian.py +113 -33
  255. oscura/inference/crc_reverse.py +101 -55
  256. oscura/inference/logic.py +6 -2
  257. oscura/inference/message_format.py +342 -183
  258. oscura/inference/protocol.py +95 -44
  259. oscura/inference/protocol_dsl.py +180 -82
  260. oscura/inference/signal_intelligence.py +1439 -706
  261. oscura/inference/spectral.py +99 -57
  262. oscura/inference/state_machine.py +810 -158
  263. oscura/inference/stream.py +270 -110
  264. oscura/iot/__init__.py +34 -0
  265. oscura/iot/coap/__init__.py +32 -0
  266. oscura/iot/coap/analyzer.py +668 -0
  267. oscura/iot/coap/options.py +212 -0
  268. oscura/iot/lorawan/__init__.py +21 -0
  269. oscura/iot/lorawan/crypto.py +206 -0
  270. oscura/iot/lorawan/decoder.py +801 -0
  271. oscura/iot/lorawan/mac_commands.py +341 -0
  272. oscura/iot/mqtt/__init__.py +27 -0
  273. oscura/iot/mqtt/analyzer.py +999 -0
  274. oscura/iot/mqtt/properties.py +315 -0
  275. oscura/iot/zigbee/__init__.py +31 -0
  276. oscura/iot/zigbee/analyzer.py +615 -0
  277. oscura/iot/zigbee/security.py +153 -0
  278. oscura/iot/zigbee/zcl.py +349 -0
  279. oscura/jupyter/display.py +125 -45
  280. oscura/{exploratory → jupyter/exploratory}/__init__.py +8 -8
  281. oscura/{exploratory → jupyter/exploratory}/error_recovery.py +298 -141
  282. oscura/jupyter/exploratory/fuzzy.py +746 -0
  283. oscura/{exploratory → jupyter/exploratory}/fuzzy_advanced.py +258 -100
  284. oscura/{exploratory → jupyter/exploratory}/legacy.py +464 -242
  285. oscura/{exploratory → jupyter/exploratory}/parse.py +167 -145
  286. oscura/{exploratory → jupyter/exploratory}/recovery.py +119 -87
  287. oscura/jupyter/exploratory/sync.py +612 -0
  288. oscura/{exploratory → jupyter/exploratory}/unknown.py +299 -176
  289. oscura/jupyter/magic.py +4 -4
  290. oscura/{ui → jupyter/ui}/__init__.py +2 -2
  291. oscura/{ui → jupyter/ui}/formatters.py +3 -3
  292. oscura/{ui → jupyter/ui}/progressive_display.py +153 -82
  293. oscura/loaders/__init__.py +183 -67
  294. oscura/loaders/binary.py +88 -1
  295. oscura/loaders/chipwhisperer.py +153 -137
  296. oscura/loaders/configurable.py +208 -86
  297. oscura/loaders/csv_loader.py +458 -215
  298. oscura/loaders/hdf5_loader.py +278 -119
  299. oscura/loaders/lazy.py +87 -54
  300. oscura/loaders/mmap_loader.py +1 -1
  301. oscura/loaders/numpy_loader.py +253 -116
  302. oscura/loaders/pcap.py +226 -151
  303. oscura/loaders/rigol.py +110 -49
  304. oscura/loaders/sigrok.py +201 -78
  305. oscura/loaders/tdms.py +81 -58
  306. oscura/loaders/tektronix.py +291 -174
  307. oscura/loaders/touchstone.py +182 -87
  308. oscura/loaders/tss.py +456 -0
  309. oscura/loaders/vcd.py +215 -117
  310. oscura/loaders/wav.py +155 -68
  311. oscura/reporting/__init__.py +9 -0
  312. oscura/reporting/analyze.py +352 -146
  313. oscura/reporting/argument_preparer.py +69 -14
  314. oscura/reporting/auto_report.py +97 -61
  315. oscura/reporting/batch.py +131 -58
  316. oscura/reporting/chart_selection.py +57 -45
  317. oscura/reporting/comparison.py +63 -17
  318. oscura/reporting/content/executive.py +76 -24
  319. oscura/reporting/core_formats/multi_format.py +11 -8
  320. oscura/reporting/engine.py +312 -158
  321. oscura/reporting/enhanced_reports.py +949 -0
  322. oscura/reporting/export.py +86 -43
  323. oscura/reporting/formatting/numbers.py +69 -42
  324. oscura/reporting/html.py +139 -58
  325. oscura/reporting/index.py +137 -65
  326. oscura/reporting/output.py +158 -67
  327. oscura/reporting/pdf.py +67 -102
  328. oscura/reporting/plots.py +191 -112
  329. oscura/reporting/sections.py +88 -47
  330. oscura/reporting/standards.py +104 -61
  331. oscura/reporting/summary_generator.py +75 -55
  332. oscura/reporting/tables.py +138 -54
  333. oscura/reporting/templates/enhanced/protocol_re.html +525 -0
  334. oscura/sessions/__init__.py +14 -23
  335. oscura/sessions/base.py +3 -3
  336. oscura/sessions/blackbox.py +106 -10
  337. oscura/sessions/generic.py +2 -2
  338. oscura/sessions/legacy.py +783 -0
  339. oscura/side_channel/__init__.py +63 -0
  340. oscura/side_channel/dpa.py +1025 -0
  341. oscura/utils/__init__.py +15 -1
  342. oscura/utils/bitwise.py +118 -0
  343. oscura/{builders → utils/builders}/__init__.py +1 -1
  344. oscura/{comparison → utils/comparison}/__init__.py +6 -6
  345. oscura/{comparison → utils/comparison}/compare.py +202 -101
  346. oscura/{comparison → utils/comparison}/golden.py +83 -63
  347. oscura/{comparison → utils/comparison}/limits.py +313 -89
  348. oscura/{comparison → utils/comparison}/mask.py +151 -45
  349. oscura/{comparison → utils/comparison}/trace_diff.py +1 -1
  350. oscura/{comparison → utils/comparison}/visualization.py +147 -89
  351. oscura/{component → utils/component}/__init__.py +3 -3
  352. oscura/{component → utils/component}/impedance.py +122 -58
  353. oscura/{component → utils/component}/reactive.py +165 -168
  354. oscura/{component → utils/component}/transmission_line.py +3 -3
  355. oscura/{filtering → utils/filtering}/__init__.py +6 -6
  356. oscura/{filtering → utils/filtering}/base.py +1 -1
  357. oscura/{filtering → utils/filtering}/convenience.py +2 -2
  358. oscura/{filtering → utils/filtering}/design.py +169 -93
  359. oscura/{filtering → utils/filtering}/filters.py +2 -2
  360. oscura/{filtering → utils/filtering}/introspection.py +2 -2
  361. oscura/utils/geometry.py +31 -0
  362. oscura/utils/imports.py +184 -0
  363. oscura/utils/lazy.py +1 -1
  364. oscura/{math → utils/math}/__init__.py +2 -2
  365. oscura/{math → utils/math}/arithmetic.py +114 -48
  366. oscura/{math → utils/math}/interpolation.py +139 -106
  367. oscura/utils/memory.py +129 -66
  368. oscura/utils/memory_advanced.py +92 -9
  369. oscura/utils/memory_extensions.py +10 -8
  370. oscura/{optimization → utils/optimization}/__init__.py +1 -1
  371. oscura/{optimization → utils/optimization}/search.py +2 -2
  372. oscura/utils/performance/__init__.py +58 -0
  373. oscura/utils/performance/caching.py +889 -0
  374. oscura/utils/performance/lsh_clustering.py +333 -0
  375. oscura/utils/performance/memory_optimizer.py +699 -0
  376. oscura/utils/performance/optimizations.py +675 -0
  377. oscura/utils/performance/parallel.py +654 -0
  378. oscura/utils/performance/profiling.py +661 -0
  379. oscura/{pipeline → utils/pipeline}/base.py +1 -1
  380. oscura/{pipeline → utils/pipeline}/composition.py +1 -1
  381. oscura/{pipeline → utils/pipeline}/parallel.py +3 -2
  382. oscura/{pipeline → utils/pipeline}/pipeline.py +1 -1
  383. oscura/{pipeline → utils/pipeline}/reverse_engineering.py +412 -221
  384. oscura/{search → utils/search}/__init__.py +3 -3
  385. oscura/{search → utils/search}/anomaly.py +188 -58
  386. oscura/utils/search/context.py +294 -0
  387. oscura/{search → utils/search}/pattern.py +138 -10
  388. oscura/utils/serial.py +51 -0
  389. oscura/utils/storage/__init__.py +61 -0
  390. oscura/utils/storage/database.py +1166 -0
  391. oscura/{streaming → utils/streaming}/chunked.py +302 -143
  392. oscura/{streaming → utils/streaming}/progressive.py +1 -1
  393. oscura/{streaming → utils/streaming}/realtime.py +3 -2
  394. oscura/{triggering → utils/triggering}/__init__.py +6 -6
  395. oscura/{triggering → utils/triggering}/base.py +6 -6
  396. oscura/{triggering → utils/triggering}/edge.py +2 -2
  397. oscura/{triggering → utils/triggering}/pattern.py +2 -2
  398. oscura/{triggering → utils/triggering}/pulse.py +115 -74
  399. oscura/{triggering → utils/triggering}/window.py +2 -2
  400. oscura/utils/validation.py +32 -0
  401. oscura/validation/__init__.py +121 -0
  402. oscura/{compliance → validation/compliance}/__init__.py +5 -5
  403. oscura/{compliance → validation/compliance}/advanced.py +5 -5
  404. oscura/{compliance → validation/compliance}/masks.py +1 -1
  405. oscura/{compliance → validation/compliance}/reporting.py +127 -53
  406. oscura/{compliance → validation/compliance}/testing.py +114 -52
  407. oscura/validation/compliance_tests.py +915 -0
  408. oscura/validation/fuzzer.py +990 -0
  409. oscura/validation/grammar_tests.py +596 -0
  410. oscura/validation/grammar_validator.py +904 -0
  411. oscura/validation/hil_testing.py +977 -0
  412. oscura/{quality → validation/quality}/__init__.py +4 -4
  413. oscura/{quality → validation/quality}/ensemble.py +251 -171
  414. oscura/{quality → validation/quality}/explainer.py +3 -3
  415. oscura/{quality → validation/quality}/scoring.py +1 -1
  416. oscura/{quality → validation/quality}/warnings.py +4 -4
  417. oscura/validation/regression_suite.py +808 -0
  418. oscura/validation/replay.py +788 -0
  419. oscura/{testing → validation/testing}/__init__.py +2 -2
  420. oscura/{testing → validation/testing}/synthetic.py +5 -5
  421. oscura/visualization/__init__.py +9 -0
  422. oscura/visualization/accessibility.py +1 -1
  423. oscura/visualization/annotations.py +64 -67
  424. oscura/visualization/colors.py +7 -7
  425. oscura/visualization/digital.py +180 -81
  426. oscura/visualization/eye.py +236 -85
  427. oscura/visualization/interactive.py +320 -143
  428. oscura/visualization/jitter.py +587 -247
  429. oscura/visualization/layout.py +169 -134
  430. oscura/visualization/optimization.py +103 -52
  431. oscura/visualization/palettes.py +1 -1
  432. oscura/visualization/power.py +427 -211
  433. oscura/visualization/power_extended.py +626 -297
  434. oscura/visualization/presets.py +2 -0
  435. oscura/visualization/protocols.py +495 -181
  436. oscura/visualization/render.py +79 -63
  437. oscura/visualization/reverse_engineering.py +171 -124
  438. oscura/visualization/signal_integrity.py +460 -279
  439. oscura/visualization/specialized.py +190 -100
  440. oscura/visualization/spectral.py +670 -255
  441. oscura/visualization/thumbnails.py +166 -137
  442. oscura/visualization/waveform.py +150 -63
  443. oscura/workflows/__init__.py +3 -0
  444. oscura/{batch → workflows/batch}/__init__.py +5 -5
  445. oscura/{batch → workflows/batch}/advanced.py +150 -75
  446. oscura/workflows/batch/aggregate.py +531 -0
  447. oscura/workflows/batch/analyze.py +236 -0
  448. oscura/{batch → workflows/batch}/logging.py +2 -2
  449. oscura/{batch → workflows/batch}/metrics.py +1 -1
  450. oscura/workflows/complete_re.py +1144 -0
  451. oscura/workflows/compliance.py +44 -54
  452. oscura/workflows/digital.py +197 -51
  453. oscura/workflows/legacy/__init__.py +12 -0
  454. oscura/{workflow → workflows/legacy}/dag.py +4 -1
  455. oscura/workflows/multi_trace.py +9 -9
  456. oscura/workflows/power.py +42 -62
  457. oscura/workflows/protocol.py +82 -49
  458. oscura/workflows/reverse_engineering.py +351 -150
  459. oscura/workflows/signal_integrity.py +157 -82
  460. oscura-0.7.0.dist-info/METADATA +661 -0
  461. oscura-0.7.0.dist-info/RECORD +591 -0
  462. oscura/batch/aggregate.py +0 -300
  463. oscura/batch/analyze.py +0 -139
  464. oscura/dsl/__init__.py +0 -73
  465. oscura/exceptions.py +0 -59
  466. oscura/exploratory/fuzzy.py +0 -513
  467. oscura/exploratory/sync.py +0 -384
  468. oscura/exporters/__init__.py +0 -94
  469. oscura/exporters/csv.py +0 -303
  470. oscura/exporters/exporters.py +0 -44
  471. oscura/exporters/hdf5.py +0 -217
  472. oscura/exporters/html_export.py +0 -701
  473. oscura/exporters/json_export.py +0 -291
  474. oscura/exporters/markdown_export.py +0 -367
  475. oscura/exporters/matlab_export.py +0 -354
  476. oscura/exporters/npz_export.py +0 -219
  477. oscura/exporters/spice_export.py +0 -210
  478. oscura/search/context.py +0 -149
  479. oscura/session/__init__.py +0 -34
  480. oscura/session/annotations.py +0 -289
  481. oscura/session/history.py +0 -313
  482. oscura/session/session.py +0 -520
  483. oscura/workflow/__init__.py +0 -13
  484. oscura-0.5.1.dist-info/METADATA +0 -583
  485. oscura-0.5.1.dist-info/RECORD +0 -481
  486. /oscura/core/{config.py → config/legacy.py} +0 -0
  487. /oscura/{extensibility → core/extensibility}/__init__.py +0 -0
  488. /oscura/{extensibility → core/extensibility}/registry.py +0 -0
  489. /oscura/{plugins → core/plugins}/isolation.py +0 -0
  490. /oscura/{schemas → core/schemas}/bus_configuration.json +0 -0
  491. /oscura/{builders → utils/builders}/signal_builder.py +0 -0
  492. /oscura/{optimization → utils/optimization}/parallel.py +0 -0
  493. /oscura/{pipeline → utils/pipeline}/__init__.py +0 -0
  494. /oscura/{streaming → utils/streaming}/__init__.py +0 -0
  495. {oscura-0.5.1.dist-info → oscura-0.7.0.dist-info}/WHEEL +0 -0
  496. {oscura-0.5.1.dist-info → oscura-0.7.0.dist-info}/entry_points.txt +0 -0
  497. {oscura-0.5.1.dist-info → oscura-0.7.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,34 @@
1
+ # Oscura Web Dashboard - Static Assets
2
+
3
+ This directory contains static assets (CSS, JavaScript, images) for the Oscura web dashboard.
4
+
5
+ ## Directory Structure
6
+
7
+ ```
8
+ static/
9
+ ├── css/ # Custom CSS stylesheets (optional)
10
+ ├── js/ # Custom JavaScript files (optional)
11
+ └── img/ # Images and icons (optional)
12
+ ```
13
+
14
+ ## Usage
15
+
16
+ Static files are served automatically by FastAPI at `/static/` URL path.
17
+
18
+ To reference static assets in templates:
19
+
20
+ ```html
21
+ <link rel="stylesheet" href="/static/css/custom.css">
22
+ <script src="/static/js/custom.js"></script>
23
+ <img src="/static/img/logo.png" alt="Logo">
24
+ ```
25
+
26
+ ## Built-in Assets
27
+
28
+ The dashboard uses CDN-hosted assets by default:
29
+
30
+ - **Bootstrap 5.3.0** - CSS framework
31
+ - **Bootstrap Icons 1.11.0** - Icon library
32
+ - **Plotly.js 2.26.0** - Interactive charting
33
+
34
+ Custom assets placed here will override or extend the default styling.
@@ -0,0 +1,181 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en" data-theme="{{ theme }}">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>{% block title %}{{ title }}{% endblock %}</title>
7
+
8
+ <!-- Bootstrap CSS -->
9
+ <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
10
+
11
+ <!-- Bootstrap Icons -->
12
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.0/font/bootstrap-icons.css">
13
+
14
+ <!-- Plotly.js for waveform visualization -->
15
+ <script src="https://cdn.plot.ly/plotly-2.26.0.min.js"></script>
16
+
17
+ <style>
18
+ :root[data-theme="dark"] {
19
+ --bs-body-bg: #1a1a1a;
20
+ --bs-body-color: #e0e0e0;
21
+ --bs-border-color: #333;
22
+ --bs-card-bg: #2a2a2a;
23
+ --bs-primary: #00d9ff;
24
+ --bs-secondary: #6c757d;
25
+ --bs-success: #28a745;
26
+ --bs-danger: #dc3545;
27
+ }
28
+
29
+ :root[data-theme="light"] {
30
+ --bs-body-bg: #ffffff;
31
+ --bs-body-color: #212529;
32
+ --bs-border-color: #dee2e6;
33
+ --bs-card-bg: #f8f9fa;
34
+ --bs-primary: #0d6efd;
35
+ --bs-secondary: #6c757d;
36
+ --bs-success: #28a745;
37
+ --bs-danger: #dc3545;
38
+ }
39
+
40
+ body {
41
+ background-color: var(--bs-body-bg);
42
+ color: var(--bs-body-color);
43
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
44
+ }
45
+
46
+ .navbar {
47
+ background-color: var(--bs-card-bg);
48
+ border-bottom: 1px solid var(--bs-border-color);
49
+ }
50
+
51
+ .card {
52
+ background-color: var(--bs-card-bg);
53
+ border: 1px solid var(--bs-border-color);
54
+ }
55
+
56
+ .btn-primary {
57
+ background-color: var(--bs-primary);
58
+ border-color: var(--bs-primary);
59
+ }
60
+
61
+ .dropzone {
62
+ border: 2px dashed var(--bs-border-color);
63
+ border-radius: 8px;
64
+ padding: 40px;
65
+ text-align: center;
66
+ cursor: pointer;
67
+ transition: all 0.3s ease;
68
+ }
69
+
70
+ .dropzone:hover, .dropzone.drag-over {
71
+ border-color: var(--bs-primary);
72
+ background-color: rgba(0, 217, 255, 0.1);
73
+ }
74
+
75
+ .progress-indicator {
76
+ position: fixed;
77
+ top: 50%;
78
+ left: 50%;
79
+ transform: translate(-50%, -50%);
80
+ z-index: 9999;
81
+ }
82
+
83
+ .session-status {
84
+ display: inline-block;
85
+ padding: 4px 12px;
86
+ border-radius: 4px;
87
+ font-size: 0.85em;
88
+ font-weight: 500;
89
+ }
90
+
91
+ .status-processing {
92
+ background-color: rgba(255, 193, 7, 0.2);
93
+ color: #ffc107;
94
+ }
95
+
96
+ .status-complete {
97
+ background-color: rgba(40, 167, 69, 0.2);
98
+ color: #28a745;
99
+ }
100
+
101
+ .status-error {
102
+ background-color: rgba(220, 53, 69, 0.2);
103
+ color: #dc3545;
104
+ }
105
+ </style>
106
+
107
+ {% block extra_head %}{% endblock %}
108
+ </head>
109
+ <body>
110
+ <!-- Navigation -->
111
+ <nav class="navbar navbar-expand-lg sticky-top">
112
+ <div class="container-fluid">
113
+ <a class="navbar-brand" href="/">
114
+ <i class="bi bi-cpu"></i> Oscura Dashboard
115
+ </a>
116
+ <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
117
+ <span class="navbar-toggler-icon"></span>
118
+ </button>
119
+ <div class="collapse navbar-collapse" id="navbarNav">
120
+ <ul class="navbar-nav me-auto">
121
+ <li class="nav-item">
122
+ <a class="nav-link" href="/">
123
+ <i class="bi bi-house"></i> Home
124
+ </a>
125
+ </li>
126
+ <li class="nav-item">
127
+ <a class="nav-link" href="/sessions">
128
+ <i class="bi bi-list-task"></i> Sessions
129
+ </a>
130
+ </li>
131
+ <li class="nav-item">
132
+ <a class="nav-link" href="/protocols">
133
+ <i class="bi bi-diagram-3"></i> Protocols
134
+ </a>
135
+ </li>
136
+ </ul>
137
+ <div class="d-flex">
138
+ <button class="btn btn-outline-secondary btn-sm" onclick="toggleTheme()">
139
+ <i class="bi bi-moon-stars" id="theme-icon"></i>
140
+ </button>
141
+ </div>
142
+ </div>
143
+ </div>
144
+ </nav>
145
+
146
+ <!-- Main Content -->
147
+ <main class="container-fluid py-4">
148
+ {% block content %}{% endblock %}
149
+ </main>
150
+
151
+ <!-- Bootstrap JS -->
152
+ <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
153
+
154
+ <!-- Theme Toggle -->
155
+ <script>
156
+ function toggleTheme() {
157
+ const html = document.documentElement;
158
+ const currentTheme = html.getAttribute('data-theme');
159
+ const newTheme = currentTheme === 'dark' ? 'light' : 'dark';
160
+ html.setAttribute('data-theme', newTheme);
161
+
162
+ // Update icon
163
+ const icon = document.getElementById('theme-icon');
164
+ icon.className = newTheme === 'dark' ? 'bi bi-moon-stars' : 'bi bi-sun';
165
+
166
+ // Save preference
167
+ localStorage.setItem('theme', newTheme);
168
+ }
169
+
170
+ // Load saved theme preference
171
+ const savedTheme = localStorage.getItem('theme') || '{{ theme }}';
172
+ document.documentElement.setAttribute('data-theme', savedTheme);
173
+
174
+ // Update icon
175
+ const icon = document.getElementById('theme-icon');
176
+ icon.className = savedTheme === 'dark' ? 'bi bi-moon-stars' : 'bi bi-sun';
177
+ </script>
178
+
179
+ {% block extra_scripts %}{% endblock %}
180
+ </body>
181
+ </html>
@@ -0,0 +1,120 @@
1
+ {% extends "base.html" %}
2
+
3
+ {% block title %}Export - {{ title }}{% endblock %}
4
+
5
+ {% block content %}
6
+ <div class="row">
7
+ <div class="col-lg-8 offset-lg-2">
8
+ <div class="card">
9
+ <div class="card-body">
10
+ <h2 class="card-title mb-4">
11
+ <i class="bi bi-download"></i> Export & Download
12
+ </h2>
13
+
14
+ <p class="lead">Download generated artifacts for protocol analysis tools.</p>
15
+
16
+ <hr>
17
+
18
+ <div class="row g-3">
19
+ {% if artifacts.dissector_path %}
20
+ <div class="col-md-6">
21
+ <div class="card h-100">
22
+ <div class="card-body">
23
+ <h5 class="card-title">
24
+ <i class="bi bi-puzzle"></i> Wireshark Dissector
25
+ </h5>
26
+ <p class="card-text">Lua dissector for Wireshark protocol analysis</p>
27
+ <a href="/api/download/{{ session_id }}/dissector" class="btn btn-primary">
28
+ <i class="bi bi-download"></i> Download
29
+ </a>
30
+ </div>
31
+ </div>
32
+ </div>
33
+ {% endif %}
34
+
35
+ {% if artifacts.scapy_layer_path %}
36
+ <div class="col-md-6">
37
+ <div class="card h-100">
38
+ <div class="card-body">
39
+ <h5 class="card-title">
40
+ <i class="bi bi-code-slash"></i> Scapy Layer
41
+ </h5>
42
+ <p class="card-text">Python Scapy layer for packet manipulation</p>
43
+ <a href="/api/download/{{ session_id }}/scapy" class="btn btn-primary">
44
+ <i class="bi bi-download"></i> Download
45
+ </a>
46
+ </div>
47
+ </div>
48
+ </div>
49
+ {% endif %}
50
+
51
+ {% if artifacts.kaitai_path %}
52
+ <div class="col-md-6">
53
+ <div class="card h-100">
54
+ <div class="card-body">
55
+ <h5 class="card-title">
56
+ <i class="bi bi-file-binary"></i> Kaitai Struct
57
+ </h5>
58
+ <p class="card-text">Binary parser definition for multiple languages</p>
59
+ <a href="/api/download/{{ session_id }}/kaitai" class="btn btn-primary">
60
+ <i class="bi bi-download"></i> Download
61
+ </a>
62
+ </div>
63
+ </div>
64
+ </div>
65
+ {% endif %}
66
+
67
+ {% if artifacts.test_vectors_path %}
68
+ <div class="col-md-6">
69
+ <div class="card h-100">
70
+ <div class="card-body">
71
+ <h5 class="card-title">
72
+ <i class="bi bi-check2-square"></i> Test Vectors
73
+ </h5>
74
+ <p class="card-text">Generated test cases for protocol validation</p>
75
+ <a href="/api/download/{{ session_id }}/tests" class="btn btn-primary">
76
+ <i class="bi bi-download"></i> Download
77
+ </a>
78
+ </div>
79
+ </div>
80
+ </div>
81
+ {% endif %}
82
+
83
+ {% if artifacts.report_path %}
84
+ <div class="col-md-6">
85
+ <div class="card h-100">
86
+ <div class="card-body">
87
+ <h5 class="card-title">
88
+ <i class="bi bi-file-text"></i> Analysis Report
89
+ </h5>
90
+ <p class="card-text">Comprehensive analysis report (HTML/PDF)</p>
91
+ <a href="/api/download/{{ session_id }}/report" class="btn btn-primary">
92
+ <i class="bi bi-download"></i> Download
93
+ </a>
94
+ </div>
95
+ </div>
96
+ </div>
97
+ {% endif %}
98
+
99
+ {% if not artifacts %}
100
+ <div class="col-12">
101
+ <div class="alert alert-warning">
102
+ <i class="bi bi-exclamation-triangle"></i>
103
+ No artifacts available yet. Analysis may still be in progress or incomplete.
104
+ </div>
105
+ </div>
106
+ {% endif %}
107
+ </div>
108
+
109
+ <hr class="mt-4">
110
+
111
+ <div class="d-grid gap-2">
112
+ <a href="/session/{{ session_id }}" class="btn btn-outline-secondary">
113
+ <i class="bi bi-arrow-left"></i> Back to Session
114
+ </a>
115
+ </div>
116
+ </div>
117
+ </div>
118
+ </div>
119
+ </div>
120
+ {% endblock %}
@@ -0,0 +1,284 @@
1
+ {% extends "base.html" %}
2
+
3
+ {% block title %}Home - {{ title }}{% endblock %}
4
+
5
+ {% block content %}
6
+ <div class="row">
7
+ <div class="col-lg-8 offset-lg-2">
8
+ <div class="card mb-4">
9
+ <div class="card-body">
10
+ <h1 class="card-title mb-4">
11
+ <i class="bi bi-cpu"></i> Protocol Analysis
12
+ </h1>
13
+ <p class="lead">
14
+ Upload signal capture files for automated protocol reverse engineering.
15
+ Supports VCD, WAV, PCAP, and other formats.
16
+ </p>
17
+ </div>
18
+ </div>
19
+
20
+ <!-- File Upload -->
21
+ <div class="card">
22
+ <div class="card-body">
23
+ <h5 class="card-title mb-4">Upload Capture File</h5>
24
+
25
+ <form id="uploadForm" enctype="multipart/form-data">
26
+ <!-- Dropzone -->
27
+ <div class="dropzone mb-4" id="dropzone">
28
+ <i class="bi bi-cloud-upload" style="font-size: 3rem; opacity: 0.5;"></i>
29
+ <h5 class="mt-3">Drag & Drop File Here</h5>
30
+ <p class="text-muted">or click to browse</p>
31
+ <p class="text-muted small">Maximum file size: {{ max_file_size_mb }} MB</p>
32
+ <input type="file" id="fileInput" name="file" class="d-none" accept=".vcd,.wav,.pcap,.pcapng,.csv,.bin">
33
+ </div>
34
+
35
+ <div id="fileInfo" class="mb-3 d-none">
36
+ <div class="alert alert-info">
37
+ <i class="bi bi-file-earmark"></i>
38
+ <strong>Selected:</strong> <span id="fileName"></span>
39
+ (<span id="fileSize"></span>)
40
+ </div>
41
+ </div>
42
+
43
+ <!-- Analysis Options -->
44
+ <div class="row mb-3">
45
+ <div class="col-md-6">
46
+ <label for="protocolHint" class="form-label">
47
+ <i class="bi bi-hint"></i> Protocol Hint (Optional)
48
+ </label>
49
+ <select class="form-select" id="protocolHint" name="protocol_hint">
50
+ <option value="">Auto-detect</option>
51
+ <option value="uart">UART</option>
52
+ <option value="spi">SPI</option>
53
+ <option value="i2c">I2C</option>
54
+ <option value="can">CAN Bus</option>
55
+ <option value="usb">USB</option>
56
+ <option value="ethernet">Ethernet</option>
57
+ </select>
58
+ </div>
59
+ </div>
60
+
61
+ <div class="row mb-4">
62
+ <div class="col-md-4">
63
+ <div class="form-check">
64
+ <input class="form-check-input" type="checkbox" id="autoCRC" name="auto_crc" checked>
65
+ <label class="form-check-label" for="autoCRC">
66
+ Auto-detect CRC
67
+ </label>
68
+ </div>
69
+ </div>
70
+ <div class="col-md-4">
71
+ <div class="form-check">
72
+ <input class="form-check-input" type="checkbox" id="detectCrypto" name="detect_crypto" checked>
73
+ <label class="form-check-label" for="detectCrypto">
74
+ Detect Crypto
75
+ </label>
76
+ </div>
77
+ </div>
78
+ <div class="col-md-4">
79
+ <div class="form-check">
80
+ <input class="form-check-input" type="checkbox" id="generateTests" name="generate_tests" checked>
81
+ <label class="form-check-label" for="generateTests">
82
+ Generate Tests
83
+ </label>
84
+ </div>
85
+ </div>
86
+ </div>
87
+
88
+ <!-- Submit Button -->
89
+ <button type="submit" class="btn btn-primary btn-lg w-100" id="analyzeBtn">
90
+ <i class="bi bi-play-circle"></i> Start Analysis
91
+ </button>
92
+ </form>
93
+
94
+ <!-- Progress Indicator -->
95
+ <div id="progressContainer" class="mt-4 d-none">
96
+ <div class="progress">
97
+ <div class="progress-bar progress-bar-striped progress-bar-animated" role="progressbar" id="progressBar" style="width: 0%"></div>
98
+ </div>
99
+ <p class="text-center mt-2" id="progressText">Initializing...</p>
100
+ </div>
101
+ </div>
102
+ </div>
103
+
104
+ <!-- Recent Sessions -->
105
+ <div class="card mt-4">
106
+ <div class="card-body">
107
+ <h5 class="card-title mb-3">
108
+ <i class="bi bi-clock-history"></i> Quick Actions
109
+ </h5>
110
+ <div class="d-grid gap-2">
111
+ <a href="/sessions" class="btn btn-outline-primary">
112
+ <i class="bi bi-list-task"></i> View All Sessions
113
+ </a>
114
+ <a href="/protocols" class="btn btn-outline-primary">
115
+ <i class="bi bi-diagram-3"></i> Browse Protocols
116
+ </a>
117
+ </div>
118
+ </div>
119
+ </div>
120
+ </div>
121
+ </div>
122
+ {% endblock %}
123
+
124
+ {% block extra_scripts %}
125
+ <script>
126
+ const dropzone = document.getElementById('dropzone');
127
+ const fileInput = document.getElementById('fileInput');
128
+ const fileInfo = document.getElementById('fileInfo');
129
+ const fileName = document.getElementById('fileName');
130
+ const fileSize = document.getElementById('fileSize');
131
+ const uploadForm = document.getElementById('uploadForm');
132
+ const progressContainer = document.getElementById('progressContainer');
133
+ const progressBar = document.getElementById('progressBar');
134
+ const progressText = document.getElementById('progressText');
135
+ const analyzeBtn = document.getElementById('analyzeBtn');
136
+
137
+ // Dropzone click
138
+ dropzone.addEventListener('click', () => fileInput.click());
139
+
140
+ // Drag and drop
141
+ dropzone.addEventListener('dragover', (e) => {
142
+ e.preventDefault();
143
+ dropzone.classList.add('drag-over');
144
+ });
145
+
146
+ dropzone.addEventListener('dragleave', () => {
147
+ dropzone.classList.remove('drag-over');
148
+ });
149
+
150
+ dropzone.addEventListener('drop', (e) => {
151
+ e.preventDefault();
152
+ dropzone.classList.remove('drag-over');
153
+
154
+ const files = e.dataTransfer.files;
155
+ if (files.length > 0) {
156
+ fileInput.files = files;
157
+ updateFileInfo(files[0]);
158
+ }
159
+ });
160
+
161
+ // File selection
162
+ fileInput.addEventListener('change', (e) => {
163
+ const file = e.target.files[0];
164
+ if (file) {
165
+ updateFileInfo(file);
166
+ }
167
+ });
168
+
169
+ function updateFileInfo(file) {
170
+ fileName.textContent = file.name;
171
+ fileSize.textContent = formatFileSize(file.size);
172
+ fileInfo.classList.remove('d-none');
173
+ }
174
+
175
+ function formatFileSize(bytes) {
176
+ if (bytes < 1024) return bytes + ' B';
177
+ if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(2) + ' KB';
178
+ return (bytes / (1024 * 1024)).toFixed(2) + ' MB';
179
+ }
180
+
181
+ // Form submission
182
+ uploadForm.addEventListener('submit', async (e) => {
183
+ e.preventDefault();
184
+
185
+ const file = fileInput.files[0];
186
+ if (!file) {
187
+ alert('Please select a file first');
188
+ return;
189
+ }
190
+
191
+ // Show progress
192
+ progressContainer.classList.remove('d-none');
193
+ analyzeBtn.disabled = true;
194
+ progressBar.style.width = '10%';
195
+ progressText.textContent = 'Uploading file...';
196
+
197
+ // Create form data
198
+ const formData = new FormData();
199
+ formData.append('file', file);
200
+ formData.append('protocol_hint', document.getElementById('protocolHint').value);
201
+ formData.append('auto_crc', document.getElementById('autoCRC').checked);
202
+ formData.append('detect_crypto', document.getElementById('detectCrypto').checked);
203
+ formData.append('generate_tests', document.getElementById('generateTests').checked);
204
+
205
+ try {
206
+ // Upload file
207
+ const response = await fetch('/api/upload', {
208
+ method: 'POST',
209
+ body: formData
210
+ });
211
+
212
+ if (!response.ok) {
213
+ throw new Error('Upload failed');
214
+ }
215
+
216
+ const data = await response.json();
217
+ const sessionId = data.session_id;
218
+
219
+ // Update progress
220
+ progressBar.style.width = '30%';
221
+ progressText.textContent = 'Analysis started...';
222
+
223
+ // Connect WebSocket for real-time updates
224
+ const ws = new WebSocket(`ws://${window.location.host}/ws/${sessionId}`);
225
+
226
+ ws.onmessage = (event) => {
227
+ const update = JSON.parse(event.data);
228
+
229
+ if (update.type === 'status') {
230
+ progressBar.style.width = update.progress + '%';
231
+ progressText.textContent = update.message;
232
+
233
+ if (update.status === 'complete') {
234
+ setTimeout(() => {
235
+ window.location.href = `/session/${sessionId}`;
236
+ }, 1000);
237
+ }
238
+ } else if (update.type === 'error') {
239
+ progressBar.classList.add('bg-danger');
240
+ progressText.textContent = 'Error: ' + update.message;
241
+ analyzeBtn.disabled = false;
242
+ }
243
+ };
244
+
245
+ ws.onerror = () => {
246
+ // Fallback to polling if WebSocket fails
247
+ pollSessionStatus(sessionId);
248
+ };
249
+
250
+ } catch (error) {
251
+ alert('Upload failed: ' + error.message);
252
+ progressContainer.classList.add('d-none');
253
+ analyzeBtn.disabled = false;
254
+ }
255
+ });
256
+
257
+ // Fallback polling function
258
+ async function pollSessionStatus(sessionId) {
259
+ const interval = setInterval(async () => {
260
+ try {
261
+ const response = await fetch(`/api/session/${sessionId}/status`);
262
+ const data = await response.json();
263
+
264
+ progressText.textContent = `Status: ${data.status}`;
265
+
266
+ if (data.status === 'complete') {
267
+ clearInterval(interval);
268
+ progressBar.style.width = '100%';
269
+ setTimeout(() => {
270
+ window.location.href = `/session/${sessionId}`;
271
+ }, 1000);
272
+ } else if (data.status === 'error') {
273
+ clearInterval(interval);
274
+ progressBar.classList.add('bg-danger');
275
+ progressText.textContent = 'Error: ' + data.error;
276
+ analyzeBtn.disabled = false;
277
+ }
278
+ } catch (error) {
279
+ console.error('Poll error:', error);
280
+ }
281
+ }, 2000);
282
+ }
283
+ </script>
284
+ {% endblock %}
@@ -0,0 +1,58 @@
1
+ {% extends "base.html" %}
2
+
3
+ {% block title %}Protocols - {{ title }}{% endblock %}
4
+
5
+ {% block content %}
6
+ <div class="row">
7
+ <div class="col-12">
8
+ <div class="card">
9
+ <div class="card-body">
10
+ <h1 class="card-title mb-4">
11
+ <i class="bi bi-diagram-3"></i> Discovered Protocols
12
+ </h1>
13
+
14
+ {% if protocols %}
15
+ <div class="row">
16
+ {% for protocol in protocols %}
17
+ <div class="col-md-6 col-lg-4 mb-4">
18
+ <div class="card h-100">
19
+ <div class="card-body">
20
+ <h5 class="card-title">{{ protocol.protocol_name }}</h5>
21
+ <p class="text-muted small">{{ protocol.filename }}</p>
22
+
23
+ <div class="mb-2">
24
+ <strong>Confidence:</strong>
25
+ <div class="progress" style="height: 20px;">
26
+ <div class="progress-bar" role="progressbar"
27
+ style="width: {{ (protocol.confidence * 100)|round }}%"
28
+ aria-valuenow="{{ (protocol.confidence * 100)|round }}"
29
+ aria-valuemin="0" aria-valuemax="100">
30
+ {{ (protocol.confidence * 100)|round(1) }}%
31
+ </div>
32
+ </div>
33
+ </div>
34
+
35
+ <p class="mb-1"><strong>Messages:</strong> {{ protocol.message_count }}</p>
36
+ <p class="mb-3"><strong>Fields:</strong> {{ protocol.field_count }}</p>
37
+
38
+ <a href="/session/{{ protocol.session_id }}" class="btn btn-primary btn-sm">
39
+ <i class="bi bi-eye"></i> View Details
40
+ </a>
41
+ </div>
42
+ <div class="card-footer text-muted small">
43
+ {{ protocol.created_at[:19] }}
44
+ </div>
45
+ </div>
46
+ </div>
47
+ {% endfor %}
48
+ </div>
49
+ {% else %}
50
+ <div class="alert alert-info">
51
+ <i class="bi bi-info-circle"></i> No protocols discovered yet. <a href="/">Upload a file</a> to analyze.
52
+ </div>
53
+ {% endif %}
54
+ </div>
55
+ </div>
56
+ </div>
57
+ </div>
58
+ {% endblock %}