ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/proj/trunk/Spectre/Spectre.cpp
Revision: 226
Committed: 2003-07-30T16:29:00-07:00 (21 years, 11 months ago) by douglas
File size: 8029 byte(s)
Log Message:
Fixed some automake automount bugs on Linux.

File Contents

# User Rev Content
1 douglas 152 // 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 douglas 153 string program;
12     string programName = "Spectre Samba Mounter";
13 douglas 226 string programVersion = "1.0rc1";
14 douglas 153 bool debug = false;
15    
16 douglas 154 Config config;
17 douglas 153
18 douglas 176 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 douglas 152 int main(int argc, char* argv[])
25     {
26 douglas 176 vector<string> args(argc);
27 douglas 154
28 douglas 176 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 douglas 154 #include "configure.h"
41 douglas 155
42     bool make = false;
43     bool mount = false;
44 douglas 176 bool automake = false;
45     bool automount = false;
46 douglas 155
47     set<string> makes;
48     set<string> mounts;
49 douglas 153
50 douglas 176 for (int index = 1; index < args.size(); index++)
51 douglas 153 {
52 douglas 176 if (args[index] == "-help")
53 douglas 153 {
54 douglas 155 usage();
55 douglas 153 return 0;
56     }
57 douglas 176 else if (args[index] == "-version")
58 douglas 153 {
59 douglas 155 version();
60 douglas 153 return 0;
61     }
62 douglas 176 else if (args[index] == "-make")
63 douglas 153 {
64 douglas 155 if (!make) make = true;
65    
66 douglas 176 if (++index < args.size())
67 douglas 155 {
68 douglas 176 makes.insert(args[index]);
69 douglas 155 }
70     else
71     {
72     cerr << program << ": Bad arguments\n";
73     usage();
74     return 1;
75     }
76 douglas 153 }
77 douglas 176 else if (args[index] == "-mount")
78 douglas 153 {
79 douglas 155 if (!mount) mount = true;
80    
81 douglas 176 if (++index < args.size())
82 douglas 155 {
83 douglas 176 mounts.insert(args[index]);
84 douglas 155 }
85     else
86     {
87     cerr << program << ": Bad arguments\n";
88     usage();
89     return 1;
90     }
91 douglas 153 }
92 douglas 176 else if (args[index] == "-automake")
93 douglas 153 {
94 douglas 176 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 douglas 155 if (!debug)
103     {
104     debug = true;
105     cerr.setf(ios_base::boolalpha);
106     }
107 douglas 153 }
108     }
109    
110 douglas 176 if (!make && !mount && !automake && !automount)
111 douglas 155 {
112     usage();
113     return 0;
114     }
115 douglas 152
116 douglas 155 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 douglas 176 << "automake = " << automake << "\n"
139     << "automount = " << automount << "\n"
140 douglas 155 << "config.install = " << config.install << "\n";
141     }
142    
143 douglas 159 configure();
144 douglas 155
145     if (debug)
146     {
147 douglas 176 cerr << "config.findsmb = " << config.findsmb << "\n"
148     << "config.smbclient = " << config.smbclient << "\n"
149 douglas 159 << "config.mount = " << config.mount << "\n"
150     << "config.root = " << config.root << "\n"
151 douglas 155 << (!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 douglas 176 if (automake) ::automake(makes);
163    
164     if (make || automake)
165 douglas 160 {
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 douglas 176 if (automount) ::automount(mounts);
176    
177     if (mount || automount)
178 douglas 160 {
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 douglas 152 return 0;
189     }
190 douglas 155
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 douglas 176 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 douglas 155 << "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 douglas 176 << " -automake Automagically make the mount tree\n"
218     << " -automount Automagically mount shares to the tree\n"
219 douglas 155 << " -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 douglas 159
232 douglas 176 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 douglas 226 do
243 douglas 176 {
244 douglas 226 if (isdigit(findsmb.peek())) break;
245    
246 douglas 176 string line;
247    
248     getline(findsmb, line);
249    
250     if (debug) cerr << line << "\n";
251     }
252 douglas 226 while (findsmb.good());
253 douglas 176
254     automake(makes, findsmb);
255    
256     if (debug) cerr << "}\n";
257    
258     findsmb.close();
259    
260     if (debug)
261     {
262     cerr << "makes = {\n";
263    
264     for (set<string>::iterator itor = makes.begin(); itor != makes.end();
265     itor++)
266     {
267     cerr << " " << *itor << "\n";
268     }
269    
270     cerr << "}\n";
271     }
272     }
273    
274     void automake(set<string>& makes, ipstream& pin)
275     {
276     while (pin.good())
277     {
278     if (!isdigit(pin.peek())) break;
279    
280     char ip[17];
281 douglas 226 string tab;
282     char host[15];
283 douglas 176 string info;
284    
285     pin.get(ip, 17);
286 douglas 226
287     while (isspace(pin.peek()))
288     {
289     tab += pin.get();
290     }
291    
292     pin.get(host, 15);
293 douglas 176 getline(pin, info);
294    
295 douglas 226 if (debug) cerr << ip << tab << host << info << "\n";
296 douglas 176
297     strip(host);
298    
299     makes.insert(tolower(host));
300     }
301    
302     string line;
303    
304     getline(pin, line);
305    
306     if (debug) cerr << line << "\n";
307    
308     if (line != "")
309     {
310     cerr << program << ": Unknown error\n";
311     }
312     }
313    
314     void automount(set<string>& mounts)
315     {
316 douglas 202 vector<string> args;
317    
318     args.push_back("spectre");
319    
320     ipstream findsmb(config.findsmb, args);
321    
322     if (debug) cerr << "findsmb = {\n";
323    
324 douglas 226 do
325 douglas 202 {
326 douglas 226 if (isdigit(findsmb.peek())) break;
327    
328 douglas 202 string line;
329    
330     getline(findsmb, line);
331    
332     if (debug) cerr << line << "\n";
333     }
334 douglas 226 while (findsmb.good());
335 douglas 202
336     set<string> hosts;
337    
338     automake(hosts, findsmb);
339    
340     if (debug) cerr << "}\n";
341    
342     findsmb.close();
343    
344 douglas 177 DIR* dir = opendir(config.root.c_str());
345     dirent* file;
346    
347     while((file = readdir(dir)) != NULL)
348     {
349     struct stat dir;
350     string folder = config.root + "/" + file->d_name;
351    
352     stat(folder.c_str(), &dir);
353    
354     if (S_ISDIR(dir.st_mode))
355     {
356     string folder = file->d_name;
357    
358 douglas 202 if (folder == "." || folder == ".." || hosts.find(folder) ==
359     hosts.end()) continue;
360 douglas 177
361     mounts.insert(folder);
362     }
363     }
364    
365     closedir(dir);
366    
367     if (debug)
368     {
369     cerr << "mounts = {\n";
370    
371     for (set<string>::iterator itor = mounts.begin(); itor != mounts.end();
372     itor++)
373     {
374     cerr << " " << *itor << "\n";
375     }
376    
377     cerr << "}\n";
378     }
379 douglas 176 }
380    
381 douglas 159 void configure()
382     {
383     string conf = config.install + "/conf/spectre.conf";
384    
385     ifstream fin(conf.c_str());
386    
387     if (!fin.is_open())
388     {
389     cerr << program << ": Could not open " << conf << "\n";
390     exit(1);
391     }
392    
393     do
394     {
395 douglas 160 string line;
396    
397     getline(fin, line);
398    
399     if (line.find('#') == 0 || line == "")
400     {
401     // ignore
402     }
403 douglas 176 else if (line.find("findsmb=") == 0)
404     {
405     config.findsmb = line.substr(8);
406     }
407 douglas 160 else if (line.find("smbclient=") == 0)
408     {
409     config.smbclient = line.substr(10);
410     }
411     else if (line.find("mount=") == 0)
412     {
413     config.mount = line.substr(6);
414     }
415     else if (line.find("root=") == 0)
416     {
417     config.root = line.substr(5);
418     }
419     else if (line.find("host=") == 0)
420     {
421     string host = line.substr(5);
422    
423     getline(fin, line);
424    
425     if (line != "{")
426     {
427     cerr << program << ": Munged configuration for " << host
428     << "\n";
429     exit(1);
430     }
431    
432     do
433     {
434     getline(fin, line);
435    
436     if (line.find("\t#") == 0)
437     {
438     // ignore
439     }
440     else if (line.find('\t') == 0)
441     {
442     config.hosts.insert(pair<string, string>(host,
443     line.substr(1)));
444     }
445     else if (line == "}")
446     {
447     break;
448     }
449     }
450     while (fin.good());
451     }
452 douglas 159 }
453     while (fin.good());
454    
455     fin.close();
456     }