ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/proj/trunk/Spectre/Spectre.cpp
Revision: 177
Committed: 2003-07-05T18:09:20-07:00 (21 years, 11 months ago) by douglas
File size: 7526 byte(s)
Log Message:
Finished automount.

File Contents

# Content
1 // Spectre Samba Mounter
2 //
3 // Douglas Thrift
4 //
5 // Spectre.cpp
6
7 #include "Spectre.h"
8 #include "Maker.h"
9 #include "Mounter.h"
10
11 string program;
12 string programName = "Spectre Samba Mounter";
13 string programVersion = "1.0beta";
14 bool debug = false;
15
16 Config config;
17
18 int spectre(vector<string>& args);
19 void automake(set<string>& makes);
20 void automake(set<string>& makes, ipstream& pin);
21 void automount(set<string>& mounts);
22 void configure();
23
24 int main(int argc, char* argv[])
25 {
26 vector<string> args(argc);
27
28 for (int index = 0; index < argc; index++)
29 {
30 args[index] = argv[index];
31 }
32
33 return spectre(args);
34 }
35
36 int spectre(vector<string>& args)
37 {
38 program = args[0];
39
40 #include "configure.h"
41
42 bool make = false;
43 bool mount = false;
44 bool automake = false;
45 bool automount = false;
46
47 set<string> makes;
48 set<string> mounts;
49
50 for (int index = 1; index < args.size(); index++)
51 {
52 if (args[index] == "-help")
53 {
54 usage();
55 return 0;
56 }
57 else if (args[index] == "-version")
58 {
59 version();
60 return 0;
61 }
62 else if (args[index] == "-make")
63 {
64 if (!make) make = true;
65
66 if (++index < args.size())
67 {
68 makes.insert(args[index]);
69 }
70 else
71 {
72 cerr << program << ": Bad arguments\n";
73 usage();
74 return 1;
75 }
76 }
77 else if (args[index] == "-mount")
78 {
79 if (!mount) mount = true;
80
81 if (++index < args.size())
82 {
83 mounts.insert(args[index]);
84 }
85 else
86 {
87 cerr << program << ": Bad arguments\n";
88 usage();
89 return 1;
90 }
91 }
92 else if (args[index] == "-automake")
93 {
94 if (!automake) automake = true;
95 }
96 else if (args[index] == "-automount")
97 {
98 if (!automount) automount = true;
99 }
100 else if (args[index] == "-D")
101 {
102 if (!debug)
103 {
104 debug = true;
105 cerr.setf(ios_base::boolalpha);
106 }
107 }
108 }
109
110 if (!make && !mount && !automake && !automount)
111 {
112 usage();
113 return 0;
114 }
115
116 if (debug)
117 {
118 cerr << "make = " << make << "\n"
119 << (make ? "makes = {\n" : "");
120
121 for (set<string>::iterator itor = makes.begin(); itor != makes.end();
122 itor++)
123 {
124 cerr << " " << *itor << "\n";
125 }
126
127 cerr << (make ? "}\n" : "")
128 << "mount = " << mount << "\n"
129 << (mount ? "mounts = {\n" : "");
130
131 for (set<string>::iterator itor = mounts.begin(); itor != mounts.end();
132 itor++)
133 {
134 cerr << " " << *itor << "\n";
135 }
136
137 cerr << (mount ? "}\n" : "")
138 << "automake = " << automake << "\n"
139 << "automount = " << automount << "\n"
140 << "config.install = " << config.install << "\n";
141 }
142
143 configure();
144
145 if (debug)
146 {
147 cerr << "config.findsmb = " << config.findsmb << "\n"
148 << "config.smbclient = " << config.smbclient << "\n"
149 << "config.mount = " << config.mount << "\n"
150 << "config.root = " << config.root << "\n"
151 << (!config.hosts.empty() ? "config.hosts = {\n" : "");
152
153 for (multimap<string, string>::iterator itor = config.hosts.begin();
154 itor != config.hosts.end(); itor++)
155 {
156 cerr << " " << itor->first << " = " << itor->second << "\n";
157 }
158
159 cerr << (!config.hosts.empty() ? "}\n" : "");
160 }
161
162 if (automake) ::automake(makes);
163
164 if (make || automake)
165 {
166 for (set<string>::iterator itor = makes.begin(); itor != makes.end();
167 itor++)
168 {
169 Maker maker(*itor);
170
171 maker.make();
172 }
173 }
174
175 if (automount) ::automount(mounts);
176
177 if (mount || automount)
178 {
179 for (set<string>::iterator itor = mounts.begin(); itor != mounts.end();
180 itor++)
181 {
182 Mounter mounter(*itor);
183
184 mounter.mount();
185 }
186 }
187
188 return 0;
189 }
190
191 string platform()
192 {
193 utsname* computer = new utsname;
194 uname(computer);
195
196 string os = computer->sysname;
197 string version = computer->release;
198 string architecture = computer->machine;
199
200 delete computer;
201
202 string platform = "(" + os + " " + version + " " + architecture + ")";
203
204 return platform;
205 }
206
207 void usage()
208 {
209 string tab(8 + program.length(), ' ');
210
211 cout << "Usage: " << program << " [-make host ...] [-mount host ...]\n"
212 << tab << "[-automake] [-automount]\n"
213 << tab << "[-D] [-version] [-help]\n"
214 << "Options:\n"
215 << " -make host Make the mount tree for host\n"
216 << " -mount host Mount the shares on host to its tree\n"
217 << " -automake Automagically make the mount tree\n"
218 << " -automount Automagically mount shares to the tree\n"
219 << " -D Display debug information\n"
220 << " -version Display version information and exit\n"
221 << " -help Display this message and exit\n";
222 }
223
224 void version()
225 {
226 cout << programName << " " << programVersion << " "<< platform() << "\n\n"
227 << " Copyright (C) 2003, Douglas Thrift. All Rights Reserved.\n\n"
228 << " This product includes software developed by Douglas Thrift\n"
229 << " (http://computers.douglasthrift.net/).\n";
230 }
231
232 void automake(set<string>& makes)
233 {
234 vector<string> args;
235
236 args.push_back("spectre");
237
238 ipstream findsmb(config.findsmb, args);
239
240 if (debug) cerr << "findsmb = {\n";
241
242 for (unsigned index = 0; index < 5; index++)
243 {
244 string line;
245
246 getline(findsmb, line);
247
248 if (debug) cerr << line << "\n";
249 }
250
251 automake(makes, findsmb);
252
253 if (debug) cerr << "}\n";
254
255 findsmb.close();
256
257 if (debug)
258 {
259 cerr << "makes = {\n";
260
261 for (set<string>::iterator itor = makes.begin(); itor != makes.end();
262 itor++)
263 {
264 cerr << " " << *itor << "\n";
265 }
266
267 cerr << "}\n";
268 }
269 }
270
271 void automake(set<string>& makes, ipstream& pin)
272 {
273 while (pin.good())
274 {
275 if (!isdigit(pin.peek())) break;
276
277 char ip[17];
278 char host[16];
279 string info;
280
281 pin.get(ip, 17);
282 pin.ignore();
283 pin.get(host, 16);
284 getline(pin, info);
285
286 if (debug) cerr << ip << "\t" << host << info << "\n";
287
288 strip(host);
289
290 makes.insert(tolower(host));
291 }
292
293 string line;
294
295 getline(pin, line);
296
297 if (debug) cerr << line << "\n";
298
299 if (line != "")
300 {
301 cerr << program << ": Unknown error\n";
302 }
303 }
304
305 void automount(set<string>& mounts)
306 {
307 DIR* dir = opendir(config.root.c_str());
308 dirent* file;
309
310 while((file = readdir(dir)) != NULL)
311 {
312 struct stat dir;
313 string folder = config.root + "/" + file->d_name;
314
315 stat(folder.c_str(), &dir);
316
317 if (S_ISDIR(dir.st_mode))
318 {
319 string folder = file->d_name;
320
321 if (folder == "." || folder == "..") continue;
322
323 mounts.insert(folder);
324 }
325 }
326
327 closedir(dir);
328
329 if (debug)
330 {
331 cerr << "mounts = {\n";
332
333 for (set<string>::iterator itor = mounts.begin(); itor != mounts.end();
334 itor++)
335 {
336 cerr << " " << *itor << "\n";
337 }
338
339 cerr << "}\n";
340 }
341 }
342
343 void configure()
344 {
345 string conf = config.install + "/conf/spectre.conf";
346
347 ifstream fin(conf.c_str());
348
349 if (!fin.is_open())
350 {
351 cerr << program << ": Could not open " << conf << "\n";
352 exit(1);
353 }
354
355 do
356 {
357 string line;
358
359 getline(fin, line);
360
361 if (line.find('#') == 0 || line == "")
362 {
363 // ignore
364 }
365 else if (line.find("findsmb=") == 0)
366 {
367 config.findsmb = line.substr(8);
368 }
369 else if (line.find("smbclient=") == 0)
370 {
371 config.smbclient = line.substr(10);
372 }
373 else if (line.find("mount=") == 0)
374 {
375 config.mount = line.substr(6);
376 }
377 else if (line.find("root=") == 0)
378 {
379 config.root = line.substr(5);
380 }
381 else if (line.find("host=") == 0)
382 {
383 string host = line.substr(5);
384
385 getline(fin, line);
386
387 if (line != "{")
388 {
389 cerr << program << ": Munged configuration for " << host
390 << "\n";
391 exit(1);
392 }
393
394 do
395 {
396 getline(fin, line);
397
398 if (line.find("\t#") == 0)
399 {
400 // ignore
401 }
402 else if (line.find('\t') == 0)
403 {
404 config.hosts.insert(pair<string, string>(host,
405 line.substr(1)));
406 }
407 else if (line == "}")
408 {
409 break;
410 }
411 }
412 while (fin.good());
413 }
414 }
415 while (fin.good());
416
417 fin.close();
418 }