Merge pull request #3345 from matt335672/chansrv_log_file_path
Allow a path to be specified for the chansrv log file
This commit is contained in:
@@ -98,7 +98,33 @@ stdout. Use for debugging only\fR
|
|||||||
|
|
||||||
It is ignored in the [ChansrvLogging] section
|
It is ignored in the [ChansrvLogging] section
|
||||||
since the channel server creates one log file per display and instead uses the
|
since the channel server creates one log file per display and instead uses the
|
||||||
following log file naming convention \fIxrdp-chansrv.${DISPLAY}.log\fR
|
following log file naming convention \fIxrdp-chansrv.${DISPLAY}.log\fR. For
|
||||||
|
details of the chansrv log file location, see \fBLogFilePath\fR.
|
||||||
|
|
||||||
|
.TP
|
||||||
|
\fBLogFilePath\fR=\fIstring\fR
|
||||||
|
Directory for storing the chansrv log file. This setting only applies to
|
||||||
|
chansrv. The sesman log file is always created in \fI@localstatedir@/log\fR.
|
||||||
|
|
||||||
|
Created if it doesn't exist.
|
||||||
|
If first character is not a '/', this is relative to $HOME, where
|
||||||
|
chansrv is normally started.
|
||||||
|
|
||||||
|
.RS
|
||||||
|
The following substitutions are made in this string:-
|
||||||
|
%U - Username
|
||||||
|
%u - Numeric UID
|
||||||
|
%% - Percent character
|
||||||
|
|
||||||
|
This is most useful if you are using NFS-mounted home directories, and
|
||||||
|
wish to move the chansrv log file to the local disk.
|
||||||
|
|
||||||
|
If this parameter isn't specified, the log file is stored in one of
|
||||||
|
the following locations :-
|
||||||
|
- $CHANSRV_LOG_PATH
|
||||||
|
- $XDG_DATA_HOME/xrdp
|
||||||
|
- $HOME/.local/share/xrdp
|
||||||
|
.RE
|
||||||
|
|
||||||
.TP
|
.TP
|
||||||
\fBLogLevel\fR=\fIlevel\fR
|
\fBLogLevel\fR=\fIlevel\fR
|
||||||
|
|||||||
+39
-18
@@ -1694,20 +1694,32 @@ get_log_path(char *path, int bytes)
|
|||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
rv = 1;
|
rv = 1;
|
||||||
log_path = g_getenv("CHANSRV_LOG_PATH");
|
if (g_cfg->log_file_path != NULL && g_cfg->log_file_path[0] != '\0')
|
||||||
if (log_path == 0)
|
|
||||||
{
|
{
|
||||||
log_path = g_getenv("XDG_DATA_HOME");
|
char uidstr[64];
|
||||||
if (log_path != 0)
|
char username[64];
|
||||||
|
const struct info_string_tag map[] =
|
||||||
{
|
{
|
||||||
g_snprintf(path, bytes, "%s%s", log_path, "/xrdp");
|
{'u', uidstr},
|
||||||
if (g_directory_exist(path) || (g_mkdir(path) == 0))
|
{'U', username},
|
||||||
{
|
INFO_STRING_END_OF_LIST
|
||||||
rv = 0;
|
};
|
||||||
}
|
|
||||||
|
int uid = g_getuid();
|
||||||
|
g_snprintf(uidstr, sizeof(uidstr), "%d", uid);
|
||||||
|
if (g_getlogin(username, sizeof(username)) != 0)
|
||||||
|
{
|
||||||
|
/* Fall back to UID */
|
||||||
|
g_strncpy(username, uidstr, sizeof(username) - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
(void)g_format_info_string(path, bytes, g_cfg->log_file_path, map);
|
||||||
|
if (g_directory_exist(path) || (g_mkdir(path) == 0))
|
||||||
|
{
|
||||||
|
rv = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else if ((log_path = g_getenv("CHANSRV_LOG_PATH")) != 0)
|
||||||
{
|
{
|
||||||
g_snprintf(path, bytes, "%s", log_path);
|
g_snprintf(path, bytes, "%s", log_path);
|
||||||
if (g_directory_exist(path) || (g_mkdir(path) == 0))
|
if (g_directory_exist(path) || (g_mkdir(path) == 0))
|
||||||
@@ -1715,6 +1727,16 @@ get_log_path(char *path, int bytes)
|
|||||||
rv = 0;
|
rv = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if ((log_path = g_getenv("XDG_DATA_HOME")) != 0)
|
||||||
|
{
|
||||||
|
g_snprintf(path, bytes, "%s%s", log_path, "/xrdp");
|
||||||
|
if (g_directory_exist(path) || (g_mkdir(path) == 0))
|
||||||
|
{
|
||||||
|
rv = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Always fall back to the home directory
|
||||||
if (rv != 0)
|
if (rv != 0)
|
||||||
{
|
{
|
||||||
log_path = g_getenv("HOME");
|
log_path = g_getenv("HOME");
|
||||||
@@ -1830,14 +1852,6 @@ main(int argc, char **argv)
|
|||||||
g_init("xrdp-chansrv"); /* os_calls */
|
g_init("xrdp-chansrv"); /* os_calls */
|
||||||
g_memset(g_drdynvcs, 0, sizeof(g_drdynvcs));
|
g_memset(g_drdynvcs, 0, sizeof(g_drdynvcs));
|
||||||
|
|
||||||
log_path[255] = 0;
|
|
||||||
if (get_log_path(log_path, 255) != 0)
|
|
||||||
{
|
|
||||||
g_writeln("error reading CHANSRV_LOG_PATH and HOME environment variable");
|
|
||||||
main_cleanup();
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
display_text = g_getenv("DISPLAY");
|
display_text = g_getenv("DISPLAY");
|
||||||
if (display_text == NULL)
|
if (display_text == NULL)
|
||||||
{
|
{
|
||||||
@@ -1864,6 +1878,13 @@ main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
config_dump(g_cfg);
|
config_dump(g_cfg);
|
||||||
|
|
||||||
|
if (get_log_path(log_path, sizeof(log_path)) != 0)
|
||||||
|
{
|
||||||
|
g_writeln("error reading CHANSRV_LOG_PATH and HOME environment variable");
|
||||||
|
main_cleanup();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
pid = g_getpid();
|
pid = g_getpid();
|
||||||
|
|
||||||
/* starting logging subsystem */
|
/* starting logging subsystem */
|
||||||
|
|||||||
@@ -46,6 +46,7 @@
|
|||||||
#define DEFAULT_NUM_SILENT_FRAMES_AAC 4
|
#define DEFAULT_NUM_SILENT_FRAMES_AAC 4
|
||||||
#define DEFAULT_NUM_SILENT_FRAMES_MP3 2
|
#define DEFAULT_NUM_SILENT_FRAMES_MP3 2
|
||||||
#define DEFAULT_MSEC_DO_NOT_SEND 1000
|
#define DEFAULT_MSEC_DO_NOT_SEND 1000
|
||||||
|
#define DEFAULT_LOG_FILE_PATH ""
|
||||||
/**
|
/**
|
||||||
* Type used for passing a logging function about
|
* Type used for passing a logging function about
|
||||||
*/
|
*/
|
||||||
@@ -248,6 +249,45 @@ read_config_chansrv(log_func_t logmsg,
|
|||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***************************************************************************//**
|
||||||
|
* Reads the config values we need from the [ChansrvLogging] section
|
||||||
|
*
|
||||||
|
* @param logmsg Function to use to log messages
|
||||||
|
* @param names List of definitions in the section
|
||||||
|
* @params values List of corresponding values for the names
|
||||||
|
* @params cfg Pointer to structure we're filling in
|
||||||
|
*
|
||||||
|
* @return 0 for success
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
read_config_chansrv_logging(log_func_t logmsg,
|
||||||
|
struct list *names, struct list *values,
|
||||||
|
struct config_chansrv *cfg)
|
||||||
|
{
|
||||||
|
int error = 0;
|
||||||
|
int index;
|
||||||
|
|
||||||
|
for (index = 0; index < names->count; ++index)
|
||||||
|
{
|
||||||
|
const char *name = (const char *)list_get_item(names, index);
|
||||||
|
const char *value = (const char *)list_get_item(values, index);
|
||||||
|
|
||||||
|
if (g_strcasecmp(name, "LogFilePath") == 0)
|
||||||
|
{
|
||||||
|
g_free(cfg->log_file_path);
|
||||||
|
cfg->log_file_path = g_strdup(value);
|
||||||
|
if (cfg->log_file_path == NULL)
|
||||||
|
{
|
||||||
|
logmsg(LOG_LEVEL_ERROR, "Can't alloc LogFilePath");
|
||||||
|
error = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
/***************************************************************************//**
|
/***************************************************************************//**
|
||||||
* @brief returns a config block with default values
|
* @brief returns a config block with default values
|
||||||
*
|
*
|
||||||
@@ -259,9 +299,11 @@ new_config(void)
|
|||||||
/* Do all the allocations at the beginning, then check them together */
|
/* Do all the allocations at the beginning, then check them together */
|
||||||
struct config_chansrv *cfg = g_new0(struct config_chansrv, 1);
|
struct config_chansrv *cfg = g_new0(struct config_chansrv, 1);
|
||||||
char *fuse_mount_name = g_strdup(DEFAULT_FUSE_MOUNT_NAME);
|
char *fuse_mount_name = g_strdup(DEFAULT_FUSE_MOUNT_NAME);
|
||||||
if (cfg == NULL || fuse_mount_name == NULL)
|
char *log_file_path = g_strdup(DEFAULT_LOG_FILE_PATH);
|
||||||
|
if (cfg == NULL || fuse_mount_name == NULL || log_file_path == NULL)
|
||||||
{
|
{
|
||||||
/* At least one memory allocation failed */
|
/* At least one memory allocation failed */
|
||||||
|
g_free(log_file_path);
|
||||||
g_free(fuse_mount_name);
|
g_free(fuse_mount_name);
|
||||||
g_free(cfg);
|
g_free(cfg);
|
||||||
cfg = NULL;
|
cfg = NULL;
|
||||||
@@ -279,6 +321,7 @@ new_config(void)
|
|||||||
cfg->num_silent_frames_aac = DEFAULT_NUM_SILENT_FRAMES_AAC;
|
cfg->num_silent_frames_aac = DEFAULT_NUM_SILENT_FRAMES_AAC;
|
||||||
cfg->num_silent_frames_mp3 = DEFAULT_NUM_SILENT_FRAMES_MP3;
|
cfg->num_silent_frames_mp3 = DEFAULT_NUM_SILENT_FRAMES_MP3;
|
||||||
cfg->msec_do_not_send = DEFAULT_MSEC_DO_NOT_SEND;
|
cfg->msec_do_not_send = DEFAULT_MSEC_DO_NOT_SEND;
|
||||||
|
cfg->log_file_path = log_file_path;
|
||||||
}
|
}
|
||||||
|
|
||||||
return cfg;
|
return cfg;
|
||||||
@@ -329,6 +372,12 @@ config_read(int use_logger, const char *sesman_ini)
|
|||||||
error = read_config_chansrv(logmsg, names, values, cfg);
|
error = read_config_chansrv(logmsg, names, values, cfg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!error &&
|
||||||
|
file_read_section(fd, "ChansrvLogging", names, values) == 0)
|
||||||
|
{
|
||||||
|
error = read_config_chansrv_logging(logmsg, names, values, cfg);
|
||||||
|
}
|
||||||
|
|
||||||
list_delete(names);
|
list_delete(names);
|
||||||
list_delete(values);
|
list_delete(values);
|
||||||
}
|
}
|
||||||
@@ -375,6 +424,8 @@ config_dump(struct config_chansrv *config)
|
|||||||
g_writeln(" FileMask: 0%o", config->file_umask);
|
g_writeln(" FileMask: 0%o", config->file_umask);
|
||||||
g_writeln(" Nautilus 3 Flist Format: %s",
|
g_writeln(" Nautilus 3 Flist Format: %s",
|
||||||
g_bool2text(config->use_nautilus3_flist_format));
|
g_bool2text(config->use_nautilus3_flist_format));
|
||||||
|
g_writeln(" LogFilePath : %s",
|
||||||
|
(config->log_file_path[0]) ? config->log_file_path : "<default>");
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
@@ -385,6 +436,7 @@ config_free(struct config_chansrv *cc)
|
|||||||
{
|
{
|
||||||
g_free(cc->listen_port);
|
g_free(cc->listen_port);
|
||||||
g_free(cc->fuse_mount_name);
|
g_free(cc->fuse_mount_name);
|
||||||
|
g_free(cc->log_file_path);
|
||||||
g_free(cc);
|
g_free(cc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,6 +50,9 @@ struct config_chansrv
|
|||||||
unsigned int num_silent_frames_mp3;
|
unsigned int num_silent_frames_mp3;
|
||||||
/** Do net send sound data afer SNDC_CLOSE is sent. unit is millisecond, setting from sesman.ini */
|
/** Do net send sound data afer SNDC_CLOSE is sent. unit is millisecond, setting from sesman.ini */
|
||||||
unsigned int msec_do_not_send;
|
unsigned int msec_do_not_send;
|
||||||
|
|
||||||
|
/** LogFilePath from sesman.ini ([ChansrvLogging]) */
|
||||||
|
char *log_file_path;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -204,6 +204,11 @@ EnableSyslog=true
|
|||||||
#EnableConsole=false
|
#EnableConsole=false
|
||||||
#ConsoleLevel=INFO
|
#ConsoleLevel=INFO
|
||||||
#EnableProcessId=false
|
#EnableProcessId=false
|
||||||
|
; Log file path
|
||||||
|
; Set this to move the log file away from its default location. You may want
|
||||||
|
; to do this for (e.g.) NFS-mounted home directories
|
||||||
|
; See sesman.ini(5) for the format of this parameter
|
||||||
|
#LogFilePath=/run/user/%u/xrdp
|
||||||
|
|
||||||
[ChansrvLoggingPerLogger]
|
[ChansrvLoggingPerLogger]
|
||||||
; Note: per logger configuration is only used if xrdp is built with
|
; Note: per logger configuration is only used if xrdp is built with
|
||||||
|
|||||||
Reference in New Issue
Block a user