/* * Copyright (C) 2019 Weber Yann * * This file is part of PyFCGI. * * PyFCGI is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. * * PyFCGI is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with PyFCGI. If not, see . */ #ifndef __CONF_H___ #define __CONF_H___ #include #include #include #include #include "config.h" /**@defgroup conf_internal PYFCGI configuration handling */ /**@defgroup conf_glob PYFCGI global (for all process) configurations * @see struct_pyfcgi_conf_s * @ingroup conf_internal */ #include "logger.h" #include "pyutils.h" /**@defgroup ret_status Function & process return status */ #define PYFCGI_ERR 16 /**@ingroup ret_status */ #define PYFCGI_WORKER_FAIL 32 /**@ingroup ret_status */ #define PYFCGI_MASTER_FAIL 64 /**@ingroup ret_status */ #define PYFCGI_FATAL 128 #define PYFCGI_NAME "spawn-fcgi [OPTIONS] -- pyfcgi" #define PYFCGI_SHORT_OPT "Ce:E:w:W:m:L:Svh" #define PYFCGI_LONG_OPT { \ {"config", required_argument, 0, 'C'},\ {"pymodule", required_argument, 0, 'e'},\ {"pyapp", required_argument, 0, 'E'},\ {"min-worker", required_argument, 0, 'w'},\ {"max-worker", required_argument, 0, 'W'},\ {"max-request", required_argument, 0, 'm'},\ {"log", required_argument, 0, 'L'},\ {"syslog", no_argument, 0, 'S'},\ {"pid-file", required_argument, 0, 'P'},\ {"version", no_argument, 0, 'v'},\ {"help", no_argument, 0, 'h' },\ {0, 0, 0, 0}\ } #define PYFCGI_OPT_HELP {\ {"Load options from configuration file", "CONFIG"},\ {"Search application function in given python module", "MODULE_NAME"},\ {"Python application entrypoint function name", "FUNC_NAME"},\ {"Minimum worker in the pool", "INT"},\ {"Maximum worker in the pool", "INT"},\ {"Request count after wich the worker is restarted (if 0 never restart)", "INT"},\ {"Add a logfile using syntax : 'LOGFILE[;FILT][;FMT]'", "LOGGER_SPEC"},\ {"Use syslog for logging", NULL},\ {"Create a PID file", "FILENAME"},\ {"Print PyFCGI and Python version and exit", NULL},\ {"Display this help and exit", NULL},\ } #define PYFCGI_HELP_TEXT "\n\ Logger specification format 'LOGFILE[;FILT][;FMT]' with :\n\ \t- LOGFILE the log file name\n\ \t- FILT a number (in decimal or hexadicimal 0xXX) indicating wich\n\ \t facility/level to log\n\ \t- FMT the logline format in a special markup format using fields between { }\n\ \t supported fields are :\n\ \t\t- {datetime} {datetime:SIZE} {datetime:SIZE:FMT} defines a format and a \n\ \t\t constant length for a datetime field. Default : {datetime:25:%F %T%z}\n\ \t\t- {level} the loglevel \n\ \t\t- {facility} the log facility\n\ \t\t- {pid} the process PID\n\ \t\t- {ident} the defined ident (set by process)\n\ \t\t- {msg} the log message (can only appear once)\n\ You can escape { and } by using {{ and }} and all field names can by\n\ abbreviated to one character.\n" #define PYENTRY_DEFAULT_FUN "application" /**@brief Friendly name for @ref struct pyfcgi_conf_s * @see struct pyfcgi_conf_s */ typedef struct pyfcgi_conf_s pyfcgi_conf_t; typedef struct pyfcgi_conf_logger_s pyfcgi_conf_logger_t; typedef struct pyfcgi_context_s pyfcgi_context_t; struct pyfcgi_context_s { pid_t pid; pid_t ppid; char *pidfile; }; /**@brief Structure containing configuration * @ingroup conf_internal * The structure is used for the global @ref pyfcgi_conf variable. * @see pyfcgi_conf_t */ struct pyfcgi_conf_s { /**@brief Entrypoint module name * @ingroup conf_glob */ char *py_entrymod; /**@brief Entrypoint function name * @ingroup conf_glob */ char *py_entryfun; /**@brief Minimum count worker in pool * @ingroup conf_glob */ int min_wrk; /**@brief Maximum count workers in pool * @ingroup conf_glob */ int max_wrk; /**@brief Maximum request before a worker restarts (0 for no restart) * @ingroup conf_glob */ int max_reqs; /**@brief Logger configuration * @ingroupe conf_glob */ pyfcgi_conf_logger_t logs; /**@brief Context informations */ pyfcgi_context_t context; }; /**@brief Configuration globals, inherited from parent to childs */ pyfcgi_conf_t PyFCGI_conf; /**@brief Print usage on FD 2 (stdout) */ void usage(); /**@brief Print pyfcgi & python version on given fd */ void print_version(int); /**@brief Init conf with default values */ void default_conf(); /**@brief Parse arguments and store them in conf * @return 0 if no error */ int parse_args(int argc, char *argv[]); int check_entrypoint_import(); int parse_optlog(const char*); #endif