ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/cms/source/host/ihost-perl/plugins/solaris/solaris.c
Revision: 1.7
Committed: Mon Mar 18 15:45:04 2002 UTC (22 years, 7 months ago) by pajs
Content type: text/plain
Branch: MAIN
Changes since 1.6: +11 -8 lines
Log Message:
Made the disk output only output ufs and tmpfs disks.. (Not loopback or cd's etc)

File Contents

# User Rev Content
1 pajs 1.1 #include <stdio.h>
2     #include <sys/types.h>
3     #include <sys/statvfs.h>
4     #include <sys/mnttab.h>
5 tdb 1.3 #include "ukcprog.h"
6 pajs 1.2 #include <sys/utsname.h>
7     #include <sys/loadavg.h>
8 pajs 1.4 #include <utmp.h>
9     #include <kstat.h>
10     #include <sys/sysinfo.h>
11     #include <unistd.h>
12 pajs 1.5 #include <sys/stat.h>
13     #include <sys/swap.h>
14     #include <stdlib.h>
15     #include <strings.h>
16 pajs 1.6 #include <time.h>
17 pajs 1.1
18 pajs 1.4 void die(){
19     exit(1);
20 pajs 1.1 }
21    
22    
23 pajs 1.4 void diskStats(){
24     struct mnttab mp;
25     struct statvfs df;
26     FILE *f;
27     int counter=0;
28    
29     if ((f=fopen("/etc/mnttab", "r" ))==NULL){
30     errf("Failed to open mounts (%m)");
31     die();
32     }
33 pajs 1.1
34 pajs 1.4 while((getmntent(f, &mp)) == 0){
35     if ((statvfs(mp.mnt_mountp, &df)) !=0){
36     errf("Failed to gets fs stats (%m)");
37     die();
38     }
39 pajs 1.7
40     if((((strcmp(mp.mnt_fstype,"ufs"))==0) || (strcmp(mp.mnt_fstype,"tmpfs")) ==0)){
41 pajs 1.1
42 pajs 1.7 printf("packet.disk.p%d.attributes.mount %s\n", counter, mp.mnt_mountp);
43     printf("packet.disk.p%d.attributes.name %s\n", counter, mp.mnt_special);
44     printf("packet.disk.p%d.attributes.kbytes %lu\n",counter, ((df.f_frsize/1024) * df.f_blocks));
45     printf("packet.disk.p%d.attributes.used %lu\n",counter, (((df.f_frsize/1024) * df.f_blocks) -((df.f_frsize/1024) * df.f_bfree)));
46     printf("packet.disk.p%d.attributes.avail %lu\n",counter, (df.f_frsize/1024) * df.f_bavail);
47     printf("packet.disk.p%d.attributes.totalinodes %lu\n", counter, df.f_files);
48     printf("packet.disk.p%d.attributes.freeinodes %lu\n",counter, df.f_ffree);
49 pajs 1.4
50 pajs 1.7 counter++;
51     }
52 pajs 1.4 }
53 pajs 1.1 }
54    
55 pajs 1.4 void osStats(){
56     struct utsname os;
57    
58     if((uname(&os)) == -1){
59     errf("Failed to get os stats (%m)");
60     die();
61     }
62    
63     printf("packet.os.name %s\n", os.sysname);
64     printf("packet.os.release %s\n" , os.release);
65     printf("packet.os.version %s\n", os.version);
66     printf("packet.os.sysname %s\n" , os.nodename);
67     printf("packet.os.platform %s\n", os.machine);
68 pajs 1.2
69     }
70    
71 pajs 1.4 void loadStats(){
72 pajs 1.2 double loadav[3];
73    
74 pajs 1.4 if((getloadavg(loadav,3)) == -1){
75     errf("Failed to get load averages (%m)");
76     die();
77 pajs 1.2 }
78    
79     printf("packet.load.load1 %.2f\n",loadav[0]);
80     printf("packet.load.load5 %.2f\n",loadav[1]);
81     printf("packet.load.load15 %.2f\n",loadav[2]);
82     }
83 pajs 1.1
84 pajs 1.4 void userStats(){
85     int nousers=0;
86     struct utmp *entry;
87    
88     printf("packet.users.list");
89    
90     while((entry=getutent()) != NULL){
91     if(entry->ut_type==USER_PROCESS)
92     {
93     printf(" %s",entry->ut_user);
94     nousers++;
95     }
96     }
97     printf("\npacket.users.count %d\n", nousers);
98     }
99    
100     void systemStats(){
101     kstat_ctl_t *kc;
102     kstat_t *ksp;
103 pajs 1.5 kstat_named_t *kn;
104     int pagesize;
105 pajs 1.4 cpu_stat_t cs;
106 pajs 1.6 uint_t cpustats[5][2];
107 pajs 1.4 float usage;
108 pajs 1.6 uint_t user, kernel, idle, iowait, swap, total;
109 pajs 1.5 ulong totalmem, freemem;
110     long swaptotal, swapused;
111 pajs 1.6 time_t uptime,curtime;
112 pajs 1.5
113     struct anoninfo ai;
114 pajs 1.4
115 pajs 1.5
116 pajs 1.4 if ((kc = kstat_open()) == NULL) {
117     errf("kstat_open failure (%m)");
118     die();
119     }
120    
121     /* Borrowed from gkrellm ;) */
122    
123     for (ksp = kc->kc_chain; ksp!=NULL; ksp = ksp->ks_next) {
124     if ((strcmp(ksp->ks_module, "cpu_stat")) != 0)
125     continue;
126     if (kstat_read(kc, ksp, &cs) == -1) {
127     perror("kstat_read");
128     continue;
129     }
130     }
131    
132     cpustats[0][0]=cs.cpu_sysinfo.cpu[CPU_USER];
133     cpustats[1][0]=cs.cpu_sysinfo.cpu[CPU_WAIT];
134     cpustats[2][0]=cs.cpu_sysinfo.cpu[CPU_KERNEL];
135     cpustats[3][0]=cs.cpu_sysinfo.cpu[CPU_IDLE];
136 pajs 1.6 cpustats[4][0]=cs.cpu_sysinfo.cpu[CPU_STATES];
137 pajs 1.4
138     sleep(1);
139    
140     if (kstat_chain_update(kc) == -1) {
141     errf("Kstat update failure (%m)");
142     die();
143     }
144    
145     for (ksp = kc->kc_chain; ksp!=NULL ; ksp = ksp->ks_next) {
146     if ((strcmp(ksp->ks_module, "cpu_stat")) != 0)
147     continue;
148     if (kstat_read(kc, ksp, &cs) == -1) {
149     perror("kstat_read");
150     continue;
151     }
152     }
153    
154     cpustats[0][1]=cs.cpu_sysinfo.cpu[CPU_USER];
155     cpustats[1][1]=cs.cpu_sysinfo.cpu[CPU_WAIT];
156     cpustats[2][1]=cs.cpu_sysinfo.cpu[CPU_KERNEL];
157     cpustats[3][1]=cs.cpu_sysinfo.cpu[CPU_IDLE];
158 pajs 1.6 cpustats[4][1]=cs.cpu_sysinfo.cpu[CPU_STATES];
159 pajs 1.4
160     user=cpustats[0][1]-cpustats[0][0];
161     iowait=cpustats[1][1]-cpustats[1][0];
162     kernel=cpustats[2][1]-cpustats[2][0];
163     idle=cpustats[3][1]-cpustats[3][0];
164 pajs 1.6 swap=cpustats[4][1]-cpustats[4][0];
165 pajs 1.4
166 pajs 1.6 total=user+kernel+idle+iowait+swap;
167 pajs 1.4
168     usage=((((float)user)/((float)total))*100.00);
169    
170     printf("packet.cpu.user %3.2f\n", usage);
171     usage=((((float)kernel)/((float)total))*100.00);
172     printf("packet.cpu.kernel %3.2f\n", usage);
173     usage=((((float)idle)/((float)total))*100.00);
174     printf("packet.cpu.idle %3.2f\n", usage);
175     usage=((((float)iowait)/((float)total))*100.00);
176     printf("packet.cpu.iowait %3.2f\n", usage);
177 pajs 1.6 usage=((((float)swap)/((float)total))*100.00);
178     printf("packet.cpu.swap %3.2f\n", usage);
179    
180 pajs 1.5 /* MEMORY STATS */
181    
182     if((pagesize=sysconf(_SC_PAGESIZE)) == -1){
183     errf("Failed to get pagesize (%m)");
184 pajs 1.4 die();
185     }
186 pajs 1.2
187 pajs 1.5 if((totalmem=sysconf(_SC_PHYS_PAGES)) == -1){
188     errf("Failed to get total memory");
189     die();
190     }
191    
192     totalmem=((totalmem*pagesize)/1024)/1024;
193    
194     ksp = kstat_lookup(kc, "unix", 0, "system_pages");
195     if (kstat_read(kc, ksp, 0) == -1) {
196     perror("kstat_read");
197     die();
198     }
199    
200     if((kn=kstat_data_lookup(ksp, "freemem")) == NULL){
201     errf("Failed to get free memory (%m)");
202 pajs 1.4 die();
203     }
204    
205 pajs 1.5 freemem=(((kn->value.ul)*pagesize)/1024)/1024;
206    
207     printf("packet.memory.total %lu\n",totalmem);
208     printf("packet.memory.free %lu\n",freemem);
209     printf("packet.memory.used %lu\n",(totalmem-freemem));
210    
211    
212     if (swapctl(SC_AINFO, &ai) == -1) {
213     errf("Failed to get swap details (%m)");
214     die();
215     }
216    
217     swaptotal=((ai.ani_max/1024)*pagesize)/1024;
218     swapused=((ai.ani_resv/1024)*pagesize)/1024;
219    
220     /* Ok this is actually for TOP combatability, but this is not
221     total swap, cos it actually also seems to include memory stats. */
222     printf("packet.swap.total %ld\n",swaptotal);
223     printf("packet.swap.used %ld\n", swapused);
224     printf("packet.swap.free %lu\n", (swaptotal-swapused));
225 pajs 1.6
226     ksp=kstat_lookup(kc, "unix", -1, "system_misc");
227     if (kstat_read(kc, ksp, 0) == -1) {
228     errf("Failed to get uptime (%m)");
229     die();
230     }
231    
232     if((kn=kstat_data_lookup(ksp, "boot_time")) == NULL){
233     errf("Failed to get uptime (%m)");
234     die();
235     }
236    
237     uptime=(kn->value.ui32);
238     time(&curtime);
239     printf("packet.os.uptime %ld\n", (curtime-uptime));
240 pajs 1.5
241     }
242    
243     void processStats() {
244     int sleeping=-1;
245     int zombie=0;
246     int stopped=0;
247     int running=0;
248     char *line;
249     char *line_p;
250    
251    
252     FILE *f;
253    
254     if((f=popen("/bin/ps -Al" , "r")) == NULL) {
255     errf("Failed to get process stats (%m)");
256     die();
257     }
258    
259     while((line=fpgetline(f)) != NULL) {
260     line_p=line;
261     for(; (*line_p == ' ') && (*line_p != '\0'); line_p++);
262     line_p=strchr(line_p, ' ');
263     for(; (*line_p == ' ') && (*line_p != '\0'); line_p++);
264     if (line_p==NULL) abort();
265     /* Ok, we should now be at the state :) .. */
266     if (*line_p=='S') sleeping++;
267     if (*line_p=='R') running++;
268     if (*line_p=='Z') zombie++;
269     if (*line_p=='T') stopped++;
270     }
271    
272     if((pclose(f)) == -1) {
273     errf("Failed to close process stats (%m)");
274     die();
275     }
276    
277     printf("packet.processes.sleeping %d\n",sleeping);
278     printf("packet.processes.cpu %d\n",running);
279     printf("packet.processes.zombie %d\n",zombie);
280     printf("packet.processes.stopped %d\n", stopped);
281     printf("packet.processes.total %d\n", (sleeping+running+zombie+stopped));
282    
283 pajs 1.4 }
284 pajs 1.5
285 pajs 1.4
286     int main(){
287 pajs 1.2 diskStats();
288     osStats();
289     loadStats();
290 pajs 1.4 userStats();
291     systemStats();
292 pajs 1.5 processStats();
293 pajs 1.2 return 0;
294 pajs 1.1 }
295