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.
- {pumaguard-21.post21 → pumaguard-21.post27}/PKG-INFO +1 -1
- pumaguard-21.post27/docs/CAPTIVE_PORTAL.md +267 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/Performance.rst +1 -1
- pumaguard-21.post27/pumaguard/pumaguard-ui/.last_build_id +1 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/flutter_bootstrap.js +1 -1
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/main.dart.js +3 -3
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/web_routes/settings.py +12 -2
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard.egg-info/PKG-INFO +1 -1
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard.egg-info/SOURCES.txt +1 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/scripts/configure-device.yaml +56 -1
- {pumaguard-21.post21 → pumaguard-21.post27}/scripts/templates/dnsmasq-wlan0.conf.j2 +22 -1
- pumaguard-21.post21/pumaguard/pumaguard-ui/.last_build_id +0 -1
- {pumaguard-21.post21 → pumaguard-21.post27}/.github/CODEOWNERS +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/.github/actions/clean-runner/action.yaml +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/.github/actions/setup-python/action.yaml +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/.github/agents/general.md +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/.github/copilot-instructions.md +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/.github/dependabot.yml +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/.github/workflows/build-webpage.yaml +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/.github/workflows/codeql.yaml +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/.github/workflows/test-and-package.yaml +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/.gitignore +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/.gitmodules +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/.readthedocs.yaml +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/CAMERA_DETECTION_SUMMARY.md +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/CAMERA_QUICKSTART.md +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/CAMERA_QUICK_REFERENCE.md +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/CAMERA_URL_COMPLETE.md +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/CAMERA_URL_FIX_SUMMARY.md +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/CONTRIBUTING.md +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/GROUPING_FEATURE_IMPLEMENTATION.md +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/LICENSE +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/MANIFEST.in +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/Makefile +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/QUICKSTART_CAMERA_UI.md +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/README.md +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/RELEASE.md +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/TEST_SUMMARY.md +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/TRUNCATED_IMAGE_TEST_QUICK_REF.md +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/ansible.cfg +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/API_REFERENCE.md +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/BUILD_REFERENCE.md +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/CAMERA_HEARTBEAT.md +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/CAMERA_INTEGRATION.md +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/CAMERA_STATUS_REFRESH.md +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/CAMERA_TRACKING.md +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/CAMERA_URL_TROUBLESHOOTING.md +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/DYNAMIC_URL_DETECTION.md +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/HEARTBEAT_FEATURE.md +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/IMAGE_BROWSER.md +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/MDNS_FEATURES.md +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/MDNS_SETUP.md +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/Makefile +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/QUICK_START_MDNS.md +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/SETTINGS_PERSISTENCE.md +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/STOP_SOUND_FEATURE.md +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/UI_DEVELOPMENT_CONTEXT.md +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/VOLUME_CONTROL.md +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/VOLUME_FIX.md +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/WEB_UI_STRUCTURE.md +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/XDG_MIGRATION.md +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/make.bat +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/About.rst +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/Camera_parts.rst +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/Cameralocation.rst +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/Deployment.rst +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/HLD.rst +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/Parts.rst +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/PowerConsiderations.rst +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/WeatherProofing.rst +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/_static/20241021-puma01.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/_static/20241022-puma01.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/_static/MLProj.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/_static/Stables map.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/_static/Stables.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/_static/custom.css +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/_static/figure01.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/_static/server-demo.gif +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/_static/stables-map.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/camerapowerconsumption.rst +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/conf.py +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/index.rst +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/lights.rst +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/modules.rst +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/presentations/2024-12-08 PEEC Presentations.odp +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/presentations/2024-12-08 PEEC Presentations.pdf +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/pumaguard.rst +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/pumaguard.web_routes.rst +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/raspberrypie5powerconsumption.rst +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/requirements.txt +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/docs/source/solarpanelresearch.rst +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/notebooks/Mountain_Lions.ipynb +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/notebooks/dogs-vs-cats-classification-with-transfer-learning.ipynb +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/notebooks/dogs-vs-cats-classification-with-transfer-learning.log +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/notebooks/lion-vs-nolion-classification-with-transfer.ipynb +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/notebooks/puma-two-stage-inference-only.ipynb +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/notebooks/puma-two-stage-pipeline-flatprefix.ipynb +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/prepare-device.md +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/__init__.py +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/camera_heartbeat.py +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/classify.py +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/completions/pumaguard-classify-completions.sh +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/completions/pumaguard-completions.sh +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/completions/pumaguard-server-completions.sh +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/completions/pumaguard-train-completions.sh +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/lock_manager.py +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/main.py +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/model-registry.yaml +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/model_cli.py +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/model_downloader.py +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/presets.py +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/assets/AssetManifest.bin +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/assets/AssetManifest.bin.json +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/assets/FontManifest.json +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/assets/NOTICES +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/assets/fonts/MaterialIcons-Regular.otf +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/assets/fonts/Roboto-Bold.ttf +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/assets/fonts/Roboto-Light.ttf +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/assets/fonts/Roboto-Medium.ttf +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/assets/fonts/Roboto-Regular.ttf +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/assets/fonts/RobotoMono-Bold.ttf +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/assets/fonts/RobotoMono-Medium.ttf +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/assets/fonts/RobotoMono-Regular.ttf +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/assets/packages/cupertino_icons/assets/CupertinoIcons.ttf +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/assets/shaders/ink_sparkle.frag +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/assets/shaders/stretch_effect.frag +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/canvaskit/canvaskit.js +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/canvaskit/canvaskit.js.symbols +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/canvaskit/canvaskit.wasm +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/canvaskit/chromium/canvaskit.js +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/canvaskit/chromium/canvaskit.js.symbols +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/canvaskit/chromium/canvaskit.wasm +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/canvaskit/skwasm.js +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/canvaskit/skwasm.js.symbols +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/canvaskit/skwasm.wasm +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/canvaskit/skwasm_heavy.js +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/canvaskit/skwasm_heavy.js.symbols +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/canvaskit/skwasm_heavy.wasm +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/favicon.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/flutter.js +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/flutter_service_worker.js +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/icons/Icon-192.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/icons/Icon-512.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/icons/Icon-maskable-192.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/icons/Icon-maskable-512.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/index.html +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/manifest.json +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/pumaguard-ui/version.json +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/server.py +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/sound.py +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/stats.py +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/utils.py +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/verify.py +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/web_routes/__init__.py +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/web_routes/artifacts.py +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/web_routes/dhcp.py +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/web_routes/diagnostics.py +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/web_routes/directories.py +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/web_routes/folders.py +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/web_routes/photos.py +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/web_routes/sync.py +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard/web_ui.py +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard-logo-2-1024-1024.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard-logo-2-512-512.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard-logo-2.webp +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard-logo-3-1024-1024.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard-logo-3-512-512.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard-logo-4-1024-1024.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard-logo-4-512-512.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard-logo.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard-sounds/cougar_call.mp3 +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard-sounds/cougarsounds.wav +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard-sounds/deterrent_puma.mp3 +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard-sounds/detterent_ringtail.mp3 +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard-sounds/lion-roar-6011.mp3 +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard-sounds/lion_cry.wav +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard-sounds/pumaguard-warning.mp3 +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard-sounds/short-round-110940.mp3 +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard-ui/ios/Flutter/ephemeral/flutter_lldb_helper.py +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard.egg-info/dependency_links.txt +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard.egg-info/entry_points.txt +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard.egg-info/requires.txt +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pumaguard.egg-info/top_level.txt +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pylintrc +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/pyproject.toml +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/requirements.txt +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/scripts/README_CAMERA_TESTING.md +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/scripts/__init__.py +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/scripts/add_fake_cameras.sh +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/scripts/classify.py +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/scripts/configure-laptop.yaml +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/scripts/deploy-pumaguard.yaml +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/scripts/image-sd-card-for-pi.sh +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/scripts/install-pumaguard.sh +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/scripts/laptop_config.yaml +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/scripts/laptop_vault.yaml +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/scripts/launch-pi-VM.sh +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/scripts/pick_files.py +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/scripts/play_sound.py +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/scripts/pumaguard +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/scripts/pumaguard-train-snap-wrapper.sh +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/scripts/server.py +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/scripts/templates/hostapd.conf.j2 +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/scripts/templates/netplan-network-manager.j2 +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/scripts/templates/netplan-pumaguard.j2 +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/scripts/templates/netplan-wired.j2 +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/scripts/templates/netplan-wireless.j2 +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/scripts/templates/pumaguard-dhcp-notify.sh.j2 +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/scripts/templates/pumaguard.service.j2 +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/scripts/templates/systemd-network-wlan0.link.j2 +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/scripts/templates/systemd-network-wlan0.network.j2 +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/scripts/test-server.sh +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/scripts/test_xception.py +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/scripts/train.py +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/scripts/verify.py +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/scripts/vsftpd.conf.j2 +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/scripts/wireless_credentials.yaml +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/settings/notebook-1.yaml +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/setup.cfg +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/snap/snapcraft.yaml +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/.gitignore +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/.metadata +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/README.md +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/analysis_options.yaml +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/android/.gitignore +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/android/app/build.gradle.kts +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/android/app/src/debug/AndroidManifest.xml +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/android/app/src/main/AndroidManifest.xml +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/android/app/src/main/kotlin/com/example/pumaguard_ui/MainActivity.kt +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/android/app/src/main/res/drawable/launch_background.xml +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/android/app/src/main/res/drawable-v21/launch_background.xml +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/android/app/src/main/res/values/styles.xml +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/android/app/src/main/res/values-night/styles.xml +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/android/app/src/profile/AndroidManifest.xml +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/android/build.gradle.kts +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/android/gradle/wrapper/gradle-wrapper.properties +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/android/gradle.properties +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/android/settings.gradle.kts +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/.gitignore +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Flutter/AppFrameworkInfo.plist +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Flutter/Debug.xcconfig +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Flutter/Release.xcconfig +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/AppDelegate.swift +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Base.lproj/LaunchScreen.storyboard +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Base.lproj/Main.storyboard +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Info.plist +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner/Runner-Bridging-Header.h +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner.xcodeproj/project.pbxproj +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner.xcworkspace/contents.xcworkspacedata +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/ios/RunnerTests/RunnerTests.swift +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/lib/main.dart +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/lib/models/settings.dart +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/lib/models/status.dart +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/lib/screens/directories_screen.dart +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/lib/screens/home_screen.dart +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/lib/screens/server_discovery_screen.dart +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/lib/screens/settings_screen.dart +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/lib/services/api_service.dart +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/lib/services/mdns_service.dart +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/lib/services/mdns_service_impl.dart +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/lib/services/mdns_service_io.dart +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/lib/services/mdns_service_web.dart +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/lib/utils/platform_url.dart +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/lib/utils/platform_url_stub.dart +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/lib/utils/platform_url_web.dart +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/linux/.gitignore +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/linux/CMakeLists.txt +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/linux/flutter/CMakeLists.txt +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/linux/flutter/generated_plugin_registrant.cc +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/linux/flutter/generated_plugin_registrant.h +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/linux/flutter/generated_plugins.cmake +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/linux/runner/CMakeLists.txt +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/linux/runner/main.cc +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/linux/runner/my_application.cc +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/linux/runner/my_application.h +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/.gitignore +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Flutter/Flutter-Debug.xcconfig +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Flutter/Flutter-Release.xcconfig +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Flutter/GeneratedPluginRegistrant.swift +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner/AppDelegate.swift +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner/Base.lproj/MainMenu.xib +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner/Configs/AppInfo.xcconfig +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner/Configs/Debug.xcconfig +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner/Configs/Release.xcconfig +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner/Configs/Warnings.xcconfig +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner/DebugProfile.entitlements +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner/Info.plist +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner/MainFlutterWindow.swift +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner/Release.entitlements +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner.xcodeproj/project.pbxproj +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner.xcworkspace/contents.xcworkspacedata +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/macos/RunnerTests/RunnerTests.swift +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/pubspec.lock +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/pubspec.yaml +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/test/widget_test.dart +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/web/favicon.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/web/icons/Icon-192.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/web/icons/Icon-512.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/web/icons/Icon-maskable-192.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/web/icons/Icon-maskable-512.png +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/web/index.html +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/web/manifest.json +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/windows/.gitignore +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/windows/CMakeLists.txt +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/windows/flutter/CMakeLists.txt +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/windows/flutter/generated_plugin_registrant.cc +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/windows/flutter/generated_plugin_registrant.h +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/windows/flutter/generated_plugins.cmake +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/windows/runner/CMakeLists.txt +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/windows/runner/Runner.rc +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/windows/runner/flutter_window.cpp +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/windows/runner/flutter_window.h +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/windows/runner/main.cpp +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/windows/runner/resource.h +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/windows/runner/resources/app_icon.ico +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/windows/runner/runner.exe.manifest +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/windows/runner/utils.cpp +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/windows/runner/utils.h +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/windows/runner/win32_window.cpp +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/temp/windows/runner/win32_window.h +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/test-requirements.txt +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/tests/TRUNCATED_IMAGE_TESTS.md +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/tests/__init__.py +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/tests/example_truncated_test.py +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/tests/test_camera_heartbeat.py +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/tests/test_dhcp_routes.py +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/tests/test_pick_files.py +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/tests/test_presets.py +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/tests/test_server.py +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/tests/test_tensorflow.py +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/tests/test_utils.py +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/tests/test_verify.py +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/tests/test_volume.py +0 -0
- {pumaguard-21.post21 → pumaguard-21.post27}/uv.lock +0 -0
|
@@ -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://
|
|
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":"
|
|
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-
|
|
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-
|
|
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
|
|
471
|
+
except Exception: # pylint: disable=broad-except
|
|
472
472
|
logger.exception("Error uploading sound file")
|
|
473
|
-
return
|
|
473
|
+
return (
|
|
474
|
+
jsonify(
|
|
475
|
+
{
|
|
476
|
+
"error": (
|
|
477
|
+
"An internal error occurred while uploading the "
|
|
478
|
+
"sound file."
|
|
479
|
+
)
|
|
480
|
+
}
|
|
481
|
+
),
|
|
482
|
+
500,
|
|
483
|
+
)
|
|
@@ -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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|