#!/bin/bash #================================================= # GENERIC START #================================================= # IMPORT GENERIC HELPERS #================================================= source _common.sh source /usr/share/yunohost/helpers #================================================= # MANAGE SCRIPT FAILURE #================================================= ynh_clean_setup () { ### Remove this function if there's nothing to clean before calling the remove script. true } # Exit if an error occurs during the execution of the script ynh_abort_if_errors #================================================= # RETRIEVE ARGUMENTS FROM THE MANIFEST #================================================= domain=$YNH_APP_ARG_DOMAIN path_url=$YNH_APP_ARG_PATH admin=$YNH_APP_ARG_ADMIN is_public=$YNH_APP_ARG_IS_PUBLIC app=$YNH_APP_INSTANCE_NAME #================================================= # CHECK IF THE APP CAN BE INSTALLED WITH THESE ARGS #================================================= ynh_script_progression --message="Validating installation parameters..." --weight=1 # Register (book) web path ynh_webpath_register --app=$app --domain=$domain --path_url=$path_url #================================================= # STORE SETTINGS FROM MANIFEST #================================================= ynh_script_progression --message="Storing installation settings..." --weight=2 ynh_app_setting_set --app=$app --key=domain --value=$domain ynh_app_setting_set --app=$app --key=path --value=$path_url ynh_app_setting_set --app=$app --key=admin --value=$admin ynh_app_setting_set --app=$app --key=is_public --value=$is_public #================================================= # STANDARD MODIFICATIONS #================================================= # FIND AND OPEN A PORT #================================================= ynh_script_progression --message="Configuring port..." --weight=1 # Find an available port port=$(ynh_find_port --port=3000) ynh_app_setting_set --app=$app --key=port --value=$port #================================================= # INSTALL DEPENDENCIES #================================================= ynh_script_progression --message="Installing dependencies..." --weight=44 ynh_install_app_dependencies $pkg_dependencies ynh_install_extra_app_dependencies --repo="deb https://packages.grafana.com/oss/deb stable main" --package="grafana" --key="https://packages.grafana.com/gpg.key" #================================================= # CREATE A MYSQL DATABASE #================================================= ynh_script_progression --message="Creating a MySQL database..." --weight=2 db_name=$(ynh_sanitize_dbid --db_name=$app) db_user=$db_name ynh_app_setting_set --app=$app --key=db_name --value=$db_name ynh_mysql_setup_db --db_user=$db_user --db_name=$db_name #================================================= # DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= # None in this package (all APT-based) #================================================= # NGINX CONFIGURATION #================================================= ynh_script_progression --message="Configuring nginx web server..." --weight=1 ### `ynh_add_nginx_config` will use the file conf/nginx.conf # Create a dedicated nginx config ynh_add_nginx_config #================================================= # SPECIFIC SETUP #================================================= ynh_script_progression --message="Configuring Grafana and InfluxDB..." --weight=30 # If NetData is installed, configure it to feed InfluxDB netdata_conf="/opt/netdata/etc/netdata/netdata.conf" if [ -f "$netdata_conf" ] ; then # If there is already a [backend] section if [ -n "$(cat $netdata_conf | grep '\[backend\]')" ] ; then # These regexps replaces patterns inside ini [sections] ([backend] section, here) # (source: https://stackoverflow.com/a/16987794) sed -i '/^\[backend\]$/,/^\[/ { s/# enabled = no/enabled = yes/ s/# type = graphite/type = opentsdb/ s/# destination = localhost/destination = localhost:4242/ s/# update every = 10/update every = 60/ }' $netdata_conf else # Otherwise create the section echo "[backend] enabled = yes type = opentsdb destination = localhost:4242" | tee -a $netdata_conf fi # Restart NetData ynh_systemd_action --service_name=netdata --action="restart" fi # Configure InfluxDB if [ -f /etc/influxdb/influxdb.conf ] ; then sed -i '/^\[\[opentsdb\]\]$/,/^\[/ s/enabled = false/enabled = true/' /etc/influxdb/influxdb.conf else [ -d /etc/influxdb ] || mkdir /etc/influxdb cp ../conf/influxdb.conf /etc/influxdb fi # Start InfluxDB server ynh_systemd_action --service_name=influxdb --action="restart" # Configure Grafana cp ../conf/ldap.toml /etc/grafana grafana_conf="/etc/grafana/grafana.ini" # Set final port sed -i "/^\[server\]$/,/^\[/ s@;http_port = .*@http_port = $port@" $grafana_conf # Set domain sed -i "/^\[server\]$/,/^\[/ s@;domain = .*@domain = $domain@" $grafana_conf # Set final URL sed -i "/^\[server\]$/,/^\[/ s@;root_url = .*@root_url = https://$domain$path_url@" $grafana_conf # Specify if using sub_path if [ "$path_url" != "/" ]; then sed -i "/^\[server\]$/,/^\[/ s@;serve_from_sub_path = .*@serve_from_sub_path = true@" $grafana_conf else sed -i "/^\[server\]$/,/^\[/ s@;serve_from_sub_path = .*@serve_from_sub_path = false@" $grafana_conf fi # Disable check for updates sed -i '/^\[analytics\]$/,/^\[/ s/;check_for_updates = .*/check_for_updates = false/' $grafana_conf # Disable analytics reporting sed -i '/^\[analytics\]$/,/^\[/ s/;reporting_enabled = .*/reporting_enabled = false/' $grafana_conf # Disable organization creation sed -i '/^\[users\]$/,/^\[/ s/;allow_org_create = .*/allow_org_create = false/' $grafana_conf # Enable HTTP and LDAP authentication sed -i '/^\[auth.basic\]$/,/^\[/ s/;enabled = .*/enabled = false/' $grafana_conf sed -i '/^\[auth.proxy\]$/,/^\[/ s/;enabled = .*/enabled = true/' $grafana_conf sed -i '/^\[auth.ldap\]$/,/^\[/ { s/;enabled = .*/enabled = true/ s/;allow_sign_up = .*/allow_sign_up = true/ }' $grafana_conf # Set log level to debug sed -i '/^\[log\]$/,/^\[/ s/;level = .*/level = debug/' $grafana_conf # Change URL and database credentials sed -i "/^\[database\]$/,/^\[/ { s/;type = .*/type = mysql/ s/;name = .*/name = $db_name/ s/;user = .*/user = $db_user/ s/;\?password =.*/password = $db_pwd/ }" $grafana_conf # Calculate and store the config file checksum into the app settings ynh_store_file_checksum --file="$grafana_conf" # Start Grafana and wait for it to be fully started ynh_systemd_action --service_name=grafana-server --action="restart" --log_path="/var/log/grafana/grafana.log" --line_match="HTTP Server Listen" --timeout=600 # Change admin name to the specified one mail=$(ynh_user_get_info "$admin" 'mail') ynh_mysql_connect_as --user=$db_user --password=$db_pwd --database=$db_name <<< "UPDATE user SET login=\"$admin\", email=\"$mail\" WHERE login=\"admin\";" # Create InfluxDB data source ynh_mysql_connect_as --user=$db_user --password=$db_pwd --database=$db_name <<< "INSERT INTO data_source (id, org_id, version, type, name, access, url, password, user, \`database\`, basic_auth, basic_auth_user, basic_auth_password, is_default, json_data, created, updated, with_credentials, secure_json_data) VALUES (99999, 1, 0, 'influxdb', 'InfluxDB', 'proxy', 'http://localhost:8086', '', '', 'opentsdb', 0, '', '', 0, '{\"tsdbResolution\":1,\"tsdbVersion\":1}', '2017-02-12 14:35:33', '2017-02-12 14:36:27', 0, '{}');" # Import default dashboard for NetData (source: https://grafana.com/grafana/dashboards/2701) # Remove new lines tr -d '\n' < ../conf/netdata_dashboard.json > dashboard.json # Fill the template with the defined data source sed -i 's/${DS_CENTCOM-INFLUXDB}/InfluxDB/g' dashboard.json # Escape the dashboard definition for MySQL query (source: https://stackoverflow.com/a/4383994) dashboard=$(cat dashboard.json) printf -v escaped_dashboard "%q" "$dashboard" # Import dashboard into MySQL ynh_mysql_connect_as --user=$db_user --password=$db_pwd --database=$db_name <<< "INSERT INTO dashboard (id, version, slug, title, data, org_id, created, updated, uid) VALUES (99999, 0, 'NetData', 'NetData', \"$escaped_dashboard\", 1, '2020-05-16 14:36:50', '2020-05-16 14:36:50', 'yunohost');" # Add dashboard version ynh_mysql_connect_as --user=$db_user --password=$db_pwd --database=$db_name <<< "INSERT INTO dashboard_version (id, dashboard_id, parent_version, restored_from, version, created, created_by, message, data) VALUES (99999, 99999, 0, 0, 1, '2020-05-16 14:36:50', 1, 'YunoHost installer', \"$escaped_dashboard\");" # Enable the systemd service so that InfluxDB and Grafana start at boot systemctl enable influxdb.service systemctl enable grafana-server.service #================================================= # GENERIC FINALIZATION #================================================= #================================================= # INTEGRATE SERVICE IN YUNOHOST #================================================= yunohost service add influxdb --description "open source time series database" --log "/var/log/grafana/grafana.log" yunohost service add grafana-server --description "open source analytics and monitoring solution" --log "/var/log/grafana/grafana.log" #================================================= # START SYSTEMD SERVICE #================================================= ynh_script_progression --message="Starting a systemd service..." --weight=2 ynh_systemd_action --service_name=grafana-server --action="restart" --log_path="/var/log/grafana/grafana.log" --line_match="HTTP Server Listen" --timeout=600 #================================================= # SETUP SSOWAT #================================================= ynh_script_progression --message="Configuring SSOwat..." --weight=1 # Make app public if necessary if [ $is_public -eq 1 ] then # unprotected_uris allows SSO credentials to be passed anyway. ynh_app_setting_set --app=$app --key=unprotected_uris --value="/" fi #================================================= # RELOAD NGINX #================================================= ynh_script_progression --message="Reloading nginx web server..." --weight=1 ynh_systemd_action --service_name=nginx --action=reload #================================================= # END OF SCRIPT #================================================= ynh_script_progression --message="Installation of $app completed" --last