import paramiko, json c = paramiko.SSHClient() c.set_missing_host_key_policy(paramiko.AutoAddPolicy()) c.connect('140.44.4.71', username='root', key_filename=r'C:\Users\Snarf\.ssh\id_ed25519_snarfnet', timeout=10) def query_nas(ip, name): print(f"\n=== Querying {name} ({ip}) from Swm01 ===") for user in ['snarf', 'admin']: login_cmd = f"curl -k -s 'https://{ip}:5001/webapi/auth.cgi?api=SYNO.API.Auth&version=3&method=login&account={user}&passwd=Katzir476!&session=Storage&format=sid'" _, o, _ = c.exec_command(login_cmd) resp_str = o.read().decode().strip() try: res = json.loads(resp_str) if res.get('success'): sid = res['data']['sid'] print(f"Logged in as {user}!") st_cmd = f"curl -k -s 'https://{ip}:5001/webapi/entry.cgi?api=SYNO.Storage.CGI.Storage&version=1&method=load_info&_sid={sid}'" _, o2, _ = c.exec_command(st_cmd) st_data = json.loads(o2.read().decode()) data = st_data.get('data', {}) vols = data.get('volumes', []) disks = data.get('disks', []) print(f"Disks count: {len(disks)}") tot_raw = 0 for d in disks: sz = int(d.get('size_total', 0)) / (1024**4) tot_raw += sz print(f" Drive {d.get('name')}: {d.get('model', 'Unknown')}, Size: {sz:.2f} TiB, Status: {d.get('status')}") print(f"Total Raw Drive Capacity: {tot_raw:.2f} TiB") print(f"Volumes count: {len(vols)}") tot_vol = 0 tot_used = 0 for v in vols: v_tot = int(v.get('size_total', 0)) / (1024**4) v_usd = int(v.get('size_used', 0)) / (1024**4) tot_vol += v_tot tot_used += v_usd print(f" Volume {v.get('name')}: Usable: {v_tot:.2f} TiB, Used: {v_usd:.2f} TiB, FS: {v.get('fs_type')}") print(f"Total Usable Volume: {tot_vol:.2f} TiB (Used: {tot_used:.2f} TiB)") break else: print(f"Login failed as {user}: {res}") except Exception as e: print(f"Error parse: {e}, raw: {resp_str[:150]}") query_nas('14.10.10.71', 'SN-NAS (RS810+)') query_nas('14.10.10.72', 'SnarfNAS (DS416play)') c.close()