ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/repos/HostStatus/HostStatus.cpp
Revision: 65
Committed: 2004-01-01T17:55:25-08:00 (20 years, 3 months ago) by Douglas Thrift
File size: 5478 byte(s)
Log Message:
What?

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 string method = sgetenv("REQUEST_METHOD");
20
21 parse(method);
22 mode();
23
24 display(method);
25 }
26
27 void HostStatus::parse(const string& method)
28 {
29 string query;
30
31 if (method == "POST")
32 {
33 getline(cin, query);
34 }
35 else
36 {
37 query = sgetenv("QUERY_STRING");
38 }
39
40 if (query == "") return;
41
42 istringstream input(query);
43
44 do
45 {
46 string name, value;
47
48 getline(input, name, '=');
49 getline(input, value, '&');
50
51 cgi.insert(pair<string, string>(name, value));
52 }
53 while (input.good());
54 }
55
56 void HostStatus::mode()
57 {
58 multimap<string, string>::iterator itor = cgi.find("format");
59
60 if (itor != cgi.end())
61 {
62 string format = itor->second;
63
64 page = format != "t" ? true : false;
65 }
66
67 if (!page) return;
68
69 host = false, name = false, address = false, platform = false, since =
70 false;
71
72 for (multimap<string, string>::iterator itor = cgi.find("mode"); itor !=
73 cgi.upper_bound("mode") && itor != cgi.end(); itor++)
74 {
75 string mode = itor->second;
76
77 for (string::iterator itor = mode.begin(); itor != mode.end(); itor++)
78 {
79 char mode = *itor;
80
81 switch (mode)
82 {
83 case 'h':
84 if (!host) host = true;
85 break;
86 case 'n':
87 if (!name) name = true;
88 break;
89 case 'a':
90 if (!address) address = true;
91 break;
92 case 'p':
93 if (!platform) platform = true;
94 break;
95 case 's':
96 if (!since) since = true;
97 break;
98 default:
99 break;
100 }
101 }
102 }
103
104 if (!host && !name && !address && !platform && !since) host = true, name =
105 true, address = true, platform = true, since = true;
106 }
107
108 void HostStatus::display(const string& method)
109 {
110 cout << "Content-Type: text/html\n\n";
111
112 if (method == "POST") sunsetenv("HTTP_USER_AGENT");
113
114 pstream hostupdate("./hostupdate.cgi");
115
116 if (method == "POST")
117 {
118 for (multimap<string, string>::iterator itor = cgi.begin(); itor !=
119 cgi.end(); itor++)
120 {
121 hostupdate << itor->first << '=' << itor->second << '&';
122 }
123
124 hostupdate << '\n' << flush;
125 }
126
127 hostupdate.ignore(26);
128
129 list<Host> hosts;
130 bool done = false;
131
132 do
133 {
134 Host host;
135
136 hostupdate >> host;
137
138 hosts.push_back(host);
139
140 switch (hostupdate.peek())
141 {
142 case 'h':
143 case 'n':
144 case 'a':
145 case 'p':
146 case 's':
147 break;
148 default:
149 done = true;
150 break;
151 }
152 }
153 while (!done && hostupdate.good());
154
155 if (page) header(method);
156
157 for (list<Host>::iterator itor = hosts.begin(); itor != hosts.end();
158 itor++)
159 {
160 Host host = *itor;
161
162 cout << host << flush;
163 }
164
165 if (page) footer();
166 }
167
168 void HostStatus::header(const string& method)
169 {
170 cout << "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\"\n"
171 << "\t\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
172 << "<html>\n"
173 << "<head>\n"
174 << "<link rel=\"StyleSheet\" href=\"../stylesheets/regular.css\" type="
175 << "\"text/css\">\n"
176 << "<title>Host Status</title>\n"
177 << "</head>\n"
178 << "<body>\n"
179 << "<div>\n"
180 << "<h1 id=\"title\" class=\"center\">Host Status</h1>\n"
181 << "</div>\n"
182 << "<div class=\"hr\">\n"
183 << "<p class=\"floatleft\"><a href=\"./\"><img src=\"/icons/back.gif\""
184 << " alt=\"\"></a></p><p/>\n"
185 << "<form action=\"hoststatus.cgi\" method=\"POST\">\n"
186 << "<table class=\"center\">\n"
187 << "<tr>\n"
188 << "<td>\n"
189 << "<select name=\"host\" size=\"2\" 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 set<string> selected;
222
223 for (multimap<string, string>::iterator itor = cgi.find("host"); itor !=
224 cgi.upper_bound("host") && itor != cgi.end(); itor++)
225 {
226 string host = itor->second;
227
228 if (host != "") selected.insert(host);
229 }
230
231 for (list<Host>::iterator itor = hosts.begin(); itor != hosts.end();
232 itor++)
233 {
234 Host host = *itor;
235
236 cout << "<option" << (selected.find(host.getHost()) != selected.end() ?
237 " selected>" : ">") << host.getHost() << "</option>\n";
238 }
239
240 bool all = host && name && address && platform && since;
241
242 cout << "</select>\n"
243 << "</td>\n"
244 << "<td>\n"
245 << "<input type=\"checkbox\" name=\"mode\" value=\"h\""
246 << (host && !all ? " checked" : "") << ">&nbsp;Host\n"
247 << "<input type=\"checkbox\" name=\"mode\" value=\"n\""
248 << (name && !all ? " checked" : "") << ">&nbsp;Name\n"
249 << "<input type=\"checkbox\" name=\"mode\" value=\"a\""
250 << (address && !all ? " checked" : "") << ">&nbsp;Address\n"
251 << "<input type=\"checkbox\" name=\"mode\" value=\"p\""
252 << (platform && !all ? " checked" : "") << ">&nbsp;Platform\n"
253 << "<input type=\"checkbox\" name=\"mode\" value=\"s\""
254 << (since && !all ? " checked" : "") << ">&nbsp;Since\n"
255 << "</td>\n"
256 << "<td><input type=\"submit\" value=\"Status\"></td>\n"
257 << "</tr>\n"
258 << "</table>\n"
259 << "</form>\n"
260 << "<table class=\"center\">\n"
261 << "<tr>\n";
262
263 if (host) cout << "<th>Host</th>\n";
264 if (name) cout << "<th>Name</th>\n";
265 if (address) cout << "<th>Address</th>\n";
266 if (platform) cout << "<th>Platform</th>\n";
267 if (since) cout << "<th>Since</th>\n";
268
269 cout << "</tr>\n";
270 }
271
272 void HostStatus::footer()
273 {
274 cout << "</table>\n"
275 << "</div>\n"
276 << "</html>\n";
277 }

Properties

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