#!/usr/bin/env bash
'''':;
pybinary=$(which python3 || which python || which python2)
filtered=()
for arg in "$@"
do
case $arg in
-p*) pybinary=${arg:2}
shift 1 ;;
*) filtered+=("$arg") ;;
esac
done
if [ "$pybinary" = "" ]
then
echo "ERROR python IS NOT AVAILABLE IN THIS SYSTEM"
exit 1
fi
exec "$pybinary" "$0" "${filtered[@]}" # '''
# -*- coding: utf-8 -*-
# Description:
# Author: Pawel Krupa (paulfantom)
# Author: Ilya Mashchenko (l2isbad)
# SPDX-License-Identifier: GPL-3.0-or-later
import collections
import copy
import gc
import json
import os
import pprint
import re
import sys
import threading
import time
import types
try:
from queue import Queue
except ImportError:
from Queue import Queue
PY_VERSION = sys.version_info[:2] # (major=3, minor=7, micro=3, releaselevel='final', serial=0)
if PY_VERSION > (3, 1):
from importlib.machinery import SourceFileLoader
else:
from imp import load_source as SourceFileLoader
ENV_NETDATA_USER_CONFIG_DIR = 'NETDATA_USER_CONFIG_DIR'
ENV_NETDATA_STOCK_CONFIG_DIR = 'NETDATA_STOCK_CONFIG_DIR'
ENV_NETDATA_PLUGINS_DIR = 'NETDATA_PLUGINS_DIR'
ENV_NETDATA_USER_PLUGINS_DIRS = 'NETDATA_USER_PLUGINS_DIRS'
ENV_NETDATA_LIB_DIR = 'NETDATA_LIB_DIR'
ENV_NETDATA_UPDATE_EVERY = 'NETDATA_UPDATE_EVERY'
ENV_NETDATA_LOCK_DIR = 'NETDATA_LOCK_DIR'
def add_pythond_packages():
pluginsd = os.getenv(ENV_NETDATA_PLUGINS_DIR, os.path.dirname(__file__))
pythond = os.path.abspath(pluginsd + '/../python.d')
packages = os.path.join(pythond, 'python_modules')
sys.path.append(packages)
add_pythond_packages()
from bases.collection import safe_print
from bases.loggers import PythonDLogger
from bases.loaders import load_config
from third_party import filelock
try:
from collections import OrderedDict
except ImportError:
from third_party.ordereddict import OrderedDict
def dirs():
var_lib = os.getenv(
ENV_NETDATA_LIB_DIR,
'@varlibdir_POST@',
)
plugin_user_config = os.getenv(
ENV_NETDATA_USER_CONFIG_DIR,
'@configdir_POST@',
)
plugin_stock_config = os.getenv(
ENV_NETDATA_STOCK_CONFIG_DIR,
'@libconfigdir_POST@',
)
pluginsd = os.getenv(
ENV_NETDATA_PLUGINS_DIR,
os.path.dirname(__file__),
)
locks = os.getenv(
ENV_NETDATA_LOCK_DIR,
os.path.join('@varlibdir_POST@', 'lock')
)
modules_user_config = os.path.join(plugin_user_config, 'python.d')
modules_stock_config = os.path.join(plugin_stock_config, 'python.d')
modules = os.path.abspath(pluginsd + '/../python.d')
user_modules = [os.path.join(p, 'python.d') for p in
os.getenv(ENV_NETDATA_USER_PLUGINS_DIRS, "").split(" ") if
p]
Dirs = collections.namedtuple(
'Dirs',
[
'plugin_user_config',
'plugin_stock_config',
'modules_user_config',
'modules_stock_config',
'modules',
'user_modules',
'var_lib',
'locks',
]
)
return Dirs(
plugin_user_config,
plugin_stock_config,
modules_user_config,
modules_stock_config,
modules,
user_modules,
var_lib,
locks,
)
DIRS = dirs()
IS_ATTY = sys.stdout.isatty() or sys.stderr.isatty()
MODULE_SUFFIX = '.chart.py'
def find_available_modules(*directories):
AvailableModule = collections.namedtuple(
'AvailableModule',
[
'filepath',
'name',
]
)
available = list()
for d in directories:
try:
if not os.path.isdir(d):
continue
files = sorted(os.listdir(d))
except OSError:
continue
modules = [m for m in files if m.endswith(MODULE_SUFFIX)]
available.extend([AvailableModule(os.path.join(d, m), m[:-len(MODULE_SUFFIX)]) for m in modules])
return available
def available_modules():
obsolete = (
'apache_cache', # replaced by web_log
'cpuidle', # rewritten in C
'cpufreq', # rewritten in C
'gunicorn_log', # replaced by web_log
'linux_power_supply', # rewritten in C
'nginx_log', # replaced by web_log
'mdstat', # rewritten in C
'sslcheck', # rewritten in Go, memory leak bug https://github.com/netdata/netdata/issues/5624
'unbound', # rewritten in Go
)
stock = [m for m in find_available_modules(DIRS.modules) if m.name not in obsolete]
user = find_available_modules(*DIRS.user_modules)
available, seen = list(), set()
for m in user + stock:
if m.name in seen:
continue
seen.add(m.name)
available.append(m)
return available
AVAILABLE_MODULES = available_modules()
JOB_BASE_CONF = {
'update_every': int(os.getenv(ENV_NETDATA_UPDATE_EVERY, 1)),
'priority': 60000,
'autodetection_retry': 0,
'chart_cleanup': 10,
'penalty': True,
'name': str(),
}
PLUGIN_BASE_CONF = {
'enabled': True,
'default_run': True,
'gc_run': True,
'gc_interval': 300,
}
def multi_path_find(name, *paths):
for path in paths:
abs_name =