129 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			129 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
# GNU Virtual Private Ethernet
 | 
						|
 | 
						|
{config, pkgs, lib, ...}:
 | 
						|
 | 
						|
let
 | 
						|
  inherit (lib) mkOption mkIf;
 | 
						|
 | 
						|
  cfg = config.services.gvpe;
 | 
						|
 | 
						|
  finalConfig = if cfg.configFile != null then
 | 
						|
    cfg.configFile
 | 
						|
  else if cfg.configText != null then
 | 
						|
    pkgs.writeTextFile {
 | 
						|
      name = "gvpe.conf";
 | 
						|
      text = cfg.configText;
 | 
						|
    }
 | 
						|
  else
 | 
						|
    throw "You must either specify contents of the config file or the config file itself for GVPE";
 | 
						|
 | 
						|
  ifupScript = if cfg.ipAddress == null || cfg.subnet == null then
 | 
						|
     throw "Specify IP address and subnet (with mask) for GVPE"
 | 
						|
   else if cfg.nodename == null then
 | 
						|
     throw "You must set node name for GVPE"
 | 
						|
   else
 | 
						|
   (pkgs.writeTextFile {
 | 
						|
    name = "gvpe-if-up";
 | 
						|
    text = ''
 | 
						|
      #! /bin/sh
 | 
						|
 | 
						|
      export PATH=$PATH:${pkgs.iproute}/sbin
 | 
						|
 | 
						|
      ip link set $IFNAME up
 | 
						|
      ip address add ${cfg.ipAddress} dev $IFNAME
 | 
						|
      ip route add ${cfg.subnet} dev $IFNAME
 | 
						|
 | 
						|
      ${cfg.customIFSetup}
 | 
						|
    '';
 | 
						|
    executable = true;
 | 
						|
  });
 | 
						|
in
 | 
						|
 | 
						|
{
 | 
						|
  options = {
 | 
						|
    services.gvpe = {
 | 
						|
      enable = mkOption {
 | 
						|
        default = false;
 | 
						|
        description = ''
 | 
						|
          Whether to run gvpe
 | 
						|
        '';
 | 
						|
      };
 | 
						|
      nodename = mkOption {
 | 
						|
        default = null;
 | 
						|
        description =''
 | 
						|
          GVPE node name
 | 
						|
        '';
 | 
						|
      };
 | 
						|
      configText = mkOption {
 | 
						|
        default = null;
 | 
						|
        example = ''
 | 
						|
          tcp-port = 655
 | 
						|
          udp-port = 655
 | 
						|
          mtu = 1480
 | 
						|
          ifname = vpn0
 | 
						|
 | 
						|
          node = alpha
 | 
						|
          hostname = alpha.example.org
 | 
						|
          connect = always
 | 
						|
          enable-udp = true
 | 
						|
          enable-tcp = true
 | 
						|
          on alpha if-up = if-up-0
 | 
						|
          on alpha pid-file = /var/gvpe/gvpe.pid
 | 
						|
        '';
 | 
						|
        description = ''
 | 
						|
          GVPE config contents
 | 
						|
        '';
 | 
						|
      };
 | 
						|
      configFile = mkOption {
 | 
						|
        default = null;
 | 
						|
        example = "/root/my-gvpe-conf";
 | 
						|
        description = ''
 | 
						|
          GVPE config file, if already present
 | 
						|
        '';
 | 
						|
      };
 | 
						|
      ipAddress = mkOption {
 | 
						|
        default = null;
 | 
						|
        description = ''
 | 
						|
          IP address to assign to GVPE interface
 | 
						|
        '';
 | 
						|
      };
 | 
						|
      subnet = mkOption {
 | 
						|
        default = null;
 | 
						|
        example = "10.0.0.0/8";
 | 
						|
        description = ''
 | 
						|
          IP subnet assigned to GVPE network
 | 
						|
        '';
 | 
						|
      };
 | 
						|
      customIFSetup = mkOption {
 | 
						|
        default = "";
 | 
						|
        description = ''
 | 
						|
          Additional commands to apply in ifup script
 | 
						|
        '';
 | 
						|
      };
 | 
						|
    };
 | 
						|
  };
 | 
						|
  config = mkIf cfg.enable {
 | 
						|
    systemd.services.gvpe = {
 | 
						|
      description = "GNU Virtual Private Ethernet node";
 | 
						|
      after = [ "network.target" ];
 | 
						|
      wantedBy = [ "multi-user.target" ];
 | 
						|
 | 
						|
      preStart = ''
 | 
						|
        mkdir -p /var/gvpe
 | 
						|
        mkdir -p /var/gvpe/pubkey
 | 
						|
        chown root /var/gvpe
 | 
						|
        chmod 700 /var/gvpe
 | 
						|
        cp ${finalConfig} /var/gvpe/gvpe.conf
 | 
						|
        cp ${ifupScript} /var/gvpe/if-up
 | 
						|
      '';
 | 
						|
 | 
						|
      script = "${pkgs.gvpe}/sbin/gvpe -c /var/gvpe -D ${cfg.nodename} "
 | 
						|
        + " ${cfg.nodename}.pid-file=/var/gvpe/gvpe.pid"
 | 
						|
        + " ${cfg.nodename}.if-up=if-up"
 | 
						|
        + " &> /var/log/gvpe";
 | 
						|
 | 
						|
      serviceConfig.Restart = "always";
 | 
						|
    };
 | 
						|
  };
 | 
						|
}
 |