pumaguard 21.post21__tar.gz → 21.post27__tar.gz

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 (377) hide show
  1. {pumaguard-21.post21 → pumaguard-21.post27}/PKG-INFO +1 -1
  2. pumaguard-21.post27/docs/CAPTIVE_PORTAL.md +267 -0
  3. {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/Performance.rst +1 -1
  4. pumaguard-21.post27/pumaguard/pumaguard-ui/.last_build_id +1 -0
  5. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/flutter_bootstrap.js +1 -1
  6. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/main.dart.js +3 -3
  7. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/web_routes/settings.py +12 -2
  8. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard.egg-info/PKG-INFO +1 -1
  9. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard.egg-info/SOURCES.txt +1 -0
  10. {pumaguard-21.post21 → pumaguard-21.post27}/scripts/configure-device.yaml +56 -1
  11. {pumaguard-21.post21 → pumaguard-21.post27}/scripts/templates/dnsmasq-wlan0.conf.j2 +22 -1
  12. pumaguard-21.post21/pumaguard/pumaguard-ui/.last_build_id +0 -1
  13. {pumaguard-21.post21 → pumaguard-21.post27}/.github/CODEOWNERS +0 -0
  14. {pumaguard-21.post21 → pumaguard-21.post27}/.github/actions/clean-runner/action.yaml +0 -0
  15. {pumaguard-21.post21 → pumaguard-21.post27}/.github/actions/setup-python/action.yaml +0 -0
  16. {pumaguard-21.post21 → pumaguard-21.post27}/.github/agents/general.md +0 -0
  17. {pumaguard-21.post21 → pumaguard-21.post27}/.github/copilot-instructions.md +0 -0
  18. {pumaguard-21.post21 → pumaguard-21.post27}/.github/dependabot.yml +0 -0
  19. {pumaguard-21.post21 → pumaguard-21.post27}/.github/workflows/build-webpage.yaml +0 -0
  20. {pumaguard-21.post21 → pumaguard-21.post27}/.github/workflows/codeql.yaml +0 -0
  21. {pumaguard-21.post21 → pumaguard-21.post27}/.github/workflows/test-and-package.yaml +0 -0
  22. {pumaguard-21.post21 → pumaguard-21.post27}/.gitignore +0 -0
  23. {pumaguard-21.post21 → pumaguard-21.post27}/.gitmodules +0 -0
  24. {pumaguard-21.post21 → pumaguard-21.post27}/.readthedocs.yaml +0 -0
  25. {pumaguard-21.post21 → pumaguard-21.post27}/CAMERA_DETECTION_SUMMARY.md +0 -0
  26. {pumaguard-21.post21 → pumaguard-21.post27}/CAMERA_QUICKSTART.md +0 -0
  27. {pumaguard-21.post21 → pumaguard-21.post27}/CAMERA_QUICK_REFERENCE.md +0 -0
  28. {pumaguard-21.post21 → pumaguard-21.post27}/CAMERA_URL_COMPLETE.md +0 -0
  29. {pumaguard-21.post21 → pumaguard-21.post27}/CAMERA_URL_FIX_SUMMARY.md +0 -0
  30. {pumaguard-21.post21 → pumaguard-21.post27}/CONTRIBUTING.md +0 -0
  31. {pumaguard-21.post21 → pumaguard-21.post27}/GROUPING_FEATURE_IMPLEMENTATION.md +0 -0
  32. {pumaguard-21.post21 → pumaguard-21.post27}/LICENSE +0 -0
  33. {pumaguard-21.post21 → pumaguard-21.post27}/MANIFEST.in +0 -0
  34. {pumaguard-21.post21 → pumaguard-21.post27}/Makefile +0 -0
  35. {pumaguard-21.post21 → pumaguard-21.post27}/QUICKSTART_CAMERA_UI.md +0 -0
  36. {pumaguard-21.post21 → pumaguard-21.post27}/README.md +0 -0
  37. {pumaguard-21.post21 → pumaguard-21.post27}/RELEASE.md +0 -0
  38. {pumaguard-21.post21 → pumaguard-21.post27}/TEST_SUMMARY.md +0 -0
  39. {pumaguard-21.post21 → pumaguard-21.post27}/TRUNCATED_IMAGE_TEST_QUICK_REF.md +0 -0
  40. {pumaguard-21.post21 → pumaguard-21.post27}/ansible.cfg +0 -0
  41. {pumaguard-21.post21 → pumaguard-21.post27}/docs/API_REFERENCE.md +0 -0
  42. {pumaguard-21.post21 → pumaguard-21.post27}/docs/BUILD_REFERENCE.md +0 -0
  43. {pumaguard-21.post21 → pumaguard-21.post27}/docs/CAMERA_HEARTBEAT.md +0 -0
  44. {pumaguard-21.post21 → pumaguard-21.post27}/docs/CAMERA_INTEGRATION.md +0 -0
  45. {pumaguard-21.post21 → pumaguard-21.post27}/docs/CAMERA_STATUS_REFRESH.md +0 -0
  46. {pumaguard-21.post21 → pumaguard-21.post27}/docs/CAMERA_TRACKING.md +0 -0
  47. {pumaguard-21.post21 → pumaguard-21.post27}/docs/CAMERA_URL_TROUBLESHOOTING.md +0 -0
  48. {pumaguard-21.post21 → pumaguard-21.post27}/docs/DYNAMIC_URL_DETECTION.md +0 -0
  49. {pumaguard-21.post21 → pumaguard-21.post27}/docs/HEARTBEAT_FEATURE.md +0 -0
  50. {pumaguard-21.post21 → pumaguard-21.post27}/docs/IMAGE_BROWSER.md +0 -0
  51. {pumaguard-21.post21 → pumaguard-21.post27}/docs/MDNS_FEATURES.md +0 -0
  52. {pumaguard-21.post21 → pumaguard-21.post27}/docs/MDNS_SETUP.md +0 -0
  53. {pumaguard-21.post21 → pumaguard-21.post27}/docs/Makefile +0 -0
  54. {pumaguard-21.post21 → pumaguard-21.post27}/docs/QUICK_START_MDNS.md +0 -0
  55. {pumaguard-21.post21 → pumaguard-21.post27}/docs/SETTINGS_PERSISTENCE.md +0 -0
  56. {pumaguard-21.post21 → pumaguard-21.post27}/docs/STOP_SOUND_FEATURE.md +0 -0
  57. {pumaguard-21.post21 → pumaguard-21.post27}/docs/UI_DEVELOPMENT_CONTEXT.md +0 -0
  58. {pumaguard-21.post21 → pumaguard-21.post27}/docs/VOLUME_CONTROL.md +0 -0
  59. {pumaguard-21.post21 → pumaguard-21.post27}/docs/VOLUME_FIX.md +0 -0
  60. {pumaguard-21.post21 → pumaguard-21.post27}/docs/WEB_UI_STRUCTURE.md +0 -0
  61. {pumaguard-21.post21 → pumaguard-21.post27}/docs/XDG_MIGRATION.md +0 -0
  62. {pumaguard-21.post21 → pumaguard-21.post27}/docs/make.bat +0 -0
  63. {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/About.rst +0 -0
  64. {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/Camera_parts.rst +0 -0
  65. {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/Cameralocation.rst +0 -0
  66. {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/Deployment.rst +0 -0
  67. {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/HLD.rst +0 -0
  68. {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/Parts.rst +0 -0
  69. {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/PowerConsiderations.rst +0 -0
  70. {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/WeatherProofing.rst +0 -0
  71. {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/_static/20241021-puma01.png +0 -0
  72. {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/_static/20241022-puma01.png +0 -0
  73. {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/_static/MLProj.png +0 -0
  74. {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/_static/Stables map.png +0 -0
  75. {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/_static/Stables.png +0 -0
  76. {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/_static/custom.css +0 -0
  77. {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/_static/figure01.png +0 -0
  78. {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/_static/server-demo.gif +0 -0
  79. {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/_static/stables-map.png +0 -0
  80. {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/camerapowerconsumption.rst +0 -0
  81. {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/conf.py +0 -0
  82. {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/index.rst +0 -0
  83. {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/lights.rst +0 -0
  84. {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/modules.rst +0 -0
  85. {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/presentations/2024-12-08 PEEC Presentations.odp +0 -0
  86. {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/presentations/2024-12-08 PEEC Presentations.pdf +0 -0
  87. {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/pumaguard.rst +0 -0
  88. {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/pumaguard.web_routes.rst +0 -0
  89. {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/raspberrypie5powerconsumption.rst +0 -0
  90. {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/requirements.txt +0 -0
  91. {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/solarpanelresearch.rst +0 -0
  92. {pumaguard-21.post21 → pumaguard-21.post27}/notebooks/Mountain_Lions.ipynb +0 -0
  93. {pumaguard-21.post21 → pumaguard-21.post27}/notebooks/dogs-vs-cats-classification-with-transfer-learning.ipynb +0 -0
  94. {pumaguard-21.post21 → pumaguard-21.post27}/notebooks/dogs-vs-cats-classification-with-transfer-learning.log +0 -0
  95. {pumaguard-21.post21 → pumaguard-21.post27}/notebooks/lion-vs-nolion-classification-with-transfer.ipynb +0 -0
  96. {pumaguard-21.post21 → pumaguard-21.post27}/notebooks/puma-two-stage-inference-only.ipynb +0 -0
  97. {pumaguard-21.post21 → pumaguard-21.post27}/notebooks/puma-two-stage-pipeline-flatprefix.ipynb +0 -0
  98. {pumaguard-21.post21 → pumaguard-21.post27}/prepare-device.md +0 -0
  99. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/__init__.py +0 -0
  100. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/camera_heartbeat.py +0 -0
  101. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/classify.py +0 -0
  102. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/completions/pumaguard-classify-completions.sh +0 -0
  103. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/completions/pumaguard-completions.sh +0 -0
  104. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/completions/pumaguard-server-completions.sh +0 -0
  105. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/completions/pumaguard-train-completions.sh +0 -0
  106. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/lock_manager.py +0 -0
  107. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/main.py +0 -0
  108. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/model-registry.yaml +0 -0
  109. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/model_cli.py +0 -0
  110. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/model_downloader.py +0 -0
  111. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/presets.py +0 -0
  112. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/assets/AssetManifest.bin +0 -0
  113. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/assets/AssetManifest.bin.json +0 -0
  114. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/assets/FontManifest.json +0 -0
  115. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/assets/NOTICES +0 -0
  116. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/assets/fonts/MaterialIcons-Regular.otf +0 -0
  117. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/assets/fonts/Roboto-Bold.ttf +0 -0
  118. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/assets/fonts/Roboto-Light.ttf +0 -0
  119. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/assets/fonts/Roboto-Medium.ttf +0 -0
  120. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/assets/fonts/Roboto-Regular.ttf +0 -0
  121. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/assets/fonts/RobotoMono-Bold.ttf +0 -0
  122. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/assets/fonts/RobotoMono-Medium.ttf +0 -0
  123. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/assets/fonts/RobotoMono-Regular.ttf +0 -0
  124. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/assets/packages/cupertino_icons/assets/CupertinoIcons.ttf +0 -0
  125. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/assets/shaders/ink_sparkle.frag +0 -0
  126. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/assets/shaders/stretch_effect.frag +0 -0
  127. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/canvaskit/canvaskit.js +0 -0
  128. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/canvaskit/canvaskit.js.symbols +0 -0
  129. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/canvaskit/canvaskit.wasm +0 -0
  130. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/canvaskit/chromium/canvaskit.js +0 -0
  131. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/canvaskit/chromium/canvaskit.js.symbols +0 -0
  132. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/canvaskit/chromium/canvaskit.wasm +0 -0
  133. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/canvaskit/skwasm.js +0 -0
  134. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/canvaskit/skwasm.js.symbols +0 -0
  135. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/canvaskit/skwasm.wasm +0 -0
  136. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/canvaskit/skwasm_heavy.js +0 -0
  137. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/canvaskit/skwasm_heavy.js.symbols +0 -0
  138. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/canvaskit/skwasm_heavy.wasm +0 -0
  139. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/favicon.png +0 -0
  140. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/flutter.js +0 -0
  141. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/flutter_service_worker.js +0 -0
  142. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/icons/Icon-192.png +0 -0
  143. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/icons/Icon-512.png +0 -0
  144. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/icons/Icon-maskable-192.png +0 -0
  145. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/icons/Icon-maskable-512.png +0 -0
  146. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/index.html +0 -0
  147. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/manifest.json +0 -0
  148. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/version.json +0 -0
  149. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/server.py +0 -0
  150. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/sound.py +0 -0
  151. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/stats.py +0 -0
  152. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/utils.py +0 -0
  153. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/verify.py +0 -0
  154. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/web_routes/__init__.py +0 -0
  155. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/web_routes/artifacts.py +0 -0
  156. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/web_routes/dhcp.py +0 -0
  157. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/web_routes/diagnostics.py +0 -0
  158. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/web_routes/directories.py +0 -0
  159. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/web_routes/folders.py +0 -0
  160. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/web_routes/photos.py +0 -0
  161. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/web_routes/sync.py +0 -0
  162. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/web_ui.py +0 -0
  163. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard-logo-2-1024-1024.png +0 -0
  164. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard-logo-2-512-512.png +0 -0
  165. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard-logo-2.webp +0 -0
  166. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard-logo-3-1024-1024.png +0 -0
  167. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard-logo-3-512-512.png +0 -0
  168. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard-logo-4-1024-1024.png +0 -0
  169. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard-logo-4-512-512.png +0 -0
  170. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard-logo.png +0 -0
  171. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard-sounds/cougar_call.mp3 +0 -0
  172. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard-sounds/cougarsounds.wav +0 -0
  173. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard-sounds/deterrent_puma.mp3 +0 -0
  174. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard-sounds/detterent_ringtail.mp3 +0 -0
  175. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard-sounds/lion-roar-6011.mp3 +0 -0
  176. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard-sounds/lion_cry.wav +0 -0
  177. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard-sounds/pumaguard-warning.mp3 +0 -0
  178. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard-sounds/short-round-110940.mp3 +0 -0
  179. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard-ui/ios/Flutter/ephemeral/flutter_lldb_helper.py +0 -0
  180. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard.egg-info/dependency_links.txt +0 -0
  181. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard.egg-info/entry_points.txt +0 -0
  182. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard.egg-info/requires.txt +0 -0
  183. {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard.egg-info/top_level.txt +0 -0
  184. {pumaguard-21.post21 → pumaguard-21.post27}/pylintrc +0 -0
  185. {pumaguard-21.post21 → pumaguard-21.post27}/pyproject.toml +0 -0
  186. {pumaguard-21.post21 → pumaguard-21.post27}/requirements.txt +0 -0
  187. {pumaguard-21.post21 → pumaguard-21.post27}/scripts/README_CAMERA_TESTING.md +0 -0
  188. {pumaguard-21.post21 → pumaguard-21.post27}/scripts/__init__.py +0 -0
  189. {pumaguard-21.post21 → pumaguard-21.post27}/scripts/add_fake_cameras.sh +0 -0
  190. {pumaguard-21.post21 → pumaguard-21.post27}/scripts/classify.py +0 -0
  191. {pumaguard-21.post21 → pumaguard-21.post27}/scripts/configure-laptop.yaml +0 -0
  192. {pumaguard-21.post21 → pumaguard-21.post27}/scripts/deploy-pumaguard.yaml +0 -0
  193. {pumaguard-21.post21 → pumaguard-21.post27}/scripts/image-sd-card-for-pi.sh +0 -0
  194. {pumaguard-21.post21 → pumaguard-21.post27}/scripts/install-pumaguard.sh +0 -0
  195. {pumaguard-21.post21 → pumaguard-21.post27}/scripts/laptop_config.yaml +0 -0
  196. {pumaguard-21.post21 → pumaguard-21.post27}/scripts/laptop_vault.yaml +0 -0
  197. {pumaguard-21.post21 → pumaguard-21.post27}/scripts/launch-pi-VM.sh +0 -0
  198. {pumaguard-21.post21 → pumaguard-21.post27}/scripts/pick_files.py +0 -0
  199. {pumaguard-21.post21 → pumaguard-21.post27}/scripts/play_sound.py +0 -0
  200. {pumaguard-21.post21 → pumaguard-21.post27}/scripts/pumaguard +0 -0
  201. {pumaguard-21.post21 → pumaguard-21.post27}/scripts/pumaguard-train-snap-wrapper.sh +0 -0
  202. {pumaguard-21.post21 → pumaguard-21.post27}/scripts/server.py +0 -0
  203. {pumaguard-21.post21 → pumaguard-21.post27}/scripts/templates/hostapd.conf.j2 +0 -0
  204. {pumaguard-21.post21 → pumaguard-21.post27}/scripts/templates/netplan-network-manager.j2 +0 -0
  205. {pumaguard-21.post21 → pumaguard-21.post27}/scripts/templates/netplan-pumaguard.j2 +0 -0
  206. {pumaguard-21.post21 → pumaguard-21.post27}/scripts/templates/netplan-wired.j2 +0 -0
  207. {pumaguard-21.post21 → pumaguard-21.post27}/scripts/templates/netplan-wireless.j2 +0 -0
  208. {pumaguard-21.post21 → pumaguard-21.post27}/scripts/templates/pumaguard-dhcp-notify.sh.j2 +0 -0
  209. {pumaguard-21.post21 → pumaguard-21.post27}/scripts/templates/pumaguard.service.j2 +0 -0
  210. {pumaguard-21.post21 → pumaguard-21.post27}/scripts/templates/systemd-network-wlan0.link.j2 +0 -0
  211. {pumaguard-21.post21 → pumaguard-21.post27}/scripts/templates/systemd-network-wlan0.network.j2 +0 -0
  212. {pumaguard-21.post21 → pumaguard-21.post27}/scripts/test-server.sh +0 -0
  213. {pumaguard-21.post21 → pumaguard-21.post27}/scripts/test_xception.py +0 -0
  214. {pumaguard-21.post21 → pumaguard-21.post27}/scripts/train.py +0 -0
  215. {pumaguard-21.post21 → pumaguard-21.post27}/scripts/verify.py +0 -0
  216. {pumaguard-21.post21 → pumaguard-21.post27}/scripts/vsftpd.conf.j2 +0 -0
  217. {pumaguard-21.post21 → pumaguard-21.post27}/scripts/wireless_credentials.yaml +0 -0
  218. {pumaguard-21.post21 → pumaguard-21.post27}/settings/notebook-1.yaml +0 -0
  219. {pumaguard-21.post21 → pumaguard-21.post27}/setup.cfg +0 -0
  220. {pumaguard-21.post21 → pumaguard-21.post27}/snap/snapcraft.yaml +0 -0
  221. {pumaguard-21.post21 → pumaguard-21.post27}/temp/.gitignore +0 -0
  222. {pumaguard-21.post21 → pumaguard-21.post27}/temp/.metadata +0 -0
  223. {pumaguard-21.post21 → pumaguard-21.post27}/temp/README.md +0 -0
  224. {pumaguard-21.post21 → pumaguard-21.post27}/temp/analysis_options.yaml +0 -0
  225. {pumaguard-21.post21 → pumaguard-21.post27}/temp/android/.gitignore +0 -0
  226. {pumaguard-21.post21 → pumaguard-21.post27}/temp/android/app/build.gradle.kts +0 -0
  227. {pumaguard-21.post21 → pumaguard-21.post27}/temp/android/app/src/debug/AndroidManifest.xml +0 -0
  228. {pumaguard-21.post21 → pumaguard-21.post27}/temp/android/app/src/main/AndroidManifest.xml +0 -0
  229. {pumaguard-21.post21 → pumaguard-21.post27}/temp/android/app/src/main/kotlin/com/example/pumaguard_ui/MainActivity.kt +0 -0
  230. {pumaguard-21.post21 → pumaguard-21.post27}/temp/android/app/src/main/res/drawable/launch_background.xml +0 -0
  231. {pumaguard-21.post21 → pumaguard-21.post27}/temp/android/app/src/main/res/drawable-v21/launch_background.xml +0 -0
  232. {pumaguard-21.post21 → pumaguard-21.post27}/temp/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
  233. {pumaguard-21.post21 → pumaguard-21.post27}/temp/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
  234. {pumaguard-21.post21 → pumaguard-21.post27}/temp/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
  235. {pumaguard-21.post21 → pumaguard-21.post27}/temp/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  236. {pumaguard-21.post21 → pumaguard-21.post27}/temp/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  237. {pumaguard-21.post21 → pumaguard-21.post27}/temp/android/app/src/main/res/values/styles.xml +0 -0
  238. {pumaguard-21.post21 → pumaguard-21.post27}/temp/android/app/src/main/res/values-night/styles.xml +0 -0
  239. {pumaguard-21.post21 → pumaguard-21.post27}/temp/android/app/src/profile/AndroidManifest.xml +0 -0
  240. {pumaguard-21.post21 → pumaguard-21.post27}/temp/android/build.gradle.kts +0 -0
  241. {pumaguard-21.post21 → pumaguard-21.post27}/temp/android/gradle/wrapper/gradle-wrapper.properties +0 -0
  242. {pumaguard-21.post21 → pumaguard-21.post27}/temp/android/gradle.properties +0 -0
  243. {pumaguard-21.post21 → pumaguard-21.post27}/temp/android/settings.gradle.kts +0 -0
  244. {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/.gitignore +0 -0
  245. {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Flutter/AppFrameworkInfo.plist +0 -0
  246. {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Flutter/Debug.xcconfig +0 -0
  247. {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Flutter/Release.xcconfig +0 -0
  248. {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/AppDelegate.swift +0 -0
  249. {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -0
  250. {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png +0 -0
  251. {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png +0 -0
  252. {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png +0 -0
  253. {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png +0 -0
  254. {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png +0 -0
  255. {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png +0 -0
  256. {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png +0 -0
  257. {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png +0 -0
  258. {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png +0 -0
  259. {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png +0 -0
  260. {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png +0 -0
  261. {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png +0 -0
  262. {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png +0 -0
  263. {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png +0 -0
  264. {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png +0 -0
  265. {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json +0 -0
  266. {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png +0 -0
  267. {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png +0 -0
  268. {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png +0 -0
  269. {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md +0 -0
  270. {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Base.lproj/LaunchScreen.storyboard +0 -0
  271. {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Base.lproj/Main.storyboard +0 -0
  272. {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Info.plist +0 -0
  273. {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Runner-Bridging-Header.h +0 -0
  274. {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner.xcodeproj/project.pbxproj +0 -0
  275. {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -0
  276. {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -0
  277. {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +0 -0
  278. {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +0 -0
  279. {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner.xcworkspace/contents.xcworkspacedata +0 -0
  280. {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -0
  281. {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +0 -0
  282. {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/RunnerTests/RunnerTests.swift +0 -0
  283. {pumaguard-21.post21 → pumaguard-21.post27}/temp/lib/main.dart +0 -0
  284. {pumaguard-21.post21 → pumaguard-21.post27}/temp/lib/models/settings.dart +0 -0
  285. {pumaguard-21.post21 → pumaguard-21.post27}/temp/lib/models/status.dart +0 -0
  286. {pumaguard-21.post21 → pumaguard-21.post27}/temp/lib/screens/directories_screen.dart +0 -0
  287. {pumaguard-21.post21 → pumaguard-21.post27}/temp/lib/screens/home_screen.dart +0 -0
  288. {pumaguard-21.post21 → pumaguard-21.post27}/temp/lib/screens/server_discovery_screen.dart +0 -0
  289. {pumaguard-21.post21 → pumaguard-21.post27}/temp/lib/screens/settings_screen.dart +0 -0
  290. {pumaguard-21.post21 → pumaguard-21.post27}/temp/lib/services/api_service.dart +0 -0
  291. {pumaguard-21.post21 → pumaguard-21.post27}/temp/lib/services/mdns_service.dart +0 -0
  292. {pumaguard-21.post21 → pumaguard-21.post27}/temp/lib/services/mdns_service_impl.dart +0 -0
  293. {pumaguard-21.post21 → pumaguard-21.post27}/temp/lib/services/mdns_service_io.dart +0 -0
  294. {pumaguard-21.post21 → pumaguard-21.post27}/temp/lib/services/mdns_service_web.dart +0 -0
  295. {pumaguard-21.post21 → pumaguard-21.post27}/temp/lib/utils/platform_url.dart +0 -0
  296. {pumaguard-21.post21 → pumaguard-21.post27}/temp/lib/utils/platform_url_stub.dart +0 -0
  297. {pumaguard-21.post21 → pumaguard-21.post27}/temp/lib/utils/platform_url_web.dart +0 -0
  298. {pumaguard-21.post21 → pumaguard-21.post27}/temp/linux/.gitignore +0 -0
  299. {pumaguard-21.post21 → pumaguard-21.post27}/temp/linux/CMakeLists.txt +0 -0
  300. {pumaguard-21.post21 → pumaguard-21.post27}/temp/linux/flutter/CMakeLists.txt +0 -0
  301. {pumaguard-21.post21 → pumaguard-21.post27}/temp/linux/flutter/generated_plugin_registrant.cc +0 -0
  302. {pumaguard-21.post21 → pumaguard-21.post27}/temp/linux/flutter/generated_plugin_registrant.h +0 -0
  303. {pumaguard-21.post21 → pumaguard-21.post27}/temp/linux/flutter/generated_plugins.cmake +0 -0
  304. {pumaguard-21.post21 → pumaguard-21.post27}/temp/linux/runner/CMakeLists.txt +0 -0
  305. {pumaguard-21.post21 → pumaguard-21.post27}/temp/linux/runner/main.cc +0 -0
  306. {pumaguard-21.post21 → pumaguard-21.post27}/temp/linux/runner/my_application.cc +0 -0
  307. {pumaguard-21.post21 → pumaguard-21.post27}/temp/linux/runner/my_application.h +0 -0
  308. {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/.gitignore +0 -0
  309. {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Flutter/Flutter-Debug.xcconfig +0 -0
  310. {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Flutter/Flutter-Release.xcconfig +0 -0
  311. {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Flutter/GeneratedPluginRegistrant.swift +0 -0
  312. {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner/AppDelegate.swift +0 -0
  313. {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -0
  314. {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png +0 -0
  315. {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png +0 -0
  316. {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png +0 -0
  317. {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png +0 -0
  318. {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png +0 -0
  319. {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png +0 -0
  320. {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png +0 -0
  321. {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner/Base.lproj/MainMenu.xib +0 -0
  322. {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner/Configs/AppInfo.xcconfig +0 -0
  323. {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner/Configs/Debug.xcconfig +0 -0
  324. {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner/Configs/Release.xcconfig +0 -0
  325. {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner/Configs/Warnings.xcconfig +0 -0
  326. {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner/DebugProfile.entitlements +0 -0
  327. {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner/Info.plist +0 -0
  328. {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner/MainFlutterWindow.swift +0 -0
  329. {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner/Release.entitlements +0 -0
  330. {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner.xcodeproj/project.pbxproj +0 -0
  331. {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -0
  332. {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +0 -0
  333. {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner.xcworkspace/contents.xcworkspacedata +0 -0
  334. {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -0
  335. {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/RunnerTests/RunnerTests.swift +0 -0
  336. {pumaguard-21.post21 → pumaguard-21.post27}/temp/pubspec.lock +0 -0
  337. {pumaguard-21.post21 → pumaguard-21.post27}/temp/pubspec.yaml +0 -0
  338. {pumaguard-21.post21 → pumaguard-21.post27}/temp/test/widget_test.dart +0 -0
  339. {pumaguard-21.post21 → pumaguard-21.post27}/temp/web/favicon.png +0 -0
  340. {pumaguard-21.post21 → pumaguard-21.post27}/temp/web/icons/Icon-192.png +0 -0
  341. {pumaguard-21.post21 → pumaguard-21.post27}/temp/web/icons/Icon-512.png +0 -0
  342. {pumaguard-21.post21 → pumaguard-21.post27}/temp/web/icons/Icon-maskable-192.png +0 -0
  343. {pumaguard-21.post21 → pumaguard-21.post27}/temp/web/icons/Icon-maskable-512.png +0 -0
  344. {pumaguard-21.post21 → pumaguard-21.post27}/temp/web/index.html +0 -0
  345. {pumaguard-21.post21 → pumaguard-21.post27}/temp/web/manifest.json +0 -0
  346. {pumaguard-21.post21 → pumaguard-21.post27}/temp/windows/.gitignore +0 -0
  347. {pumaguard-21.post21 → pumaguard-21.post27}/temp/windows/CMakeLists.txt +0 -0
  348. {pumaguard-21.post21 → pumaguard-21.post27}/temp/windows/flutter/CMakeLists.txt +0 -0
  349. {pumaguard-21.post21 → pumaguard-21.post27}/temp/windows/flutter/generated_plugin_registrant.cc +0 -0
  350. {pumaguard-21.post21 → pumaguard-21.post27}/temp/windows/flutter/generated_plugin_registrant.h +0 -0
  351. {pumaguard-21.post21 → pumaguard-21.post27}/temp/windows/flutter/generated_plugins.cmake +0 -0
  352. {pumaguard-21.post21 → pumaguard-21.post27}/temp/windows/runner/CMakeLists.txt +0 -0
  353. {pumaguard-21.post21 → pumaguard-21.post27}/temp/windows/runner/Runner.rc +0 -0
  354. {pumaguard-21.post21 → pumaguard-21.post27}/temp/windows/runner/flutter_window.cpp +0 -0
  355. {pumaguard-21.post21 → pumaguard-21.post27}/temp/windows/runner/flutter_window.h +0 -0
  356. {pumaguard-21.post21 → pumaguard-21.post27}/temp/windows/runner/main.cpp +0 -0
  357. {pumaguard-21.post21 → pumaguard-21.post27}/temp/windows/runner/resource.h +0 -0
  358. {pumaguard-21.post21 → pumaguard-21.post27}/temp/windows/runner/resources/app_icon.ico +0 -0
  359. {pumaguard-21.post21 → pumaguard-21.post27}/temp/windows/runner/runner.exe.manifest +0 -0
  360. {pumaguard-21.post21 → pumaguard-21.post27}/temp/windows/runner/utils.cpp +0 -0
  361. {pumaguard-21.post21 → pumaguard-21.post27}/temp/windows/runner/utils.h +0 -0
  362. {pumaguard-21.post21 → pumaguard-21.post27}/temp/windows/runner/win32_window.cpp +0 -0
  363. {pumaguard-21.post21 → pumaguard-21.post27}/temp/windows/runner/win32_window.h +0 -0
  364. {pumaguard-21.post21 → pumaguard-21.post27}/test-requirements.txt +0 -0
  365. {pumaguard-21.post21 → pumaguard-21.post27}/tests/TRUNCATED_IMAGE_TESTS.md +0 -0
  366. {pumaguard-21.post21 → pumaguard-21.post27}/tests/__init__.py +0 -0
  367. {pumaguard-21.post21 → pumaguard-21.post27}/tests/example_truncated_test.py +0 -0
  368. {pumaguard-21.post21 → pumaguard-21.post27}/tests/test_camera_heartbeat.py +0 -0
  369. {pumaguard-21.post21 → pumaguard-21.post27}/tests/test_dhcp_routes.py +0 -0
  370. {pumaguard-21.post21 → pumaguard-21.post27}/tests/test_pick_files.py +0 -0
  371. {pumaguard-21.post21 → pumaguard-21.post27}/tests/test_presets.py +0 -0
  372. {pumaguard-21.post21 → pumaguard-21.post27}/tests/test_server.py +0 -0
  373. {pumaguard-21.post21 → pumaguard-21.post27}/tests/test_tensorflow.py +0 -0
  374. {pumaguard-21.post21 → pumaguard-21.post27}/tests/test_utils.py +0 -0
  375. {pumaguard-21.post21 → pumaguard-21.post27}/tests/test_verify.py +0 -0
  376. {pumaguard-21.post21 → pumaguard-21.post27}/tests/test_volume.py +0 -0
  377. {pumaguard-21.post21 → pumaguard-21.post27}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pumaguard
3
- Version: 21.post21
3
+ Version: 21.post27
4
4
  Author-email: Nicolas Bock <nicolasbock@gmail.com>
5
5
  Project-URL: Homepage, http://pumaguard.rtfd.io/
6
6
  Project-URL: Repository, https://github.com/PEEC-Nature-Youth-Group/pumaguard
@@ -0,0 +1,267 @@
1
+ # Captive Portal Configuration
2
+
3
+ ## Overview
4
+
5
+ The PumaGuard device is configured to act as a **captive portal** when devices connect to its WiFi hotspot. This means phones, tablets, and laptops will automatically detect the portal and prompt users to open the PumaGuard web interface.
6
+
7
+ ## How It Works
8
+
9
+ The captive portal implementation uses a **selective DNS hijacking** approach that preserves internet connectivity while still triggering captive portal detection on client devices.
10
+
11
+ ### Architecture
12
+
13
+ ```
14
+ Phone/Device
15
+
16
+ ├─► Connects to "pumaguard" WiFi (wlan0)
17
+
18
+ ├─► Receives DHCP: IP=192.168.52.x, Gateway=192.168.52.1, DNS=192.168.52.1
19
+
20
+ ├─► Device queries captive portal detection URLs
21
+ │ (connectivitycheck.gstatic.com, captive.apple.com, etc.)
22
+
23
+ ├─► dnsmasq intercepts these specific domains → returns 192.168.52.1
24
+
25
+ ├─► Device makes HTTP request to port 80
26
+
27
+ ├─► UFW NAT rule redirects: port 80 → port 5000
28
+
29
+ └─► PumaGuard web UI responds → Captive portal detected!
30
+ ```
31
+
32
+ ### Components
33
+
34
+ 1. **dnsmasq** (`/etc/dnsmasq.d/10-pumaguard.conf`)
35
+ - Hijacks only captive portal detection domains
36
+ - Forwards all other DNS queries to upstream server (eth0)
37
+ - Preserves internet connectivity
38
+
39
+ 2. **UFW NAT rules** (`/etc/ufw/before.rules`)
40
+ - Redirects port 80 → 5000
41
+ - Ensures HTTP traffic reaches PumaGuard web UI
42
+
43
+ 3. **hostapd** (`/etc/hostapd/hostapd.conf`)
44
+ - Creates WiFi access point on wlan0
45
+ - SSID: `pumaguard`
46
+
47
+ ## Captive Portal Detection Domains
48
+
49
+ The following domains are hijacked to trigger captive portal detection:
50
+
51
+ ### Android
52
+
53
+ - `connectivitycheck.gstatic.com`
54
+ - `www.google.com`
55
+ - `clients3.google.com`
56
+ - `play.googleapis.com`
57
+
58
+ ### iOS/macOS
59
+
60
+ - `captive.apple.com`
61
+ - `www.apple.com`
62
+
63
+ ### Windows
64
+
65
+ - `www.msftconnecttest.com`
66
+ - `www.msftncsi.com`
67
+
68
+ ### Firefox
69
+
70
+ - `detectportal.firefox.com`
71
+
72
+ All other domains are resolved normally through the upstream DNS server.
73
+
74
+ ## Network Topology
75
+
76
+ ### Lab Setup (Internet Connectivity)
77
+
78
+ ```
79
+ Internet
80
+
81
+ Laptop (eth0) ←─── Raspberry Pi (eth0: 192.168.51.1)
82
+
83
+ Raspberry Pi (wlan0: 192.168.52.1)
84
+
85
+ WiFi Hotspot "pumaguard"
86
+
87
+ └─► Phone/Device (192.168.52.x)
88
+ ```
89
+
90
+ In the lab:
91
+
92
+ - Raspberry Pi eth0 connected to laptop
93
+ - Traffic from wlan0 forwarded to eth0
94
+ - DNS queries forwarded to laptop via eth0
95
+ - Devices on hotspot have internet access
96
+
97
+ ### Field Deployment (Isolated Network)
98
+
99
+ ```
100
+ Raspberry Pi (wlan0: 192.168.52.1)
101
+
102
+ WiFi Hotspot "pumaguard"
103
+
104
+ └─► Phone/Device (192.168.52.x)
105
+ ```
106
+
107
+ In the field:
108
+
109
+ - No eth0 connection
110
+ - Isolated network for camera trap monitoring
111
+ - DNS forwarding fails gracefully
112
+ - Captive portal still works (port 80 redirect)
113
+
114
+ ## Testing the Captive Portal
115
+
116
+ ### On Android
117
+
118
+ 1. Connect to "pumaguard" WiFi
119
+ 2. Enter password: `pumaguard`
120
+ 3. Look for notification: "Sign in to network" or "Captive portal detected"
121
+ 4. Tap notification → browser opens to PumaGuard UI
122
+
123
+ ### On iOS/iPhone
124
+
125
+ 1. Connect to "pumaguard" WiFi
126
+ 2. Enter password: `pumaguard`
127
+ 3. Captive portal sheet automatically appears
128
+ 4. Shows PumaGuard web interface
129
+
130
+ ### On macOS
131
+
132
+ 1. Connect to "pumaguard" WiFi
133
+ 2. Enter password: `pumaguard`
134
+ 3. System Preferences may show "Log in" button
135
+ 4. Click to open PumaGuard UI
136
+
137
+ ### On Windows
138
+
139
+ 1. Connect to "pumaguard" WiFi
140
+ 2. Enter password: `pumaguard`
141
+ 3. Action Center may show "Additional sign-in may be required"
142
+ 4. Click to open PumaGuard UI
143
+
144
+ ### Manual Access
145
+
146
+ If captive portal doesn't auto-trigger:
147
+
148
+ - Open browser to `http://192.168.52.1:5000`
149
+ - Or `http://pumaguard.local:5000`
150
+ - Or just `http://192.168.52.1` (redirects to port 5000)
151
+
152
+ ## Troubleshooting
153
+
154
+ ### Captive Portal Not Triggering
155
+
156
+ **Check DNS resolution:**
157
+
158
+ ```bash
159
+ # From a device connected to the hotspot
160
+ nslookup connectivitycheck.gstatic.com
161
+ # Should return: 192.168.52.1
162
+ ```
163
+
164
+ **Check dnsmasq logs:**
165
+
166
+ ```bash
167
+ sudo journalctl -u dnsmasq -f
168
+ ```
169
+
170
+ **Verify UFW port redirect:**
171
+
172
+ ```bash
173
+ sudo iptables -t nat -L PREROUTING -n -v
174
+ # Should show: tcp dpt:80 redir ports 5000
175
+ ```
176
+
177
+ ### Internet Connectivity Issues
178
+
179
+ **Verify eth0 connection:**
180
+
181
+ ```bash
182
+ ip addr show eth0
183
+ # Should have IP on 192.168.51.x network
184
+ ```
185
+
186
+ **Check routing:**
187
+
188
+ ```bash
189
+ ip route
190
+ # Should show routes for both 192.168.51.0/24 and 192.168.52.0/24
191
+ ```
192
+
193
+ **Test upstream DNS:**
194
+
195
+ ```bash
196
+ dig @192.168.51.1 google.com
197
+ # Should resolve to real Google IP
198
+ ```
199
+
200
+ ### Phone Shows "No Internet"
201
+
202
+ This is **normal** when captive portal detection domains are hijacked. The phone detects the portal is active. After interacting with the portal, some phones will show internet connectivity.
203
+
204
+ If actual internet is needed:
205
+
206
+ 1. Ensure eth0 is connected to upstream network
207
+ 2. Verify `server={{ dnsmasq_wired_gateway }}` is active in dnsmasq config
208
+ 3. Check IP forwarding is enabled (handled by netplan configuration)
209
+
210
+ ## Configuration Files
211
+
212
+ - **Ansible playbook:** `scripts/configure-device.yaml`
213
+ - **dnsmasq template:** `scripts/templates/dnsmasq-wlan0.conf.j2`
214
+ - **hostapd template:** `scripts/templates/hostapd.conf.j2`
215
+ - **Deployed dnsmasq config:** `/etc/dnsmasq.d/10-pumaguard.conf`
216
+ - **Deployed hostapd config:** `/etc/hostapd/hostapd.conf`
217
+ - **UFW rules:** `/etc/ufw/before.rules`
218
+
219
+ ## Security Considerations
220
+
221
+ - Only port 80 (HTTP) triggers the portal - HTTPS traffic is not intercepted
222
+ - DNS hijacking limited to captive portal detection domains only
223
+ - Firewall (UFW) restricts access to only necessary services
224
+ - Hotspot password required (default: `pumaguard` - **change in production!**)
225
+
226
+ ## Customization
227
+
228
+ ### Change Hotspot SSID/Password
229
+
230
+ Edit `scripts/configure-device.yaml`:
231
+
232
+ ```yaml
233
+ vars:
234
+ hostapd_ssid: "my-custom-ssid"
235
+ hostapd_passphrase: "my-secure-password"
236
+ ```
237
+
238
+ ### Disable Captive Portal (Full Internet Access)
239
+
240
+ Edit `scripts/templates/dnsmasq-wlan0.conf.j2`:
241
+
242
+ ```bash
243
+ # Comment out all the address=/ lines for captive portal domains
244
+ # Keep only:
245
+ address=/pumaguard.local/{{ dnsmasq_gateway }}
246
+ server={{ dnsmasq_wired_gateway }}
247
+ ```
248
+
249
+ ### Change IP Range
250
+
251
+ Edit `scripts/configure-device.yaml`:
252
+
253
+ ```yaml
254
+ vars:
255
+ dnsmasq_dhcp_start: "192.168.52.50"
256
+ dnsmasq_dhcp_end: "192.168.52.150"
257
+ dnsmasq_gateway: "192.168.52.1"
258
+ ```
259
+
260
+ ## References
261
+
262
+ - **dnsmasq documentation:** https://thekelleys.org.uk/dnsmasq/doc.html
263
+ - **hostapd documentation:** https://w1.fi/hostapd/
264
+ - **Captive portal detection:**
265
+ - Android: https://android.googlesource.com/platform/frameworks/base/+/master/services/core/java/com/android/server/connectivity/NetworkMonitor.java
266
+ - iOS: https://www.apple.com/library/test/success.html
267
+ - Windows: https://docs.microsoft.com/en-us/windows/win32/nativewifi/portal-detection
@@ -37,6 +37,6 @@ References
37
37
  .. [A53ARM] https://www.arm.com/products/silicon-ip-cpu/cortex-a/cortex-a53
38
38
  .. [A53Wikipedia] https://en.wikipedia.org/wiki/ARM_Cortex-A53
39
39
  .. [Pi5] https://www.raspberrypi.com/products/raspberry-pi-5/
40
- .. [A76ARM] https://developer.arm.com/Processors/Cortex-A76
40
+ .. [A76ARM] https://www.arm.com/products/silicon-ip-cpu/cortex-a/cortex-a76
41
41
  .. [A76Wikipedia] https://en.wikipedia.org/wiki/ARM_Cortex-A76
42
42
  .. [RaspberryPerformance] https://web.eece.maine.edu/~vweaver/group/green_machines.html
@@ -0,0 +1 @@
1
+ 3269bc90c80e0ca8fecacfb7533f77fc
@@ -34,6 +34,6 @@ addEventListener("message", eventListener);
34
34
  if (!window._flutter) {
35
35
  window._flutter = {};
36
36
  }
37
- _flutter.buildConfig = {"engineRevision":"78fc3012e45889657f72359b005af7beac47ba3d","builds":[{"compileTarget":"dart2js","renderer":"canvaskit","mainJsPath":"main.dart.js"},{}],"useLocalCanvasKit":true};
37
+ _flutter.buildConfig = {"engineRevision":"db373eb85a06eb3d706af362a45d42d0972f4b46","builds":[{"compileTarget":"dart2js","renderer":"canvaskit","mainJsPath":"main.dart.js"},{}],"useLocalCanvasKit":true};
38
38
 
39
39
  _flutter.loader.load();
@@ -1714,7 +1714,7 @@ s.id=c
1714
1714
  b.appendChild(s)
1715
1715
  A.aXO(s,a,"normal normal 14px sans-serif")},
1716
1716
  aXO(a,b,c){var s,r,q,p=v.G
1717
- a.append(p.document.createTextNode(b+" flt-scene-host { font: "+c+";}"+b+" flt-semantics input[type=range] { appearance: none; -webkit-appearance: none; width: 100%; position: absolute; border: none; top: 0; right: 0; bottom: 0; left: 0;}"+b+" input::selection { background-color: transparent;}"+b+" textarea::selection { background-color: transparent;}"+b+" flt-semantics input,"+b+" flt-semantics textarea,"+b+' flt-semantics [contentEditable="true"] { caret-color: transparent;}'+b+" .flt-text-editing::placeholder { opacity: 0;}"+b+":focus { outline: none;}"))
1717
+ a.append(p.document.createTextNode(b+" flt-scene-host { font: "+c+";}"+b+" flt-semantics input[type=range] { appearance: none; -webkit-appearance: none; width: 100%; position: absolute; border: none; top: 0; right: 0; bottom: 0; left: 0;}"+b+" input::selection { background-color: transparent;}"+b+" textarea::selection { background-color: transparent;}"+b+" flt-semantics input,"+b+" flt-semantics textarea,"+b+' flt-semantics [contentEditable="true"] { caret-color: transparent;}'+b+" .flt-text-editing::placeholder { opacity: 0;}"+b+":focus { outline: rgb(0, 0, 0) none 0px;}"))
1718
1718
  if($.bg().gdY()===B.bs)a.append(p.document.createTextNode(b+" * { -webkit-tap-highlight-color: transparent;}"+b+" flt-semantics input[type=range]::-webkit-slider-thumb { -webkit-appearance: none;}"))
1719
1719
  if($.bg().gdY()===B.cY)a.append(p.document.createTextNode(b+" flt-paragraph,"+b+" flt-span { line-height: 100%;}"))
1720
1720
  if($.bg().gdY()===B.cC||$.bg().gdY()===B.bs)a.append(p.document.createTextNode(b+" .transparentTextEditing:-webkit-autofill,"+b+" .transparentTextEditing:-webkit-autofill:hover,"+b+" .transparentTextEditing:-webkit-autofill:focus,"+b+" .transparentTextEditing:-webkit-autofill:active { opacity: 0 !important;}"))
@@ -92634,7 +92634,7 @@ A.Ob.prototype={
92634
92634
  K(a){var s,r=null,q=A.aA1(B.ae,r,r,B.nU)
92635
92635
  q=A.r8(B.mN,r,new A.mC(r,r,r,r,2,r,new A.cL(A.hY(12),B.u)),q,"Roboto",!0)
92636
92636
  s=A.aA1(B.aj,r,r,B.nU)
92637
- return new A.Bw(new A.w3(new A.adF(),r,r,r,r,t.Gj),r,r,new A.AH(B.I0,"PumaGuard v21-21-g130964d",q,A.r8(B.mN,r,new A.mC(r,r,r,r,2,r,new A.cL(A.hY(12),B.u)),s,"Roboto",!0),B.Bn,!1,r),r,t.Bp)}}
92637
+ return new A.Bw(new A.w3(new A.adF(),r,r,r,r,t.Gj),r,r,new A.AH(B.I0,"PumaGuard v21-27-gd6de676",q,A.r8(B.mN,r,new A.mC(r,r,r,r,2,r,new A.cL(A.hY(12),B.u)),s,"Roboto",!0),B.Bn,!1,r),r,t.Bp)}}
92638
92638
  A.adF.prototype={
92639
92639
  $1(a){return new A.mu()},
92640
92640
  $S:556}
@@ -92997,7 +92997,7 @@ q=A.aj("System Information",h,h,h,h,A.l(q).ok.r,h,h)
92997
92997
  s=i.d
92998
92998
  s=s==null?h:s.b
92999
92999
  s=i.um("Backend Version",s==null?"Unknown":s)
93000
- n=i.um("UI Version","v21-21-g130964d")
93000
+ n=i.um("UI Version","v21-27-gd6de676")
93001
93001
  l=i.d
93002
93002
  k=l==null
93003
93003
  j=k?h:l.d
@@ -468,6 +468,16 @@ def register_settings_routes(app: "Flask", webui: "WebUI") -> None:
468
468
  }
469
469
  )
470
470
 
471
- except Exception as e: # pylint: disable=broad-except
471
+ except Exception: # pylint: disable=broad-except
472
472
  logger.exception("Error uploading sound file")
473
- return jsonify({"error": str(e)}), 500
473
+ return (
474
+ jsonify(
475
+ {
476
+ "error": (
477
+ "An internal error occurred while uploading the "
478
+ "sound file."
479
+ )
480
+ }
481
+ ),
482
+ 500,
483
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pumaguard
3
- Version: 21.post21
3
+ Version: 21.post27
4
4
  Author-email: Nicolas Bock <nicolasbock@gmail.com>
5
5
  Project-URL: Homepage, http://pumaguard.rtfd.io/
6
6
  Project-URL: Repository, https://github.com/PEEC-Nature-Youth-Group/pumaguard
@@ -47,6 +47,7 @@ docs/CAMERA_INTEGRATION.md
47
47
  docs/CAMERA_STATUS_REFRESH.md
48
48
  docs/CAMERA_TRACKING.md
49
49
  docs/CAMERA_URL_TROUBLESHOOTING.md
50
+ docs/CAPTIVE_PORTAL.md
50
51
  docs/DYNAMIC_URL_DETECTION.md
51
52
  docs/HEARTBEAT_FEATURE.md
52
53
  docs/IMAGE_BROWSER.md
@@ -211,6 +211,16 @@
211
211
  tags:
212
212
  - firewall
213
213
 
214
+ - name: Enable IPv4 forwarding
215
+ ansible.posix.sysctl:
216
+ name: net.ipv4.ip_forward
217
+ value: "1"
218
+ sysctl_set: true
219
+ state: present
220
+ reload: true
221
+ tags:
222
+ - firewall
223
+
214
224
  - name: Configure UFW NAT rules for port 80 to 5000 redirect
215
225
  ansible.builtin.blockinfile:
216
226
  path: /etc/ufw/before.rules
@@ -230,6 +240,47 @@
230
240
  tags:
231
241
  - firewall
232
242
 
243
+ - name: Configure UFW NAT masquerading for IP forwarding
244
+ ansible.builtin.blockinfile:
245
+ path: /etc/ufw/before.rules
246
+ insertbefore: "^# Don't delete these required lines"
247
+ marker: "# {mark} ANSIBLE MANAGED BLOCK - PumaGuard NAT masquerading"
248
+ block: |
249
+ # NAT table rules for masquerading (IP forwarding)
250
+ *nat
251
+ :POSTROUTING ACCEPT [0:0]
252
+
253
+ # Enable masquerading for outbound traffic on eth0
254
+ -A POSTROUTING -o eth0 -j MASQUERADE
255
+
256
+ # Commit NAT rules
257
+ COMMIT
258
+ notify: Restart ufw
259
+ tags:
260
+ - firewall
261
+
262
+ - name: Configure UFW FORWARD chain rules for wlan0 to eth0 traffic
263
+ ansible.builtin.blockinfile:
264
+ path: /etc/ufw/before.rules
265
+ insertbefore: "^# Don't delete these required lines"
266
+ marker: "# {mark} ANSIBLE MANAGED BLOCK - PumaGuard FORWARD rules"
267
+ block: |
268
+ # FORWARD chain rules for traffic between wlan0 and eth0
269
+ *filter
270
+ :FORWARD ACCEPT [0:0]
271
+
272
+ # Allow existing connections to return from eth0 to wlan0
273
+ -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
274
+
275
+ # Allow new requests from the hotspot (wlan0) to go out via eth0
276
+ -A FORWARD -i wlan0 -o eth0 -j ACCEPT
277
+
278
+ # Commit FORWARD rules
279
+ COMMIT
280
+ notify: Restart ufw
281
+ tags:
282
+ - firewall
283
+
233
284
  - name: Enable logging for dropped packets
234
285
  community.general.ufw:
235
286
  logging: "medium"
@@ -479,7 +530,7 @@
479
530
  tags:
480
531
  - networking
481
532
 
482
- - name: Configure dnsmasq for wlan0 hotspot
533
+ - name: Configure dnsmasq for wlan0 hotspot (captive portal)
483
534
  ansible.builtin.template:
484
535
  lstrip_blocks: true
485
536
  trim_blocks: true
@@ -491,6 +542,10 @@
491
542
  notify: Restart dnsmasq
492
543
  tags:
493
544
  - networking
545
+ # This configures selective DNS hijacking for captive portal detection domains only.
546
+ # Real DNS queries are forwarded to eth0 for internet connectivity.
547
+ # Combined with port 80->5000 redirect, this triggers captive portal detection
548
+ # on phones/devices while preserving internet access through the wired interface.
494
549
 
495
550
  - name: Configure hostapd for wlan0 access point
496
551
  ansible.builtin.template:
@@ -26,12 +26,33 @@ expand-hosts
26
26
  # Static DNS entry for pumaguard.local
27
27
  address=/pumaguard.local/{{ dnsmasq_gateway }}
28
28
 
29
+ # Captive Portal Detection Configuration
30
+ # Hijack only captive portal detection domains to trigger portal on client devices
31
+ # This allows internet connectivity while still triggering captive portal behavior
32
+
33
+ # Android captive portal detection
34
+ address=/connectivitycheck.gstatic.com/{{ dnsmasq_gateway }}
35
+ address=/www.google.com/{{ dnsmasq_gateway }}
36
+ address=/clients3.google.com/{{ dnsmasq_gateway }}
37
+ address=/play.googleapis.com/{{ dnsmasq_gateway }}
38
+
39
+ # iOS/macOS captive portal detection
40
+ address=/captive.apple.com/{{ dnsmasq_gateway }}
41
+ address=/www.apple.com/{{ dnsmasq_gateway }}
42
+
43
+ # Windows captive portal detection
44
+ address=/www.msftconnecttest.com/{{ dnsmasq_gateway }}
45
+ address=/www.msftncsi.com/{{ dnsmasq_gateway }}
46
+
47
+ # Firefox captive portal detection
48
+ address=/detectportal.firefox.com/{{ dnsmasq_gateway }}
49
+
29
50
  # Enable IPv6 Router Advertisements
30
51
  enable-ra
31
52
  # IPv6 DHCP range for wlan0
32
53
  dhcp-range={{ dnsmasq_ipv6_prefix }}:10,{{ dnsmasq_ipv6_prefix }}:2000,{{ dnsmasq_lease_time }}
33
54
 
34
- # Upstream DNS server (wired network)
55
+ # Upstream DNS server (wired network) - preserves internet connectivity
35
56
  server={{ dnsmasq_wired_gateway }}
36
57
 
37
58
  # Enable logging
@@ -1 +0,0 @@
1
- e01c6dcff88825e413a1183b5781dab4
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes