Merge remote-tracking branch 'ni/master'

This commit is contained in:
lassulus 2017-09-19 20:45:15 +02:00
commit d30480f145
10 changed files with 321 additions and 79 deletions

View File

@ -0,0 +1,106 @@
with import <stockholm/lib>;
{ utillinux, writeDash }:
opt-spec: cmd-spec: let
cmd = cmd-spec opts;
cmd-script =
if typeOf cmd == "set"
then "exec ${cmd}"
else cmd;
opts = mapAttrs (name: value: value // rec {
long = value.long or (replaceStrings ["_"] ["-"] name);
ref = value.ref or "\"\$${varname}\"";
switch = value.switch or false;
varname = value.varname or (replaceStrings ["-"] ["_"] name);
}) opt-spec;
# true if b requires a to define its default value
opts-before = a: b:
test ".*[$]${stringAsChars (c: "[${c}]") a.varname}\\>.*" (b.default or "");
opts-list = let
sort-out = toposort opts-before (attrValues opts);
in
if sort-out ? result
then sort-out.result
else throw "toposort output: ${toJSON sort-out}";
wrapper-name =
if typeOf cmd == "set" && cmd ? name
then "${cmd.name}-getopt"
else "getopt-wrapper";
in writeDash wrapper-name ''
set -efu
wrapper_name=${shell.escape wrapper-name}
${concatStringsSep "\n" (mapAttrsToList (name: opt: /* sh */ ''
unset ${opt.varname}
'') opts)}
args=$(${utillinux}/bin/getopt \
-n "$wrapper_name" \
-o "" \
-l ${concatMapStringsSep ","
(opt: opt.long + optionalString (!opt.switch) ":")
(attrValues opts)} \
-s sh \
-- "$@")
if \test $? != 0; then exit 1; fi
eval set -- "$args"
while :; do
case $1 in
${concatStringsSep "\n" (mapAttrsToList (name: opt: /* sh */ ''
--${opt.long})
${if opt.switch then /* sh */ ''
${opt.varname}=true
shift
'' else /* sh */ ''
${opt.varname}=$2
shift 2
''}
;;
'') opts)}
--)
shift
break
esac
done
${concatMapStringsSep "\n"
(opt: /* sh */ ''
if \test "''${${opt.varname}+1}" != 1; then
printf '%s: missing mandatory option '--%s'\n' \
"$wrapper_name" \
${shell.escape opt.long}
error=1
fi
'')
(filter
(x: ! hasAttr "default" x)
(attrValues opts))}
if test "''${error+1}" = 1; then
exit 1
fi
${concatMapStringsSep "\n"
(opt: /* sh */ ''
if \test "''${${opt.varname}+1}" != 1; then
${opt.varname}=${opt.default}
fi
'')
(filter
(hasAttr "default")
opts-list)}
${concatStringsSep "\n" (mapAttrsToList (name: opt: /* sh */ ''
export ${opt.varname}
'') opts)}
${cmd-script}
''

118
shell.nix
View File

@ -6,43 +6,38 @@ let
# high level commands
#
# usage: deploy
# [--force-populate]
# [--quiet]
# [--source=PATH]
# --system=SYSTEM
# [--target=TARGET]
# [--user=USER]
cmds.deploy = pkgs.writeDash "cmds.deploy" ''
cmds.deploy = pkgs.withGetopt {
force-populate = { default = /* sh */ "false"; switch = true; };
quiet = { default = /* sh */ "false"; switch = true; };
source_file = {
default = /* sh */ "$user/1systems/$system/source.nix";
long = "source";
};
system = {};
target.default = /* sh */ "$system";
user.default = /* sh */ "$LOGNAME";
} (opts: pkgs.writeDash "cmds.deploy" ''
set -efu
command=deploy
. ${init.args}
\test -n "''${quiet-}" || quiet=false
\test -n "''${target-}" || target=$system
\test -n "''${user-}" || user=$LOGNAME
\test -n "''${source_file}" || source_file=$user/1systems/$system/source.nix
. ${init.env}
. ${init.proxy}
. ${init.proxy opts}
exec ${utils.deploy}
'';
'');
# usage: install
# [--force-populate]
# [--quiet]
# [--source=PATH]
# --system=SYSTEM
# --target=TARGET
# [--user=USER]
cmds.install = pkgs.writeBash "cmds.install" ''
cmds.install = pkgs.withGetopt {
force-populate = { default = /* sh */ "false"; switch = true; };
quiet = { default = /* sh */ "false"; switch = true; };
source_file = {
default = /* sh */ "$user/1systems/$system/source.nix";
long = "source";
};
system = {};
target = {};
user.default = /* sh */ "$LOGNAME";
} (opts: pkgs.writeBash "cmds.install" ''
set -efu
command=install
. ${init.args}
\test -n "''${quiet-}" || quiet=false
\test -n "''${user-}" || user=$LOGNAME
\test -n "''${source_file}" || source_file=$user/1systems/$system/source.nix
. ${init.env}
if \test "''${using_proxy-}" != true; then
@ -55,7 +50,7 @@ let
# TODO inline prepare.sh?
fi
. ${init.proxy}
. ${init.proxy opts}
# Reset PATH because we need access to nixos-install.
# TODO provide nixos-install instead of relying on prepare.sh
@ -75,30 +70,28 @@ let
cd
exec nixos-install
'';
'');
# usage: test
# [--force-populate]
# [--quiet]
# [--source=PATH]
# --system=SYSTEM
# --target=TARGET
# [--user=USER]
cmds.test = pkgs.writeDash "cmds.test" /* sh */ ''
cmds.test = pkgs.withGetopt {
force-populate = { default = /* sh */ "false"; switch = true; };
quiet = { default = /* sh */ "false"; switch = true; };
source_file = {
default = /* sh */ "$user/1systems/$system/source.nix";
long = "source";
};
system = {};
target = {};
user.default = /* sh */ "$LOGNAME";
} (opts: pkgs.writeDash "cmds.test" /* sh */ ''
set -efu
export dummy_secrets=true
command=test
. ${init.args}
\test -n "''${quiet-}" || quiet=false
\test -n "''${user-}" || user=$LOGNAME
\test -n "''${source_file}" || source_file=$user/1systems/$system/source.nix
. ${init.env}
. ${init.proxy}
. ${init.proxy opts}
exec ${utils.build} config.system.build.toplevel
'';
'');
#
# low level commands
@ -163,28 +156,6 @@ let
echo
'';
init.args = pkgs.writeText "init.args" /* sh */ ''
args=$(${pkgs.utillinux}/bin/getopt -n "$command" -s sh \
-o Qs:t:u: \
-l force-populate,quiet,source:,system:,target:,user: \
-- "$@")
if \test $? != 0; then exit 1; fi
eval set -- "$args"
force_populate=false
source_file=
while :; do case $1 in
--force-populate) force_populate=true; shift;;
-Q|--quiet) quiet=true; shift;;
--source) source_file=$2; shift 2;;
-s|--system) system=$2; shift 2;;
-t|--target) target=$2; shift 2;;
-u|--user) user=$2; shift 2;;
--) shift; break;;
esac; done
for arg; do echo "$command: bad argument: $arg" >&2; done
if \test $# != 0; then exit 2; fi
'';
init.env = pkgs.writeText "init.env" /* sh */ ''
export quiet
export system
@ -201,7 +172,7 @@ let
export target_local="$(echo $target_object | ${pkgs.jq}/bin/jq -r .local)"
'';
init.proxy = pkgs.writeText "init.proxy" /* sh */ ''
init.proxy = opts: pkgs.writeText "init.proxy" /* sh */ ''
if \test "''${using_proxy-}" != true; then
source=$(get-source "$source_file")
@ -219,11 +190,12 @@ let
NIX_PATH=$(quote "$target_path") \
STOCKHOLM_VERSION=$(quote "$STOCKHOLM_VERSION") \
nix-shell --run "$(quote "
quiet=$(quote "$quiet") \
system=$(quote "$system") \
target=$(quote "$target") \
${lib.concatStringsSep " " (lib.mapAttrsToList
(name: opt: /* sh */ "${opt.varname}=\$(quote ${opt.ref})")
opts
)} \
using_proxy=true \
$(quote "$command" "$@")
$(quote "$0" "$@")
")"
fi
fi

View File

@ -16,6 +16,7 @@ with import <stockholm/lib>;
<stockholm/tv/2configs/pulse.nix>
<stockholm/tv/2configs/retiolum.nix>
<stockholm/tv/2configs/binary-cache>
<stockholm/tv/2configs/br.nix>
<stockholm/tv/2configs/xserver>
{
environment.systemPackages = with pkgs; [
@ -155,5 +156,10 @@ with import <stockholm/lib>;
# The NixOS release to be compatible with for stateful data such as databases.
system.stateVersion = "15.09";
tv.nixpkgs-overlays = {
krebs = "/home/tv/stockholm/krebs/5pkgs";
tv = "/home/tv/stockholm/tv/5pkgs";
};
virtualisation.virtualbox.host.enable = true;
}

49
tv/2configs/br.nix Normal file
View File

@ -0,0 +1,49 @@
with import <stockholm/lib>;
{ config, pkgs, ... }: {
imports = [
<nixpkgs/nixos/modules/services/hardware/sane_extra_backends/brscan4.nix>
];
krebs.nixpkgs.allowUnfreePredicate = pkg: any (flip hasPrefix pkg.name) [
"brother-udev-rule-type1-"
"brscan4-"
"mfcl2700dnlpr-"
];
hardware.sane = {
enable = true;
brscan4 = {
enable = true;
netDevices = {
bra = {
model = "MFCL2700DN";
ip = "10.23.1.214";
};
};
};
};
services.saned.enable = true;
# usage: scanimage -d "$(find-scanner bra)" --batch --format=tiff --resolution 150 -x 211 -y 298
environment.systemPackages = [
(pkgs.writeDashBin "find-scanner" ''
set -efu
name=$1
${pkgs.sane-backends}/bin/scanimage -f '%m %d
' \
| ${pkgs.gawk}/bin/awk -v dev="*$name" '$1 == dev { print $2; exit }' \
| ${pkgs.gnugrep}/bin/grep .
'')
];
services.printing = {
enable = true;
drivers = [
pkgs.mfcl2700dncupswrapper
];
};
systemd.services.cups.serviceConfig.PrivateTmp = true;
}

View File

@ -90,11 +90,7 @@ with import <stockholm/lib>;
environment.variables = {
NIX_PATH = mkForce (concatStringsSep ":" [
"secrets=/var/src/stockholm/null"
"nixpkgs-overlays=${pkgs.runCommand "nixpkgs-overlays" {} ''
mkdir $out
ln -s /home/tv/stockholm/krebs/5pkgs $out/krebs
ln -s /home/tv/stockholm/tv/5pkgs $out/tv
''}"
"nixpkgs-overlays=${config.tv.nixpkgs-overlays}"
"/var/src"
]);
};

View File

@ -52,7 +52,7 @@ in {
systemd.services.charybdis = {
wantedBy = [ "multi-user.target" ];
requires = [ "secret.service" ];
after = [ "network.target" "secret.service" ];
after = [ "network-online.target" "secret.service" ];
environment = {
BANDB_DBPATH = "${cfg.user.home}/ban.db";
};

View File

@ -6,6 +6,7 @@ _:
./ejabberd
./hosts.nix
./iptables.nix
./nixpkgs-overlays.nix
./x0vncserver.nix
];
}

View File

@ -0,0 +1,23 @@
with import <stockholm/lib>;
{ config, pkgs, ... }: {
options.tv.nixpkgs-overlays = mkOption {
apply = src:
pkgs.runCommand "nixpkgs-overlays" {} ''
mkdir $out
${concatStringsSep "\n" (mapAttrsToList (name: path:
"ln -s ${shell.escape path} $out/${shell.escape name}"
) src)}
'' // {
inherit src;
};
type = types.attrsOf types.absolute-pathname;
};
config = {
tv.nixpkgs-overlays = {
krebs = mkDefault "/var/src/stockholm/krebs/5pkgs";
tv = mkDefault "/var/src/stockholm/tv/5pkgs";
};
};
}

View File

@ -0,0 +1,45 @@
{ coreutils, dpkg, fetchurl, gnugrep, gnused, makeWrapper, mfcl2700dnlpr,
perl, stdenv }:
stdenv.mkDerivation rec {
name = "mfcl2700dncupswrapper-${meta.version}";
src = fetchurl {
url = "http://download.brother.com/welcome/dlf102086/${name}.i386.deb";
sha256 = "07w48mah0xbv4h8vsh1qd5cd4b463bx8y6gc5x9pfgsxsy6h6da1";
};
nativeBuildInputs = [ dpkg makeWrapper ];
phases = [ "installPhase" ];
installPhase = ''
dpkg-deb -x $src $out
basedir=${mfcl2700dnlpr}/opt/brother/Printers/MFCL2700DN
dir=$out/opt/brother/Printers/MFCL2700DN
substituteInPlace $dir/cupswrapper/brother_lpdwrapper_MFCL2700DN \
--replace /usr/bin/perl ${perl}/bin/perl \
--replace "basedir =~" "basedir = \"$basedir\"; #" \
--replace "PRINTER =~" "PRINTER = \"MFCL2700DN\"; #"
wrapProgram $dir/cupswrapper/brother_lpdwrapper_MFCL2700DN \
--prefix PATH : ${stdenv.lib.makeBinPath [ coreutils gnugrep gnused ]}
mkdir -p $out/lib/cups/filter
mkdir -p $out/share/cups/model
ln $dir/cupswrapper/brother_lpdwrapper_MFCL2700DN $out/lib/cups/filter
ln $dir/cupswrapper/brother-MFCL2700DN-cups-en.ppd $out/share/cups/model
'';
meta = {
description = "Brother MFC-L2700DN CUPS wrapper driver";
homepage = "http://www.brother.com/";
license = stdenv.lib.licenses.gpl2Plus;
maintainers = [ stdenv.lib.maintainers.tv ];
platforms = stdenv.lib.platforms.linux;
version = "3.2.0-1";
};
}

View File

@ -0,0 +1,44 @@
{ coreutils, dpkg, fetchurl, ghostscript, gnugrep, gnused, pkgsi686Linux, makeWrapper, perl, stdenv, which }:
stdenv.mkDerivation rec {
name = "mfcl2700dnlpr-${meta.version}";
src = fetchurl {
url = "http://download.brother.com/welcome/dlf102085/${name}.i386.deb";
sha256 = "170qdzxlqikzvv2wphvfb37m19mn13az4aj88md87ka3rl5knk4m";
};
nativeBuildInputs = [ dpkg makeWrapper ];
phases = [ "installPhase" ];
installPhase = ''
dpkg-deb -x $src $out
dir=$out/opt/brother/Printers/MFCL2700DN
substituteInPlace $dir/lpd/filter_MFCL2700DN \
--replace /usr/bin/perl ${perl}/bin/perl \
--replace "BR_PRT_PATH =~" "BR_PRT_PATH = \"$dir\"; #" \
--replace "PRINTER =~" "PRINTER = \"MFCL2700DN\"; #"
wrapProgram $dir/lpd/filter_MFCL2700DN \
--prefix PATH : ${stdenv.lib.makeBinPath [
coreutils ghostscript gnugrep gnused which
]}
interpreter=${pkgsi686Linux.stdenv.cc.libc.out}/lib/ld-linux.so.2
patchelf --set-interpreter "$interpreter" $dir/inf/braddprinter
patchelf --set-interpreter "$interpreter" $dir/lpd/brprintconflsr3
patchelf --set-interpreter "$interpreter" $dir/lpd/rawtobr3
'';
meta = {
description = "Brother MFC-L2700DN LPR driver";
homepage = "http://www.brother.com/";
license = stdenv.lib.licenses.unfree;
maintainers = [ stdenv.lib.maintainers.tv ];
platforms = stdenv.lib.platforms.linux;
version = "3.2.0-1";
};
}