Merge branch 'nixpart-1.0-preparations'.
Partially and temporarily addresses NixOS/nixops#228. We now have an up-to-date version of Blivet and a bunch of its dependen- cies as well as the old nixpart 0.4 with all its old and crappy dependencies, which should fix _simple_ partitioning layouts for NixOps. Also, nixpart 1.0 is now marked as broken, because it is not yet released and this branch is more of a preparation and "damage control" in case I shouldn't manage to finish nixpart + nixos-assimilate in time for the next NixOS release.
This commit is contained in:
commit
57aaf3d36e
|
@ -364,6 +364,7 @@
|
||||||
./tasks/filesystems/cifs.nix
|
./tasks/filesystems/cifs.nix
|
||||||
./tasks/filesystems/ext.nix
|
./tasks/filesystems/ext.nix
|
||||||
./tasks/filesystems/f2fs.nix
|
./tasks/filesystems/f2fs.nix
|
||||||
|
./tasks/filesystems/jfs.nix
|
||||||
./tasks/filesystems/nfs.nix
|
./tasks/filesystems/nfs.nix
|
||||||
./tasks/filesystems/reiserfs.nix
|
./tasks/filesystems/reiserfs.nix
|
||||||
./tasks/filesystems/unionfs-fuse.nix
|
./tasks/filesystems/unionfs-fuse.nix
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
with lib;
|
||||||
|
|
||||||
|
let
|
||||||
|
inInitrd = any (fs: fs == "jfs") config.boot.initrd.supportedFilesystems;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
config = mkIf (any (fs: fs == "jfs") config.boot.supportedFilesystems) {
|
||||||
|
|
||||||
|
system.fsPackages = [ pkgs.jfsutils ];
|
||||||
|
|
||||||
|
boot.initrd.kernelModules = mkIf inInitrd [ "jfs" ];
|
||||||
|
|
||||||
|
boot.initrd.extraUtilsCommands = mkIf inInitrd ''
|
||||||
|
cp -v ${pkgs.jfsutils}/sbin/fsck.jfs "$out/bin/"
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
|
@ -234,6 +234,7 @@ in rec {
|
||||||
# ‘nix-build tests/login.nix -A result’.
|
# ‘nix-build tests/login.nix -A result’.
|
||||||
tests.avahi = callTest tests/avahi.nix {};
|
tests.avahi = callTest tests/avahi.nix {};
|
||||||
tests.bittorrent = callTest tests/bittorrent.nix {};
|
tests.bittorrent = callTest tests/bittorrent.nix {};
|
||||||
|
tests.blivet = callTest tests/blivet.nix {};
|
||||||
tests.containers = callTest tests/containers.nix {};
|
tests.containers = callTest tests/containers.nix {};
|
||||||
tests.firefox = callTest tests/firefox.nix {};
|
tests.firefox = callTest tests/firefox.nix {};
|
||||||
tests.firewall = callTest tests/firewall.nix {};
|
tests.firewall = callTest tests/firewall.nix {};
|
||||||
|
|
|
@ -0,0 +1,85 @@
|
||||||
|
import ./make-test.nix ({ pkgs, ... }: with pkgs.pythonPackages; rec {
|
||||||
|
name = "blivet";
|
||||||
|
|
||||||
|
machine = {
|
||||||
|
environment.systemPackages = [ pkgs.python blivet mock ];
|
||||||
|
boot.supportedFilesystems = [ "btrfs" "jfs" "reiserfs" "xfs" ];
|
||||||
|
virtualisation.memorySize = 768;
|
||||||
|
};
|
||||||
|
|
||||||
|
debugBlivet = false;
|
||||||
|
debugProgramCalls = false;
|
||||||
|
|
||||||
|
pythonTestRunner = pkgs.writeText "run-blivet-tests.py" ''
|
||||||
|
import sys
|
||||||
|
import logging
|
||||||
|
|
||||||
|
from unittest import TestLoader
|
||||||
|
from unittest.runner import TextTestRunner
|
||||||
|
|
||||||
|
${pkgs.lib.optionalString debugProgramCalls ''
|
||||||
|
blivet_program_log = logging.getLogger("program")
|
||||||
|
blivet_program_log.setLevel(logging.DEBUG)
|
||||||
|
blivet_program_log.addHandler(logging.StreamHandler(sys.stderr))
|
||||||
|
''}
|
||||||
|
|
||||||
|
${pkgs.lib.optionalString debugBlivet ''
|
||||||
|
blivet_log = logging.getLogger("blivet")
|
||||||
|
blivet_log.setLevel(logging.DEBUG)
|
||||||
|
blivet_log.addHandler(logging.StreamHandler(sys.stderr))
|
||||||
|
''}
|
||||||
|
|
||||||
|
runner = TextTestRunner(verbosity=2, failfast=False, buffer=False)
|
||||||
|
result = runner.run(TestLoader().discover('tests/', pattern='*_test.py'))
|
||||||
|
sys.exit(not result.wasSuccessful())
|
||||||
|
'';
|
||||||
|
|
||||||
|
blivetTest = pkgs.writeScript "blivet-test.sh" ''
|
||||||
|
#!${pkgs.stdenv.shell} -e
|
||||||
|
|
||||||
|
# Use the hosts temporary directory, because we have a tmpfs within the VM
|
||||||
|
# and we don't want to increase the memory size of the VM for no reason.
|
||||||
|
mkdir -p /tmp/xchg/bigtmp
|
||||||
|
TMPDIR=/tmp/xchg/bigtmp
|
||||||
|
export TMPDIR
|
||||||
|
|
||||||
|
mkPythonPath() {
|
||||||
|
nix-store -qR "$@" \
|
||||||
|
| sed -e 's|$|/lib/${pkgs.python.libPrefix}/site-packages|'
|
||||||
|
}
|
||||||
|
|
||||||
|
cp -Rd "${blivet.src}/tests" .
|
||||||
|
|
||||||
|
# Skip SELinux tests
|
||||||
|
rm -f tests/formats_test/selinux_test.py
|
||||||
|
|
||||||
|
# Race conditions in growing/shrinking during resync
|
||||||
|
rm -f tests/devicelibs_test/mdraid_*
|
||||||
|
|
||||||
|
# Deactivate small BTRFS device test, because it fails with newer btrfsprogs
|
||||||
|
sed -i -e '/^class *BTRFSAsRootTestCase3(/,/^[^ ]/ {
|
||||||
|
/^class *BTRFSAsRootTestCase3(/d
|
||||||
|
/^$/d
|
||||||
|
/^ /d
|
||||||
|
}' tests/devicelibs_test/btrfs_test.py
|
||||||
|
|
||||||
|
# How on earth can these tests ever work even upstream? O_o
|
||||||
|
sed -i -e '/def testDiskChunk[12]/,/^ *[^ ]/{n; s/^ */&return # /}' \
|
||||||
|
tests/partitioning_test.py
|
||||||
|
|
||||||
|
# fix hardcoded temporary directory
|
||||||
|
sed -i \
|
||||||
|
-e '1i import tempfile' \
|
||||||
|
-e 's|_STORE_FILE_PATH = .*|_STORE_FILE_PATH = tempfile.gettempdir()|' \
|
||||||
|
tests/loopbackedtestcase.py
|
||||||
|
|
||||||
|
PYTHONPATH=".:$(mkPythonPath "${blivet}" "${mock}" | paste -sd :)" \
|
||||||
|
python "${pythonTestRunner}"
|
||||||
|
'';
|
||||||
|
|
||||||
|
testScript = ''
|
||||||
|
$machine->waitForUnit("multi-user.target");
|
||||||
|
$machine->succeed("${blivetTest}");
|
||||||
|
$machine->execute("rm -rf /tmp/xchg/bigtmp");
|
||||||
|
'';
|
||||||
|
})
|
|
@ -67,7 +67,7 @@ in {
|
||||||
|
|
||||||
machine = { config, pkgs, ... }: {
|
machine = { config, pkgs, ... }: {
|
||||||
environment.systemPackages = [
|
environment.systemPackages = [
|
||||||
pkgs.pythonPackages.nixpart
|
pkgs.pythonPackages.nixpart0
|
||||||
pkgs.file pkgs.btrfsProgs pkgs.xfsprogs pkgs.lvm2
|
pkgs.file pkgs.btrfsProgs pkgs.xfsprogs pkgs.lvm2
|
||||||
];
|
];
|
||||||
virtualisation.emptyDiskImages = [ 4096 4096 ];
|
virtualisation.emptyDiskImages = [ 4096 4096 ];
|
||||||
|
@ -209,7 +209,7 @@ in {
|
||||||
ensurePartition("swap", "swap");
|
ensurePartition("swap", "swap");
|
||||||
ensurePartition("boot", "f2fs");
|
ensurePartition("boot", "f2fs");
|
||||||
ensurePartition("root", "f2fs");
|
ensurePartition("root", "f2fs");
|
||||||
remoteAndCheck;
|
remountAndCheck;
|
||||||
ensureMountPoint("/mnt/boot", "f2fs");
|
ensureMountPoint("/mnt/boot", "f2fs");
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,52 +1,42 @@
|
||||||
{ stdenv, fetchurl, buildPythonPackage, pykickstart, pyparted, pyblock
|
{ stdenv, fetchFromGitHub, buildPythonPackage, pykickstart, pyparted, pyblock
|
||||||
, libselinux, cryptsetup, multipath_tools, lsof, utillinux
|
, pyudev, six, libselinux, cryptsetup, multipath_tools, lsof, utillinux
|
||||||
, useNixUdev ? true, udev ? null
|
|
||||||
# This is only used when useNixUdev is false
|
|
||||||
, udevSoMajor ? 1
|
|
||||||
}:
|
}:
|
||||||
|
|
||||||
assert useNixUdev -> udev != null;
|
|
||||||
|
|
||||||
let
|
let
|
||||||
pyenable = { enablePython = true; };
|
pyenable = { enablePython = true; };
|
||||||
selinuxWithPython = libselinux.override pyenable;
|
selinuxWithPython = libselinux.override pyenable;
|
||||||
cryptsetupWithPython = cryptsetup.override pyenable;
|
cryptsetupWithPython = cryptsetup.override pyenable;
|
||||||
in buildPythonPackage rec {
|
in buildPythonPackage rec {
|
||||||
name = "blivet-${version}";
|
name = "blivet-${version}";
|
||||||
version = "0.17-1";
|
version = "0.67";
|
||||||
|
|
||||||
src = fetchurl {
|
src = fetchFromGitHub {
|
||||||
url = "https://git.fedorahosted.org/cgit/blivet.git/snapshot/"
|
owner = "dwlehman";
|
||||||
+ "${name}.tar.bz2";
|
repo = "blivet";
|
||||||
sha256 = "1k3mws2q0ryb7422mml6idmaasz2i2v6ngyvg6d976dx090qnmci";
|
rev = name;
|
||||||
|
sha256 = "1gk94ghjrxfqnx53hph1j2s7qcv86fjz48is7l099q9c24rjv8ky";
|
||||||
};
|
};
|
||||||
|
|
||||||
postPatch = ''
|
postPatch = ''
|
||||||
sed -i -e 's|"multipath"|"${multipath_tools}/sbin/multipath"|' \
|
sed -i \
|
||||||
blivet/devicelibs/mpath.py blivet/devices.py
|
-e 's|"multipath"|"${multipath_tools}/sbin/multipath"|' \
|
||||||
|
-e '/^def set_friendly_names/a \ return False' \
|
||||||
|
blivet/devicelibs/mpath.py
|
||||||
sed -i -e '/"wipefs"/ {
|
sed -i -e '/"wipefs"/ {
|
||||||
s|wipefs|${utillinux}/sbin/wipefs|
|
s|wipefs|${utillinux}/sbin/wipefs|
|
||||||
s/-f/--force/
|
s/-f/--force/
|
||||||
}' blivet/formats/__init__.py
|
}' blivet/formats/__init__.py
|
||||||
sed -i -e 's|"lsof"|"${lsof}/bin/lsof"|' blivet/formats/fs.py
|
sed -i -e 's|"lsof"|"${lsof}/bin/lsof"|' blivet/formats/fs.py
|
||||||
sed -i -r -e 's|"(u?mount)"|"${utillinux}/bin/\1"|' blivet/util.py
|
sed -i -r -e 's|"(u?mount)"|"${utillinux}/bin/\1"|' blivet/util.py
|
||||||
sed -i '/pvscan/s/, *"--cache"//' blivet/devicelibs/lvm.py
|
sed -i -e '/pvscan/s/, *"--cache"//' blivet/devicelibs/lvm.py
|
||||||
'' + (if useNixUdev then ''
|
'';
|
||||||
sed -i -e '/find_library/,/find_library/ {
|
|
||||||
c libudev = "${udev}/lib/libudev.so.1"
|
|
||||||
}' blivet/pyudev.py
|
|
||||||
'' else ''
|
|
||||||
sed -i \
|
|
||||||
-e '/^somajor *=/s/=.*/= ${toString udevSoMajor}/p' \
|
|
||||||
-e 's|common =.*|& + ["/lib/x86_64-linux-gnu", "/lib/i686-linux-gnu"]|' \
|
|
||||||
blivet/pyudev.py
|
|
||||||
'');
|
|
||||||
|
|
||||||
propagatedBuildInputs = [
|
propagatedBuildInputs = [
|
||||||
pykickstart pyparted pyblock selinuxWithPython cryptsetupWithPython
|
pykickstart pyparted pyblock pyudev selinuxWithPython cryptsetupWithPython
|
||||||
] ++ stdenv.lib.optional useNixUdev udev;
|
six
|
||||||
|
];
|
||||||
|
|
||||||
# tests are currently _heavily_ broken upstream
|
# Tests are in <nixos/tests/blivet.nix>.
|
||||||
doCheck = false;
|
doCheck = false;
|
||||||
|
|
||||||
meta = {
|
meta = {
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
{ stdenv, fetchurl, attr, acl, zlib, libuuid, e2fsprogs, lzo
|
{ stdenv, fetchurl, attr, acl, zlib, libuuid, e2fsprogs, lzo
|
||||||
, asciidoc, xmlto, docbook_xml_dtd_45, docbook_xsl, libxslt }:
|
, asciidoc, xmlto, docbook_xml_dtd_45, docbook_xsl, libxslt }:
|
||||||
|
|
||||||
let version = "3.16.2"; in
|
let version = "3.17"; in
|
||||||
|
|
||||||
stdenv.mkDerivation rec {
|
stdenv.mkDerivation rec {
|
||||||
name = "btrfs-progs-${version}";
|
name = "btrfs-progs-${version}";
|
||||||
|
|
||||||
src = fetchurl {
|
src = fetchurl {
|
||||||
url = "mirror://kernel/linux/kernel/people/kdave/btrfs-progs/btrfs-progs-v${version}.tar.xz";
|
url = "mirror://kernel/linux/kernel/people/kdave/btrfs-progs/btrfs-progs-v${version}.tar.xz";
|
||||||
sha256 = "0avk8x0k91zrqvlbk8r067aw49byr8hvvr4niy48d3ib1jz2mmnl";
|
sha256 = "187hdfh10hrabvldqmhg88wdv0s9r7hc5264v83ykir9wxqvzbzc";
|
||||||
};
|
};
|
||||||
|
|
||||||
buildInputs = [
|
buildInputs = [
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
{ stdenv, fetchurl, buildPythonPackage, pykickstart, pyparted, pyblock
|
||||||
|
, libselinux, cryptsetup, multipath_tools, lsof, utillinux
|
||||||
|
, useNixUdev ? true, udev ? null
|
||||||
|
# This is only used when useNixUdev is false
|
||||||
|
, udevSoMajor ? 1
|
||||||
|
}:
|
||||||
|
|
||||||
|
assert useNixUdev -> udev != null;
|
||||||
|
|
||||||
|
buildPythonPackage rec {
|
||||||
|
name = "blivet-${version}";
|
||||||
|
version = "0.17-1";
|
||||||
|
|
||||||
|
src = fetchurl {
|
||||||
|
url = "https://git.fedorahosted.org/cgit/blivet.git/snapshot/"
|
||||||
|
+ "${name}.tar.bz2";
|
||||||
|
sha256 = "1k3mws2q0ryb7422mml6idmaasz2i2v6ngyvg6d976dx090qnmci";
|
||||||
|
};
|
||||||
|
|
||||||
|
postPatch = ''
|
||||||
|
sed -i -e 's|"multipath"|"${multipath_tools}/sbin/multipath"|' \
|
||||||
|
blivet/devicelibs/mpath.py blivet/devices.py
|
||||||
|
sed -i -e '/"wipefs"/ {
|
||||||
|
s|wipefs|${utillinux}/sbin/wipefs|
|
||||||
|
s/-f/--force/
|
||||||
|
}' blivet/formats/__init__.py
|
||||||
|
sed -i -e 's|"lsof"|"${lsof}/bin/lsof"|' blivet/formats/fs.py
|
||||||
|
sed -i -r -e 's|"(u?mount)"|"${utillinux}/bin/\1"|' blivet/util.py
|
||||||
|
sed -i '/pvscan/s/, *"--cache"//' blivet/devicelibs/lvm.py
|
||||||
|
'' + (if useNixUdev then ''
|
||||||
|
sed -i -e '/find_library/,/find_library/ {
|
||||||
|
c libudev = "${udev}/lib/libudev.so.1"
|
||||||
|
}' blivet/pyudev.py
|
||||||
|
'' else ''
|
||||||
|
sed -i \
|
||||||
|
-e '/^somajor *=/s/=.*/= ${toString udevSoMajor}/p' \
|
||||||
|
-e 's|common =.*|& + ["/lib/x86_64-linux-gnu", "/lib/i686-linux-gnu"]|' \
|
||||||
|
blivet/pyudev.py
|
||||||
|
'');
|
||||||
|
|
||||||
|
propagatedBuildInputs = [
|
||||||
|
pykickstart pyparted pyblock libselinux cryptsetup
|
||||||
|
] ++ stdenv.lib.optional useNixUdev udev;
|
||||||
|
|
||||||
|
# tests are currently _heavily_ broken upstream
|
||||||
|
doCheck = false;
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
homepage = "https://fedoraproject.org/wiki/Blivet";
|
||||||
|
description = "Module for management of a system's storage configuration";
|
||||||
|
license = [ "GPLv2+" "LGPLv2.1+" ];
|
||||||
|
platforms = stdenv.lib.platforms.linux;
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
{ stdenv, fetchurl, devicemapper, libgcrypt, libuuid, pkgconfig, popt
|
||||||
|
, enablePython ? true, python ? null
|
||||||
|
}:
|
||||||
|
|
||||||
|
assert enablePython -> python != null;
|
||||||
|
|
||||||
|
stdenv.mkDerivation rec {
|
||||||
|
name = "cryptsetup-1.6.3";
|
||||||
|
|
||||||
|
src = fetchurl {
|
||||||
|
url = "http://cryptsetup.googlecode.com/files/${name}.tar.bz2";
|
||||||
|
sha256 = "1n1qk5chyjspbiianrdb55fhb4wl0vfyqz2br05vfb24v4qlgbx2";
|
||||||
|
};
|
||||||
|
|
||||||
|
configureFlags = [ "--enable-cryptsetup-reencrypt" ]
|
||||||
|
++ stdenv.lib.optional enablePython "--enable-python";
|
||||||
|
|
||||||
|
buildInputs = [ devicemapper libgcrypt libuuid pkgconfig popt ]
|
||||||
|
++ stdenv.lib.optional enablePython python;
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
homepage = http://code.google.com/p/cryptsetup/;
|
||||||
|
description = "LUKS for dm-crypt";
|
||||||
|
license = stdenv.lib.licenses.gpl2;
|
||||||
|
maintainers = with stdenv.lib.maintainers; [ viric chaoflow ];
|
||||||
|
platforms = with stdenv.lib.platforms; linux;
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,76 @@
|
||||||
|
{ stdenv, fetchurl, python, buildPythonPackage
|
||||||
|
# Propagated to blivet
|
||||||
|
, useNixUdev ? true, udevSoMajor ? null
|
||||||
|
# Propagated dependencies
|
||||||
|
, pkgs, urlgrabber
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
blivet = import ./blivet.nix {
|
||||||
|
inherit stdenv fetchurl buildPythonPackage;
|
||||||
|
inherit pykickstart pyparted pyblock cryptsetup multipath_tools;
|
||||||
|
inherit useNixUdev udevSoMajor;
|
||||||
|
inherit (pkgs) lsof utillinux udev;
|
||||||
|
libselinux = pkgs.libselinux.override { enablePython = true; };
|
||||||
|
};
|
||||||
|
|
||||||
|
cryptsetup = import ./cryptsetup.nix {
|
||||||
|
inherit stdenv fetchurl python;
|
||||||
|
inherit (pkgs) pkgconfig libgcrypt libuuid popt;
|
||||||
|
devicemapper = lvm2;
|
||||||
|
};
|
||||||
|
|
||||||
|
dmraid = import ./dmraid.nix {
|
||||||
|
inherit stdenv fetchurl;
|
||||||
|
devicemapper = lvm2;
|
||||||
|
};
|
||||||
|
|
||||||
|
lvm2 = import ./lvm2.nix {
|
||||||
|
inherit stdenv fetchurl;
|
||||||
|
inherit (pkgs) pkgconfig utillinux udev coreutils;
|
||||||
|
};
|
||||||
|
|
||||||
|
multipath_tools = import ./multipath-tools.nix {
|
||||||
|
inherit stdenv fetchurl lvm2;
|
||||||
|
inherit (pkgs) readline udev libaio gzip;
|
||||||
|
};
|
||||||
|
|
||||||
|
parted = import ./parted.nix {
|
||||||
|
inherit stdenv fetchurl;
|
||||||
|
inherit (pkgs) utillinux readline libuuid gettext check;
|
||||||
|
devicemapper = lvm2;
|
||||||
|
};
|
||||||
|
|
||||||
|
pyblock = import ./pyblock.nix {
|
||||||
|
inherit stdenv fetchurl python lvm2 dmraid;
|
||||||
|
};
|
||||||
|
|
||||||
|
pykickstart = import ./pykickstart.nix {
|
||||||
|
inherit stdenv fetchurl python buildPythonPackage urlgrabber;
|
||||||
|
};
|
||||||
|
|
||||||
|
pyparted = import ./pyparted.nix {
|
||||||
|
inherit stdenv fetchurl python buildPythonPackage parted;
|
||||||
|
inherit (pkgs) pkgconfig e2fsprogs;
|
||||||
|
};
|
||||||
|
|
||||||
|
in buildPythonPackage rec {
|
||||||
|
name = "nixpart-${version}";
|
||||||
|
version = "0.4.1";
|
||||||
|
|
||||||
|
src = fetchurl {
|
||||||
|
url = "https://github.com/aszlig/nixpart/archive/v${version}.tar.gz";
|
||||||
|
sha256 = "0avwd8p47xy9cydlbjxk8pj8q75zyl68gw2w6fnkk78dcb1a3swp";
|
||||||
|
};
|
||||||
|
|
||||||
|
propagatedBuildInputs = [ blivet ];
|
||||||
|
|
||||||
|
doCheck = false;
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
description = "NixOS storage manager/partitioner";
|
||||||
|
license = stdenv.lib.licenses.gpl2Plus;
|
||||||
|
maintainers = [ stdenv.lib.maintainers.aszlig ];
|
||||||
|
platforms = stdenv.lib.platforms.linux;
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
{ stdenv, fetchurl, devicemapper }:
|
||||||
|
|
||||||
|
stdenv.mkDerivation rec {
|
||||||
|
name = "dmraid-1.0.0.rc15";
|
||||||
|
|
||||||
|
src = fetchurl {
|
||||||
|
url = "http://people.redhat.com/~heinzm/sw/dmraid/src/old/${name}.tar.bz2";
|
||||||
|
sha256 = "01bcaq0sc329ghgj7f182xws7jgjpdc41bvris8fsiprnxc7511h";
|
||||||
|
};
|
||||||
|
|
||||||
|
preConfigure = "cd */";
|
||||||
|
|
||||||
|
buildInputs = [ devicemapper ];
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
description = "Old-style RAID configuration utility";
|
||||||
|
longDescritipn = ''
|
||||||
|
Old RAID configuration utility (still under development, though).
|
||||||
|
It is fully compatible with modern kernels and mdadm recognizes
|
||||||
|
its volumes. May be needed for rescuing an older system or nuking
|
||||||
|
the metadata when reformatting.
|
||||||
|
'';
|
||||||
|
maintainers = [ stdenv.lib.maintainers.raskin ];
|
||||||
|
platforms = stdenv.lib.platforms.linux;
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,58 @@
|
||||||
|
{ stdenv, fetchurl, pkgconfig, udev, utillinux, coreutils }:
|
||||||
|
|
||||||
|
let
|
||||||
|
v = "2.02.106";
|
||||||
|
in
|
||||||
|
|
||||||
|
stdenv.mkDerivation {
|
||||||
|
name = "lvm2-${v}";
|
||||||
|
|
||||||
|
src = fetchurl {
|
||||||
|
url = "ftp://sources.redhat.com/pub/lvm2/releases/LVM2.${v}.tgz";
|
||||||
|
sha256 = "0nr833bl0q4zq52drjxmmpf7bs6kqxwa5kahwwxm9411khkxz0vc";
|
||||||
|
};
|
||||||
|
|
||||||
|
configureFlags =
|
||||||
|
"--disable-readline --enable-udev_rules --enable-udev_sync --enable-pkgconfig --enable-applib";
|
||||||
|
|
||||||
|
buildInputs = [ pkgconfig udev ];
|
||||||
|
|
||||||
|
preConfigure =
|
||||||
|
''
|
||||||
|
substituteInPlace scripts/lvmdump.sh \
|
||||||
|
--replace /usr/bin/tr ${coreutils}/bin/tr
|
||||||
|
substituteInPlace scripts/lvm2_activation_generator_systemd_red_hat.c \
|
||||||
|
--replace /usr/sbin/lvm $out/sbin/lvm \
|
||||||
|
--replace /usr/bin/udevadm ${udev}/bin/udevadm
|
||||||
|
|
||||||
|
sed -i /DEFAULT_SYS_DIR/d Makefile.in
|
||||||
|
sed -i /DEFAULT_PROFILE_DIR/d conf/Makefile.in
|
||||||
|
'';
|
||||||
|
|
||||||
|
enableParallelBuilding = true;
|
||||||
|
|
||||||
|
#patches = [ ./purity.patch ];
|
||||||
|
|
||||||
|
# To prevent make install from failing.
|
||||||
|
preInstall = "installFlags=\"OWNER= GROUP= confdir=$out/etc\"";
|
||||||
|
|
||||||
|
# Install systemd stuff.
|
||||||
|
#installTargets = "install install_systemd_generators install_systemd_units install_tmpfiles_configuration";
|
||||||
|
|
||||||
|
postInstall =
|
||||||
|
''
|
||||||
|
substituteInPlace $out/lib/udev/rules.d/13-dm-disk.rules \
|
||||||
|
--replace $out/sbin/blkid ${utillinux}/sbin/blkid
|
||||||
|
|
||||||
|
# Systemd stuff
|
||||||
|
mkdir -p $out/etc/systemd/system $out/lib/systemd/system-generators
|
||||||
|
cp scripts/blk_availability_systemd_red_hat.service $out/etc/systemd/system
|
||||||
|
cp scripts/lvm2_activation_generator_systemd_red_hat $out/lib/systemd/system-generators
|
||||||
|
'';
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
homepage = http://sourceware.org/lvm2/;
|
||||||
|
descriptions = "Tools to support Logical Volume Management (LVM) on Linux";
|
||||||
|
platforms = stdenv.lib.platforms.linux;
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
{ stdenv, fetchurl, lvm2, libaio, gzip, readline, udev }:
|
||||||
|
|
||||||
|
stdenv.mkDerivation rec {
|
||||||
|
name = "multipath-tools-0.4.9";
|
||||||
|
|
||||||
|
src = fetchurl {
|
||||||
|
url = "http://christophe.varoqui.free.fr/multipath-tools/${name}.tar.bz2";
|
||||||
|
sha256 = "04n7kazp1zrlqfza32phmqla0xkcq4zwn176qff5ida4a60whi4d";
|
||||||
|
};
|
||||||
|
|
||||||
|
sourceRoot = ".";
|
||||||
|
|
||||||
|
buildInputs = [ lvm2 libaio readline ];
|
||||||
|
|
||||||
|
preBuild =
|
||||||
|
''
|
||||||
|
makeFlagsArray=(GZIP="${gzip}/bin/gzip -9 -c" prefix=$out mandir=$out/share/man/man8 man5dir=$out/share/man/man5 LIB=lib)
|
||||||
|
|
||||||
|
substituteInPlace multipath/Makefile --replace /etc $out/etc
|
||||||
|
substituteInPlace kpartx/Makefile --replace /etc $out/etc
|
||||||
|
|
||||||
|
substituteInPlace kpartx/kpartx.rules --replace /sbin/kpartx $out/sbin/kpartx
|
||||||
|
substituteInPlace kpartx/kpartx_id --replace /sbin/dmsetup ${lvm2}/sbin/dmsetup
|
||||||
|
|
||||||
|
substituteInPlace libmultipath/defaults.h --replace /lib/udev/scsi_id ${udev}/lib/udev/scsi_id
|
||||||
|
substituteInPlace libmultipath/hwtable.c --replace /lib/udev/scsi_id ${udev}/lib/udev/scsi_id
|
||||||
|
'';
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
description = "Tools for the Linux multipathing driver";
|
||||||
|
homepage = http://christophe.varoqui.free.fr/;
|
||||||
|
platforms = stdenv.lib.platforms.linux;
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,57 @@
|
||||||
|
{ stdenv, fetchurl, devicemapper, libuuid, gettext, readline
|
||||||
|
, utillinux, check, enableStatic ? false, hurd ? null }:
|
||||||
|
|
||||||
|
stdenv.mkDerivation rec {
|
||||||
|
name = "parted-3.1";
|
||||||
|
|
||||||
|
src = fetchurl {
|
||||||
|
url = "mirror://gnu/parted/${name}.tar.xz";
|
||||||
|
sha256 = "05fa4m1bky9d13hqv91jlnngzlyn7y4rnnyq6d86w0dg3vww372y";
|
||||||
|
};
|
||||||
|
|
||||||
|
buildInputs = [ libuuid ]
|
||||||
|
++ stdenv.lib.optional (readline != null) readline
|
||||||
|
++ stdenv.lib.optional (gettext != null) gettext
|
||||||
|
++ stdenv.lib.optional (devicemapper != null) devicemapper
|
||||||
|
++ stdenv.lib.optional (hurd != null) hurd
|
||||||
|
++ stdenv.lib.optional doCheck check;
|
||||||
|
|
||||||
|
configureFlags =
|
||||||
|
(if (readline != null)
|
||||||
|
then [ "--with-readline" ]
|
||||||
|
else [ "--without-readline" ])
|
||||||
|
++ stdenv.lib.optional (devicemapper == null) "--disable-device-mapper"
|
||||||
|
++ stdenv.lib.optional enableStatic "--enable-static";
|
||||||
|
|
||||||
|
doCheck = true;
|
||||||
|
|
||||||
|
preCheck =
|
||||||
|
stdenv.lib.optionalString doCheck
|
||||||
|
# The `t0400-loop-clobber-infloop.sh' test wants `mkswap'.
|
||||||
|
"export PATH=\"${utillinux}/sbin:$PATH\"";
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
description = "Create, destroy, resize, check, and copy partitions";
|
||||||
|
|
||||||
|
longDescription = ''
|
||||||
|
GNU Parted is an industrial-strength package for creating, destroying,
|
||||||
|
resizing, checking and copying partitions, and the file systems on
|
||||||
|
them. This is useful for creating space for new operating systems,
|
||||||
|
reorganising disk usage, copying data on hard disks and disk imaging.
|
||||||
|
|
||||||
|
It contains a library, libparted, and a command-line frontend, parted,
|
||||||
|
which also serves as a sample implementation and script backend.
|
||||||
|
'';
|
||||||
|
|
||||||
|
homepage = http://www.gnu.org/software/parted/;
|
||||||
|
license = stdenv.lib.licenses.gpl3Plus;
|
||||||
|
|
||||||
|
maintainers = [
|
||||||
|
# Add your name here!
|
||||||
|
stdenv.lib.maintainers.ludo
|
||||||
|
];
|
||||||
|
|
||||||
|
# GNU Parted requires libuuid, which is part of util-linux-ng.
|
||||||
|
platforms = stdenv.lib.platforms.linux;
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
{ stdenv, fetchurl, python, lvm2, dmraid }:
|
||||||
|
|
||||||
|
stdenv.mkDerivation rec {
|
||||||
|
name = "pyblock-${version}";
|
||||||
|
version = "0.53";
|
||||||
|
|
||||||
|
src = fetchurl rec {
|
||||||
|
url = "http://pkgs.fedoraproject.org/repo/pkgs/python-pyblock/"
|
||||||
|
+ "${name}.tar.bz2/${md5}/${name}.tar.bz2";
|
||||||
|
md5 = "f6d33a8362dee358517d0a9e2ebdd044";
|
||||||
|
};
|
||||||
|
|
||||||
|
postPatch = ''
|
||||||
|
sed -i -e 's|/usr/include/python|${python}/include/python|' \
|
||||||
|
-e 's/-Werror *//' -e 's|/usr/|'"$out"'/|' Makefile
|
||||||
|
'';
|
||||||
|
|
||||||
|
buildInputs = [ python lvm2 dmraid ];
|
||||||
|
|
||||||
|
makeFlags = [
|
||||||
|
"USESELINUX=0"
|
||||||
|
"SITELIB=$(out)/lib/${python.libPrefix}/site-packages"
|
||||||
|
];
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
description = "Interface for working with block devices";
|
||||||
|
license = stdenv.lib.licenses.gpl2Plus;
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,30 @@
|
||||||
|
{ stdenv, python, buildPythonPackage, fetchurl, urlgrabber }:
|
||||||
|
|
||||||
|
buildPythonPackage rec {
|
||||||
|
name = "pykickstart-${version}";
|
||||||
|
version = "1.99.39";
|
||||||
|
|
||||||
|
src = fetchurl rec {
|
||||||
|
url = "http://pkgs.fedoraproject.org/repo/pkgs/pykickstart/"
|
||||||
|
+ "${name}.tar.gz/${md5}/${name}.tar.gz";
|
||||||
|
md5 = "d249f60aa89b1b4facd63f776925116d";
|
||||||
|
};
|
||||||
|
|
||||||
|
postPatch = ''
|
||||||
|
sed -i -e "s/for tst in tstList/for tst in sorted(tstList, \
|
||||||
|
key=lambda m: m.__name__)/" tests/baseclass.py
|
||||||
|
'';
|
||||||
|
|
||||||
|
propagatedBuildInputs = [ urlgrabber ];
|
||||||
|
|
||||||
|
checkPhase = ''
|
||||||
|
export PYTHONPATH="$PYTHONPATH:."
|
||||||
|
${python}/bin/${python.executable} tests/baseclass.py -vv
|
||||||
|
'';
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
homepage = "http://fedoraproject.org/wiki/Pykickstart";
|
||||||
|
description = "Read and write Fedora kickstart files";
|
||||||
|
license = stdenv.lib.licenses.gpl2Plus;
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,42 @@
|
||||||
|
{ stdenv, fetchurl, pkgconfig, python, buildPythonPackage, parted, e2fsprogs }:
|
||||||
|
|
||||||
|
buildPythonPackage rec {
|
||||||
|
name = "pyparted-${version}";
|
||||||
|
version = "3.10";
|
||||||
|
|
||||||
|
src = fetchurl {
|
||||||
|
url = "https://fedorahosted.org/releases/p/y/pyparted/${name}.tar.gz";
|
||||||
|
sha256 = "17wq4invmv1nfazaksf59ymqyvgv3i8h4q03ry2az0s9lldyg3dv";
|
||||||
|
};
|
||||||
|
|
||||||
|
postPatch = ''
|
||||||
|
sed -i -e 's|/sbin/mke2fs|${e2fsprogs}&|' tests/baseclass.py
|
||||||
|
sed -i -e '
|
||||||
|
s|e\.path\.startswith("/tmp/temp-device-")|"temp-device-" in e.path|
|
||||||
|
' tests/test__ped_ped.py
|
||||||
|
'' + stdenv.lib.optionalString stdenv.isi686 ''
|
||||||
|
# remove some integers in this test case which overflow on 32bit systems
|
||||||
|
sed -i -r -e '/class *UnitGetSizeTestCase/,/^$/{/[0-9]{11}/d}' \
|
||||||
|
tests/test__ped_ped.py
|
||||||
|
'';
|
||||||
|
|
||||||
|
preConfigure = ''
|
||||||
|
PATH="${parted}/sbin:$PATH"
|
||||||
|
'';
|
||||||
|
|
||||||
|
buildInputs = [ pkgconfig ];
|
||||||
|
|
||||||
|
propagatedBuildInputs = [ parted ];
|
||||||
|
|
||||||
|
checkPhase = ''
|
||||||
|
patchShebangs Makefile
|
||||||
|
make test PYTHON=${python.executable}
|
||||||
|
'';
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
homepage = "https://fedorahosted.org/pyparted/";
|
||||||
|
description = "Python interface for libparted";
|
||||||
|
license = stdenv.lib.licenses.gpl2Plus;
|
||||||
|
platforms = stdenv.lib.platforms.linux;
|
||||||
|
};
|
||||||
|
}
|
|
@ -1,29 +1,21 @@
|
||||||
{ stdenv, fetchurl, buildPythonPackage, blivet
|
{ stdenv, fetchurl, buildPythonPackage, blivet }:
|
||||||
# Propagated to blivet
|
|
||||||
, useNixUdev ? null, udevSoMajor ? null
|
|
||||||
}:
|
|
||||||
|
|
||||||
let
|
buildPythonPackage rec {
|
||||||
blivetOverrides = stdenv.lib.filterAttrs (k: v: v != null) {
|
|
||||||
inherit useNixUdev udevSoMajor;
|
|
||||||
};
|
|
||||||
in buildPythonPackage rec {
|
|
||||||
name = "nixpart-${version}";
|
name = "nixpart-${version}";
|
||||||
version = "0.4.1";
|
version = "1.0.0";
|
||||||
|
|
||||||
src = fetchurl {
|
src = fetchurl {
|
||||||
url = "https://github.com/aszlig/nixpart/archive/v${version}.tar.gz";
|
url = "https://github.com/aszlig/nixpart/archive/v${version}.tar.gz";
|
||||||
sha256 = "0avwd8p47xy9cydlbjxk8pj8q75zyl68gw2w6fnkk78dcb1a3swp";
|
sha256 = "0avwd8p47xy9cydlbjxk8pj8q75zyl68gw2w6fnkk78dcb1a3swp";
|
||||||
};
|
};
|
||||||
|
|
||||||
propagatedBuildInputs = [ (blivet.override blivetOverrides) ];
|
propagatedBuildInputs = [ blivet ];
|
||||||
|
|
||||||
doCheck = false;
|
|
||||||
|
|
||||||
meta = {
|
meta = {
|
||||||
description = "NixOS storage manager/partitioner";
|
description = "NixOS storage manager/partitioner";
|
||||||
license = stdenv.lib.licenses.gpl2Plus;
|
license = stdenv.lib.licenses.gpl2Plus;
|
||||||
maintainers = [ stdenv.lib.maintainers.aszlig ];
|
maintainers = [ stdenv.lib.maintainers.aszlig ];
|
||||||
platforms = stdenv.lib.platforms.linux;
|
platforms = stdenv.lib.platforms.linux;
|
||||||
|
broken = true;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,20 +1,26 @@
|
||||||
{ stdenv, fetchurl, devicemapper, libuuid, gettext, readline
|
{ stdenv, fetchurl, devicemapper, libuuid, gettext, readline, perl, python
|
||||||
, utillinux, check, enableStatic ? false, hurd ? null }:
|
, utillinux, check, enableStatic ? false, hurd ? null }:
|
||||||
|
|
||||||
stdenv.mkDerivation rec {
|
stdenv.mkDerivation rec {
|
||||||
name = "parted-3.1";
|
name = "parted-3.2";
|
||||||
|
|
||||||
src = fetchurl {
|
src = fetchurl {
|
||||||
url = "mirror://gnu/parted/${name}.tar.xz";
|
url = "mirror://gnu/parted/${name}.tar.xz";
|
||||||
sha256 = "05fa4m1bky9d13hqv91jlnngzlyn7y4rnnyq6d86w0dg3vww372y";
|
sha256 = "1r3qpg3bhz37mgvp9chsaa3k0csby3vayfvz8ggsqz194af5i2w5";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
patches = stdenv.lib.optional doCheck ./gpt-unicode-test-fix.patch;
|
||||||
|
|
||||||
|
postPatch = stdenv.lib.optionalString doCheck ''
|
||||||
|
patchShebangs tests
|
||||||
|
'';
|
||||||
|
|
||||||
buildInputs = [ libuuid ]
|
buildInputs = [ libuuid ]
|
||||||
++ stdenv.lib.optional (readline != null) readline
|
++ stdenv.lib.optional (readline != null) readline
|
||||||
++ stdenv.lib.optional (gettext != null) gettext
|
++ stdenv.lib.optional (gettext != null) gettext
|
||||||
++ stdenv.lib.optional (devicemapper != null) devicemapper
|
++ stdenv.lib.optional (devicemapper != null) devicemapper
|
||||||
++ stdenv.lib.optional (hurd != null) hurd
|
++ stdenv.lib.optional (hurd != null) hurd
|
||||||
++ stdenv.lib.optional doCheck check;
|
++ stdenv.lib.optionals doCheck [ check perl python ];
|
||||||
|
|
||||||
configureFlags =
|
configureFlags =
|
||||||
(if (readline != null)
|
(if (readline != null)
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
From Ludo's suggestion at:
|
||||||
|
|
||||||
|
http://debbugs.gnu.org/cgi/bugreport.cgi?msg=8;bug=18258
|
||||||
|
|
||||||
|
diff --git a/tests/.t0251-gpt-unicode.sh.swp b/tests/.t0251-gpt-unicode.sh.swp
|
||||||
|
deleted file mode 100644
|
||||||
|
index b41c337..0000000
|
||||||
|
Binary files a/tests/.t0251-gpt-unicode.sh.swp and /dev/null differ
|
||||||
|
diff --git a/tests/t0251-gpt-unicode.sh b/tests/t0251-gpt-unicode.sh
|
||||||
|
index c845950..fa63a72 100755
|
||||||
|
--- a/tests/t0251-gpt-unicode.sh
|
||||||
|
+++ b/tests/t0251-gpt-unicode.sh
|
||||||
|
@@ -22,7 +22,24 @@ dev=loop-file
|
||||||
|
# create zeroed device
|
||||||
|
truncate -s 10m $dev || fail=1
|
||||||
|
|
||||||
|
-export LC_ALL=C.UTF-8
|
||||||
|
+found_locale=no
|
||||||
|
+for locale in en_US de_DE fr_FR es_ES
|
||||||
|
+do
|
||||||
|
+ LC_ALL="$locale.UTF-8"
|
||||||
|
+ export LC_ALL
|
||||||
|
+
|
||||||
|
+ # In a UTF-8 locale, the string below prints as 4 characters.
|
||||||
|
+ if [ `printf 'foo\341\264\244' | wc -m` -eq 4 ]; then
|
||||||
|
+ found_locale=yes
|
||||||
|
+ break
|
||||||
|
+ fi
|
||||||
|
+done
|
||||||
|
+
|
||||||
|
+if [ "$found_locale" != "yes" ]; then
|
||||||
|
+ echo "no valid UTF-8 locale found; skipping" >&2
|
||||||
|
+ exit 77
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
# create gpt label with named partition
|
||||||
|
part_name=$(printf 'foo\341\264\244')
|
||||||
|
parted -s $dev mklabel gpt mkpart primary ext2 1MiB 2MiB name 1 $part_name > empty 2>&1 || fail=1
|
|
@ -123,7 +123,7 @@ let
|
||||||
|
|
||||||
# This is used for NixOps to make sure we won't break it with the next major
|
# This is used for NixOps to make sure we won't break it with the next major
|
||||||
# version of nixpart.
|
# version of nixpart.
|
||||||
nixpart0 = self.nixpart;
|
nixpart0 = callPackage ../tools/filesystems/nixpart/0.4 { };
|
||||||
|
|
||||||
pitz = callPackage ../applications/misc/pitz { };
|
pitz = callPackage ../applications/misc/pitz { };
|
||||||
|
|
||||||
|
@ -6518,6 +6518,7 @@ let
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
pycapnp = buildPythonPackage rec {
|
pycapnp = buildPythonPackage rec {
|
||||||
name = "pycapnp-0.4.4";
|
name = "pycapnp-0.4.4";
|
||||||
disabled = isPyPy || isPy3k;
|
disabled = isPyPy || isPy3k;
|
||||||
|
@ -6857,6 +6858,17 @@ let
|
||||||
sha256 = "17wq4invmv1nfazaksf59ymqyvgv3i8h4q03ry2az0s9lldyg3dv";
|
sha256 = "17wq4invmv1nfazaksf59ymqyvgv3i8h4q03ry2az0s9lldyg3dv";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
patches = singleton (pkgs.fetchurl {
|
||||||
|
url = "https://www.redhat.com/archives/pyparted-devel/"
|
||||||
|
+ "2014-April/msg00000.html";
|
||||||
|
postFetch = ''
|
||||||
|
sed -i -ne '/<!--X-Body-of-Message-->/,/<!--X-Body-of-Message-End-->/ {
|
||||||
|
s/^<[^>]*>//; /^$/!p
|
||||||
|
}' "$downloadedFile"
|
||||||
|
'';
|
||||||
|
sha256 = "1lakhz3nvx0qacn90bj1nq13zqxphiw4d9dsc44gwa8nj24j2zws";
|
||||||
|
});
|
||||||
|
|
||||||
postPatch = ''
|
postPatch = ''
|
||||||
sed -i -e 's|/sbin/mke2fs|${pkgs.e2fsprogs}&|' tests/baseclass.py
|
sed -i -e 's|/sbin/mke2fs|${pkgs.e2fsprogs}&|' tests/baseclass.py
|
||||||
sed -i -e '
|
sed -i -e '
|
||||||
|
@ -8481,11 +8493,11 @@ let
|
||||||
|
|
||||||
|
|
||||||
six = buildPythonPackage rec {
|
six = buildPythonPackage rec {
|
||||||
name = "six-1.7.3";
|
name = "six-1.8.0";
|
||||||
|
|
||||||
src = pkgs.fetchurl {
|
src = pkgs.fetchurl {
|
||||||
url = "http://pypi.python.org/packages/source/s/six/${name}.tar.gz";
|
url = "http://pypi.python.org/packages/source/s/six/${name}.tar.gz";
|
||||||
md5 = "784c6e5541c3c4952de9c0a966a0a80b";
|
md5 = "1626eb24cc889110c38f7e786ec69885";
|
||||||
};
|
};
|
||||||
|
|
||||||
# error: invalid command 'test'
|
# error: invalid command 'test'
|
||||||
|
|
Loading…
Reference in New Issue