ttnn-visualizer 0.42.0__py3-none-any.whl → 0.43.1__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.
- ttnn_visualizer/__init__.py +0 -1
- ttnn_visualizer/app.py +15 -4
- ttnn_visualizer/csv_queries.py +82 -48
- ttnn_visualizer/decorators.py +38 -15
- ttnn_visualizer/exceptions.py +29 -1
- ttnn_visualizer/file_uploads.py +1 -0
- ttnn_visualizer/instances.py +42 -15
- ttnn_visualizer/models.py +12 -7
- ttnn_visualizer/remote_sqlite_setup.py +37 -30
- ttnn_visualizer/requirements.txt +1 -0
- ttnn_visualizer/serializers.py +1 -0
- ttnn_visualizer/settings.py +9 -5
- ttnn_visualizer/sftp_operations.py +144 -125
- ttnn_visualizer/sockets.py +9 -3
- ttnn_visualizer/static/assets/{allPaths-wwXsGKJ2.js → allPaths-CGmhlOs-.js} +1 -1
- ttnn_visualizer/static/assets/{allPathsLoader-BK9jqlVe.js → allPathsLoader-CH9za42_.js} +2 -2
- ttnn_visualizer/static/assets/index-B-fsa5Ru.js +1 -0
- ttnn_visualizer/static/assets/{index-C1rJBrMl.css → index-C-t6jBt9.css} +1 -1
- ttnn_visualizer/static/assets/{index-Ybr1HJxx.js → index-DEb3r1jy.js} +69 -69
- ttnn_visualizer/static/assets/index-DLOviMB1.js +1 -0
- ttnn_visualizer/static/assets/{splitPathsBySizeLoader-CauQGZHk.js → splitPathsBySizeLoader-CP-kodGu.js} +1 -1
- ttnn_visualizer/static/index.html +2 -2
- ttnn_visualizer/tests/__init__.py +0 -1
- ttnn_visualizer/tests/test_queries.py +0 -1
- ttnn_visualizer/tests/test_serializers.py +2 -2
- ttnn_visualizer/utils.py +7 -3
- ttnn_visualizer/views.py +250 -82
- {ttnn_visualizer-0.42.0.dist-info → ttnn_visualizer-0.43.1.dist-info}/METADATA +5 -1
- ttnn_visualizer-0.43.1.dist-info/RECORD +45 -0
- ttnn_visualizer/static/assets/index-BKzgFDAn.js +0 -1
- ttnn_visualizer/static/assets/index-BvSuWPlB.js +0 -1
- ttnn_visualizer-0.42.0.dist-info/RECORD +0 -45
- {ttnn_visualizer-0.42.0.dist-info → ttnn_visualizer-0.43.1.dist-info}/LICENSE +0 -0
- {ttnn_visualizer-0.42.0.dist-info → ttnn_visualizer-0.43.1.dist-info}/LICENSE_understanding.txt +0 -0
- {ttnn_visualizer-0.42.0.dist-info → ttnn_visualizer-0.43.1.dist-info}/WHEEL +0 -0
- {ttnn_visualizer-0.42.0.dist-info → ttnn_visualizer-0.43.1.dist-info}/entry_points.txt +0 -0
- {ttnn_visualizer-0.42.0.dist-info → ttnn_visualizer-0.43.1.dist-info}/top_level.txt +0 -0
@@ -21,7 +21,7 @@ from ttnn_visualizer.exceptions import (
|
|
21
21
|
RemoteConnectionException,
|
22
22
|
SSHException,
|
23
23
|
AuthenticationException,
|
24
|
-
NoValidConnectionsError
|
24
|
+
NoValidConnectionsError,
|
25
25
|
)
|
26
26
|
from ttnn_visualizer.models import RemoteConnection, RemoteReportFolder
|
27
27
|
from ttnn_visualizer.sockets import (
|
@@ -38,7 +38,9 @@ TEST_PROFILER_FILE = "profile_log_device.csv"
|
|
38
38
|
REPORT_DATA_DIRECTORY = Path(__file__).parent.absolute().joinpath("data")
|
39
39
|
|
40
40
|
|
41
|
-
def handle_ssh_subprocess_error(
|
41
|
+
def handle_ssh_subprocess_error(
|
42
|
+
e: subprocess.CalledProcessError, remote_connection: RemoteConnection
|
43
|
+
):
|
42
44
|
"""
|
43
45
|
Convert subprocess SSH errors to appropriate SSH exceptions.
|
44
46
|
|
@@ -49,23 +51,29 @@ def handle_ssh_subprocess_error(e: subprocess.CalledProcessError, remote_connect
|
|
49
51
|
stderr = e.stderr.lower() if e.stderr else ""
|
50
52
|
|
51
53
|
# Check for authentication failures
|
52
|
-
if any(
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
54
|
+
if any(
|
55
|
+
auth_err in stderr
|
56
|
+
for auth_err in [
|
57
|
+
"permission denied",
|
58
|
+
"authentication failed",
|
59
|
+
"publickey",
|
60
|
+
"password",
|
61
|
+
"host key verification failed",
|
62
|
+
]
|
63
|
+
):
|
59
64
|
raise AuthenticationException(f"SSH authentication failed: {e.stderr}")
|
60
65
|
|
61
66
|
# Check for connection failures
|
62
|
-
elif any(
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
67
|
+
elif any(
|
68
|
+
conn_err in stderr
|
69
|
+
for conn_err in [
|
70
|
+
"connection refused",
|
71
|
+
"network is unreachable",
|
72
|
+
"no route to host",
|
73
|
+
"name or service not known",
|
74
|
+
"connection timed out",
|
75
|
+
]
|
76
|
+
):
|
69
77
|
raise NoValidConnectionsError(f"SSH connection failed: {e.stderr}")
|
70
78
|
|
71
79
|
# Check for general SSH protocol errors
|
@@ -115,12 +123,7 @@ def resolve_file_path(remote_connection, file_path: str) -> str:
|
|
115
123
|
ssh_cmd.append(f"ls -1 {file_path}")
|
116
124
|
|
117
125
|
try:
|
118
|
-
result = subprocess.run(
|
119
|
-
ssh_cmd,
|
120
|
-
capture_output=True,
|
121
|
-
text=True,
|
122
|
-
check=True
|
123
|
-
)
|
126
|
+
result = subprocess.run(ssh_cmd, capture_output=True, text=True, check=True)
|
124
127
|
|
125
128
|
files = result.stdout.strip().splitlines()
|
126
129
|
|
@@ -147,7 +150,6 @@ def resolve_file_path(remote_connection, file_path: str) -> str:
|
|
147
150
|
return file_path
|
148
151
|
|
149
152
|
|
150
|
-
|
151
153
|
def get_cluster_desc_path(remote_connection: RemoteConnection) -> Optional[str]:
|
152
154
|
"""
|
153
155
|
List all folders matching '/tmp/umd_*' on the remote machine, filter for those containing
|
@@ -179,11 +181,13 @@ def get_cluster_desc_path(remote_connection: RemoteConnection) -> Optional[str]:
|
|
179
181
|
ssh_cmd,
|
180
182
|
capture_output=True,
|
181
183
|
text=True,
|
182
|
-
check=False # Don't raise exception on non-zero exit (in case no folders found)
|
184
|
+
check=False, # Don't raise exception on non-zero exit (in case no folders found)
|
183
185
|
)
|
184
186
|
|
185
187
|
# Get the list of folders
|
186
|
-
folder_paths =
|
188
|
+
folder_paths = (
|
189
|
+
result.stdout.strip().splitlines() if result.stdout.strip() else []
|
190
|
+
)
|
187
191
|
|
188
192
|
if not folder_paths:
|
189
193
|
logger.info("No folders found matching the pattern '/tmp/umd_*'")
|
@@ -196,6 +200,8 @@ def get_cluster_desc_path(remote_connection: RemoteConnection) -> Optional[str]:
|
|
196
200
|
# Build SSH command to check if file exists and get its modification time
|
197
201
|
stat_cmd = [
|
198
202
|
"ssh",
|
203
|
+
"-o",
|
204
|
+
"PasswordAuthentication=no",
|
199
205
|
f"{remote_connection.username}@{remote_connection.host}",
|
200
206
|
]
|
201
207
|
|
@@ -207,10 +213,7 @@ def get_cluster_desc_path(remote_connection: RemoteConnection) -> Optional[str]:
|
|
207
213
|
|
208
214
|
try:
|
209
215
|
stat_result = subprocess.run(
|
210
|
-
stat_cmd,
|
211
|
-
capture_output=True,
|
212
|
-
text=True,
|
213
|
-
check=True
|
216
|
+
stat_cmd, capture_output=True, text=True, check=True
|
214
217
|
)
|
215
218
|
|
216
219
|
mod_time = float(stat_result.stdout.strip())
|
@@ -219,9 +222,7 @@ def get_cluster_desc_path(remote_connection: RemoteConnection) -> Optional[str]:
|
|
219
222
|
if mod_time > latest_mod_time:
|
220
223
|
latest_mod_time = mod_time
|
221
224
|
latest_yaml_path = yaml_file_path
|
222
|
-
logger.info(
|
223
|
-
f"Found newer {cluster_desc_file}: {yaml_file_path}"
|
224
|
-
)
|
225
|
+
logger.info(f"Found newer {cluster_desc_file}: {yaml_file_path}")
|
225
226
|
|
226
227
|
except subprocess.CalledProcessError as e:
|
227
228
|
# Check if it's an SSH-specific error
|
@@ -272,7 +273,11 @@ def is_excluded(file_path, exclude_patterns):
|
|
272
273
|
|
273
274
|
@remote_exception_handler
|
274
275
|
def sync_files_and_directories(
|
275
|
-
remote_connection: RemoteConnection,
|
276
|
+
remote_connection: RemoteConnection,
|
277
|
+
remote_profiler_folder: str,
|
278
|
+
destination_dir: Path,
|
279
|
+
exclude_patterns=None,
|
280
|
+
sid=None,
|
276
281
|
):
|
277
282
|
"""Download files and directories using SFTP with progress reporting."""
|
278
283
|
exclude_patterns = exclude_patterns or []
|
@@ -280,12 +285,18 @@ def sync_files_and_directories(
|
|
280
285
|
# Ensure the destination directory exists
|
281
286
|
destination_dir.mkdir(parents=True, exist_ok=True)
|
282
287
|
|
283
|
-
logger.info(
|
288
|
+
logger.info(
|
289
|
+
f"Starting SFTP sync from {remote_profiler_folder} to {destination_dir}"
|
290
|
+
)
|
284
291
|
|
285
292
|
# First, get list of all files and directories
|
286
293
|
logger.info("Getting remote file and directory lists...")
|
287
|
-
all_files = get_remote_file_list(
|
288
|
-
|
294
|
+
all_files = get_remote_file_list(
|
295
|
+
remote_connection, remote_profiler_folder, exclude_patterns
|
296
|
+
)
|
297
|
+
all_dirs = get_remote_directory_list(
|
298
|
+
remote_connection, remote_profiler_folder, exclude_patterns
|
299
|
+
)
|
289
300
|
|
290
301
|
logger.info(f"Found {len(all_files)} files and {len(all_dirs)} directories to sync")
|
291
302
|
|
@@ -357,32 +368,34 @@ def sync_files_and_directories(
|
|
357
368
|
if current_app.config["USE_WEBSOCKETS"]:
|
358
369
|
emit_file_status(final_progress, sid)
|
359
370
|
|
360
|
-
logger.info(
|
371
|
+
logger.info(
|
372
|
+
f"SFTP sync completed. Downloaded {finished_files}/{total_files} files."
|
373
|
+
)
|
361
374
|
|
362
375
|
|
363
|
-
def get_remote_file_list(
|
376
|
+
def get_remote_file_list(
|
377
|
+
remote_connection: RemoteConnection, remote_folder: str, exclude_patterns=None
|
378
|
+
) -> List[str]:
|
364
379
|
"""Get a list of all files in the remote directory recursively, applying exclusion patterns."""
|
365
380
|
exclude_patterns = exclude_patterns or []
|
366
381
|
|
367
382
|
# Build SSH command to find all files recursively
|
368
|
-
ssh_cmd = ["ssh"]
|
383
|
+
ssh_cmd = ["ssh", "-o", "PasswordAuthentication=no"]
|
369
384
|
|
370
385
|
# Handle non-standard SSH port
|
371
386
|
if remote_connection.port != 22:
|
372
387
|
ssh_cmd.extend(["-p", str(remote_connection.port)])
|
373
388
|
|
374
|
-
ssh_cmd.extend(
|
375
|
-
|
376
|
-
|
377
|
-
|
389
|
+
ssh_cmd.extend(
|
390
|
+
[
|
391
|
+
f"{remote_connection.username}@{remote_connection.host}",
|
392
|
+
f"find '{remote_folder}' -type f",
|
393
|
+
]
|
394
|
+
)
|
378
395
|
|
379
396
|
try:
|
380
397
|
result = subprocess.run(
|
381
|
-
ssh_cmd,
|
382
|
-
capture_output=True,
|
383
|
-
text=True,
|
384
|
-
check=True,
|
385
|
-
timeout=60
|
398
|
+
ssh_cmd, capture_output=True, text=True, check=True, timeout=60
|
386
399
|
)
|
387
400
|
|
388
401
|
all_files = result.stdout.strip().splitlines()
|
@@ -410,29 +423,29 @@ def get_remote_file_list(remote_connection: RemoteConnection, remote_folder: str
|
|
410
423
|
return []
|
411
424
|
|
412
425
|
|
413
|
-
def get_remote_directory_list(
|
426
|
+
def get_remote_directory_list(
|
427
|
+
remote_connection: RemoteConnection, remote_folder: str, exclude_patterns=None
|
428
|
+
) -> List[str]:
|
414
429
|
"""Get a list of all directories in the remote directory recursively, applying exclusion patterns."""
|
415
430
|
exclude_patterns = exclude_patterns or []
|
416
431
|
|
417
432
|
# Build SSH command to find all directories recursively
|
418
|
-
ssh_cmd = ["ssh"]
|
433
|
+
ssh_cmd = ["ssh", "-o", "PasswordAuthentication=no"]
|
419
434
|
|
420
435
|
# Handle non-standard SSH port
|
421
436
|
if remote_connection.port != 22:
|
422
437
|
ssh_cmd.extend(["-p", str(remote_connection.port)])
|
423
438
|
|
424
|
-
ssh_cmd.extend(
|
425
|
-
|
426
|
-
|
427
|
-
|
439
|
+
ssh_cmd.extend(
|
440
|
+
[
|
441
|
+
f"{remote_connection.username}@{remote_connection.host}",
|
442
|
+
f"find '{remote_folder}' -type d",
|
443
|
+
]
|
444
|
+
)
|
428
445
|
|
429
446
|
try:
|
430
447
|
result = subprocess.run(
|
431
|
-
ssh_cmd,
|
432
|
-
capture_output=True,
|
433
|
-
text=True,
|
434
|
-
check=True,
|
435
|
-
timeout=60
|
448
|
+
ssh_cmd, capture_output=True, text=True, check=True, timeout=60
|
436
449
|
)
|
437
450
|
|
438
451
|
all_dirs = result.stdout.strip().splitlines()
|
@@ -460,23 +473,28 @@ def get_remote_directory_list(remote_connection: RemoteConnection, remote_folder
|
|
460
473
|
return []
|
461
474
|
|
462
475
|
|
463
|
-
def download_single_file_sftp(
|
476
|
+
def download_single_file_sftp(
|
477
|
+
remote_connection: RemoteConnection, remote_file: str, local_file: Path
|
478
|
+
):
|
464
479
|
"""Download a single file using SFTP."""
|
465
480
|
# Ensure local directory exists
|
466
481
|
local_file.parent.mkdir(parents=True, exist_ok=True)
|
467
482
|
|
468
483
|
# Build SFTP command
|
469
|
-
sftp_cmd = ["sftp"]
|
484
|
+
sftp_cmd = ["sftp", "-o", "PasswordAuthentication=no"]
|
470
485
|
|
471
486
|
# Handle non-standard SSH port
|
472
487
|
if remote_connection.port != 22:
|
473
488
|
sftp_cmd.extend(["-P", str(remote_connection.port)])
|
474
489
|
|
475
490
|
# Add batch mode and other options
|
476
|
-
sftp_cmd.extend(
|
477
|
-
|
478
|
-
|
479
|
-
|
491
|
+
sftp_cmd.extend(
|
492
|
+
[
|
493
|
+
"-b",
|
494
|
+
"-", # Read commands from stdin
|
495
|
+
f"{remote_connection.username}@{remote_connection.host}",
|
496
|
+
]
|
497
|
+
)
|
480
498
|
|
481
499
|
# SFTP commands to execute
|
482
500
|
sftp_commands = f"get '{remote_file}' '{local_file}'\nquit\n"
|
@@ -488,7 +506,7 @@ def download_single_file_sftp(remote_connection: RemoteConnection, remote_file:
|
|
488
506
|
capture_output=True,
|
489
507
|
text=True,
|
490
508
|
check=True,
|
491
|
-
timeout=300 # 5 minute timeout per file
|
509
|
+
timeout=300, # 5 minute timeout per file
|
492
510
|
)
|
493
511
|
|
494
512
|
logger.debug(f"Downloaded: {remote_file} -> {local_file}")
|
@@ -515,6 +533,8 @@ def get_remote_profiler_folder_from_config_path(
|
|
515
533
|
# Build SSH command to get file modification time
|
516
534
|
stat_cmd = [
|
517
535
|
"ssh",
|
536
|
+
"-o",
|
537
|
+
"PasswordAuthentication=no",
|
518
538
|
f"{remote_connection.username}@{remote_connection.host}",
|
519
539
|
]
|
520
540
|
|
@@ -526,10 +546,7 @@ def get_remote_profiler_folder_from_config_path(
|
|
526
546
|
stat_cmd.append(f"stat -c %Y '{config_path}' 2>/dev/null")
|
527
547
|
|
528
548
|
stat_result = subprocess.run(
|
529
|
-
stat_cmd,
|
530
|
-
capture_output=True,
|
531
|
-
text=True,
|
532
|
-
check=True
|
549
|
+
stat_cmd, capture_output=True, text=True, check=True
|
533
550
|
)
|
534
551
|
|
535
552
|
last_modified = int(float(stat_result.stdout.strip()))
|
@@ -537,6 +554,8 @@ def get_remote_profiler_folder_from_config_path(
|
|
537
554
|
# Build SSH command to read file content
|
538
555
|
cat_cmd = [
|
539
556
|
"ssh",
|
557
|
+
"-o",
|
558
|
+
"PasswordAuthentication=no",
|
540
559
|
f"{remote_connection.username}@{remote_connection.host}",
|
541
560
|
]
|
542
561
|
|
@@ -546,12 +565,7 @@ def get_remote_profiler_folder_from_config_path(
|
|
546
565
|
# Read file content using cat command
|
547
566
|
cat_cmd.append(f"cat '{config_path}'")
|
548
567
|
|
549
|
-
cat_result = subprocess.run(
|
550
|
-
cat_cmd,
|
551
|
-
capture_output=True,
|
552
|
-
text=True,
|
553
|
-
check=True
|
554
|
-
)
|
568
|
+
cat_result = subprocess.run(cat_cmd, capture_output=True, text=True, check=True)
|
555
569
|
|
556
570
|
# Parse JSON data
|
557
571
|
data = json.loads(cat_result.stdout)
|
@@ -603,10 +617,15 @@ def get_remote_performance_folder(
|
|
603
617
|
|
604
618
|
# Get modification time using subprocess SSH command
|
605
619
|
try:
|
606
|
-
ssh_command = ["ssh"]
|
620
|
+
ssh_command = ["ssh", "-o", "PasswordAuthentication=no"]
|
607
621
|
if remote_connection.port != 22:
|
608
622
|
ssh_command.extend(["-p", str(remote_connection.port)])
|
609
|
-
ssh_command.extend(
|
623
|
+
ssh_command.extend(
|
624
|
+
[
|
625
|
+
f"{remote_connection.username}@{remote_connection.host}",
|
626
|
+
f"stat -c %Y '{profile_folder}'",
|
627
|
+
]
|
628
|
+
)
|
610
629
|
|
611
630
|
result = subprocess.run(ssh_command, capture_output=True, text=True, timeout=30)
|
612
631
|
|
@@ -615,11 +634,20 @@ def get_remote_performance_folder(
|
|
615
634
|
else:
|
616
635
|
# If stat fails, handle SSH errors
|
617
636
|
if result.returncode == 255:
|
618
|
-
handle_ssh_subprocess_error(
|
619
|
-
|
637
|
+
handle_ssh_subprocess_error(
|
638
|
+
subprocess.CalledProcessError(
|
639
|
+
result.returncode, ssh_command, result.stdout, result.stderr
|
640
|
+
),
|
641
|
+
remote_connection,
|
642
|
+
)
|
643
|
+
logger.warning(
|
644
|
+
f"Could not get modification time for {profile_folder}, using current time"
|
645
|
+
)
|
620
646
|
last_modified = int(time.time())
|
621
647
|
except (subprocess.TimeoutExpired, subprocess.CalledProcessError, ValueError) as e:
|
622
|
-
logger.warning(
|
648
|
+
logger.warning(
|
649
|
+
f"Error getting modification time for {profile_folder}: {e}, using current time"
|
650
|
+
)
|
623
651
|
last_modified = int(time.time())
|
624
652
|
|
625
653
|
return RemoteReportFolder(
|
@@ -643,24 +671,18 @@ def read_remote_file(
|
|
643
671
|
logger.info(f"Reading remote file {path}")
|
644
672
|
|
645
673
|
# Build SSH command to read the file
|
646
|
-
ssh_cmd = ["ssh"]
|
674
|
+
ssh_cmd = ["ssh", "-o", "PasswordAuthentication=no"]
|
647
675
|
|
648
676
|
# Handle non-standard SSH port
|
649
677
|
if remote_connection.port != 22:
|
650
678
|
ssh_cmd.extend(["-p", str(remote_connection.port)])
|
651
679
|
|
652
|
-
ssh_cmd.extend(
|
653
|
-
f"{remote_connection.username}@{remote_connection.host}",
|
654
|
-
|
655
|
-
])
|
680
|
+
ssh_cmd.extend(
|
681
|
+
[f"{remote_connection.username}@{remote_connection.host}", f"cat '{path}'"]
|
682
|
+
)
|
656
683
|
|
657
684
|
try:
|
658
|
-
result = subprocess.run(
|
659
|
-
ssh_cmd,
|
660
|
-
capture_output=True,
|
661
|
-
check=True,
|
662
|
-
timeout=30
|
663
|
-
)
|
685
|
+
result = subprocess.run(ssh_cmd, capture_output=True, check=True, timeout=30)
|
664
686
|
return result.stdout
|
665
687
|
except subprocess.CalledProcessError as e:
|
666
688
|
if e.returncode == 255: # SSH protocol errors
|
@@ -697,24 +719,18 @@ def check_remote_path_exists(remote_connection: RemoteConnection, path_key: str)
|
|
697
719
|
path = getattr(remote_connection, path_key)
|
698
720
|
|
699
721
|
# Build SSH command to test if path exists
|
700
|
-
ssh_cmd = ["ssh"]
|
722
|
+
ssh_cmd = ["ssh", "-o", "PasswordAuthentication=no"]
|
701
723
|
|
702
724
|
# Handle non-standard SSH port
|
703
725
|
if remote_connection.port != 22:
|
704
726
|
ssh_cmd.extend(["-p", str(remote_connection.port)])
|
705
727
|
|
706
|
-
ssh_cmd.extend(
|
707
|
-
f"{remote_connection.username}@{remote_connection.host}",
|
708
|
-
|
709
|
-
])
|
728
|
+
ssh_cmd.extend(
|
729
|
+
[f"{remote_connection.username}@{remote_connection.host}", f"test -d '{path}'"]
|
730
|
+
)
|
710
731
|
|
711
732
|
try:
|
712
|
-
result = subprocess.run(
|
713
|
-
ssh_cmd,
|
714
|
-
capture_output=True,
|
715
|
-
check=True,
|
716
|
-
timeout=10
|
717
|
-
)
|
733
|
+
result = subprocess.run(ssh_cmd, capture_output=True, check=True, timeout=10)
|
718
734
|
# If command succeeds, directory exists
|
719
735
|
return True
|
720
736
|
except subprocess.CalledProcessError as e:
|
@@ -735,7 +751,7 @@ def check_remote_path_exists(remote_connection: RemoteConnection, path_key: str)
|
|
735
751
|
logger.error(f"Timeout checking remote path: {path}")
|
736
752
|
raise RemoteConnectionException(
|
737
753
|
message=f"Timeout checking remote path: {path}",
|
738
|
-
status=ConnectionTestStates.FAILED
|
754
|
+
status=ConnectionTestStates.FAILED,
|
739
755
|
)
|
740
756
|
|
741
757
|
|
@@ -746,24 +762,22 @@ def find_folders_by_files(
|
|
746
762
|
matched_folders: List[str] = []
|
747
763
|
|
748
764
|
# Build SSH command to find directories in root_folder
|
749
|
-
ssh_cmd = ["ssh"]
|
765
|
+
ssh_cmd = ["ssh", "-o", "PasswordAuthentication=no"]
|
750
766
|
|
751
767
|
# Handle non-standard SSH port
|
752
768
|
if remote_connection.port != 22:
|
753
769
|
ssh_cmd.extend(["-p", str(remote_connection.port)])
|
754
770
|
|
755
|
-
ssh_cmd.extend(
|
756
|
-
|
757
|
-
|
758
|
-
|
771
|
+
ssh_cmd.extend(
|
772
|
+
[
|
773
|
+
f"{remote_connection.username}@{remote_connection.host}",
|
774
|
+
f"find '{root_folder}' -maxdepth 1 -type d -not -path '{root_folder}'",
|
775
|
+
]
|
776
|
+
)
|
759
777
|
|
760
778
|
try:
|
761
779
|
result = subprocess.run(
|
762
|
-
ssh_cmd,
|
763
|
-
capture_output=True,
|
764
|
-
text=True,
|
765
|
-
check=True,
|
766
|
-
timeout=30
|
780
|
+
ssh_cmd, capture_output=True, text=True, check=True, timeout=30
|
767
781
|
)
|
768
782
|
|
769
783
|
directories = result.stdout.strip().splitlines()
|
@@ -780,21 +794,20 @@ def find_folders_by_files(
|
|
780
794
|
file_checks.append(f"test -f '{directory}/{file_name}'")
|
781
795
|
|
782
796
|
# Use OR logic to check if any of the files exist
|
783
|
-
check_cmd = ["ssh"]
|
797
|
+
check_cmd = ["ssh", "-o", "PasswordAuthentication=no"]
|
784
798
|
if remote_connection.port != 22:
|
785
799
|
check_cmd.extend(["-p", str(remote_connection.port)])
|
786
800
|
|
787
|
-
check_cmd.extend(
|
788
|
-
|
789
|
-
|
790
|
-
|
801
|
+
check_cmd.extend(
|
802
|
+
[
|
803
|
+
f"{remote_connection.username}@{remote_connection.host}",
|
804
|
+
f"({' || '.join(file_checks)})",
|
805
|
+
]
|
806
|
+
)
|
791
807
|
|
792
808
|
try:
|
793
809
|
check_result = subprocess.run(
|
794
|
-
check_cmd,
|
795
|
-
capture_output=True,
|
796
|
-
check=True,
|
797
|
-
timeout=10
|
810
|
+
check_cmd, capture_output=True, check=True, timeout=10
|
798
811
|
)
|
799
812
|
# If command succeeds, at least one file exists
|
800
813
|
matched_folders.append(directory)
|
@@ -839,7 +852,9 @@ def get_remote_performance_folders(
|
|
839
852
|
raise NoProjectsException(status=ConnectionTestStates.FAILED, message=error)
|
840
853
|
remote_folder_data = []
|
841
854
|
for path in performance_paths:
|
842
|
-
remote_folder_data.append(
|
855
|
+
remote_folder_data.append(
|
856
|
+
get_remote_performance_folder(remote_connection, path)
|
857
|
+
)
|
843
858
|
return remote_folder_data
|
844
859
|
|
845
860
|
|
@@ -875,7 +890,11 @@ def sync_remote_profiler_folders(
|
|
875
890
|
"""Main function to sync test folders, handles both compressed and individual syncs."""
|
876
891
|
profiler_folder = Path(remote_folder_path).name
|
877
892
|
destination_dir = Path(
|
878
|
-
REPORT_DATA_DIRECTORY,
|
893
|
+
REPORT_DATA_DIRECTORY,
|
894
|
+
path_prefix,
|
895
|
+
remote_connection.host,
|
896
|
+
current_app.config["PROFILER_DIRECTORY_NAME"],
|
897
|
+
profiler_folder,
|
879
898
|
)
|
880
899
|
destination_dir.mkdir(parents=True, exist_ok=True)
|
881
900
|
|
ttnn_visualizer/sockets.py
CHANGED
@@ -90,11 +90,15 @@ def register_handlers(socketio_instance):
|
|
90
90
|
sid = getattr(request, "sid", "")
|
91
91
|
|
92
92
|
instance_id = request.args.get("instanceId")
|
93
|
-
print(
|
93
|
+
print(
|
94
|
+
f"Received instanceId: {instance_id}, socket ID: {sid}"
|
95
|
+
) # Log for debugging
|
94
96
|
|
95
97
|
if instance_id:
|
96
98
|
join_room(instance_id) # Join the room identified by the instanceId
|
97
|
-
tab_clients[instance_id] =
|
99
|
+
tab_clients[instance_id] = (
|
100
|
+
sid # Store the socket ID associated with this instanceId
|
101
|
+
)
|
98
102
|
print(f"Joined room: {instance_id}")
|
99
103
|
else:
|
100
104
|
print("No instanceId provided, disconnecting client.")
|
@@ -115,4 +119,6 @@ def register_handlers(socketio_instance):
|
|
115
119
|
if instance_id:
|
116
120
|
leave_room(instance_id)
|
117
121
|
del tab_clients[instance_id]
|
118
|
-
print(
|
122
|
+
print(
|
123
|
+
f"Client disconnected from instanceId: {instance_id}, Socket ID: {sid}"
|
124
|
+
)
|
@@ -1 +1 @@
|
|
1
|
-
import{I as n}from"./index-
|
1
|
+
import{I as n}from"./index-DLOviMB1.js";import{I as e}from"./index-B-fsa5Ru.js";import{p as r,I as s}from"./index-DEb3r1jy.js";function I(o,t){var a=r(o);return t===s.STANDARD?n[a]:e[a]}function p(o){return r(o)}export{n as IconSvgPaths16,e as IconSvgPaths20,I as getIconPaths,p as iconNameToPathsRecordKey};
|
@@ -1,2 +1,2 @@
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/allPaths-
|
2
|
-
import{_ as o,a as n,b as i}from"./index-
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/allPaths-CGmhlOs-.js","assets/index-DLOviMB1.js","assets/index-B-fsa5Ru.js","assets/index-DEb3r1jy.js","assets/index-C-t6jBt9.css"])))=>i.map(i=>d[i]);
|
2
|
+
import{_ as o,a as n,b as i}from"./index-DEb3r1jy.js";var _=function(e,a){return o(void 0,void 0,void 0,function(){var t;return n(this,function(r){switch(r.label){case 0:return[4,i(()=>import("./allPaths-CGmhlOs-.js"),__vite__mapDeps([0,1,2,3,4]))];case 1:return t=r.sent().getIconPaths,[2,t(e,a)]}})})};export{_ as allPathsLoader};
|