oscura 0.5.0__py3-none-any.whl → 0.6.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 (513) 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/__init__.py +0 -48
  5. oscura/analyzers/digital/edges.py +325 -65
  6. oscura/analyzers/digital/extraction.py +0 -195
  7. oscura/analyzers/digital/quality.py +293 -166
  8. oscura/analyzers/digital/timing.py +260 -115
  9. oscura/analyzers/digital/timing_numba.py +334 -0
  10. oscura/analyzers/entropy.py +605 -0
  11. oscura/analyzers/eye/diagram.py +176 -109
  12. oscura/analyzers/eye/metrics.py +5 -5
  13. oscura/analyzers/jitter/__init__.py +6 -4
  14. oscura/analyzers/jitter/ber.py +52 -52
  15. oscura/analyzers/jitter/classification.py +156 -0
  16. oscura/analyzers/jitter/decomposition.py +163 -113
  17. oscura/analyzers/jitter/spectrum.py +80 -64
  18. oscura/analyzers/ml/__init__.py +39 -0
  19. oscura/analyzers/ml/features.py +600 -0
  20. oscura/analyzers/ml/signal_classifier.py +604 -0
  21. oscura/analyzers/packet/daq.py +246 -158
  22. oscura/analyzers/packet/parser.py +12 -1
  23. oscura/analyzers/packet/payload.py +50 -2110
  24. oscura/analyzers/packet/payload_analysis.py +361 -181
  25. oscura/analyzers/packet/payload_patterns.py +133 -70
  26. oscura/analyzers/packet/stream.py +84 -23
  27. oscura/analyzers/patterns/__init__.py +26 -5
  28. oscura/analyzers/patterns/anomaly_detection.py +908 -0
  29. oscura/analyzers/patterns/clustering.py +169 -108
  30. oscura/analyzers/patterns/clustering_optimized.py +227 -0
  31. oscura/analyzers/patterns/discovery.py +1 -1
  32. oscura/analyzers/patterns/matching.py +581 -197
  33. oscura/analyzers/patterns/pattern_mining.py +778 -0
  34. oscura/analyzers/patterns/periodic.py +121 -38
  35. oscura/analyzers/patterns/sequences.py +175 -78
  36. oscura/analyzers/power/conduction.py +1 -1
  37. oscura/analyzers/power/soa.py +6 -6
  38. oscura/analyzers/power/switching.py +250 -110
  39. oscura/analyzers/protocol/__init__.py +17 -1
  40. oscura/analyzers/protocols/__init__.py +1 -22
  41. oscura/analyzers/protocols/base.py +6 -6
  42. oscura/analyzers/protocols/ble/__init__.py +38 -0
  43. oscura/analyzers/protocols/ble/analyzer.py +809 -0
  44. oscura/analyzers/protocols/ble/uuids.py +288 -0
  45. oscura/analyzers/protocols/can.py +257 -127
  46. oscura/analyzers/protocols/can_fd.py +107 -80
  47. oscura/analyzers/protocols/flexray.py +139 -80
  48. oscura/analyzers/protocols/hdlc.py +93 -58
  49. oscura/analyzers/protocols/i2c.py +247 -106
  50. oscura/analyzers/protocols/i2s.py +138 -86
  51. oscura/analyzers/protocols/industrial/__init__.py +40 -0
  52. oscura/analyzers/protocols/industrial/bacnet/__init__.py +33 -0
  53. oscura/analyzers/protocols/industrial/bacnet/analyzer.py +708 -0
  54. oscura/analyzers/protocols/industrial/bacnet/encoding.py +412 -0
  55. oscura/analyzers/protocols/industrial/bacnet/services.py +622 -0
  56. oscura/analyzers/protocols/industrial/ethercat/__init__.py +30 -0
  57. oscura/analyzers/protocols/industrial/ethercat/analyzer.py +474 -0
  58. oscura/analyzers/protocols/industrial/ethercat/mailbox.py +339 -0
  59. oscura/analyzers/protocols/industrial/ethercat/topology.py +166 -0
  60. oscura/analyzers/protocols/industrial/modbus/__init__.py +31 -0
  61. oscura/analyzers/protocols/industrial/modbus/analyzer.py +525 -0
  62. oscura/analyzers/protocols/industrial/modbus/crc.py +79 -0
  63. oscura/analyzers/protocols/industrial/modbus/functions.py +436 -0
  64. oscura/analyzers/protocols/industrial/opcua/__init__.py +21 -0
  65. oscura/analyzers/protocols/industrial/opcua/analyzer.py +552 -0
  66. oscura/analyzers/protocols/industrial/opcua/datatypes.py +446 -0
  67. oscura/analyzers/protocols/industrial/opcua/services.py +264 -0
  68. oscura/analyzers/protocols/industrial/profinet/__init__.py +23 -0
  69. oscura/analyzers/protocols/industrial/profinet/analyzer.py +441 -0
  70. oscura/analyzers/protocols/industrial/profinet/dcp.py +263 -0
  71. oscura/analyzers/protocols/industrial/profinet/ptcp.py +200 -0
  72. oscura/analyzers/protocols/jtag.py +180 -98
  73. oscura/analyzers/protocols/lin.py +219 -114
  74. oscura/analyzers/protocols/manchester.py +4 -4
  75. oscura/analyzers/protocols/onewire.py +253 -149
  76. oscura/analyzers/protocols/parallel_bus/__init__.py +20 -0
  77. oscura/analyzers/protocols/parallel_bus/centronics.py +92 -0
  78. oscura/analyzers/protocols/parallel_bus/gpib.py +137 -0
  79. oscura/analyzers/protocols/spi.py +192 -95
  80. oscura/analyzers/protocols/swd.py +321 -167
  81. oscura/analyzers/protocols/uart.py +267 -125
  82. oscura/analyzers/protocols/usb.py +235 -131
  83. oscura/analyzers/side_channel/power.py +17 -12
  84. oscura/analyzers/signal/__init__.py +15 -0
  85. oscura/analyzers/signal/timing_analysis.py +1086 -0
  86. oscura/analyzers/signal_integrity/__init__.py +4 -1
  87. oscura/analyzers/signal_integrity/sparams.py +2 -19
  88. oscura/analyzers/spectral/chunked.py +129 -60
  89. oscura/analyzers/spectral/chunked_fft.py +300 -94
  90. oscura/analyzers/spectral/chunked_wavelet.py +100 -80
  91. oscura/analyzers/statistical/checksum.py +376 -217
  92. oscura/analyzers/statistical/classification.py +229 -107
  93. oscura/analyzers/statistical/entropy.py +78 -53
  94. oscura/analyzers/statistics/correlation.py +407 -211
  95. oscura/analyzers/statistics/outliers.py +2 -2
  96. oscura/analyzers/statistics/streaming.py +30 -5
  97. oscura/analyzers/validation.py +216 -101
  98. oscura/analyzers/waveform/measurements.py +9 -0
  99. oscura/analyzers/waveform/measurements_with_uncertainty.py +31 -15
  100. oscura/analyzers/waveform/spectral.py +500 -228
  101. oscura/api/__init__.py +31 -5
  102. oscura/api/dsl/__init__.py +582 -0
  103. oscura/{dsl → api/dsl}/commands.py +43 -76
  104. oscura/{dsl → api/dsl}/interpreter.py +26 -51
  105. oscura/{dsl → api/dsl}/parser.py +107 -77
  106. oscura/{dsl → api/dsl}/repl.py +2 -2
  107. oscura/api/dsl.py +1 -1
  108. oscura/{integrations → api/integrations}/__init__.py +1 -1
  109. oscura/{integrations → api/integrations}/llm.py +201 -102
  110. oscura/api/operators.py +3 -3
  111. oscura/api/optimization.py +144 -30
  112. oscura/api/rest_server.py +921 -0
  113. oscura/api/server/__init__.py +17 -0
  114. oscura/api/server/dashboard.py +850 -0
  115. oscura/api/server/static/README.md +34 -0
  116. oscura/api/server/templates/base.html +181 -0
  117. oscura/api/server/templates/export.html +120 -0
  118. oscura/api/server/templates/home.html +284 -0
  119. oscura/api/server/templates/protocols.html +58 -0
  120. oscura/api/server/templates/reports.html +43 -0
  121. oscura/api/server/templates/session_detail.html +89 -0
  122. oscura/api/server/templates/sessions.html +83 -0
  123. oscura/api/server/templates/waveforms.html +73 -0
  124. oscura/automotive/__init__.py +8 -1
  125. oscura/automotive/can/__init__.py +10 -0
  126. oscura/automotive/can/checksum.py +3 -1
  127. oscura/automotive/can/dbc_generator.py +590 -0
  128. oscura/automotive/can/message_wrapper.py +121 -74
  129. oscura/automotive/can/patterns.py +98 -21
  130. oscura/automotive/can/session.py +292 -56
  131. oscura/automotive/can/state_machine.py +6 -3
  132. oscura/automotive/can/stimulus_response.py +97 -75
  133. oscura/automotive/dbc/__init__.py +10 -2
  134. oscura/automotive/dbc/generator.py +84 -56
  135. oscura/automotive/dbc/parser.py +6 -6
  136. oscura/automotive/dtc/data.json +2763 -0
  137. oscura/automotive/dtc/database.py +2 -2
  138. oscura/automotive/flexray/__init__.py +31 -0
  139. oscura/automotive/flexray/analyzer.py +504 -0
  140. oscura/automotive/flexray/crc.py +185 -0
  141. oscura/automotive/flexray/fibex.py +449 -0
  142. oscura/automotive/j1939/__init__.py +45 -8
  143. oscura/automotive/j1939/analyzer.py +605 -0
  144. oscura/automotive/j1939/spns.py +326 -0
  145. oscura/automotive/j1939/transport.py +306 -0
  146. oscura/automotive/lin/__init__.py +47 -0
  147. oscura/automotive/lin/analyzer.py +612 -0
  148. oscura/automotive/loaders/blf.py +13 -2
  149. oscura/automotive/loaders/csv_can.py +143 -72
  150. oscura/automotive/loaders/dispatcher.py +50 -2
  151. oscura/automotive/loaders/mdf.py +86 -45
  152. oscura/automotive/loaders/pcap.py +111 -61
  153. oscura/automotive/uds/__init__.py +4 -0
  154. oscura/automotive/uds/analyzer.py +725 -0
  155. oscura/automotive/uds/decoder.py +140 -58
  156. oscura/automotive/uds/models.py +7 -1
  157. oscura/automotive/visualization.py +1 -1
  158. oscura/cli/analyze.py +348 -0
  159. oscura/cli/batch.py +142 -122
  160. oscura/cli/benchmark.py +275 -0
  161. oscura/cli/characterize.py +137 -82
  162. oscura/cli/compare.py +224 -131
  163. oscura/cli/completion.py +250 -0
  164. oscura/cli/config_cmd.py +361 -0
  165. oscura/cli/decode.py +164 -87
  166. oscura/cli/export.py +286 -0
  167. oscura/cli/main.py +115 -31
  168. oscura/{onboarding → cli/onboarding}/__init__.py +3 -3
  169. oscura/{onboarding → cli/onboarding}/help.py +80 -58
  170. oscura/{onboarding → cli/onboarding}/tutorials.py +97 -72
  171. oscura/{onboarding → cli/onboarding}/wizard.py +55 -36
  172. oscura/cli/progress.py +147 -0
  173. oscura/cli/shell.py +157 -135
  174. oscura/cli/validate_cmd.py +204 -0
  175. oscura/cli/visualize.py +158 -0
  176. oscura/convenience.py +125 -79
  177. oscura/core/__init__.py +4 -2
  178. oscura/core/backend_selector.py +3 -3
  179. oscura/core/cache.py +126 -15
  180. oscura/core/cancellation.py +1 -1
  181. oscura/{config → core/config}/__init__.py +20 -11
  182. oscura/{config → core/config}/defaults.py +1 -1
  183. oscura/{config → core/config}/loader.py +7 -5
  184. oscura/{config → core/config}/memory.py +5 -5
  185. oscura/{config → core/config}/migration.py +1 -1
  186. oscura/{config → core/config}/pipeline.py +99 -23
  187. oscura/{config → core/config}/preferences.py +1 -1
  188. oscura/{config → core/config}/protocol.py +3 -3
  189. oscura/{config → core/config}/schema.py +426 -272
  190. oscura/{config → core/config}/settings.py +1 -1
  191. oscura/{config → core/config}/thresholds.py +195 -153
  192. oscura/core/correlation.py +5 -6
  193. oscura/core/cross_domain.py +0 -2
  194. oscura/core/debug.py +9 -5
  195. oscura/{extensibility → core/extensibility}/docs.py +158 -70
  196. oscura/{extensibility → core/extensibility}/extensions.py +160 -76
  197. oscura/{extensibility → core/extensibility}/logging.py +1 -1
  198. oscura/{extensibility → core/extensibility}/measurements.py +1 -1
  199. oscura/{extensibility → core/extensibility}/plugins.py +1 -1
  200. oscura/{extensibility → core/extensibility}/templates.py +73 -3
  201. oscura/{extensibility → core/extensibility}/validation.py +1 -1
  202. oscura/core/gpu_backend.py +11 -7
  203. oscura/core/log_query.py +101 -11
  204. oscura/core/logging.py +126 -54
  205. oscura/core/logging_advanced.py +5 -5
  206. oscura/core/memory_limits.py +108 -70
  207. oscura/core/memory_monitor.py +2 -2
  208. oscura/core/memory_progress.py +7 -7
  209. oscura/core/memory_warnings.py +1 -1
  210. oscura/core/numba_backend.py +13 -13
  211. oscura/{plugins → core/plugins}/__init__.py +9 -9
  212. oscura/{plugins → core/plugins}/base.py +7 -7
  213. oscura/{plugins → core/plugins}/cli.py +3 -3
  214. oscura/{plugins → core/plugins}/discovery.py +186 -106
  215. oscura/{plugins → core/plugins}/lifecycle.py +1 -1
  216. oscura/{plugins → core/plugins}/manager.py +7 -7
  217. oscura/{plugins → core/plugins}/registry.py +3 -3
  218. oscura/{plugins → core/plugins}/versioning.py +1 -1
  219. oscura/core/progress.py +16 -1
  220. oscura/core/provenance.py +8 -2
  221. oscura/{schemas → core/schemas}/__init__.py +2 -2
  222. oscura/core/schemas/bus_configuration.json +322 -0
  223. oscura/core/schemas/device_mapping.json +182 -0
  224. oscura/core/schemas/packet_format.json +418 -0
  225. oscura/core/schemas/protocol_definition.json +363 -0
  226. oscura/core/types.py +4 -0
  227. oscura/core/uncertainty.py +3 -3
  228. oscura/correlation/__init__.py +52 -0
  229. oscura/correlation/multi_protocol.py +811 -0
  230. oscura/discovery/auto_decoder.py +117 -35
  231. oscura/discovery/comparison.py +191 -86
  232. oscura/discovery/quality_validator.py +155 -68
  233. oscura/discovery/signal_detector.py +196 -79
  234. oscura/export/__init__.py +18 -20
  235. oscura/export/kaitai_struct.py +513 -0
  236. oscura/export/scapy_layer.py +801 -0
  237. oscura/export/wireshark/README.md +15 -15
  238. oscura/export/wireshark/generator.py +1 -1
  239. oscura/export/wireshark/templates/dissector.lua.j2 +2 -2
  240. oscura/export/wireshark_dissector.py +746 -0
  241. oscura/guidance/wizard.py +207 -111
  242. oscura/hardware/__init__.py +19 -0
  243. oscura/{acquisition → hardware/acquisition}/__init__.py +4 -4
  244. oscura/{acquisition → hardware/acquisition}/file.py +2 -2
  245. oscura/{acquisition → hardware/acquisition}/hardware.py +7 -7
  246. oscura/{acquisition → hardware/acquisition}/saleae.py +15 -12
  247. oscura/{acquisition → hardware/acquisition}/socketcan.py +1 -1
  248. oscura/{acquisition → hardware/acquisition}/streaming.py +2 -2
  249. oscura/{acquisition → hardware/acquisition}/synthetic.py +3 -3
  250. oscura/{acquisition → hardware/acquisition}/visa.py +33 -11
  251. oscura/hardware/firmware/__init__.py +29 -0
  252. oscura/hardware/firmware/pattern_recognition.py +874 -0
  253. oscura/hardware/hal_detector.py +736 -0
  254. oscura/hardware/security/__init__.py +37 -0
  255. oscura/hardware/security/side_channel_detector.py +1126 -0
  256. oscura/inference/__init__.py +4 -0
  257. oscura/inference/active_learning/README.md +7 -7
  258. oscura/inference/active_learning/observation_table.py +4 -1
  259. oscura/inference/alignment.py +216 -123
  260. oscura/inference/bayesian.py +113 -33
  261. oscura/inference/crc_reverse.py +101 -55
  262. oscura/inference/logic.py +6 -2
  263. oscura/inference/message_format.py +342 -183
  264. oscura/inference/protocol.py +95 -44
  265. oscura/inference/protocol_dsl.py +180 -82
  266. oscura/inference/signal_intelligence.py +1439 -706
  267. oscura/inference/spectral.py +99 -57
  268. oscura/inference/state_machine.py +810 -158
  269. oscura/inference/stream.py +270 -110
  270. oscura/iot/__init__.py +34 -0
  271. oscura/iot/coap/__init__.py +32 -0
  272. oscura/iot/coap/analyzer.py +668 -0
  273. oscura/iot/coap/options.py +212 -0
  274. oscura/iot/lorawan/__init__.py +21 -0
  275. oscura/iot/lorawan/crypto.py +206 -0
  276. oscura/iot/lorawan/decoder.py +801 -0
  277. oscura/iot/lorawan/mac_commands.py +341 -0
  278. oscura/iot/mqtt/__init__.py +27 -0
  279. oscura/iot/mqtt/analyzer.py +999 -0
  280. oscura/iot/mqtt/properties.py +315 -0
  281. oscura/iot/zigbee/__init__.py +31 -0
  282. oscura/iot/zigbee/analyzer.py +615 -0
  283. oscura/iot/zigbee/security.py +153 -0
  284. oscura/iot/zigbee/zcl.py +349 -0
  285. oscura/jupyter/display.py +125 -45
  286. oscura/{exploratory → jupyter/exploratory}/__init__.py +8 -8
  287. oscura/{exploratory → jupyter/exploratory}/error_recovery.py +298 -141
  288. oscura/jupyter/exploratory/fuzzy.py +746 -0
  289. oscura/{exploratory → jupyter/exploratory}/fuzzy_advanced.py +258 -100
  290. oscura/{exploratory → jupyter/exploratory}/legacy.py +464 -242
  291. oscura/{exploratory → jupyter/exploratory}/parse.py +167 -145
  292. oscura/{exploratory → jupyter/exploratory}/recovery.py +119 -87
  293. oscura/jupyter/exploratory/sync.py +612 -0
  294. oscura/{exploratory → jupyter/exploratory}/unknown.py +299 -176
  295. oscura/jupyter/magic.py +4 -4
  296. oscura/{ui → jupyter/ui}/__init__.py +2 -2
  297. oscura/{ui → jupyter/ui}/formatters.py +3 -3
  298. oscura/{ui → jupyter/ui}/progressive_display.py +153 -82
  299. oscura/loaders/__init__.py +171 -63
  300. oscura/loaders/binary.py +88 -1
  301. oscura/loaders/chipwhisperer.py +153 -137
  302. oscura/loaders/configurable.py +208 -86
  303. oscura/loaders/csv_loader.py +458 -215
  304. oscura/loaders/hdf5_loader.py +278 -119
  305. oscura/loaders/lazy.py +87 -54
  306. oscura/loaders/mmap_loader.py +1 -1
  307. oscura/loaders/numpy_loader.py +253 -116
  308. oscura/loaders/pcap.py +226 -151
  309. oscura/loaders/rigol.py +110 -49
  310. oscura/loaders/sigrok.py +201 -78
  311. oscura/loaders/tdms.py +81 -58
  312. oscura/loaders/tektronix.py +291 -174
  313. oscura/loaders/touchstone.py +182 -87
  314. oscura/loaders/vcd.py +215 -117
  315. oscura/loaders/wav.py +155 -68
  316. oscura/reporting/__init__.py +9 -7
  317. oscura/reporting/analyze.py +352 -146
  318. oscura/reporting/argument_preparer.py +69 -14
  319. oscura/reporting/auto_report.py +97 -61
  320. oscura/reporting/batch.py +131 -58
  321. oscura/reporting/chart_selection.py +57 -45
  322. oscura/reporting/comparison.py +63 -17
  323. oscura/reporting/content/executive.py +76 -24
  324. oscura/reporting/core_formats/multi_format.py +11 -8
  325. oscura/reporting/engine.py +312 -158
  326. oscura/reporting/enhanced_reports.py +949 -0
  327. oscura/reporting/export.py +86 -43
  328. oscura/reporting/formatting/numbers.py +69 -42
  329. oscura/reporting/html.py +139 -58
  330. oscura/reporting/index.py +137 -65
  331. oscura/reporting/output.py +158 -67
  332. oscura/reporting/pdf.py +67 -102
  333. oscura/reporting/plots.py +191 -112
  334. oscura/reporting/sections.py +88 -47
  335. oscura/reporting/standards.py +104 -61
  336. oscura/reporting/summary_generator.py +75 -55
  337. oscura/reporting/tables.py +138 -54
  338. oscura/reporting/templates/enhanced/protocol_re.html +525 -0
  339. oscura/reporting/templates/index.md +13 -13
  340. oscura/sessions/__init__.py +14 -23
  341. oscura/sessions/base.py +3 -3
  342. oscura/sessions/blackbox.py +106 -10
  343. oscura/sessions/generic.py +2 -2
  344. oscura/sessions/legacy.py +783 -0
  345. oscura/side_channel/__init__.py +63 -0
  346. oscura/side_channel/dpa.py +1025 -0
  347. oscura/utils/__init__.py +15 -1
  348. oscura/utils/autodetect.py +1 -5
  349. oscura/utils/bitwise.py +118 -0
  350. oscura/{builders → utils/builders}/__init__.py +1 -1
  351. oscura/{comparison → utils/comparison}/__init__.py +6 -6
  352. oscura/{comparison → utils/comparison}/compare.py +202 -101
  353. oscura/{comparison → utils/comparison}/golden.py +83 -63
  354. oscura/{comparison → utils/comparison}/limits.py +313 -89
  355. oscura/{comparison → utils/comparison}/mask.py +151 -45
  356. oscura/{comparison → utils/comparison}/trace_diff.py +1 -1
  357. oscura/{comparison → utils/comparison}/visualization.py +147 -89
  358. oscura/{component → utils/component}/__init__.py +3 -3
  359. oscura/{component → utils/component}/impedance.py +122 -58
  360. oscura/{component → utils/component}/reactive.py +165 -168
  361. oscura/{component → utils/component}/transmission_line.py +3 -3
  362. oscura/{filtering → utils/filtering}/__init__.py +6 -6
  363. oscura/{filtering → utils/filtering}/base.py +1 -1
  364. oscura/{filtering → utils/filtering}/convenience.py +2 -2
  365. oscura/{filtering → utils/filtering}/design.py +169 -93
  366. oscura/{filtering → utils/filtering}/filters.py +2 -2
  367. oscura/{filtering → utils/filtering}/introspection.py +2 -2
  368. oscura/utils/geometry.py +31 -0
  369. oscura/utils/imports.py +184 -0
  370. oscura/utils/lazy.py +1 -1
  371. oscura/{math → utils/math}/__init__.py +2 -2
  372. oscura/{math → utils/math}/arithmetic.py +114 -48
  373. oscura/{math → utils/math}/interpolation.py +139 -106
  374. oscura/utils/memory.py +129 -66
  375. oscura/utils/memory_advanced.py +92 -9
  376. oscura/utils/memory_extensions.py +10 -8
  377. oscura/{optimization → utils/optimization}/__init__.py +1 -1
  378. oscura/{optimization → utils/optimization}/search.py +2 -2
  379. oscura/utils/performance/__init__.py +58 -0
  380. oscura/utils/performance/caching.py +889 -0
  381. oscura/utils/performance/lsh_clustering.py +333 -0
  382. oscura/utils/performance/memory_optimizer.py +699 -0
  383. oscura/utils/performance/optimizations.py +675 -0
  384. oscura/utils/performance/parallel.py +654 -0
  385. oscura/utils/performance/profiling.py +661 -0
  386. oscura/{pipeline → utils/pipeline}/base.py +1 -1
  387. oscura/{pipeline → utils/pipeline}/composition.py +11 -3
  388. oscura/{pipeline → utils/pipeline}/parallel.py +3 -2
  389. oscura/{pipeline → utils/pipeline}/pipeline.py +1 -1
  390. oscura/{pipeline → utils/pipeline}/reverse_engineering.py +412 -221
  391. oscura/{search → utils/search}/__init__.py +3 -3
  392. oscura/{search → utils/search}/anomaly.py +188 -58
  393. oscura/utils/search/context.py +294 -0
  394. oscura/{search → utils/search}/pattern.py +138 -10
  395. oscura/utils/serial.py +51 -0
  396. oscura/utils/storage/__init__.py +61 -0
  397. oscura/utils/storage/database.py +1166 -0
  398. oscura/{streaming → utils/streaming}/chunked.py +302 -143
  399. oscura/{streaming → utils/streaming}/progressive.py +1 -1
  400. oscura/{streaming → utils/streaming}/realtime.py +3 -2
  401. oscura/{triggering → utils/triggering}/__init__.py +6 -6
  402. oscura/{triggering → utils/triggering}/base.py +6 -6
  403. oscura/{triggering → utils/triggering}/edge.py +2 -2
  404. oscura/{triggering → utils/triggering}/pattern.py +2 -2
  405. oscura/{triggering → utils/triggering}/pulse.py +115 -74
  406. oscura/{triggering → utils/triggering}/window.py +2 -2
  407. oscura/utils/validation.py +32 -0
  408. oscura/validation/__init__.py +121 -0
  409. oscura/{compliance → validation/compliance}/__init__.py +5 -5
  410. oscura/{compliance → validation/compliance}/advanced.py +5 -5
  411. oscura/{compliance → validation/compliance}/masks.py +1 -1
  412. oscura/{compliance → validation/compliance}/reporting.py +127 -53
  413. oscura/{compliance → validation/compliance}/testing.py +114 -52
  414. oscura/validation/compliance_tests.py +915 -0
  415. oscura/validation/fuzzer.py +990 -0
  416. oscura/validation/grammar_tests.py +596 -0
  417. oscura/validation/grammar_validator.py +904 -0
  418. oscura/validation/hil_testing.py +977 -0
  419. oscura/{quality → validation/quality}/__init__.py +4 -4
  420. oscura/{quality → validation/quality}/ensemble.py +251 -171
  421. oscura/{quality → validation/quality}/explainer.py +3 -3
  422. oscura/{quality → validation/quality}/scoring.py +1 -1
  423. oscura/{quality → validation/quality}/warnings.py +4 -4
  424. oscura/validation/regression_suite.py +808 -0
  425. oscura/validation/replay.py +788 -0
  426. oscura/{testing → validation/testing}/__init__.py +2 -2
  427. oscura/{testing → validation/testing}/synthetic.py +5 -5
  428. oscura/visualization/__init__.py +9 -0
  429. oscura/visualization/accessibility.py +1 -1
  430. oscura/visualization/annotations.py +64 -67
  431. oscura/visualization/colors.py +7 -7
  432. oscura/visualization/digital.py +180 -81
  433. oscura/visualization/eye.py +236 -85
  434. oscura/visualization/interactive.py +320 -143
  435. oscura/visualization/jitter.py +587 -247
  436. oscura/visualization/layout.py +169 -134
  437. oscura/visualization/optimization.py +103 -52
  438. oscura/visualization/palettes.py +1 -1
  439. oscura/visualization/power.py +427 -211
  440. oscura/visualization/power_extended.py +626 -297
  441. oscura/visualization/presets.py +2 -0
  442. oscura/visualization/protocols.py +495 -181
  443. oscura/visualization/render.py +79 -63
  444. oscura/visualization/reverse_engineering.py +171 -124
  445. oscura/visualization/signal_integrity.py +460 -279
  446. oscura/visualization/specialized.py +190 -100
  447. oscura/visualization/spectral.py +670 -255
  448. oscura/visualization/thumbnails.py +166 -137
  449. oscura/visualization/waveform.py +150 -63
  450. oscura/workflows/__init__.py +3 -0
  451. oscura/{batch → workflows/batch}/__init__.py +5 -5
  452. oscura/{batch → workflows/batch}/advanced.py +150 -75
  453. oscura/workflows/batch/aggregate.py +531 -0
  454. oscura/workflows/batch/analyze.py +236 -0
  455. oscura/{batch → workflows/batch}/logging.py +2 -2
  456. oscura/{batch → workflows/batch}/metrics.py +1 -1
  457. oscura/workflows/complete_re.py +1144 -0
  458. oscura/workflows/compliance.py +44 -54
  459. oscura/workflows/digital.py +197 -51
  460. oscura/workflows/legacy/__init__.py +12 -0
  461. oscura/{workflow → workflows/legacy}/dag.py +4 -1
  462. oscura/workflows/multi_trace.py +9 -9
  463. oscura/workflows/power.py +42 -62
  464. oscura/workflows/protocol.py +82 -49
  465. oscura/workflows/reverse_engineering.py +351 -150
  466. oscura/workflows/signal_integrity.py +157 -82
  467. oscura-0.6.0.dist-info/METADATA +643 -0
  468. oscura-0.6.0.dist-info/RECORD +590 -0
  469. oscura/analyzers/digital/ic_database.py +0 -498
  470. oscura/analyzers/digital/timing_paths.py +0 -339
  471. oscura/analyzers/digital/vintage.py +0 -377
  472. oscura/analyzers/digital/vintage_result.py +0 -148
  473. oscura/analyzers/protocols/parallel_bus.py +0 -449
  474. oscura/batch/aggregate.py +0 -300
  475. oscura/batch/analyze.py +0 -139
  476. oscura/dsl/__init__.py +0 -73
  477. oscura/exceptions.py +0 -59
  478. oscura/exploratory/fuzzy.py +0 -513
  479. oscura/exploratory/sync.py +0 -384
  480. oscura/export/wavedrom.py +0 -430
  481. oscura/exporters/__init__.py +0 -94
  482. oscura/exporters/csv.py +0 -303
  483. oscura/exporters/exporters.py +0 -44
  484. oscura/exporters/hdf5.py +0 -217
  485. oscura/exporters/html_export.py +0 -701
  486. oscura/exporters/json_export.py +0 -338
  487. oscura/exporters/markdown_export.py +0 -367
  488. oscura/exporters/matlab_export.py +0 -354
  489. oscura/exporters/npz_export.py +0 -219
  490. oscura/exporters/spice_export.py +0 -210
  491. oscura/exporters/vintage_logic_csv.py +0 -247
  492. oscura/reporting/vintage_logic_report.py +0 -523
  493. oscura/search/context.py +0 -149
  494. oscura/session/__init__.py +0 -34
  495. oscura/session/annotations.py +0 -289
  496. oscura/session/history.py +0 -313
  497. oscura/session/session.py +0 -520
  498. oscura/visualization/digital_advanced.py +0 -718
  499. oscura/visualization/figure_manager.py +0 -156
  500. oscura/workflow/__init__.py +0 -13
  501. oscura-0.5.0.dist-info/METADATA +0 -407
  502. oscura-0.5.0.dist-info/RECORD +0 -486
  503. /oscura/core/{config.py → config/legacy.py} +0 -0
  504. /oscura/{extensibility → core/extensibility}/__init__.py +0 -0
  505. /oscura/{extensibility → core/extensibility}/registry.py +0 -0
  506. /oscura/{plugins → core/plugins}/isolation.py +0 -0
  507. /oscura/{builders → utils/builders}/signal_builder.py +0 -0
  508. /oscura/{optimization → utils/optimization}/parallel.py +0 -0
  509. /oscura/{pipeline → utils/pipeline}/__init__.py +0 -0
  510. /oscura/{streaming → utils/streaming}/__init__.py +0 -0
  511. {oscura-0.5.0.dist-info → oscura-0.6.0.dist-info}/WHEEL +0 -0
  512. {oscura-0.5.0.dist-info → oscura-0.6.0.dist-info}/entry_points.txt +0 -0
  513. {oscura-0.5.0.dist-info → oscura-0.6.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 %}