202 lines
5.3 KiB
Go
202 lines
5.3 KiB
Go
package main
|
|
|
|
import (
|
|
"bufio"
|
|
"fmt"
|
|
"golang.org/x/crypto/ssh"
|
|
"io"
|
|
"os"
|
|
"strings"
|
|
"time"
|
|
"golang.org/x/term"
|
|
"syscall"
|
|
)
|
|
|
|
func main() {
|
|
// Minta input IP WLC, username, password, MAC address, file name, dan monitor time interval dari user
|
|
reader := bufio.NewReader(os.Stdin)
|
|
|
|
fmt.Print("Enter WLC IP or hostname: ")
|
|
wlcHost, _ := reader.ReadString('\n')
|
|
wlcHost = strings.TrimSpace(wlcHost)
|
|
|
|
fmt.Print("Enter username: ")
|
|
user, _ := reader.ReadString('\n')
|
|
user = strings.TrimSpace(user)
|
|
|
|
fmt.Print("Enter password: ")
|
|
bytePassword, _ := term.ReadPassword(int(syscall.Stdin))
|
|
password := string(bytePassword)
|
|
fmt.Println()
|
|
password = strings.TrimSpace(password)
|
|
|
|
fmt.Print("Enter MAC address (format xxxx.xxxx.xxxx): ")
|
|
mac, _ := reader.ReadString('\n')
|
|
mac = strings.TrimSpace(mac)
|
|
|
|
fmt.Print("Enter file name to save trace (e.g. 1c2f.a261.d2d6-test.txt): ")
|
|
filename, _ := reader.ReadString('\n')
|
|
filename = strings.TrimSpace(filename)
|
|
|
|
fmt.Print("Enter monitor time interval in seconds: ")
|
|
var monitorTime int
|
|
fmt.Scanf("%d", &monitorTime)
|
|
|
|
// Loop iterasi untuk jalankan debug trace dan append hasil
|
|
for i := 1; ; i++ {
|
|
fmt.Printf("Starting iteration %d\n", i)
|
|
|
|
// Buat koneksi baru untuk setiap iterasi
|
|
client, err := connectToWLC(wlcHost, user, password)
|
|
if err != nil {
|
|
fmt.Println("Failed to connect to WLC: ", err)
|
|
fmt.Println("Waiting 30 seconds before retry...")
|
|
time.Sleep(30 * time.Second)
|
|
continue
|
|
}
|
|
|
|
fmt.Println("Connected to WLC successfully")
|
|
|
|
// Buat session
|
|
session, err := client.NewSession()
|
|
if err != nil {
|
|
fmt.Println("Failed to create session: ", err)
|
|
client.Close()
|
|
fmt.Println("Waiting 30 seconds before retry...")
|
|
time.Sleep(30 * time.Second)
|
|
continue
|
|
}
|
|
|
|
// Jalankan perintah debug wireless mac ...
|
|
cmd := fmt.Sprintf("debug wireless mac %s to-file flash:/%s level debug monitor-time %d", mac, filename, monitorTime)
|
|
fmt.Println("Running command: ", cmd)
|
|
|
|
// Jalankan perintah dan tunggu sampai selesai
|
|
err = session.Run(cmd)
|
|
session.Close()
|
|
|
|
if err != nil {
|
|
fmt.Println("Command execution failed: ", err)
|
|
client.Close()
|
|
// Lanjut ke iterasi berikutnya
|
|
time.Sleep(5 * time.Second)
|
|
continue
|
|
}
|
|
|
|
// Tunggu sesuai monitor time + sedikit buffer
|
|
fmt.Printf("Waiting for %d seconds to complete trace...\n", monitorTime)
|
|
time.Sleep(time.Duration(monitorTime+15) * time.Second)
|
|
|
|
// Buat koneksi baru untuk operasi download dan delete
|
|
client2, err := connectToWLC(wlcHost, user, password)
|
|
if err != nil {
|
|
fmt.Println("Failed to reconnect to WLC for file operations: ", err)
|
|
fmt.Println("Skipping file operations for this iteration")
|
|
} else {
|
|
// Download file dari WLC
|
|
fmt.Println("Downloading trace file from WLC...")
|
|
content := downloadFile(client2, filename)
|
|
if content != nil {
|
|
// Append ke file lokal
|
|
appendToFile(filename, content)
|
|
fmt.Println("Trace file downloaded and appended successfully")
|
|
} else {
|
|
fmt.Println("Failed to download trace file")
|
|
}
|
|
|
|
// Hapus file di WLC
|
|
fmt.Println("Deleting trace file from WLC...")
|
|
deleteFile(client2, filename)
|
|
client2.Close()
|
|
}
|
|
|
|
client.Close()
|
|
fmt.Printf("Iteration %d done. Press Ctrl+C to stop or wait for next iteration.\n", i)
|
|
time.Sleep(10 * time.Second)
|
|
}
|
|
}
|
|
|
|
func connectToWLC(wlcHost, user, password string) (*ssh.Client, error) {
|
|
// Konfigurasi SSH
|
|
config := &ssh.ClientConfig{
|
|
User: user,
|
|
Auth: []ssh.AuthMethod{
|
|
ssh.Password(password),
|
|
},
|
|
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
|
|
Timeout: 30 * time.Second,
|
|
}
|
|
|
|
// Connect ke WLC
|
|
client, err := ssh.Dial("tcp", wlcHost+":22", config)
|
|
return client, err
|
|
}
|
|
|
|
func downloadFile(client *ssh.Client, filename string) []byte {
|
|
session, err := client.NewSession()
|
|
if err != nil {
|
|
fmt.Println("Failed to create session for download: ", err)
|
|
return nil
|
|
}
|
|
defer session.Close()
|
|
|
|
cmd := fmt.Sprintf("more flash:/%s", filename)
|
|
output, err := session.CombinedOutput(cmd)
|
|
if err != nil {
|
|
fmt.Println("Failed to download file: ", err)
|
|
return nil
|
|
}
|
|
|
|
return output
|
|
}
|
|
|
|
func appendToFile(filename string, content []byte) {
|
|
f, err := os.OpenFile(filename, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
|
|
if err != nil {
|
|
fmt.Println("Failed to open local file for append: ", err)
|
|
return
|
|
}
|
|
defer f.Close()
|
|
|
|
_, err = f.Write(content)
|
|
if err != nil {
|
|
fmt.Println("Failed to append to local file: ", err)
|
|
}
|
|
}
|
|
|
|
func deleteFile(client *ssh.Client, filename string) {
|
|
session, err := client.NewSession()
|
|
if err != nil {
|
|
fmt.Println("Failed to create session for delete: ", err)
|
|
return
|
|
}
|
|
defer session.Close()
|
|
|
|
cmd := fmt.Sprintf("delete flash:/%s", filename)
|
|
stdin, err := session.StdinPipe()
|
|
if err != nil {
|
|
fmt.Println("Failed to get stdin pipe: ", err)
|
|
return
|
|
}
|
|
|
|
go func() {
|
|
defer stdin.Close()
|
|
io.WriteString(stdin, "y\n")
|
|
}()
|
|
|
|
output, err := session.CombinedOutput(cmd)
|
|
if err != nil {
|
|
fmt.Println("Failed to delete file: ", err)
|
|
return
|
|
}
|
|
|
|
fmt.Println("Delete output:", string(output))
|
|
}
|
|
|
|
/* Removed duplicate function definitions of downloadFile, appendToFile, and deleteFile.
|
|
The correct implementations remain elsewhere in this file. */
|
|
// Duplicate trace helper functions removed; canonical implementations
|
|
// (downloadFile, deleteFile, appendToFile) remain elsewhere in this file.
|
|
// This removed section prevented a syntax error caused by duplicate
|
|
// function definitions and an extra closing brace.
|