sysinfo_freebsd.go 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. // +build freebsd
  2. package hardwareinfo
  3. import (
  4. "encoding/json"
  5. "log"
  6. "net/http"
  7. "os/exec"
  8. "strconv"
  9. "strings"
  10. )
  11. /*
  12. System Info
  13. author: HyperXraft
  14. date: 2021-02-18
  15. This module get the CPU information on different platform using
  16. native terminal commands on FreeBSD platform
  17. DEFINITIONS
  18. ===========
  19. CPUModel: Refers to the Marketing name of the CPU, e.g. Intel Xeon E7 8890
  20. CPUHardware: Refers to the CPUID name, e.g. GenuineIntel-6-3A-9
  21. CPUArch: Refers to the ISA of the CPU, e.g. aarch64
  22. CPUFreq: Refers to the CPU frequency in terms of gigahertz, e.g. 0.8GHz
  23. */
  24. const UNKNOWN_STRING = "??? "
  25. const QUERY_FREQUENCY_COMMAND = "sysctl hw.model | awk '{print $NF}'"
  26. const QUERY_CPUMODEL_COMMAND = "sysctl hw.model | awk '{for(i=1;++i<=NF-3;) printf $i\" \"; print $(NF-2)}'"
  27. const QUERY_CPUARCH_COMMAND = "sysctl hw.machine_arch | awk '{print $NF}'"
  28. const QUERY_CPUHARDWARE_COMMAND = "sysctl kern.hwpmc.cpuid | awk '{print $NF}'"
  29. const QUERY_NETINFO_COMMAND = "ifconfig -a"
  30. const QUERY_USBINFO_COMMAND = "usbconfig"
  31. const QUERY_MEMSIZE_COMMAND = "sysctl hw.physmem | awk '{print $NF}'"
  32. // GetCPUFreq() -> String
  33. // Returns the CPU frequency in the terms of MHz
  34. func GetCPUFreq() string {
  35. cmd := QUERY_FREQUENCY_COMMAND // Query CPUFreq w/ sysctl
  36. shell := exec.Command("bash", "-c", cmd) // Run command
  37. freqByteArr, err := shell.CombinedOutput() // Response from cmdline
  38. if err != nil { // If done w/ errors then
  39. log.Println(err)
  40. return UNKNOWN_STRING
  41. }
  42. freqStr := strings.ReplaceAll(string(freqByteArr), "GHz", "")
  43. freqStr = strings.ReplaceAll(freqStr, "\n", "")
  44. freqStr = strings.ReplaceAll(freqStr, " ", "")
  45. freqFloat, _ := strconv.ParseFloat(freqStr, 8)
  46. freqFloat = freqFloat * 1000
  47. freqStrMHz := strconv.FormatFloat(freqFloat, 'f', -1, 64)
  48. return freqStrMHz
  49. }
  50. // GetCPUModel -> String
  51. // Returns the CPU model name string
  52. func GetCPUModel() string {
  53. cmd := QUERY_CPUMODEL_COMMAND // Query CPUModel w/ sysctl
  54. shell := exec.Command("bash", "-c", cmd) // Run command
  55. modelStr, err := shell.CombinedOutput() // Response from cmdline
  56. if err != nil { // If done w/ errors then
  57. log.Println(err)
  58. return UNKNOWN_STRING
  59. }
  60. return string(modelStr)
  61. }
  62. // GetCPUHardware -> String
  63. // Returns the CPU ID string
  64. func GetCPUHardware() string {
  65. cmd := QUERY_CPUHARDWARE_COMMAND // Query CPUHW w/ sysctl
  66. shell := exec.Command("bash", "-c", cmd) // Run command
  67. hwStr, err := shell.CombinedOutput() // Response from cmdline
  68. if err != nil { // If done w/ errors then
  69. log.Println(err)
  70. return UNKNOWN_STRING
  71. }
  72. return string(hwStr)
  73. }
  74. // GetCPUArch -> String
  75. // Returns the CPU architecture string
  76. func GetCPUArch() string {
  77. cmd := QUERY_CPUARCH_COMMAND // Query CPUArch w/ sysctl
  78. shell := exec.Command("bash", "-c", cmd) // Run command
  79. archStr, err := shell.CombinedOutput() // Response from cmdline
  80. if err != nil { // If done w/ errors then
  81. log.Println(err)
  82. return UNKNOWN_STRING
  83. }
  84. return string(archStr)
  85. }
  86. // Inherited code from sysinfo_window.go
  87. func GetCPUInfo(w http.ResponseWriter, r *http.Request) {
  88. CPUInfo := CPUInfo{
  89. Freq: GetCPUFreq(),
  90. Hardware: GetCPUHardware(),
  91. Instruction: GetCPUArch(),
  92. Model: GetCPUModel(),
  93. Revision: "unknown",
  94. }
  95. var jsonData []byte
  96. jsonData, err := json.Marshal(CPUInfo)
  97. if err != nil {
  98. log.Println(err)
  99. }
  100. sendTextResponse(w, string(jsonData))
  101. }
  102. // Inherited code from sysinfo.go
  103. func Ifconfig(w http.ResponseWriter, r *http.Request) {
  104. cmdin := QUERY_NETINFO_COMMAND
  105. cmd := exec.Command("bash", "-c", cmdin)
  106. networkInterfaces, err := cmd.CombinedOutput()
  107. if err != nil {
  108. networkInterfaces = []byte{}
  109. }
  110. nic := strings.Split(string(networkInterfaces), "\n")
  111. var arr []string
  112. for _, info := range nic {
  113. thisInfo := string(info)
  114. arr = append(arr, thisInfo)
  115. }
  116. var jsonData []byte
  117. jsonData, err = json.Marshal(arr)
  118. if err != nil {
  119. log.Println(err)
  120. }
  121. sendTextResponse(w, string(jsonData))
  122. }
  123. // Inherited code from sysinfo.go
  124. func GetDriveStat(w http.ResponseWriter, r *http.Request) {
  125. //Get drive status using df command
  126. cmdin := `df -k | sed -e /Filesystem/d`
  127. cmd := exec.Command("bash", "-c", cmdin)
  128. dev, err := cmd.CombinedOutput()
  129. if err != nil {
  130. dev = []byte{}
  131. }
  132. drives := strings.Split(string(dev), "\n")
  133. if len(drives) == 0 {
  134. sendErrorResponse(w, "Invalid disk information")
  135. return
  136. }
  137. var arr []LogicalDisk
  138. for _, driveInfo := range drives {
  139. if driveInfo == "" {
  140. continue
  141. }
  142. for strings.Contains(driveInfo, " ") {
  143. driveInfo = strings.Replace(driveInfo, " ", " ", -1)
  144. }
  145. driveInfoChunk := strings.Split(driveInfo, " ")
  146. tmp, _ := strconv.Atoi(driveInfoChunk[3])
  147. freespaceInByte := int64(tmp)
  148. LogicalDisk := LogicalDisk{
  149. DriveLetter: driveInfoChunk[5],
  150. FileSystem: driveInfoChunk[0],
  151. FreeSpace: strconv.FormatInt(freespaceInByte*1024, 10), //df show disk space in 1KB blocks
  152. }
  153. arr = append(arr, LogicalDisk)
  154. }
  155. var jsonData []byte
  156. jsonData, err = json.Marshal(arr)
  157. if err != nil {
  158. log.Println(err)
  159. }
  160. sendTextResponse(w, string(jsonData))
  161. }
  162. // GetUSB(ResponseWriter, HttpRequest) -> nil
  163. // Takes in http.ResponseWriter w and *http.Request r,
  164. // Send TextResponse containing USB information extracted from shell in JSON
  165. func GetUSB(w http.ResponseWriter, r *http.Request) {
  166. cmdin := QUERY_USBINFO_COMMAND
  167. cmd := exec.Command("bash", "-c", cmdin)
  168. usbd, err := cmd.CombinedOutput()
  169. if err != nil {
  170. usbd = []byte{}
  171. }
  172. usbDrives := strings.Split(string(usbd), "\n")
  173. var arr []string
  174. for _, info := range usbDrives {
  175. arr = append(arr, info)
  176. }
  177. var jsonData []byte
  178. jsonData, err = json.Marshal(arr)
  179. if err != nil {
  180. log.Println(err)
  181. }
  182. sendTextResponse(w, string(jsonData))
  183. }
  184. // GetRamInfo(w ResponseWriter, r *HttpRequest) -> nil
  185. // Takes in http.ResponseWriter w and *http.Request r,
  186. // Send TextResponse containing physical memory size
  187. // extracted from shell in JSON
  188. func GetRamInfo(w http.ResponseWriter, r *http.Request) {
  189. cmd := exec.Command("bash", "-c", QUERY_MEMSIZE_COMMAND)
  190. out, _ := cmd.CombinedOutput()
  191. strOut := string(out)
  192. strOut = strings.ReplaceAll(strOut, "\n", "")
  193. ramSize, _ := strconv.ParseInt(strOut, 10, 64)
  194. ramSizeInt := ramSize
  195. var jsonData []byte
  196. jsonData, err := json.Marshal(ramSizeInt)
  197. if err != nil {
  198. log.Println(err)
  199. }
  200. sendTextResponse(w, string(jsonData))
  201. }