sysinfo.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494
  1. /*************************************************************************
  2. > File Name: sysinfo.cpp
  3. > Author: xuwenlong
  4. > Mail: myxuan475@126.com
  5. > Created Time: 2018年07月17日 星期二 16时09分32秒
  6. ************************************************************************/
  7. #include "sysinfo.h"
  8. #include <arpa/inet.h>
  9. #include <ctype.h>
  10. #include <errno.h>
  11. #include <error.h>
  12. #include <ifaddrs.h>
  13. #include <net/if.h>
  14. #include <net/route.h>
  15. #include <netinet/in.h>
  16. #include <resolv.h>
  17. #include <stdio.h>
  18. #include <stdlib.h>
  19. #include <string.h>
  20. #include <sys/ioctl.h>
  21. #include <sys/socket.h>
  22. #include <sys/types.h>
  23. #include <unistd.h>
  24. #include <utils/logger.h>
  25. namespace settings {
  26. namespace sysinfo {
  27. double cal_occupy(CPU_OCCUPY *o, CPU_OCCUPY *n)
  28. {
  29. double od, nd;
  30. double id, sd;
  31. double scale;
  32. od = (double)(o->user + o->nice + o->system + o->idle); // 第一次(用户+优先级+系统+空闲)的时间再赋给od
  33. nd = (double)(n->user + n->nice + n->system + n->idle); // 第二次(用户+优先级+系统+空闲)的时间再赋给od
  34. scale = 100.0 / (float)(nd - od); // 100除强制转换(nd-od)之差为float类型再赋给scale这个变量
  35. id = (double)(n->user - o->user); // 用户第一次和第二次的时间之差再赋给id
  36. sd = (double)(n->system - o->system); // 系统第一次和第二次的时间之差再赋给sd
  37. return ((sd + id) * 100.0) / (nd - od); //((用户+系统)乖100)除(第一次和第二次的时间差)再赋给g_cpu_used
  38. }
  39. void get_occupy(CPU_OCCUPY *o)
  40. {
  41. FILE *fd;
  42. int n;
  43. char buff[MAXBUFSIZE];
  44. fd = fopen("/proc/stat",
  45. "r"); // 这里只读取stat文件的第一行及cpu总信息,如需获取每核cpu的使用情况,请分析stat文件的接下来几行。
  46. (void)fgets(buff, sizeof(buff), fd);
  47. sscanf(buff, "%s %u %u %u %u", o->name, &o->user, &o->nice, &o->system, &o->idle);
  48. fclose(fd);
  49. }
  50. void get_mem_occupy(MEM_OCCUPY *mem)
  51. {
  52. FILE *fd;
  53. char buff[MAXBUFSIZE];
  54. fd = fopen("/proc/meminfo", "r");
  55. (void)fgets(buff, sizeof(buff), fd);
  56. sscanf(buff, "%s %lld", mem->name, &mem->total);
  57. (void)fgets(buff, sizeof(buff), fd);
  58. sscanf(buff, "%s %lld", mem->name2, &mem->free);
  59. fclose(fd);
  60. }
  61. float get_io_occupy()
  62. {
  63. char cmd[] = "iostat -d -k";
  64. char buffer[MAXBUFSIZE];
  65. char a[20];
  66. float arr[20];
  67. FILE *pipe = popen(cmd, "r");
  68. if (!pipe)
  69. return -1;
  70. (void)fgets(buffer, sizeof(buffer), pipe);
  71. (void)fgets(buffer, sizeof(buffer), pipe);
  72. (void)fgets(buffer, sizeof(buffer), pipe);
  73. (void)fgets(buffer, sizeof(buffer), pipe);
  74. sscanf(buffer, "%s %f %f %f %f %f %f %f %f %f %f %f %f %f ", a, &arr[0], &arr[1], &arr[2], &arr[3], &arr[4],
  75. &arr[5], &arr[6], &arr[7], &arr[8], &arr[9], &arr[10], &arr[11], &arr[12]);
  76. // printf("%f\n",arr[12]);
  77. pclose(pipe);
  78. return arr[12];
  79. }
  80. void get_disk_occupy(char **reused)
  81. {
  82. char currentDirectoryPath[MAXBUFSIZE];
  83. (void)getcwd(currentDirectoryPath, MAXBUFSIZE);
  84. // printf("当前目录:%s\n",currentDirectoryPath);
  85. char cmd[50] = "df ";
  86. strcat(cmd, currentDirectoryPath);
  87. // printf("%s\n",cmd);
  88. char buffer[MAXBUFSIZE];
  89. FILE *pipe = popen(cmd, "r");
  90. char fileSys[20];
  91. char blocks[20];
  92. char used[20];
  93. char free[20];
  94. char percent[10];
  95. char moment[20];
  96. if (!pipe)
  97. return;
  98. if (fgets(buffer, sizeof(buffer), pipe) != NULL) {
  99. sscanf(buffer, "%s %s %s %s %s %s", fileSys, blocks, used, free, percent, moment);
  100. }
  101. if (fgets(buffer, sizeof(buffer), pipe) != NULL) {
  102. sscanf(buffer, "%s %s %s %s %s %s", fileSys, blocks, used, free, percent, moment);
  103. }
  104. // printf("desk used:%s\n",percent);
  105. strcpy(*reused, percent);
  106. pclose(pipe);
  107. return;
  108. }
  109. void getCurrentDownloadRates(long int *save_rate)
  110. {
  111. char intface[] = "eth0:"; // 这是网络接口名,根据主机配置
  112. // char intface[] = "wlan0:";
  113. FILE *net_dev_file;
  114. char buffer[1024];
  115. size_t bytes_read;
  116. char *match;
  117. if ((net_dev_file = fopen("/proc/net/dev", "r")) == NULL) {
  118. HTELINK_LOG_ERR("open /proc/net/dev error, %s", strerror(errno));
  119. // exit(EXIT_FAILURE);
  120. return;
  121. }
  122. int i = 0;
  123. while (i++ < 20) {
  124. if (fgets(buffer, sizeof(buffer), net_dev_file) != NULL) {
  125. if (strstr(buffer, intface) != NULL) {
  126. // printf("%d %s\n",i,buffer);
  127. sscanf(buffer, "%s %ld", buffer, save_rate);
  128. break;
  129. }
  130. }
  131. }
  132. if (i == 20)
  133. *save_rate = 0.01;
  134. fclose(net_dev_file); // 关闭文件
  135. return;
  136. }
  137. int SetIfAddr(const char *ifname, const char *Ipaddr, const char *mask, const char *gateway)
  138. {
  139. int fd;
  140. int rc;
  141. struct ifreq ifr;
  142. struct sockaddr_in *sin;
  143. struct rtentry rt;
  144. fd = socket(AF_INET, SOCK_DGRAM, 0);
  145. if (fd < 0) {
  146. HTELINK_LOG_ERR("socket %s, error, %s", ifname, strerror(errno));
  147. return fd;
  148. }
  149. memset(&ifr, 0, sizeof(ifr));
  150. strcpy(ifr.ifr_name, ifname);
  151. sin = (struct sockaddr_in *)&ifr.ifr_addr;
  152. sin->sin_family = AF_INET;
  153. // ipaddr
  154. if ((rc = inet_aton(Ipaddr, &(sin->sin_addr))) < 0) {
  155. HTELINK_LOG_ERR("inet_aton %s, error, %s", ifname, strerror(errno));
  156. close(fd);
  157. return rc;
  158. }
  159. if ((rc = ioctl(fd, SIOCSIFADDR, &ifr)) < 0) {
  160. HTELINK_LOG_ERR("ioctl ifaddr %s, error, %s", ifname, strerror(errno));
  161. close(fd);
  162. return rc;
  163. }
  164. // netmask
  165. if ((rc = inet_aton(mask, &(sin->sin_addr))) < 0) {
  166. HTELINK_LOG_ERR("inet_aton %s, mask error, %s", ifname, strerror(errno));
  167. close(fd);
  168. return rc;
  169. }
  170. if ((rc = ioctl(fd, SIOCSIFNETMASK, &ifr)) < 0) {
  171. HTELINK_LOG_ERR("ioctl %s, netmask error, %s", ifname, strerror(errno));
  172. close(fd);
  173. return rc;
  174. }
  175. // gateway
  176. memset(&rt, 0, sizeof(struct rtentry));
  177. memset(sin, 0, sizeof(struct sockaddr_in));
  178. sin->sin_family = AF_INET;
  179. sin->sin_port = 0;
  180. if ((rc = inet_aton(gateway, &sin->sin_addr)) < 0) {
  181. HTELINK_LOG_ERR("inet_aton %s, error, %s", ifname, strerror(errno));
  182. }
  183. memcpy(&rt.rt_gateway, sin, sizeof(struct sockaddr_in));
  184. ((struct sockaddr_in *)&rt.rt_dst)->sin_family = AF_INET;
  185. ((struct sockaddr_in *)&rt.rt_genmask)->sin_family = AF_INET;
  186. rt.rt_flags = RTF_GATEWAY;
  187. if ((rc = ioctl(fd, SIOCADDRT, &rt)) < 0) {
  188. HTELINK_LOG_ERR("ioctl(SIOCADDRT) %s error in set_default_route, %s", ifname, strerror(errno));
  189. close(fd);
  190. return rc;
  191. }
  192. close(fd);
  193. return 0;
  194. }
  195. /*
  196. * 获取IP
  197. */
  198. int GetIfAddr(const char *iface, char ipaddr[], char mask[], char gateway[])
  199. {
  200. int sockfd;
  201. int rc;
  202. struct sockaddr_in *sin;
  203. struct ifreq ifr_ip;
  204. struct rtentry rt;
  205. if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
  206. HTELINK_LOG_ERR("%s socket create failse...GetLocalIp! %s", iface, strerror(errno));
  207. return sockfd;
  208. }
  209. /* zero struct */
  210. memset(&ifr_ip, 0, sizeof(ifr_ip));
  211. strncpy(ifr_ip.ifr_name, iface, sizeof(ifr_ip.ifr_name) - 1);
  212. /* get ip */
  213. if ((rc = ioctl(sockfd, SIOCGIFADDR, &ifr_ip)) < 0) {
  214. HTELINK_LOG_ERR("ioctl ip %s, error, %s", iface, strerror(errno));
  215. close(sockfd);
  216. return rc;
  217. }
  218. sin = (struct sockaddr_in *)&ifr_ip.ifr_addr;
  219. strcpy(ipaddr, inet_ntoa(sin->sin_addr));
  220. /* get netmask */
  221. if ((rc = ioctl(sockfd, SIOCGIFNETMASK, &ifr_ip)) < 0) {
  222. HTELINK_LOG_ERR("netmask ioctl %s, error, %s", iface, strerror(errno));
  223. close(sockfd);
  224. return rc;
  225. }
  226. sin = (struct sockaddr_in *)&(ifr_ip.ifr_netmask);
  227. strcpy(mask, inet_ntoa(sin->sin_addr));
  228. /* gateway */
  229. if ((rc = ioctl(sockfd, SIOCGIFCONF, &ifr_ip)) < 0) {
  230. HTELINK_LOG_ERR("gateway ioctl %s, error, %s", iface, strerror(errno));
  231. close(sockfd);
  232. return rc;
  233. }
  234. sin = (struct sockaddr_in *)&(ifr_ip.ifr_addr);
  235. inet_ntop(AF_INET, &sin->sin_addr, gateway, INET_ADDRSTRLEN);
  236. close(sockfd);
  237. return rc;
  238. }
  239. /*
  240. * 获取IP
  241. */
  242. bool GetLocalIp(char ipaddr[])
  243. {
  244. return GetLocalIp("eth0", ipaddr);
  245. }
  246. bool GetLocalIp(const char *iface, char ipaddr[])
  247. {
  248. int sock_get_ip;
  249. struct sockaddr_in *sin;
  250. struct ifreq ifr_ip;
  251. if ((sock_get_ip = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
  252. printf("socket create failse...GetLocalIp!/n");
  253. return false;
  254. }
  255. memset(&ifr_ip, 0, sizeof(ifr_ip));
  256. strncpy(ifr_ip.ifr_name, iface, sizeof(ifr_ip.ifr_name) - 1);
  257. if (ioctl(sock_get_ip, SIOCGIFADDR, &ifr_ip) < 0) {
  258. return false;
  259. }
  260. sin = (struct sockaddr_in *)&ifr_ip.ifr_addr;
  261. strcpy(ipaddr, inet_ntoa(sin->sin_addr));
  262. printf("local ip:%s /n", ipaddr);
  263. close(sock_get_ip);
  264. return true;
  265. }
  266. /*
  267. * 修改本机IP地址的函数
  268. */
  269. int SetLocalIp(const char *iface, const char *ipaddr)
  270. {
  271. int sock_set_ip;
  272. struct sockaddr_in sin_set_ip;
  273. struct ifreq ifr_set_ip;
  274. bzero(&ifr_set_ip, sizeof(ifr_set_ip));
  275. if (ipaddr == NULL)
  276. return -1;
  277. if (sock_set_ip = socket(AF_INET, SOCK_STREAM, 0) == -1)
  278. ;
  279. {
  280. perror("socket create failse...SetLocalIp!/n");
  281. return -1;
  282. }
  283. memset(&sin_set_ip, 0, sizeof(sin_set_ip));
  284. strncpy(ifr_set_ip.ifr_name, iface, sizeof(ifr_set_ip.ifr_name) - 1);
  285. sin_set_ip.sin_family = AF_INET;
  286. sin_set_ip.sin_addr.s_addr = inet_addr(ipaddr);
  287. memcpy(&ifr_set_ip.ifr_addr, &sin_set_ip, sizeof(sin_set_ip));
  288. if (ioctl(sock_set_ip, SIOCSIFADDR, &ifr_set_ip) < 0) {
  289. perror("Not setup interface/n");
  290. return -1;
  291. }
  292. // 设置激活标志
  293. ifr_set_ip.ifr_flags |= IFF_UP | IFF_RUNNING;
  294. // get the status of the device
  295. if (ioctl(sock_set_ip, SIOCSIFFLAGS, &ifr_set_ip) < 0) {
  296. perror("SIOCSIFFLAGS");
  297. return -1;
  298. }
  299. close(sock_set_ip);
  300. return 0;
  301. }
  302. /*
  303. *获取子网掩码的函数
  304. */
  305. bool GetLocalNetMask(const char *ifname, char netmask_addr[])
  306. {
  307. int sock_netmask;
  308. struct ifreq ifr_mask;
  309. struct sockaddr_in *net_mask;
  310. sock_netmask = socket(AF_INET, SOCK_STREAM, 0);
  311. if (sock_netmask == -1) {
  312. perror("create socket failture...GetLocalNetMask/n");
  313. return false;
  314. }
  315. memset(&ifr_mask, 0, sizeof(ifr_mask));
  316. strncpy(ifr_mask.ifr_name, ifname, sizeof(ifr_mask.ifr_name) - 1);
  317. if ((ioctl(sock_netmask, SIOCGIFNETMASK, &ifr_mask)) < 0) {
  318. printf("mac ioctl error/n");
  319. return false;
  320. }
  321. net_mask = (struct sockaddr_in *)&(ifr_mask.ifr_netmask);
  322. strcpy(netmask_addr, inet_ntoa(net_mask->sin_addr));
  323. printf("local netmask:%s/n", netmask_addr);
  324. close(sock_netmask);
  325. return true;
  326. }
  327. /*
  328. * 修改子NETMASK的函数
  329. */
  330. bool SetLocalNetMask(const char *iface, const char *szNetMask)
  331. {
  332. int sock_netmask;
  333. char netmask_addr[32];
  334. struct ifreq ifr_mask;
  335. struct sockaddr_in *sin_net_mask;
  336. sock_netmask = socket(AF_INET, SOCK_STREAM, 0);
  337. if (sock_netmask == -1) {
  338. perror("Not create network socket connect/n");
  339. return false;
  340. }
  341. memset(&ifr_mask, 0, sizeof(ifr_mask));
  342. strncpy(ifr_mask.ifr_name, iface, sizeof(ifr_mask.ifr_name) - 1);
  343. sin_net_mask = (struct sockaddr_in *)&ifr_mask.ifr_addr;
  344. sin_net_mask->sin_family = AF_INET;
  345. inet_pton(AF_INET, szNetMask, &sin_net_mask->sin_addr);
  346. if (ioctl(sock_netmask, SIOCSIFNETMASK, &ifr_mask) < 0) {
  347. printf("sock_netmask ioctl error/n");
  348. return false;
  349. }
  350. return true;
  351. }
  352. /*
  353. * 获去GateWay
  354. */
  355. bool GetGateWay(char gateway[])
  356. {
  357. FILE *fp;
  358. char buf[512];
  359. char cmd[128];
  360. strcpy(cmd, "route -n|grep 'UG'");
  361. fp = popen(cmd, "r");
  362. if (NULL == fp) {
  363. perror("popen error");
  364. return false;
  365. }
  366. size_t r = fread(buf, 1, sizeof(buf), fp);
  367. sscanf(buf, "%*s%s", gateway);
  368. pclose(fp);
  369. return true;
  370. }
  371. /*
  372. * 设置网关
  373. */
  374. int SetGateWay(const char *szGateWay)
  375. {
  376. int ret = 0;
  377. char cmd[128];
  378. char strGW[50];
  379. GetGateWay(strGW);
  380. strcpy(cmd, "route del default gw ");
  381. strcat(cmd, strGW);
  382. ret = system(cmd);
  383. if (ret < 0) {
  384. perror("route error");
  385. return -1;
  386. }
  387. strcpy(cmd, "route add default gw ");
  388. strcat(cmd, szGateWay);
  389. ret = system(cmd);
  390. if (ret < 0) {
  391. perror("route error");
  392. return -1;
  393. }
  394. return ret;
  395. }
  396. /*
  397. *获取本机MAC地址函数
  398. */
  399. bool GetLocalMac(const char *eth, char mac_addr[30])
  400. {
  401. int sock_mac;
  402. struct ifreq ifr_mac;
  403. sock_mac = socket(AF_INET, SOCK_STREAM, 0);
  404. if (sock_mac == -1) {
  405. perror("create socket falise...mac");
  406. return false;
  407. }
  408. memset(&ifr_mac, 0, sizeof(ifr_mac));
  409. strncpy(ifr_mac.ifr_name, eth, sizeof(ifr_mac.ifr_name) - 1);
  410. if ((ioctl(sock_mac, SIOCGIFHWADDR, &ifr_mac)) < 0) {
  411. printf("mac ioctl error/n");
  412. return false;
  413. }
  414. sprintf(mac_addr, "%02X:%02X:%02X:%02X:%02X:%02X", (unsigned char)ifr_mac.ifr_hwaddr.sa_data[0],
  415. (unsigned char)ifr_mac.ifr_hwaddr.sa_data[1], (unsigned char)ifr_mac.ifr_hwaddr.sa_data[2],
  416. (unsigned char)ifr_mac.ifr_hwaddr.sa_data[3], (unsigned char)ifr_mac.ifr_hwaddr.sa_data[4],
  417. (unsigned char)ifr_mac.ifr_hwaddr.sa_data[5]);
  418. printf("local mac:%s /n", mac_addr);
  419. close(sock_mac);
  420. return true;
  421. }
  422. } // namespace sysinfo
  423. } // namespace settings