ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/repos/HostUpdate/HostUpdate.cpp
Revision: 24
Committed: 2003-11-11T12:33:38-08:00 (21 years, 7 months ago) by Douglas Thrift
File size: 4266 byte(s)
Log Message:
Fixed some bugs, ooh!

File Contents

# User Rev Content
1 Douglas Thrift 3 // Host Update
2     //
3     // Douglas Thrift
4     //
5     // $Id$
6    
7     #include "HostUpdate.hpp"
8 Douglas Thrift 9 #include "Host.hpp"
9 Douglas Thrift 21
10     #ifdef _WIN32
11 Douglas Thrift 17 #include <windows.h>
12 Douglas Thrift 21 #endif
13 Douglas Thrift 3
14     int main(int argc, char* argv[])
15     {
16     HostUpdate update;
17    
18     return 0;
19     }
20    
21     HostUpdate::HostUpdate()
22     {
23 Douglas Thrift 12 struct stat* hosts = new struct stat;
24 Douglas Thrift 3
25 Douglas Thrift 12 if (stat("hosts", hosts) != 0)
26     {
27     mkdir("hosts");
28     }
29 Douglas Thrift 3
30 Douglas Thrift 12 delete [] hosts;
31 Douglas Thrift 10
32 Douglas Thrift 15 string agent = sgetenv("HTTP_USER_AGENT");
33     string method = sgetenv("REQUEST_METHOD");
34 Douglas Thrift 10
35 Douglas Thrift 15 parse(method);
36 Douglas Thrift 22 mode();
37 Douglas Thrift 10
38 Douglas Thrift 13 if (agent.find("Host Update/") == 0 && method == "POST" && agent.find(" (")
39 Douglas Thrift 12 != string::npos && agent.find(") libwww-perl/") != string::npos)
40     {
41 Douglas Thrift 15 update(agent);
42 Douglas Thrift 12 }
43     else
44     {
45 Douglas Thrift 15 display();
46 Douglas Thrift 12 }
47 Douglas Thrift 3 }
48    
49 Douglas Thrift 15 void HostUpdate::parse(const string& method)
50 Douglas Thrift 12 {
51 Douglas Thrift 15 string query;
52 Douglas Thrift 12
53 Douglas Thrift 15 if (method == "POST")
54     {
55     getline(cin, query);
56     }
57     else
58     {
59     query = sgetenv("QUERY_STRING");
60     }
61 Douglas Thrift 12
62 Douglas Thrift 15 if (query == "") return;
63 Douglas Thrift 12
64 Douglas Thrift 15 istringstream input(query);
65 Douglas Thrift 12
66 Douglas Thrift 15 do
67     {
68     string name, value;
69 Douglas Thrift 12
70 Douglas Thrift 15 getline(input, name, '=');
71     getline(input, value, '&');
72    
73     cgi.insert(pair<string, string>(name, value));
74     }
75     while (input.good());
76     }
77    
78 Douglas Thrift 22 void HostUpdate::mode()
79     {
80     host = false, name = false, address = false, platform = false, since =
81     false;
82    
83     for (multimap<string, string>::iterator itor = cgi.find("mode"); itor !=
84 Douglas Thrift 24 cgi.upper_bound("mode") && itor != cgi.end(); itor++)
85 Douglas Thrift 22 {
86     string mode = itor->second;
87    
88     for (string::iterator itor = mode.begin(); itor != mode.end(); itor++)
89     {
90     char mode = *itor;
91    
92     switch (mode)
93     {
94     case 'h':
95     if (!host) host = true;
96     break;
97     case 'n':
98     if (!name) name = true;
99     break;
100     case 'a':
101     if (!address) address = true;
102     break;
103     case 'p':
104     if (!platform) platform = true;
105     break;
106     case 's':
107     if (!since) since = true;
108     break;
109     default:
110     break;
111     }
112     }
113     }
114    
115     if (!host && !name && !address && !platform && !since) host = true, name =
116     true, address = true, platform = true, since = true;
117     }
118    
119 Douglas Thrift 15 void HostUpdate::update(const string& agent)
120     {
121     cout << "Content-Type: text/plain\n\n";
122    
123     multimap<string, string>::iterator itor = cgi.find("host");
124 Douglas Thrift 17
125 Douglas Thrift 15 if (itor == cgi.end()) return;
126     if (itor->second == "") return;
127    
128     string host = itor->second, name = sgetenv("REMOTE_HOST"), address =
129     sgetenv("REMOTE_ADDR");
130    
131 Douglas Thrift 23 string::size_type begin = agent.find('(') + 1, end = agent.rfind(')');
132    
133     if (begin >= end) return;
134    
135 Douglas Thrift 12 string platform = agent.substr(begin, end - begin);
136 Douglas Thrift 13
137     Host client(host, name, address, platform), saved(host);
138    
139 Douglas Thrift 22 if (client != ++saved) client--;
140 Douglas Thrift 15
141 Douglas Thrift 22 display(client);
142 Douglas Thrift 12 }
143    
144 Douglas Thrift 15 void HostUpdate::display()
145 Douglas Thrift 12 {
146 Douglas Thrift 14 cout << "Content-Type: text/plain\n\n";
147    
148 Douglas Thrift 22 {
149     bool request = false;
150    
151     for (multimap<string, string>::iterator itor = cgi.find("host"); itor !=
152 Douglas Thrift 24 cgi.upper_bound("host") && itor != cgi.end(); itor++)
153 Douglas Thrift 22 {
154     if (itor->second != "")
155     {
156     Host host(itor->second);
157    
158     display(++host);
159    
160     if (!request) request = true;
161     }
162     }
163    
164     if (request) return;
165     }
166    
167 Douglas Thrift 14 set<Host> hosts;
168 Douglas Thrift 17
169     #ifndef _WIN32
170 Douglas Thrift 15 DIR* dir = opendir("hosts");
171 Douglas Thrift 14 struct dirent* ent;
172    
173     while ((ent = readdir(dir)) != NULL)
174     {
175     string file = ent->d_name;
176    
177     if (file == "." || file == "..") continue;
178 Douglas Thrift 17
179 Douglas Thrift 14 Host host(file);
180    
181     hosts.insert(++host);
182     }
183 Douglas Thrift 15
184 Douglas Thrift 14 closedir(dir);
185 Douglas Thrift 17 #else
186     WIN32_FIND_DATA found;
187     HANDLE find = FindFirstFile("hosts\\*", &found);
188 Douglas Thrift 14
189 Douglas Thrift 17 do
190     {
191     string file = found.cFileName;
192    
193     if (file == "." || file == "..") continue;
194    
195     Host host(file);
196    
197     hosts.insert(++host);
198     }
199     while (FindNextFile(find, &found) != 0);
200    
201     FindClose(find);
202     #endif
203    
204 Douglas Thrift 14 for (set<Host>::iterator itor = hosts.begin(); itor != hosts.end(); itor++)
205     {
206 Douglas Thrift 20 display(*itor);
207     }
208     }
209 Douglas Thrift 14
210 Douglas Thrift 20 void HostUpdate::display(const Host& host)
211     {
212 Douglas Thrift 22 if (this->host) cout << "host=" << host.getHost() << '\n';
213     if (name) cout << "name=" << host.getName() << '\n';
214     if (address) cout << "address=" << host.getAddress() << '\n';
215     if (platform) cout << "platform=" << host.getPlatform() << '\n';
216 Douglas Thrift 19
217 Douglas Thrift 20 string name = string("hosts") + slash + host.getHost();
218     struct stat file;
219 Douglas Thrift 19
220 Douglas Thrift 22 if (since && stat(name.c_str(), &file) == 0)
221 Douglas Thrift 20 {
222     char since[20];
223 Douglas Thrift 19
224 Douglas Thrift 20 strftime(since, 20, "%m/%d/%Y %H:%M:%S", gmtime(&file.st_mtime));
225 Douglas Thrift 19
226 Douglas Thrift 20 cout << "since=" << since << " GMT\n";
227 Douglas Thrift 14 }
228 Douglas Thrift 22 else if (since)
229     {
230     char since[20];
231     time_t* now = new time_t;
232    
233     time(now);
234     strftime(since, 20, "%m/%d/%Y %H:%M:%S", gmtime(now));
235    
236     delete now;
237    
238     cout << "since=" << since << " GMT\n";
239     }
240 Douglas Thrift 12 }

Properties

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