lanscape 1.3.0b1__tar.gz → 1.3.1a2__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.
Potentially problematic release.
This version of lanscape might be problematic. Click here for more details.
- {lanscape-1.3.0b1/src/lanscape.egg-info → lanscape-1.3.1a2}/PKG-INFO +1 -1
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/pyproject.toml +1 -1
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/libraries/net_tools.py +13 -6
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/libraries/web_browser.py +19 -6
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/ui/app.py +2 -2
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/ui/main.py +3 -3
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/ui/templates/info.html +1 -1
- {lanscape-1.3.0b1 → lanscape-1.3.1a2/src/lanscape.egg-info}/PKG-INFO +1 -1
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/LICENSE +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/MANIFEST.in +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/README.md +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/setup.cfg +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/__init__.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/__main__.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/libraries/app_scope.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/libraries/decorators.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/libraries/errors.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/libraries/ip_parser.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/libraries/logger.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/libraries/mac_lookup.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/libraries/port_manager.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/libraries/runtime_args.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/libraries/service_scan.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/libraries/subnet_scan.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/libraries/version_manager.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/resources/mac_addresses/convert_csv.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/resources/mac_addresses/mac_db.json +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/resources/ports/convert_csv.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/resources/ports/full.json +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/resources/ports/large.json +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/resources/ports/medium.json +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/resources/ports/small.json +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/resources/services/definitions.jsonc +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/tests/__init__.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/tests/_helpers.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/tests/test_api.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/tests/test_env.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/tests/test_library.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/ui/blueprints/__init__.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/ui/blueprints/api/__init__.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/ui/blueprints/api/port.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/ui/blueprints/api/scan.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/ui/blueprints/api/tools.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/ui/blueprints/web/__init__.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/ui/blueprints/web/routes.py +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/ui/static/css/style.css +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/ui/static/img/ico/android-chrome-192x192.png +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/ui/static/img/ico/android-chrome-512x512.png +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/ui/static/img/ico/apple-touch-icon.png +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/ui/static/img/ico/favicon-16x16.png +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/ui/static/img/ico/favicon-32x32.png +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/ui/static/img/ico/favicon.ico +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/ui/static/img/ico/site.webmanifest +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/ui/static/js/core.js +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/ui/static/js/layout-sizing.js +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/ui/static/js/main.js +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/ui/static/js/on-tab-close.js +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/ui/static/js/quietReload.js +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/ui/static/js/shutdown-server.js +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/ui/static/js/subnet-info.js +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/ui/static/js/subnet-selector.js +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/ui/static/lanscape.webmanifest +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/ui/templates/base.html +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/ui/templates/core/head.html +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/ui/templates/core/scripts.html +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/ui/templates/error.html +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/ui/templates/main.html +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/ui/templates/scan/export.html +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/ui/templates/scan/ip-table-row.html +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/ui/templates/scan/ip-table.html +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/ui/templates/scan/overview.html +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/ui/templates/scan/scan-error.html +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/ui/templates/scan.html +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape/ui/templates/shutdown.html +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape.egg-info/SOURCES.txt +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape.egg-info/dependency_links.txt +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/src/lanscape.egg-info/requires.txt +0 -0
- {lanscape-1.3.0b1 → lanscape-1.3.1a2}/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,12 +29,21 @@ def open_webapp(url: str) -> bool:
|
|
|
29
29
|
"""
|
|
30
30
|
start = time.time()
|
|
31
31
|
try:
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
+
cmd = """"$(mdfind 'kMDItemCFBundleIdentifier == "com.google.Chrome"' | head -n1)/Contents/MacOS/Google Chrome" --app=https://weatherlite.app"""
|
|
37
|
+
subprocess.run(cmd, check=True, shell=True)
|
|
36
38
|
|
|
37
|
-
|
|
39
|
+
else:
|
|
40
|
+
|
|
41
|
+
exe = get_default_browser_executable()
|
|
42
|
+
if not exe:
|
|
43
|
+
raise RuntimeError('Unable to find browser binary')
|
|
44
|
+
log.debug(f'Opening {url} with {exe}')
|
|
45
|
+
|
|
46
|
+
subprocess.run(f'{exe} --app="{url}"')
|
|
38
47
|
|
|
39
48
|
if time.time() - start < 2:
|
|
40
49
|
log.debug(f'Unable to hook into closure of UI, listening for flask shutdown')
|
|
@@ -117,8 +126,12 @@ def get_default_browser_executable() -> Optional[str]:
|
|
|
117
126
|
# strip arguments like “%u”, “--flag”, etc.
|
|
118
127
|
exec_cmd = exec_cmd.split()[0]
|
|
119
128
|
exec_cmd = exec_cmd.split("%")[0]
|
|
120
|
-
|
|
129
|
+
return exec_cmd
|
|
121
130
|
return None
|
|
122
131
|
|
|
132
|
+
elif sys.platform.startswith("darwin"):
|
|
133
|
+
# macOS will use the system 'open' command to launch the default browser
|
|
134
|
+
return "/usr/bin/open"
|
|
135
|
+
|
|
123
136
|
else:
|
|
124
137
|
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.1a2}/src/lanscape/ui/static/img/ico/android-chrome-192x192.png
RENAMED
|
File without changes
|
{lanscape-1.3.0b1 → lanscape-1.3.1a2}/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
|