adding smb mount
and fine tuning window specs
This commit is contained in:
183
SpyderScripts/smb_mount.py
Normal file
183
SpyderScripts/smb_mount.py
Normal file
@@ -0,0 +1,183 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
import shutil
|
||||||
|
import time
|
||||||
|
from pathlib import Path
|
||||||
|
from urllib.parse import quote
|
||||||
|
from dataclasses import dataclass
|
||||||
|
from typing import Optional
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class SMBConfig:
|
||||||
|
"""Configuration for an SMB mount."""
|
||||||
|
server: str
|
||||||
|
share: str
|
||||||
|
username: str
|
||||||
|
password: str
|
||||||
|
mount_name: str # Name for the mount folder (e.g., "GDriveNetwork")
|
||||||
|
local_dest: Optional[str] = None # Optional local destination for syncing
|
||||||
|
|
||||||
|
@property
|
||||||
|
def mount_point(self) -> str:
|
||||||
|
"""Returns the full mount point path."""
|
||||||
|
return str(Path.home() / "NetworkMounts" / self.mount_name)
|
||||||
|
|
||||||
|
|
||||||
|
def is_mounted(mount_point: str) -> bool:
|
||||||
|
"""Check if a path is currently mounted."""
|
||||||
|
return os.path.ismount(mount_point)
|
||||||
|
|
||||||
|
|
||||||
|
def mount_share(config: SMBConfig) -> bool:
|
||||||
|
"""
|
||||||
|
Mount an SMB share using the provided configuration.
|
||||||
|
Returns True if successful, False otherwise.
|
||||||
|
"""
|
||||||
|
mount_point = config.mount_point
|
||||||
|
|
||||||
|
# Create mount point directory if it doesn't exist
|
||||||
|
Path(mount_point).mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
|
# Build the SMB URL
|
||||||
|
# Format: //username:password@server/share
|
||||||
|
if config.username and config.password:
|
||||||
|
escaped_pass = quote(config.password, safe='')
|
||||||
|
smb_url = f"//{config.username}:{escaped_pass}@{config.server}/{config.share}"
|
||||||
|
else:
|
||||||
|
smb_url = f"//{config.server}/{config.share}"
|
||||||
|
|
||||||
|
# Mount command for macOS
|
||||||
|
cmd = ["mount_smbfs", smb_url, mount_point]
|
||||||
|
|
||||||
|
try:
|
||||||
|
print(f"Mounting {config.share} from {config.server}...")
|
||||||
|
subprocess.run(cmd, check=True, capture_output=True, text=True)
|
||||||
|
print(f"Successfully mounted to {mount_point}")
|
||||||
|
return True
|
||||||
|
except subprocess.CalledProcessError as e:
|
||||||
|
print(f"Failed to mount: {e.stderr}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def unmount_share(config: SMBConfig) -> bool:
|
||||||
|
"""Unmount an SMB share."""
|
||||||
|
mount_point = config.mount_point
|
||||||
|
|
||||||
|
if not is_mounted(mount_point):
|
||||||
|
print(f"{mount_point} is not mounted.")
|
||||||
|
return True
|
||||||
|
|
||||||
|
try:
|
||||||
|
subprocess.run(["umount", mount_point], check=True, capture_output=True, text=True)
|
||||||
|
print(f"Successfully unmounted {mount_point}")
|
||||||
|
return True
|
||||||
|
except subprocess.CalledProcessError as e:
|
||||||
|
print(f"Failed to unmount: {e.stderr}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def ensure_mounted(config: SMBConfig) -> bool:
|
||||||
|
"""
|
||||||
|
Ensure a share is mounted. Mount it if not already mounted.
|
||||||
|
Returns True if mounted (or already was), False if mount failed.
|
||||||
|
"""
|
||||||
|
mount_point = config.mount_point
|
||||||
|
|
||||||
|
if is_mounted(mount_point):
|
||||||
|
print(f"{config.share} is already mounted at {mount_point}")
|
||||||
|
return True
|
||||||
|
|
||||||
|
print(f"{config.share} not mounted. Attempting to mount...")
|
||||||
|
return mount_share(config)
|
||||||
|
|
||||||
|
|
||||||
|
# -----------------------------
|
||||||
|
# PREDEFINED CONFIGURATIONS
|
||||||
|
# -----------------------------
|
||||||
|
# Add your different mount configurations here
|
||||||
|
|
||||||
|
CONFIGS = {
|
||||||
|
"gdrive": SMBConfig(
|
||||||
|
server="192.168.1.68",
|
||||||
|
share="GDrive",
|
||||||
|
username="macos",
|
||||||
|
password="dromischSYNC123987me",
|
||||||
|
mount_name="GDrive",
|
||||||
|
local_dest="/Users/dromisch/NetworkMounts/GDrive"
|
||||||
|
),
|
||||||
|
|
||||||
|
# Example: Add more configurations as needed
|
||||||
|
# "photos": SMBConfig(
|
||||||
|
# server="192.168.1.68",
|
||||||
|
# share="Photos",
|
||||||
|
# username="photouser",
|
||||||
|
# password="photopass",
|
||||||
|
# mount_name="PhotosNetwork",
|
||||||
|
# local_dest="/Volumes/ExtraDrive/Photos"
|
||||||
|
# ),
|
||||||
|
|
||||||
|
# "backup": SMBConfig(
|
||||||
|
# server="192.168.1.100",
|
||||||
|
# share="Backups",
|
||||||
|
# username="backupuser",
|
||||||
|
# password="backuppass",
|
||||||
|
# mount_name="BackupNetwork"
|
||||||
|
# ),
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def list_configs():
|
||||||
|
"""Print available configurations."""
|
||||||
|
print("Available mount configurations:")
|
||||||
|
for name, config in CONFIGS.items():
|
||||||
|
status = "mounted" if is_mounted(config.mount_point) else "not mounted"
|
||||||
|
print(f" {name}: //{config.server}/{config.share} ({status})")
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
import argparse
|
||||||
|
|
||||||
|
parser = argparse.ArgumentParser(description="Mount SMB network shares")
|
||||||
|
parser.add_argument("config", nargs="?", help="Configuration name to mount")
|
||||||
|
parser.add_argument("-l", "--list", action="store_true", help="List available configurations")
|
||||||
|
parser.add_argument("-u", "--unmount", action="store_true", help="Unmount instead of mount")
|
||||||
|
parser.add_argument("-a", "--all", action="store_true", help="Mount/unmount all configurations")
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
if args.list:
|
||||||
|
list_configs()
|
||||||
|
return
|
||||||
|
|
||||||
|
if args.all:
|
||||||
|
for name, config in CONFIGS.items():
|
||||||
|
print(f"\n--- {name} ---")
|
||||||
|
if args.unmount:
|
||||||
|
unmount_share(config)
|
||||||
|
else:
|
||||||
|
ensure_mounted(config)
|
||||||
|
return
|
||||||
|
|
||||||
|
if not args.config:
|
||||||
|
parser.print_help()
|
||||||
|
print("\n")
|
||||||
|
list_configs()
|
||||||
|
return
|
||||||
|
|
||||||
|
if args.config not in CONFIGS:
|
||||||
|
print(f"Unknown configuration: {args.config}")
|
||||||
|
list_configs()
|
||||||
|
return
|
||||||
|
|
||||||
|
config = CONFIGS[args.config]
|
||||||
|
|
||||||
|
if args.unmount:
|
||||||
|
unmount_share(config)
|
||||||
|
else:
|
||||||
|
ensure_mounted(config)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
"""
|
"""
|
||||||
Resize active window to Maximum preset (2400x3500)
|
Resize active window to Maximum preset (2450x3500)
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from resize_window import resize_active_window
|
from resize_window import resize_active_window
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
resize_active_window(width=2400, height=3500)
|
resize_active_window(width=2450, height=3500)
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
block_cipher = None
|
block_cipher = None
|
||||||
|
|
||||||
a = Analysis(
|
a = Analysis(
|
||||||
['window_naximum.py'],
|
['window_maximum.py'],
|
||||||
pathex=[],
|
pathex=[],
|
||||||
binaries=[],
|
binaries=[],
|
||||||
datas=[],
|
datas=[],
|
||||||
|
|||||||
Reference in New Issue
Block a user