source: trunk/FACT++/src/test3.cc @ 10365

Last change on this file since 10365 was 10347, checked in by tbretz, 10 years ago
Removed printing of command list from constructor; added help2man conform help-output.
File size: 5.1 KB
Line 
1#include <boost/regex.hpp>
2#include <boost/filesystem.hpp>
3#include <readline/readline.h>
4
5#include "tools.h"
6#include "Time.h"
7#include "StateMachineDim.h"
8#include "MessageDim.h"
9#include "Shell.h"
10#include "ServiceList.h"
11#include "Configuration.h"
12
13using namespace std;
14
15#include "RemoteControl.h"
16
17template <class T>
18void RunShell(Configuration &conf)
19{
20    // A normal kill will call its destructor! (Very nice feature ;) )
21    static T shell(conf.GetName().c_str(), conf.Get<int>("console")!=1);
22
23    WindowLog &win  = shell.GetStreamIn();
24    WindowLog &wout = shell.GetStreamOut();
25
26    if (conf.Has("log"))
27        if (!wout.OpenLogFile(conf.Get<string>("log")))
28            win << kRed << "ERROR - Couldn't open log-file " << conf.Get<string>("log") << ": " << strerror(errno) << endl;
29
30    shell.Run();
31}
32
33
34// ========================================================================
35void SetupConfiguration(Configuration &conf)
36{
37    const string n = conf.GetName()+".log";
38
39    po::options_description config("Program options");
40    config.add_options()
41        ("dns",       var<string>("localhost"), "Dim nameserver host name (Overwites DIM_DNS_NODE environment variable)")
42        ("log,l",     var<string>(n), "Write log-file")
43        ("console,c", var<int>(),     "Use console (0=shell, 1=simple buffered, X=simple unbuffered)")
44        ;
45
46    conf.AddEnv("dns", "DIM_DNS_NODE");
47
48    conf.AddOptions(config);
49}
50
51/*
52 Extract usage clause(s) [if any] for SYNOPSIS.
53 Translators: "Usage" and "or" here are patterns (regular expressions) which
54 are used to match the usage synopsis in program output.  An example from cp
55 (GNU coreutils) which contains both strings:
56  Usage: cp [OPTION]... [-T] SOURCE DEST
57    or:  cp [OPTION]... SOURCE... DIRECTORY
58    or:  cp [OPTION]... -t DIRECTORY SOURCE...
59 */
60void PrintUsage()
61{
62    cout << "\n"
63        "The console connects to all available Dim Servers and allows to "
64        "easily access all of their commands.\n"
65        "\n"
66        "Usage: test3 [-c type] [OPTIONS]\n"
67        "  or:  test3 [OPTIONS]\n"
68        "\n"
69        "Options:\n"
70        "The following describes the available commandline options. "
71        "For further details on how command line option are parsed "
72        "and in which order which configuration sources are accessed "
73        "please refer to the class reference of the Configuration class.";
74    cout << endl;
75
76}
77
78void PrintHelp()
79{
80    cout <<
81        "The default is that the program is started without user intercation. "
82        "All actions are supposed to arrive as DimCommands. Using the -c "
83        "option, a local shell can be initialized. With h or help a short "
84        "help message about the usuage can be brought to the screen."
85        << endl;
86
87    /*
88     cout << "bla bla bla" << endl << endl;
89     cout << endl;
90     cout << "Environment:" << endl;
91     cout << "environment" << endl;
92     cout << endl;
93     cout << "Examples:" << endl;
94     cout << "test exam" << endl;
95     cout << endl;
96     cout << "Files:" << endl;
97     cout << "files" << endl;
98     cout << endl;
99     */
100}
101
102/*
103 The first line of the --version information is assumed to be in one
104 of the following formats:
105
106   <version>
107   <program> <version>
108   {GNU,Free} <program> <version>
109   <program> ({GNU,Free} <package>) <version>
110   <program> - {GNU,Free} <package> <version>
111
112 and separated from any copyright/author details by a blank line.
113
114 Handle multi-line bug reporting sections of the form:
115
116   Report <program> bugs to <addr>
117   GNU <package> home page: <url>
118   ...
119*/
120void PrintVersion(const char *name)
121{
122    string n = boost::filesystem::basename(name);
123    if (n.substr(0, 3)=="lt-")
124        n = n.substr(3);
125
126    cout <<
127        n << " - FACT++ 1.0\n"
128        "\n"
129        "Written by Thomas Bretz <thomas.bretz@epfl.ch> et al.\n"
130        "\n"
131        "Report bugs to Thomas Bretz <thomas.bretz@epfl.ch>\n"
132        "FACT++ home page: http://www.xxx.com\n"
133        "\n"
134        "Copyright (C) 2011 by the FACT Collaboration.\n"
135        "This is free software; see the source for copying conditions.\n"
136        << endl;
137}
138
139int main(int argc, char *argv[])
140{
141    Configuration conf(argv[0]);
142    conf.SetPrintUsage(PrintUsage);
143    SetupConfiguration(conf);
144
145    po::variables_map vm;
146    try
147    {
148        vm = conf.Parse(argc, argv);
149    }
150    catch (std::exception &e)
151    {
152#if BOOST_VERSION > 104000
153        po::multiple_occurrences *MO = dynamic_cast<po::multiple_occurrences*>(&e);
154        if (MO)
155            cout << "Error: " << e.what() << " of '" << MO->get_option_name() << "' option." << endl;
156        else
157#endif
158            cout << "Error: " << e.what() << endl;
159        cout << endl;
160
161        return -1;
162    }
163
164    if (conf.HasPrint())
165        return -1;
166
167    if (conf.HasVersion())
168    {
169        PrintVersion(argv[0]);
170        return -1;
171    }
172
173    if (conf.HasHelp())
174    {
175        PrintHelp();
176        return -1;
177    }
178
179    // To allow overwriting of DIM_DNS_NODE set 0 to 1
180    setenv("DIM_DNS_NODE", conf.Get<string>("dns").c_str(), 1);
181
182    if (conf.Get<int>("console")==0)
183        RunShell<RemoteShell>(conf);
184    else
185        RunShell<RemoteConsole>(conf);
186
187
188    return 0;
189}
Note: See TracBrowser for help on using the repository browser.