package main
import (
"fmt"
"time"
"github.com/shirou/gopsutil/v4/cpu"
"github.com/shirou/gopsutil/v4/disk"
"github.com/shirou/gopsutil/v4/host"
"github.com/shirou/gopsutil/v4/mem"
)
func displayHostInfo() error {
hostInfo, err := host.Info()
if err != nil {
return fmt.Errorf("error getting host info: %w", err)
}
uptime, err := host.Uptime()
if err != nil {
return fmt.Errorf("error getting uptime: %w", err)
}
fmt.Println("\n=== Host Information ===")
fmt.Printf("Hostname: %s\n", hostInfo.Hostname)
fmt.Printf("OS: %s\n", hostInfo.OS)
fmt.Printf("Platform: %s\n", hostInfo.Platform)
fmt.Printf("Platform Version: %s\n", hostInfo.PlatformVersion)
fmt.Printf("Kernel Version: %s\n", hostInfo.KernelVersion)
fmt.Printf("Uptime: %v hours\n", uptime/3600)
return nil
}
func displayCPUInfo() error {
percentages, err := cpu.Percent(time.Second, false)
if err != nil {
return fmt.Errorf("error getting CPU percent: %w", err)
}
cores, err := cpu.Counts(true)
if err != nil {
return fmt.Errorf("error getting CPU counts: %w", err)
}
fmt.Println("\n=== CPU Information ===")
fmt.Printf("CPU Usage: %.2f%%\n", percentages[0])
fmt.Printf("CPU Cores: %d\n", cores)
return nil
}
func displayMemoryInfo() error {
vmStat, err := mem.VirtualMemory()
if err != nil {
return fmt.Errorf("error getting memory info: %w", err)
}
swapStat, err := mem.SwapMemory()
if err != nil {
return fmt.Errorf("error getting swap info: %w", err)
}
fmt.Println("\n=== Memory Information ===")
fmt.Printf("Total: %v MB\n", vmStat.Total/1024/1024)
fmt.Printf("Used: %v MB (%.2f%%)\n",
vmStat.Used/1024/1024, vmStat.UsedPercent)
fmt.Printf("Available: %v MB\n", vmStat.Available/1024/1024)
fmt.Printf("\nSwap Total: %v MB\n", swapStat.Total/1024/1024)
fmt.Printf("Swap Used: %v MB (%.2f%%)\n",
swapStat.Used/1024/1024, swapStat.UsedPercent)
return nil
}
func displayDiskInfo() error {
partitions, err := disk.Partitions(false)
if err != nil {
return fmt.Errorf("error getting partitions: %w", err)
}
fmt.Println("\n=== Disk Information ===")
for _, partition := range partitions {
usageStat, err := disk.Usage(partition.Mountpoint)
if err != nil {
continue
}
fmt.Printf("\nDevice: %s\n", partition.Device)
fmt.Printf("Mountpoint: %s\n", partition.Mountpoint)
fmt.Printf("Filesystem: %s\n", partition.Fstype)
fmt.Printf("Total: %v GB\n", usageStat.Total/1024/1024/1024)
fmt.Printf("Used: %v GB (%.2f%%)\n",
usageStat.Used/1024/1024/1024, usageStat.UsedPercent)
fmt.Printf("Free: %v GB\n", usageStat.Free/1024/1024/1024)
}
return nil
}
func main() {
fmt.Println("System Monitor")
fmt.Println("==============")
if err := displayHostInfo(); err != nil {
fmt.Printf("Error: %v\n", err)
}
if err := displayCPUInfo(); err != nil {
fmt.Printf("Error: %v\n", err)
}
if err := displayMemoryInfo(); err != nil {
fmt.Printf("Error: %v\n", err)
}
if err := displayDiskInfo(); err != nil {
fmt.Printf("Error: %v\n", err)
}
}