1
0
Fork 0
mirror of https://github.com/NixOS/nixpkgs.git synced 2025-06-27 11:36:29 +03:00
nixpkgs/nixos/modules/services/web-apps/cloudlog.nix
Silvan Mosberger 4f0dadbf38 treewide: format all inactive Nix files
After final improvements to the official formatter implementation,
this commit now performs the first treewide reformat of Nix files using it.
This is part of the implementation of RFC 166.

Only "inactive" files are reformatted, meaning only files that
aren't being touched by any PR with activity in the past 2 months.
This is to avoid conflicts for PRs that might soon be merged.
Later we can do a full treewide reformat to get the rest,
which should not cause as many conflicts.

A CI check has already been running for some time to ensure that new and
already-formatted files are formatted, so the files being reformatted here
should also stay formatted.

This commit was automatically created and can be verified using

    nix-build https://github.com/infinisil/treewide-nixpkgs-reformat-script/archive/a08b3a4d199c6124ac5b36a889d9099b4383463f.tar.gz \
      --argstr baseRev b32a094368
    result/bin/apply-formatting $NIXPKGS_PATH
2024-12-10 20:26:33 +01:00

522 lines
16 KiB
Nix

{
config,
pkgs,
lib,
...
}:
with lib;
let
cfg = config.services.cloudlog;
dbFile =
let
password =
if cfg.database.createLocally then
"''"
else
"trim(file_get_contents('${cfg.database.passwordFile}'))";
in
pkgs.writeText "database.php" ''
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
$active_group = 'default';
$query_builder = TRUE;
$db['default'] = array(
'dsn' => "",
'hostname' => '${cfg.database.host}',
'username' => '${cfg.database.user}',
'password' => ${password},
'database' => '${cfg.database.name}',
'dbdriver' => 'mysqli',
'dbprefix' => "",
'pconnect' => TRUE,
'db_debug' => (ENVIRONMENT !== 'production'),
'cache_on' => FALSE,
'cachedir' => "",
'char_set' => 'utf8mb4',
'dbcollat' => 'utf8mb4_general_ci',
'swap_pre' => "",
'encrypt' => FALSE,
'compress' => FALSE,
'stricton' => FALSE,
'failover' => array(),
'save_queries' => TRUE
);
'';
configFile = pkgs.writeText "config.php" ''
<?php
include('${pkgs.cloudlog}/install/config/config.php');
$config['datadir'] = "${cfg.dataDir}/";
$config['base_url'] = "${cfg.baseUrl}";
${cfg.extraConfig}
'';
package = pkgs.stdenv.mkDerivation rec {
pname = "cloudlog";
version = src.version;
src = pkgs.cloudlog;
installPhase = ''
mkdir -p $out
cp -r * $out/
ln -s ${configFile} $out/application/config/config.php
ln -s ${dbFile} $out/application/config/database.php
# link writable directories
for directory in updates uploads backup logbook; do
rm -rf $out/$directory
ln -s ${cfg.dataDir}/$directory $out/$directory
done
# link writable asset files
for asset in dok sota wwff; do
rm -rf $out/assets/json/$asset.txt
ln -s ${cfg.dataDir}/assets/json/$asset.txt $out/assets/json/$asset.txt
done
'';
};
in
{
options.services.cloudlog = with types; {
enable = mkEnableOption "Cloudlog";
dataDir = mkOption {
type = str;
default = "/var/lib/cloudlog";
description = "Cloudlog data directory.";
};
baseUrl = mkOption {
type = str;
default = "http://localhost";
description = "Cloudlog base URL";
};
user = mkOption {
type = str;
default = "cloudlog";
description = "User account under which Cloudlog runs.";
};
database = {
createLocally = mkOption {
type = types.bool;
default = true;
description = "Create the database and database user locally.";
};
host = mkOption {
type = str;
description = "MySQL database host";
default = "localhost";
};
name = mkOption {
type = str;
description = "MySQL database name.";
default = "cloudlog";
};
user = mkOption {
type = str;
description = "MySQL user name.";
default = "cloudlog";
};
passwordFile = mkOption {
type = nullOr str;
description = "MySQL user password file.";
default = null;
};
};
poolConfig = mkOption {
type = attrsOf (oneOf [
str
int
bool
]);
default = {
"pm" = "dynamic";
"pm.max_children" = 32;
"pm.start_servers" = 2;
"pm.min_spare_servers" = 2;
"pm.max_spare_servers" = 4;
"pm.max_requests" = 500;
};
description = ''
Options for Cloudlog's PHP-FPM pool.
'';
};
virtualHost = mkOption {
type = nullOr str;
default = "localhost";
description = ''
Name of the nginx virtualhost to use and setup. If null, do not setup
any virtualhost.
'';
};
extraConfig = mkOption {
description = ''
Any additional text to be appended to the config.php
configuration file. This is a PHP script. For configuration
settings, see <https://github.com/magicbug/Cloudlog/wiki/Cloudlog.php-Configuration-File>.
'';
default = "";
type = str;
example = ''
$config['show_time'] = TRUE;
'';
};
upload-lotw = {
enable = mkOption {
type = bool;
default = true;
description = ''
Whether to periodically upload logs to LoTW. If enabled, a systemd
timer will run the log upload task as specified by the interval
option.
'';
};
interval = mkOption {
type = str;
default = "daily";
description = ''
Specification (in the format described by systemd.time(7)) of the
time at which the LoTW upload will occur.
'';
};
};
upload-clublog = {
enable = mkOption {
type = bool;
default = true;
description = ''
Whether to periodically upload logs to Clublog. If enabled, a systemd
timer will run the log upload task as specified by the interval option.
'';
};
interval = mkOption {
type = str;
default = "daily";
description = ''
Specification (in the format described by systemd.time(7)) of the time
at which the Clublog upload will occur.
'';
};
};
update-lotw-users = {
enable = mkOption {
type = bool;
default = true;
description = ''
Whether to periodically update the list of LoTW users. If enabled, a
systemd timer will run the update task as specified by the interval
option.
'';
};
interval = mkOption {
type = str;
default = "weekly";
description = ''
Specification (in the format described by systemd.time(7)) of the
time at which the LoTW user update will occur.
'';
};
};
update-dok = {
enable = mkOption {
type = bool;
default = true;
description = ''
Whether to periodically update the DOK resource file. If enabled, a
systemd timer will run the update task as specified by the interval option.
'';
};
interval = mkOption {
type = str;
default = "monthly";
description = ''
Specification (in the format described by systemd.time(7)) of the
time at which the DOK update will occur.
'';
};
};
update-clublog-scp = {
enable = mkOption {
type = bool;
default = true;
description = ''
Whether to periodically update the Clublog SCP database. If enabled,
a systemd timer will run the update task as specified by the interval
option.
'';
};
interval = mkOption {
type = str;
default = "monthly";
description = ''
Specification (in the format described by systemd.time(7)) of the time
at which the Clublog SCP update will occur.
'';
};
};
update-wwff = {
enable = mkOption {
type = bool;
default = true;
description = ''
Whether to periodically update the WWFF database. If enabled, a
systemd timer will run the update task as specified by the interval
option.
'';
};
interval = mkOption {
type = str;
default = "monthly";
description = ''
Specification (in the format described by systemd.time(7)) of the time
at which the WWFF update will occur.
'';
};
};
upload-qrz = {
enable = mkOption {
type = bool;
default = true;
description = ''
Whether to periodically upload logs to QRZ. If enabled, a systemd
timer will run the update task as specified by the interval option.
'';
};
interval = mkOption {
type = str;
default = "daily";
description = ''
Specification (in the format described by systemd.time(7)) of the
time at which the QRZ upload will occur.
'';
};
};
update-sota = {
enable = mkOption {
type = bool;
default = true;
description = ''
Whether to periodically update the SOTA database. If enabled, a
systemd timer will run the update task as specified by the interval option.
'';
};
interval = mkOption {
type = str;
default = "monthly";
description = ''
Specification (in the format described by systemd.time(7)) of the time
at which the SOTA update will occur.
'';
};
};
};
config = mkIf cfg.enable {
assertions = [
{
assertion = cfg.database.createLocally -> cfg.database.passwordFile == null;
message = "services.cloudlog.database.passwordFile cannot be specified if services.cloudlog.database.createLocally is set to true.";
}
];
services.phpfpm = {
pools.cloudlog = {
inherit (cfg) user;
group = config.services.nginx.group;
settings = {
"listen.owner" = config.services.nginx.user;
"listen.group" = config.services.nginx.group;
} // cfg.poolConfig;
};
};
services.nginx = mkIf (cfg.virtualHost != null) {
enable = true;
virtualHosts = {
"${cfg.virtualHost}" = {
root = "${package}";
locations."/".tryFiles = "$uri /index.php$is_args$args";
locations."~ ^/index.php(/|$)".extraConfig = ''
include ${config.services.nginx.package}/conf/fastcgi_params;
include ${pkgs.nginx}/conf/fastcgi.conf;
fastcgi_split_path_info ^(.+\.php)(.+)$;
fastcgi_pass unix:${config.services.phpfpm.pools.cloudlog.socket};
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
'';
};
};
};
services.mysql = mkIf cfg.database.createLocally {
enable = true;
ensureDatabases = [ cfg.database.name ];
ensureUsers = [
{
name = cfg.database.user;
ensurePermissions = {
"${cfg.database.name}.*" = "ALL PRIVILEGES";
};
}
];
};
systemd = {
services = {
cloudlog-setup-database = mkIf cfg.database.createLocally {
description = "Set up cloudlog database";
serviceConfig = {
Type = "oneshot";
RemainAfterExit = true;
};
wantedBy = [ "phpfpm-cloudlog.service" ];
after = [ "mysql.service" ];
script =
let
mysql = "${config.services.mysql.package}/bin/mysql";
in
''
if [ ! -f ${cfg.dataDir}/.dbexists ]; then
${mysql} ${cfg.database.name} < ${pkgs.cloudlog}/install/assets/install.sql
touch ${cfg.dataDir}/.dbexists
fi
'';
};
cloudlog-upload-lotw = {
description = "Upload QSOs to LoTW if certs have been provided";
enable = cfg.upload-lotw.enable;
script = "${pkgs.curl}/bin/curl -s ${cfg.baseUrl}/lotw/lotw_upload";
};
cloudlog-update-lotw-users = {
description = "Update LOTW Users Database";
enable = cfg.update-lotw-users.enable;
script = "${pkgs.curl}/bin/curl -s ${cfg.baseUrl}/lotw/load_users";
};
cloudlog-update-dok = {
description = "Update DOK File for autocomplete";
enable = cfg.update-dok.enable;
script = "${pkgs.curl}/bin/curl -s ${cfg.baseUrl}/update/update_dok";
};
cloudlog-update-clublog-scp = {
description = "Update Clublog SCP Database File";
enable = cfg.update-clublog-scp.enable;
script = "${pkgs.curl}/bin/curl -s ${cfg.baseUrl}/update/update_clublog_scp";
};
cloudlog-update-wwff = {
description = "Update WWFF File for autocomplete";
enable = cfg.update-wwff.enable;
script = "${pkgs.curl}/bin/curl -s ${cfg.baseUrl}/update/update_wwff";
};
cloudlog-upload-qrz = {
description = "Upload QSOs to QRZ Logbook";
enable = cfg.upload-qrz.enable;
script = "${pkgs.curl}/bin/curl -s ${cfg.baseUrl}/qrz/upload";
};
cloudlog-update-sota = {
description = "Update SOTA File for autocomplete";
enable = cfg.update-sota.enable;
script = "${pkgs.curl}/bin/curl -s ${cfg.baseUrl}/update/update_sota";
};
};
timers = {
cloudlog-upload-lotw = {
enable = cfg.upload-lotw.enable;
wantedBy = [ "timers.target" ];
partOf = [ "cloudlog-upload-lotw.service" ];
after = [ "phpfpm-cloudlog.service" ];
timerConfig = {
OnCalendar = cfg.upload-lotw.interval;
Persistent = true;
};
};
cloudlog-upload-clublog = {
enable = cfg.upload-clublog.enable;
wantedBy = [ "timers.target" ];
partOf = [ "cloudlog-upload-clublog.service" ];
after = [ "phpfpm-cloudlog.service" ];
timerConfig = {
OnCalendar = cfg.upload-clublog.interval;
Persistent = true;
};
};
cloudlog-update-lotw-users = {
enable = cfg.update-lotw-users.enable;
wantedBy = [ "timers.target" ];
partOf = [ "cloudlog-update-lotw-users.service" ];
after = [ "phpfpm-cloudlog.service" ];
timerConfig = {
OnCalendar = cfg.update-lotw-users.interval;
Persistent = true;
};
};
cloudlog-update-dok = {
enable = cfg.update-dok.enable;
wantedBy = [ "timers.target" ];
partOf = [ "cloudlog-update-dok.service" ];
after = [ "phpfpm-cloudlog.service" ];
timerConfig = {
OnCalendar = cfg.update-dok.interval;
Persistent = true;
};
};
cloudlog-update-clublog-scp = {
enable = cfg.update-clublog-scp.enable;
wantedBy = [ "timers.target" ];
partOf = [ "cloudlog-update-clublog-scp.service" ];
after = [ "phpfpm-cloudlog.service" ];
timerConfig = {
OnCalendar = cfg.update-clublog-scp.interval;
Persistent = true;
};
};
cloudlog-update-wwff = {
enable = cfg.update-wwff.enable;
wantedBy = [ "timers.target" ];
partOf = [ "cloudlog-update-wwff.service" ];
after = [ "phpfpm-cloudlog.service" ];
timerConfig = {
OnCalendar = cfg.update-wwff.interval;
Persistent = true;
};
};
cloudlog-upload-qrz = {
enable = cfg.upload-qrz.enable;
wantedBy = [ "timers.target" ];
partOf = [ "cloudlog-upload-qrz.service" ];
after = [ "phpfpm-cloudlog.service" ];
timerConfig = {
OnCalendar = cfg.upload-qrz.interval;
Persistent = true;
};
};
cloudlog-update-sota = {
enable = cfg.update-sota.enable;
wantedBy = [ "timers.target" ];
partOf = [ "cloudlog-update-sota.service" ];
after = [ "phpfpm-cloudlog.service" ];
timerConfig = {
OnCalendar = cfg.update-sota.interval;
Persistent = true;
};
};
};
tmpfiles.rules =
let
group = config.services.nginx.group;
in
[
"d ${cfg.dataDir} 0750 ${cfg.user} ${group} - -"
"d ${cfg.dataDir}/updates 0750 ${cfg.user} ${group} - -"
"d ${cfg.dataDir}/uploads 0750 ${cfg.user} ${group} - -"
"d ${cfg.dataDir}/backup 0750 ${cfg.user} ${group} - -"
"d ${cfg.dataDir}/logbook 0750 ${cfg.user} ${group} - -"
"d ${cfg.dataDir}/assets/json 0750 ${cfg.user} ${group} - -"
"d ${cfg.dataDir}/assets/qslcard 0750 ${cfg.user} ${group} - -"
];
};
users.users."${cfg.user}" = {
isSystemUser = true;
group = config.services.nginx.group;
};
};
meta.maintainers = with maintainers; [ melling ];
}