ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/cms/source/host/ihost-perl/plugins/linux/linux.c
Revision: 1.9
Committed: Tue Apr 23 14:22:35 2002 UTC (23 years, 7 months ago) by pajs
Content type: text/plain
Branch: MAIN
Changes since 1.8: +37 -1 lines
Log Message:
Allowed old systems to use the host that dont have the getloadavg call.

File Contents

# Content
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include "ukcprog.h"
4 #include <string.h>
5 #include <unistd.h>
6 #include <sys/utsname.h>
7 #include <sys/vfs.h>
8 #include <utmp.h>
9 #include <pwd.h>
10 #include <mntent.h>
11
12 int die() {
13 exit (1);
14 }
15
16 void getLoadAv() {
17 #ifdef OLDLIBC
18
19 FILE *f;
20 char *loadavg;
21 char *load_p;
22
23 if ((f=fopen("/proc/loadavg", "r" ))==NULL) {
24 errf("Failed to open load averages (%m)");
25 die();
26 }
27
28 if ((loadavg=fpgetline(f)) == NULL) {
29 errf("Failed to read any data for load averages (%m)");
30 die();
31 }
32
33 if ((fclose(f)) != 0) {
34 errf("Failed to close file (%m).");
35 die();
36 }
37
38 load_p=strtok(loadavg, " ");
39 printf("packet.load.load1 %s\n",load_p);
40 for(; (*load_p != ' ') && (*load_p != '\0'); load_p++);
41 load_p++;
42 if (load_p == NULL) abort();
43 load_p=strtok(load_p, " ");
44 if (load_p == NULL) abort();
45 printf("packet.load.load5 %s\n",load_p);
46 for(; (*load_p != ' ') && (*load_p != '\0'); load_p++);
47 load_p++;
48 if (load_p == NULL) abort();
49 load_p=strtok(load_p, " ");
50 if (load_p == NULL) abort();
51 printf("packet.load.load15 %s\n",load_p);
52
53 #else
54 double loadav[3];
55
56 if((getloadavg(loadav,3)) == -1){
57 errf("Failed to get load averages (%m)");
58 die();
59 }
60
61 printf("packet.load.load1 %.2f\n",loadav[0]);
62 printf("packet.load.load5 %.2f\n",loadav[1]);
63 printf("packet.load.load15 %.2f\n",loadav[2]);
64 #endif
65 }
66
67 void getMemInfo() {
68 char *line;
69 char *mem=NULL;
70 char *swap=NULL;
71 char *ch;
72 long memstat[6];
73 long swapstat[3];
74 long tmp;
75 int counter=0;
76
77 FILE *f;
78
79 if ((f=fopen("/proc/meminfo", "r" ))==NULL) {
80 errf("Failed to open memory stats (%m)");
81 die();
82 }
83
84 while(((line=fpgetline(f)) != NULL) && (counter < 2)) {
85 if (((strncmp("Mem: ",line,5)) == 0)) {
86 mem=strdup(line);
87 counter++;
88 }
89 if (((strncmp(line,"Swap: ",6)) == 0)) {
90 swap=strdup(line);
91 counter++;
92 }
93 }
94
95 if ((fclose(f)) != 0) {
96 errf("Failed to close file (%m).");
97 die();
98 }
99
100 if (mem==NULL || swap==NULL){
101 errf("Failed to obtain information required for memory and swap stats");
102 die();
103 }
104
105 /* Get the info we want from the 2 read in lines */
106
107 ch = strchr(mem, ' ');
108 if (ch == NULL) abort();
109 *ch = '\0';
110 ch++;
111
112 /* By now we should of skipped the mem: bit.. onto the numbers */
113
114 for(counter=0;counter<6;counter++) {
115 for (; (*ch == ' '); ch++);
116 if (ch == NULL) abort();
117 memstat[counter]=atol(ch);
118 ch++;
119 for(; (*ch != ' ') && (*ch != '\0'); ch++);
120 if (ch == NULL) abort();
121 }
122
123 /* Now swap.. */
124 ch = strchr(swap, ' ');
125 if (ch == NULL) abort();
126 *ch = '\0';
127 ch++;
128
129 for(counter=0;counter<3;counter++) {
130 for (; (*ch == ' '); ch++);
131 if (ch == NULL) abort();
132 swapstat[counter]=atol(ch);
133 ch++;
134 for(; (*ch != ' ') && (*ch != '\0'); ch++);
135 if (ch == NULL) abort();
136 }
137
138 printf("packet.memory.total %ld\n",((memstat[0]/1024)/1024));
139
140 /* Due to batty linux we do some maths to work out roughly what the free ram is */
141 tmp=((memstat[1] - memstat[4])/1024)/1024;
142 printf("packet.memory.used %ld\n",tmp);
143 tmp=((memstat[2] + memstat[4])/1024)/1024;
144 printf("packet.memory.free %ld\n",tmp);
145
146 printf("packet.swap.total %ld\n",((swapstat[0]/1024)/1024));
147 printf("packet.swap.used %ld\n",((swapstat[1]/1024)/1024));
148 printf("packet.swap.free %ld\n",((swapstat[2])/1024)/1024);
149
150 free(mem);
151 free(swap);
152 }
153
154 void cpustats() {
155 char *tmp;
156 char *line[2];
157 char *line_p[2];
158 long cpustats[4][2];
159 long user, kernel, idle;
160 long total;
161 int x,y;
162 float usage;
163 FILE *f;
164
165 if ((f=fopen("/proc/stat", "r" ))==NULL) {
166 errf("Failed to open cpu stats (%m)");
167 die();
168 }
169
170 if((tmp=fpgetline(f)) == NULL) {
171 errf("Failed to read cpu stats (%m)");
172 die();
173 }
174
175 if((line[0]=strdup(tmp)) == NULL) {
176 errf("strdup failed (%m)");
177 die();
178 }
179
180 if ((fclose(f)) != 0) {
181 errf("Failed to close file (%m).");
182 die();
183 }
184
185 sleep(1);
186
187 if ((f=fopen("/proc/stat", "r" ))==NULL) {
188 errf("Failed to open cpu stats (%m)");
189 die();
190 }
191
192 if((tmp=fpgetline(f)) == NULL) {
193 errf("Failed to read cpu stats (%m)");
194 die();
195 }
196
197 if((line[1]=strdup(tmp)) == NULL) {
198 errf("strdup failed (%m)");
199 die();
200 }
201
202 if ((fclose(f)) != 0) {
203 errf("Failed to close file (%m).");
204 die();
205 }
206
207 for(x=0;x<2;x++) {
208 line_p[x] = strchr(line[x], ' ');
209 if (line_p[x] == NULL) abort();
210 *line_p[x] = '\0';
211 line_p[x]++;
212 }
213
214 /* Now should be passed "cpu " */
215
216 for(x=0;x<2;x++) {
217 for(y=0;y<4;y++) {
218 for (; (*line_p[x] == ' '); line_p[x]++);
219 if (line_p[x] == NULL) abort();
220 cpustats[y][x]=atol(line_p[x]);
221 line_p[x]++;
222 for(; (*line_p[x] != ' ') && (*line_p[x] != '\0'); line_p[x]++);
223 if (line_p[x] == NULL) abort();
224 for (; (*line_p[x] == ' '); line_p[x]++);
225 }
226 }
227
228 user=cpustats[0][1]-cpustats[0][0]+cpustats[1][1]-cpustats[1][0];
229 kernel=cpustats[2][1]-cpustats[2][0];
230 idle=cpustats[3][1]-cpustats[3][0];
231
232 /* use total to get the total number and then work out the percentages */
233 total=user+kernel+idle;
234
235 usage=((((float)user)/((float)total))*100.00);
236 printf("packet.cpu.user %3.2f\n", usage);
237 usage=((((float)kernel)/((float)total))*100.00);
238 printf("packet.cpu.kernel %3.2f\n", usage);
239 usage=((((float)idle)/((float)total))*100.00);
240 printf("packet.cpu.idle %3.2f\n", usage);
241
242 /* Cos i-scream's expects this to be sent :/ */
243 printf("packet.cpu.iowait 0\n");
244 printf("packet.cpu.swap 0\n");
245
246 free(line[0]);
247 free(line[1]);
248 }
249
250 void processStats() {
251 int sleeping=-1;
252 int zombie=0;
253 int stopped=0;
254 int running=0;
255 int nousers=0;
256 char *line;
257 char *line_p;
258 struct utmp *entry;
259
260 FILE *f;
261
262 if((f=popen("/bin/ps -Al" , "r")) == NULL) {
263 errf("Failed to get process stats (%m)");
264 die();
265 }
266
267 while((line=fpgetline(f)) != NULL) {
268
269 line_p=line;
270 for(; (*line_p == ' ') && (*line_p != '\0'); line_p++);
271 line_p=strchr(line_p, ' ');
272 for(; (*line_p == ' ') && (*line_p != '\0'); line_p++);
273 if (line_p==NULL) abort();
274 /* Ok, we should now be at the state :) .. */
275 if (*line_p=='S') sleeping++;
276 if (*line_p=='R') running++;
277 if (*line_p=='Z') zombie++;
278 if (*line_p=='T') stopped++;
279 }
280
281 if((pclose(f)) == -1) {
282 errf("Failed to close process stats (%m)");
283 die();
284 }
285
286 printf("packet.users.list");
287
288 while((entry=getutent()) != NULL) {
289 if(entry->ut_type==USER_PROCESS) {
290 printf(" %s",entry->ut_user);
291 nousers++;
292 }
293 }
294
295 printf("\npacket.users.count %d\n", nousers);
296
297 printf("packet.processes.sleeping %d\n",sleeping);
298 printf("packet.processes.cpu %d\n",running);
299 printf("packet.processes.zombie %d\n",zombie);
300 printf("packet.processes.stopped %d\n", stopped);
301 printf("packet.processes.total %d\n", (sleeping+running+zombie+stopped));
302 }
303
304 void uptimeStats() {
305 char *line;
306 char *line_p;
307 FILE *f;
308
309 if ((f=fopen("/proc/uptime", "r")) == NULL) {
310 errf("Failed to get uptime stats (%m)");
311 die();
312 }
313
314 if ((line=fpgetline(f)) == NULL) {
315 errf("Failed to read uptime stats (%m)");
316 die();
317 }
318
319 if ((fclose(f)) != 0) {
320 errf("Failed to close file (%m).");
321 die();
322 }
323
324 line_p=strchr(line, '.');
325 if (line_p==NULL) abort();
326 *line_p='\0';
327
328 printf("packet.os.uptime %s\n", line);
329 }
330
331 void osStats() {
332 struct utsname os;
333
334 if((uname(&os)) != 0) {
335 errf("Failed to get os stats (%m)");
336 die();
337 }
338
339 printf("packet.os.name %s\n", os.sysname);
340 printf("packet.os.release %s\n" , os.release);
341 printf("packet.os.version %s\n", os.version);
342 printf("packet.os.sysname %s\n" , os.nodename);
343 printf("packet.os.platform %s\n", os.machine);
344 }
345
346 void diskStats() {
347
348 struct mntent *mp;
349 struct statfs df;
350 FILE *f;
351 int counter=0;
352
353 if ((f=fopen("/etc/mtab", "r" ))==NULL){
354 errf("Failed to open mounts (%m)");
355 die();
356 }
357
358 while((mp=getmntent(f))){
359 if ((statfs(mp->mnt_dir, &df)) !=0){
360 errf("Failed to gets fs stats (%m)");
361 continue;
362 }
363
364 if((((strcmp(mp->mnt_type, MNTTYPE_NFS))==0) || (strcmp(mp->mnt_type,MNTTYPE_IGNORE)) ==0)) continue;
365
366 printf("packet.disk.p%d.attributes.mount %s\n", counter, mp->mnt_dir);
367 printf("packet.disk.p%d.attributes.name %s\n", counter, mp->mnt_fsname);
368 printf("packet.disk.p%d.attributes.kbytes %lu\n",counter, ((df.f_bsize/1024) * df.f_blocks));
369 printf("packet.disk.p%d.attributes.used %lu\n",counter, (((df.f_bsize/1024) * df.f_blocks) -((df.f_bsize/1024) * df.f_bfree)));
370 printf("packet.disk.p%d.attributes.avail %lu\n",counter, (df.f_bsize/1024) * df.f_bavail);
371 printf("packet.disk.p%d.attributes.totalinodes %lu\n", counter, df.f_files);
372 printf("packet.disk.p%d.attributes.freeinodes %lu\n",counter, df.f_ffree);
373
374 counter++;
375 }
376
377
378
379 }
380
381 int main() {
382 getLoadAv();
383 getMemInfo();
384 cpustats();
385 processStats();
386 uptimeStats();
387 osStats();
388 diskStats();
389 fflush(stdout);
390 return 0;
391 }