32 #include <boost/bind.hpp>
33 #include <boost/function.hpp>
34 #include <boost/program_options.hpp>
37 namespace fs = boost::filesystem;
38 namespace po = boost::program_options;
54 "L'arrel ha de ser un directori existent i llegible";
60 template<
typename TipusExcepcio>
62 if (!fs::exists(candidata) || !fs::is_directory(candidata)) {
90 const vector<string> rutes,
97 for (
auto it=rutes.begin(); it != rutes.end(); ++it) {
98 permisos_preparats.push_back( make_pair(*it, permisos) );
112 : argc_(argc), argv_(argv),
128 po::options_description clidesc(
"Opcions de línia de comandes"), cfgdesc(
"Configuració");
129 clidesc.add_options()
130 (
"help",
"mostra aquest missatge d'ajuda")
133 "fitxer de configuració")
134 (
"version",
"mostra informació de l'entorn de compilació")
140 cfgdesc.add_options()
143 "especifica el port en què escoltar")
146 "directori arrel dels documents del servidor")
149 "fitxer d'índex per defecte")
151 po::value<string>(&auth_user_)->default_value(
""),
152 "nom d'usuari per directoris d'accés restringit")
154 po::value<string>(&auth_pass_)->default_value(
""),
155 "contrasenya per directoris d'accés restringit")
158 "nombre de fils simultanis")
161 "realme d'autenticació")
163 po::value< vector<string> >()
166 "ruta privada (error 403 en accedir-hi); es poden definir múltiples")
168 po::value< vector<string> >()
171 "ruta protegida (requereix usuari/contrasenya); es poden definir múltiples")
173 po::value< vector<string> >()
176 "ruta en què es permet executar CGIs; es poden definir múltiples")
178 po::value< vector<string> >()
181 "ruta en què es permeten mètodes d'escriptura (PUT i DELETE); "
182 "es poden definir múltiples")
184 po::value< vector<string> >()
187 "ruta en què es permet accés de lectura (GET, HEAD, ...); "
188 "permet definir permisos més laxos dintre de rutes restringrides; "
189 "es poden definir múltiples ")
195 po::options_description desc(
"Opcions");
201 po::variables_map varmap;
203 po::store(po::parse_command_line(argc_, argv_, desc), varmap);
204 valida_arrel<ErrorLiniaComandes>(varmap[
"arrel"].as<
fs::path>());
220 po::store(po::parse_config_file<char>(cfg.string().c_str(), cfgdesc), varmap);
221 valida_arrel<ErrorConfiguracio>(varmap[
"arrel"].as<
fs::path>());
223 catch (
const po::error & e) {
228 catch (
const po::error & e) {
234 config_ = fs::canonical(config_);
237 if (varmap.count(
"help")) {
242 if (varmap.count(
"version")) {
245 arrel_ = fs::canonical(arrel_);
248 index_ =
fs::path(index_).filename().string();
251 cerber_.defineix_regla(arrel_,
LECTURA);
252 cerber_.defineix_regla(arrel_.parent_path(),
PRIVAT);
262 if (!tmp.has_root_directory()) {
266 if (fs::exists(tmp)) {
267 tmp = fs::canonical(tmp);
279 CreaRuta ruta_absoluta;
280 for (
auto it=permisos_preparats.begin(); it!=permisos_preparats.end(); ++it) {
281 cerr <<
"Permís configurat: " << it->first <<
": " <<
nom_permis(it->second) << endl;
283 cerber_.defineix_regla(ruta_absoluta(it->first, arrel_), it->second);
287 assert( fs::exists(arrel_) );
288 assert( fs::is_directory(arrel_) );
289 assert( arrel_ == fs::canonical(arrel_) );
294 const bool config_existeix = fs::exists(c.
config());
299 return os <<
"Configuració {"
300 <<
"\n\tPort: " << c.
port()
301 <<
"\n\tArrel: " << c.
arrel()
302 <<
"\n\tNombre de fils: " << c.
fils()
303 <<
"\n\tIndex: " << c.
index()
304 <<
"\n\tConfiguració: " << c.
config()
305 <<
" [" << (config_existeix ?
"" :
"no ") <<
"existeix]"
306 <<
"\n\tNom d'usuari: " << c.
usuari()
308 <<
"\n\tRealme: " << c.
realme()