master
c 128 lines 4.46 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 #include "common.h"
4
5 void verify_required_directory(const char *env, const char *dir, bool create_it, int perms) {
6 errno_clear();
7
8 if (!dir || *dir != '/')
9 fatal("Invalid directory path (must be an absolute path): '%s' (%s)", dir, env?env:"");
10
11 if (chdir(dir) == 0) {
12 if(env)
13 nd_setenv(env, dir, 1);
14 return;
15 }
16
17 if(create_it) {
18 if(mkdir(dir, perms) == 0) {
19 if(env)
20 nd_setenv(env, dir, 1);
21 return;
22 }
23 }
24
25 char path[PATH_MAX];
26 strncpyz(path, dir, sizeof(path) - 1);
27 struct stat st;
28
29 char *p = path;
30 while (*p) {
31 if (p != path && *p == '/') {
32 *p = '\0';
33
34 errno_clear();
35 if (stat(path, &st) == -1)
36 fatal("Required directory: '%s' (%s) - Missing or inaccessible component: '%s'",
37 dir, env?env:"", path);
38
39 if (!S_ISDIR(st.st_mode))
40 fatal("Required directory: '%s' (%s) - Component '%s' exists but is not a directory.",
41 dir, env?env:"", path);
42
43 *p = '/';
44 }
45 p++;
46 }
47
48 if (stat(dir, &st) == -1)
49 fatal("Required directory: '%s' (%s) - Missing or inaccessible: '%s'",
50 dir, env?env:"", dir);
51
52 if (!S_ISDIR(st.st_mode))
53 fatal("Required directory: '%s' (%s) - '%s' exists but is not a directory.",
54 dir, env?env:"", dir);
55
56 if (access(dir, R_OK | X_OK) == -1)
57 fatal("Required directory: '%s' (%s) - Insufficient permissions for: '%s'",
58 dir, env?env:"", dir);
59
60 fatal("Required directory: '%s' (%s) - Failed",
61 dir, env?env:"");
62 }
63
64 void set_environment_for_plugins_and_scripts(void) {
65 {
66 char b[16];
67 snprintfz(b, sizeof(b) - 1, "%d", (int)nd_profile.update_every);
68 nd_setenv("NETDATA_UPDATE_EVERY", b, 1);
69 }
70
71 nd_setenv("NETDATA_VERSION", NETDATA_VERSION, 1);
72 nd_setenv("NETDATA_HOSTNAME", netdata_configured_hostname, 1);
73 nd_setenv("NETDATA_HOST_PREFIX", netdata_configured_host_prefix, 1);
74
75 verify_required_directory("NETDATA_CONFIG_DIR", netdata_configured_user_config_dir, false, 0);
76 verify_required_directory("NETDATA_USER_CONFIG_DIR", netdata_configured_user_config_dir, false, 0);
77 verify_required_directory("NETDATA_STOCK_CONFIG_DIR", netdata_configured_stock_config_dir, false, 0);
78 verify_required_directory("NETDATA_STOCK_DATA_DIR", netdata_configured_stock_data_dir, false, 0);
79 verify_required_directory("NETDATA_PLUGINS_DIR", netdata_configured_primary_plugins_dir, false, 0);
80 verify_required_directory("NETDATA_WEB_DIR", netdata_configured_web_dir, false, 0);
81 verify_required_directory("NETDATA_CACHE_DIR", netdata_configured_cache_dir, true, 0775);
82 verify_required_directory("NETDATA_LIB_DIR", netdata_configured_varlib_dir, true, 0775);
83 verify_required_directory("NETDATA_LOG_DIR", netdata_configured_log_dir, true, 0775);
84 verify_required_directory("CLAIMING_DIR", netdata_configured_cloud_dir, true, 0770);
85
86 {
87 BUFFER *user_plugins_dirs = buffer_create(FILENAME_MAX, NULL);
88
89 for (size_t i = 1; i < PLUGINSD_MAX_DIRECTORIES && plugin_directories[i]; i++) {
90 if (i > 1)
91 buffer_strcat(user_plugins_dirs, " ");
92 buffer_strcat(user_plugins_dirs, plugin_directories[i]);
93 }
94
95 nd_setenv("NETDATA_USER_PLUGINS_DIRS", buffer_tostring(user_plugins_dirs), 1);
96
97 buffer_free(user_plugins_dirs);
98 }
99
100 const char *default_port = inicfg_get(&netdata_config, CONFIG_SECTION_WEB, "default port", NULL);
101 int clean = 0;
102 if (!default_port) {
103 default_port = strdupz("19999");
104 clean = 1;
105 }
106
107 nd_setenv("NETDATA_LISTEN_PORT", default_port, 1);
108 if (clean)
109 freez((char *)default_port);
110
111 // set the path we need
112 char path[4096];
113 const char *p = getenv("PATH");
114 if (!p) p = "/bin:/usr/bin";
115 snprintfz(path, sizeof(path), "%s:%s", p, "/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin");
116 setenv("PATH", inicfg_get_path_list(&netdata_config, CONFIG_SECTION_ENV_VARS, "PATH", path), 1);
117
118 // python options
119 p = getenv("PYTHONPATH");
120 if (!p) p = "";
121 setenv("PYTHONPATH", inicfg_get_path_list(&netdata_config, CONFIG_SECTION_ENV_VARS, "PYTHONPATH", p), 1);
122
123 // disable buffering for python plugins
124 setenv("PYTHONUNBUFFERED", "1", 1);
125
126 // switch to standard locale for plugins
127 setenv("LC_ALL", "C", 1);
128 }