lanscape 1.5.0__py3-none-any.whl → 2.0.0a2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. lanscape/__init__.py +4 -4
  2. lanscape/{libraries → core}/decorators.py +84 -51
  3. lanscape/{libraries → core}/device_alive.py +3 -3
  4. lanscape/{libraries → core}/ip_parser.py +1 -1
  5. lanscape/{libraries → core}/net_tools.py +6 -6
  6. lanscape/{libraries → core}/scan_config.py +2 -2
  7. lanscape/{libraries → core}/service_scan.py +2 -2
  8. lanscape/{libraries → core}/subnet_scan.py +5 -5
  9. lanscape/{libraries → core}/version_manager.py +2 -2
  10. lanscape/resources/ports/test_port_list_scan.json +4 -0
  11. lanscape/ui/app.py +17 -5
  12. lanscape/ui/blueprints/__init__.py +1 -1
  13. lanscape/ui/blueprints/api/port.py +1 -1
  14. lanscape/ui/blueprints/api/scan.py +1 -1
  15. lanscape/ui/blueprints/api/tools.py +4 -4
  16. lanscape/ui/blueprints/web/routes.py +1 -1
  17. lanscape/ui/main.py +4 -4
  18. lanscape/ui/shutdown_handler.py +1 -1
  19. {lanscape-1.5.0.dist-info → lanscape-2.0.0a2.dist-info}/METADATA +10 -2
  20. {lanscape-1.5.0.dist-info → lanscape-2.0.0a2.dist-info}/RECORD +32 -30
  21. lanscape-2.0.0a2.dist-info/entry_points.txt +2 -0
  22. /lanscape/{libraries → core}/__init__.py +0 -0
  23. /lanscape/{libraries → core}/app_scope.py +0 -0
  24. /lanscape/{libraries → core}/errors.py +0 -0
  25. /lanscape/{libraries → core}/logger.py +0 -0
  26. /lanscape/{libraries → core}/mac_lookup.py +0 -0
  27. /lanscape/{libraries → core}/port_manager.py +0 -0
  28. /lanscape/{libraries → core}/runtime_args.py +0 -0
  29. /lanscape/{libraries → core}/web_browser.py +0 -0
  30. {lanscape-1.5.0.dist-info → lanscape-2.0.0a2.dist-info}/WHEEL +0 -0
  31. {lanscape-1.5.0.dist-info → lanscape-2.0.0a2.dist-info}/licenses/LICENSE +0 -0
  32. {lanscape-1.5.0.dist-info → lanscape-2.0.0a2.dist-info}/top_level.txt +0 -0
lanscape/__init__.py CHANGED
@@ -1,13 +1,13 @@
1
1
  """
2
2
  Local network scanner
3
3
  """
4
- from lanscape.libraries.subnet_scan import (
4
+ from lanscape.core.subnet_scan import (
5
5
  SubnetScanner,
6
6
  ScannerResults,
7
7
  ScanManager
8
8
  )
9
9
 
10
- from lanscape.libraries.scan_config import (
10
+ from lanscape.core.scan_config import (
11
11
  ScanConfig,
12
12
  ArpConfig,
13
13
  PingConfig,
@@ -19,6 +19,6 @@ from lanscape.libraries.scan_config import (
19
19
  ScanType
20
20
  )
21
21
 
22
- from lanscape.libraries.port_manager import PortManager
22
+ from lanscape.core.port_manager import PortManager
23
23
 
24
- from lanscape.libraries import net_tools
24
+ from lanscape.core import net_tools
@@ -2,13 +2,11 @@
2
2
  """Decorators and job tracking utilities for Lanscape."""
3
3
 
4
4
  from time import time
5
- from dataclasses import dataclass, field
6
- from typing import DefaultDict
7
5
  from collections import defaultdict
8
- import inspect
9
6
  import functools
10
7
  import concurrent.futures
11
8
  import logging
9
+ import threading
12
10
  from tabulate import tabulate
13
11
 
14
12
 
@@ -39,31 +37,74 @@ def run_once(func):
39
37
  return wrapper
40
38
 
41
39
 
42
- @dataclass
43
40
  class JobStats:
44
41
  """
42
+ Thread-safe singleton for tracking job statistics across all classes.
45
43
  Tracks statistics for job execution, including running, finished, and timing data.
46
44
  """
47
- running: DefaultDict[str, int] = field(
48
- default_factory=lambda: defaultdict(int))
49
- finished: DefaultDict[str, int] = field(
50
- default_factory=lambda: defaultdict(int))
51
- timing: DefaultDict[str, float] = field(
52
- default_factory=lambda: defaultdict(float))
53
45
 
54
46
  _instance = None
47
+ _lock = threading.Lock()
48
+
49
+ def __new__(cls):
50
+ if cls._instance is None:
51
+ with cls._lock:
52
+ if cls._instance is None: # Double-checked locking
53
+ cls._instance = super().__new__(cls)
54
+ return cls._instance
55
55
 
56
56
  def __init__(self):
57
- # Only initialize once
58
- if not hasattr(self, "running"):
57
+ if not hasattr(self, '_initialized'):
58
+ self._stats_lock = threading.RLock()
59
59
  self.running = defaultdict(int)
60
60
  self.finished = defaultdict(int)
61
61
  self.timing = defaultdict(float)
62
-
63
- def __new__(cls, *args, **kwargs):
64
- if cls._instance is None:
65
- cls._instance = super(JobStats, cls).__new__(cls)
66
- return cls._instance
62
+ self._initialized = True
63
+
64
+ def start_job(self, func_name: str):
65
+ """Thread-safe increment of running counter."""
66
+ with self._stats_lock:
67
+ self.running[func_name] += 1
68
+
69
+ def finish_job(self, func_name: str, elapsed_time: float):
70
+ """Thread-safe update of job completion and timing."""
71
+ with self._stats_lock:
72
+ self.running[func_name] -= 1
73
+ self.finished[func_name] += 1
74
+
75
+ # Calculate running average
76
+ count = self.finished[func_name]
77
+ old_avg = self.timing[func_name]
78
+ new_avg = (old_avg * (count - 1) + elapsed_time) / count
79
+ self.timing[func_name] = round(new_avg, 4)
80
+
81
+ # Cleanup running if zero
82
+ if self.running[func_name] <= 0:
83
+ self.running.pop(func_name, None)
84
+
85
+ def clear_stats(self):
86
+ """Clear all statistics (useful between scans)."""
87
+ with self._stats_lock:
88
+ self.running.clear()
89
+ self.finished.clear()
90
+ self.timing.clear()
91
+
92
+ def get_stats_copy(self) -> dict:
93
+ """Get a thread-safe copy of current statistics."""
94
+ with self._stats_lock:
95
+ return {
96
+ 'running': dict(self.running),
97
+ 'finished': dict(self.finished),
98
+ 'timing': dict(self.timing)
99
+ }
100
+
101
+ @classmethod
102
+ def reset_for_testing(cls):
103
+ """Reset singleton instance for testing purposes only."""
104
+ with cls._lock:
105
+ if cls._instance:
106
+ cls._instance.clear_stats()
107
+ cls._instance = None
67
108
 
68
109
  def __str__(self):
69
110
  """Return a formatted string representation of the job statistics."""
@@ -106,48 +147,40 @@ def job_tracker(func):
106
147
  Return the function name with the class name prepended if available.
107
148
  """
108
149
  qual_parts = func.__qualname__.split(".")
109
- cls_name = qual_parts[-2] if len(qual_parts) > 1 else None
110
- cls_obj = None # resolved lazily
111
- if cls_obj is None and cls_name:
112
- mod = inspect.getmodule(func)
113
- cls_obj = getattr(mod, cls_name, None)
114
- if cls_obj and first_arg is not None:
115
- if (first_arg is cls_obj or isinstance(first_arg, cls_obj)):
116
- return f"{cls_name}.{func.__name__}"
150
+
151
+ # If function has class context (e.g., "ClassName.method_name")
152
+ if len(qual_parts) > 1:
153
+ cls_name = qual_parts[-2]
154
+
155
+ # Check if first_arg is an instance and has the expected class name
156
+ if first_arg is not None and hasattr(first_arg, '__class__'):
157
+ if first_arg.__class__.__name__ == cls_name:
158
+ return f"{cls_name}.{func.__name__}"
159
+
117
160
  return func.__name__
118
161
 
162
+ @functools.wraps(func)
119
163
  def wrapper(*args, **kwargs):
120
164
  """Wrap the function to update job statistics before and after execution."""
121
- class_instance = args[0]
122
165
  job_stats = JobStats()
123
- fxn = get_fxn_src_name(
124
- func,
125
- class_instance
126
- )
127
166
 
128
- # Increment running counter and track execution time
129
- job_stats.running[fxn] += 1
130
- start = time()
167
+ # Determine function name for tracking
168
+ if args:
169
+ fxn = get_fxn_src_name(func, args[0])
170
+ else:
171
+ fxn = func.__name__
131
172
 
132
- result = func(*args, **kwargs) # Execute the wrapped function
133
-
134
- # Update statistics after function execution
135
- elapsed = time() - start
136
- job_stats.running[fxn] -= 1
137
- job_stats.finished[fxn] += 1
138
-
139
- # Calculate the new average timing for the function
140
- job_stats.timing[fxn] = round(
141
- ((job_stats.finished[fxn] - 1) * job_stats.timing[fxn] + elapsed)
142
- / job_stats.finished[fxn],
143
- 4
144
- )
145
-
146
- # Clean up if no more running instances of this function
147
- if job_stats.running[fxn] == 0:
148
- job_stats.running.pop(fxn)
173
+ # Start job tracking
174
+ job_stats.start_job(fxn)
175
+ start = time()
149
176
 
150
- return result
177
+ try:
178
+ result = func(*args, **kwargs) # Execute the wrapped function
179
+ return result
180
+ finally:
181
+ # Always update statistics, even if function raises exception
182
+ elapsed = time() - start
183
+ job_stats.finish_job(fxn, elapsed)
151
184
 
152
185
  return wrapper
153
186
 
@@ -13,12 +13,12 @@ from scapy.sendrecv import srp
13
13
  from scapy.layers.l2 import ARP, Ether
14
14
  from icmplib import ping
15
15
 
16
- from lanscape.libraries.net_tools import Device
17
- from lanscape.libraries.scan_config import (
16
+ from lanscape.core.net_tools import Device
17
+ from lanscape.core.scan_config import (
18
18
  ScanConfig, ScanType, PingConfig,
19
19
  ArpConfig, PokeConfig, ArpCacheConfig
20
20
  )
21
- from lanscape.libraries.decorators import timeout_enforcer, job_tracker
21
+ from lanscape.core.decorators import timeout_enforcer, job_tracker
22
22
 
23
23
 
24
24
  def is_device_alive(device: Device, scan_config: ScanConfig) -> bool:
@@ -12,7 +12,7 @@ It also includes validation to prevent processing excessively large IP ranges.
12
12
  import ipaddress
13
13
  import re
14
14
 
15
- from lanscape.libraries.errors import SubnetTooLargeError
15
+ from lanscape.core.errors import SubnetTooLargeError
16
16
 
17
17
  MAX_IPS_ALLOWED = 100000
18
18
 
@@ -29,12 +29,12 @@ else:
29
29
  COMPUTED_FIELD = computed_field # pylint: disable=invalid-name
30
30
  MODEL_SERIALIZER = model_serializer # pylint: disable=invalid-name
31
31
 
32
- from lanscape.libraries.service_scan import scan_service
33
- from lanscape.libraries.mac_lookup import MacLookup, get_macs
34
- from lanscape.libraries.ip_parser import get_address_count, MAX_IPS_ALLOWED
35
- from lanscape.libraries.errors import DeviceError
36
- from lanscape.libraries.decorators import job_tracker, run_once, timeout_enforcer
37
- from lanscape.libraries.scan_config import ServiceScanConfig, PortScanConfig
32
+ from lanscape.core.service_scan import scan_service
33
+ from lanscape.core.mac_lookup import MacLookup, get_macs
34
+ from lanscape.core.ip_parser import get_address_count, MAX_IPS_ALLOWED
35
+ from lanscape.core.errors import DeviceError
36
+ from lanscape.core.decorators import job_tracker, run_once, timeout_enforcer
37
+ from lanscape.core.scan_config import ServiceScanConfig, PortScanConfig
38
38
 
39
39
  log = logging.getLogger('NetTools')
40
40
  mac_lookup = MacLookup()
@@ -11,8 +11,8 @@ from enum import Enum
11
11
 
12
12
  from pydantic import BaseModel, Field
13
13
 
14
- from lanscape.libraries.port_manager import PortManager
15
- from lanscape.libraries.ip_parser import parse_ip_input
14
+ from lanscape.core.port_manager import PortManager
15
+ from lanscape.core.ip_parser import parse_ip_input
16
16
 
17
17
 
18
18
  class PingConfig(BaseModel):
@@ -7,8 +7,8 @@ import asyncio
7
7
  import logging
8
8
  import traceback
9
9
 
10
- from lanscape.libraries.app_scope import ResourceManager
11
- from lanscape.libraries.scan_config import ServiceScanConfig, ServiceScanStrategy
10
+ from lanscape.core.app_scope import ResourceManager
11
+ from lanscape.core.scan_config import ServiceScanConfig, ServiceScanStrategy
12
12
 
13
13
  log = logging.getLogger('ServiceScan')
14
14
  SERVICES = ResourceManager('services').get_jsonc('definitions.jsonc')
@@ -20,11 +20,11 @@ from concurrent.futures import ThreadPoolExecutor, as_completed
20
20
  from tabulate import tabulate
21
21
 
22
22
  # Local imports
23
- from lanscape.libraries.scan_config import ScanConfig
24
- from lanscape.libraries.decorators import job_tracker, terminator, JobStats
25
- from lanscape.libraries.net_tools import Device
26
- from lanscape.libraries.errors import SubnetScanTerminationFailure
27
- from lanscape.libraries.device_alive import is_device_alive
23
+ from lanscape.core.scan_config import ScanConfig
24
+ from lanscape.core.decorators import job_tracker, terminator, JobStats
25
+ from lanscape.core.net_tools import Device
26
+ from lanscape.core.errors import SubnetScanTerminationFailure
27
+ from lanscape.core.device_alive import is_device_alive
28
28
 
29
29
 
30
30
  class SubnetScanner():
@@ -11,8 +11,8 @@ from random import randint
11
11
 
12
12
  import requests
13
13
 
14
- from lanscape.libraries.app_scope import is_local_run
15
- from lanscape.libraries.decorators import run_once
14
+ from lanscape.core.app_scope import is_local_run
15
+ from lanscape.core.decorators import run_once
16
16
 
17
17
  log = logging.getLogger('VersionManager')
18
18
 
@@ -0,0 +1,4 @@
1
+ {
2
+ "443": "https",
3
+ "80": "http"
4
+ }
lanscape/ui/app.py CHANGED
@@ -8,12 +8,12 @@ import logging
8
8
  from flask import Flask, render_template
9
9
  from lanscape.ui.blueprints.web import web_bp, routes # pylint: disable=unused-import
10
10
  from lanscape.ui.blueprints.api import api_bp, tools, port, scan # pylint: disable=unused-import
11
- from lanscape.libraries.runtime_args import RuntimeArgs, parse_args
12
- from lanscape.libraries.version_manager import (
11
+ from lanscape.core.runtime_args import RuntimeArgs, parse_args
12
+ from lanscape.core.version_manager import (
13
13
  is_update_available, get_installed_version, lookup_latest_version
14
14
  )
15
- from lanscape.libraries.app_scope import is_local_run
16
- from lanscape.libraries.net_tools import is_arp_supported
15
+ from lanscape.core.app_scope import is_local_run
16
+ from lanscape.core.net_tools import is_arp_supported
17
17
  from lanscape.ui.shutdown_handler import FlaskShutdownHandler
18
18
 
19
19
  app = Flask(
@@ -51,6 +51,18 @@ app.jinja_env.filters['is_substring_in_values'] = is_substring_in_values
51
51
  ################################
52
52
 
53
53
 
54
+ def get_runtime_args_safe():
55
+ """
56
+ Safely get runtime args, returning empty dict if parsing fails.
57
+ This prevents conflicts when the module is imported during testing.
58
+ """
59
+ try:
60
+ return vars(parse_args())
61
+ except SystemExit:
62
+ # This happens when pytest tries to import the module
63
+ return {}
64
+
65
+
54
66
  def set_global_safe(key: str, value):
55
67
  """ Safely set global vars without worrying about an exception """
56
68
  app_globals = app.jinja_env.globals
@@ -73,7 +85,7 @@ def set_global_safe(key: str, value):
73
85
  set_global_safe('app_version', get_installed_version)
74
86
  set_global_safe('update_available', is_update_available)
75
87
  set_global_safe('latest_version', lookup_latest_version)
76
- set_global_safe('runtime_args', vars(parse_args()))
88
+ set_global_safe('runtime_args', get_runtime_args_safe)
77
89
  set_global_safe('is_local', is_local_run)
78
90
  set_global_safe('is_arp_supported', is_arp_supported)
79
91
 
@@ -1,7 +1,7 @@
1
1
  """Source for all things blueprint related in LANscape UI"""
2
2
  import logging
3
3
 
4
- from lanscape.libraries.subnet_scan import ScanManager
4
+ from lanscape.core.subnet_scan import ScanManager
5
5
 
6
6
  # defining here so blueprints can access the same
7
7
  # manager instance
@@ -4,7 +4,7 @@ Provides CRUD operations for managing port lists used in network scans.
4
4
  """
5
5
  from flask import request, jsonify
6
6
  from lanscape.ui.blueprints.api import api_bp
7
- from lanscape.libraries.port_manager import PortManager
7
+ from lanscape.core.port_manager import PortManager
8
8
 
9
9
  # Port Manager API
10
10
  ############################################
@@ -9,7 +9,7 @@ import traceback
9
9
  from flask import request, jsonify
10
10
 
11
11
  from lanscape.ui.blueprints.api import api_bp
12
- from lanscape.libraries.subnet_scan import ScanConfig
12
+ from lanscape.core.subnet_scan import ScanConfig
13
13
  from lanscape.ui.blueprints import scan_manager
14
14
 
15
15
  # Subnet Scanner API
@@ -5,10 +5,10 @@ API endpoints for subnet testing and listing.
5
5
  import traceback
6
6
  from flask import request, jsonify
7
7
  from lanscape.ui.blueprints.api import api_bp
8
- from lanscape.libraries.net_tools import get_all_network_subnets, is_arp_supported
9
- from lanscape.libraries.ip_parser import parse_ip_input
10
- from lanscape.libraries.errors import SubnetTooLargeError
11
- from lanscape.libraries.scan_config import DEFAULT_CONFIGS
8
+ from lanscape.core.net_tools import get_all_network_subnets, is_arp_supported
9
+ from lanscape.core.ip_parser import parse_ip_input
10
+ from lanscape.core.errors import SubnetTooLargeError
11
+ from lanscape.core.scan_config import DEFAULT_CONFIGS
12
12
 
13
13
 
14
14
  @api_bp.route('/api/tools/subnet/test')
@@ -4,7 +4,7 @@ Handles UI views including the main dashboard, scan results, error display, and
4
4
  """
5
5
  from flask import render_template, request, redirect, url_for
6
6
  from lanscape.ui.blueprints.web import web_bp
7
- from lanscape.libraries.net_tools import (
7
+ from lanscape.core.net_tools import (
8
8
  get_all_network_subnets,
9
9
  smart_select_primary_subnet
10
10
  )
lanscape/ui/main.py CHANGED
@@ -9,10 +9,10 @@ import traceback
9
9
  import os
10
10
  import requests
11
11
 
12
- from lanscape.libraries.logger import configure_logging
13
- from lanscape.libraries.runtime_args import parse_args
14
- from lanscape.libraries.web_browser import open_webapp
15
- from lanscape.libraries.version_manager import get_installed_version, is_update_available
12
+ from lanscape.core.logger import configure_logging
13
+ from lanscape.core.runtime_args import parse_args
14
+ from lanscape.core.web_browser import open_webapp
15
+ from lanscape.core.version_manager import get_installed_version, is_update_available
16
16
  from lanscape.ui.app import start_webserver_daemon, start_webserver
17
17
  # do this so any logs generated on import are displayed
18
18
  args = parse_args()
@@ -5,7 +5,7 @@ import os
5
5
  from flask import request
6
6
 
7
7
 
8
- from lanscape.libraries.runtime_args import parse_args
8
+ from lanscape.core.runtime_args import parse_args
9
9
 
10
10
 
11
11
  log = logging.getLogger('shutdown_handler')
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lanscape
3
- Version: 1.5.0
3
+ Version: 2.0.0a2
4
4
  Summary: A python based local network scanner
5
5
  Author-email: Michael Dennis <michael@dipduo.com>
6
6
  License-Expression: MIT
@@ -8,8 +8,13 @@ Project-URL: Homepage, https://github.com/mdennis281/py-lanscape
8
8
  Project-URL: Issues, https://github.com/mdennis281/py-lanscape/issues
9
9
  Keywords: network,scanner,lan,local,python
10
10
  Classifier: Programming Language :: Python :: 3
11
+ Classifier: Programming Language :: Python :: 3.10
12
+ Classifier: Programming Language :: Python :: 3.11
13
+ Classifier: Programming Language :: Python :: 3.12
14
+ Classifier: Programming Language :: Python :: 3.13
15
+ Classifier: Programming Language :: Python :: 3.14
11
16
  Classifier: Operating System :: OS Independent
12
- Requires-Python: >=3.8
17
+ Requires-Python: >=3.10
13
18
  Description-Content-Type: text/markdown
14
19
  License-File: LICENSE
15
20
  Requires-Dist: Flask<5.0,>=3.0
@@ -20,6 +25,9 @@ Requires-Dist: scapy<3.0,>=2.3.2
20
25
  Requires-Dist: tabulate==0.9.0
21
26
  Requires-Dist: pydantic
22
27
  Requires-Dist: icmplib
28
+ Provides-Extra: dev
29
+ Requires-Dist: pytest>=8.0; extra == "dev"
30
+ Requires-Dist: pytest-cov>=5.0; extra == "dev"
23
31
  Dynamic: license-file
24
32
 
25
33
  # LANscape
@@ -1,21 +1,21 @@
1
- lanscape/__init__.py,sha256=D_p_XRcRDibcGQVZYLVSeWDdM__bGL3lYglq-K8njvk,443
1
+ lanscape/__init__.py,sha256=ibc4hZ6Esm7fsqocLRpc2v30BVWrKpFQ-iMJisoDtL8,423
2
2
  lanscape/__main__.py,sha256=PuY42yuCLAwHrOREJ6u2DgVyGX5hZKRQeoE9pajkNfM,170
3
- lanscape/libraries/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- lanscape/libraries/app_scope.py,sha256=qfzX8Ed4bFdxHMGjgnLlWuLZDTCBKObermz91KbGVn0,3298
5
- lanscape/libraries/decorators.py,sha256=Ve6xgLCTBSH8r_QGDNd1WUZnForvoBpkYZLENBFZkko,6141
6
- lanscape/libraries/device_alive.py,sha256=mwvHJp9rWV1_zfrE57aPKOsGp06fHdzrXOuGDWiZ2T8,6851
7
- lanscape/libraries/errors.py,sha256=QTf42UzR9Zxj1t1mdwfLvZIp0c9a5EItELOdCR7kTmE,1322
8
- lanscape/libraries/ip_parser.py,sha256=RgIEvHw_oQEcjUYOrvcpbfm4KThtH8L68WyhSOJNOfE,4201
9
- lanscape/libraries/logger.py,sha256=nzo6J8UdlMdhRkOJEDOIHKztoE3Du8PQZad7ixvNgeM,2534
10
- lanscape/libraries/mac_lookup.py,sha256=PxBSMe3wEVDtivCsh5NclSAguZz9rqdAS7QshBiuWvM,3519
11
- lanscape/libraries/net_tools.py,sha256=_fXtz9XBZPIIBs2ooWhBmEYkYlLuNx3q5BHpQiSxxxc,19706
12
- lanscape/libraries/port_manager.py,sha256=3_ROOb6JEiB0NByZVtADuGcldFkgZwn1RKtvwgs9AIk,4479
13
- lanscape/libraries/runtime_args.py,sha256=2vIqRrcWr-NHRSBlZGrxh1PdkPY0ytkPguu8KZqy2L8,2543
14
- lanscape/libraries/scan_config.py,sha256=T-xCKwSxtPXBCD1b8EjlWyqKa0UPBq9VpNBG8Sfzp8M,11124
15
- lanscape/libraries/service_scan.py,sha256=neWUu54t-TF8yk4VGb3EOMsY3ceiM8C3Km8vMdBvoMU,6958
16
- lanscape/libraries/subnet_scan.py,sha256=XUTDptKxuGf2X1O_d_6tscvL_ktY6tD-x4KNXj0Uh2s,14469
17
- lanscape/libraries/version_manager.py,sha256=tsdFx2V312mVpcRres1W1jPVFJFfpDPA4E7FNkjPY9w,2851
18
- lanscape/libraries/web_browser.py,sha256=23MuGIrBYdGhw6ejj6OWxwReeKIlWhtWukc1dKV_3_0,6736
3
+ lanscape/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
+ lanscape/core/app_scope.py,sha256=qfzX8Ed4bFdxHMGjgnLlWuLZDTCBKObermz91KbGVn0,3298
5
+ lanscape/core/decorators.py,sha256=CZbPEfnLS1OF-uejQweetadzqf0pVo736jKko4Xs-g4,7264
6
+ lanscape/core/device_alive.py,sha256=YUppwI_SwCRlOz1zVs_GiyBbFD1srIIomIpclrFETAw,6836
7
+ lanscape/core/errors.py,sha256=QTf42UzR9Zxj1t1mdwfLvZIp0c9a5EItELOdCR7kTmE,1322
8
+ lanscape/core/ip_parser.py,sha256=yCHAe7d8YIEw0yC8GEHyLTXFTD9l4pYnMWllkNsDDi4,4196
9
+ lanscape/core/logger.py,sha256=nzo6J8UdlMdhRkOJEDOIHKztoE3Du8PQZad7ixvNgeM,2534
10
+ lanscape/core/mac_lookup.py,sha256=PxBSMe3wEVDtivCsh5NclSAguZz9rqdAS7QshBiuWvM,3519
11
+ lanscape/core/net_tools.py,sha256=W-yyQ05k6BJc8VOnOi9_hpVD2G8i5HuQ_A39O8qk30Y,19676
12
+ lanscape/core/port_manager.py,sha256=3_ROOb6JEiB0NByZVtADuGcldFkgZwn1RKtvwgs9AIk,4479
13
+ lanscape/core/runtime_args.py,sha256=2vIqRrcWr-NHRSBlZGrxh1PdkPY0ytkPguu8KZqy2L8,2543
14
+ lanscape/core/scan_config.py,sha256=A2ZKXqXKW9nrP6yLb7b9b3XqSY_cQB3LZ5K0LVCSebE,11114
15
+ lanscape/core/service_scan.py,sha256=kkJUcAc326kOCVou0TPKCHlh32awioYw6jiaGHix31E,6948
16
+ lanscape/core/subnet_scan.py,sha256=IegcrpzevL2zMf1fuvCqegUGCBXtO3iAI49aCweXmvw,14444
17
+ lanscape/core/version_manager.py,sha256=eGjyKgsv31QO0W26se9pPQ1TwmEN8qn37dHULtoocqc,2841
18
+ lanscape/core/web_browser.py,sha256=23MuGIrBYdGhw6ejj6OWxwReeKIlWhtWukc1dKV_3_0,6736
19
19
  lanscape/resources/mac_addresses/convert_csv.py,sha256=hvlyLs0XmuuhBuvXBNRGP1cKJzYVRSf8VfUJ1VqROms,1189
20
20
  lanscape/resources/mac_addresses/mac_db.json,sha256=Lng2yJerwO7vjefzxzgtE203hry1lIsCadHL1A5Rptg,2136137
21
21
  lanscape/resources/ports/convert_csv.py,sha256=MMLDa-5pGMsn4A2_k45jHsRYffrRY_0Z2D1ziiikeQA,1143
@@ -23,18 +23,19 @@ lanscape/resources/ports/full.json,sha256=O8XBW52QvEVSGMQDbXe4-c4qq6XAecw6KJW4m2
23
23
  lanscape/resources/ports/large.json,sha256=CzlCcIGCBW1QAgjz4NDerCYA8HcYf6lNxehh7F928y0,138410
24
24
  lanscape/resources/ports/medium.json,sha256=T5Rc7wa47MtroHxuZrHSftOqRWbQzhZULJdE1vpsTvU,3518
25
25
  lanscape/resources/ports/small.json,sha256=F_lo_5xHwHBfOVfVgxP7ejblR3R62SNtC1Mm33brhYc,376
26
+ lanscape/resources/ports/test_port_list_scan.json,sha256=qXuWGQ_sGIRCVrhJxMeWcHKYdjaMv8O6OVWutiqCwVo,36
26
27
  lanscape/resources/services/definitions.jsonc,sha256=M9BDeK-mh25sEVj8xDEYbU2ix7EETVWhbiYmMb14Gjg,20905
27
28
  lanscape/ui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
- lanscape/ui/app.py,sha256=bL3K3NkGV1RY67kGHEQIWUl-Jm_MVN4WsIlsRQuK-SU,3760
29
- lanscape/ui/main.py,sha256=8Be2UL_ezWLpaEYYejjd8iyM2_hG1pXlkHdVjn-lySc,4196
30
- lanscape/ui/shutdown_handler.py,sha256=eJC9A0MDMgLv_KQnJlUy3Kz2xCGDAf5opVdd8nBtABE,1710
31
- lanscape/ui/blueprints/__init__.py,sha256=WLnPfPE06684wArgKDDLfsW-1hKFlLe75AR7uLAPlKc,270
29
+ lanscape/ui/app.py,sha256=rg4UGHgbVHpU2jdabSwBoSqGna7WGOunPkPc5Tvds9w,4076
30
+ lanscape/ui/main.py,sha256=UCrhHnyFBqVmHTMus33CTp3vdNn3miT1xXJatR4N7ho,4176
31
+ lanscape/ui/shutdown_handler.py,sha256=He2aYlcfHvQjpJuKbdbjmUd2RkJeCrcSSHX9HFMbBOg,1705
32
+ lanscape/ui/blueprints/__init__.py,sha256=EjPtaR5Nh17pGiOVYTJULVNaZntpFZOiYyep8rBWAiE,265
32
33
  lanscape/ui/blueprints/api/__init__.py,sha256=5Z4Y7B36O-bNFenpomfuNhPuJ9dW_MC0TPUU3pCFVfA,103
33
- lanscape/ui/blueprints/api/port.py,sha256=8FuNcjF56wmgjoCZeaYrIakTGdshAmDjUmkjXHbaZ8I,1981
34
- lanscape/ui/blueprints/api/scan.py,sha256=lbwV5AciMGP-S2J_EaXcPOHeHywImzQ_bm2ZSJg-H5U,3331
35
- lanscape/ui/blueprints/api/tools.py,sha256=IhY_ldrnVYuZKFv6gsevr9LL5gfTnmVuR95zFc05Tlo,2452
34
+ lanscape/ui/blueprints/api/port.py,sha256=KlfLrAmlTqN44I1jLVDy-mWOcor4kL-b0Cl4AcTMCys,1976
35
+ lanscape/ui/blueprints/api/scan.py,sha256=2rsW4xkI4X2Q2ocwaE469aU1VxQ3xHuBRjD9xE36WdI,3326
36
+ lanscape/ui/blueprints/api/tools.py,sha256=jr9gt0VhvBFgJ61MLgNIM6hin-MUmJLGdmStPx3e3Yc,2432
36
37
  lanscape/ui/blueprints/web/__init__.py,sha256=NvgnjP0X4LwqVhSEyh5RUzoG45N44kHK1MEFlfvBxTg,118
37
- lanscape/ui/blueprints/web/routes.py,sha256=R4ebdKDNWAwWo0JZcBVjCg5Q7VLZL0hQXV5cn834fuU,4539
38
+ lanscape/ui/blueprints/web/routes.py,sha256=f5TzfTzelJ_erslyBXTOpFr4BlIfB1Mb1ye6ioH7IL0,4534
38
39
  lanscape/ui/static/lanscape.webmanifest,sha256=07CqA-PQsO35KJD8R96sI3Pxix6UuBjijPDCuy9vM3s,446
39
40
  lanscape/ui/static/css/style.css,sha256=qXDshNhj77__06AuL-RhsxlrqZ5S0JFAmy3M1sk1Sm8,21098
40
41
  lanscape/ui/static/img/ico/android-chrome-192x192.png,sha256=JmFT6KBCCuoyxMV-mLNtF9_QJbVBvfWPUizKN700fi8,18255
@@ -68,8 +69,9 @@ lanscape/ui/templates/scan/ip-table-row.html,sha256=nO5ZMhl3Gnlc8lg5nWmE05_6_5oz
68
69
  lanscape/ui/templates/scan/ip-table.html,sha256=AT2ZvCPYdKl-XJiAkEAawPOVuQw-w0MXumGQTr3zyKM,926
69
70
  lanscape/ui/templates/scan/overview.html,sha256=xWj9jWDPg2KcPLvS8fnSins23_UXjKCdb2NJwNG2U2Q,1176
70
71
  lanscape/ui/templates/scan/scan-error.html,sha256=wmAYQ13IJHUoO8fAGNDjMvNml7tu4rsIU3Vav71ETlA,999
71
- lanscape-1.5.0.dist-info/licenses/LICENSE,sha256=VLoE0IrNTIc09dFm7hMN0qzk4T3q8V0NaPcFQqMemDs,1070
72
- lanscape-1.5.0.dist-info/METADATA,sha256=Wc0xAn1Klumi0wg0tsVyhPOpzJuTvAMd24WH-Kehl7Q,3121
73
- lanscape-1.5.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
74
- lanscape-1.5.0.dist-info/top_level.txt,sha256=E9D4sjPz_6H7c85Ycy_pOS2xuv1Wm-ilKhxEprln2ps,9
75
- lanscape-1.5.0.dist-info/RECORD,,
72
+ lanscape-2.0.0a2.dist-info/licenses/LICENSE,sha256=VLoE0IrNTIc09dFm7hMN0qzk4T3q8V0NaPcFQqMemDs,1070
73
+ lanscape-2.0.0a2.dist-info/METADATA,sha256=ArqLYoFvGuLx6lx-ODdqxcxkmW83XfqvQJGGFBmpgDY,3489
74
+ lanscape-2.0.0a2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
75
+ lanscape-2.0.0a2.dist-info/entry_points.txt,sha256=evxSxUikFa1OEd4e0Boky9sLH87HdgM0YqB_AbB2HYc,51
76
+ lanscape-2.0.0a2.dist-info/top_level.txt,sha256=E9D4sjPz_6H7c85Ycy_pOS2xuv1Wm-ilKhxEprln2ps,9
77
+ lanscape-2.0.0a2.dist-info/RECORD,,
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ lanscape = lanscape.ui.main:main
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes