From c19e8138df3839af9ad37f85df227edf53022f9d Mon Sep 17 00:00:00 2001 From: david rice Date: Tue, 7 Apr 2026 15:58:01 +0100 Subject: [PATCH] File transfer complete --- __pycache__/ai_mgmt.cpython-312.pyc | Bin 2159 -> 4313 bytes ai_mgmt.py | 83 +++++++++++++++++++++------- mipi_test.py | 6 +- 3 files changed, 65 insertions(+), 24 deletions(-) diff --git a/__pycache__/ai_mgmt.cpython-312.pyc b/__pycache__/ai_mgmt.cpython-312.pyc index 2cd571fe2e3eef88ee30580cd6f5d12e83010c4d..6f222b0fafa9657a1bb9357028869a11b0970c10 100644 GIT binary patch literal 4313 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 literal 2159 zcmah~-A@!(6u)=pV`sm20TGbO6s2V&3}DsRhFVZiX%q?TN8H*>*PROt&hFBg0lFKs z`(WZ?Fk)H*i80wewGDmnALxV6eOUy;GPMa!nK zxp#i@c$^5vrND~%2ZzvabWWw*snDsq<;){ZUtlykm4XLQ0GH#0T+!h0;!WQ zge4r|7uX^<>>(b#sbJ><>Ls4CK3KaSGUXjc#M6U5^&k}X6|_CX_W(V#?Z{_*EK1^n z%)7%);v^3G|D?hCgV^$f&K^IJh{s9PR1@)(yW{4yhUu$0Fv4A)OD}EZ4X}S+c1rMfdM#t12p^mABlM%2` zL^B~qi}28;IYNr@r090BAt_qmO87QwfP0^vqv^aVFXcVWPoZ*Quj45U?V}@f-8N+# z-3F_q3X_5-kd9|6rVupVf9OENG1nQe--dX{UUvW#_NiAIcIN1tBfY5!$^eaS!@uJh z+M|@6foHBxb8iCpwYboMNfc!JgSIU!rEHS4h1*gr#U;pFf~Feg03c%t6r^}0Ml6?V z^b`O|=t+yy5|c!?1QJ(_Nfq??$k-Tcf`Y|TL@hgso4QI2i=&IAS~m<4J6HxM7-^+I-ttuiD9-y zR5>;rGo`VlUJItFdU|wu+qu-KC880{I3`i=dqBhZ63ELm%2!m+wccyZa#?e!q9tR` z@2Y=}?2eX9Z{AmR_r~;%?4CtmOWt3T-_tPvP8MgIzLma_a&LF!Y7S=lKxfq_KJkfb z{;Ju__kH<5_1xZjdshQZi-D%4z`Lt~_QgQ^qw1Bw(Y(KQ)h{mk#cb`0|G+aJ#Mp!* zAf4X9Ag|MB!*ZQC(+97L+~0k+*K&n=2QT&x7B}`%uUp)huEtG^i)smj1nm}Y5PgE^ zdJVM~;PU7NoP@E6VN51;MX#noc2hztW6)6V?%dvx{zY*3A|4hOI^8|k zYY7)%UjRxN=njQ0og3`2T*Cw!(=aIndOh|17A3T#G#AR2WxauJxnkEdaIY*p^gYsP zR~8W25;|iEWn3f2^!I>AFSPLp$OeNk{uz0GK?l~o^=Uru-JRz0UVmCB5iv8g>J=Bg z;*z&9?aF(r(ymRu0q@%A!H9KdQcsxLHP(^opFc9+oNdfr$ezj_IF@sMw9Iy`x$EYS zWDkGW{OI(O`@?kauXgvE;F;y`8S{s~O3iB7)||I}S?GWUe~z%DKGVJC4$K~({d_h$ c+kEHTGX{9ic;xWry!%#!{Tr2ttt({oFHfrp1^@s6 diff --git a/ai_mgmt.py b/ai_mgmt.py index cae6ba9..11ad000 100644 --- a/ai_mgmt.py +++ b/ai_mgmt.py @@ -1,32 +1,36 @@ import socket +from pathlib import Path from smb.SMBConnection import SMBConnection SERVER = "192.168.45.4" SHARE = "AGILENT" -USERNAME = "" # leave empty for guest/anonymous +USERNAME = "" PASSWORD = "" CLIENT_NAME = socket.gethostname() -SERVER_NAME = SERVER # use IP for UNC path in TREE_CONNECT +SERVER_NAME = SERVER + +DATA_DIR = Path(__file__).parent / "data" -def list_csv_files(server, share, username="", password=""): - """Search an SMB1 share recursively and return all .csv file paths.""" +def _connect(): conn = SMBConnection( - username, password, + USERNAME, PASSWORD, CLIENT_NAME, SERVER_NAME, use_ntlm_v2=True, - is_direct_tcp=True # use port 445 directly + is_direct_tcp=True ) + if not conn.connect(SERVER, 445): + raise ConnectionError("Failed to connect to SMB share.") + return conn - if not conn.connect(server, 445): - print("Failed to connect to the share.") - return [] +def list_csv_files(server=SERVER, share=SHARE, username=USERNAME, password=PASSWORD): + """Return a list of all .csv paths found on the share (recursive).""" + conn = _connect() csv_files = [] def walk(path): - entries = conn.listPath(share, path) - for entry in entries: + for entry in conn.listPath(share, path): if entry.filename in (".", ".."): continue full_path = f"{path}/{entry.filename}" @@ -43,13 +47,52 @@ def list_csv_files(server, share, username="", password=""): return csv_files -if __name__ == "__main__": - print(f"Searching \\\\{SERVER}\\{SHARE} for CSV files...\n") - files = list_csv_files(SERVER, SHARE, USERNAME, PASSWORD) +def transfer_csv_files(): + """ + Copy all .csv files from the scope share to DATA_DIR, + then delete them from the scope. + Returns (copied, failed) counts. + """ + DATA_DIR.mkdir(exist_ok=True) + conn = _connect() + copied = 0 + failed = 0 - if files: - print(f"Found {len(files)} CSV file(s):") - for f in files: - print(f" {f}") - else: - print("No CSV files found.") + try: + csv_files = [] + + def walk(path): + for entry in conn.listPath(SHARE, path): + if entry.filename in (".", ".."): + continue + full_path = f"{path}/{entry.filename}" + if entry.isDirectory: + walk(full_path) + elif entry.filename.lower().endswith(".csv"): + csv_files.append(full_path) + + walk("/") + + for remote_path in csv_files: + filename = Path(remote_path).name + local_path = DATA_DIR / filename + try: + with open(local_path, "wb") as f: + conn.retrieveFile(SHARE, remote_path, f) + conn.deleteFiles(SHARE, remote_path) + print(f" TRANSFERRED: {filename}") + copied += 1 + except Exception as e: + print(f" FAILED: {filename} — {e}") + failed += 1 + + finally: + conn.close() + + return copied, failed + + +if __name__ == "__main__": + print(f"Transferring CSV files from \\\\{SERVER}\\{SHARE} to {DATA_DIR}...\n") + copied, failed = transfer_csv_files() + print(f"\nDone. {copied} transferred, {failed} failed.") diff --git a/mipi_test.py b/mipi_test.py index 5cd3f13..86998b4 100644 --- a/mipi_test.py +++ b/mipi_test.py @@ -265,10 +265,8 @@ def mgmt_worker(): print("[MGMT] PAUSING TEST — RUNNING MANAGEMENT TASKS...") resume_event.clear() try: - files = ai_mgmt.list_csv_files(ai_mgmt.SERVER, ai_mgmt.SHARE) - print(f"[MGMT] FOUND {len(files)} CSV FILE(S) ON SCOPE DRIVE.") - for f in files: - print(f" {f}") + copied, failed = ai_mgmt.transfer_csv_files() + print(f"[MGMT] TRANSFERRED {copied} FILE(S) TO DATA FOLDER. {failed} FAILED.") except Exception as e: print(f"[MGMT] ERROR: {e}") finally: