lanscape 1.3.0b1__tar.gz → 1.3.1a1__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.
- {lanscape-1.3.0b1/src/lanscape.egg-info → lanscape-1.3.1a1}/PKG-INFO +1 -1
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/pyproject.toml +1 -1
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/libraries/net_tools.py +13 -6
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/libraries/web_browser.py +12 -1
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/ui/app.py +2 -2
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/ui/main.py +3 -3
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/ui/templates/info.html +1 -1
- {lanscape-1.3.0b1 → lanscape-1.3.1a1/src/lanscape.egg-info}/PKG-INFO +1 -1
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/LICENSE +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/MANIFEST.in +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/README.md +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/setup.cfg +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/__init__.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/__main__.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/libraries/app_scope.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/libraries/decorators.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/libraries/errors.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/libraries/ip_parser.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/libraries/logger.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/libraries/mac_lookup.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/libraries/port_manager.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/libraries/runtime_args.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/libraries/service_scan.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/libraries/subnet_scan.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/libraries/version_manager.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/resources/mac_addresses/convert_csv.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/resources/mac_addresses/mac_db.json +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/resources/ports/convert_csv.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/resources/ports/full.json +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/resources/ports/large.json +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/resources/ports/medium.json +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/resources/ports/small.json +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/resources/services/definitions.jsonc +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/tests/__init__.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/tests/_helpers.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/tests/test_api.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/tests/test_env.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/tests/test_library.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/ui/blueprints/__init__.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/ui/blueprints/api/__init__.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/ui/blueprints/api/port.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/ui/blueprints/api/scan.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/ui/blueprints/api/tools.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/ui/blueprints/web/__init__.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/ui/blueprints/web/routes.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/ui/static/css/style.css +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/ui/static/img/ico/android-chrome-192x192.png +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/ui/static/img/ico/android-chrome-512x512.png +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/ui/static/img/ico/apple-touch-icon.png +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/ui/static/img/ico/favicon-16x16.png +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/ui/static/img/ico/favicon-32x32.png +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/ui/static/img/ico/favicon.ico +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/ui/static/img/ico/site.webmanifest +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/ui/static/js/core.js +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/ui/static/js/layout-sizing.js +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/ui/static/js/main.js +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/ui/static/js/on-tab-close.js +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/ui/static/js/quietReload.js +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/ui/static/js/shutdown-server.js +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/ui/static/js/subnet-info.js +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/ui/static/js/subnet-selector.js +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/ui/static/lanscape.webmanifest +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/ui/templates/base.html +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/ui/templates/core/head.html +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/ui/templates/core/scripts.html +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/ui/templates/error.html +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/ui/templates/main.html +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/ui/templates/scan/export.html +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/ui/templates/scan/ip-table-row.html +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/ui/templates/scan/ip-table.html +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/ui/templates/scan/overview.html +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/ui/templates/scan/scan-error.html +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/ui/templates/scan.html +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/ui/templates/shutdown.html +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape.egg-info/SOURCES.txt +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape.egg-info/dependency_links.txt +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape.egg-info/requires.txt +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape.egg-info/top_level.txt +0 -0
|
@@ -347,17 +347,24 @@ def get_all_network_subnets():
|
|
|
347
347
|
|
|
348
348
|
return subnets
|
|
349
349
|
|
|
350
|
-
def smart_select_primary_subnet(subnets: List[dict]=
|
|
350
|
+
def smart_select_primary_subnet(subnets: List[dict] | None = None) -> str:
|
|
351
351
|
"""
|
|
352
|
-
|
|
353
|
-
|
|
352
|
+
Finds the largest subnet within max ip range. If no subnets are
|
|
353
|
+
available, returns an empty string instead of raising ``KeyError``.
|
|
354
354
|
"""
|
|
355
|
+
subnets = subnets or get_all_network_subnets()
|
|
356
|
+
|
|
357
|
+
if not subnets:
|
|
358
|
+
return ""
|
|
359
|
+
|
|
355
360
|
selected = {}
|
|
356
361
|
for subnet in subnets:
|
|
357
|
-
if selected.get(
|
|
362
|
+
if selected.get("address_cnt", 0) < subnet["address_cnt"] < MAX_IPS_ALLOWED:
|
|
358
363
|
selected = subnet
|
|
359
|
-
|
|
364
|
+
|
|
365
|
+
if not selected:
|
|
360
366
|
selected = subnets[0]
|
|
361
|
-
|
|
367
|
+
|
|
368
|
+
return selected.get("subnet", "")
|
|
362
369
|
|
|
363
370
|
|
|
@@ -29,6 +29,13 @@ def open_webapp(url: str) -> bool:
|
|
|
29
29
|
"""
|
|
30
30
|
start = time.time()
|
|
31
31
|
try:
|
|
32
|
+
if sys.platform.startswith("darwin"):
|
|
33
|
+
# macOS does not support chrome-style app mode via the generic
|
|
34
|
+
# method. Fallback to the system "open" command which will use the
|
|
35
|
+
# default browser.
|
|
36
|
+
subprocess.run(["open", url], check=True)
|
|
37
|
+
return True
|
|
38
|
+
|
|
32
39
|
exe = get_default_browser_executable()
|
|
33
40
|
if not exe:
|
|
34
41
|
raise RuntimeError('Unable to find browser binary')
|
|
@@ -117,8 +124,12 @@ def get_default_browser_executable() -> Optional[str]:
|
|
|
117
124
|
# strip arguments like “%u”, “--flag”, etc.
|
|
118
125
|
exec_cmd = exec_cmd.split()[0]
|
|
119
126
|
exec_cmd = exec_cmd.split("%")[0]
|
|
120
|
-
|
|
127
|
+
return exec_cmd
|
|
121
128
|
return None
|
|
122
129
|
|
|
130
|
+
elif sys.platform.startswith("darwin"):
|
|
131
|
+
# macOS will use the system 'open' command to launch the default browser
|
|
132
|
+
return "/usr/bin/open"
|
|
133
|
+
|
|
123
134
|
else:
|
|
124
135
|
raise NotImplementedError(f"Unsupported platform: {sys.platform!r}")
|
|
@@ -71,7 +71,7 @@ def exit_app():
|
|
|
71
71
|
if args.persistent:
|
|
72
72
|
log.info('Dectected browser close, not exiting flask.')
|
|
73
73
|
return "Ignored"
|
|
74
|
-
log.info('Web browser closed, terminating flask.')
|
|
74
|
+
log.info('Web browser closed, terminating flask. (disable with --peristent)')
|
|
75
75
|
elif req_type == 'core':
|
|
76
76
|
log.info('Core requested exit, terminating flask.')
|
|
77
77
|
else:
|
|
@@ -100,7 +100,7 @@ def internal_error(e):
|
|
|
100
100
|
## Webserver creation functions
|
|
101
101
|
################################
|
|
102
102
|
|
|
103
|
-
def
|
|
103
|
+
def start_webserver_daemon(args: RuntimeArgs) -> threading.Thread:
|
|
104
104
|
proc = threading.Thread(target=start_webserver, args=(args,))
|
|
105
105
|
proc.daemon = True # Kill thread when main thread exits
|
|
106
106
|
proc.start()
|
|
@@ -12,7 +12,7 @@ args = parse_args()
|
|
|
12
12
|
configure_logging(args.loglevel, args.logfile, args.flask_logging)
|
|
13
13
|
|
|
14
14
|
from ..libraries.version_manager import get_installed_version, is_update_available
|
|
15
|
-
from .app import
|
|
15
|
+
from .app import start_webserver_daemon, start_webserver
|
|
16
16
|
import socket
|
|
17
17
|
|
|
18
18
|
|
|
@@ -100,13 +100,13 @@ def start_webserver_ui(args: RuntimeArgs):
|
|
|
100
100
|
).start()
|
|
101
101
|
start_webserver(args)
|
|
102
102
|
else:
|
|
103
|
-
flask_thread =
|
|
103
|
+
flask_thread = start_webserver_daemon(args)
|
|
104
104
|
app_closed = open_browser(uri)
|
|
105
105
|
|
|
106
106
|
# depending on env, open_browser may or
|
|
107
107
|
# may not be coupled with the closure of UI
|
|
108
108
|
# (if in browser tab, it's uncoupled)
|
|
109
|
-
if not app_closed:
|
|
109
|
+
if not app_closed or args.persistent:
|
|
110
110
|
# not doing a direct join so i can still
|
|
111
111
|
# terminate the app with ctrl+c
|
|
112
112
|
while flask_thread.is_alive():
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
discover more about your network as well. Enjoy!
|
|
35
35
|
</p>
|
|
36
36
|
<a href="https://github.com/mdennis281/" target="_blank">
|
|
37
|
-
<button class="btn btn-primary m-2">
|
|
37
|
+
<button class="btn btn-primary m-2">GitHub</button>
|
|
38
38
|
</a>
|
|
39
39
|
<a href="https://github.com/mdennis281/LANscape" target="_blank">
|
|
40
40
|
<button class="btn btn-secondary m-2">Project Repo</button>
|
|
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
|
{lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/ui/static/img/ico/android-chrome-192x192.png
RENAMED
|
File without changes
|
{lanscape-1.3.0b1 → lanscape-1.3.1a1}/src/lanscape/ui/static/img/ico/android-chrome-512x512.png
RENAMED
|
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
|