mirror of
https://github.com/NixOS/nixpkgs.git
synced 2026-07-23 09:00:51 +00:00
Compare commits
37 Commits
release-16
...
16.03-beta
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
74f22ff827 | ||
|
|
57f7ff00fe | ||
|
|
79c3725185 | ||
|
|
8c7ccdd556 | ||
|
|
010271d47a | ||
|
|
da1f465b94 | ||
|
|
a93a2e2360 | ||
|
|
b3faef0d93 | ||
|
|
29852f9d24 | ||
|
|
5e5cd7c93c | ||
|
|
2d05e4d5a4 | ||
|
|
a693d5cc99 | ||
|
|
fe09260465 | ||
|
|
850a1a3323 | ||
|
|
a9d24cedeb | ||
|
|
3a6b06f1be | ||
|
|
ae2ad0dfc1 | ||
|
|
ab746ec902 | ||
|
|
070dccae7b | ||
|
|
fde23a01b4 | ||
|
|
eaed559859 | ||
|
|
41204574be | ||
|
|
c62bf00442 | ||
|
|
3a8a887cfd | ||
|
|
efad7bd47d | ||
|
|
a91161aa57 | ||
|
|
1af8a3498c | ||
|
|
3344f02b3b | ||
|
|
c08f18df63 | ||
|
|
82560aefd7 | ||
|
|
ad23ac715e | ||
|
|
fd46f18cf6 | ||
|
|
73630b8986 | ||
|
|
c4c9019105 | ||
|
|
6a096504cc | ||
|
|
8442a7d12c | ||
|
|
a0753c7cb2 |
@@ -11,7 +11,7 @@ if [[ $1 == nix ]]; then
|
||||
|
||||
# Make sure we can use hydra's binary cache
|
||||
sudo mkdir /etc/nix
|
||||
sudo echo "build-max-jobs = 4" > /etc/nix/nix.conf
|
||||
sudo sh -c 'echo "build-max-jobs = 4" > /etc/nix/nix.conf'
|
||||
|
||||
# Verify evaluation
|
||||
echo "=== Verifying that nixpkgs evaluates..."
|
||||
|
||||
@@ -226,6 +226,27 @@ programs.ibus.plugins = with pkgs; [ ibus-anthy mozc ];
|
||||
was removed. Please review the currently available options.</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
The option <option>services.nsd.zones.<name>.data</option> no
|
||||
longer interpret the dollar sign ($) as a shell variable, as such it
|
||||
should not be escaped anymore. Thus the following zone data:
|
||||
</para>
|
||||
<programlisting>
|
||||
\$ORIGIN example.com.
|
||||
\$TTL 1800
|
||||
@ IN SOA ns1.vpn.nbp.name. admin.example.com. (
|
||||
</programlisting>
|
||||
<para>
|
||||
Should modified to look like the actual file expected by nsd:
|
||||
</para>
|
||||
<programlisting>
|
||||
$ORIGIN example.com.
|
||||
$TTL 1800
|
||||
@ IN SOA ns1.vpn.nbp.name. admin.example.com. (
|
||||
</programlisting>
|
||||
</listitem>
|
||||
|
||||
</itemizedlist>
|
||||
|
||||
|
||||
|
||||
@@ -1,41 +0,0 @@
|
||||
{ config, pkgs, lib, ... }:
|
||||
|
||||
{
|
||||
imports = [
|
||||
];
|
||||
|
||||
options = {
|
||||
gtkPlugins = lib.mkOption {
|
||||
type = lib.types.listOf lib.types.path;
|
||||
default = [];
|
||||
description = ''
|
||||
Plugin packages for GTK+ such as input methods.
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
config = {
|
||||
environment.variables = if builtins.length config.gtkPlugins > 0
|
||||
then
|
||||
let
|
||||
paths = [ pkgs.gtk2 pkgs.gtk3 ] ++ config.gtkPlugins;
|
||||
env = pkgs.buildEnv {
|
||||
name = "gtk-exe-env";
|
||||
|
||||
inherit paths;
|
||||
|
||||
postBuild = lib.concatStringsSep "\n"
|
||||
(map (d: d.gtkExeEnvPostBuild or "") paths);
|
||||
|
||||
ignoreCollisions = true;
|
||||
};
|
||||
in {
|
||||
GTK_EXE_PREFIX = builtins.toString env;
|
||||
GTK_PATH = [
|
||||
"${env}/lib/gtk-2.0"
|
||||
"${env}/lib/gtk-3.0"
|
||||
];
|
||||
}
|
||||
else {};
|
||||
};
|
||||
}
|
||||
@@ -1,37 +0,0 @@
|
||||
{ config, pkgs, lib, ... }:
|
||||
|
||||
{
|
||||
imports = [
|
||||
];
|
||||
|
||||
options = {
|
||||
qtPlugins = lib.mkOption {
|
||||
type = lib.types.listOf lib.types.path;
|
||||
default = [];
|
||||
description = ''
|
||||
Plugin packages for Qt such as input methods.
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
config = {
|
||||
environment.variables = if builtins.length config.qtPlugins > 0
|
||||
then
|
||||
let
|
||||
paths = [ pkgs.qt48 ] ++ config.qtPlugins;
|
||||
env = pkgs.buildEnv {
|
||||
name = "qt-plugin-env";
|
||||
|
||||
inherit paths;
|
||||
|
||||
postBuild = lib.concatStringsSep "\n"
|
||||
(map (d: d.qtPluginEnvPostBuild or "") paths);
|
||||
|
||||
ignoreCollisions = true;
|
||||
};
|
||||
in {
|
||||
QT_PLUGIN_PATH = [ (builtins.toString env) ];
|
||||
}
|
||||
else {};
|
||||
};
|
||||
}
|
||||
@@ -18,10 +18,14 @@ in
|
||||
type = with types; listOf fcitxEngine;
|
||||
default = [];
|
||||
example = literalExample "with pkgs.fcitx-engines; [ mozc hangul ]";
|
||||
description = ''
|
||||
Enabled Fcitx engines.
|
||||
Available engines can be found by running `nix-env "<nixpkgs>" . -qaP -A fcitx-engines`.
|
||||
'';
|
||||
description =
|
||||
let
|
||||
engines =
|
||||
lib.concatStringsSep ", "
|
||||
(map (name: "<literal>${name}</literal>")
|
||||
(lib.attrNames pkgs.fcitx-engines));
|
||||
in
|
||||
"Enabled Fcitx engines. Available engines are: ${engines}.";
|
||||
};
|
||||
};
|
||||
|
||||
@@ -29,8 +33,6 @@ in
|
||||
|
||||
config = mkIf (config.i18n.inputMethod.enabled == "fcitx") {
|
||||
environment.systemPackages = [ fcitxPackage ];
|
||||
gtkPlugins = [ fcitxPackage ];
|
||||
qtPlugins = [ fcitxPackage ];
|
||||
|
||||
environment.variables = {
|
||||
GTK_IM_MODULE = "fcitx";
|
||||
|
||||
@@ -4,7 +4,6 @@ with lib;
|
||||
{
|
||||
config = mkIf (config.i18n.inputMethod.enabled == "nabi") {
|
||||
environment.systemPackages = [ pkgs.nabi ];
|
||||
qtPlugins = [ pkgs.nabi ];
|
||||
|
||||
environment.variables = {
|
||||
GTK_IM_MODULE = "nabi";
|
||||
|
||||
@@ -23,8 +23,6 @@ in
|
||||
|
||||
config = mkIf (config.i18n.inputMethod.enabled == "uim") {
|
||||
environment.systemPackages = [ pkgs.uim ];
|
||||
gtkPlugins = [ pkgs.uim ];
|
||||
qtPlugins = [ pkgs.uim ];
|
||||
|
||||
environment.variables = {
|
||||
GTK_IM_MODULE = "uim";
|
||||
|
||||
@@ -89,7 +89,7 @@ in
|
||||
defaultChannel = mkOption {
|
||||
internal = true;
|
||||
type = types.str;
|
||||
default = https://nixos.org/channels/nixos-unstable;
|
||||
default = https://nixos.org/channels/nixos-16.03;
|
||||
description = "Default NixOS channel to which the root user is subscribed.";
|
||||
};
|
||||
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
./config/fonts/fonts.nix
|
||||
./config/fonts/ghostscript.nix
|
||||
./config/gnu.nix
|
||||
./config/gtk-exe-env.nix
|
||||
./config/i18n.nix
|
||||
./config/krb5.nix
|
||||
./config/ldap.nix
|
||||
@@ -16,7 +15,6 @@
|
||||
./config/nsswitch.nix
|
||||
./config/power-management.nix
|
||||
./config/pulseaudio.nix
|
||||
./config/qt-plugin-env.nix
|
||||
./config/shells-environment.nix
|
||||
./config/swap.nix
|
||||
./config/sysctl.nix
|
||||
@@ -79,7 +77,6 @@
|
||||
./programs/shell.nix
|
||||
./programs/ssh.nix
|
||||
./programs/ssmtp.nix
|
||||
./programs/uim.nix
|
||||
./programs/venus.nix
|
||||
./programs/wvdial.nix
|
||||
./programs/xfs_quota.nix
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
{ config, pkgs, lib, ... }:
|
||||
|
||||
with lib;
|
||||
|
||||
let
|
||||
cfg = config.uim;
|
||||
in
|
||||
{
|
||||
options = {
|
||||
|
||||
uim = {
|
||||
enable = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
example = true;
|
||||
description = "Enable UIM input method";
|
||||
};
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
environment.systemPackages = [ pkgs.uim ];
|
||||
gtkPlugins = [ pkgs.uim ];
|
||||
qtPlugins = [ pkgs.uim ];
|
||||
environment.variables.GTK_IM_MODULE = "uim";
|
||||
environment.variables.QT_IM_MODULE = "uim";
|
||||
environment.variables.XMODIFIERS = "@im=uim";
|
||||
services.xserver.displayManager.sessionCommands = "uim-xim &";
|
||||
};
|
||||
}
|
||||
@@ -100,7 +100,7 @@ in {
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
|
||||
serviceConfig = {
|
||||
ExecStart = "${pkgs.collectd}/sbin/collectd -C ${conf} -P ${cfg.pidFile}";
|
||||
ExecStart = "${cfg.package}/sbin/collectd -C ${conf} -P ${cfg.pidFile}";
|
||||
Type = "forking";
|
||||
PIDFile = cfg.pidFile;
|
||||
User = optional (cfg.user!="root") cfg.user;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -48,7 +48,7 @@ in rec {
|
||||
(all nixos.ova)
|
||||
|
||||
#(all nixos.tests.containers)
|
||||
(all nixos.tests.chromium.stable)
|
||||
(all nixos.tests.chromium)
|
||||
(all nixos.tests.firefox)
|
||||
(all nixos.tests.firewall)
|
||||
nixos.tests.gnome3.x86_64-linux # FIXME: i686-linux
|
||||
@@ -63,7 +63,7 @@ in rec {
|
||||
(all nixos.tests.installer.btrfsSimple)
|
||||
(all nixos.tests.installer.btrfsSubvols)
|
||||
(all nixos.tests.installer.btrfsSubvolDefault)
|
||||
(all nixos.tests.boot.biosCdrom)
|
||||
(all nixos.tests.bootBiosCdrom)
|
||||
(all nixos.tests.ipv6)
|
||||
(all nixos.tests.kde4)
|
||||
#(all nixos.tests.lightdm)
|
||||
|
||||
@@ -9,29 +9,11 @@ let
|
||||
|
||||
version = builtins.readFile ../.version;
|
||||
versionSuffix =
|
||||
(if stableBranch then "." else "pre") + "${toString nixpkgs.revCount}.${nixpkgs.shortRev}";
|
||||
(if stableBranch then "." else "pre") + "${toString (nixpkgs.revCount - 77900)}.${nixpkgs.shortRev}";
|
||||
|
||||
forAllSystems = genAttrs supportedSystems;
|
||||
|
||||
importTest = fn: args: system: import fn ({
|
||||
inherit system;
|
||||
} // args);
|
||||
|
||||
callTest = fn: args: forAllSystems (system: hydraJob (importTest fn args system));
|
||||
|
||||
callSubTests = fn: args: let
|
||||
discover = attrs: let
|
||||
subTests = filterAttrs (const (hasAttr "test")) attrs;
|
||||
in mapAttrs (const (t: hydraJob t.test)) subTests;
|
||||
|
||||
discoverForSystem = system: mapAttrs (_: test: {
|
||||
${system} = test;
|
||||
}) (discover (importTest fn args system));
|
||||
|
||||
# If the test is only for a particular system, use only the specified
|
||||
# system instead of generating attributes for all available systems.
|
||||
in if args ? system then discover (import fn args)
|
||||
else foldAttrs (a: b: a // b) {} (map discoverForSystem supportedSystems);
|
||||
callTest = fn: args: forAllSystems (system: hydraJob (import fn ({ inherit system; } // args)));
|
||||
|
||||
pkgs = import nixpkgs { system = "x86_64-linux"; };
|
||||
|
||||
@@ -233,9 +215,8 @@ in rec {
|
||||
tests.avahi = callTest tests/avahi.nix {};
|
||||
tests.bittorrent = callTest tests/bittorrent.nix {};
|
||||
tests.blivet = callTest tests/blivet.nix {};
|
||||
tests.boot = callSubTests tests/boot.nix {};
|
||||
tests.cadvisor = hydraJob (import tests/cadvisor.nix { system = "x86_64-linux"; });
|
||||
tests.chromium = callSubTests tests/chromium.nix {};
|
||||
tests.chromium = callTest tests/chromium.nix {};
|
||||
tests.cjdns = callTest tests/cjdns.nix {};
|
||||
tests.containers = callTest tests/containers.nix {};
|
||||
tests.docker = hydraJob (import tests/docker.nix { system = "x86_64-linux"; });
|
||||
@@ -251,7 +232,18 @@ in rec {
|
||||
tests.gnome3-gdm = callTest tests/gnome3-gdm.nix {};
|
||||
tests.grsecurity = callTest tests/grsecurity.nix {};
|
||||
tests.i3wm = callTest tests/i3wm.nix {};
|
||||
tests.installer = callSubTests tests/installer.nix {};
|
||||
tests.installer.grub1 = forAllSystems (system: hydraJob (import tests/installer.nix { inherit system; }).grub1.test);
|
||||
tests.installer.lvm = forAllSystems (system: hydraJob (import tests/installer.nix { inherit system; }).lvm.test);
|
||||
tests.installer.luksroot = forAllSystems (system: hydraJob (import tests/installer.nix { inherit system; }).luksroot.test);
|
||||
tests.installer.separateBoot = forAllSystems (system: hydraJob (import tests/installer.nix { inherit system; }).separateBoot.test);
|
||||
tests.installer.separateBootFat = forAllSystems (system: hydraJob (import tests/installer.nix { inherit system; }).separateBootFat.test);
|
||||
tests.installer.simple = forAllSystems (system: hydraJob (import tests/installer.nix { inherit system; }).simple.test);
|
||||
tests.installer.simpleLabels = forAllSystems (system: hydraJob (import tests/installer.nix { inherit system; }).simpleLabels.test);
|
||||
tests.installer.simpleProvided = forAllSystems (system: hydraJob (import tests/installer.nix { inherit system; }).simpleProvided.test);
|
||||
tests.installer.swraid = forAllSystems (system: hydraJob (import tests/installer.nix { inherit system; }).swraid.test);
|
||||
tests.installer.btrfsSimple = forAllSystems (system: hydraJob (import tests/installer.nix { inherit system; }).btrfsSimple.test);
|
||||
tests.installer.btrfsSubvols = forAllSystems (system: hydraJob (import tests/installer.nix { inherit system; }).btrfsSubvols.test);
|
||||
tests.installer.btrfsSubvolDefault = forAllSystems (system: hydraJob (import tests/installer.nix { inherit system; }).btrfsSubvolDefault.test);
|
||||
tests.influxdb = callTest tests/influxdb.nix {};
|
||||
tests.ipv6 = callTest tests/ipv6.nix {};
|
||||
tests.jenkins = callTest tests/jenkins.nix {};
|
||||
@@ -270,8 +262,24 @@ in rec {
|
||||
tests.mysqlReplication = callTest tests/mysql-replication.nix {};
|
||||
tests.nat.firewall = callTest tests/nat.nix { withFirewall = true; };
|
||||
tests.nat.standalone = callTest tests/nat.nix { withFirewall = false; };
|
||||
tests.networking.networkd = callSubTests tests/networking.nix { networkd = true; };
|
||||
tests.networking.scripted = callSubTests tests/networking.nix { networkd = false; };
|
||||
tests.networking.networkd.loopback = callTest tests/networking.nix { networkd = true; test = "loopback"; };
|
||||
tests.networking.networkd.static = callTest tests/networking.nix { networkd = true; test = "static"; };
|
||||
tests.networking.networkd.dhcpSimple = callTest tests/networking.nix { networkd = true; test = "dhcpSimple"; };
|
||||
tests.networking.networkd.dhcpOneIf = callTest tests/networking.nix { networkd = true; test = "dhcpOneIf"; };
|
||||
tests.networking.networkd.bond = callTest tests/networking.nix { networkd = true; test = "bond"; };
|
||||
tests.networking.networkd.bridge = callTest tests/networking.nix { networkd = true; test = "bridge"; };
|
||||
tests.networking.networkd.macvlan = callTest tests/networking.nix { networkd = true; test = "macvlan"; };
|
||||
tests.networking.networkd.sit = callTest tests/networking.nix { networkd = true; test = "sit"; };
|
||||
tests.networking.networkd.vlan = callTest tests/networking.nix { networkd = true; test = "vlan"; };
|
||||
tests.networking.scripted.loopback = callTest tests/networking.nix { networkd = false; test = "loopback"; };
|
||||
tests.networking.scripted.static = callTest tests/networking.nix { networkd = false; test = "static"; };
|
||||
tests.networking.scripted.dhcpSimple = callTest tests/networking.nix { networkd = false; test = "dhcpSimple"; };
|
||||
tests.networking.scripted.dhcpOneIf = callTest tests/networking.nix { networkd = false; test = "dhcpOneIf"; };
|
||||
tests.networking.scripted.bond = callTest tests/networking.nix { networkd = false; test = "bond"; };
|
||||
tests.networking.scripted.bridge = callTest tests/networking.nix { networkd = false; test = "bridge"; };
|
||||
tests.networking.scripted.macvlan = callTest tests/networking.nix { networkd = false; test = "macvlan"; };
|
||||
tests.networking.scripted.sit = callTest tests/networking.nix { networkd = false; test = "sit"; };
|
||||
tests.networking.scripted.vlan = callTest tests/networking.nix { networkd = false; test = "vlan"; };
|
||||
# TODO: put in networking.nix after the test becomes more complete
|
||||
tests.networkingProxy = callTest tests/networking-proxy.nix {};
|
||||
tests.nfs3 = callTest tests/nfs.nix { version = 3; };
|
||||
@@ -291,8 +299,12 @@ in rec {
|
||||
tests.simple = callTest tests/simple.nix {};
|
||||
tests.tomcat = callTest tests/tomcat.nix {};
|
||||
tests.udisks2 = callTest tests/udisks2.nix {};
|
||||
tests.virtualbox = callSubTests tests/virtualbox.nix { system = "x86_64-linux"; };
|
||||
tests.virtualbox = hydraJob (import tests/virtualbox.nix { system = "x86_64-linux"; });
|
||||
tests.xfce = callTest tests/xfce.nix {};
|
||||
tests.bootBiosCdrom = forAllSystems (system: hydraJob (import tests/boot.nix { inherit system; }).bootBiosCdrom);
|
||||
tests.bootBiosUsb = forAllSystems (system: hydraJob (import tests/boot.nix { inherit system; }).bootBiosUsb);
|
||||
tests.bootUefiCdrom = forAllSystems (system: hydraJob (import tests/boot.nix { inherit system; }).bootUefiCdrom);
|
||||
tests.bootUefiUsb = forAllSystems (system: hydraJob (import tests/boot.nix { inherit system; }).bootUefiUsb);
|
||||
|
||||
|
||||
/* Build a bunch of typical closures so that Hydra can keep track of
|
||||
|
||||
@@ -30,17 +30,17 @@ let
|
||||
'';
|
||||
};
|
||||
in {
|
||||
biosCdrom = makeBootTest "bios-cdrom" ''
|
||||
bootBiosCdrom = makeBootTest "bios-cdrom" ''
|
||||
cdrom => glob("${iso}/iso/*.iso")
|
||||
'';
|
||||
biosUsb = makeBootTest "bios-usb" ''
|
||||
bootBiosUsb = makeBootTest "bios-usb" ''
|
||||
usb => glob("${iso}/iso/*.iso")
|
||||
'';
|
||||
uefiCdrom = makeBootTest "uefi-cdrom" ''
|
||||
bootUefiCdrom = makeBootTest "uefi-cdrom" ''
|
||||
cdrom => glob("${iso}/iso/*.iso"),
|
||||
bios => '${pkgs.OVMF}/FV/OVMF.fd'
|
||||
'';
|
||||
uefiUsb = makeBootTest "uefi-usb" ''
|
||||
bootUefiUsb = makeBootTest "uefi-usb" ''
|
||||
usb => glob("${iso}/iso/*.iso"),
|
||||
bios => '${pkgs.OVMF}/FV/OVMF.fd'
|
||||
'';
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
{ system ? builtins.currentSystem }:
|
||||
|
||||
with import ../lib/testing.nix { inherit system; };
|
||||
with pkgs.lib;
|
||||
|
||||
mapAttrs (channel: chromiumPkg: makeTest rec {
|
||||
name = "chromium-${channel}";
|
||||
import ./make-test.nix (
|
||||
{ pkgs
|
||||
, channelMap ? {
|
||||
stable = pkgs.chromium;
|
||||
#beta = pkgs.chromiumBeta;
|
||||
#dev = pkgs.chromiumDev;
|
||||
}
|
||||
, ...
|
||||
}: rec {
|
||||
name = "chromium";
|
||||
meta = with pkgs.stdenv.lib.maintainers; {
|
||||
maintainers = [ aszlig ];
|
||||
};
|
||||
@@ -13,7 +16,6 @@ mapAttrs (channel: chromiumPkg: makeTest rec {
|
||||
|
||||
machine.imports = [ ./common/x11.nix ];
|
||||
machine.virtualisation.memorySize = 2047;
|
||||
machine.environment.systemPackages = [ chromiumPkg ];
|
||||
|
||||
startupHTML = pkgs.writeText "chromium-startup.html" ''
|
||||
<!DOCTYPE html>
|
||||
@@ -103,65 +105,74 @@ mapAttrs (channel: chromiumPkg: makeTest rec {
|
||||
closeWin;
|
||||
}
|
||||
|
||||
$machine->waitForX;
|
||||
sub chromiumTest {
|
||||
my ($channel, $pkg, $code) = @_;
|
||||
$machine->waitForX;
|
||||
|
||||
my $url = "file://${startupHTML}";
|
||||
my $args = "--user-data-dir=/tmp/chromium-${channel}";
|
||||
$machine->execute(
|
||||
"ulimit -c unlimited; ".
|
||||
"chromium $args \"$url\" & disown"
|
||||
);
|
||||
$machine->waitForText(qr/Type to search or enter a URL to navigate/);
|
||||
$machine->waitUntilSucceeds("${xdo "check-startup" ''
|
||||
search --sync --onlyvisible --name "startup done"
|
||||
# close first start help popup
|
||||
key -delay 1000 Escape
|
||||
windowfocus --sync
|
||||
windowactivate --sync
|
||||
''}");
|
||||
|
||||
createAndWaitForNewWin;
|
||||
$machine->screenshot("empty_windows");
|
||||
closeWin;
|
||||
|
||||
$machine->screenshot("startup_done");
|
||||
|
||||
testNewWin "check sandbox", sub {
|
||||
$machine->succeed("${xdo "type-url" ''
|
||||
search --sync --onlyvisible --name "new tab"
|
||||
my $url = "file://${startupHTML}";
|
||||
my $args = "--user-data-dir=/tmp/chromium-$channel";
|
||||
$machine->execute(
|
||||
"ulimit -c unlimited; ".
|
||||
"$pkg/bin/chromium $args \"$url\" & disown"
|
||||
);
|
||||
$machine->waitForText(qr/Type to search or enter a URL to navigate/);
|
||||
$machine->waitUntilSucceeds("${xdo "check-startup" ''
|
||||
search --sync --onlyvisible --name "startup done"
|
||||
# close first start help popup
|
||||
key -delay 1000 Escape
|
||||
windowfocus --sync
|
||||
type --delay 1000 "chrome://sandbox"
|
||||
windowactivate --sync
|
||||
''}");
|
||||
|
||||
$machine->succeed("${xdo "submit-url" ''
|
||||
search --sync --onlyvisible --name "new tab"
|
||||
windowfocus --sync
|
||||
key --delay 1000 Return
|
||||
''}");
|
||||
createAndWaitForNewWin;
|
||||
$machine->screenshot($channel."_emptywin");
|
||||
closeWin;
|
||||
|
||||
$machine->screenshot("sandbox_info");
|
||||
$machine->screenshot($channel."_startup_done");
|
||||
|
||||
$machine->succeed("${xdo "submit-url" ''
|
||||
search --sync --onlyvisible --name "sandbox status"
|
||||
windowfocus --sync
|
||||
''}");
|
||||
$machine->succeed("${xdo "submit-url" ''
|
||||
key --delay 1000 Ctrl+a Ctrl+c
|
||||
''}");
|
||||
subtest("Chromium $channel", $code);
|
||||
|
||||
my $clipboard = $machine->succeed("${pkgs.xclip}/bin/xclip -o");
|
||||
die "sandbox not working properly: $clipboard"
|
||||
unless $clipboard =~ /namespace sandbox.*yes/mi
|
||||
&& $clipboard =~ /pid namespaces.*yes/mi
|
||||
&& $clipboard =~ /network namespaces.*yes/mi
|
||||
&& $clipboard =~ /seccomp.*sandbox.*yes/mi
|
||||
&& $clipboard =~ /you are adequately sandboxed/mi;
|
||||
};
|
||||
$machine->shutdown;
|
||||
}
|
||||
|
||||
$machine->shutdown;
|
||||
for (${let
|
||||
mkArray = name: pkg: "[\"${name}\", \"${pkg}\"]";
|
||||
chanArrays = pkgs.lib.mapAttrsToList mkArray channelMap;
|
||||
in pkgs.lib.concatStringsSep ", " chanArrays}) {
|
||||
my ($channel, $pkg) = @$_;
|
||||
chromiumTest $channel, $pkg, sub {
|
||||
testNewWin "check sandbox", sub {
|
||||
$machine->succeed("${xdo "type-url" ''
|
||||
search --sync --onlyvisible --name "new tab"
|
||||
windowfocus --sync
|
||||
type --delay 1000 "chrome://sandbox"
|
||||
''}");
|
||||
|
||||
$machine->succeed("${xdo "submit-url" ''
|
||||
search --sync --onlyvisible --name "new tab"
|
||||
windowfocus --sync
|
||||
key --delay 1000 Return
|
||||
''}");
|
||||
|
||||
$machine->screenshot($channel."_sandbox");
|
||||
|
||||
$machine->succeed("${xdo "submit-url" ''
|
||||
search --sync --onlyvisible --name "sandbox status"
|
||||
windowfocus --sync
|
||||
''}");
|
||||
$machine->succeed("${xdo "submit-url" ''
|
||||
key --delay 1000 Ctrl+a Ctrl+c
|
||||
''}");
|
||||
|
||||
my $clipboard = $machine->succeed("${pkgs.xclip}/bin/xclip -o");
|
||||
die "sandbox not working properly: $clipboard"
|
||||
unless $clipboard =~ /namespace sandbox.*yes/mi
|
||||
&& $clipboard =~ /pid namespaces.*yes/mi
|
||||
&& $clipboard =~ /network namespaces.*yes/mi
|
||||
&& $clipboard =~ /seccomp.*sandbox.*yes/mi
|
||||
&& $clipboard =~ /you are adequately sandboxed/mi;
|
||||
};
|
||||
};
|
||||
}
|
||||
'';
|
||||
}) {
|
||||
stable = pkgs.chromium;
|
||||
beta = pkgs.chromiumBeta;
|
||||
dev = pkgs.chromiumDev;
|
||||
}
|
||||
})
|
||||
|
||||
@@ -1,411 +1,406 @@
|
||||
{ system ? builtins.currentSystem, networkd }:
|
||||
|
||||
with import ../lib/testing.nix { inherit system; };
|
||||
with pkgs.lib;
|
||||
|
||||
let
|
||||
router = { config, pkgs, ... }:
|
||||
with pkgs.lib;
|
||||
let
|
||||
vlanIfs = range 1 (length config.virtualisation.vlans);
|
||||
in {
|
||||
virtualisation.vlans = [ 1 2 3 ];
|
||||
networking = {
|
||||
useDHCP = false;
|
||||
useNetworkd = networkd;
|
||||
firewall.allowPing = true;
|
||||
interfaces = mkOverride 0 (listToAttrs (flip map vlanIfs (n:
|
||||
nameValuePair "eth${toString n}" {
|
||||
ipAddress = "192.168.${toString n}.1";
|
||||
prefixLength = 24;
|
||||
})));
|
||||
};
|
||||
services.dhcpd = {
|
||||
enable = true;
|
||||
interfaces = map (n: "eth${toString n}") vlanIfs;
|
||||
extraConfig = ''
|
||||
option subnet-mask 255.255.255.0;
|
||||
'' + flip concatMapStrings vlanIfs (n: ''
|
||||
subnet 192.168.${toString n}.0 netmask 255.255.255.0 {
|
||||
option broadcast-address 192.168.${toString n}.255;
|
||||
option routers 192.168.${toString n}.1;
|
||||
range 192.168.${toString n}.2 192.168.${toString n}.254;
|
||||
}
|
||||
'');
|
||||
};
|
||||
};
|
||||
|
||||
testCases = {
|
||||
loopback = {
|
||||
name = "Loopback";
|
||||
machine.networking.useNetworkd = networkd;
|
||||
testScript = ''
|
||||
startAll;
|
||||
$machine->waitForUnit("network-interfaces.target");
|
||||
$machine->waitForUnit("network.target");
|
||||
$machine->succeed("ip addr show lo | grep -q 'inet 127.0.0.1/8 '");
|
||||
$machine->succeed("ip addr show lo | grep -q 'inet6 ::1/128 '");
|
||||
'';
|
||||
};
|
||||
static = {
|
||||
name = "Static";
|
||||
nodes.router = router;
|
||||
nodes.client = { config, pkgs, ... }: with pkgs.lib; {
|
||||
virtualisation.vlans = [ 1 2 ];
|
||||
import ./make-test.nix ({ pkgs, networkd, test, ... }:
|
||||
let
|
||||
router = { config, pkgs, ... }:
|
||||
with pkgs.lib;
|
||||
let
|
||||
vlanIfs = range 1 (length config.virtualisation.vlans);
|
||||
in {
|
||||
virtualisation.vlans = [ 1 2 3 ];
|
||||
networking = {
|
||||
useDHCP = false;
|
||||
useNetworkd = networkd;
|
||||
firewall.allowPing = true;
|
||||
useDHCP = false;
|
||||
defaultGateway = "192.168.1.1";
|
||||
interfaces.eth1.ip4 = mkOverride 0 [
|
||||
{ address = "192.168.1.2"; prefixLength = 24; }
|
||||
{ address = "192.168.1.3"; prefixLength = 32; }
|
||||
{ address = "192.168.1.10"; prefixLength = 32; }
|
||||
];
|
||||
interfaces.eth2.ip4 = mkOverride 0 [
|
||||
{ address = "192.168.2.2"; prefixLength = 24; }
|
||||
];
|
||||
interfaces = mkOverride 0 (listToAttrs (flip map vlanIfs (n:
|
||||
nameValuePair "eth${toString n}" {
|
||||
ipAddress = "192.168.${toString n}.1";
|
||||
prefixLength = 24;
|
||||
})));
|
||||
};
|
||||
services.dhcpd = {
|
||||
enable = true;
|
||||
interfaces = map (n: "eth${toString n}") vlanIfs;
|
||||
extraConfig = ''
|
||||
option subnet-mask 255.255.255.0;
|
||||
'' + flip concatMapStrings vlanIfs (n: ''
|
||||
subnet 192.168.${toString n}.0 netmask 255.255.255.0 {
|
||||
option broadcast-address 192.168.${toString n}.255;
|
||||
option routers 192.168.${toString n}.1;
|
||||
range 192.168.${toString n}.2 192.168.${toString n}.254;
|
||||
}
|
||||
'');
|
||||
};
|
||||
};
|
||||
testScript = { nodes, ... }:
|
||||
''
|
||||
testCases = {
|
||||
loopback = {
|
||||
name = "Loopback";
|
||||
machine.networking.useNetworkd = networkd;
|
||||
testScript = ''
|
||||
startAll;
|
||||
|
||||
$client->waitForUnit("network-interfaces.target");
|
||||
$client->waitForUnit("network.target");
|
||||
$router->waitForUnit("network-interfaces.target");
|
||||
$router->waitForUnit("network.target");
|
||||
|
||||
# Make sure dhcpcd is not started
|
||||
$client->fail("systemctl status dhcpcd.service");
|
||||
|
||||
# Test vlan 1
|
||||
$client->waitUntilSucceeds("ping -c 1 192.168.1.1");
|
||||
$client->waitUntilSucceeds("ping -c 1 192.168.1.2");
|
||||
$client->waitUntilSucceeds("ping -c 1 192.168.1.3");
|
||||
$client->waitUntilSucceeds("ping -c 1 192.168.1.10");
|
||||
|
||||
$router->waitUntilSucceeds("ping -c 1 192.168.1.1");
|
||||
$router->waitUntilSucceeds("ping -c 1 192.168.1.2");
|
||||
$router->waitUntilSucceeds("ping -c 1 192.168.1.3");
|
||||
$router->waitUntilSucceeds("ping -c 1 192.168.1.10");
|
||||
|
||||
# Test vlan 2
|
||||
$client->waitUntilSucceeds("ping -c 1 192.168.2.1");
|
||||
$client->waitUntilSucceeds("ping -c 1 192.168.2.2");
|
||||
|
||||
$router->waitUntilSucceeds("ping -c 1 192.168.2.1");
|
||||
$router->waitUntilSucceeds("ping -c 1 192.168.2.2");
|
||||
|
||||
# Test default gateway
|
||||
$router->waitUntilSucceeds("ping -c 1 192.168.3.1");
|
||||
$client->waitUntilSucceeds("ping -c 1 192.168.3.1");
|
||||
$machine->waitForUnit("network-interfaces.target");
|
||||
$machine->waitForUnit("network.target");
|
||||
$machine->succeed("ip addr show lo | grep -q 'inet 127.0.0.1/8 '");
|
||||
$machine->succeed("ip addr show lo | grep -q 'inet6 ::1/128 '");
|
||||
'';
|
||||
};
|
||||
dhcpSimple = {
|
||||
name = "SimpleDHCP";
|
||||
nodes.router = router;
|
||||
nodes.client = { config, pkgs, ... }: with pkgs.lib; {
|
||||
virtualisation.vlans = [ 1 2 ];
|
||||
networking = {
|
||||
useNetworkd = networkd;
|
||||
firewall.allowPing = true;
|
||||
useDHCP = true;
|
||||
interfaces.eth1.ip4 = mkOverride 0 [ ];
|
||||
interfaces.eth2.ip4 = mkOverride 0 [ ];
|
||||
};
|
||||
};
|
||||
testScript = { nodes, ... }:
|
||||
''
|
||||
startAll;
|
||||
static = {
|
||||
name = "Static";
|
||||
nodes.router = router;
|
||||
nodes.client = { config, pkgs, ... }: with pkgs.lib; {
|
||||
virtualisation.vlans = [ 1 2 ];
|
||||
networking = {
|
||||
useNetworkd = networkd;
|
||||
firewall.allowPing = true;
|
||||
useDHCP = false;
|
||||
defaultGateway = "192.168.1.1";
|
||||
interfaces.eth1.ip4 = mkOverride 0 [
|
||||
{ address = "192.168.1.2"; prefixLength = 24; }
|
||||
{ address = "192.168.1.3"; prefixLength = 32; }
|
||||
{ address = "192.168.1.10"; prefixLength = 32; }
|
||||
];
|
||||
interfaces.eth2.ip4 = mkOverride 0 [
|
||||
{ address = "192.168.2.2"; prefixLength = 24; }
|
||||
];
|
||||
};
|
||||
};
|
||||
testScript = { nodes, ... }:
|
||||
''
|
||||
startAll;
|
||||
|
||||
$client->waitForUnit("network-interfaces.target");
|
||||
$client->waitForUnit("network.target");
|
||||
$router->waitForUnit("network-interfaces.target");
|
||||
$router->waitForUnit("network.target");
|
||||
$client->waitForUnit("network-interfaces.target");
|
||||
$client->waitForUnit("network.target");
|
||||
$router->waitForUnit("network-interfaces.target");
|
||||
$router->waitForUnit("network.target");
|
||||
|
||||
# Wait until we have an ip address on each interface
|
||||
$client->waitUntilSucceeds("ip addr show dev eth1 | grep -q '192.168.1'");
|
||||
$client->waitUntilSucceeds("ip addr show dev eth2 | grep -q '192.168.2'");
|
||||
# Make sure dhcpcd is not started
|
||||
$client->fail("systemctl status dhcpcd.service");
|
||||
|
||||
# Test vlan 1
|
||||
$client->waitUntilSucceeds("ping -c 1 192.168.1.1");
|
||||
$client->waitUntilSucceeds("ping -c 1 192.168.1.2");
|
||||
# Test vlan 1
|
||||
$client->waitUntilSucceeds("ping -c 1 192.168.1.1");
|
||||
$client->waitUntilSucceeds("ping -c 1 192.168.1.2");
|
||||
$client->waitUntilSucceeds("ping -c 1 192.168.1.3");
|
||||
$client->waitUntilSucceeds("ping -c 1 192.168.1.10");
|
||||
|
||||
$router->waitUntilSucceeds("ping -c 1 192.168.1.1");
|
||||
$router->waitUntilSucceeds("ping -c 1 192.168.1.2");
|
||||
$router->waitUntilSucceeds("ping -c 1 192.168.1.1");
|
||||
$router->waitUntilSucceeds("ping -c 1 192.168.1.2");
|
||||
$router->waitUntilSucceeds("ping -c 1 192.168.1.3");
|
||||
$router->waitUntilSucceeds("ping -c 1 192.168.1.10");
|
||||
|
||||
# Test vlan 2
|
||||
$client->waitUntilSucceeds("ping -c 1 192.168.2.1");
|
||||
$client->waitUntilSucceeds("ping -c 1 192.168.2.2");
|
||||
# Test vlan 2
|
||||
$client->waitUntilSucceeds("ping -c 1 192.168.2.1");
|
||||
$client->waitUntilSucceeds("ping -c 1 192.168.2.2");
|
||||
|
||||
$router->waitUntilSucceeds("ping -c 1 192.168.2.1");
|
||||
$router->waitUntilSucceeds("ping -c 1 192.168.2.2");
|
||||
'';
|
||||
};
|
||||
dhcpOneIf = {
|
||||
name = "OneInterfaceDHCP";
|
||||
nodes.router = router;
|
||||
nodes.client = { config, pkgs, ... }: with pkgs.lib; {
|
||||
virtualisation.vlans = [ 1 2 ];
|
||||
networking = {
|
||||
useNetworkd = networkd;
|
||||
firewall.allowPing = true;
|
||||
useDHCP = false;
|
||||
interfaces.eth1 = {
|
||||
ip4 = mkOverride 0 [ ];
|
||||
$router->waitUntilSucceeds("ping -c 1 192.168.2.1");
|
||||
$router->waitUntilSucceeds("ping -c 1 192.168.2.2");
|
||||
|
||||
# Test default gateway
|
||||
$router->waitUntilSucceeds("ping -c 1 192.168.3.1");
|
||||
$client->waitUntilSucceeds("ping -c 1 192.168.3.1");
|
||||
'';
|
||||
};
|
||||
dhcpSimple = {
|
||||
name = "SimpleDHCP";
|
||||
nodes.router = router;
|
||||
nodes.client = { config, pkgs, ... }: with pkgs.lib; {
|
||||
virtualisation.vlans = [ 1 2 ];
|
||||
networking = {
|
||||
useNetworkd = networkd;
|
||||
firewall.allowPing = true;
|
||||
useDHCP = true;
|
||||
interfaces.eth1.ip4 = mkOverride 0 [ ];
|
||||
interfaces.eth2.ip4 = mkOverride 0 [ ];
|
||||
};
|
||||
interfaces.eth2.ip4 = mkOverride 0 [ ];
|
||||
};
|
||||
testScript = { nodes, ... }:
|
||||
''
|
||||
startAll;
|
||||
|
||||
$client->waitForUnit("network-interfaces.target");
|
||||
$client->waitForUnit("network.target");
|
||||
$router->waitForUnit("network-interfaces.target");
|
||||
$router->waitForUnit("network.target");
|
||||
|
||||
# Wait until we have an ip address on each interface
|
||||
$client->waitUntilSucceeds("ip addr show dev eth1 | grep -q '192.168.1'");
|
||||
$client->waitUntilSucceeds("ip addr show dev eth2 | grep -q '192.168.2'");
|
||||
|
||||
# Test vlan 1
|
||||
$client->waitUntilSucceeds("ping -c 1 192.168.1.1");
|
||||
$client->waitUntilSucceeds("ping -c 1 192.168.1.2");
|
||||
|
||||
$router->waitUntilSucceeds("ping -c 1 192.168.1.1");
|
||||
$router->waitUntilSucceeds("ping -c 1 192.168.1.2");
|
||||
|
||||
# Test vlan 2
|
||||
$client->waitUntilSucceeds("ping -c 1 192.168.2.1");
|
||||
$client->waitUntilSucceeds("ping -c 1 192.168.2.2");
|
||||
|
||||
$router->waitUntilSucceeds("ping -c 1 192.168.2.1");
|
||||
$router->waitUntilSucceeds("ping -c 1 192.168.2.2");
|
||||
'';
|
||||
};
|
||||
testScript = { nodes, ... }:
|
||||
''
|
||||
startAll;
|
||||
|
||||
# Wait for networking to come up
|
||||
$client->waitForUnit("network-interfaces.target");
|
||||
$client->waitForUnit("network.target");
|
||||
$router->waitForUnit("network-interfaces.target");
|
||||
$router->waitForUnit("network.target");
|
||||
|
||||
# Wait until we have an ip address on each interface
|
||||
$client->waitUntilSucceeds("ip addr show dev eth1 | grep -q '192.168.1'");
|
||||
|
||||
# Test vlan 1
|
||||
$client->waitUntilSucceeds("ping -c 1 192.168.1.1");
|
||||
$client->waitUntilSucceeds("ping -c 1 192.168.1.2");
|
||||
|
||||
$router->waitUntilSucceeds("ping -c 1 192.168.1.1");
|
||||
$router->waitUntilSucceeds("ping -c 1 192.168.1.2");
|
||||
|
||||
# Test vlan 2
|
||||
$client->waitUntilSucceeds("ping -c 1 192.168.2.1");
|
||||
$client->fail("ping -c 1 192.168.2.2");
|
||||
|
||||
$router->waitUntilSucceeds("ping -c 1 192.168.2.1");
|
||||
$router->fail("ping -c 1 192.168.2.2");
|
||||
'';
|
||||
};
|
||||
bond = let
|
||||
node = address: { config, pkgs, ... }: with pkgs.lib; {
|
||||
virtualisation.vlans = [ 1 2 ];
|
||||
networking = {
|
||||
useNetworkd = networkd;
|
||||
firewall.allowPing = true;
|
||||
useDHCP = false;
|
||||
bonds.bond = {
|
||||
mode = "balance-rr";
|
||||
interfaces = [ "eth1" "eth2" ];
|
||||
dhcpOneIf = {
|
||||
name = "OneInterfaceDHCP";
|
||||
nodes.router = router;
|
||||
nodes.client = { config, pkgs, ... }: with pkgs.lib; {
|
||||
virtualisation.vlans = [ 1 2 ];
|
||||
networking = {
|
||||
useNetworkd = networkd;
|
||||
firewall.allowPing = true;
|
||||
useDHCP = false;
|
||||
interfaces.eth1 = {
|
||||
ip4 = mkOverride 0 [ ];
|
||||
useDHCP = true;
|
||||
};
|
||||
interfaces.eth2.ip4 = mkOverride 0 [ ];
|
||||
};
|
||||
interfaces.eth1.ip4 = mkOverride 0 [ ];
|
||||
interfaces.eth2.ip4 = mkOverride 0 [ ];
|
||||
interfaces.bond.ip4 = mkOverride 0
|
||||
[ { inherit address; prefixLength = 30; } ];
|
||||
};
|
||||
testScript = { nodes, ... }:
|
||||
''
|
||||
startAll;
|
||||
|
||||
# Wait for networking to come up
|
||||
$client->waitForUnit("network-interfaces.target");
|
||||
$client->waitForUnit("network.target");
|
||||
$router->waitForUnit("network-interfaces.target");
|
||||
$router->waitForUnit("network.target");
|
||||
|
||||
# Wait until we have an ip address on each interface
|
||||
$client->waitUntilSucceeds("ip addr show dev eth1 | grep -q '192.168.1'");
|
||||
|
||||
# Test vlan 1
|
||||
$client->waitUntilSucceeds("ping -c 1 192.168.1.1");
|
||||
$client->waitUntilSucceeds("ping -c 1 192.168.1.2");
|
||||
|
||||
$router->waitUntilSucceeds("ping -c 1 192.168.1.1");
|
||||
$router->waitUntilSucceeds("ping -c 1 192.168.1.2");
|
||||
|
||||
# Test vlan 2
|
||||
$client->waitUntilSucceeds("ping -c 1 192.168.2.1");
|
||||
$client->fail("ping -c 1 192.168.2.2");
|
||||
|
||||
$router->waitUntilSucceeds("ping -c 1 192.168.2.1");
|
||||
$router->fail("ping -c 1 192.168.2.2");
|
||||
'';
|
||||
};
|
||||
in {
|
||||
name = "Bond";
|
||||
nodes.client1 = node "192.168.1.1";
|
||||
nodes.client2 = node "192.168.1.2";
|
||||
testScript = { nodes, ... }:
|
||||
''
|
||||
startAll;
|
||||
|
||||
# Wait for networking to come up
|
||||
$client1->waitForUnit("network-interfaces.target");
|
||||
$client1->waitForUnit("network.target");
|
||||
$client2->waitForUnit("network-interfaces.target");
|
||||
$client2->waitForUnit("network.target");
|
||||
|
||||
# Test bonding
|
||||
$client1->waitUntilSucceeds("ping -c 2 192.168.1.1");
|
||||
$client1->waitUntilSucceeds("ping -c 2 192.168.1.2");
|
||||
|
||||
$client2->waitUntilSucceeds("ping -c 2 192.168.1.1");
|
||||
$client2->waitUntilSucceeds("ping -c 2 192.168.1.2");
|
||||
'';
|
||||
};
|
||||
bridge = let
|
||||
node = { address, vlan }: { config, pkgs, ... }: with pkgs.lib; {
|
||||
virtualisation.vlans = [ vlan ];
|
||||
networking = {
|
||||
useNetworkd = networkd;
|
||||
firewall.allowPing = true;
|
||||
useDHCP = false;
|
||||
interfaces.eth1.ip4 = mkOverride 0
|
||||
[ { inherit address; prefixLength = 24; } ];
|
||||
};
|
||||
};
|
||||
in {
|
||||
name = "Bridge";
|
||||
nodes.client1 = node { address = "192.168.1.2"; vlan = 1; };
|
||||
nodes.client2 = node { address = "192.168.1.3"; vlan = 2; };
|
||||
nodes.router = { config, pkgs, ... }: with pkgs.lib; {
|
||||
virtualisation.vlans = [ 1 2 ];
|
||||
networking = {
|
||||
useNetworkd = networkd;
|
||||
firewall.allowPing = true;
|
||||
useDHCP = false;
|
||||
bridges.bridge.interfaces = [ "eth1" "eth2" ];
|
||||
interfaces.eth1.ip4 = mkOverride 0 [ ];
|
||||
interfaces.eth2.ip4 = mkOverride 0 [ ];
|
||||
interfaces.bridge.ip4 = mkOverride 0
|
||||
[ { address = "192.168.1.1"; prefixLength = 24; } ];
|
||||
};
|
||||
};
|
||||
testScript = { nodes, ... }:
|
||||
''
|
||||
startAll;
|
||||
|
||||
# Wait for networking to come up
|
||||
$client1->waitForUnit("network-interfaces.target");
|
||||
$client1->waitForUnit("network.target");
|
||||
$client2->waitForUnit("network-interfaces.target");
|
||||
$client2->waitForUnit("network.target");
|
||||
$router->waitForUnit("network-interfaces.target");
|
||||
$router->waitForUnit("network.target");
|
||||
|
||||
# Test bridging
|
||||
$client1->waitUntilSucceeds("ping -c 1 192.168.1.1");
|
||||
$client1->waitUntilSucceeds("ping -c 1 192.168.1.2");
|
||||
$client1->waitUntilSucceeds("ping -c 1 192.168.1.3");
|
||||
|
||||
$client2->waitUntilSucceeds("ping -c 1 192.168.1.1");
|
||||
$client2->waitUntilSucceeds("ping -c 1 192.168.1.2");
|
||||
$client2->waitUntilSucceeds("ping -c 1 192.168.1.3");
|
||||
|
||||
$router->waitUntilSucceeds("ping -c 1 192.168.1.1");
|
||||
$router->waitUntilSucceeds("ping -c 1 192.168.1.2");
|
||||
$router->waitUntilSucceeds("ping -c 1 192.168.1.3");
|
||||
'';
|
||||
};
|
||||
macvlan = {
|
||||
name = "MACVLAN";
|
||||
nodes.router = router;
|
||||
nodes.client = { config, pkgs, ... }: with pkgs.lib; {
|
||||
virtualisation.vlans = [ 1 ];
|
||||
networking = {
|
||||
useNetworkd = networkd;
|
||||
firewall.allowPing = true;
|
||||
useDHCP = true;
|
||||
macvlans.macvlan.interface = "eth1";
|
||||
interfaces.eth1.ip4 = mkOverride 0 [ ];
|
||||
};
|
||||
};
|
||||
testScript = { nodes, ... }:
|
||||
''
|
||||
startAll;
|
||||
|
||||
# Wait for networking to come up
|
||||
$client->waitForUnit("network-interfaces.target");
|
||||
$client->waitForUnit("network.target");
|
||||
$router->waitForUnit("network-interfaces.target");
|
||||
$router->waitForUnit("network.target");
|
||||
|
||||
# Wait until we have an ip address on each interface
|
||||
$client->waitUntilSucceeds("ip addr show dev eth1 | grep -q '192.168.1'");
|
||||
$client->waitUntilSucceeds("ip addr show dev macvlan | grep -q '192.168.1'");
|
||||
|
||||
# Print diagnosting information
|
||||
$router->succeed("ip addr >&2");
|
||||
$client->succeed("ip addr >&2");
|
||||
|
||||
# Test macvlan creates routable ips
|
||||
$client->waitUntilSucceeds("ping -c 1 192.168.1.1");
|
||||
$client->waitUntilSucceeds("ping -c 1 192.168.1.2");
|
||||
$client->waitUntilSucceeds("ping -c 1 192.168.1.3");
|
||||
|
||||
$router->waitUntilSucceeds("ping -c 1 192.168.1.1");
|
||||
$router->waitUntilSucceeds("ping -c 1 192.168.1.2");
|
||||
$router->waitUntilSucceeds("ping -c 1 192.168.1.3");
|
||||
'';
|
||||
};
|
||||
sit = let
|
||||
node = { address4, remote, address6 }: { config, pkgs, ... }: with pkgs.lib; {
|
||||
virtualisation.vlans = [ 1 ];
|
||||
networking = {
|
||||
useNetworkd = networkd;
|
||||
firewall.enable = false;
|
||||
useDHCP = false;
|
||||
sits.sit = {
|
||||
inherit remote;
|
||||
local = address4;
|
||||
dev = "eth1";
|
||||
bond = let
|
||||
node = address: { config, pkgs, ... }: with pkgs.lib; {
|
||||
virtualisation.vlans = [ 1 2 ];
|
||||
networking = {
|
||||
useNetworkd = networkd;
|
||||
firewall.allowPing = true;
|
||||
useDHCP = false;
|
||||
bonds.bond = {
|
||||
mode = "balance-rr";
|
||||
interfaces = [ "eth1" "eth2" ];
|
||||
};
|
||||
interfaces.eth1.ip4 = mkOverride 0 [ ];
|
||||
interfaces.eth2.ip4 = mkOverride 0 [ ];
|
||||
interfaces.bond.ip4 = mkOverride 0
|
||||
[ { inherit address; prefixLength = 30; } ];
|
||||
};
|
||||
interfaces.eth1.ip4 = mkOverride 0
|
||||
[ { address = address4; prefixLength = 24; } ];
|
||||
interfaces.sit.ip6 = mkOverride 0
|
||||
[ { address = address6; prefixLength = 64; } ];
|
||||
};
|
||||
in {
|
||||
name = "Bond";
|
||||
nodes.client1 = node "192.168.1.1";
|
||||
nodes.client2 = node "192.168.1.2";
|
||||
testScript = { nodes, ... }:
|
||||
''
|
||||
startAll;
|
||||
|
||||
# Wait for networking to come up
|
||||
$client1->waitForUnit("network-interfaces.target");
|
||||
$client1->waitForUnit("network.target");
|
||||
$client2->waitForUnit("network-interfaces.target");
|
||||
$client2->waitForUnit("network.target");
|
||||
|
||||
# Test bonding
|
||||
$client1->waitUntilSucceeds("ping -c 2 192.168.1.1");
|
||||
$client1->waitUntilSucceeds("ping -c 2 192.168.1.2");
|
||||
|
||||
$client2->waitUntilSucceeds("ping -c 2 192.168.1.1");
|
||||
$client2->waitUntilSucceeds("ping -c 2 192.168.1.2");
|
||||
'';
|
||||
};
|
||||
in {
|
||||
name = "Sit";
|
||||
nodes.client1 = node { address4 = "192.168.1.1"; remote = "192.168.1.2"; address6 = "fc00::1"; };
|
||||
nodes.client2 = node { address4 = "192.168.1.2"; remote = "192.168.1.1"; address6 = "fc00::2"; };
|
||||
testScript = { nodes, ... }:
|
||||
''
|
||||
startAll;
|
||||
|
||||
# Wait for networking to be configured
|
||||
$client1->waitForUnit("network-interfaces.target");
|
||||
$client1->waitForUnit("network.target");
|
||||
$client2->waitForUnit("network-interfaces.target");
|
||||
$client2->waitForUnit("network.target");
|
||||
|
||||
# Print diagnostic information
|
||||
$client1->succeed("ip addr >&2");
|
||||
$client2->succeed("ip addr >&2");
|
||||
|
||||
# Test ipv6
|
||||
$client1->waitUntilSucceeds("ping6 -c 1 fc00::1");
|
||||
$client1->waitUntilSucceeds("ping6 -c 1 fc00::2");
|
||||
|
||||
$client2->waitUntilSucceeds("ping6 -c 1 fc00::1");
|
||||
$client2->waitUntilSucceeds("ping6 -c 1 fc00::2");
|
||||
'';
|
||||
};
|
||||
vlan = let
|
||||
node = address: { config, pkgs, ... }: with pkgs.lib; {
|
||||
#virtualisation.vlans = [ 1 ];
|
||||
networking = {
|
||||
useNetworkd = networkd;
|
||||
firewall.allowPing = true;
|
||||
useDHCP = false;
|
||||
vlans.vlan = {
|
||||
id = 1;
|
||||
interface = "eth0";
|
||||
bridge = let
|
||||
node = { address, vlan }: { config, pkgs, ... }: with pkgs.lib; {
|
||||
virtualisation.vlans = [ vlan ];
|
||||
networking = {
|
||||
useNetworkd = networkd;
|
||||
firewall.allowPing = true;
|
||||
useDHCP = false;
|
||||
interfaces.eth1.ip4 = mkOverride 0
|
||||
[ { inherit address; prefixLength = 24; } ];
|
||||
};
|
||||
interfaces.eth0.ip4 = mkOverride 0 [ ];
|
||||
interfaces.eth1.ip4 = mkOverride 0 [ ];
|
||||
interfaces.vlan.ip4 = mkOverride 0
|
||||
[ { inherit address; prefixLength = 24; } ];
|
||||
};
|
||||
in {
|
||||
name = "Bridge";
|
||||
nodes.client1 = node { address = "192.168.1.2"; vlan = 1; };
|
||||
nodes.client2 = node { address = "192.168.1.3"; vlan = 2; };
|
||||
nodes.router = { config, pkgs, ... }: with pkgs.lib; {
|
||||
virtualisation.vlans = [ 1 2 ];
|
||||
networking = {
|
||||
useNetworkd = networkd;
|
||||
firewall.allowPing = true;
|
||||
useDHCP = false;
|
||||
bridges.bridge.interfaces = [ "eth1" "eth2" ];
|
||||
interfaces.eth1.ip4 = mkOverride 0 [ ];
|
||||
interfaces.eth2.ip4 = mkOverride 0 [ ];
|
||||
interfaces.bridge.ip4 = mkOverride 0
|
||||
[ { address = "192.168.1.1"; prefixLength = 24; } ];
|
||||
};
|
||||
};
|
||||
testScript = { nodes, ... }:
|
||||
''
|
||||
startAll;
|
||||
|
||||
# Wait for networking to come up
|
||||
$client1->waitForUnit("network-interfaces.target");
|
||||
$client1->waitForUnit("network.target");
|
||||
$client2->waitForUnit("network-interfaces.target");
|
||||
$client2->waitForUnit("network.target");
|
||||
$router->waitForUnit("network-interfaces.target");
|
||||
$router->waitForUnit("network.target");
|
||||
|
||||
# Test bridging
|
||||
$client1->waitUntilSucceeds("ping -c 1 192.168.1.1");
|
||||
$client1->waitUntilSucceeds("ping -c 1 192.168.1.2");
|
||||
$client1->waitUntilSucceeds("ping -c 1 192.168.1.3");
|
||||
|
||||
$client2->waitUntilSucceeds("ping -c 1 192.168.1.1");
|
||||
$client2->waitUntilSucceeds("ping -c 1 192.168.1.2");
|
||||
$client2->waitUntilSucceeds("ping -c 1 192.168.1.3");
|
||||
|
||||
$router->waitUntilSucceeds("ping -c 1 192.168.1.1");
|
||||
$router->waitUntilSucceeds("ping -c 1 192.168.1.2");
|
||||
$router->waitUntilSucceeds("ping -c 1 192.168.1.3");
|
||||
'';
|
||||
};
|
||||
in {
|
||||
name = "vlan";
|
||||
nodes.client1 = node "192.168.1.1";
|
||||
nodes.client2 = node "192.168.1.2";
|
||||
testScript = { nodes, ... }:
|
||||
''
|
||||
startAll;
|
||||
macvlan = {
|
||||
name = "MACVLAN";
|
||||
nodes.router = router;
|
||||
nodes.client = { config, pkgs, ... }: with pkgs.lib; {
|
||||
virtualisation.vlans = [ 1 ];
|
||||
networking = {
|
||||
useNetworkd = networkd;
|
||||
firewall.allowPing = true;
|
||||
useDHCP = true;
|
||||
macvlans.macvlan.interface = "eth1";
|
||||
interfaces.eth1.ip4 = mkOverride 0 [ ];
|
||||
};
|
||||
};
|
||||
testScript = { nodes, ... }:
|
||||
''
|
||||
startAll;
|
||||
|
||||
# Wait for networking to be configured
|
||||
$client1->waitForUnit("network-interfaces.target");
|
||||
$client1->waitForUnit("network.target");
|
||||
$client2->waitForUnit("network-interfaces.target");
|
||||
$client2->waitForUnit("network.target");
|
||||
# Wait for networking to come up
|
||||
$client->waitForUnit("network-interfaces.target");
|
||||
$client->waitForUnit("network.target");
|
||||
$router->waitForUnit("network-interfaces.target");
|
||||
$router->waitForUnit("network.target");
|
||||
|
||||
# Test vlan is setup
|
||||
$client1->succeed("ip addr show dev vlan >&2");
|
||||
$client2->succeed("ip addr show dev vlan >&2");
|
||||
'';
|
||||
# Wait until we have an ip address on each interface
|
||||
$client->waitUntilSucceeds("ip addr show dev eth1 | grep -q '192.168.1'");
|
||||
$client->waitUntilSucceeds("ip addr show dev macvlan | grep -q '192.168.1'");
|
||||
|
||||
# Print diagnosting information
|
||||
$router->succeed("ip addr >&2");
|
||||
$client->succeed("ip addr >&2");
|
||||
|
||||
# Test macvlan creates routable ips
|
||||
$client->waitUntilSucceeds("ping -c 1 192.168.1.1");
|
||||
$client->waitUntilSucceeds("ping -c 1 192.168.1.2");
|
||||
$client->waitUntilSucceeds("ping -c 1 192.168.1.3");
|
||||
|
||||
$router->waitUntilSucceeds("ping -c 1 192.168.1.1");
|
||||
$router->waitUntilSucceeds("ping -c 1 192.168.1.2");
|
||||
$router->waitUntilSucceeds("ping -c 1 192.168.1.3");
|
||||
'';
|
||||
};
|
||||
sit = let
|
||||
node = { address4, remote, address6 }: { config, pkgs, ... }: with pkgs.lib; {
|
||||
virtualisation.vlans = [ 1 ];
|
||||
networking = {
|
||||
useNetworkd = networkd;
|
||||
firewall.enable = false;
|
||||
useDHCP = false;
|
||||
sits.sit = {
|
||||
inherit remote;
|
||||
local = address4;
|
||||
dev = "eth1";
|
||||
};
|
||||
interfaces.eth1.ip4 = mkOverride 0
|
||||
[ { address = address4; prefixLength = 24; } ];
|
||||
interfaces.sit.ip6 = mkOverride 0
|
||||
[ { address = address6; prefixLength = 64; } ];
|
||||
};
|
||||
};
|
||||
in {
|
||||
name = "Sit";
|
||||
nodes.client1 = node { address4 = "192.168.1.1"; remote = "192.168.1.2"; address6 = "fc00::1"; };
|
||||
nodes.client2 = node { address4 = "192.168.1.2"; remote = "192.168.1.1"; address6 = "fc00::2"; };
|
||||
testScript = { nodes, ... }:
|
||||
''
|
||||
startAll;
|
||||
|
||||
# Wait for networking to be configured
|
||||
$client1->waitForUnit("network-interfaces.target");
|
||||
$client1->waitForUnit("network.target");
|
||||
$client2->waitForUnit("network-interfaces.target");
|
||||
$client2->waitForUnit("network.target");
|
||||
|
||||
# Print diagnostic information
|
||||
$client1->succeed("ip addr >&2");
|
||||
$client2->succeed("ip addr >&2");
|
||||
|
||||
# Test ipv6
|
||||
$client1->waitUntilSucceeds("ping6 -c 1 fc00::1");
|
||||
$client1->waitUntilSucceeds("ping6 -c 1 fc00::2");
|
||||
|
||||
$client2->waitUntilSucceeds("ping6 -c 1 fc00::1");
|
||||
$client2->waitUntilSucceeds("ping6 -c 1 fc00::2");
|
||||
'';
|
||||
};
|
||||
vlan = let
|
||||
node = address: { config, pkgs, ... }: with pkgs.lib; {
|
||||
#virtualisation.vlans = [ 1 ];
|
||||
networking = {
|
||||
useNetworkd = networkd;
|
||||
firewall.allowPing = true;
|
||||
useDHCP = false;
|
||||
vlans.vlan = {
|
||||
id = 1;
|
||||
interface = "eth0";
|
||||
};
|
||||
interfaces.eth0.ip4 = mkOverride 0 [ ];
|
||||
interfaces.eth1.ip4 = mkOverride 0 [ ];
|
||||
interfaces.vlan.ip4 = mkOverride 0
|
||||
[ { inherit address; prefixLength = 24; } ];
|
||||
};
|
||||
};
|
||||
in {
|
||||
name = "vlan";
|
||||
nodes.client1 = node "192.168.1.1";
|
||||
nodes.client2 = node "192.168.1.2";
|
||||
testScript = { nodes, ... }:
|
||||
''
|
||||
startAll;
|
||||
|
||||
# Wait for networking to be configured
|
||||
$client1->waitForUnit("network-interfaces.target");
|
||||
$client1->waitForUnit("network.target");
|
||||
$client2->waitForUnit("network-interfaces.target");
|
||||
$client2->waitForUnit("network.target");
|
||||
|
||||
# Test vlan is setup
|
||||
$client1->succeed("ip addr show dev vlan >&2");
|
||||
$client2->succeed("ip addr show dev vlan >&2");
|
||||
'';
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
in mapAttrs (const (attrs: makeTest (attrs // {
|
||||
name = "${attrs.name}-Networking-${if networkd then "Networkd" else "Scripted"}";
|
||||
meta = with pkgs.stdenv.lib.maintainers; {
|
||||
maintainers = [ wkennington ];
|
||||
};
|
||||
}))) testCases
|
||||
case = testCases.${test};
|
||||
in case // {
|
||||
name = "${case.name}-Networking-${if networkd then "Networkd" else "Scripted"}";
|
||||
meta = with pkgs.stdenv.lib.maintainers; {
|
||||
maintainers = [ wkennington ];
|
||||
};
|
||||
})
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
{ system ? builtins.currentSystem, debug ? false }:
|
||||
{ debug ? false, ... } @ args:
|
||||
|
||||
with import ../lib/testing.nix { inherit system; };
|
||||
with pkgs.lib;
|
||||
import ./make-test.nix ({ pkgs, ... }: with pkgs.lib; let
|
||||
|
||||
let
|
||||
testVMConfig = vmName: attrs: { config, pkgs, ... }: let
|
||||
guestAdditions = pkgs.linuxPackages.virtualboxGuestAdditions;
|
||||
|
||||
@@ -316,140 +314,138 @@ let
|
||||
test2.vmScript = dhcpScript;
|
||||
};
|
||||
|
||||
mkVBoxTest = name: testScript: makeTest {
|
||||
name = "virtualbox-${name}";
|
||||
|
||||
machine = { lib, config, ... }: {
|
||||
imports = let
|
||||
mkVMConf = name: val: val.machine // { key = "${name}-config"; };
|
||||
vmConfigs = mapAttrsToList mkVMConf vboxVMs;
|
||||
in [ ./common/user-account.nix ./common/x11.nix ] ++ vmConfigs;
|
||||
virtualisation.memorySize = 2048;
|
||||
virtualisation.virtualbox.host.enable = true;
|
||||
users.extraUsers.alice.extraGroups = let
|
||||
inherit (config.virtualisation.virtualbox.host) enableHardening;
|
||||
in lib.mkIf enableHardening (lib.singleton "vboxusers");
|
||||
};
|
||||
|
||||
testScript = ''
|
||||
sub ru ($) {
|
||||
my $esc = $_[0] =~ s/'/'\\${"'"}'/gr;
|
||||
return "su - alice -c '$esc'";
|
||||
}
|
||||
|
||||
sub vbm {
|
||||
$machine->succeed(ru("VBoxManage ".$_[0]));
|
||||
};
|
||||
|
||||
sub removeUUIDs {
|
||||
return join("\n", grep { $_ !~ /^UUID:/ } split(/\n/, $_[0]))."\n";
|
||||
}
|
||||
|
||||
${concatStrings (mapAttrsToList (_: getAttr "testSubs") vboxVMs)}
|
||||
|
||||
$machine->waitForX;
|
||||
|
||||
${mkLog "$HOME/.config/VirtualBox/VBoxSVC.log" "HOST-SVC"}
|
||||
|
||||
${testScript}
|
||||
'';
|
||||
|
||||
meta = with pkgs.stdenv.lib.maintainers; {
|
||||
maintainers = [ aszlig wkennington ];
|
||||
};
|
||||
in {
|
||||
name = "virtualbox";
|
||||
meta = with pkgs.stdenv.lib.maintainers; {
|
||||
maintainers = [ aszlig wkennington ];
|
||||
};
|
||||
|
||||
in mapAttrs mkVBoxTest {
|
||||
simple-gui = ''
|
||||
machine = { pkgs, lib, config, ... }: {
|
||||
imports = let
|
||||
mkVMConf = name: val: val.machine // { key = "${name}-config"; };
|
||||
vmConfigs = mapAttrsToList mkVMConf vboxVMs;
|
||||
in [ ./common/user-account.nix ./common/x11.nix ] ++ vmConfigs;
|
||||
virtualisation.memorySize = 2048;
|
||||
virtualisation.virtualbox.host.enable = true;
|
||||
users.extraUsers.alice.extraGroups = let
|
||||
inherit (config.virtualisation.virtualbox.host) enableHardening;
|
||||
in lib.mkIf enableHardening (lib.singleton "vboxusers");
|
||||
};
|
||||
|
||||
testScript = ''
|
||||
sub ru ($) {
|
||||
my $esc = $_[0] =~ s/'/'\\${"'"}'/gr;
|
||||
return "su - alice -c '$esc'";
|
||||
}
|
||||
|
||||
sub vbm {
|
||||
$machine->succeed(ru("VBoxManage ".$_[0]));
|
||||
};
|
||||
|
||||
${concatStrings (mapAttrsToList (_: getAttr "testSubs") vboxVMs)}
|
||||
|
||||
$machine->waitForX;
|
||||
|
||||
${mkLog "$HOME/.config/VirtualBox/VBoxSVC.log" "HOST-SVC"}
|
||||
|
||||
createVM_simple;
|
||||
$machine->succeed(ru "VirtualBox &");
|
||||
$machine->waitForWindow(qr/Oracle VM VirtualBox Manager/);
|
||||
$machine->sleep(5);
|
||||
$machine->screenshot("gui_manager_started");
|
||||
$machine->sendKeys("ret");
|
||||
$machine->screenshot("gui_manager_sent_startup");
|
||||
waitForStartup_simple (sub {
|
||||
|
||||
subtest "simple-gui", sub {
|
||||
$machine->succeed(ru "VirtualBox &");
|
||||
$machine->waitForWindow(qr/Oracle VM VirtualBox Manager/);
|
||||
$machine->sleep(5);
|
||||
$machine->screenshot("gui_manager_started");
|
||||
$machine->sendKeys("ret");
|
||||
});
|
||||
$machine->screenshot("gui_started");
|
||||
waitForVMBoot_simple;
|
||||
$machine->screenshot("gui_booted");
|
||||
shutdownVM_simple;
|
||||
$machine->sleep(5);
|
||||
$machine->screenshot("gui_stopped");
|
||||
$machine->sendKeys("ctrl-q");
|
||||
$machine->sleep(5);
|
||||
$machine->screenshot("gui_manager_stopped");
|
||||
'';
|
||||
$machine->screenshot("gui_manager_sent_startup");
|
||||
waitForStartup_simple (sub {
|
||||
$machine->sendKeys("ret");
|
||||
});
|
||||
$machine->screenshot("gui_started");
|
||||
waitForVMBoot_simple;
|
||||
$machine->screenshot("gui_booted");
|
||||
shutdownVM_simple;
|
||||
$machine->sleep(5);
|
||||
$machine->screenshot("gui_stopped");
|
||||
$machine->sendKeys("ctrl-q");
|
||||
$machine->sleep(5);
|
||||
$machine->screenshot("gui_manager_stopped");
|
||||
};
|
||||
|
||||
simple-cli = ''
|
||||
createVM_simple;
|
||||
vbm("startvm simple");
|
||||
waitForStartup_simple;
|
||||
$machine->screenshot("cli_started");
|
||||
waitForVMBoot_simple;
|
||||
$machine->screenshot("cli_booted");
|
||||
cleanup_simple;
|
||||
|
||||
$machine->nest("Checking for privilege escalation", sub {
|
||||
subtest "simple-cli", sub {
|
||||
vbm("startvm simple");
|
||||
waitForStartup_simple;
|
||||
$machine->screenshot("cli_started");
|
||||
waitForVMBoot_simple;
|
||||
$machine->screenshot("cli_booted");
|
||||
shutdownVM_simple;
|
||||
};
|
||||
|
||||
subtest "privilege-escalation", sub {
|
||||
$machine->fail("test -e '/root/VirtualBox VMs'");
|
||||
$machine->fail("test -e '/root/.config/VirtualBox'");
|
||||
$machine->succeed("test -e '/home/alice/VirtualBox VMs'");
|
||||
});
|
||||
};
|
||||
|
||||
shutdownVM_simple;
|
||||
destroyVM_simple;
|
||||
|
||||
sub removeUUIDs {
|
||||
return join("\n", grep { $_ !~ /^UUID:/ } split(/\n/, $_[0]))."\n";
|
||||
}
|
||||
|
||||
subtest "host-usb-permissions", sub {
|
||||
my $userUSB = removeUUIDs vbm("list usbhost");
|
||||
print STDERR $userUSB;
|
||||
my $rootUSB = removeUUIDs $machine->succeed("VBoxManage list usbhost");
|
||||
print STDERR $rootUSB;
|
||||
|
||||
die "USB host devices differ for root and normal user"
|
||||
if $userUSB ne $rootUSB;
|
||||
die "No USB host devices found" if $userUSB =~ /<none>/;
|
||||
};
|
||||
|
||||
subtest "systemd-detect-virt", sub {
|
||||
createVM_detectvirt;
|
||||
vbm("startvm detectvirt");
|
||||
waitForStartup_detectvirt;
|
||||
waitForVMBoot_detectvirt;
|
||||
shutdownVM_detectvirt;
|
||||
my $result = $machine->succeed("cat '$detectvirt_sharepath/result'");
|
||||
chomp $result;
|
||||
destroyVM_detectvirt;
|
||||
die "systemd-detect-virt returned \"$result\" instead of \"oracle\""
|
||||
if $result ne "oracle";
|
||||
};
|
||||
|
||||
subtest "net-hostonlyif", sub {
|
||||
createVM_test1;
|
||||
createVM_test2;
|
||||
|
||||
vbm("startvm test1");
|
||||
waitForStartup_test1;
|
||||
waitForVMBoot_test1;
|
||||
|
||||
vbm("startvm test2");
|
||||
waitForStartup_test2;
|
||||
waitForVMBoot_test2;
|
||||
|
||||
$machine->screenshot("net_booted");
|
||||
|
||||
my $test1IP = waitForIP_test1 1;
|
||||
my $test2IP = waitForIP_test2 1;
|
||||
|
||||
$machine->succeed("echo '$test2IP' | netcat -c '$test1IP' 1234");
|
||||
$machine->succeed("echo '$test1IP' | netcat -c '$test2IP' 1234");
|
||||
|
||||
$machine->waitUntilSucceeds("netcat -c '$test1IP' 5678 >&2");
|
||||
$machine->waitUntilSucceeds("netcat -c '$test2IP' 5678 >&2");
|
||||
|
||||
shutdownVM_test1;
|
||||
shutdownVM_test2;
|
||||
|
||||
destroyVM_test1;
|
||||
destroyVM_test2;
|
||||
};
|
||||
'';
|
||||
|
||||
host-usb-permissions = ''
|
||||
my $userUSB = removeUUIDs vbm("list usbhost");
|
||||
print STDERR $userUSB;
|
||||
my $rootUSB = removeUUIDs $machine->succeed("VBoxManage list usbhost");
|
||||
print STDERR $rootUSB;
|
||||
|
||||
die "USB host devices differ for root and normal user"
|
||||
if $userUSB ne $rootUSB;
|
||||
die "No USB host devices found" if $userUSB =~ /<none>/;
|
||||
'';
|
||||
|
||||
systemd-detect-virt = ''
|
||||
createVM_detectvirt;
|
||||
vbm("startvm detectvirt");
|
||||
waitForStartup_detectvirt;
|
||||
waitForVMBoot_detectvirt;
|
||||
shutdownVM_detectvirt;
|
||||
my $result = $machine->succeed("cat '$detectvirt_sharepath/result'");
|
||||
chomp $result;
|
||||
destroyVM_detectvirt;
|
||||
die "systemd-detect-virt returned \"$result\" instead of \"oracle\""
|
||||
if $result ne "oracle";
|
||||
'';
|
||||
|
||||
net-hostonlyif = ''
|
||||
createVM_test1;
|
||||
createVM_test2;
|
||||
|
||||
vbm("startvm test1");
|
||||
waitForStartup_test1;
|
||||
waitForVMBoot_test1;
|
||||
|
||||
vbm("startvm test2");
|
||||
waitForStartup_test2;
|
||||
waitForVMBoot_test2;
|
||||
|
||||
$machine->screenshot("net_booted");
|
||||
|
||||
my $test1IP = waitForIP_test1 1;
|
||||
my $test2IP = waitForIP_test2 1;
|
||||
|
||||
$machine->succeed("echo '$test2IP' | netcat -c '$test1IP' 1234");
|
||||
$machine->succeed("echo '$test1IP' | netcat -c '$test2IP' 1234");
|
||||
|
||||
$machine->waitUntilSucceeds("netcat -c '$test1IP' 5678 >&2");
|
||||
$machine->waitUntilSucceeds("netcat -c '$test2IP' 5678 >&2");
|
||||
|
||||
shutdownVM_test1;
|
||||
shutdownVM_test2;
|
||||
|
||||
destroyVM_test1;
|
||||
destroyVM_test2;
|
||||
'';
|
||||
}
|
||||
}) args
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
{ stdenv, fetchurl
|
||||
, ncurses
|
||||
, texinfo
|
||||
, gettext ? null
|
||||
, enableNls ? true
|
||||
, enableTiny ? false
|
||||
@@ -16,7 +17,8 @@ stdenv.mkDerivation rec {
|
||||
url = "mirror://gnu/nano/${name}.tar.gz";
|
||||
sha256 = "1vl9bim56k1b4zwc3icxp46w6pn6gb042j1h4jlz1jklxxpkwcpz";
|
||||
};
|
||||
buildInputs = [ ncurses ] ++ optional enableNls gettext;
|
||||
buildInputs = [ ncurses texinfo ] ++ optional enableNls gettext;
|
||||
outputs = [ "out" "info" ];
|
||||
configureFlags = ''
|
||||
--sysconfdir=/etc
|
||||
${optionalString (!enableNls) "--disable-nls"}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
{ stdenv, fetchFromGitHub, cmake, libX11, procps, python, qtbase }:
|
||||
{ stdenv, fetchFromGitHub, cmake, libX11, procps, python, libdwarf, qtbase, qtwebkit }:
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
name = "apitrace-${version}";
|
||||
@@ -11,13 +11,11 @@ stdenv.mkDerivation rec {
|
||||
owner = "apitrace";
|
||||
};
|
||||
|
||||
buildInputs = [ libX11 procps python qtbase ];
|
||||
nativeBuildInputs = [ cmake ];
|
||||
# LD_PRELOAD wrappers need to be statically linked to work against all kinds
|
||||
# of games -- so it's fine to use e.g. bundled snappy.
|
||||
buildInputs = [ libX11 procps python libdwarf qtbase qtwebkit ];
|
||||
|
||||
buildPhase = ''
|
||||
cmake
|
||||
make
|
||||
'';
|
||||
nativeBuildInputs = [ cmake ];
|
||||
|
||||
meta = with stdenv.lib; {
|
||||
homepage = https://apitrace.github.io;
|
||||
|
||||
@@ -1,55 +1,47 @@
|
||||
{ fetchurl, fetchhg, stdenv, xorg, gcc46, makeWrapper }:
|
||||
{ fetchurl, fetchhg, stdenv, xorg, makeWrapper }:
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
# Inferno is a rolling release from a mercurial repository. For the verison number
|
||||
# of the package I'm using the mercurial commit number.
|
||||
version = "645";
|
||||
name = "inferno-${version}";
|
||||
|
||||
# The mercurial repository does not contain all the components needed for the
|
||||
# runtime system. The 'base' package contains these. For this package I download
|
||||
# the base, extract the elements required from that, and add them to the source
|
||||
# pulled from the mercurial repository.
|
||||
srcBase = fetchurl {
|
||||
url = "http://www.vitanuova.com/dist/4e/inferno-20100120.tgz";
|
||||
sha256 = "0msvy3iwl4n5k0ry0xiyysjkq0qsawmwn3hvg67hbi5y8g7f7l88";
|
||||
};
|
||||
rev = "785";
|
||||
name = "inferno-${rev}";
|
||||
host = "Linux";
|
||||
objtype = "386";
|
||||
|
||||
src = fetchhg {
|
||||
url = "https://inferno-os.googlecode.com/hg";
|
||||
rev = "7ab390b860ca";
|
||||
sha256 = "09y0iclb3yy10gw1p0182sddg64xh60q2fx4ai7lxyfb65i76qbh";
|
||||
url = "https://bitbucket.org/inferno-os/inferno-os";
|
||||
sha256 = "1b428ma9fi5skvfrxp91dr43a62kax89wmx7950ahc1cxyx90k7x";
|
||||
};
|
||||
|
||||
# Fails with gcc48 due to inferno triggering an optimisation issue with floating point.
|
||||
buildInputs = [ gcc46 xorg.libX11 xorg.libXpm xorg.libXext xorg.xextproto makeWrapper ];
|
||||
buildInputs = [ makeWrapper ] ++ (with xorg; [ libX11 libXpm libXext xextproto ]);
|
||||
|
||||
infernoWrapper = ./inferno;
|
||||
|
||||
configurePhase = ''
|
||||
tar --strip-components=1 -xvf $srcBase inferno/fonts inferno/Mkdirs inferno/empties
|
||||
sed -e 's@^ROOT=.*$@ROOT='"$out"'/share/inferno@g' -e 's@^OBJTYPE=.*$@OBJTYPE=386@g' -e 's@^SYSHOST=.*$@SYSHOST=Linux@g' -i mkconfig
|
||||
mkdir prof
|
||||
sh Mkdirs
|
||||
sed -e 's@^ROOT=.*$@ROOT='"$out"'/share/inferno@g' \
|
||||
-e 's@^OBJTYPE=.*$@OBJTYPE=${objtype}@g' \
|
||||
-e 's@^SYSHOST=.*$@SYSHOST=${host}@g' \
|
||||
-i mkconfig
|
||||
# Get rid of an annoying warning
|
||||
sed -e 's/_BSD_SOURCE/_DEFAULT_SOURCE/g' \
|
||||
-i ${host}/${objtype}/include/lib9.h
|
||||
'';
|
||||
|
||||
buildPhase = ''
|
||||
export PATH=$PATH:$out/share/inferno/Linux/386/bin
|
||||
mkdir -p $out/share/inferno
|
||||
cp -r . $out/share/inferno
|
||||
./makemk.sh
|
||||
export PATH=$PATH:$out/share/inferno/Linux/386/bin
|
||||
mk nuke
|
||||
mk
|
||||
'';
|
||||
|
||||
installPhase = ''
|
||||
# Installs executables in $out/share/inferno/${host}/${objtype}/bin
|
||||
mk install
|
||||
mkdir -p $out/bin
|
||||
makeWrapper $out/share/inferno/Linux/386/bin/emu $out/bin/emu \
|
||||
--suffix LD_LIBRARY_PATH ':' "${gcc46.cc}/lib" \
|
||||
--suffix PATH ':' "$out/share/inferno/Linux/386/bin"
|
||||
# Install start-up script
|
||||
makeWrapper $infernoWrapper $out/bin/inferno \
|
||||
--suffix LD_LIBRARY_PATH ':' "${gcc46.cc}/lib" \
|
||||
--suffix PATH ':' "$out/share/inferno/Linux/386/bin" \
|
||||
--set INFERNO_ROOT "$out/share/inferno"
|
||||
'';
|
||||
@@ -58,7 +50,7 @@ stdenv.mkDerivation rec {
|
||||
description = "A compact distributed operating system for building cross-platform distributed systems";
|
||||
homepage = "http://inferno-os.org/";
|
||||
license = stdenv.lib.licenses.gpl2;
|
||||
maintainers = [ "Chris Double <chris.double@double.co.nz>" ];
|
||||
maintainers = with stdenv.lib.maintainers; [ doublec kovirobi ];
|
||||
platforms = with stdenv.lib.platforms; linux;
|
||||
};
|
||||
}
|
||||
|
||||
39
pkgs/applications/version-management/gitstats/default.nix
Normal file
39
pkgs/applications/version-management/gitstats/default.nix
Normal file
@@ -0,0 +1,39 @@
|
||||
{ stdenv, fetchzip, perl, python, gnuplot, coreutils, gnugrep }:
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
name = "gitstats-${version}";
|
||||
version = "2016-01-08";
|
||||
|
||||
# upstream does not make releases
|
||||
src = fetchzip {
|
||||
url = "https://github.com/hoxu/gitstats/archive/55c5c285558c410bb35ebf421245d320ab9ee9fa.zip";
|
||||
sha256 = "1bfcwhksylrpm88vyp33qjby4js31zcxy7w368dzjv4il3fh2i59";
|
||||
name = name + "-src";
|
||||
};
|
||||
|
||||
buildInputs = [ perl python ];
|
||||
|
||||
postPatch = ''
|
||||
sed -e "s|gnuplot_cmd = .*|gnuplot_cmd = '${gnuplot}/bin/gnuplot'|" \
|
||||
-e "s|\<wc\>|${coreutils}/bin/wc|g" \
|
||||
-e "s|\<grep\>|${gnugrep}/bin/grep|g" \
|
||||
-i gitstats
|
||||
'';
|
||||
|
||||
buildPhase = ''
|
||||
make man VERSION="${version}"
|
||||
'';
|
||||
|
||||
installPhase = ''
|
||||
make install PREFIX="$out" VERSION="${version}"
|
||||
install -Dm644 doc/gitstats.1 "$out"/share/man/man1/gitstats.1
|
||||
'';
|
||||
|
||||
meta = with stdenv.lib; {
|
||||
homepage = http://gitstats.sourceforge.net/;
|
||||
description = "Git history statistics generator";
|
||||
license = licenses.gpl2Plus;
|
||||
platforms = platforms.all;
|
||||
maintainers = [ maintainers.bjornfor ];
|
||||
};
|
||||
}
|
||||
@@ -11,7 +11,7 @@ GEM
|
||||
descendants_tracker (~> 0.0.4)
|
||||
ice_nine (~> 0.11.0)
|
||||
thread_safe (~> 0.3, >= 0.3.1)
|
||||
cide (0.8.1)
|
||||
cide (0.9.0)
|
||||
thor (~> 0.19)
|
||||
virtus (~> 1.0)
|
||||
coercible (1.0.0)
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{ stdenv, lib, bundlerEnv, makeWrapper, docker, git }:
|
||||
{ stdenv, lib, bundlerEnv, makeWrapper, docker, git, gnutar, gzip }:
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
name = "cide-${version}";
|
||||
version = "0.8.1";
|
||||
version = "0.9.0";
|
||||
|
||||
env = bundlerEnv {
|
||||
name = "${name}-gems";
|
||||
@@ -19,7 +19,7 @@ stdenv.mkDerivation rec {
|
||||
installPhase = ''
|
||||
mkdir -p $out/bin
|
||||
makeWrapper ${env}/bin/cide $out/bin/cide \
|
||||
--set PATH ${docker}/bin:${git}/bin
|
||||
--set PATH ${docker}/bin:${git}/bin:${gnutar}/bin:${gzip}/bin
|
||||
'';
|
||||
|
||||
meta = with lib; {
|
||||
|
||||
@@ -22,20 +22,20 @@
|
||||
version = "0.19.1";
|
||||
};
|
||||
jmespath = {
|
||||
version = "1.1.3";
|
||||
source = {
|
||||
type = "gem";
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0vpvd61kc60f98jn28kw7x7vi82qrwgglam42nvzh98i43yxwsfb";
|
||||
type = "gem";
|
||||
};
|
||||
version = "1.1.3";
|
||||
};
|
||||
ice_nine = {
|
||||
version = "0.11.2";
|
||||
source = {
|
||||
type = "gem";
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1nv35qg1rps9fsis28hz2cq2fx1i96795f91q4nmkm934xynll2x";
|
||||
type = "gem";
|
||||
};
|
||||
version = "0.11.2";
|
||||
};
|
||||
equalizer = {
|
||||
source = {
|
||||
@@ -61,11 +61,11 @@
|
||||
version = "1.0.0";
|
||||
};
|
||||
cide = {
|
||||
version = "0.8.1";
|
||||
version = "0.9.0";
|
||||
source = {
|
||||
type = "gem";
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1vsa7smab5dj6mcf0csl9wm18x95h6yphm7x18is53bv5hrzgill";
|
||||
sha256 = "1wykwv0jnrh49jm9zsy1cb5wddv65iw4ixh072hr242wb83dcyl0";
|
||||
};
|
||||
};
|
||||
axiom-types = {
|
||||
@@ -77,27 +77,27 @@
|
||||
version = "0.1.1";
|
||||
};
|
||||
aws-sdk-resources = {
|
||||
version = "2.2.17";
|
||||
source = {
|
||||
type = "gem";
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "0vdnpjmil99n9d1fpk1w6ssgvmzx4wfmrqcij8nyd0iqdaacx3fj";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.2.17";
|
||||
};
|
||||
aws-sdk-core = {
|
||||
version = "2.2.17";
|
||||
source = {
|
||||
type = "gem";
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1vq7ny5n3rdfzkdqdm76r48slmp2a5v7565llrl4bw5hb5k4p75z";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.2.17";
|
||||
};
|
||||
aws-sdk = {
|
||||
version = "2.2.17";
|
||||
source = {
|
||||
type = "gem";
|
||||
remotes = ["https://rubygems.org"];
|
||||
sha256 = "1cwycrdk21blzjzf8fj1wlmdix94rj9aixj6phx6lwbqykn2dzx9";
|
||||
type = "gem";
|
||||
};
|
||||
version = "2.2.17";
|
||||
};
|
||||
}
|
||||
59
pkgs/games/duckmarines/default.nix
Normal file
59
pkgs/games/duckmarines/default.nix
Normal file
@@ -0,0 +1,59 @@
|
||||
{ stdenv, fetchurl, unzip, love, lua, makeWrapper, makeDesktopItem }:
|
||||
|
||||
let
|
||||
pname = "duckmarines";
|
||||
version = "1.0b";
|
||||
|
||||
icon = fetchurl {
|
||||
url = "http://tangramgames.dk/img/thumb/duckmarines.png";
|
||||
sha256 = "07ypbwqcgqc5f117yxy9icix76wlybp1cmykc8f3ivdps66hl0k5";
|
||||
};
|
||||
|
||||
desktopItem = makeDesktopItem {
|
||||
name = "duckmarines";
|
||||
exec = "${pname}";
|
||||
icon = "${icon}";
|
||||
comment = "Duck-themed action puzzle video game";
|
||||
desktopName = "Duck Marines";
|
||||
genericName = "duckmarines";
|
||||
categories = "Game;";
|
||||
};
|
||||
|
||||
in
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
name = "${pname}-${version}";
|
||||
|
||||
src = fetchurl {
|
||||
url = "https://github.com/SimonLarsen/${pname}/releases/download/v${version}/${pname}-1.0-love.zip";
|
||||
sha256 = "0fpzbsgrhbwm1lff9gyzh6c9jigw328ngddvrj5w7qmjcm2lv6lv";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [ makeWrapper unzip ];
|
||||
buildInputs = [ lua love ];
|
||||
|
||||
phases = [ "unpackPhase" "installPhase" ];
|
||||
|
||||
installPhase =
|
||||
''
|
||||
mkdir -p $out/bin
|
||||
mkdir -p $out/share/games/lovegames
|
||||
|
||||
cp -v ./${pname}-1.0.love $out/share/games/lovegames/${pname}.love
|
||||
|
||||
makeWrapper ${love}/bin/love $out/bin/${pname} --add-flags $out/share/games/lovegames/${pname}.love
|
||||
|
||||
chmod +x $out/bin/${pname}
|
||||
mkdir -p $out/share/applications
|
||||
ln -s ${desktopItem}/share/applications/* $out/share/applications/
|
||||
'';
|
||||
|
||||
meta = with stdenv.lib; {
|
||||
description = "Duck-themed action puzzle video game";
|
||||
maintainers = with maintainers; [ leenaars ];
|
||||
platforms = platforms.linux;
|
||||
license = licenses.free;
|
||||
downloadPage = http://tangramgames.dk/games/duckmarines;
|
||||
};
|
||||
|
||||
}
|
||||
@@ -13,11 +13,11 @@
|
||||
}:
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
name = "nsd-4.1.6";
|
||||
name = "nsd-4.1.7";
|
||||
|
||||
src = fetchurl {
|
||||
url = "http://www.nlnetlabs.nl/downloads/nsd/${name}.tar.gz";
|
||||
sha256 = "0pvpsxhil60m21h3pqlzs0l5m8qd3l6j8fkjyfg8plwmbh2j5xl8";
|
||||
sha256 = "12hskfgfbkvcgpa1xxkqd8lnc6xvln1amn97x6avfnj9kfrbxa3v";
|
||||
};
|
||||
|
||||
buildInputs = [ libevent openssl ];
|
||||
@@ -41,7 +41,6 @@ stdenv.mkDerivation rec {
|
||||
homepage = http://www.nlnetlabs.nl;
|
||||
description = "Authoritative only, high performance, simple and open source name server";
|
||||
license = licenses.bsd3;
|
||||
|
||||
platforms = platforms.unix;
|
||||
maintainers = [ maintainers.hrdinka ];
|
||||
};
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
, gnutls, libgcrypt, libgpgerror
|
||||
, ncurses, libunwind, libibverbs, librdmacm, systemd
|
||||
|
||||
, enableKerberos ? false
|
||||
, enableInfiniband ? false
|
||||
, enableLDAP ? false
|
||||
, enablePrinting ? false
|
||||
@@ -34,10 +33,9 @@ stdenv.mkDerivation rec {
|
||||
buildInputs =
|
||||
[ python pkgconfig perl libxslt docbook_xsl docbook_xml_dtd_42 /*
|
||||
docbook_xml_dtd_45 */ readline talloc ntdb tdb tevent ldb popt iniparser
|
||||
libbsd libarchive zlib acl fam libiconv gettext libunwind
|
||||
libbsd libarchive zlib acl fam libiconv gettext libunwind kerberos
|
||||
]
|
||||
++ optionals stdenv.isLinux [ libaio pam systemd ]
|
||||
++ optional enableKerberos kerberos
|
||||
++ optionals (enableInfiniband && stdenv.isLinux) [ libibverbs librdmacm ]
|
||||
++ optional enableLDAP openldap
|
||||
++ optional (enablePrinting && stdenv.isLinux) cups
|
||||
@@ -58,23 +56,22 @@ stdenv.mkDerivation rec {
|
||||
configureFlags =
|
||||
[ "--with-static-modules=NONE"
|
||||
"--with-shared-modules=ALL"
|
||||
"--with-system-mitkrb5"
|
||||
"--enable-fhs"
|
||||
"--sysconfdir=/etc"
|
||||
"--localstatedir=/var"
|
||||
"--bundled-libraries=${if enableKerberos && kerberos != null &&
|
||||
kerberos.implementation == "heimdal" then "NONE" else "com_err"}"
|
||||
"--bundled-libraries=NONE"
|
||||
"--private-libraries=NONE"
|
||||
"--builtin-libraries=replace"
|
||||
"--builtin-libraries=NONE"
|
||||
]
|
||||
++ optional (enableKerberos && kerberos != null &&
|
||||
kerberos.implementation == "krb5") "--with-system-mitkrb5"
|
||||
++ optional (!enableDomainController) "--without-ad-dc"
|
||||
++ optionals (!enableLDAP) [ "--without-ldap" "--without-ads" ];
|
||||
|
||||
enableParallelBuilding = true;
|
||||
|
||||
stripAllList = [ "bin" "sbin" ];
|
||||
|
||||
# Some libraries don't have /lib/samba in RPATH but need it.
|
||||
# Use find -type f -executable -exec echo {} \; -exec sh -c 'ldd {} | grep "not found"' \;
|
||||
# Looks like a bug in installer scripts.
|
||||
postFixup = ''
|
||||
export SAMBA_LIBS="$(find $out -type f -name \*.so -exec dirname {} \; | sort | uniq)"
|
||||
read -r -d "" SCRIPT << EOF || true
|
||||
@@ -85,7 +82,7 @@ stdenv.mkDerivation rec {
|
||||
patchelf --set-rpath "\$ALL_LIBS" "\$BIN" 2>/dev/null || exit $?;
|
||||
patchelf --shrink-rpath "\$BIN";
|
||||
EOF
|
||||
find $out -type f -exec $SHELL -c "$SCRIPT" \;
|
||||
find $out -type f -name \*.so -exec $SHELL -c "$SCRIPT" \;
|
||||
'';
|
||||
|
||||
meta = with stdenv.lib; {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{ stdenv, fetchurl, ncurses, nettools, python, which, groff, gettext, man_db,
|
||||
bc, libiconv, coreutils, gnused, kbd }:
|
||||
bc, libiconv, coreutils, gnused, kbd, utillinux, glibc }:
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
name = "fish-${version}";
|
||||
@@ -22,8 +22,10 @@ stdenv.mkDerivation rec {
|
||||
|
||||
postInstall = ''
|
||||
sed -e "s|expr|${coreutils}/bin/expr|" \
|
||||
'' + stdenv.lib.optionalString (!stdenv.isDarwin) ''
|
||||
-e "s|if which unicode_start|if true|" \
|
||||
-e "s|unicode_start|${kbd}/bin/unicode_start|" \
|
||||
'' + ''
|
||||
-i "$out/etc/fish/config.fish"
|
||||
sed -e "s|bc|${bc}/bin/bc|" \
|
||||
-e "s|/usr/bin/seq|${coreutils}/bin/seq|" \
|
||||
@@ -43,6 +45,13 @@ stdenv.mkDerivation rec {
|
||||
"$out/share/fish/functions/prompt_pwd.fish"
|
||||
substituteInPlace "$out/share/fish/functions/fish_default_key_bindings.fish" \
|
||||
--replace "clear;" "${ncurses}/bin/clear;"
|
||||
'' + stdenv.lib.optionalString stdenv.isLinux ''
|
||||
substituteInPlace "$out/share/fish/functions/__fish_print_help.fish" \
|
||||
--replace "| ul" "| ${utillinux}/bin/ul"
|
||||
|
||||
for cur in $out/share/fish/functions/*.fish; do
|
||||
substituteInPlace "$cur" --replace "/usr/bin/getent" "${glibc}/bin/getent"
|
||||
done
|
||||
'' + stdenv.lib.optionalString (!stdenv.isDarwin) ''
|
||||
sed -i "s|(hostname\||(${nettools}/bin/hostname\||" "$out/share/fish/functions/fish_prompt.fish"
|
||||
sed -i "s|Popen(\['manpath'|Popen(\['${man_db}/bin/manpath'|" "$out/share/fish/tools/create_manpage_completions.py"
|
||||
|
||||
@@ -18,10 +18,9 @@ import ../generic rec {
|
||||
nativePrefix = stdenv.lib.optionalString stdenv.isSunOS "/usr";
|
||||
nativeLibc = true;
|
||||
inherit stdenv;
|
||||
binutils = pkgs.binutils;
|
||||
inherit (pkgs) binutils coreutils gnugrep;
|
||||
cc = pkgs.gcc.cc;
|
||||
isGNU = true;
|
||||
coreutils = pkgs.coreutils;
|
||||
shell = pkgs.bash + "/bin/sh";
|
||||
};
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
{ stdenv, fetchFromGitHub, makeWrapper, ibus, anthy, intltool
|
||||
, pkgconfig, glib, gobjectIntrospection
|
||||
, python3, pygobject3, gtk3, libtool, automake, autoconf
|
||||
{ stdenv, fetchurl, intltool, pkgconfig
|
||||
, anthy, ibus, glib, gobjectIntrospection, gtk3, python3, pygobject3
|
||||
}:
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
@@ -16,28 +15,20 @@ stdenv.mkDerivation rec {
|
||||
maintainers = with maintainers; [ gebner ericsagnes ];
|
||||
};
|
||||
|
||||
preConfigure = "./autogen.sh --prefix=$out";
|
||||
|
||||
configureFlags = "--with-anthy-zipcode=${anthy}/share/anthy/zipcode.t";
|
||||
|
||||
buildInputs = [
|
||||
makeWrapper ibus anthy intltool pkgconfig glib gobjectIntrospection
|
||||
python3 pygobject3 gtk3 libtool automake autoconf
|
||||
anthy glib gobjectIntrospection gtk3 ibus python3 pygobject3
|
||||
];
|
||||
|
||||
nativeBuildInputs = [ intltool pkgconfig ];
|
||||
|
||||
postFixup = ''
|
||||
substituteInPlace $out/share/ibus/component/anthy.xml --replace \$\{exec_prefix\} $out
|
||||
for file in "$out"/libexec/*; do # */
|
||||
wrapProgram "$file" \
|
||||
--prefix PYTHONPATH : $PYTHONPATH \
|
||||
--prefix GI_TYPELIB_PATH : $GI_TYPELIB_PATH:$out/lib/girepository-1.0
|
||||
done
|
||||
'';
|
||||
|
||||
src = fetchFromGitHub {
|
||||
owner = "ibus";
|
||||
repo = "ibus-anthy";
|
||||
rev = version;
|
||||
sha256 = "1laxwpnhgihv4dz5cgcz6d0a0880r93n7039ciz1m53hdzapwi4a";
|
||||
src = fetchurl {
|
||||
url = "https://github.com/ibus/ibus-anthy/releases/download/${version}/${name}.tar.gz";
|
||||
sha256 = "1aj7vnfky7izl23xyjky78z3qas3q72l3kr8dnql2lnivsrb8q1y";
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
{ stdenv, fetchurl, makeWrapper
|
||||
, intltool, pkgconfig
|
||||
{ stdenv, fetchurl, intltool, pkgconfig
|
||||
, gtk3, ibus, libhangul, librsvg, python3, pygobject3
|
||||
}:
|
||||
|
||||
@@ -9,20 +8,12 @@ stdenv.mkDerivation rec {
|
||||
|
||||
src = fetchurl {
|
||||
url = "https://github.com/choehwanjin/ibus-hangul/releases/download/${version}/${name}.tar.gz";
|
||||
sha256 = null;
|
||||
sha256 = "120p9w7za6hi521hz8q235fkl4i3p1qqr8nqm4a3kxr0pcq40bd2";
|
||||
};
|
||||
|
||||
buildInputs = [ gtk3 ibus libhangul python3 pygobject3 ];
|
||||
|
||||
nativeBuildInputs = [ intltool makeWrapper pkgconfig ];
|
||||
|
||||
postInstall = ''
|
||||
wrapProgram $out/bin/ibus-setup-hangul \
|
||||
--prefix PYTHONPATH : $PYTHONPATH \
|
||||
--prefix GI_TYPELIB_PATH : "$GI_TYPELIB_PATH" \
|
||||
--prefix GDK_PIXBUF_MODULE_FILE : ${librsvg}/lib/gdk-pixbuf-2.0/2.10.0/loaders.cache \
|
||||
--prefix LD_LIBRARY_PATH : ${libhangul}/lib
|
||||
'';
|
||||
nativeBuildInputs = [ intltool pkgconfig ];
|
||||
|
||||
meta = with stdenv.lib; {
|
||||
isIbusEngine = true;
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
{ stdenv, fetchFromGitHub, ibus, m17n_lib, m17n_db, automake, autoconf,
|
||||
gettext, libtool, pkgconfig, python, pythonPackages }:
|
||||
{ stdenv, fetchFromGitHub
|
||||
, automake, autoconf, libtool, pkgconfig
|
||||
, ibus, m17n_lib, m17n_db, gettext, python3, pygobject3
|
||||
}:
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
name = "ibus-m17n-${version}";
|
||||
@@ -12,11 +14,13 @@ stdenv.mkDerivation rec {
|
||||
sha256 = "1n0bvgc4jyksgvzrw5zs2pxcpxcn3gcc0j2kasbznm34fpv3frsr";
|
||||
};
|
||||
|
||||
buildInputs = [
|
||||
ibus m17n_lib m17n_db automake autoconf gettext
|
||||
libtool pkgconfig python pythonPackages.pygobject3
|
||||
buildInputs = [
|
||||
ibus m17n_lib m17n_db gettext
|
||||
python3 pygobject3
|
||||
];
|
||||
|
||||
nativeBuildInputs = [ automake autoconf libtool pkgconfig ];
|
||||
|
||||
preConfigure = ''
|
||||
autoreconf --verbose --force --install
|
||||
'';
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{ stdenv, fetchurl, makeWrapper, ibus, pkgconfig, python3, pygobject3
|
||||
, gtk3, atk, dconf, gobjectIntrospection }:
|
||||
{ stdenv, fetchurl, pkgconfig
|
||||
, gtk3, dconf, gobjectIntrospection, ibus, python3, pygobject3 }:
|
||||
|
||||
stdenv.mkDerivation rec {
|
||||
name = "ibus-table-${version}";
|
||||
@@ -25,29 +25,10 @@ stdenv.mkDerivation rec {
|
||||
'';
|
||||
|
||||
buildInputs = [
|
||||
gtk3 dconf gobjectIntrospection
|
||||
ibus
|
||||
pkgconfig
|
||||
python3 pygobject3
|
||||
dconf gtk3 gobjectIntrospection ibus python3 pygobject3
|
||||
];
|
||||
|
||||
nativeBuildInputs = [ makeWrapper ];
|
||||
|
||||
preFixup = ''
|
||||
for prog in "$out/bin"/*; do #*/
|
||||
wrapProgram "$prog" \
|
||||
--prefix XDG_DATA_DIRS : "$out/share:$GSETTINGS_SCHEMAS_PATH" \
|
||||
--prefix PYTHONPATH : "$PYTHONPATH" \
|
||||
--prefix GI_TYPELIB_PATH : "$GI_TYPELIB_PATH:$out/lib/girepository-1.0" \
|
||||
--prefix GIO_EXTRA_MODULES : "${dconf}/lib/gio/modules"
|
||||
done
|
||||
|
||||
for prog in "$out/libexec"/*; do #*/
|
||||
wrapProgram "$prog" \
|
||||
--prefix PYTHONPATH : "$PYTHONPATH" \
|
||||
--prefix GI_TYPELIB_PATH : "$GI_TYPELIB_PATH:$out/lib/girepository-1.0"
|
||||
done
|
||||
'';
|
||||
nativeBuildInputs = [ pkgconfig ];
|
||||
|
||||
meta = with stdenv.lib; {
|
||||
isIbusEngine = true;
|
||||
|
||||
@@ -1,11 +1,15 @@
|
||||
{ stdenv, runCommand, ibus, lndir, makeWrapper, plugins, hicolor_icon_theme }:
|
||||
{ stdenv, runCommand, makeWrapper, lndir
|
||||
, dconf, hicolor_icon_theme, ibus, librsvg, plugins
|
||||
}:
|
||||
|
||||
let
|
||||
name = "ibus-with-plugins-" + (builtins.parseDrvName ibus.name).version;
|
||||
env = {
|
||||
buildInputs = [ ibus ] ++ plugins;
|
||||
nativeBuildInputs = [ lndir makeWrapper ];
|
||||
propagatedUserEnvPackages = [ hicolor_icon_theme ];
|
||||
paths = [ ibus ] ++ plugins;
|
||||
inherit (ibus) meta;
|
||||
};
|
||||
command = ''
|
||||
for dir in bin etc lib libexec share; do
|
||||
@@ -19,7 +23,9 @@ let
|
||||
|
||||
for prog in ibus ibus-daemon ibus-setup; do
|
||||
wrapProgram "$out/bin/$prog" \
|
||||
--suffix XDG_DATA_DIRS : "${hicolor_icon_theme}/share" \
|
||||
--prefix GDK_PIXBUF_MODULE_FILE : ${librsvg}/lib/gdk-pixbuf-2.0/2.10.0/loaders.cache \
|
||||
--prefix GI_TYPELIB_PATH : "$GI_TYPELIB_PATH:$out/lib/girepository-1.0" \
|
||||
--prefix GIO_EXTRA_MODULES : "${dconf}/lib/gio/modules" \
|
||||
--set IBUS_COMPONENT_PATH "$out/share/ibus/component/" \
|
||||
--set IBUS_DATAROOTDIR "$out/share" \
|
||||
--set IBUS_LIBEXECDIR "$out/libexec" \
|
||||
@@ -29,7 +35,9 @@ let
|
||||
--set IBUS_TABLE_DATA_DIR "$out/share" \
|
||||
--set IBUS_TABLE_LIB_LOCATION "$out/libexec" \
|
||||
--set IBUS_TABLE_LOCATION "$out/share/ibus-table" \
|
||||
--set IBUS_TABLE_DEBUG_LEVEL 1
|
||||
--prefix PYTHONPATH : "$PYTHONPATH" \
|
||||
--prefix XDG_DATA_DIRS : "$out/share:$GSETTINGS_SCHEMAS_PATH" \
|
||||
--suffix XDG_DATA_DIRS : "${hicolor_icon_theme}/share"
|
||||
done
|
||||
'';
|
||||
in
|
||||
|
||||
26
pkgs/tools/text/wring/default.nix
Normal file
26
pkgs/tools/text/wring/default.nix
Normal file
@@ -0,0 +1,26 @@
|
||||
{ stdenv, callPackage, makeWrapper, nodejs, phantomjs2 }:
|
||||
|
||||
let
|
||||
self = (
|
||||
callPackage ../../../top-level/node-packages.nix {
|
||||
generated = callPackage ./node-packages.nix { inherit self; };
|
||||
overrides = {
|
||||
"wring" = {
|
||||
buildInputs = [ makeWrapper phantomjs2 ];
|
||||
|
||||
postInstall = ''
|
||||
wrapProgram "$out/bin/wring" \
|
||||
--prefix PATH : ${phantomjs2}/bin
|
||||
'';
|
||||
|
||||
meta = with stdenv.lib; {
|
||||
description = "Command-line tool for extracting content from webpages using CSS Selectors, XPath, and JS expressions";
|
||||
homepage = https://github.com/osener/wring;
|
||||
license = licenses.mit;
|
||||
platforms = platforms.darwin ++ platforms.linux;
|
||||
maintainers = [ maintainers.osener ];
|
||||
};
|
||||
};
|
||||
};
|
||||
});
|
||||
in self.wring
|
||||
1
pkgs/tools/text/wring/node-packages.json
Normal file
1
pkgs/tools/text/wring/node-packages.json
Normal file
@@ -0,0 +1 @@
|
||||
[ "wring" ]
|
||||
24
pkgs/tools/text/wring/node-packages.nix
Normal file
24
pkgs/tools/text/wring/node-packages.nix
Normal file
@@ -0,0 +1,24 @@
|
||||
{ self, fetchurl, fetchgit ? null, lib }:
|
||||
|
||||
{
|
||||
by-spec."wring"."*" =
|
||||
self.by-version."wring"."1.0.0";
|
||||
by-version."wring"."1.0.0" = self.buildNodePackage {
|
||||
name = "wring-1.0.0";
|
||||
version = "1.0.0";
|
||||
bin = true;
|
||||
src = fetchurl {
|
||||
url = "http://registry.npmjs.org/wring/-/wring-1.0.0.tgz";
|
||||
name = "wring-1.0.0.tgz";
|
||||
sha1 = "3d8ebe894545bf0b42946fdc84c61e37ae657ce1";
|
||||
};
|
||||
deps = {
|
||||
};
|
||||
optionalDependencies = {
|
||||
};
|
||||
peerDependencies = [];
|
||||
os = [ ];
|
||||
cpu = [ ];
|
||||
};
|
||||
"wring" = self.by-version."wring"."1.0.0";
|
||||
}
|
||||
@@ -1180,7 +1180,9 @@ let
|
||||
inherit (python3Packages) pygobject3;
|
||||
};
|
||||
|
||||
m17n = callPackage ../tools/inputmethods/ibus-engines/ibus-m17n { };
|
||||
m17n = callPackage ../tools/inputmethods/ibus-engines/ibus-m17n {
|
||||
inherit (python3Packages) pygobject3;
|
||||
};
|
||||
|
||||
mozc = callPackage ../tools/inputmethods/ibus-engines/ibus-mozc {
|
||||
inherit (pythonPackages) gyp;
|
||||
@@ -1198,6 +1200,7 @@ let
|
||||
};
|
||||
|
||||
ibus-with-plugins = callPackage ../tools/inputmethods/ibus/wrapper.nix {
|
||||
inherit (gnome3) dconf;
|
||||
plugins = [ ];
|
||||
};
|
||||
|
||||
@@ -1727,6 +1730,8 @@ let
|
||||
|
||||
gitlab-workhorse = callPackage ../applications/version-management/gitlab-workhorse { };
|
||||
|
||||
gitstats = callPackage ../applications/version-management/gitstats { };
|
||||
|
||||
git-latexdiff = callPackage ../tools/typesetting/git-latexdiff { };
|
||||
|
||||
glusterfs = callPackage ../tools/filesystems/glusterfs { };
|
||||
@@ -3769,6 +3774,8 @@ let
|
||||
|
||||
wml = callPackage ../development/web/wml { };
|
||||
|
||||
wring = callPackage ../tools/text/wring { };
|
||||
|
||||
wrk = callPackage ../tools/networking/wrk { };
|
||||
|
||||
wv = callPackage ../tools/misc/wv { };
|
||||
@@ -9822,7 +9829,6 @@ let
|
||||
|
||||
samba4 = callPackage ../servers/samba/4.x.nix {
|
||||
python = python2;
|
||||
kerberos = null; # Bundle kerberos because samba uses internal, non-stable functions
|
||||
# enableLDAP
|
||||
};
|
||||
|
||||
@@ -9842,7 +9848,6 @@ let
|
||||
});
|
||||
|
||||
samba4Full = lowPrio (samba4.override {
|
||||
enableKerberos = true;
|
||||
enableInfiniband = true;
|
||||
enableLDAP = true;
|
||||
enablePrinting = true;
|
||||
@@ -14399,6 +14404,8 @@ let
|
||||
|
||||
drumkv1 = callPackage ../applications/audio/drumkv1 { };
|
||||
|
||||
duckmarines = callPackage ../games/duckmarines { love = love_0_9; };
|
||||
|
||||
dwarf-fortress-packages = callPackage ../games/dwarf-fortress { };
|
||||
|
||||
dwarf-fortress = dwarf-fortress-packages.dwarf-fortress.override { };
|
||||
|
||||
Reference in New Issue
Block a user