| 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 | } |