Add support for dynamic hosts file management, browser opening, and new favicon handling in web server. Add elimination workflow UI enhancements with better state management and design.
TODO: Test elimination per finding type in web view Figure out where RustDesk registry persistence is located. The installer is aware of it somehow
This commit is contained in:
@@ -0,0 +1,129 @@
|
||||
package web
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
)
|
||||
|
||||
const (
|
||||
hostsEntry = "127.0.0.1 rmm-hunter"
|
||||
marker = "# RMM-Hunter entry"
|
||||
)
|
||||
|
||||
// AddHostsEntry adds the rmm-hunter DNS entry to the Windows hosts file
|
||||
// Requires administrator privileges
|
||||
func AddHostsEntry() error {
|
||||
hostsPath := getHostsPath()
|
||||
|
||||
// Check if entry already exists
|
||||
exists, err := hostsEntryExists(hostsPath)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to check hosts file: %w", err)
|
||||
}
|
||||
|
||||
if exists {
|
||||
fmt.Println("[+] rmm-hunter hosts entry already exists")
|
||||
return nil
|
||||
}
|
||||
|
||||
// Read existing hosts file
|
||||
content, err := os.ReadFile(hostsPath)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to read hosts file: %w", err)
|
||||
}
|
||||
|
||||
// Append our entry
|
||||
newContent := string(content)
|
||||
if !strings.HasSuffix(newContent, "\n") {
|
||||
newContent += "\n"
|
||||
}
|
||||
newContent += fmt.Sprintf("\n%s\n%s\n", marker, hostsEntry)
|
||||
|
||||
// Write back to hosts file
|
||||
err = os.WriteFile(hostsPath, []byte(newContent), 0644)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to write hosts file: %w", err)
|
||||
}
|
||||
|
||||
fmt.Println("[+] Added rmm-hunter to hosts file")
|
||||
fmt.Println("[+] You can now access the web UI at: http://rmm-hunter:8080")
|
||||
return nil
|
||||
}
|
||||
|
||||
// RemoveHostsEntry removes the rmm-hunter DNS entry from the Windows hosts file
|
||||
func RemoveHostsEntry() error {
|
||||
hostsPath := getHostsPath()
|
||||
|
||||
// Read existing hosts file
|
||||
file, err := os.Open(hostsPath)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to open hosts file: %w", err)
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
var newLines []string
|
||||
scanner := bufio.NewScanner(file)
|
||||
skipNext := false
|
||||
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
|
||||
// Skip the marker line and the next line (our entry)
|
||||
if strings.Contains(line, marker) {
|
||||
skipNext = true
|
||||
continue
|
||||
}
|
||||
|
||||
if skipNext && strings.Contains(line, "rmm-hunter") {
|
||||
skipNext = false
|
||||
continue
|
||||
}
|
||||
|
||||
newLines = append(newLines, line)
|
||||
}
|
||||
|
||||
if err := scanner.Err(); err != nil {
|
||||
return fmt.Errorf("failed to read hosts file: %w", err)
|
||||
}
|
||||
|
||||
// Write back to hosts file
|
||||
newContent := strings.Join(newLines, "\n")
|
||||
err = os.WriteFile(hostsPath, []byte(newContent), 0644)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to write hosts file: %w", err)
|
||||
}
|
||||
|
||||
fmt.Println("[+] Removed rmm-hunter from hosts file")
|
||||
return nil
|
||||
}
|
||||
|
||||
// hostsEntryExists checks if the rmm-hunter entry already exists in the hosts file
|
||||
func hostsEntryExists(hostsPath string) (bool, error) {
|
||||
file, err := os.Open(hostsPath)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
scanner := bufio.NewScanner(file)
|
||||
for scanner.Scan() {
|
||||
line := strings.TrimSpace(scanner.Text())
|
||||
if strings.Contains(line, "rmm-hunter") && strings.Contains(line, "127.0.0.1") {
|
||||
return true, nil
|
||||
}
|
||||
}
|
||||
|
||||
return false, scanner.Err()
|
||||
}
|
||||
|
||||
// getHostsPath returns the path to the Windows hosts file
|
||||
func getHostsPath() string {
|
||||
systemRoot := os.Getenv("SystemRoot")
|
||||
if systemRoot == "" {
|
||||
systemRoot = "C:\\Windows"
|
||||
}
|
||||
return filepath.Join(systemRoot, "System32", "drivers", "etc", "hosts")
|
||||
}
|
||||
Reference in New Issue
Block a user