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.4
Committed: Thu Mar 14 17:05:53 2002 UTC (23 years, 9 months ago) by pajs
Content type: text/plain
Branch: MAIN
Changes since 1.3: +154 -56 lines
Log Message:
Now does CPU stats. Still need to do memory stats, and some minor things.

File Contents

# Content
1 #include <stdio.h>
2 #include <sys/types.h>
3 #include <sys/statvfs.h>
4 #include <sys/mnttab.h>
5 #include "ukcprog.h"
6 #include <sys/utsname.h>
7 #include <sys/loadavg.h>
8 #include <utmp.h>
9 #include <kstat.h>
10 #include <sys/sysinfo.h>
11 #include <unistd.h>
12
13 void die(){
14 exit(1);
15 }
16
17
18 void diskStats(){
19 struct mnttab mp;
20 struct statvfs df;
21 FILE *f;
22 int counter=0;
23
24 if ((f=fopen("/etc/mnttab", "r" ))==NULL){
25 errf("Failed to open mounts (%m)");
26 die();
27 }
28
29 while((getmntent(f, &mp)) == 0){
30 if ((statvfs(mp.mnt_mountp, &df)) !=0){
31 errf("Failed to gets fs stats (%m)");
32 die();
33 }
34
35 printf("packet.disk.p%d.attributes.mount %s\n", counter, mp.mnt_mountp);
36 printf("packet.disk.p%d.attributes.name %s\n", counter, mp.mnt_special);
37 printf("packet.disk.p%d.attributes.kbytes %lu\n",counter, ((df.f_frsize/1024) * df.f_blocks));
38 printf("packet.disk.p%d.attributes.used %lu\n",counter, (((df.f_frsize/1024) * df.f_blocks) -((df.f_frsize/1024) * df.f_bfree)));
39 printf("packet.disk.p%d.attributes.avail %lu\n",counter, (df.f_frsize/1024) * df.f_bavail);
40 printf("packet.disk.p%d.attributes.totalinodes %lu\n", counter, df.f_files);
41 printf("packet.disk.p%d.attributes.freeinodes %lu\n",counter, df.f_ffree);
42
43 counter++;
44 }
45 }
46
47 void osStats(){
48 struct utsname os;
49
50 if((uname(&os)) == -1){
51 errf("Failed to get os stats (%m)");
52 die();
53 }
54
55 printf("packet.os.name %s\n", os.sysname);
56 printf("packet.os.release %s\n" , os.release);
57 printf("packet.os.version %s\n", os.version);
58 printf("packet.os.sysname %s\n" , os.nodename);
59 printf("packet.os.platform %s\n", os.machine);
60
61 }
62
63 void loadStats(){
64 double loadav[3];
65
66 if((getloadavg(loadav,3)) == -1){
67 errf("Failed to get load averages (%m)");
68 die();
69 }
70
71 printf("packet.load.load1 %.2f\n",loadav[0]);
72 printf("packet.load.load5 %.2f\n",loadav[1]);
73 printf("packet.load.load15 %.2f\n",loadav[2]);
74 }
75
76 void userStats(){
77 int nousers=0;
78 struct utmp *entry;
79
80 printf("packet.users.list");
81
82 while((entry=getutent()) != NULL){
83 if(entry->ut_type==USER_PROCESS)
84 {
85 printf(" %s",entry->ut_user);
86 nousers++;
87 }
88 }
89 printf("\npacket.users.count %d\n", nousers);
90 }
91
92 void systemStats(){
93 kstat_ctl_t *kc;
94 kstat_t *ksp;
95 kstat_named_t *knp;
96 cpu_stat_t cs;
97 uint_t cpustats[4][2];
98 float usage;
99 uint_t user, kernel, idle, iowait, total;
100
101 if ((kc = kstat_open()) == NULL) {
102 errf("kstat_open failure (%m)");
103 die();
104 }
105
106 /* Borrowed from gkrellm ;) */
107
108 for (ksp = kc->kc_chain; ksp!=NULL; ksp = ksp->ks_next) {
109 if ((strcmp(ksp->ks_module, "cpu_stat")) != 0)
110 continue;
111 if (kstat_read(kc, ksp, &cs) == -1) {
112 perror("kstat_read");
113 continue;
114 }
115 }
116
117 cpustats[0][0]=cs.cpu_sysinfo.cpu[CPU_USER];
118 cpustats[1][0]=cs.cpu_sysinfo.cpu[CPU_WAIT];
119 cpustats[2][0]=cs.cpu_sysinfo.cpu[CPU_KERNEL];
120 cpustats[3][0]=cs.cpu_sysinfo.cpu[CPU_IDLE];
121
122 sleep(1);
123
124 if (kstat_chain_update(kc) == -1) {
125 errf("Kstat update failure (%m)");
126 die();
127 }
128
129 for (ksp = kc->kc_chain; ksp!=NULL ; ksp = ksp->ks_next) {
130 if ((strcmp(ksp->ks_module, "cpu_stat")) != 0)
131 continue;
132 if (kstat_read(kc, ksp, &cs) == -1) {
133 perror("kstat_read");
134 continue;
135 }
136 }
137
138 cpustats[0][1]=cs.cpu_sysinfo.cpu[CPU_USER];
139 cpustats[1][1]=cs.cpu_sysinfo.cpu[CPU_WAIT];
140 cpustats[2][1]=cs.cpu_sysinfo.cpu[CPU_KERNEL];
141 cpustats[3][1]=cs.cpu_sysinfo.cpu[CPU_IDLE];
142
143 user=cpustats[0][1]-cpustats[0][0];
144 iowait=cpustats[1][1]-cpustats[1][0];
145 kernel=cpustats[2][1]-cpustats[2][0];
146 idle=cpustats[3][1]-cpustats[3][0];
147
148 total=user+kernel+idle+iowait;
149
150 usage=((((float)user)/((float)total))*100.00);
151
152 printf("user : %u\n",user);
153 printf("total : %u\n",total);
154
155 printf("packet.cpu.user %3.2f\n", usage);
156 usage=((((float)kernel)/((float)total))*100.00);
157 printf("packet.cpu.kernel %3.2f\n", usage);
158 usage=((((float)idle)/((float)total))*100.00);
159 printf("packet.cpu.idle %3.2f\n", usage);
160 usage=((((float)iowait)/((float)total))*100.00);
161 printf("packet.cpu.iowait %3.2f\n", usage);
162
163 /* if((ksp = kstat_lookup(kc, "unix", -1, "system_pages")) == NULL){
164 errf("Mem lookup failed (%m)");
165 die();
166 }
167
168 if((knp = (kstat_named_t *)kstat_data_lookup(ksp, "pagesfree")) == NULL){
169 errf("Mem lookup failed (%m)");
170 die();
171 }
172
173 printf("%ui32\n", knp->value.ui32);
174 */
175 }
176
177
178
179 int main(){
180 diskStats();
181 osStats();
182 loadStats();
183 userStats();
184 systemStats();
185
186 return 0;
187 }
188