mirror of
https://github.com/SebastianWendel/nixpkgs.git
synced 2024-09-20 04:19:00 +02:00
nixos/*: md-convert options with unordered lists
mostly no rendering changes. some lists (like simplelist) don't have an exact translation to markdown, so we use a comma-separated list of literals instead.
This commit is contained in:
parent
1013069f52
commit
c915b915b5
|
@ -77,24 +77,21 @@ in
|
||||||
environment.memoryAllocator.provider = mkOption {
|
environment.memoryAllocator.provider = mkOption {
|
||||||
type = types.enum ([ "libc" ] ++ attrNames providers);
|
type = types.enum ([ "libc" ] ++ attrNames providers);
|
||||||
default = "libc";
|
default = "libc";
|
||||||
description = ''
|
description = lib.mdDoc ''
|
||||||
The system-wide memory allocator.
|
The system-wide memory allocator.
|
||||||
|
|
||||||
Briefly, the system-wide memory allocator providers are:
|
Briefly, the system-wide memory allocator providers are:
|
||||||
<itemizedlist>
|
|
||||||
<listitem><para><literal>libc</literal>: the standard allocator provided by libc</para></listitem>
|
|
||||||
${toString (mapAttrsToList
|
|
||||||
(name: value: "<listitem><para><literal>${name}</literal>: ${value.description}</para></listitem>")
|
|
||||||
providers)}
|
|
||||||
</itemizedlist>
|
|
||||||
|
|
||||||
<warning>
|
- `libc`: the standard allocator provided by libc
|
||||||
<para>
|
${concatStringsSep "\n" (mapAttrsToList
|
||||||
|
(name: value: "- `${name}`: ${replaceStrings [ "\n" ] [ " " ] value.description}")
|
||||||
|
providers)}
|
||||||
|
|
||||||
|
::: {.warning}
|
||||||
Selecting an alternative allocator (i.e., anything other than
|
Selecting an alternative allocator (i.e., anything other than
|
||||||
<literal>libc</literal>) may result in instability, data loss,
|
`libc`) may result in instability, data loss,
|
||||||
and/or service failure.
|
and/or service failure.
|
||||||
</para>
|
:::
|
||||||
</warning>
|
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -61,30 +61,20 @@ in
|
||||||
type = types.nullOr types.str;
|
type = types.nullOr types.str;
|
||||||
default = null;
|
default = null;
|
||||||
example = "status";
|
example = "status";
|
||||||
description = ''
|
description = lib.mdDoc ''
|
||||||
The name of the column or an SQL expression that indicates the status of
|
The name of the column or an SQL expression that indicates the status of
|
||||||
the user. The status is expressed by the combination of two bitfields
|
the user. The status is expressed by the combination of two bitfields
|
||||||
shown below:
|
shown below:
|
||||||
|
|
||||||
<itemizedlist>
|
- `bit 0 (0x01)`:
|
||||||
<listitem>
|
if flagged, `pam_mysql` deems the account to be expired and
|
||||||
<para>
|
returns `PAM_ACCT_EXPIRED`. That is, the account is supposed
|
||||||
<literal>bit 0 (0x01)</literal>:
|
to no longer be available. Note this doesn't mean that `pam_mysql`
|
||||||
if flagged, <literal>pam_mysql</literal> deems the account to be expired and
|
rejects further authentication operations.
|
||||||
returns <literal>PAM_ACCT_EXPIRED</literal>. That is, the account is supposed
|
- `bit 1 (0x02)`:
|
||||||
to no longer be available. Note this doesn't mean that <literal>pam_mysql</literal>
|
if flagged, `pam_mysql` deems the authentication token
|
||||||
rejects further authentication operations.
|
(password) to be expired and returns `PAM_NEW_AUTHTOK_REQD`.
|
||||||
</para>
|
This ends up requiring that the user enter a new password.
|
||||||
</listitem>
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
<literal>bit 1 (0x02)</literal>:
|
|
||||||
if flagged, <literal>pam_mysql</literal> deems the authentication token
|
|
||||||
(password) to be expired and returns <literal>PAM_NEW_AUTHTOK_REQD</literal>.
|
|
||||||
This ends up requiring that the user enter a new password.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
passwordCrypt = mkOption {
|
passwordCrypt = mkOption {
|
||||||
|
@ -101,74 +91,32 @@ in
|
||||||
"8" "sha512"
|
"8" "sha512"
|
||||||
"9" "sha256"
|
"9" "sha256"
|
||||||
];
|
];
|
||||||
description = ''
|
description = lib.mdDoc ''
|
||||||
The method to encrypt the user's password:
|
The method to encrypt the user's password:
|
||||||
|
|
||||||
<itemizedlist>
|
- `0` (or `"plain"`):
|
||||||
<listitem>
|
No encryption. Passwords are stored in plaintext. HIGHLY DISCOURAGED.
|
||||||
<para>
|
- `1` (or `"Y"`):
|
||||||
<literal>0</literal> (or <literal>"plain"</literal>):
|
Use crypt(3) function.
|
||||||
No encryption. Passwords are stored in plaintext. HIGHLY DISCOURAGED.
|
- `2` (or `"mysql"`):
|
||||||
</para>
|
Use the MySQL PASSWORD() function. It is possible that the encryption function used
|
||||||
</listitem>
|
by `pam_mysql` is different from that of the MySQL server, as
|
||||||
<listitem>
|
`pam_mysql` uses the function defined in MySQL's C-client API
|
||||||
<para>
|
instead of using PASSWORD() SQL function in the query.
|
||||||
<literal>1</literal> (or <literal>"Y"</literal>):
|
- `3` (or `"md5"`):
|
||||||
Use crypt(3) function.
|
Use plain hex MD5.
|
||||||
</para>
|
- `4` (or `"sha1"`):
|
||||||
</listitem>
|
Use plain hex SHA1.
|
||||||
<listitem>
|
- `5` (or `"drupal7"`):
|
||||||
<para>
|
Use Drupal7 salted passwords.
|
||||||
<literal>2</literal> (or <literal>"mysql"</literal>):
|
- `6` (or `"joomla15"`):
|
||||||
Use the MySQL PASSWORD() function. It is possible that the encryption function used
|
Use Joomla15 salted passwords.
|
||||||
by <literal>pam_mysql</literal> is different from that of the MySQL server, as
|
- `7` (or `"ssha"`):
|
||||||
<literal>pam_mysql</literal> uses the function defined in MySQL's C-client API
|
Use ssha hashed passwords.
|
||||||
instead of using PASSWORD() SQL function in the query.
|
- `8` (or `"sha512"`):
|
||||||
</para>
|
Use sha512 hashed passwords.
|
||||||
</listitem>
|
- `9` (or `"sha256"`):
|
||||||
<listitem>
|
Use sha256 hashed passwords.
|
||||||
<para>
|
|
||||||
<literal>3</literal> (or <literal>"md5"</literal>):
|
|
||||||
Use plain hex MD5.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
<literal>4</literal> (or <literal>"sha1"</literal>):
|
|
||||||
Use plain hex SHA1.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
<literal>5</literal> (or <literal>"drupal7"</literal>):
|
|
||||||
Use Drupal7 salted passwords.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
<literal>6</literal> (or <literal>"joomla15"</literal>):
|
|
||||||
Use Joomla15 salted passwords.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
<literal>7</literal> (or <literal>"ssha"</literal>):
|
|
||||||
Use ssha hashed passwords.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
<literal>8</literal> (or <literal>"sha512"</literal>):
|
|
||||||
Use sha512 hashed passwords.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
<literal>9</literal> (or <literal>"sha256"</literal>):
|
|
||||||
Use sha256 hashed passwords.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
cryptDefault = mkOption {
|
cryptDefault = mkOption {
|
||||||
|
|
|
@ -32,22 +32,20 @@ in
|
||||||
type = types.nullOr (types.enum [ "ibus" "fcitx" "fcitx5" "nabi" "uim" "hime" "kime" ]);
|
type = types.nullOr (types.enum [ "ibus" "fcitx" "fcitx5" "nabi" "uim" "hime" "kime" ]);
|
||||||
default = null;
|
default = null;
|
||||||
example = "fcitx";
|
example = "fcitx";
|
||||||
description = ''
|
description = lib.mdDoc ''
|
||||||
Select the enabled input method. Input methods is a software to input symbols that are not available on standard input devices.
|
Select the enabled input method. Input methods is a software to input symbols that are not available on standard input devices.
|
||||||
|
|
||||||
Input methods are specially used to input Chinese, Japanese and Korean characters.
|
Input methods are specially used to input Chinese, Japanese and Korean characters.
|
||||||
|
|
||||||
Currently the following input methods are available in NixOS:
|
Currently the following input methods are available in NixOS:
|
||||||
|
|
||||||
<itemizedlist>
|
- ibus: The intelligent input bus, extra input engines can be added using `i18n.inputMethod.ibus.engines`.
|
||||||
<listitem><para>ibus: The intelligent input bus, extra input engines can be added using <literal>i18n.inputMethod.ibus.engines</literal>.</para></listitem>
|
- fcitx: A customizable lightweight input method, extra input engines can be added using `i18n.inputMethod.fcitx.engines`.
|
||||||
<listitem><para>fcitx: A customizable lightweight input method, extra input engines can be added using <literal>i18n.inputMethod.fcitx.engines</literal>.</para></listitem>
|
- fcitx5: The next generation of fcitx, addons (including engines, dictionaries, skins) can be added using `i18n.inputMethod.fcitx5.addons`.
|
||||||
<listitem><para>fcitx5: The next generation of fcitx, addons (including engines, dictionaries, skins) can be added using <literal>i18n.inputMethod.fcitx5.addons</literal>.</para></listitem>
|
- nabi: A Korean input method based on XIM. Nabi doesn't support Qt 5.
|
||||||
<listitem><para>nabi: A Korean input method based on XIM. Nabi doesn't support Qt 5.</para></listitem>
|
- uim: The universal input method, is a library with a XIM bridge. uim mainly support Chinese, Japanese and Korean.
|
||||||
<listitem><para>uim: The universal input method, is a library with a XIM bridge. uim mainly support Chinese, Japanese and Korean.</para></listitem>
|
- hime: An extremely easy-to-use input method framework.
|
||||||
<listitem><para>hime: An extremely easy-to-use input method framework.</para></listitem>
|
- kime: Koream IME.
|
||||||
<listitem><para>kime: Koream IME.</para></listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -226,15 +226,14 @@ in
|
||||||
nixos.enable = mkOption {
|
nixos.enable = mkOption {
|
||||||
type = types.bool;
|
type = types.bool;
|
||||||
default = true;
|
default = true;
|
||||||
description = ''
|
description = lib.mdDoc ''
|
||||||
Whether to install NixOS's own documentation.
|
Whether to install NixOS's own documentation.
|
||||||
<itemizedlist>
|
|
||||||
<listitem><para>This includes man pages like
|
- This includes man pages like
|
||||||
<citerefentry><refentrytitle>configuration.nix</refentrytitle><manvolnum>5</manvolnum></citerefentry> if <option>documentation.man.enable</option> is
|
{manpage}`configuration.nix(5)` if {option}`documentation.man.enable` is
|
||||||
set.</para></listitem>
|
set.
|
||||||
<listitem><para>This includes the HTML manual and the <command>nixos-help</command> command if
|
- This includes the HTML manual and the {command}`nixos-help` command if
|
||||||
<option>documentation.doc.enable</option> is set.</para></listitem>
|
{option}`documentation.doc.enable` is set.
|
||||||
</itemizedlist>
|
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -576,13 +576,12 @@ let
|
||||||
ocspMustStaple = mkOption {
|
ocspMustStaple = mkOption {
|
||||||
type = types.bool;
|
type = types.bool;
|
||||||
inherit (defaultAndText "ocspMustStaple" false) default defaultText;
|
inherit (defaultAndText "ocspMustStaple" false) default defaultText;
|
||||||
description = ''
|
description = lib.mdDoc ''
|
||||||
Turns on the OCSP Must-Staple TLS extension.
|
Turns on the OCSP Must-Staple TLS extension.
|
||||||
Make sure you know what you're doing! See:
|
Make sure you know what you're doing! See:
|
||||||
<itemizedlist>
|
|
||||||
<listitem><para><link xlink:href="https://blog.apnic.net/2019/01/15/is-the-web-ready-for-ocsp-must-staple/"/></para></listitem>
|
- <https://blog.apnic.net/2019/01/15/is-the-web-ready-for-ocsp-must-staple/>
|
||||||
<listitem><para><link xlink:href="https://blog.hboeck.de/archives/886-The-Problem-with-OCSP-Stapling-and-Must-Staple-and-why-Certificate-Revocation-is-still-broken.html"/></para></listitem>
|
- <https://blog.hboeck.de/archives/886-The-Problem-with-OCSP-Stapling-and-Must-Staple-and-why-Certificate-Revocation-is-still-broken.html>
|
||||||
</itemizedlist>
|
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -76,21 +76,11 @@ in {
|
||||||
|
|
||||||
tctiEnvironment = {
|
tctiEnvironment = {
|
||||||
enable = lib.mkOption {
|
enable = lib.mkOption {
|
||||||
description = ''
|
description = lib.mdDoc ''
|
||||||
Set common TCTI environment variables to the specified value.
|
Set common TCTI environment variables to the specified value.
|
||||||
The variables are
|
The variables are
|
||||||
<itemizedlist>
|
- `TPM2TOOLS_TCTI`
|
||||||
<listitem>
|
- `TPM2_PKCS11_TCTI`
|
||||||
<para>
|
|
||||||
<literal>TPM2TOOLS_TCTI</literal>
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
<literal>TPM2_PKCS11_TCTI</literal>
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
'';
|
'';
|
||||||
type = lib.types.bool;
|
type = lib.types.bool;
|
||||||
default = false;
|
default = false;
|
||||||
|
|
|
@ -13,15 +13,13 @@ in with lib; {
|
||||||
defaultText = literalExpression "pkgs.meshcentral";
|
defaultText = literalExpression "pkgs.meshcentral";
|
||||||
};
|
};
|
||||||
settings = mkOption {
|
settings = mkOption {
|
||||||
description = ''
|
description = lib.mdDoc ''
|
||||||
Settings for MeshCentral. Refer to upstream documentation for details:
|
Settings for MeshCentral. Refer to upstream documentation for details:
|
||||||
|
|
||||||
<itemizedlist>
|
- [JSON Schema definition](https://github.com/Ylianst/MeshCentral/blob/master/meshcentral-config-schema.json)
|
||||||
<listitem><para><link xlink:href="https://github.com/Ylianst/MeshCentral/blob/master/meshcentral-config-schema.json">JSON Schema definition</link></para></listitem>
|
- [simple sample configuration](https://github.com/Ylianst/MeshCentral/blob/master/sample-config.json)
|
||||||
<listitem><para><link xlink:href="https://github.com/Ylianst/MeshCentral/blob/master/sample-config.json">simple sample configuration</link></para></listitem>
|
- [complex sample configuration](https://github.com/Ylianst/MeshCentral/blob/master/sample-config-advanced.json)
|
||||||
<listitem><para><link xlink:href="https://github.com/Ylianst/MeshCentral/blob/master/sample-config-advanced.json">complex sample configuration</link></para></listitem>
|
- [Old homepage with documentation link](https://www.meshcommander.com/meshcentral2)
|
||||||
<listitem><para><link xlink:href="https://www.meshcommander.com/meshcentral2">Old homepage) with documentation link</link></para></listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
'';
|
'';
|
||||||
type = types.submodule {
|
type = types.submodule {
|
||||||
freeformType = configFormat.type;
|
freeformType = configFormat.type;
|
||||||
|
|
|
@ -39,7 +39,7 @@ in
|
||||||
enableWattsUpPro = mkOption {
|
enableWattsUpPro = mkOption {
|
||||||
type = types.bool;
|
type = types.bool;
|
||||||
default = false;
|
default = false;
|
||||||
description = ''
|
description = lib.mdDoc ''
|
||||||
Enable the Watts Up Pro device.
|
Enable the Watts Up Pro device.
|
||||||
|
|
||||||
The Watts Up Pro contains a generic FTDI USB device without a specific
|
The Watts Up Pro contains a generic FTDI USB device without a specific
|
||||||
|
@ -49,10 +49,8 @@ in
|
||||||
|
|
||||||
The generic FTDI device is known to also be used on:
|
The generic FTDI device is known to also be used on:
|
||||||
|
|
||||||
<itemizedlist>
|
- Sparkfun FT232 breakout board
|
||||||
<listitem><para>Sparkfun FT232 breakout board</para></listitem>
|
- Parallax Propeller
|
||||||
<listitem><para>Parallax Propeller</para></listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -62,18 +62,16 @@ in {
|
||||||
mode = mkOption {
|
mode = mkOption {
|
||||||
default = "default";
|
default = "default";
|
||||||
type = types.enum [ "default" "reusable" "clustered" ];
|
type = types.enum [ "default" "reusable" "clustered" ];
|
||||||
description = ''
|
description = lib.mdDoc ''
|
||||||
Rendering mode of <literal>grafana-image-renderer</literal>:
|
Rendering mode of `grafana-image-renderer`:
|
||||||
<itemizedlist>
|
|
||||||
<listitem><para><literal>default:</literal> Creates on browser-instance
|
- `default:` Creates on browser-instance
|
||||||
per rendering request.</para></listitem>
|
per rendering request.
|
||||||
<listitem><para><literal>reusable:</literal> One browser instance
|
- `reusable:` One browser instance
|
||||||
will be started and reused for each rendering request.</para></listitem>
|
will be started and reused for each rendering request.
|
||||||
<listitem><para><literal>clustered:</literal> allows to precisely
|
- `clustered:` allows to precisely
|
||||||
configure how many browser-instances are supposed to be used. The values
|
configure how many browser-instances are supposed to be used. The values
|
||||||
for that mode can be declared in <literal>rendering.clustering</literal>.
|
for that mode can be declared in `rendering.clustering`.
|
||||||
</para></listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
args = mkOption {
|
args = mkOption {
|
||||||
|
|
|
@ -55,35 +55,17 @@ in {
|
||||||
"udppm"
|
"udppm"
|
||||||
];
|
];
|
||||||
example = "proxy";
|
example = "proxy";
|
||||||
description = ''
|
description = lib.mdDoc ''
|
||||||
Service type. The following values are valid:
|
Service type. The following values are valid:
|
||||||
|
|
||||||
<itemizedlist>
|
- `"proxy"`: HTTP/HTTPS proxy (default port 3128).
|
||||||
<listitem><para>
|
- `"socks"`: SOCKS 4/4.5/5 proxy (default port 1080).
|
||||||
<literal>"proxy"</literal>: HTTP/HTTPS proxy (default port 3128).
|
- `"pop3p"`: POP3 proxy (default port 110).
|
||||||
</para></listitem>
|
- `"ftppr"`: FTP proxy (default port 21).
|
||||||
<listitem><para>
|
- `"admin"`: Web interface (default port 80).
|
||||||
<literal>"socks"</literal>: SOCKS 4/4.5/5 proxy (default port 1080).
|
- `"dnspr"`: Caching DNS proxy (default port 53).
|
||||||
</para></listitem>
|
- `"tcppm"`: TCP portmapper.
|
||||||
<listitem><para>
|
- `"udppm"`: UDP portmapper.
|
||||||
<literal>"pop3p"</literal>: POP3 proxy (default port 110).
|
|
||||||
</para></listitem>
|
|
||||||
<listitem><para>
|
|
||||||
<literal>"ftppr"</literal>: FTP proxy (default port 21).
|
|
||||||
</para></listitem>
|
|
||||||
<listitem><para>
|
|
||||||
<literal>"admin"</literal>: Web interface (default port 80).
|
|
||||||
</para></listitem>
|
|
||||||
<listitem><para>
|
|
||||||
<literal>"dnspr"</literal>: Caching DNS proxy (default port 53).
|
|
||||||
</para></listitem>
|
|
||||||
<listitem><para>
|
|
||||||
<literal>"tcppm"</literal>: TCP portmapper.
|
|
||||||
</para></listitem>
|
|
||||||
<listitem><para>
|
|
||||||
<literal>"udppm"</literal>: UDP portmapper.
|
|
||||||
</para></listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
bindAddress = mkOption {
|
bindAddress = mkOption {
|
||||||
|
@ -113,24 +95,16 @@ in {
|
||||||
auth = mkOption {
|
auth = mkOption {
|
||||||
type = types.listOf (types.enum [ "none" "iponly" "strong" ]);
|
type = types.listOf (types.enum [ "none" "iponly" "strong" ]);
|
||||||
example = [ "iponly" "strong" ];
|
example = [ "iponly" "strong" ];
|
||||||
description = ''
|
description = lib.mdDoc ''
|
||||||
Authentication type. The following values are valid:
|
Authentication type. The following values are valid:
|
||||||
|
|
||||||
<itemizedlist>
|
- `"none"`: disables both authentication and authorization. You can not use ACLs.
|
||||||
<listitem><para>
|
- `"iponly"`: specifies no authentication. ACLs authorization is used.
|
||||||
<literal>"none"</literal>: disables both authentication and authorization. You can not use ACLs.
|
- `"strong"`: authentication by username/password. If user is not registered their access is denied regardless of ACLs.
|
||||||
</para></listitem>
|
|
||||||
<listitem><para>
|
|
||||||
<literal>"iponly"</literal>: specifies no authentication. ACLs authorization is used.
|
|
||||||
</para></listitem>
|
|
||||||
<listitem><para>
|
|
||||||
<literal>"strong"</literal>: authentication by username/password. If user is not registered their access is denied regardless of ACLs.
|
|
||||||
</para></listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
|
|
||||||
Double authentication is possible, e.g.
|
Double authentication is possible, e.g.
|
||||||
|
|
||||||
<programlisting>
|
```
|
||||||
{
|
{
|
||||||
auth = [ "iponly" "strong" ];
|
auth = [ "iponly" "strong" ];
|
||||||
acl = [
|
acl = [
|
||||||
|
@ -144,7 +118,7 @@ in {
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
</programlisting>
|
```
|
||||||
In this example strong username authentication is not required to access 192.168.0.0/16.
|
In this example strong username authentication is not required to access 192.168.0.0/16.
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
@ -154,17 +128,11 @@ in {
|
||||||
rule = mkOption {
|
rule = mkOption {
|
||||||
type = types.enum [ "allow" "deny" ];
|
type = types.enum [ "allow" "deny" ];
|
||||||
example = "allow";
|
example = "allow";
|
||||||
description = ''
|
description = lib.mdDoc ''
|
||||||
ACL rule. The following values are valid:
|
ACL rule. The following values are valid:
|
||||||
|
|
||||||
<itemizedlist>
|
- `"allow"`: connections allowed.
|
||||||
<listitem><para>
|
- `"deny"`: connections not allowed.
|
||||||
<literal>"allow"</literal>: connections allowed.
|
|
||||||
</para></listitem>
|
|
||||||
<listitem><para>
|
|
||||||
<literal>"deny"</literal>: connections not allowed.
|
|
||||||
</para></listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
users = mkOption {
|
users = mkOption {
|
||||||
|
|
|
@ -213,30 +213,24 @@ let
|
||||||
example = [ "192.0.2.0/24 NOKEY" "10.0.0.1-10.0.0.5 my_tsig_key_name"
|
example = [ "192.0.2.0/24 NOKEY" "10.0.0.1-10.0.0.5 my_tsig_key_name"
|
||||||
"10.0.3.4&255.255.0.0 BLOCKED"
|
"10.0.3.4&255.255.0.0 BLOCKED"
|
||||||
];
|
];
|
||||||
description = ''
|
description = lib.mdDoc ''
|
||||||
Listed primary servers are allowed to notify this secondary server.
|
Listed primary servers are allowed to notify this secondary server.
|
||||||
|
|
||||||
Format: <literal><ip> <key-name | NOKEY | BLOCKED></literal>
|
Format: `<ip> <key-name | NOKEY | BLOCKED>`
|
||||||
|
|
||||||
<literal><ip></literal> either a plain IPv4/IPv6 address or range.
|
`<ip>` either a plain IPv4/IPv6 address or range.
|
||||||
Valid patters for ranges:
|
Valid patters for ranges:
|
||||||
<itemizedlist>
|
* `10.0.0.0/24`: via subnet size
|
||||||
<listitem><para><literal>10.0.0.0/24</literal>: via subnet size</para></listitem>
|
* `10.0.0.0&255.255.255.0`: via subnet mask
|
||||||
<listitem><para><literal>10.0.0.0&255.255.255.0</literal>: via subnet mask</para></listitem>
|
* `10.0.0.1-10.0.0.254`: via range
|
||||||
<listitem><para><literal>10.0.0.1-10.0.0.254</literal>: via range</para></listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
|
|
||||||
A optional port number could be added with a '@':
|
A optional port number could be added with a '@':
|
||||||
<itemizedlist>
|
* `2001:1234::1@1234`
|
||||||
<listitem><para><literal>2001:1234::1@1234</literal></para></listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
|
|
||||||
<literal><key-name | NOKEY | BLOCKED></literal>
|
`<key-name | NOKEY | BLOCKED>`
|
||||||
<itemizedlist>
|
* `<key-name>` will use the specified TSIG key
|
||||||
<listitem><para><literal><key-name></literal> will use the specified TSIG key</para></listitem>
|
* `NOKEY` no TSIG signature is required
|
||||||
<listitem><para><literal>NOKEY</literal> no TSIG signature is required</para></listitem>
|
* `BLOCKED`notifies from non-listed or blocked IPs will be ignored
|
||||||
<listitem><para><literal>BLOCKED</literal>notifies from non-listed or blocked IPs will be ignored</para></listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -350,19 +344,17 @@ let
|
||||||
type = types.listOf types.str;
|
type = types.listOf types.str;
|
||||||
default = [];
|
default = [];
|
||||||
example = [ "10.0.0.1@3721 my_key" "::5 NOKEY" ];
|
example = [ "10.0.0.1@3721 my_key" "::5 NOKEY" ];
|
||||||
description = ''
|
description = lib.mdDoc ''
|
||||||
This primary server will notify all given secondary servers about
|
This primary server will notify all given secondary servers about
|
||||||
zone changes.
|
zone changes.
|
||||||
|
|
||||||
Format: <literal><ip> <key-name | NOKEY></literal>
|
Format: `<ip> <key-name | NOKEY>`
|
||||||
|
|
||||||
<literal><ip></literal> a plain IPv4/IPv6 address with on optional port number (ip@port)
|
`<ip>` a plain IPv4/IPv6 address with on optional port number (ip@port)
|
||||||
|
|
||||||
<literal><key-name | NOKEY></literal>
|
`<key-name | NOKEY>`
|
||||||
<itemizedlist>
|
- `<key-name>` sign notifies with the specified key
|
||||||
<listitem><para><literal><key-name></literal> sign notifies with the specified key</para></listitem>
|
- `NOKEY` don't sign notifies
|
||||||
<listitem><para><literal>NOKEY</literal> don't sign notifies</para></listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -85,37 +85,24 @@ in {
|
||||||
dbtype = mkOption {
|
dbtype = mkOption {
|
||||||
type = types.enum [ "mysql" "percona" "mariadb" "postgresql" "sqlserver" ];
|
type = types.enum [ "mysql" "percona" "mariadb" "postgresql" "sqlserver" ];
|
||||||
default = "postgresql";
|
default = "postgresql";
|
||||||
description = ''
|
description = lib.mdDoc ''
|
||||||
Specify the database provider:
|
Specify the database provider: `mysql`, `percona`, `mariadb`, `postgresql`, `sqlserver`
|
||||||
<simplelist type='inline'>
|
|
||||||
<member><literal>mysql</literal></member>
|
|
||||||
<member><literal>percona</literal></member>
|
|
||||||
<member><literal>mariadb</literal></member>
|
|
||||||
<member><literal>postgresql</literal></member>
|
|
||||||
<member><literal>sqlserver</literal></member>
|
|
||||||
</simplelist>
|
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
db = mkOption {
|
db = mkOption {
|
||||||
type = types.str;
|
type = types.str;
|
||||||
description = ''
|
description = lib.mdDoc ''
|
||||||
Database specific connection string for example:
|
Database specific connection string for example:
|
||||||
<itemizedlist>
|
- MySQL/Percona/MariaDB:
|
||||||
<listitem><para>MySQL/Percona/MariaDB:
|
`user:password@tcp(host:3306)/documize`
|
||||||
<literal>user:password@tcp(host:3306)/documize</literal>
|
- MySQLv8+:
|
||||||
</para></listitem>
|
`user:password@tcp(host:3306)/documize?allowNativePasswords=true`
|
||||||
<listitem><para>MySQLv8+:
|
- PostgreSQL:
|
||||||
<literal>user:password@tcp(host:3306)/documize?allowNativePasswords=true</literal>
|
`host=localhost port=5432 dbname=documize user=admin password=secret sslmode=disable`
|
||||||
</para></listitem>
|
- MSSQL:
|
||||||
<listitem><para>PostgreSQL:
|
`sqlserver://username:password@localhost:1433?database=Documize` or
|
||||||
<literal>host=localhost port=5432 dbname=documize user=admin password=secret sslmode=disable</literal>
|
`sqlserver://sa@localhost/SQLExpress?database=Documize`
|
||||||
</para></listitem>
|
|
||||||
<listitem><para>MSSQL:
|
|
||||||
<literal>sqlserver://username:password@localhost:1433?database=Documize</literal> or
|
|
||||||
<literal>sqlserver://sa@localhost/SQLExpress?database=Documize</literal>
|
|
||||||
</para></listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -533,25 +533,23 @@ in {
|
||||||
The nextcloud-occ program preconfigured to target this Nextcloud instance.
|
The nextcloud-occ program preconfigured to target this Nextcloud instance.
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
globalProfiles = mkEnableOption "global profiles" // {
|
globalProfiles = mkEnableOption (lib.mdDoc "global profiles") // {
|
||||||
description = ''
|
description = lib.mdDoc ''
|
||||||
Makes user-profiles globally available under <literal>nextcloud.tld/u/user.name</literal>.
|
Makes user-profiles globally available under `nextcloud.tld/u/user.name`.
|
||||||
Even though it's enabled by default in Nextcloud, it must be explicitly enabled
|
Even though it's enabled by default in Nextcloud, it must be explicitly enabled
|
||||||
here because it has the side-effect that personal information is even accessible to
|
here because it has the side-effect that personal information is even accessible to
|
||||||
unauthenticated users by default.
|
unauthenticated users by default.
|
||||||
|
|
||||||
By default, the following properties are set to “Show to everyone”
|
By default, the following properties are set to “Show to everyone”
|
||||||
if this flag is enabled:
|
if this flag is enabled:
|
||||||
<itemizedlist>
|
- About
|
||||||
<listitem><para>About</para></listitem>
|
- Full name
|
||||||
<listitem><para>Full name</para></listitem>
|
- Headline
|
||||||
<listitem><para>Headline</para></listitem>
|
- Organisation
|
||||||
<listitem><para>Organisation</para></listitem>
|
- Profile picture
|
||||||
<listitem><para>Profile picture</para></listitem>
|
- Role
|
||||||
<listitem><para>Role</para></listitem>
|
- Twitter
|
||||||
<listitem><para>Twitter</para></listitem>
|
- Website
|
||||||
<listitem><para>Website</para></listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
|
|
||||||
Only has an effect in Nextcloud 23 and later.
|
Only has an effect in Nextcloud 23 and later.
|
||||||
'';
|
'';
|
||||||
|
|
|
@ -93,17 +93,15 @@ in {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
description = ''
|
description = lib.mdDoc ''
|
||||||
Settings to configure <literal>wiki-js</literal>. This directly
|
Settings to configure `wiki-js`. This directly
|
||||||
corresponds to <link xlink:href="https://docs.requarks.io/install/config">the upstream configuration options</link>.
|
corresponds to [the upstream configuration options](https://docs.requarks.io/install/config).
|
||||||
|
|
||||||
Secrets can be injected via the environment by
|
Secrets can be injected via the environment by
|
||||||
<itemizedlist>
|
- specifying [](#opt-services.wiki-js.environmentFile)
|
||||||
<listitem><para>specifying <xref linkend="opt-services.wiki-js.environmentFile"/>
|
to contain secrets
|
||||||
to contain secrets</para></listitem>
|
- and setting sensitive values to `$(ENVIRONMENT_VAR)`
|
||||||
<listitem><para>and setting sensitive values to <literal>$(ENVIRONMENT_VAR)</literal>
|
with this value defined in the environment-file.
|
||||||
with this value defined in the environment-file.</para></listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -499,21 +499,16 @@ in
|
||||||
config = mkOption {
|
config = mkOption {
|
||||||
type = types.str;
|
type = types.str;
|
||||||
default = "";
|
default = "";
|
||||||
description = ''
|
description = lib.mdDoc ''
|
||||||
Verbatim <filename>nginx.conf</filename> configuration.
|
Verbatim {file}`nginx.conf` configuration.
|
||||||
This is mutually exclusive to any other config option for
|
This is mutually exclusive to any other config option for
|
||||||
<filename>nginx.conf</filename> except for
|
{file}`nginx.conf` except for
|
||||||
<itemizedlist>
|
- [](#opt-services.nginx.appendConfig)
|
||||||
<listitem><para><xref linkend="opt-services.nginx.appendConfig"/>
|
- [](#opt-services.nginx.httpConfig)
|
||||||
</para></listitem>
|
- [](#opt-services.nginx.logError)
|
||||||
<listitem><para><xref linkend="opt-services.nginx.httpConfig"/>
|
|
||||||
</para></listitem>
|
|
||||||
<listitem><para><xref linkend="opt-services.nginx.logError"/>
|
|
||||||
</para></listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
|
|
||||||
If additional verbatim config in addition to other options is needed,
|
If additional verbatim config in addition to other options is needed,
|
||||||
<xref linkend="opt-services.nginx.appendConfig"/> should be used instead.
|
[](#opt-services.nginx.appendConfig) should be used instead.
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -622,37 +622,35 @@ in
|
||||||
efiInstallAsRemovable = mkOption {
|
efiInstallAsRemovable = mkOption {
|
||||||
default = false;
|
default = false;
|
||||||
type = types.bool;
|
type = types.bool;
|
||||||
description = ''
|
description = lib.mdDoc ''
|
||||||
Whether to invoke <literal>grub-install</literal> with
|
Whether to invoke `grub-install` with
|
||||||
<literal>--removable</literal>.
|
`--removable`.
|
||||||
|
|
||||||
Unless you turn this on, GRUB will install itself somewhere in
|
Unless you turn this on, GRUB will install itself somewhere in
|
||||||
<literal>boot.loader.efi.efiSysMountPoint</literal> (exactly where
|
`boot.loader.efi.efiSysMountPoint` (exactly where
|
||||||
depends on other config variables). If you've set
|
depends on other config variables). If you've set
|
||||||
<literal>boot.loader.efi.canTouchEfiVariables</literal> *AND* you
|
`boot.loader.efi.canTouchEfiVariables` *AND* you
|
||||||
are currently booted in UEFI mode, then GRUB will use
|
are currently booted in UEFI mode, then GRUB will use
|
||||||
<literal>efibootmgr</literal> to modify the boot order in the
|
`efibootmgr` to modify the boot order in the
|
||||||
EFI variables of your firmware to include this location. If you are
|
EFI variables of your firmware to include this location. If you are
|
||||||
*not* booted in UEFI mode at the time GRUB is being installed, the
|
*not* booted in UEFI mode at the time GRUB is being installed, the
|
||||||
NVRAM will not be modified, and your system will not find GRUB at
|
NVRAM will not be modified, and your system will not find GRUB at
|
||||||
boot time. However, GRUB will still return success so you may miss
|
boot time. However, GRUB will still return success so you may miss
|
||||||
the warning that gets printed ("<literal>efibootmgr: EFI variables
|
the warning that gets printed ("`efibootmgr: EFI variables
|
||||||
are not supported on this system.</literal>").
|
are not supported on this system.`").
|
||||||
|
|
||||||
If you turn this feature on, GRUB will install itself in a
|
If you turn this feature on, GRUB will install itself in a
|
||||||
special location within <literal>efiSysMountPoint</literal> (namely
|
special location within `efiSysMountPoint` (namely
|
||||||
<literal>EFI/boot/boot$arch.efi</literal>) which the firmwares
|
`EFI/boot/boot$arch.efi`) which the firmwares
|
||||||
are hardcoded to try first, regardless of NVRAM EFI variables.
|
are hardcoded to try first, regardless of NVRAM EFI variables.
|
||||||
|
|
||||||
To summarize, turn this on if:
|
To summarize, turn this on if:
|
||||||
<itemizedlist>
|
- You are installing NixOS and want it to boot in UEFI mode,
|
||||||
<listitem><para>You are installing NixOS and want it to boot in UEFI mode,
|
but you are currently booted in legacy mode
|
||||||
but you are currently booted in legacy mode</para></listitem>
|
- You want to make a drive that will boot regardless of
|
||||||
<listitem><para>You want to make a drive that will boot regardless of
|
the NVRAM state of the computer (like a USB "removable" drive)
|
||||||
the NVRAM state of the computer (like a USB "removable" drive)</para></listitem>
|
- You simply dislike the idea of depending on NVRAM
|
||||||
<listitem><para>You simply dislike the idea of depending on NVRAM
|
state to make your drive bootable
|
||||||
state to make your drive bootable</para></listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -31,45 +31,29 @@ in
|
||||||
default = [];
|
default = [];
|
||||||
example = [ "console=ttyS0,115200" ];
|
example = [ "console=ttyS0,115200" ];
|
||||||
type = types.listOf types.str;
|
type = types.listOf types.str;
|
||||||
description = ''
|
description = lib.mdDoc ''
|
||||||
Parameters added to the Memtest86+ command line. As of memtest86+ 5.01
|
Parameters added to the Memtest86+ command line. As of memtest86+ 5.01
|
||||||
the following list of (apparently undocumented) parameters are
|
the following list of (apparently undocumented) parameters are
|
||||||
accepted:
|
accepted:
|
||||||
|
|
||||||
<itemizedlist>
|
- `console=...`, set up a serial console.
|
||||||
|
|
||||||
<listitem>
|
|
||||||
<para><literal>console=...</literal>, set up a serial console.
|
|
||||||
Examples:
|
Examples:
|
||||||
<literal>console=ttyS0</literal>,
|
`console=ttyS0`,
|
||||||
<literal>console=ttyS0,9600</literal> or
|
`console=ttyS0,9600` or
|
||||||
<literal>console=ttyS0,115200n8</literal>.</para>
|
`console=ttyS0,115200n8`.
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
- `btrace`, enable boot trace.
|
||||||
<para><literal>btrace</literal>, enable boot trace.</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
- `maxcpus=N`, limit number of CPUs.
|
||||||
<para><literal>maxcpus=N</literal>, limit number of CPUs.</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
- `onepass`, run one pass and exit if there
|
||||||
<para><literal>onepass</literal>, run one pass and exit if there
|
are no errors.
|
||||||
are no errors.</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
- `tstlist=...`, list of tests to run.
|
||||||
<para><literal>tstlist=...</literal>, list of tests to run.
|
Example: `0,1,2`.
|
||||||
Example: <literal>0,1,2</literal>.</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
<listitem>
|
- `cpumask=...`, set a CPU mask, to select CPUs
|
||||||
<para><literal>cpumask=...</literal>, set a CPU mask, to select CPUs
|
to use for testing.
|
||||||
to use for testing.</para>
|
|
||||||
</listitem>
|
|
||||||
|
|
||||||
</itemizedlist>
|
|
||||||
|
|
||||||
This list of command line options was obtained by reading the
|
This list of command line options was obtained by reading the
|
||||||
Memtest86+ source code.
|
Memtest86+ source code.
|
||||||
|
|
|
@ -104,29 +104,15 @@ in {
|
||||||
|
|
||||||
type = types.enum [ "0" "1" "2" "auto" "max" "keep" ];
|
type = types.enum [ "0" "1" "2" "auto" "max" "keep" ];
|
||||||
|
|
||||||
description = ''
|
description = lib.mdDoc ''
|
||||||
The resolution of the console. The following values are valid:
|
The resolution of the console. The following values are valid:
|
||||||
|
|
||||||
<itemizedlist>
|
- `"0"`: Standard UEFI 80x25 mode
|
||||||
<listitem><para>
|
- `"1"`: 80x50 mode, not supported by all devices
|
||||||
<literal>"0"</literal>: Standard UEFI 80x25 mode
|
- `"2"`: The first non-standard mode provided by the device firmware, if any
|
||||||
</para></listitem>
|
- `"auto"`: Pick a suitable mode automatically using heuristics
|
||||||
<listitem><para>
|
- `"max"`: Pick the highest-numbered available mode
|
||||||
<literal>"1"</literal>: 80x50 mode, not supported by all devices
|
- `"keep"`: Keep the mode selected by firmware (the default)
|
||||||
</para></listitem>
|
|
||||||
<listitem><para>
|
|
||||||
<literal>"2"</literal>: The first non-standard mode provided by the device firmware, if any
|
|
||||||
</para></listitem>
|
|
||||||
<listitem><para>
|
|
||||||
<literal>"auto"</literal>: Pick a suitable mode automatically using heuristics
|
|
||||||
</para></listitem>
|
|
||||||
<listitem><para>
|
|
||||||
<literal>"max"</literal>: Pick the highest-numbered available mode
|
|
||||||
</para></listitem>
|
|
||||||
<listitem><para>
|
|
||||||
<literal>"keep"</literal>: Keep the mode selected by firmware (the default)
|
|
||||||
</para></listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -613,14 +613,12 @@ in
|
||||||
);
|
);
|
||||||
defaultText = literalMD "`zstd` if the kernel supports it (5.9+), `gzip` if not";
|
defaultText = literalMD "`zstd` if the kernel supports it (5.9+), `gzip` if not";
|
||||||
type = types.either types.str (types.functionTo types.str);
|
type = types.either types.str (types.functionTo types.str);
|
||||||
description = ''
|
description = lib.mdDoc ''
|
||||||
The compressor to use on the initrd image. May be any of:
|
The compressor to use on the initrd image. May be any of:
|
||||||
|
|
||||||
<itemizedlist>
|
- The name of one of the predefined compressors, see {file}`pkgs/build-support/kernel/initrd-compressor-meta.nix` for the definitions.
|
||||||
<listitem><para>The name of one of the predefined compressors, see <filename>pkgs/build-support/kernel/initrd-compressor-meta.nix</filename> for the definitions.</para></listitem>
|
- A function which, given the nixpkgs package set, returns the path to a compressor tool, e.g. `pkgs: "''${pkgs.pigz}/bin/pigz"`
|
||||||
<listitem><para>A function which, given the nixpkgs package set, returns the path to a compressor tool, e.g. <literal>pkgs: "''${pkgs.pigz}/bin/pigz"</literal></para></listitem>
|
- (not recommended, because it does not work when cross-compiling) the full path to a compressor tool, e.g. `"''${pkgs.pigz}/bin/pigz"`
|
||||||
<listitem><para>(not recommended, because it does not work when cross-compiling) the full path to a compressor tool, e.g. <literal>"''${pkgs.pigz}/bin/pigz"</literal></para></listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
|
|
||||||
The given program should read data from stdin and write it to stdout compressed.
|
The given program should read data from stdin and write it to stdout compressed.
|
||||||
'';
|
'';
|
||||||
|
@ -662,16 +660,14 @@ in
|
||||||
default = true;
|
default = true;
|
||||||
type = types.bool;
|
type = types.bool;
|
||||||
description =
|
description =
|
||||||
''
|
lib.mdDoc ''
|
||||||
Verbosity of the initrd. Please note that disabling verbosity removes
|
Verbosity of the initrd. Please note that disabling verbosity removes
|
||||||
only the mandatory messages generated by the NixOS scripts. For a
|
only the mandatory messages generated by the NixOS scripts. For a
|
||||||
completely silent boot, you might also want to set the two following
|
completely silent boot, you might also want to set the two following
|
||||||
configuration options:
|
configuration options:
|
||||||
|
|
||||||
<itemizedlist>
|
- `boot.consoleLogLevel = 0;`
|
||||||
<listitem><para><literal>boot.consoleLogLevel = 0;</literal></para></listitem>
|
- `boot.kernelParams = [ "quiet" "udev.log_level=3" ];`
|
||||||
<listitem><para><literal>boot.kernelParams = [ "quiet" "udev.log_level=3" ];</literal></para></listitem>
|
|
||||||
</itemizedlist>
|
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue