commit a46241ae28b2a49f28647884292b9d60b5392692 Author: othman hendy suseno Date: Fri Sep 19 11:19:41 2025 +0000 initial commit diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..38ceb2c --- /dev/null +++ b/go.mod @@ -0,0 +1,10 @@ +module trace_wlc + +go 1.25.1 + +require ( + golang.org/x/crypto v0.42.0 + golang.org/x/term v0.35.0 +) + +require golang.org/x/sys v0.36.0 // indirect diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..017168b --- /dev/null +++ b/go.sum @@ -0,0 +1,6 @@ +golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI= +golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8= +golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k= +golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.35.0 h1:bZBVKBudEyhRcajGcNc3jIfWPqV4y/Kt2XcoigOWtDQ= +golang.org/x/term v0.35.0/go.mod h1:TPGtkTLesOwf2DE8CgVYiZinHAOuy5AYUYT1lENIZnA= diff --git a/trace_wlc.exe b/trace_wlc.exe new file mode 100644 index 0000000..7674189 Binary files /dev/null and b/trace_wlc.exe differ diff --git a/trace_wlc.go b/trace_wlc.go new file mode 100644 index 0000000..815f815 --- /dev/null +++ b/trace_wlc.go @@ -0,0 +1,201 @@ +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.