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.
- lanscape/__init__.py +4 -4
- lanscape/{libraries → core}/decorators.py +84 -51
- lanscape/{libraries → core}/device_alive.py +3 -3
- lanscape/{libraries → core}/ip_parser.py +1 -1
- lanscape/{libraries → core}/net_tools.py +6 -6
- lanscape/{libraries → core}/scan_config.py +2 -2
- lanscape/{libraries → core}/service_scan.py +2 -2
- lanscape/{libraries → core}/subnet_scan.py +5 -5
- lanscape/{libraries → core}/version_manager.py +2 -2
- lanscape/resources/ports/test_port_list_scan.json +4 -0
- lanscape/ui/app.py +17 -5
- lanscape/ui/blueprints/__init__.py +1 -1
- lanscape/ui/blueprints/api/port.py +1 -1
- lanscape/ui/blueprints/api/scan.py +1 -1
- lanscape/ui/blueprints/api/tools.py +4 -4
- lanscape/ui/blueprints/web/routes.py +1 -1
- lanscape/ui/main.py +4 -4
- lanscape/ui/shutdown_handler.py +1 -1
- {lanscape-1.5.0.dist-info → lanscape-2.0.0a2.dist-info}/METADATA +10 -2
- {lanscape-1.5.0.dist-info → lanscape-2.0.0a2.dist-info}/RECORD +32 -30
- lanscape-2.0.0a2.dist-info/entry_points.txt +2 -0
- /lanscape/{libraries → core}/__init__.py +0 -0
- /lanscape/{libraries → core}/app_scope.py +0 -0
- /lanscape/{libraries → core}/errors.py +0 -0
- /lanscape/{libraries → core}/logger.py +0 -0
- /lanscape/{libraries → core}/mac_lookup.py +0 -0
- /lanscape/{libraries → core}/port_manager.py +0 -0
- /lanscape/{libraries → core}/runtime_args.py +0 -0
- /lanscape/{libraries → core}/web_browser.py +0 -0
- {lanscape-1.5.0.dist-info → lanscape-2.0.0a2.dist-info}/WHEEL +0 -0
- {lanscape-1.5.0.dist-info → lanscape-2.0.0a2.dist-info}/licenses/LICENSE +0 -0
- {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.
|
|
4
|
+
from lanscape.core.subnet_scan import (
|
|
5
5
|
SubnetScanner,
|
|
6
6
|
ScannerResults,
|
|
7
7
|
ScanManager
|
|
8
8
|
)
|
|
9
9
|
|
|
10
|
-
from lanscape.
|
|
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.
|
|
22
|
+
from lanscape.core.port_manager import PortManager
|
|
23
23
|
|
|
24
|
-
from lanscape.
|
|
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
|
-
|
|
58
|
-
|
|
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
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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
|
-
|
|
110
|
-
|
|
111
|
-
if
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
if
|
|
116
|
-
|
|
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
|
-
#
|
|
129
|
-
|
|
130
|
-
|
|
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
|
-
|
|
133
|
-
|
|
134
|
-
|
|
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
|
-
|
|
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.
|
|
17
|
-
from lanscape.
|
|
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.
|
|
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.
|
|
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.
|
|
33
|
-
from lanscape.
|
|
34
|
-
from lanscape.
|
|
35
|
-
from lanscape.
|
|
36
|
-
from lanscape.
|
|
37
|
-
from lanscape.
|
|
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.
|
|
15
|
-
from lanscape.
|
|
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.
|
|
11
|
-
from lanscape.
|
|
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.
|
|
24
|
-
from lanscape.
|
|
25
|
-
from lanscape.
|
|
26
|
-
from lanscape.
|
|
27
|
-
from lanscape.
|
|
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.
|
|
15
|
-
from lanscape.
|
|
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
|
|
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.
|
|
12
|
-
from lanscape.
|
|
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.
|
|
16
|
-
from lanscape.
|
|
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',
|
|
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
|
|
|
@@ -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.
|
|
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.
|
|
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.
|
|
9
|
-
from lanscape.
|
|
10
|
-
from lanscape.
|
|
11
|
-
from lanscape.
|
|
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.
|
|
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.
|
|
13
|
-
from lanscape.
|
|
14
|
-
from lanscape.
|
|
15
|
-
from lanscape.
|
|
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()
|
lanscape/ui/shutdown_handler.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: lanscape
|
|
3
|
-
Version:
|
|
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.
|
|
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=
|
|
1
|
+
lanscape/__init__.py,sha256=ibc4hZ6Esm7fsqocLRpc2v30BVWrKpFQ-iMJisoDtL8,423
|
|
2
2
|
lanscape/__main__.py,sha256=PuY42yuCLAwHrOREJ6u2DgVyGX5hZKRQeoE9pajkNfM,170
|
|
3
|
-
lanscape/
|
|
4
|
-
lanscape/
|
|
5
|
-
lanscape/
|
|
6
|
-
lanscape/
|
|
7
|
-
lanscape/
|
|
8
|
-
lanscape/
|
|
9
|
-
lanscape/
|
|
10
|
-
lanscape/
|
|
11
|
-
lanscape/
|
|
12
|
-
lanscape/
|
|
13
|
-
lanscape/
|
|
14
|
-
lanscape/
|
|
15
|
-
lanscape/
|
|
16
|
-
lanscape/
|
|
17
|
-
lanscape/
|
|
18
|
-
lanscape/
|
|
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=
|
|
29
|
-
lanscape/ui/main.py,sha256=
|
|
30
|
-
lanscape/ui/shutdown_handler.py,sha256=
|
|
31
|
-
lanscape/ui/blueprints/__init__.py,sha256=
|
|
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=
|
|
34
|
-
lanscape/ui/blueprints/api/scan.py,sha256=
|
|
35
|
-
lanscape/ui/blueprints/api/tools.py,sha256=
|
|
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=
|
|
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-
|
|
72
|
-
lanscape-
|
|
73
|
-
lanscape-
|
|
74
|
-
lanscape-
|
|
75
|
-
lanscape-
|
|
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,,
|
|
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
|