···1{ config, lib, pkgs, ... }:
23with lib;
4-5let
6 cfg = config.programs.captive-browser;
7in
···27 # the options below are the same as in "captive-browser.toml"
28 browser = mkOption {
29 type = types.str;
30- default = concatStringsSep " " [ "${pkgs.chromium}/bin/chromium"
31- "--user-data-dir=\${XDG_DATA_HOME:-$HOME/.local/share}/chromium-captive"
32- ''--proxy-server="socks5://$PROXY"''
33- ''--host-resolver-rules="MAP * ~NOTFOUND , EXCLUDE localhost"''
34- "--no-first-run"
35- "--new-window"
36- "--incognito"
37- "http://cache.nixos.org/"
38- ];
0039 description = ''
40 The shell (/bin/sh) command executed once the proxy starts.
41 When browser exits, the proxy exits. An extra env var PROXY is available.
···8182 config = mkIf cfg.enable {
8384- programs.captive-browser.dhcp-dns = mkOptionDefault (
85- if config.networking.networkmanager.enable then
86- "${pkgs.networkmanager}/bin/nmcli dev show ${escapeShellArg cfg.interface} | ${pkgs.gnugrep}/bin/fgrep IP4.DNS"
87- else if config.networking.dhcpcd.enable then
88- "${pkgs.dhcpcd}/bin/dhcpcd -U ${escapeShellArg cfg.interface} | ${pkgs.gnugrep}/bin/fgrep domain_name_servers"
89- else if config.networking.useNetworkd then
90- "${cfg.package}/bin/systemd-networkd-dns ${escapeShellArg cfg.interface}"
91- else
92- "${config.security.wrapperDir}/udhcpc --quit --now -f -i ${escapeShellArg cfg.interface} -O dns --script ${
93- pkgs.writeScript "udhcp-script" ''
94- #!/bin/sh
95- if [ "$1" = bound ]; then
96- echo "$dns"
97- fi
98- ''}"
99- );
0000100101 security.wrappers.udhcpc = {
102- capabilities = "cap_net_raw+p";
103- source = "${pkgs.busybox}/bin/udhcpc";
104 };
105106 security.wrappers.captive-browser = {
107- capabilities = "cap_net_raw+p";
108- source = pkgs.writeScript "captive-browser" ''
109- #!${pkgs.bash}/bin/bash
110- export XDG_CONFIG_HOME=${pkgs.writeTextDir "captive-browser.toml" ''
111- browser = """${cfg.browser}"""
112- dhcp-dns = """${cfg.dhcp-dns}"""
113- socks5-addr = """${cfg.socks5-addr}"""
114- ${optionalString cfg.bindInterface ''
115- bind-device = """${cfg.interface}"""
116- ''}
117- ''}
118- exec ${cfg.package}/bin/captive-browser
119- '';
120 };
121 };
122}
···1{ config, lib, pkgs, ... }:
23with lib;
04let
5 cfg = config.programs.captive-browser;
6in
···26 # the options below are the same as in "captive-browser.toml"
27 browser = mkOption {
28 type = types.str;
29+ default = concatStringsSep " " [
30+ ''${pkgs.chromium}/bin/chromium''
31+ ''--user-data-dir=''${XDG_DATA_HOME:-$HOME/.local/share}/chromium-captive''
32+ ''--proxy-server="socks5://$PROXY"''
33+ ''--host-resolver-rules="MAP * ~NOTFOUND , EXCLUDE localhost"''
34+ ''--no-first-run''
35+ ''--new-window''
36+ ''--incognito''
37+ ''-no-default-browser-check''
38+ ''http://cache.nixos.org/''
39+ ];
40 description = ''
41 The shell (/bin/sh) command executed once the proxy starts.
42 When browser exits, the proxy exits. An extra env var PROXY is available.
···8283 config = mkIf cfg.enable {
8485+ programs.captive-browser.dhcp-dns =
86+ let
87+ iface = prefix:
88+ optionalString cfg.bindInterface (concatStringsSep " " (map escapeShellArg [ prefix cfg.interface ]));
89+ in
90+ mkOptionDefault (
91+ if config.networking.networkmanager.enable then
92+ "${pkgs.networkmanager}/bin/nmcli dev show ${iface ""} | ${pkgs.gnugrep}/bin/fgrep IP4.DNS"
93+ else if config.networking.dhcpcd.enable then
94+ "${pkgs.dhcpcd}/bin/dhcpcd ${iface "-U"} | ${pkgs.gnugrep}/bin/fgrep domain_name_servers"
95+ else if config.networking.useNetworkd then
96+ "${cfg.package}/bin/systemd-networkd-dns ${iface ""}"
97+ else
98+ "${config.security.wrapperDir}/udhcpc --quit --now -f ${iface "-i"} -O dns --script ${
99+ pkgs.writeShellScript "udhcp-script" ''
100+ if [ "$1" = bound ]; then
101+ echo "$dns"
102+ fi
103+ ''}"
104+ );
105106 security.wrappers.udhcpc = {
107+ capabilities = "cap_net_raw+p";
108+ source = "${pkgs.busybox}/bin/udhcpc";
109 };
110111 security.wrappers.captive-browser = {
112+ capabilities = "cap_net_raw+p";
113+ source = pkgs.writeShellScript "captive-browser" ''
114+ export XDG_CONFIG_HOME=${pkgs.writeTextDir "captive-browser.toml" ''
115+ browser = """${cfg.browser}"""
116+ dhcp-dns = """${cfg.dhcp-dns}"""
117+ socks5-addr = """${cfg.socks5-addr}"""
118+ ${optionalString cfg.bindInterface ''
119+ bind-device = """${cfg.interface}"""
120+ ''}
121+ ''}
122+ exec ${cfg.package}/bin/captive-browser
123+ '';
0124 };
125 };
126}
+2-2
nixos/modules/testing/service-runner.nix
···5253 # Run the ExecStartPre program. FIXME: this could be a list.
54 my $preStart = <<END_CMD;
55- ${service.serviceConfig.ExecStartPre or ""}
56 END_CMD
57 if (defined $preStart && $preStart ne "\n") {
58 print STDERR "running ExecStartPre: $preStart\n";
···7980 # Run the ExecStartPost program.
81 my $postStart = <<END_CMD;
82- ${service.serviceConfig.ExecStartPost or ""}
83 END_CMD
84 if (defined $postStart && $postStart ne "\n") {
85 print STDERR "running ExecStartPost: $postStart\n";
···5253 # Run the ExecStartPre program. FIXME: this could be a list.
54 my $preStart = <<END_CMD;
55+ ${concatStringsSep "\n" (service.serviceConfig.ExecStartPre or [])}
56 END_CMD
57 if (defined $preStart && $preStart ne "\n") {
58 print STDERR "running ExecStartPre: $preStart\n";
···7980 # Run the ExecStartPost program.
81 my $postStart = <<END_CMD;
82+ ${concatStringsSep "\n" (service.serviceConfig.ExecStartPost or [])}
83 END_CMD
84 if (defined $postStart && $postStart ne "\n") {
85 print STDERR "running ExecStartPost: $postStart\n";