|
@@ -1,236 +1,237 @@
|
|
|
-//go:build darwin
|
|
|
-// +build darwin
|
|
|
-
|
|
|
-package hardwareinfo
|
|
|
-
|
|
|
-import (
|
|
|
- "encoding/json"
|
|
|
- "log"
|
|
|
- "net/http"
|
|
|
- "os/exec"
|
|
|
- "strconv"
|
|
|
- "strings"
|
|
|
-)
|
|
|
-
|
|
|
-/*
|
|
|
- System Info
|
|
|
- original author: HyperXraft
|
|
|
- modified by: Alanyeung
|
|
|
- original date: 2021-02-18
|
|
|
- modified by: 2021-07-25
|
|
|
-
|
|
|
- This module get the CPU information on different platform using
|
|
|
- native terminal commands on FreeBSD platform
|
|
|
-
|
|
|
- DEFINITIONS
|
|
|
- ===========
|
|
|
- CPUModel: Refers to the Marketing name of the CPU, e.g. Intel Xeon E7 8890
|
|
|
- CPUHardware: Refers to the CPUID name, e.g. GenuineIntel-6-3A-9
|
|
|
- CPUArch: Refers to the ISA of the CPU, e.g. aarch64
|
|
|
- CPUFreq: Refers to the CPU frequency in terms of gigahertz, e.g. 0.8GHz
|
|
|
-*/
|
|
|
-
|
|
|
-//usbinfo from https://apple.stackexchange.com/questions/170105/list-usb-devices-on-osx-command-line
|
|
|
-const unknown_string = "??? "
|
|
|
-const query_frequency_command = "sysctl machdep.cpu.brand_string | awk '{print $NF}'"
|
|
|
-const query_cpumodel_command = "sysctl machdep.cpu.brand_string | awk '{for(i=1;++i<=NF-3;) printf $i\" \"; print $(NF-2)}'"
|
|
|
-const query_cpuarch_command = "sysctl hw.machine | awk '{print $NF}'"
|
|
|
-const query_cpuhardware_command = "sysctl machdep.cpu.stepping | awk '{print $NF}'"
|
|
|
-const query_netinfo_command = "networksetup -listallhardwareports"
|
|
|
-const query_usbinfo_command = "ioreg -p IOUSB -w0 | sed 's/[^o]*o //; s/@.*$//' | grep -v '^Root.*'"
|
|
|
-const query_memsize_command = "sysctl hw.memsize | awk '{print $NF}'"
|
|
|
-
|
|
|
-// GetCPUFreq() -> String
|
|
|
-// Returns the CPU frequency in the terms of MHz
|
|
|
-func GetCPUFreq() string {
|
|
|
- shell := exec.Command("bash", "-c", query_frequency_command) // Run command
|
|
|
- freqByteArr, err := shell.CombinedOutput() // Response from cmdline
|
|
|
- if err != nil { // If done w/ errors then
|
|
|
- log.Println(err)
|
|
|
- return unknown_string
|
|
|
- }
|
|
|
-
|
|
|
- freqStr := strings.ReplaceAll(string(freqByteArr), "GHz", "")
|
|
|
- freqStr = strings.ReplaceAll(freqStr, "\n", "")
|
|
|
- freqStr = strings.ReplaceAll(freqStr, " ", "")
|
|
|
- freqFloat, _ := strconv.ParseFloat(freqStr, 8)
|
|
|
- freqFloat = freqFloat * 1000
|
|
|
- freqStrMHz := strconv.FormatFloat(freqFloat, 'f', -1, 64)
|
|
|
-
|
|
|
- return freqStrMHz
|
|
|
-}
|
|
|
-
|
|
|
-// GetCPUModel -> String
|
|
|
-// Returns the CPU model name string
|
|
|
-func GetCPUModel() string {
|
|
|
- shell := exec.Command("bash", "-c", query_cpumodel_command) // Run command
|
|
|
- modelStr, err := shell.CombinedOutput() // Response from cmdline
|
|
|
- if err != nil { // If done w/ errors then
|
|
|
- log.Println(err)
|
|
|
- return unknown_string
|
|
|
- }
|
|
|
-
|
|
|
- return string(modelStr)
|
|
|
-}
|
|
|
-
|
|
|
-// GetCPUHardware -> String
|
|
|
-// Returns the CPU ID string
|
|
|
-func GetCPUHardware() string {
|
|
|
- shell := exec.Command("bash", "-c", query_cpuhardware_command) // Run command
|
|
|
- hwStr, err := shell.CombinedOutput() // Response from cmdline
|
|
|
- if err != nil { // If done w/ errors then
|
|
|
- log.Println(err)
|
|
|
- return unknown_string
|
|
|
- }
|
|
|
-
|
|
|
- return string(hwStr)
|
|
|
-}
|
|
|
-
|
|
|
-// GetCPUArch -> String
|
|
|
-// Returns the CPU architecture string
|
|
|
-func GetCPUArch() string {
|
|
|
- shell := exec.Command("bash", "-c", query_cpuarch_command) // Run command
|
|
|
- archStr, err := shell.CombinedOutput() // Response from cmdline
|
|
|
- if err != nil { // If done w/ errors then
|
|
|
- log.Println(err)
|
|
|
- return unknown_string
|
|
|
- }
|
|
|
-
|
|
|
- return string(archStr)
|
|
|
-}
|
|
|
-
|
|
|
-// Inherited code from sysinfo_window.go
|
|
|
-func GetCPUInfo(w http.ResponseWriter, r *http.Request) {
|
|
|
- CPUInfo := CPUInfo{
|
|
|
- Freq: GetCPUFreq(),
|
|
|
- Hardware: GetCPUHardware(),
|
|
|
- Instruction: GetCPUArch(),
|
|
|
- Model: GetCPUModel(),
|
|
|
- Revision: "unknown",
|
|
|
- }
|
|
|
-
|
|
|
- var jsonData []byte
|
|
|
- jsonData, err := json.Marshal(CPUInfo)
|
|
|
- if err != nil {
|
|
|
- log.Println(err)
|
|
|
- }
|
|
|
- sendTextResponse(w, string(jsonData))
|
|
|
-}
|
|
|
-
|
|
|
-// Inherited code from sysinfo.go
|
|
|
-func Ifconfig(w http.ResponseWriter, r *http.Request) {
|
|
|
- cmdin := query_netinfo_command
|
|
|
- cmd := exec.Command("bash", "-c", cmdin)
|
|
|
- networkInterfaces, err := cmd.CombinedOutput()
|
|
|
- if err != nil {
|
|
|
- networkInterfaces = []byte{}
|
|
|
- }
|
|
|
-
|
|
|
- nic := strings.Split(string(networkInterfaces), "\n")
|
|
|
-
|
|
|
- var arr []string
|
|
|
- for _, info := range nic {
|
|
|
- thisInfo := string(info)
|
|
|
- arr = append(arr, thisInfo)
|
|
|
- }
|
|
|
-
|
|
|
- var jsonData []byte
|
|
|
- jsonData, err = json.Marshal(arr)
|
|
|
- if err != nil {
|
|
|
- log.Println(err)
|
|
|
- }
|
|
|
- sendTextResponse(w, string(jsonData))
|
|
|
-}
|
|
|
-
|
|
|
-// Inherited code from sysinfo.go
|
|
|
-func GetDriveStat(w http.ResponseWriter, r *http.Request) {
|
|
|
- //Get drive status using df command
|
|
|
- cmdin := `df -k | sed -e /Filesystem/d`
|
|
|
- cmd := exec.Command("bash", "-c", cmdin)
|
|
|
- dev, err := cmd.CombinedOutput()
|
|
|
- if err != nil {
|
|
|
- dev = []byte{}
|
|
|
- }
|
|
|
-
|
|
|
- drives := strings.Split(string(dev), "\n")
|
|
|
-
|
|
|
- if len(drives) == 0 {
|
|
|
- sendErrorResponse(w, "Invalid disk information")
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- var arr []LogicalDisk
|
|
|
- for _, driveInfo := range drives {
|
|
|
- if driveInfo == "" {
|
|
|
- continue
|
|
|
- }
|
|
|
- for strings.Contains(driveInfo, " ") {
|
|
|
- driveInfo = strings.Replace(driveInfo, " ", " ", -1)
|
|
|
- }
|
|
|
- driveInfoChunk := strings.Split(driveInfo, " ")
|
|
|
- tmp, _ := strconv.Atoi(driveInfoChunk[3])
|
|
|
- freespaceInByte := int64(tmp)
|
|
|
-
|
|
|
- LogicalDisk := LogicalDisk{
|
|
|
- DriveLetter: driveInfoChunk[8],
|
|
|
- FileSystem: driveInfoChunk[0],
|
|
|
- FreeSpace: strconv.FormatInt(freespaceInByte*1024, 10), //df show disk space in 1KB blocks
|
|
|
- }
|
|
|
- arr = append(arr, LogicalDisk)
|
|
|
- }
|
|
|
-
|
|
|
- var jsonData []byte
|
|
|
- jsonData, err = json.Marshal(arr)
|
|
|
- if err != nil {
|
|
|
- log.Println(err)
|
|
|
- }
|
|
|
- sendTextResponse(w, string(jsonData))
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-// GetUSB(ResponseWriter, HttpRequest) -> nil
|
|
|
-// Takes in http.ResponseWriter w and *http.Request r,
|
|
|
-// Send TextResponse containing USB information extracted from shell in JSON
|
|
|
-func GetUSB(w http.ResponseWriter, r *http.Request) {
|
|
|
- cmdin := query_usbinfo_command
|
|
|
- cmd := exec.Command("bash", "-c", cmdin)
|
|
|
- usbd, err := cmd.CombinedOutput()
|
|
|
- if err != nil {
|
|
|
- usbd = []byte{}
|
|
|
- }
|
|
|
-
|
|
|
- usbDrives := strings.Split(string(usbd), "\n")
|
|
|
-
|
|
|
- var arr []string
|
|
|
- for _, info := range usbDrives {
|
|
|
- arr = append(arr, info)
|
|
|
- }
|
|
|
-
|
|
|
- var jsonData []byte
|
|
|
- jsonData, err = json.Marshal(arr)
|
|
|
- if err != nil {
|
|
|
- log.Println(err)
|
|
|
- }
|
|
|
- sendTextResponse(w, string(jsonData))
|
|
|
-}
|
|
|
-
|
|
|
-// GetRamInfo(w ResponseWriter, r *HttpRequest) -> nil
|
|
|
-// Takes in http.ResponseWriter w and *http.Request r,
|
|
|
-// Send TextResponse containing physical memory size
|
|
|
-// extracted from shell in JSON
|
|
|
-func GetRamInfo(w http.ResponseWriter, r *http.Request) {
|
|
|
- cmd := exec.Command("bash", "-c", query_memsize_command)
|
|
|
- out, _ := cmd.CombinedOutput()
|
|
|
-
|
|
|
- strOut := string(out)
|
|
|
- strOut = strings.ReplaceAll(strOut, "\n", "")
|
|
|
- ramSize, _ := strconv.ParseInt(strOut, 10, 64)
|
|
|
- ramSizeInt := ramSize
|
|
|
-
|
|
|
- var jsonData []byte
|
|
|
- jsonData, err := json.Marshal(ramSizeInt)
|
|
|
- if err != nil {
|
|
|
- log.Println(err)
|
|
|
- }
|
|
|
- sendTextResponse(w, string(jsonData))
|
|
|
-}
|
|
|
+//go:build darwin
|
|
|
+// +build darwin
|
|
|
+
|
|
|
+package hardwareinfo
|
|
|
+
|
|
|
+import (
|
|
|
+ "encoding/json"
|
|
|
+ "imuslab.com/arozos/mod/utils"
|
|
|
+ "log"
|
|
|
+ "net/http"
|
|
|
+ "os/exec"
|
|
|
+ "strconv"
|
|
|
+ "strings"
|
|
|
+)
|
|
|
+
|
|
|
+/*
|
|
|
+ System Info
|
|
|
+ original author: HyperXraft
|
|
|
+ modified by: Alanyeung
|
|
|
+ original date: 2021-02-18
|
|
|
+ modified by: 2021-07-25
|
|
|
+
|
|
|
+ This module get the CPU information on different platform using
|
|
|
+ native terminal commands on FreeBSD platform
|
|
|
+
|
|
|
+ DEFINITIONS
|
|
|
+ ===========
|
|
|
+ CPUModel: Refers to the Marketing name of the CPU, e.g. Intel Xeon E7 8890
|
|
|
+ CPUHardware: Refers to the CPUID name, e.g. GenuineIntel-6-3A-9
|
|
|
+ CPUArch: Refers to the ISA of the CPU, e.g. aarch64
|
|
|
+ CPUFreq: Refers to the CPU frequency in terms of gigahertz, e.g. 0.8GHz
|
|
|
+*/
|
|
|
+
|
|
|
+//usbinfo from https://apple.stackexchange.com/questions/170105/list-usb-devices-on-osx-command-line
|
|
|
+const unknown_string = "??? "
|
|
|
+const query_frequency_command = "sysctl machdep.cpu.brand_string | awk '{print $NF}'"
|
|
|
+const query_cpumodel_command = "sysctl machdep.cpu.brand_string | awk '{for(i=1;++i<=NF-3;) printf $i\" \"; print $(NF-2)}'"
|
|
|
+const query_cpuarch_command = "sysctl hw.machine | awk '{print $NF}'"
|
|
|
+const query_cpuhardware_command = "sysctl machdep.cpu.stepping | awk '{print $NF}'"
|
|
|
+const query_netinfo_command = "networksetup -listallhardwareports"
|
|
|
+const query_usbinfo_command = "ioreg -p IOUSB -w0 | sed 's/[^o]*o //; s/@.*$//' | grep -v '^Root.*'"
|
|
|
+const query_memsize_command = "sysctl hw.memsize | awk '{print $NF}'"
|
|
|
+
|
|
|
+// GetCPUFreq() -> String
|
|
|
+// Returns the CPU frequency in the terms of MHz
|
|
|
+func GetCPUFreq() string {
|
|
|
+ shell := exec.Command("bash", "-c", query_frequency_command) // Run command
|
|
|
+ freqByteArr, err := shell.CombinedOutput() // Response from cmdline
|
|
|
+ if err != nil { // If done w/ errors then
|
|
|
+ log.Println(err)
|
|
|
+ return unknown_string
|
|
|
+ }
|
|
|
+
|
|
|
+ freqStr := strings.ReplaceAll(string(freqByteArr), "GHz", "")
|
|
|
+ freqStr = strings.ReplaceAll(freqStr, "\n", "")
|
|
|
+ freqStr = strings.ReplaceAll(freqStr, " ", "")
|
|
|
+ freqFloat, _ := strconv.ParseFloat(freqStr, 8)
|
|
|
+ freqFloat = freqFloat * 1000
|
|
|
+ freqStrMHz := strconv.FormatFloat(freqFloat, 'f', -1, 64)
|
|
|
+
|
|
|
+ return freqStrMHz
|
|
|
+}
|
|
|
+
|
|
|
+// GetCPUModel -> String
|
|
|
+// Returns the CPU model name string
|
|
|
+func GetCPUModel() string {
|
|
|
+ shell := exec.Command("bash", "-c", query_cpumodel_command) // Run command
|
|
|
+ modelStr, err := shell.CombinedOutput() // Response from cmdline
|
|
|
+ if err != nil { // If done w/ errors then
|
|
|
+ log.Println(err)
|
|
|
+ return unknown_string
|
|
|
+ }
|
|
|
+
|
|
|
+ return string(modelStr)
|
|
|
+}
|
|
|
+
|
|
|
+// GetCPUHardware -> String
|
|
|
+// Returns the CPU ID string
|
|
|
+func GetCPUHardware() string {
|
|
|
+ shell := exec.Command("bash", "-c", query_cpuhardware_command) // Run command
|
|
|
+ hwStr, err := shell.CombinedOutput() // Response from cmdline
|
|
|
+ if err != nil { // If done w/ errors then
|
|
|
+ log.Println(err)
|
|
|
+ return unknown_string
|
|
|
+ }
|
|
|
+
|
|
|
+ return string(hwStr)
|
|
|
+}
|
|
|
+
|
|
|
+// GetCPUArch -> String
|
|
|
+// Returns the CPU architecture string
|
|
|
+func GetCPUArch() string {
|
|
|
+ shell := exec.Command("bash", "-c", query_cpuarch_command) // Run command
|
|
|
+ archStr, err := shell.CombinedOutput() // Response from cmdline
|
|
|
+ if err != nil { // If done w/ errors then
|
|
|
+ log.Println(err)
|
|
|
+ return unknown_string
|
|
|
+ }
|
|
|
+
|
|
|
+ return string(archStr)
|
|
|
+}
|
|
|
+
|
|
|
+// Inherited code from sysinfo_window.go
|
|
|
+func GetCPUInfo(w http.ResponseWriter, r *http.Request) {
|
|
|
+ CPUInfo := CPUInfo{
|
|
|
+ Freq: GetCPUFreq(),
|
|
|
+ Hardware: GetCPUHardware(),
|
|
|
+ Instruction: GetCPUArch(),
|
|
|
+ Model: GetCPUModel(),
|
|
|
+ Revision: "unknown",
|
|
|
+ }
|
|
|
+
|
|
|
+ var jsonData []byte
|
|
|
+ jsonData, err := json.Marshal(CPUInfo)
|
|
|
+ if err != nil {
|
|
|
+ log.Println(err)
|
|
|
+ }
|
|
|
+ utils.SendTextResponse(w, string(jsonData))
|
|
|
+}
|
|
|
+
|
|
|
+// Inherited code from sysinfo.go
|
|
|
+func Ifconfig(w http.ResponseWriter, r *http.Request) {
|
|
|
+ cmdin := query_netinfo_command
|
|
|
+ cmd := exec.Command("bash", "-c", cmdin)
|
|
|
+ networkInterfaces, err := cmd.CombinedOutput()
|
|
|
+ if err != nil {
|
|
|
+ networkInterfaces = []byte{}
|
|
|
+ }
|
|
|
+
|
|
|
+ nic := strings.Split(string(networkInterfaces), "\n")
|
|
|
+
|
|
|
+ var arr []string
|
|
|
+ for _, info := range nic {
|
|
|
+ thisInfo := string(info)
|
|
|
+ arr = append(arr, thisInfo)
|
|
|
+ }
|
|
|
+
|
|
|
+ var jsonData []byte
|
|
|
+ jsonData, err = json.Marshal(arr)
|
|
|
+ if err != nil {
|
|
|
+ log.Println(err)
|
|
|
+ }
|
|
|
+ utils.SendTextResponse(w, string(jsonData))
|
|
|
+}
|
|
|
+
|
|
|
+// Inherited code from sysinfo.go
|
|
|
+func GetDriveStat(w http.ResponseWriter, r *http.Request) {
|
|
|
+ //Get drive status using df command
|
|
|
+ cmdin := `df -k | sed -e /Filesystem/d`
|
|
|
+ cmd := exec.Command("bash", "-c", cmdin)
|
|
|
+ dev, err := cmd.CombinedOutput()
|
|
|
+ if err != nil {
|
|
|
+ dev = []byte{}
|
|
|
+ }
|
|
|
+
|
|
|
+ drives := strings.Split(string(dev), "\n")
|
|
|
+
|
|
|
+ if len(drives) == 0 {
|
|
|
+ utils.SendErrorResponse(w, "Invalid disk information")
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ var arr []LogicalDisk
|
|
|
+ for _, driveInfo := range drives {
|
|
|
+ if driveInfo == "" {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ for strings.Contains(driveInfo, " ") {
|
|
|
+ driveInfo = strings.Replace(driveInfo, " ", " ", -1)
|
|
|
+ }
|
|
|
+ driveInfoChunk := strings.Split(driveInfo, " ")
|
|
|
+ tmp, _ := strconv.Atoi(driveInfoChunk[3])
|
|
|
+ freespaceInByte := int64(tmp)
|
|
|
+
|
|
|
+ LogicalDisk := LogicalDisk{
|
|
|
+ DriveLetter: driveInfoChunk[8],
|
|
|
+ FileSystem: driveInfoChunk[0],
|
|
|
+ FreeSpace: strconv.FormatInt(freespaceInByte*1024, 10), //df show disk space in 1KB blocks
|
|
|
+ }
|
|
|
+ arr = append(arr, LogicalDisk)
|
|
|
+ }
|
|
|
+
|
|
|
+ var jsonData []byte
|
|
|
+ jsonData, err = json.Marshal(arr)
|
|
|
+ if err != nil {
|
|
|
+ log.Println(err)
|
|
|
+ }
|
|
|
+ utils.SendTextResponse(w, string(jsonData))
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+// GetUSB(ResponseWriter, HttpRequest) -> nil
|
|
|
+// Takes in http.ResponseWriter w and *http.Request r,
|
|
|
+// Send TextResponse containing USB information extracted from shell in JSON
|
|
|
+func GetUSB(w http.ResponseWriter, r *http.Request) {
|
|
|
+ cmdin := query_usbinfo_command
|
|
|
+ cmd := exec.Command("bash", "-c", cmdin)
|
|
|
+ usbd, err := cmd.CombinedOutput()
|
|
|
+ if err != nil {
|
|
|
+ usbd = []byte{}
|
|
|
+ }
|
|
|
+
|
|
|
+ usbDrives := strings.Split(string(usbd), "\n")
|
|
|
+
|
|
|
+ var arr []string
|
|
|
+ for _, info := range usbDrives {
|
|
|
+ arr = append(arr, info)
|
|
|
+ }
|
|
|
+
|
|
|
+ var jsonData []byte
|
|
|
+ jsonData, err = json.Marshal(arr)
|
|
|
+ if err != nil {
|
|
|
+ log.Println(err)
|
|
|
+ }
|
|
|
+ utils.SendTextResponse(w, string(jsonData))
|
|
|
+}
|
|
|
+
|
|
|
+// GetRamInfo(w ResponseWriter, r *HttpRequest) -> nil
|
|
|
+// Takes in http.ResponseWriter w and *http.Request r,
|
|
|
+// Send TextResponse containing physical memory size
|
|
|
+// extracted from shell in JSON
|
|
|
+func GetRamInfo(w http.ResponseWriter, r *http.Request) {
|
|
|
+ cmd := exec.Command("bash", "-c", query_memsize_command)
|
|
|
+ out, _ := cmd.CombinedOutput()
|
|
|
+
|
|
|
+ strOut := string(out)
|
|
|
+ strOut = strings.ReplaceAll(strOut, "\n", "")
|
|
|
+ ramSize, _ := strconv.ParseInt(strOut, 10, 64)
|
|
|
+ ramSizeInt := ramSize
|
|
|
+
|
|
|
+ var jsonData []byte
|
|
|
+ jsonData, err := json.Marshal(ramSizeInt)
|
|
|
+ if err != nil {
|
|
|
+ log.Println(err)
|
|
|
+ }
|
|
|
+ utils.SendTextResponse(w, string(jsonData))
|
|
|
+}
|