ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/repos/HostUpdate/HostUpdate.cpp
(Generate patch)

Comparing HostUpdate/HostUpdate.cpp (file contents):
Revision 1 by Douglas Thrift, 2003-11-05T17:58:20-08:00 vs.
Revision 23 by Douglas Thrift, 2003-11-11T00:36:02-08:00

# Line 1 | Line 1
1 < // Host Update
2 < //
3 < // Douglas Thrift
4 < //
5 < // $Id$
6 <
7 < #include "HostUpdate.hpp"
8 <
9 < int main(int argc, char* argv[])
10 < {
11 <        HostUpdate update;
12 <
13 <        return 0;
14 < }
15 <
16 < HostUpdate::HostUpdate()
17 < {
18 <        CgiEnvironment env = cgi.getEnvironment();
19 <
20 <        cout << "Location: " << (env.usingHTTPS() ? "https" : "http") << "://"
21 <                << env.getServerName() << ":" << env.getServerPort() << "/\n\n";
22 <
23 <        form_iterator itor = cgi["host"];
24 <        FormEntry host = *itor;
25 < }
26 <
27 < HostUpdate::~HostUpdate()
28 < {
29 < }
1 > // Host Update
2 > //
3 > // Douglas Thrift
4 > //
5 > // $Id$
6 >
7 > #include "HostUpdate.hpp"
8 > #include "Host.hpp"
9 >
10 > #ifdef _WIN32
11 > #include <windows.h>
12 > #endif
13 >
14 > int main(int argc, char* argv[])
15 > {
16 >        HostUpdate update;
17 >
18 >        return 0;
19 > }
20 >
21 > HostUpdate::HostUpdate()
22 > {
23 >        struct stat* hosts = new struct stat;
24 >
25 >        if (stat("hosts", hosts) != 0)
26 >        {
27 >                mkdir("hosts");
28 >        }
29 >
30 >        delete [] hosts;
31 >
32 >        string agent = sgetenv("HTTP_USER_AGENT");
33 >        string method = sgetenv("REQUEST_METHOD");
34 >
35 >        parse(method);
36 >        mode();
37 >
38 >        if (agent.find("Host Update/") == 0 && method == "POST" && agent.find(" (")
39 >                != string::npos && agent.find(") libwww-perl/") != string::npos)
40 >        {
41 >                update(agent);
42 >        }
43 >        else
44 >        {
45 >                display();
46 >        }
47 > }
48 >
49 > void HostUpdate::parse(const string& method)
50 > {
51 >        string query;
52 >
53 >        if (method == "POST")
54 >        {
55 >                getline(cin, query);
56 >        }
57 >        else
58 >        {
59 >                query = sgetenv("QUERY_STRING");
60 >        }
61 >
62 >        if (query == "") return;
63 >
64 >        istringstream input(query);
65 >
66 >        do
67 >        {
68 >                string name, value;
69 >
70 >                getline(input, name, '=');
71 >                getline(input, value, '&');
72 >
73 >                cgi.insert(pair<string, string>(name, value));
74 >        }
75 >        while (input.good());
76 > }
77 >
78 > 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 >                cgi.upper_bound("mode"); itor++)
85 >        {
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 > 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 >
125 >        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 >        string::size_type begin = agent.find('(') + 1, end = agent.rfind(')');
132 >
133 >        if (begin >= end) return;
134 >
135 >        string platform = agent.substr(begin, end - begin);
136 >
137 >        Host client(host, name, address, platform), saved(host);
138 >
139 >        if (client != ++saved) client--;
140 >
141 >        display(client);
142 > }
143 >
144 > void HostUpdate::display()
145 > {
146 >        cout << "Content-Type: text/plain\n\n";
147 >
148 >        {
149 >                bool request = false;
150 >
151 >                for (multimap<string, string>::iterator itor = cgi.find("host"); itor !=
152 >                        cgi.upper_bound("host"); itor++)
153 >                {
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 >        set<Host> hosts;
168 >
169 > #ifndef _WIN32
170 >        DIR* dir = opendir("hosts");
171 >        struct dirent* ent;
172 >
173 >        while ((ent = readdir(dir)) != NULL)
174 >        {
175 >                string file = ent->d_name;
176 >
177 >                if (file == "." || file == "..") continue;
178 >
179 >                Host host(file);
180 >
181 >                hosts.insert(++host);
182 >        }
183 >
184 >        closedir(dir);
185 > #else
186 >        WIN32_FIND_DATA found;
187 >        HANDLE find = FindFirstFile("hosts\\*", &found);
188 >
189 >        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 >        for (set<Host>::iterator itor = hosts.begin(); itor != hosts.end(); itor++)
205 >        {
206 >                display(*itor);
207 >        }
208 > }
209 >
210 > void HostUpdate::display(const Host& host)
211 > {
212 >        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 >
217 >        string name = string("hosts") + slash + host.getHost();
218 >        struct stat file;
219 >
220 >        if (since && stat(name.c_str(), &file) == 0)
221 >        {
222 >                char since[20];
223 >
224 >                strftime(since, 20, "%m/%d/%Y %H:%M:%S", gmtime(&file.st_mtime));
225 >
226 >                cout << "since=" << since << " GMT\n";
227 >        }
228 >        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 > }

Comparing HostUpdate/HostUpdate.cpp (property svn:eol-style):
Revision 1 by Douglas Thrift, 2003-11-05T17:58:20-08:00 vs.
Revision 23 by Douglas Thrift, 2003-11-11T00:36:02-08:00

# Line 0 | Line 1
1 + native

Comparing HostUpdate/HostUpdate.cpp (property svn:keywords):
Revision 1 by Douglas Thrift, 2003-11-05T17:58:20-08:00 vs.
Revision 23 by Douglas Thrift, 2003-11-11T00:36:02-08:00

# Line 0 | Line 1
1 + Id

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines