summaryrefslogtreecommitdiffstats
path: root/makefu/2configs
diff options
context:
space:
mode:
Diffstat (limited to 'makefu/2configs')
-rw-r--r--makefu/2configs/audio/jack-on-pulse.nix52
-rw-r--r--makefu/2configs/audio/respeaker.nix122
-rw-r--r--makefu/2configs/bgt/template.md2
-rw-r--r--makefu/2configs/bitlbee.nix1
-rw-r--r--makefu/2configs/bureautomation/brother-ql-web.nix23
-rw-r--r--makefu/2configs/bureautomation/printer.nix28
-rw-r--r--makefu/2configs/default.nix1
-rw-r--r--makefu/2configs/deployment/feed.euer.krebsco.de/filter.yml12
-rw-r--r--makefu/2configs/deployment/nixos.wiki/default.nix9
-rw-r--r--makefu/2configs/deployment/nixos.wiki/mediawiki.module.nix481
-rw-r--r--makefu/2configs/deployment/nixos.wiki/mediawiki.nix67
-rw-r--r--makefu/2configs/deployment/nixos.wiki/mediawiki.password.txt1
-rw-r--r--makefu/2configs/deployment/nixos.wiki/network.nix6
-rw-r--r--makefu/2configs/deployment/ntfysh.nix41
-rw-r--r--makefu/2configs/deployment/owncloud.nix8
-rw-r--r--makefu/2configs/deployment/rss/rss.euer.krebsco.de.nix4
-rw-r--r--makefu/2configs/deployment/rss/urls4
-rw-r--r--makefu/2configs/editor/vim.nix2
-rw-r--r--makefu/2configs/editor/vimrc3
-rw-r--r--makefu/2configs/gui/base.nix22
-rw-r--r--makefu/2configs/gui/gnome.nix63
-rw-r--r--makefu/2configs/gui/pipewire.nix3
-rw-r--r--makefu/2configs/gui/snake-kiosk.nix44
-rw-r--r--makefu/2configs/gui/wbob-kiosk.nix13
-rw-r--r--makefu/2configs/home-manager/zsh.nix25
-rw-r--r--makefu/2configs/home/3dprint.nix6
-rw-r--r--makefu/2configs/home/ham/automation/light_buttons.nix28
-rw-r--r--makefu/2configs/home/ham/automation/urlaub.nix6
-rw-r--r--makefu/2configs/home/ham/automation/welcome.txt.j22
-rw-r--r--makefu/2configs/home/ham/default.nix2
-rw-r--r--makefu/2configs/home/ham/docker.nix30
-rw-r--r--makefu/2configs/home/ham/intents/default.nix35
-rw-r--r--makefu/2configs/home/ham/intents/music_chooser.txt.j213
-rw-r--r--makefu/2configs/home/ham/intents/statusbericht.txt.j237
-rw-r--r--makefu/2configs/home/ham/lib/default.nix5
-rw-r--r--makefu/2configs/home/ham/light/wohnzimmer.nix27
-rw-r--r--makefu/2configs/home/ham/media/firetv.nix22
-rw-r--r--makefu/2configs/home/ham/mqtt.nix2
-rw-r--r--makefu/2configs/home/ham/multi/kurzzeitwecker.nix172
-rw-r--r--makefu/2configs/home/ham/sensor/outside.nix11
-rw-r--r--makefu/2configs/home/jellyfin.nix72
-rw-r--r--makefu/2configs/home/music.nix3
-rw-r--r--makefu/2configs/home/photoprism.nix7
-rw-r--r--makefu/2configs/home/rhasspy/default.nix40
-rw-r--r--makefu/2configs/home/rhasspy/led-control.nix23
-rw-r--r--makefu/2configs/home/zigbee2mqtt/default.nix4
-rw-r--r--makefu/2configs/hw/cdrip.nix7
-rw-r--r--makefu/2configs/hw/pseyecam.nix6
-rw-r--r--makefu/2configs/hw/tp-x2x0.nix2
-rw-r--r--makefu/2configs/kdeconnect.nix6
-rw-r--r--makefu/2configs/main-laptop.nix48
-rw-r--r--makefu/2configs/nginx/euer.wiki.nix2
-rw-r--r--makefu/2configs/overlays/prefer-remote-fetch.nix4
-rw-r--r--makefu/2configs/share/gum-client.nix2
-rw-r--r--makefu/2configs/share/hetzner-client.nix2
-rw-r--r--makefu/2configs/share/omo.nix1
-rw-r--r--makefu/2configs/shiori.nix17
-rw-r--r--makefu/2configs/systemdultras/ircbot.nix4
-rw-r--r--makefu/2configs/tools/core-gui.nix1
-rw-r--r--makefu/2configs/tools/dev.nix1
-rw-r--r--makefu/2configs/tools/games.nix1
-rw-r--r--makefu/2configs/wireguard/server.nix1
-rw-r--r--makefu/2configs/wireguard/wiregrill.nix65
63 files changed, 1392 insertions, 362 deletions
diff --git a/makefu/2configs/audio/jack-on-pulse.nix b/makefu/2configs/audio/jack-on-pulse.nix
deleted file mode 100644
index e18b2192a..000000000
--- a/makefu/2configs/audio/jack-on-pulse.nix
+++ /dev/null
@@ -1,52 +0,0 @@
-{ config, pkgs, ... }:
-let
- pulse = pkgs.pulseaudioFull;
- user = config.makefu.gui.user;
- wait_time = 30;
-in
-{
- sound.enable = true;
- hardware.pulseaudio = {
- enable = true;
- package = pulse;
- };
-
- environment.systemPackages = with pkgs; [
- jack2Full
- jack_capture
- ];
- # from http://anderspapitto.com/posts/2015-11-26-overtone-on-nixos-with-jack-and-pulseaudio.html
-
- systemd.user.services = {
- jackdbus = {
- description = "Runs jack, and points pulseaudio at it";
- serviceConfig = {
- Type = "oneshot";
- ExecStart = pkgs.writeScript "start_jack.sh" ''
- #! ${pkgs.bash}/bin/bash
- . ${config.system.build.setEnvironment}
-
- # TODO: correctly wait for pulseaudio, cannot use pulseaudio.service
- sleep ${toString wait_time} # wait for the gui to load
-
- ${pkgs.jack2Full}/bin/jack_control start
- sleep 3 # give some time for sources/sinks to be created
-
- ${pulse}/bin/pacmd set-default-sink jack_out
- ${pulse}/bin/pacmd set-default-source jack_in
- '';
- ExecStop = pkgs.writeScript "stop_jack.sh" ''
- #! ${pkgs.bash}/bin/bash
- . ${config.system.build.setEnvironment}
-
- ${pkgs.jack2Full}/bin/jack_control stop
- '';
- RemainAfterExit = true;
- Restart = "always";
- RestartSec = "5";
- };
- after = [ "display-manager.service" "sound.target" ];
- wantedBy = [ "default.target" ];
- };
- };
-}
diff --git a/makefu/2configs/audio/respeaker.nix b/makefu/2configs/audio/respeaker.nix
new file mode 100644
index 000000000..0aaef5dac
--- /dev/null
+++ b/makefu/2configs/audio/respeaker.nix
@@ -0,0 +1,122 @@
+{ config, lib, pkgs, ... }:
+let
+ seeed-voicecard = (pkgs.callPackage ../../5pkgs/seeed-voicecard { kernel = config.boot.kernelPackages.kernel; });
+in
+{
+ hardware.raspberry-pi."4".i2c1.enable = true;
+ hardware.raspberry-pi."4".audio.enable = true;
+ hardware.raspberry-pi."4".apply-overlays-dtmerge.enable = true;
+ hardware.deviceTree.filter = lib.mkForce "bcm2711-rpi-4-b.dtb";
+
+ security.rtkit.enable = true;
+
+ environment.systemPackages = with pkgs; [
+ alsaUtils
+ i2c-tools
+ ponymix
+ ];
+
+ sound.enable = true;
+ hardware.pulseaudio.enable = lib.mkForce false;
+ services.pipewire = {
+ enable = true;
+ systemWide = true;
+ alsa.enable = true;
+ alsa.support32Bit = true;
+ pulse.enable = true;
+ };
+
+ services.pipewire.config.pipewire-pulse = {
+ "pulse.properties"."server.address" = [ "unix:native" "tcp:4713" ];
+ };
+
+ sound.extraConfig = ''
+ pcm.!default {
+ type asym
+ playback.pcm "playback"
+ capture.pcm "ac108"
+ }
+
+ pcm.ac108 {
+ type plug
+ slave.pcm "hw:seeed4micvoicec"
+ }
+ '' ;
+
+
+ boot.extraModulePackages = [
+ seeed-voicecard
+ ];
+ boot.initrd.kernelModules = [
+ "snd-soc-seeed-voicecard"
+ "snd-soc-ac108"
+ "i2c-dev"
+ #"i2c-bcm2708"
+ #"snd-soc-wm8960"
+ ];
+
+ boot.loader.raspberryPi.firmwareConfig = [
+ "dtparam=i2c_arm=on"
+ "dtparam=i2s=on"
+ "dtparam=spi=on"
+ "dtparam=i2c1=on"
+ # dtoverlay=seeeed-8mic-voicecard not required because we use hardware.deviceTree
+ ];
+ hardware.deviceTree = {
+ enable = true;
+ overlays = [
+ { name = "respeaker-4mic"; dtsFile = "${seeed-voicecard}/lib/dts/seeed-4mic-voicecard-overlay.dts";}
+ { name = "spi"; dtsText = ''
+ /dts-v1/;
+ /plugin/;
+
+ / {
+ compatible = "raspberrypi";
+ fragment@0 {
+ target = <&spi>;
+ __overlay__ {
+ cs-gpios = <&gpio 8 1>, <&gpio 7 1>;
+ status = "okay";
+ pinctrl-names = "default";
+ pinctrl-0 = <&spi0_pins &spi0_cs_pins>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+ spidev@0 {
+ reg = <0>; // CE0
+ spi-max-frequency = <500000>;
+ compatible = "spidev";
+ };
+
+ spidev@1 {
+ reg = <1>; // CE1
+ spi-max-frequency = <500000>;
+ compatible = "spidev";
+ };
+ };
+ };
+ fragment@1 {
+ target = <&alt0>;
+ __overlay__ {
+ // Drop GPIO 7, SPI 8-11
+ brcm,pins = <4 5>;
+ };
+ };
+
+ fragment@2 {
+ target = <&gpio>;
+ __overlay__ {
+ spi0_pins: spi0_pins {
+ brcm,pins = <9 10 11>;
+ brcm,function = <4>; // alt0
+ };
+ spi0_cs_pins: spi0_cs_pins {
+ brcm,pins = <8 7>;
+ brcm,function = <1>; // out
+ };
+ };
+ };
+ };
+ '';}
+ ];
+ };
+}
diff --git a/makefu/2configs/bgt/template.md b/makefu/2configs/bgt/template.md
index 1dfb0b42f..be21d7c0c 100644
--- a/makefu/2configs/bgt/template.md
+++ b/makefu/2configs/bgt/template.md
@@ -2,7 +2,7 @@
0. Sendung twittern und mastodieren (eine Woche + eine Stunde vorher) von Ingo/l33tname (wichtig)
1. `eine` Person anrufen (den Host):
- - markus 162dcbf89f@studio.link
+ - markus madmas@studio.link
- Felix1 makefu@studio.link
- L33tFelix l33tname@studio.link
- Ingo ingo@studio.link
diff --git a/makefu/2configs/bitlbee.nix b/makefu/2configs/bitlbee.nix
index 21626d406..ede6225ea 100644
--- a/makefu/2configs/bitlbee.nix
+++ b/makefu/2configs/bitlbee.nix
@@ -3,6 +3,7 @@
services.bitlbee = {
enable = true;
# libpurple_plugins = [ pkgs.telegram-purple pkgs.pidgin-skypeweb];
+ plugins = [ pkgs.bitlbee-mastodon ];
};
users.users.makefu.packages = with pkgs; [ weechat tmux ];
state = [ "/var/lib/bitlbee" ];
diff --git a/makefu/2configs/bureautomation/brother-ql-web.nix b/makefu/2configs/bureautomation/brother-ql-web.nix
new file mode 100644
index 000000000..26887db03
--- /dev/null
+++ b/makefu/2configs/bureautomation/brother-ql-web.nix
@@ -0,0 +1,23 @@
+ {pkgs, ... }:
+ let
+ pkg = pkgs.brother_ql_web;
+ in {
+ systemd.services.brother-ql-web = {
+ after = [ "network.target" ];
+ description = "Brother QL Web Interface";
+ wantedBy = [ "multi-user.target" ];
+ environment = {
+ FLASK_PRINTER = "usb://0x04f9:0x209b/000F1Z401759";
+ FLASK_MODEL = "QL-800";
+ #FLASK_SERVER_PORT = "8013";
+ #FLASK_LABEL_DEFAULT_SIZE = "d24";
+ #FLASK_LABEL_DEFAULT_QR_SIZE = "7";
+ };
+ serviceConfig = {
+ ExecStart = "${pkg}/bin/brother_ql_web";
+ DynamicUser = true;
+ SupplementaryGroups = "lp";
+ Restart = "always";
+ };
+ };
+}
diff --git a/makefu/2configs/bureautomation/printer.nix b/makefu/2configs/bureautomation/printer.nix
new file mode 100644
index 000000000..86d5a4069
--- /dev/null
+++ b/makefu/2configs/bureautomation/printer.nix
@@ -0,0 +1,28 @@
+{ pkgs, config, ... }:
+let
+ mainUser = config.krebs.build.user.name;
+in {
+ imports = [
+ ./brother-ql-web.nix
+ ];
+ services.printing = {
+ enable = true;
+ drivers = with pkgs;[
+ brlaser
+ cups-ptouch
+ ];
+ };
+ users.users.kiosk.extraGroups = [ "scanner" "lp" ];
+ state = [ "/var/lib/cups"];
+ users.users.kiosk.packages = with pkgs;[
+ python3Packages.brother-ql
+ libreoffice
+ qrencode
+ imagemagick
+ ];
+
+ services.udev.extraRules = ''
+ SUBSYSTEMS=="usb", ATTRS{idVendor}=="04f9", ATTRS{idProduct}=="209b", ATTRS{serial}=="000F1Z401759", MODE="0664", GROUP="lp", SYMLINK+="usb/lp0"
+ '';
+
+}
diff --git a/makefu/2configs/default.nix b/makefu/2configs/default.nix
index 2bfb42732..b54e32a82 100644
--- a/makefu/2configs/default.nix
+++ b/makefu/2configs/default.nix
@@ -31,6 +31,7 @@ with import <stockholm/lib>;
};
};
nix.settings.trusted-users = [ config.krebs.build.user.name ];
+ nix.settings.experimental-features = [ "flakes" "nix-command" ];
boot.kernelPackages = lib.mkDefault pkgs.linuxPackages;
diff --git a/makefu/2configs/deployment/feed.euer.krebsco.de/filter.yml b/makefu/2configs/deployment/feed.euer.krebsco.de/filter.yml
index 50058f32b..29e5e714a 100644
--- a/makefu/2configs/deployment/feed.euer.krebsco.de/filter.yml
+++ b/makefu/2configs/deployment/feed.euer.krebsco.de/filter.yml
@@ -26,18 +26,6 @@
zipcode: 70378
q: Werkbank
distance: 5
-- name: Stirnthermometer
- zipcode: 70378
- q: Stirnthermometer
- distance: 5
-- name: Ohrthermometer
- zipcode: 70378
- q: Ohrthermometer
- distance: 5
-- name: Fieberthermometer
- zipcode: 70378
- q: Fieberthermometer
- distance: 5
- name: Einhell
zipcode: 70378
q: Einhell
diff --git a/makefu/2configs/deployment/nixos.wiki/default.nix b/makefu/2configs/deployment/nixos.wiki/default.nix
new file mode 100644
index 000000000..cd738ea8b
--- /dev/null
+++ b/makefu/2configs/deployment/nixos.wiki/default.nix
@@ -0,0 +1,9 @@
+{ config, pkgs, ... }:
+
+{
+ imports =
+ [ ./mediawiki.nix
+ ./network.nix
+ ];
+
+}
diff --git a/makefu/2configs/deployment/nixos.wiki/mediawiki.module.nix b/makefu/2configs/deployment/nixos.wiki/mediawiki.module.nix
new file mode 100644
index 000000000..24715f81e
--- /dev/null
+++ b/makefu/2configs/deployment/nixos.wiki/mediawiki.module.nix
@@ -0,0 +1,481 @@
+{ config, pkgs, lib, ... }:
+
+let
+
+ inherit (lib) mkDefault mkEnableOption mkForce mkIf mkMerge mkOption;
+ inherit (lib) concatStringsSep literalExample mapAttrsToList optional optionals optionalString types;
+
+ cfg = config.services.mediawiki;
+ fpm = config.services.phpfpm.pools.mediawiki;
+ user = "mediawiki";
+ group = config.services.httpd.group;
+ cacheDir = "/var/cache/mediawiki";
+ stateDir = "/var/lib/mediawiki";
+
+ pkg = pkgs.stdenv.mkDerivation rec {
+ pname = "mediawiki-full";
+ version = src.version;
+ src = cfg.package;
+
+ installPhase = ''
+ mkdir -p $out
+ cp -r * $out/
+
+ rm -rf $out/share/mediawiki/skins/*
+ rm -rf $out/share/mediawiki/extensions/*
+
+ ${concatStringsSep "\n" (mapAttrsToList (k: v: ''
+ ln -s ${v} $out/share/mediawiki/skins/${k}
+ '') cfg.skins)}
+
+ ${concatStringsSep "\n" (mapAttrsToList (k: v: ''
+ ln -s ${if v != null then v else "$src/share/mediawiki/extensions/${k}"} $out/share/mediawiki/extensions/${k}
+ '') cfg.extensions)}
+ '';
+ };
+
+ mediawikiScripts = pkgs.runCommand "mediawiki-scripts" {
+ buildInputs = [ pkgs.makeWrapper ];
+ preferLocalBuild = true;
+ } ''
+ mkdir -p $out/bin
+ for i in changePassword.php createAndPromote.php userOptions.php edit.php nukePage.php update.php; do
+ makeWrapper ${pkgs.php}/bin/php $out/bin/mediawiki-$(basename $i .php) \
+ --set MEDIAWIKI_CONFIG ${mediawikiConfig} \
+ --add-flags ${pkg}/share/mediawiki/maintenance/$i
+ done
+ '';
+
+ mediawikiConfig = pkgs.writeText "LocalSettings.php" ''
+ <?php
+ # Protect against web entry
+ if ( !defined( 'MEDIAWIKI' ) ) {
+ exit;
+ }
+
+ $wgSitename = "${cfg.name}";
+ $wgMetaNamespace = false;
+
+ ## The URL base path to the directory containing the wiki;
+ ## defaults for all runtime URL paths are based off of this.
+ ## For more information on customizing the URLs
+ ## (like /w/index.php/Page_title to /wiki/Page_title) please see:
+ ## https://www.mediawiki.org/wiki/Manual:Short_URL
+ $wgScriptPath = "${cfg.basePath}";
+
+ ## The protocol and server name to use in fully-qualified URLs
+ #$wgServer = "${if cfg.virtualHost.addSSL || cfg.virtualHost.forceSSL || cfg.virtualHost.onlySSL then "https" else "http"}://${cfg.virtualHost.hostName}";
+ #$wgServer = "";
+ $wgServer = "http://localhost";
+
+ ## The URL path to static resources (images, scripts, etc.)
+ $wgResourceBasePath = $wgScriptPath;
+
+ ## The URL path to the logo. Make sure you change this from the default,
+ ## or else you'll overwrite your logo when you upgrade!
+ $wgLogo = "$wgResourceBasePath/resources/assets/wiki.png";
+
+ ## UPO means: this is also a user preference option
+
+ $wgEnableEmail = true;
+ $wgEnableUserEmail = true; # UPO
+
+ $wgEmergencyContact = "${if cfg.virtualHost.adminAddr != null then cfg.virtualHost.adminAddr else config.services.httpd.adminAddr}";
+ $wgPasswordSender = $wgEmergencyContact;
+
+ $wgEnotifUserTalk = false; # UPO
+ $wgEnotifWatchlist = false; # UPO
+ $wgEmailAuthentication = true;
+
+ ## Database settings
+ $wgDBtype = "${cfg.database.type}";
+ $wgDBserver = "${cfg.database.host}:${if cfg.database.socket != null then cfg.database.socket else toString cfg.database.port}";
+ $wgDBname = "${cfg.database.name}";
+ $wgDBuser = "${cfg.database.user}";
+ ${optionalString (cfg.database.passwordFile != null) "$wgDBpassword = file_get_contents(\"${cfg.database.passwordFile}\");"}
+
+ ${optionalString (cfg.database.type == "mysql" && cfg.database.tablePrefix != null) ''
+ # MySQL specific settings
+ $wgDBprefix = "${cfg.database.tablePrefix}";
+ ''}
+
+ ${optionalString (cfg.database.type == "mysql") ''
+ # MySQL table options to use during installation or update
+ $wgDBTableOptions = "ENGINE=InnoDB, DEFAULT CHARSET=binary";
+ ''}
+
+ ## Shared memory settings
+ $wgMainCacheType = CACHE_NONE;
+ $wgMemCachedServers = [];
+
+ ${optionalString (cfg.uploadsDir != null) ''
+ $wgEnableUploads = true;
+ $wgUploadDirectory = "${cfg.uploadsDir}";
+ ''}
+
+ $wgUseImageMagick = true;
+ $wgImageMagickConvertCommand = "${pkgs.imagemagick}/bin/convert";
+
+ # InstantCommons allows wiki to use images from https://commons.wikimedia.org
+ $wgUseInstantCommons = false;
+
+ # Periodically send a pingback to https://www.mediawiki.org/ with basic data
+ # about this MediaWiki instance. The Wikimedia Foundation shares this data
+ # with MediaWiki developers to help guide future development efforts.
+ $wgPingback = true;
+
+ ## If you use ImageMagick (or any other shell command) on a
+ ## Linux server, this will need to be set to the name of an
+ ## available UTF-8 locale
+ $wgShellLocale = "C.UTF-8";
+
+ ## Set $wgCacheDirectory to a writable directory on the web server
+ ## to make your wiki go slightly faster. The directory should not
+ ## be publically accessible from the web.
+ $wgCacheDirectory = "${cacheDir}";
+
+ # Site language code, should be one of the list in ./languages/data/Names.php
+ $wgLanguageCode = "en";
+
+ $wgSecretKey = file_get_contents("${stateDir}/secret.key");
+
+ # Changing this will log out all existing sessions.
+ $wgAuthenticationTokenVersion = "";
+
+ ## For attaching licensing metadata to pages, and displaying an
+ ## appropriate copyright notice / icon. GNU Free Documentation
+ ## License and Creative Commons licenses are supported so far.
+ $wgRightsPage = ""; # Set to the title of a wiki page that describes your license/copyright
+ $wgRightsUrl = "";
+ $wgRightsText = "";
+ $wgRightsIcon = "";
+
+ # Path to the GNU diff3 utility. Used for conflict resolution.
+ $wgDiff = "${pkgs.diffutils}/bin/diff";
+ $wgDiff3 = "${pkgs.diffutils}/bin/diff3";
+
+ # Enabled skins.
+ ${concatStringsSep "\n" (mapAttrsToList (k: v: "wfLoadSkin('${k}');") cfg.skins)}
+
+ # Enabled extensions.
+ ${concatStringsSep "\n" (mapAttrsToList (k: v: "wfLoadExtension('${k}');") cfg.extensions)}
+
+
+ # End of automatically generated settings.
+ # Add more configuration options below.
+
+ ${cfg.extraConfig}
+ '';
+
+in
+{
+ # interface
+ options = {
+ services.mediawiki = {
+
+ enable = mkEnableOption "MediaWiki";
+
+ package = mkOption {
+ type = types.package;
+ default = pkgs.mediawiki;
+ description = "Which MediaWiki package to use.";
+ };
+
+ basePath = mkOption {
+ type = types.str;
+ default = "/";
+ description = "Base path to Wiki";
+ };
+
+ name = mkOption {
+ default = "MediaWiki";
+ example = "Foobar Wiki";
+ description = "Name of the wiki.";
+ };
+
+ uploadsDir = mkOption {
+ type = types.nullOr types.path;
+ default = "${stateDir}/uploads";
+ description = ''
+ This directory is used for uploads of pictures. The directory passed here is automatically
+ created and permissions adjusted as required.
+ '';
+ };
+
+ passwordFile = mkOption {
+ type = types.path;
+ description = "A file containing the initial password for the admin user.";
+ example = "/run/keys/mediawiki-password";
+ };
+
+ skins = mkOption {
+ default = {};
+ type = types.attrsOf types.path;
+ description = ''
+ Attribute set of paths whose content is copied to the <filename>skins</filename>
+ subdirectory of the MediaWiki installation in addition to the default skins.
+ '';
+ };
+
+ extensions = mkO