commit
24d0bd37b5
@ -1,37 +0,0 @@ |
||||
<section xmlns="http://docbook.org/ns/docbook" |
||||
version="5.0" |
||||
xml:id="sec-installing-nspawn-container"> |
||||
<title>Installing into a nspawn container</title> |
||||
|
||||
<para> |
||||
For installing a NixOS into a systemd nspawn container the NixOS installation tools are needed. |
||||
If you run another distribution than NixOS on your host, |
||||
please follow <xref linkend="sec-installing-from-other-distro"/> steps 1, 2, and 3. |
||||
</para> |
||||
|
||||
<para> |
||||
Create a NixOS configuration file <filename>/var/lib/machines/my-container/etc/nixos/configuration.nix</filename>. |
||||
It is important that the container root file system is under <filename>/var/lib/machines</filename>. |
||||
This is the standard location where <command>machinectl</command> will look for containers. |
||||
If you choose place the root into another location you need to start the container directly with <command>systemd-nspawn</command>. |
||||
The file needs to have at least following options enabled: |
||||
<programlisting> |
||||
<xref linkend="opt-boot.isContainer"/> = true; |
||||
<xref linkend="opt-boot.loader.initScript.enable"/> = true; |
||||
</programlisting> |
||||
If your host uses <command>systemd-networkd</command> to configure the network, |
||||
you can also enable <xref linkend="opt-networking.useNetworkd"/> to use networkd default network configuration for your host and container. |
||||
</para> |
||||
|
||||
<para> |
||||
Install the container by running following command: |
||||
<screen>nixos-install --root /var/lib/machines/my-container \ |
||||
--no-channel-copy --no-root-passwd --no-bootloader</screen> |
||||
</para> |
||||
|
||||
<para> |
||||
Start the container by running following command: |
||||
<screen>machinectl start my-container</screen> |
||||
</para> |
||||
|
||||
</section> |
@ -1,6 +1,6 @@ |
||||
{ |
||||
x86_64-linux = "/nix/store/3ds3cgji9vjxdbgp10av6smyym1126d1-nix-2.3"; |
||||
i686-linux = "/nix/store/ln1ndqvfpc9cdl03vqxi6kvlxm9wfv9g-nix-2.3"; |
||||
aarch64-linux = "/nix/store/n8a1rwzrp20qcr2c4hvyn6c5q9zx8csw-nix-2.3"; |
||||
x86_64-darwin = "/nix/store/jq6npmpld02sz4rgniz0qrsdfnm6j17a-nix-2.3"; |
||||
x86_64-linux = "/nix/store/6chjfy4j6hjwj5f8zcbbdg02i21x1qsi-nix-2.3.1"; |
||||
i686-linux = "/nix/store/xa8z7fwszjjm4kiwrxfc8xv9c1pzzm7a-nix-2.3.1"; |
||||
aarch64-linux = "/nix/store/8cac1ivcnchlpzmdjby2f71l1fwpnymr-nix-2.3.1"; |
||||
x86_64-darwin = "/nix/store/6639l9815ggdnb4aka22qcjy7p8w4hb9-nix-2.3.1"; |
||||
} |
||||
|
@ -1,54 +0,0 @@ |
||||
# This module defines a standard configuration for NixOS shells. |
||||
|
||||
{ config, lib, ... }: |
||||
|
||||
with lib; |
||||
|
||||
{ |
||||
|
||||
config = { |
||||
|
||||
environment.shellInit = |
||||
'' |
||||
# Set up the per-user profile. |
||||
mkdir -m 0755 -p "$NIX_USER_PROFILE_DIR" |
||||
if [ "$(stat -c '%u' "$NIX_USER_PROFILE_DIR")" != "$(id -u)" ]; then |
||||
echo "WARNING: the per-user profile dir $NIX_USER_PROFILE_DIR should belong to user id $(id -u)" >&2 |
||||
fi |
||||
|
||||
if [ -w "$HOME" ]; then |
||||
if ! [ -L "$HOME/.nix-profile" ]; then |
||||
if [ "$USER" != root ]; then |
||||
ln -s "$NIX_USER_PROFILE_DIR/profile" "$HOME/.nix-profile" |
||||
else |
||||
# Root installs in the system-wide profile by default. |
||||
ln -s /nix/var/nix/profiles/default "$HOME/.nix-profile" |
||||
fi |
||||
fi |
||||
|
||||
# Subscribe the root user to the NixOS channel by default. |
||||
if [ "$USER" = root -a ! -e "$HOME/.nix-channels" ]; then |
||||
echo "${config.system.defaultChannel} nixos" > "$HOME/.nix-channels" |
||||
fi |
||||
|
||||
# Create the per-user garbage collector roots directory. |
||||
NIX_USER_GCROOTS_DIR="/nix/var/nix/gcroots/per-user/$USER" |
||||
mkdir -m 0755 -p "$NIX_USER_GCROOTS_DIR" |
||||
if [ "$(stat -c '%u' "$NIX_USER_GCROOTS_DIR")" != "$(id -u)" ]; then |
||||
echo "WARNING: the per-user gcroots dir $NIX_USER_GCROOTS_DIR should belong to user id $(id -u)" >&2 |
||||
fi |
||||
|
||||
# Set up a default Nix expression from which to install stuff. |
||||
if [ ! -e "$HOME/.nix-defexpr" -o -L "$HOME/.nix-defexpr" ]; then |
||||
rm -f "$HOME/.nix-defexpr" |
||||
mkdir -p "$HOME/.nix-defexpr" |
||||
if [ "$USER" != root ]; then |
||||
ln -s /nix/var/nix/profiles/per-user/root/channels "$HOME/.nix-defexpr/channels_root" |
||||
fi |
||||
fi |
||||
fi |
||||
''; |
||||
|
||||
}; |
||||
|
||||
} |
@ -0,0 +1,58 @@ |
||||
{ config, lib, pkgs, options }: |
||||
|
||||
with lib; |
||||
|
||||
let |
||||
cfg = config.services.prometheus.exporters.nextcloud; |
||||
in |
||||
{ |
||||
port = 9205; |
||||
extraOpts = { |
||||
url = mkOption { |
||||
type = types.str; |
||||
example = "https://domain.tld"; |
||||
description = '' |
||||
URL to the Nextcloud serverinfo page. |
||||
Adding the path to the serverinfo API is optional, it defaults |
||||
to <literal>/ocs/v2.php/apps/serverinfo/api/v1/info</literal>. |
||||
''; |
||||
}; |
||||
username = mkOption { |
||||
type = types.str; |
||||
default = "nextcloud-exporter"; |
||||
description = '' |
||||
Username for connecting to Nextcloud. |
||||
Note that this account needs to have admin privileges in Nextcloud. |
||||
''; |
||||
}; |
||||
passwordFile = mkOption { |
||||
type = types.path; |
||||
example = "/path/to/password-file"; |
||||
description = '' |
||||
File containing the password for connecting to Nextcloud. |
||||
Make sure that this file is readable by the exporter user. |
||||
''; |
||||
}; |
||||
timeout = mkOption { |
||||
type = types.str; |
||||
default = "5s"; |
||||
description = '' |
||||
Timeout for getting server info document. |
||||
''; |
||||
}; |
||||
}; |
||||
serviceOpts = { |
||||
serviceConfig = { |
||||
DynamicUser = false; |
||||
ExecStart = '' |
||||
${pkgs.prometheus-nextcloud-exporter}/bin/nextcloud-exporter \ |
||||
-a ${cfg.listenAddress}:${toString cfg.port} \ |
||||
-u ${cfg.username} \ |
||||
-t ${cfg.timeout} \ |
||||
-l ${cfg.url} \ |
||||
-p @${cfg.passwordFile} \ |
||||
${concatStringsSep " \\\n " cfg.extraFlags} |
||||
''; |
||||
}; |
||||
}; |
||||
} |
@ -0,0 +1,50 @@ |
||||
{ config, lib, pkgs, ... }: |
||||
|
||||
with lib; |
||||
let |
||||
cfg = config.services.shiori; |
||||
in { |
||||
options = { |
||||
services.shiori = { |
||||
enable = mkEnableOption "Shiori simple bookmarks manager"; |
||||
|
||||
package = mkOption { |
||||
type = types.package; |
||||
default = pkgs.shiori; |
||||
defaultText = "pkgs.shiori"; |
||||
description = "The Shiori package to use."; |
||||
}; |
||||
|
||||
address = mkOption { |
||||
type = types.str; |
||||
default = ""; |
||||
description = '' |
||||
The IP address on which Shiori will listen. |
||||
If empty, listens on all interfaces. |
||||
''; |
||||
}; |
||||
|
||||
port = mkOption { |
||||
type = types.port; |
||||
default = 8080; |
||||
description = "The port of the Shiori web application"; |
||||
}; |
||||
}; |
||||
}; |
||||
|
||||
config = mkIf cfg.enable { |
||||
systemd.services.shiori = with cfg; { |
||||
description = "Shiori simple bookmarks manager"; |
||||
wantedBy = [ "multi-user.target" ]; |
||||
|
||||
serviceConfig = { |
||||
ExecStart = "${package}/bin/shiori serve --address '${address}' --port '${toString port}'"; |
||||
DynamicUser = true; |
||||
Environment = "SHIORI_DIR=/var/lib/shiori"; |
||||
StateDirectory = "shiori"; |
||||
}; |
||||
}; |
||||
}; |
||||
|
||||
meta.maintainers = with maintainers; [ minijackson ]; |
||||
} |
@ -0,0 +1,23 @@ |
||||
{ config, lib, pkgs, ... }: |
||||
|
||||
with lib; |
||||
|
||||
let |
||||
cfg = config.services.xserver.windowManager.cwm; |
||||
in |
||||
{ |
||||
options = { |
||||
services.xserver.windowManager.cwm.enable = mkEnableOption "cwm"; |
||||
}; |
||||
config = mkIf cfg.enable { |
||||
services.xserver.windowManager.session = singleton |
||||
{ name = "cwm"; |
||||
start = |
||||
'' |
||||
cwm & |
||||
waitPID=$! |
||||
''; |
||||
}; |
||||
environment.systemPackages = [ pkgs.cwm ]; |
||||
}; |
||||
} |
@ -0,0 +1,148 @@ |
||||
|
||||
import ./make-test.nix ({ pkgs, lib, ...} : { |
||||
name = "babeld"; |
||||
meta = with pkgs.stdenv.lib.maintainers; { |
||||
maintainers = [ hexa ]; |
||||
}; |
||||
|
||||
nodes = |
||||
{ client = { pkgs, lib, ... }: |
||||
{ |
||||
virtualisation.vlans = [ 10 ]; |
||||
|
||||
networking = { |
||||
useDHCP = false; |
||||
interfaces."eth1" = { |
||||
ipv4.addresses = lib.mkForce [ { address = "192.168.10.2"; prefixLength = 24; } ]; |
||||
ipv4.routes = lib.mkForce [ { address = "0.0.0.0"; prefixLength = 0; via = "192.168.10.1"; } ]; |
||||
ipv6.addresses = lib.mkForce [ { address = "2001:db8:10::2"; prefixLength = 64; } ]; |
||||
ipv6.routes = lib.mkForce [ { address = "::"; prefixLength = 0; via = "2001:db8:10::1"; } ]; |
||||
}; |
||||
}; |
||||
}; |
||||
|
||||
localRouter = { pkgs, lib, ... }: |
||||
{ |
||||
virtualisation.vlans = [ 10 20 ]; |
||||
|
||||
boot.kernel.sysctl."net.ipv4.conf.all.forwarding" = 1; |
||||
boot.kernel.sysctl."net.ipv6.conf.all.forwarding" = 1; |
||||
|
||||
networking = { |
||||
useDHCP = false; |
||||
firewall.enable = false; |
||||
|
||||
interfaces."eth1" = { |
||||
ipv4.addresses = lib.mkForce [ { address = "192.168.10.1"; prefixLength = 24; } ]; |
||||
ipv6.addresses = lib.mkForce [ { address = "2001:db8:10::1"; prefixLength = 64; } ]; |
||||
}; |
||||
|
||||
interfaces."eth2" = { |
||||
ipv4.addresses = lib.mkForce [ { address = "192.168.20.1"; prefixLength = 24; } ]; |
||||
ipv6.addresses = lib.mkForce [ { address = "2001:db8:20::1"; prefixLength = 64; } ]; |
||||
}; |
||||
}; |
||||
|
||||
services.babeld = { |
||||
enable = true; |
||||
interfaces.eth2 = { |
||||
hello-interval = 1; |
||||
type = "wired"; |
||||
}; |
||||
extraConfig = '' |
||||
local-port-readwrite 33123 |
||||
|
||||
import-table 254 # main |
||||
export-table 254 # main |
||||
|
||||
in ip 192.168.10.0/24 deny |
||||
in ip 192.168.20.0/24 deny |
||||
in ip 2001:db8:10::/64 deny |
||||
in ip 2001:db8:20::/64 deny |
||||
|
||||
in ip 192.168.30.0/24 allow |
||||
in ip 2001:db8:30::/64 allow |
||||
|
||||
in deny |
||||
|
||||
redistribute local proto 2 |
||||
redistribute local deny |
||||
''; |
||||
}; |
||||
}; |
||||
remoteRouter = { pkgs, lib, ... }: |
||||
{ |
||||
virtualisation.vlans = [ 20 30 ]; |
||||
|
||||
boot.kernel.sysctl."net.ipv4.conf.all.forwarding" = 1; |
||||
boot.kernel.sysctl."net.ipv6.conf.all.forwarding" = 1; |
||||
|
||||
networking = { |
||||
useDHCP = false; |
||||
firewall.enable = false; |
||||
|
||||
interfaces."eth1" = { |
||||
ipv4.addresses = lib.mkForce [ { address = "192.168.20.2"; prefixLength = 24; } ]; |
||||
ipv6.addresses = lib.mkForce [ { address = "2001:db8:20::2"; prefixLength = 64; } ]; |
||||
}; |
||||
|
||||
interfaces."eth2" = { |
||||
ipv4.addresses = lib.mkForce [ { address = "192.168.30.1"; prefixLength = 24; } ]; |
||||
ipv6.addresses = lib.mkForce [ { address = "2001:db8:30::1"; prefixLength = 64; } ]; |
||||
}; |
||||
}; |
||||
|
||||
services.babeld = { |
||||
enable = true; |
||||
interfaces.eth1 = { |
||||
hello-interval = 1; |
||||
type = "wired"; |
||||
}; |
||||
extraConfig = '' |
||||
local-port-readwrite 33123 |
||||
|
||||
import-table 254 # main |
||||
export-table 254 # main |
||||
|
||||
in ip 192.168.20.0/24 deny |
||||
in ip 192.168.30.0/24 deny |
||||
in ip 2001:db8:20::/64 deny |
||||
in ip 2001:db8:30::/64 deny |
||||
|
||||
in ip 192.168.10.0/24 allow |
||||
in ip 2001:db8:10::/64 allow |
||||
|
||||
in deny |
||||
|
||||
redistribute local proto 2 |
||||
redistribute local deny |
||||
''; |
||||
}; |
||||
|
||||
}; |
||||
}; |
||||
|
||||
testScript = |
||||
'' |
||||
startAll; |
||||
|
||||
$client->waitForUnit("network-online.target"); |
||||
$localRouter->waitForUnit("network-online.target"); |
||||
$remoteRouter->waitForUnit("network-online.target"); |
||||
|
||||
$localRouter->waitForUnit("babeld.service"); |
||||
$remoteRouter->waitForUnit("babeld.service"); |
||||
|
||||
$localRouter->waitUntilSucceeds("ip route get 192.168.30.1"); |
||||
$localRouter->waitUntilSucceeds("ip route get 2001:db8:30::1"); |
||||
|
||||
$remoteRouter->waitUntilSucceeds("ip route get 192.168.10.1"); |
||||
$remoteRouter->waitUntilSucceeds("ip route get 2001:db8:10::1"); |
||||
|
||||
$client->succeed("ping -c1 192.168.30.1"); |
||||
$client->succeed("ping -c1 2001:db8:30::1"); |
||||
|
||||
$remoteRouter->succeed("ping -c1 192.168.10.2"); |
||||
$remoteRouter->succeed("ping -c1 2001:db8:10::2"); |
||||
''; |
||||
}) |
@ -0,0 +1,82 @@ |
||||
import ./make-test.nix ({ pkgs, ... }: { |
||||
name = "caddy"; |
||||
meta = with pkgs.stdenv.lib.maintainers; { |
||||
maintainers = [ xfix ]; |
||||
}; |
||||
|
||||
nodes = { |
||||
webserver = { pkgs, lib, ... }: { |
||||
services.caddy.enable = true; |
||||
services.caddy.config = '' |
||||
http://localhost { |
||||
gzip |
||||
|
||||
root ${ |
||||
pkgs.runCommand "testdir" {} '' |
||||
mkdir "$out" |
||||
echo hello world > "$out/example.html" |
||||
'' |
||||
} |
||||
} |
||||
''; |
||||
|
||||
nesting.clone = [ |
||||
{ |
||||
services.caddy.config = lib.mkForce '' |
||||
http://localhost { |
||||
gzip |
||||
|
||||
root ${ |
||||
pkgs.runCommand "testdir2" {} '' |
||||
mkdir "$out" |
||||
echo changed > "$out/example.html" |
||||
'' |
||||
} |
||||
} |
||||
''; |
||||
} |
||||
|
||||
{ |
||||
services.caddy.config = '' |
||||
http://localhost:8080 { |
||||
} |
||||
''; |
||||
} |
||||
]; |
||||
}; |
||||
}; |
||||
|
||||
testScript = { nodes, ... }: let |
||||
etagSystem = "${nodes.webserver.config.system.build.toplevel}/fine-tune/child-1"; |
||||
justReloadSystem = "${nodes.webserver.config.system.build.toplevel}/fine-tune/child-2"; |
||||
in '' |
||||
my $url = 'http://localhost/example.html'; |
||||
$webserver->waitForUnit("caddy"); |
||||
$webserver->waitForOpenPort("80"); |
||||
|
||||
sub checkEtag { |
||||
my $etag = $webserver->succeed( |
||||
'curl -v '.$url.' 2>&1 | sed -n -e "s/^< [Ee][Tt][Aa][Gg]: *//p"' |
||||
); |
||||
$etag =~ s/\r?\n$//; |
||||
my $httpCode = $webserver->succeed( |
||||
'curl -w "%{http_code}" -X HEAD -H \'If-None-Match: '.$etag.'\' '.$url |
||||
); |
||||
die "HTTP code is not 304" unless $httpCode == 304; |
||||
return $etag; |
||||
} |
||||
|
||||
subtest "check ETag if serving Nix store paths", sub { |
||||
my $oldEtag = checkEtag; |
||||
$webserver->succeed("${etagSystem}/bin/switch-to-configuration test >&2"); |
||||
$webserver->sleep(1); # race condition |
||||
my $newEtag = checkEtag; |
||||
die "Old ETag $oldEtag is the same as $newEtag" if $oldEtag eq $newEtag; |
||||
}; |
||||
|
||||
subtest "config is reloaded on nixos-rebuild switch", sub { |
||||
$webserver->succeed("${justReloadSystem}/bin/switch-to-configuration test >&2"); |
||||
$webserver->waitForOpenPort("8080"); |
||||
}; |
||||
''; |
||||
}) |
@ -0,0 +1,17 @@ |
||||
import ./make-test.nix ({ lib, ...}: |
||||
|
||||
{ |
||||
name = "shiori"; |
||||
meta.maintainers = with lib.maintainers; [ minijackson ]; |
||||
|
||||
machine = |
||||
{ ... }: |
||||
{ services.shiori.enable = true; }; |
||||
|
||||
testScript = '' |
||||
$machine->waitForUnit('shiori.service'); |
||||
$machine->waitForOpenPort('8080'); |
||||
$machine->succeed("curl --fail http://localhost:8080/"); |
||||
$machine->succeed("curl --fail --location http://localhost:8080/ | grep -qi shiori"); |
||||
''; |
||||
}) |
@ -1,52 +0,0 @@ |
||||
import ./make-test.nix (let |
||||
|
||||
container = { ... }: { |
||||
boot.isContainer = true; |
||||
|
||||
# use networkd to obtain systemd network setup |
||||
networking.useNetworkd = true; |
||||
|
||||
# systemd-nspawn expects /sbin/init |
||||
boot.loader.initScript.enable = true; |
||||
|
||||
imports = [ ../modules/profiles/minimal.nix ]; |
||||
}; |
||||
|
||||
containerSystem = (import ../lib/eval-config.nix { |
||||
modules = [ container ]; |
||||
}).config.system.build.toplevel; |
||||
|
||||
containerName = "container"; |
||||
containerRoot = "/var/lib/machines/${containerName}"; |
||||
|
||||
in { |
||||
name = "systemd-machinectl"; |
||||
|
||||
machine = { lib, ... }: { |
||||
# use networkd to obtain systemd network setup |
||||
networking.useNetworkd = true; |
||||
|
||||
# open DHCP server on interface to container |
||||
networking.firewall.trustedInterfaces = [ "ve-+" ]; |
||||
|
||||
# do not try to access cache.nixos.org |
||||
nix.binaryCaches = lib.mkForce []; |
||||
|
||||
virtualisation.pathsInNixDB = [ containerSystem ]; |
||||
}; |
||||
|
||||
testScript = '' |
||||
startAll; |
||||
|
||||
$machine->waitForUnit("default.target"); |
||||
$machine->succeed("mkdir -p ${containerRoot}"); |
||||
$machine->succeed("nixos-install --root ${containerRoot} --system ${containerSystem} --no-channel-copy --no-root-passwd --no-bootloader"); |
||||
|
||||
$machine->succeed("machinectl start ${containerName}"); |
||||
$machine->waitUntilSucceeds("systemctl -M ${containerName} is-active default.target"); |
||||
$machine->succeed("ping -n -c 1 ${containerName}"); |
||||
$machine->succeed("test `stat ${containerRoot}/var/empty -c %u%g` != 00"); |
||||
|
||||
$machine->succeed("machinectl stop ${containerName}"); |
||||
''; |
||||
}) |
@ -0,0 +1,27 @@ |
||||
{ stdenv, fetchFromGitHub, rustPlatform, pkgconfig, openssl, Security }: |
||||
|
||||
rustPlatform.buildRustPackage rec { |
||||
pname = "spotify-tui"; |
||||
version = "0.5.0"; |
||||
|
||||
src = fetchFromGitHub { |
||||
owner = "Rigellute"; |
||||
repo = "spotify-tui"; |
||||
rev = "v${version}"; |
||||
sha256 = "1spnr67fb2wjjf9sfkk3vps6q45w0zrk47an79bhv4imziy4dbs3"; |
||||
}; |
||||
|
||||
cargoSha256 = "029g80mcqvmckszpbzm4hxs5w63n41ah4rc1b93i9c1nzvncd811"; |
||||
|
||||
nativeBuildInputs = [ pkgconfig ]; |
||||
buildInputs = [ openssl ] |
||||
++ stdenv.lib.optional stdenv.isDarwin Security; |
||||
|
||||
meta = with stdenv.lib; { |
||||
description = "Spotify for the terminal written in Rust"; |
||||
homepage = https://github.com/Rigellute/spotify-tui; |
||||
license = licenses.mit; |
||||
maintainers = with maintainers; [ jwijenbergh ]; |
||||
platforms = platforms.all; |
||||
}; |
||||
} |
@ -1,36 +1,36 @@ |
||||
{ stdenv, fetchFromGitHub, ncurses, texinfo, texlive, perl, ghostscript }: |
||||
|
||||
|
||||
stdenv.mkDerivation rec { |
||||
pname = "ne"; |
||||
version = "3.1.2"; |
||||
version = "3.2.1"; |
||||
|
||||
src = fetchFromGitHub { |
||||
owner = "vigna"; |
||||
repo = "ne"; |
||||
repo = pname; |
||||
rev = version; |
||||
sha256 = "154grh9gdzydnqn9xxj7zpia9cc5x6a7y1g73vwizr9bkg92l5cc"; |
||||
sha256 = "0h6d08cnwrk96ss83i9bragwwanph6x54sm3ak1z81146dsqsiif"; |
||||
}; |
||||
buildInputs = [ ncurses texlive.combined.scheme-medium texinfo perl ghostscript ]; |
||||
dontBuild = true; |
||||
installPhase = '' |
||||
substituteInPlace src/makefile --replace "CC=c99" "cc=gcc" |
||||
substituteInPlace src/makefile --replace "-lcurses" "-lncurses" |
||||
|
||||
postPatch = '' |
||||
substituteInPlace makefile --replace "./version.pl" "perl version.pl" |
||||
cd doc && make && cd .. |
||||
cd src && make && cd .. |
||||
make PREFIX=$out install |
||||
substituteInPlace src/makefile --replace "-lcurses" "-lncurses" |
||||
''; |
||||
|
||||
meta = { |
||||
nativeBuildInputs = [ texlive.combined.scheme-medium texinfo perl ghostscript ]; |
||||
buildInputs = [ ncurses ]; |
||||
|
||||
makeFlags = [ "PREFIX=${placeholder "out"}" ]; |
||||
|
||||
meta = with stdenv.lib; { |
||||
description = "The nice editor"; |
||||
homepage = https://github.com/vigna/ne; |
||||
homepage = "http://ne.di.unimi.it/"; |
||||
longDescription = '' |
||||
ne is a free (GPL'd) text editor based on the POSIX standard that runs |
||||
(we hope) on almost any UN*X machine. ne is easy to use for the beginner, |
||||
but powerful and fully configurable for the wizard, and most sparing in its |
||||
resource usage. See the manual for some highlights of ne's features. |
||||
''; |
||||
license = stdenv.lib.licenses.gpl3; |
||||
platforms = stdenv.lib.platforms.unix; |
||||
license = licenses.gpl3; |
||||
platforms = platforms.unix; |
||||
}; |
||||
} |
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue