init: workspace opencode sync
This commit is contained in:
+131
@@ -0,0 +1,131 @@
|
||||
import paramiko
|
||||
import time
|
||||
|
||||
client = paramiko.SSHClient()
|
||||
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
||||
client.connect('192.168.100.2', username='mi4', password='m14', look_for_keys=False, allow_agent=False)
|
||||
|
||||
# Get current scheduler on-event scripts
|
||||
schedulers = ["Bulanan2", "Bulanan4", "vc-2K3J", "vc-5K10J", "Family", "DevB2"]
|
||||
|
||||
# Use shell for multi-step operations
|
||||
chan = client.invoke_shell()
|
||||
chan.settimeout(15)
|
||||
time.sleep(2)
|
||||
|
||||
def read_output():
|
||||
out = b''
|
||||
while chan.recv_ready():
|
||||
out += chan.recv(65535)
|
||||
return out.decode('utf-8', errors='replace')
|
||||
|
||||
# Clear initial banner
|
||||
banner = read_output()
|
||||
|
||||
for s in schedulers:
|
||||
print(f"\n=== Fixing {s} ===")
|
||||
|
||||
# Step 1: Get current on-event via exec_command
|
||||
stdin, stdout, stderr = client.exec_command(f'/system scheduler get {s} on-event')
|
||||
on_event = stdout.read().decode().strip()
|
||||
err = stderr.read().decode().strip()
|
||||
if err:
|
||||
print(f" Error reading on-event: {err}")
|
||||
continue
|
||||
|
||||
if ':pic' not in on_event:
|
||||
print(f" No :pic found, skipping")
|
||||
continue
|
||||
|
||||
fixed = on_event.replace(':pic', ':pick')
|
||||
count = on_event.count(':pic')
|
||||
|
||||
# Step 2: Create temp script with fixed content
|
||||
# Escape the content for RouterOS CLI: replace " with \", $ with \$
|
||||
escaped = fixed.replace('"', '\\"').replace('$', '\\$')
|
||||
|
||||
temp_name = f"fix_{s}"
|
||||
cmd = f'/system script add name={temp_name} source="{escaped}"'
|
||||
chan.send(cmd + '\n')
|
||||
time.sleep(1.5)
|
||||
out = read_output()
|
||||
if 'failure' in out.lower():
|
||||
# Maybe already exists, try remove first
|
||||
chan.send(f'/system script remove {temp_name}\n')
|
||||
time.sleep(1)
|
||||
read_output()
|
||||
chan.send(cmd + '\n')
|
||||
time.sleep(1.5)
|
||||
out = read_output()
|
||||
|
||||
print(f" Temp script created: {out[:100]}")
|
||||
|
||||
# Step 3: Set scheduler on-event to use temp script source
|
||||
cmd = f'/system scheduler set {s} on-event=[/system script get {temp_name} source] disabled=no'
|
||||
chan.send(cmd + '\n')
|
||||
time.sleep(1.5)
|
||||
out = read_output()
|
||||
print(f" Scheduler set: {out[:100]}")
|
||||
|
||||
# Step 4: Remove temp script
|
||||
chan.send(f'/system script remove {temp_name}\n')
|
||||
time.sleep(1)
|
||||
read_output()
|
||||
|
||||
print("\n=== Verification ===")
|
||||
for s in schedulers:
|
||||
stdin, stdout, stderr = client.exec_command(f'/system scheduler get {s} on-event')
|
||||
oe = stdout.read().decode().strip()
|
||||
has_pic = ':pic' in oe
|
||||
has_pick = ':pick' in oe
|
||||
status = 'OK' if has_pick and not has_pic else 'BROKEN'
|
||||
print(f" {s}: {status} (pic={has_pic} pick={has_pick})")
|
||||
|
||||
# Also fix profile on-login via same approach
|
||||
print("\n=== Fixing profile on-login ===")
|
||||
profiles = ["Bulanan2", "Bulanan4", "vc-2K3J", "vc-5K10J", "Family", "home", "DevB2"]
|
||||
|
||||
for p in profiles:
|
||||
print(f"\n--- {p} ---")
|
||||
stdin, stdout, stderr = client.exec_command(f'/ip hotspot user/profile get {p} on-login')
|
||||
ol = stdout.read().decode().strip()
|
||||
err = stderr.read().decode().strip()
|
||||
if err:
|
||||
print(f" Error: {err}")
|
||||
continue
|
||||
|
||||
if ':pic' not in ol:
|
||||
print(f" No :pic found, skipping")
|
||||
continue
|
||||
|
||||
fixed = ol.replace(':pic', ':pick')
|
||||
count = ol.count(':pic')
|
||||
escaped = fixed.replace('"', '\\"').replace('$', '\\$')
|
||||
|
||||
temp_name = f"fix_{p}_login"
|
||||
chan.send(f'/system script add name={temp_name} source="{escaped}"\n')
|
||||
time.sleep(1.5)
|
||||
out = read_output()
|
||||
print(f" Temp script created: {out[:80]}")
|
||||
|
||||
cmd = f'/ip hotspot user/profile set {p} on-login=[/system script get {temp_name} source]'
|
||||
chan.send(cmd + '\n')
|
||||
time.sleep(1.5)
|
||||
out = read_output()
|
||||
print(f" Profile set: {out[:80]}")
|
||||
|
||||
chan.send(f'/system script remove {temp_name}\n')
|
||||
time.sleep(1)
|
||||
read_output()
|
||||
|
||||
print("\n=== Profile Verification ===")
|
||||
for p in profiles:
|
||||
stdin, stdout, stderr = client.exec_command(f'/ip hotspot user/profile get {p} on-login')
|
||||
ol = stdout.read().decode().strip()
|
||||
has_pic = ':pic' in ol
|
||||
has_pick = ':pick' in ol
|
||||
status = 'OK' if has_pick and not has_pic else 'BROKEN'
|
||||
print(f" {p}: {status}")
|
||||
|
||||
client.close()
|
||||
print("\nALL DONE")
|
||||
Reference in New Issue
Block a user