ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/repos/HostStatus/HostStatus.cpp
Revision: 41
Committed: 2003-11-16T19:56:19-08:00 (21 years, 7 months ago) by Douglas Thrift
File size: 4699 byte(s)
Log Message:
Well, a submit button might be nice!

File Contents

# Content
1 // Host Status
2 //
3 // Douglas Thrift
4 //
5 // $Id$
6
7 #include "HostStatus.hpp"
8 #include "Host.hpp"
9
10 int main(int argc, char* argv[])
11 {
12 HostStatus status;
13
14 return 0;
15 }
16
17 HostStatus::HostStatus()
18 {
19 #ifndef __CYGWIN__
20 sputenv("TZ=:America/Los_Angeles");
21 #else
22 sputenv("TZ= PST8PDT");
23 #endif
24 tzset();
25
26 string method = sgetenv("REQUEST_METHOD");
27
28 parse(method);
29 mode();
30
31 display(method);
32 }
33
34 void HostStatus::parse(const string& method)
35 {
36 string query;
37
38 if (method == "POST")
39 {
40 getline(cin, query);
41 }
42 else
43 {
44 query = sgetenv("QUERY_STRING");
45 }
46
47 if (query == "") return;
48
49 istringstream input(query);
50
51 do
52 {
53 string name, value;
54
55 getline(input, name, '=');
56 getline(input, value, '&');
57
58 cgi.insert(pair<string, string>(name, value));
59 }
60 while (input.good());
61 }
62
63 void HostStatus::mode()
64 {
65 multimap<string, string>::iterator itor = cgi.find("format");
66
67 if (itor != cgi.end())
68 {
69 string format = itor->second;
70
71 page = format != "t" ? true : false;
72 }
73
74 if (!page) return;
75
76 host = false, name = false, address = false, platform = false, since =
77 false;
78
79 for (multimap<string, string>::iterator itor = cgi.find("mode"); itor !=
80 cgi.upper_bound("mode") && itor != cgi.end(); itor++)
81 {
82 string mode = itor->second;
83
84 for (string::iterator itor = mode.begin(); itor != mode.end(); itor++)
85 {
86 char mode = *itor;
87
88 switch (mode)
89 {
90 case 'h':
91 if (!host) host = true;
92 break;
93 case 'n':
94 if (!name) name = true;
95 break;
96 case 'a':
97 if (!address) address = true;
98 break;
99 case 'p':
100 if (!platform) platform = true;
101 break;
102 case 's':
103 if (!since) since = true;
104 break;
105 default:
106 break;
107 }
108 }
109 }
110
111 if (!host && !name && !address && !platform && !since) host = true, name =
112 true, address = true, platform = true, since = true;
113 }
114
115 void HostStatus::display(const string& method)
116 {
117 cout << "Content-Type: text/html\n\n";
118
119 if (method == "POST") sunsetenv("HTTP_USER_AGENT");
120
121 pstream hostupdate("./hostupdate.cgi");
122
123 if (method == "POST")
124 {
125 for (multimap<string, string>::iterator itor = cgi.begin(); itor !=
126 cgi.end(); itor++)
127 {
128 hostupdate << itor->first << '=' << itor->second << '&';
129 }
130
131 hostupdate << '\n' << flush;
132 }
133
134 hostupdate.ignore(26);
135
136 list<Host> hosts;
137 bool done = false;
138
139 do
140 {
141 Host host;
142
143 hostupdate >> host;
144
145 hosts.push_back(host);
146
147 switch (hostupdate.peek())
148 {
149 case 'h':
150 case 'n':
151 case 'a':
152 case 'p':
153 case 's':
154 break;
155 default:
156 done = true;
157 break;
158 }
159 }
160 while (!done && hostupdate.good());
161
162 if (page) header(method);
163
164 for (list<Host>::iterator itor = hosts.begin(); itor != hosts.end();
165 itor++)
166 {
167 Host host = *itor;
168
169 cout << host << flush;
170 }
171
172 if (page) footer();
173 }
174
175 void HostStatus::header(const string& method)
176 {
177 cout << "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\"\n"
178 << "\t\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
179 << "<html>\n"
180 << "<head>\n"
181 << "<link rel=\"StyleSheet\" href=\"../stylesheets/regular.css\" type="
182 << "\"text/css\">\n"
183 << "<title>Host Status</title>\n"
184 << "</head>\n"
185 << "<body>\n"
186 << "<h1 id=\"title\" class=\"center\">Host Status</h1>\n"
187 << "<form action=\"hoststatus.cgi\" method=\"POST\">\n"
188 << "<p class=\"center\">\n"
189 << "<select name=\"host\" multiple>\n";
190
191 if (method != "POST") sputenv("QUERY_STRING=mode=h");
192
193 pstream hostupdate("./hostupdate.cgi");
194
195 if (method == "POST") hostupdate << "mode=h\n" << flush;
196
197 hostupdate.ignore(26);
198
199 list<Host> hosts;
200 bool done = false;
201
202 do
203 {
204 Host host;
205
206 hostupdate >> host;
207
208 hosts.push_back(host);
209
210 switch (hostupdate.peek())
211 {
212 case 'h':
213 break;
214 default:
215 done = true;
216 break;
217 }
218 }
219 while (!done && hostupdate.good());
220
221 for (list<Host>::iterator itor = hosts.begin(); itor != hosts.end();
222 itor++)
223 {
224 Host host = *itor;
225
226 cout << "<option>" << host.getHost() << "</option>\n";
227 }
228
229 cout << "</select>\n"
230 << "<input type=\"checkbox\" name=\"mode\" value=\"h\">&nbsp;Host\n"
231 << "<input type=\"checkbox\" name=\"mode\" value=\"n\">&nbsp;Name\n"
232 << "<input type=\"checkbox\" name=\"mode\" value=\"a\">&nbsp;Address\n"
233 << "<input type=\"checkbox\" name=\"mode\" value=\"p\">&nbsp;Platform"
234 << '\n'
235 << "<input type=\"checkbox\" name=\"mode\" value=\"s\">&nbsp;Since\n"
236 << "<input type=\"submit\" value=\"Status\">\n"
237 << "</p>\n"
238 << "</form>\n"
239 << "<table class=\"center\">\n"
240 << "<tr>\n";
241
242 if (host) cout << "<th>Host</th>\n";
243 if (name) cout << "<th>Name</th>\n";
244 if (address) cout << "<th>Address</th>\n";
245 if (platform) cout << "<th>Platform</th>\n";
246 if (since) cout << "<th>Since</th>\n";
247
248 cout << "</tr>\n";
249 }
250
251 void HostStatus::footer()
252 {
253 cout << "</table>\n"
254 << "</html>\n";
255 }

Properties

Name Value
svn:eol-style native
svn:keywords Id