| 
									
										
										
										
											2014-06-12 15:16:38 +02:00
										 |  |  | # Systemd services for openvswitch | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | { config, lib, pkgs, ... }: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | with lib; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | let | 
					
						
							| 
									
										
										
										
											2014-06-12 16:08:49 +02:00
										 |  |  |   cfg = config.virtualisation.vswitch; | 
					
						
							| 
									
										
										
										
											2014-06-12 15:16:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-25 15:35:02 +02:00
										 |  |  | in { | 
					
						
							| 
									
										
										
										
											2014-06-12 15:16:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-25 15:35:02 +02:00
										 |  |  |   options.virtualisation.vswitch = { | 
					
						
							|  |  |  |     enable = mkOption { | 
					
						
							| 
									
										
										
										
											2014-06-12 16:08:49 +02:00
										 |  |  |       type = types.bool; | 
					
						
							|  |  |  |       default = false; | 
					
						
							| 
									
										
										
										
											2015-04-25 15:35:02 +02:00
										 |  |  |       description = ''
 | 
					
						
							|  |  |  |         Whether to enable Open vSwitch. A configuration daemon (ovs-server) | 
					
						
							|  |  |  |         will be started. | 
					
						
							| 
									
										
										
										
											2014-06-12 16:08:49 +02:00
										 |  |  |         '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-24 12:44:07 +02:00
										 |  |  |     resetOnStart = mkOption { | 
					
						
							|  |  |  |       type = types.bool; | 
					
						
							|  |  |  |       default = false; | 
					
						
							|  |  |  |       description = ''
 | 
					
						
							|  |  |  |         Whether to reset the Open vSwitch configuration database to a default | 
					
						
							|  |  |  |         configuration on every start of the systemd <literal>ovsdb.service</literal>. | 
					
						
							|  |  |  |         '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-25 15:35:02 +02:00
										 |  |  |     package = mkOption { | 
					
						
							| 
									
										
										
										
											2014-06-12 16:08:49 +02:00
										 |  |  |       type = types.package; | 
					
						
							|  |  |  |       default = pkgs.openvswitch; | 
					
						
							| 
									
										
										
										
											2016-01-17 19:34:55 +01:00
										 |  |  |       defaultText = "pkgs.openvswitch"; | 
					
						
							| 
									
										
										
										
											2015-04-25 15:35:02 +02:00
										 |  |  |       description = ''
 | 
					
						
							| 
									
										
										
										
											2014-06-12 16:08:49 +02:00
										 |  |  |         Open vSwitch package to use. | 
					
						
							| 
									
										
										
										
											2015-04-25 15:35:02 +02:00
										 |  |  |       '';
 | 
					
						
							| 
									
										
										
										
											2014-06-12 16:08:49 +02:00
										 |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-25 15:35:02 +02:00
										 |  |  |     ipsec = mkOption { | 
					
						
							|  |  |  |       type = types.bool; | 
					
						
							|  |  |  |       default = false; | 
					
						
							|  |  |  |       description = ''
 | 
					
						
							|  |  |  |         Whether to start racoon service for openvswitch. | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2014-06-12 16:08:49 +02:00
										 |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-25 15:35:02 +02:00
										 |  |  |   config = mkIf cfg.enable (let | 
					
						
							| 
									
										
										
										
											2014-06-12 16:08:49 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Where the communication sockets live | 
					
						
							|  |  |  |     runDir = "/var/run/openvswitch"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Where the config database live (can't be in nix-store) | 
					
						
							|  |  |  |     stateDir = "/var/db/openvswitch"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-25 15:35:02 +02:00
										 |  |  |     # The path to the an initialized version of the database | 
					
						
							| 
									
										
										
										
											2014-06-12 16:08:49 +02:00
										 |  |  |     db = pkgs.stdenv.mkDerivation { | 
					
						
							|  |  |  |       name = "vswitch.db"; | 
					
						
							|  |  |  |       unpackPhase = "true"; | 
					
						
							|  |  |  |       buildPhase = "true"; | 
					
						
							|  |  |  |       buildInputs = with pkgs; [ | 
					
						
							|  |  |  |         cfg.package | 
					
						
							|  |  |  |       ]; | 
					
						
							| 
									
										
										
										
											2015-04-25 15:35:02 +02:00
										 |  |  |       installPhase = "mkdir -p $out"; | 
					
						
							| 
									
										
										
										
											2014-06-12 16:08:49 +02:00
										 |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-25 15:35:02 +02:00
										 |  |  |   in (mkMerge [{ | 
					
						
							| 
									
										
										
										
											2014-06-12 16:08:49 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-25 15:35:02 +02:00
										 |  |  |     environment.systemPackages = [ cfg.package pkgs.ipsecTools ]; | 
					
						
							| 
									
										
										
										
											2014-06-12 16:08:49 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     boot.kernelModules = [ "tun" "openvswitch" ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     boot.extraModulePackages = [ cfg.package ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     systemd.services.ovsdb = { | 
					
						
							|  |  |  |       description = "Open_vSwitch Database Server"; | 
					
						
							|  |  |  |       wantedBy = [ "multi-user.target" ]; | 
					
						
							|  |  |  |       after = [ "systemd-udev-settle.service" ]; | 
					
						
							|  |  |  |       path = [ cfg.package ]; | 
					
						
							|  |  |  |       restartTriggers = [ db cfg.package ]; | 
					
						
							|  |  |  |       # Create the config database | 
					
						
							| 
									
										
										
										
											2015-04-25 15:35:02 +02:00
										 |  |  |       preStart = | 
					
						
							| 
									
										
										
										
											2014-06-12 16:08:49 +02:00
										 |  |  |         ''
 | 
					
						
							|  |  |  |         mkdir -p ${runDir} | 
					
						
							|  |  |  |         mkdir -p /var/db/openvswitch | 
					
						
							|  |  |  |         chmod +w /var/db/openvswitch | 
					
						
							| 
									
										
										
										
											2015-09-24 12:44:07 +02:00
										 |  |  |         ${optionalString cfg.resetOnStart "rm -f /var/db/openvswitch/conf.db"} | 
					
						
							| 
									
										
										
										
											2014-06-12 16:08:49 +02:00
										 |  |  |         if [[ ! -e /var/db/openvswitch/conf.db ]]; then | 
					
						
							|  |  |  |           ${cfg.package}/bin/ovsdb-tool create \ | 
					
						
							|  |  |  |             "/var/db/openvswitch/conf.db" \ | 
					
						
							|  |  |  |             "${cfg.package}/share/openvswitch/vswitch.ovsschema" | 
					
						
							|  |  |  |         fi | 
					
						
							|  |  |  |         chmod -R +w /var/db/openvswitch | 
					
						
							|  |  |  |         '';
 | 
					
						
							| 
									
										
										
										
											2015-04-25 15:35:02 +02:00
										 |  |  |       serviceConfig = { | 
					
						
							|  |  |  |         ExecStart = | 
					
						
							|  |  |  |           ''
 | 
					
						
							|  |  |  |           ${cfg.package}/bin/ovsdb-server \ | 
					
						
							|  |  |  |             --remote=punix:${runDir}/db.sock \ | 
					
						
							|  |  |  |             --private-key=db:Open_vSwitch,SSL,private_key \ | 
					
						
							|  |  |  |             --certificate=db:Open_vSwitch,SSL,certificate \ | 
					
						
							|  |  |  |             --bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert \ | 
					
						
							|  |  |  |             --unixctl=ovsdb.ctl.sock \ | 
					
						
							|  |  |  |             --pidfile=/var/run/openvswitch/ovsdb.pid \ | 
					
						
							| 
									
										
										
										
											2015-09-24 14:51:44 +02:00
										 |  |  |             --detach \ | 
					
						
							| 
									
										
										
										
											2015-04-25 15:35:02 +02:00
										 |  |  |             /var/db/openvswitch/conf.db | 
					
						
							|  |  |  |           '';
 | 
					
						
							|  |  |  |         Restart = "always"; | 
					
						
							|  |  |  |         RestartSec = 3; | 
					
						
							|  |  |  |         PIDFile = "/var/run/openvswitch/ovsdb.pid"; | 
					
						
							| 
									
										
										
										
											2015-09-24 14:51:44 +02:00
										 |  |  |         # Use service type 'forking' to correctly determine when ovsdb-server is ready. | 
					
						
							|  |  |  |         Type = "forking"; | 
					
						
							| 
									
										
										
										
											2015-04-25 15:35:02 +02:00
										 |  |  |       }; | 
					
						
							|  |  |  |       postStart = ''
 | 
					
						
							| 
									
										
										
										
											2014-06-12 16:08:49 +02:00
										 |  |  |         ${cfg.package}/bin/ovs-vsctl --timeout 3 --retry --no-wait init | 
					
						
							| 
									
										
										
										
											2015-04-25 15:35:02 +02:00
										 |  |  |       '';
 | 
					
						
							| 
									
										
										
										
											2014-06-12 16:08:49 +02:00
										 |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     systemd.services.vswitchd = { | 
					
						
							|  |  |  |       description = "Open_vSwitch Daemon"; | 
					
						
							| 
									
										
										
										
											2015-08-29 18:21:43 +02:00
										 |  |  |       wantedBy = [ "multi-user.target" ]; | 
					
						
							| 
									
										
										
										
											2014-06-12 16:08:49 +02:00
										 |  |  |       bindsTo = [ "ovsdb.service" ]; | 
					
						
							|  |  |  |       after = [ "ovsdb.service" ]; | 
					
						
							|  |  |  |       path = [ cfg.package ]; | 
					
						
							| 
									
										
										
										
											2015-04-25 15:35:02 +02:00
										 |  |  |       serviceConfig = { | 
					
						
							|  |  |  |         ExecStart = ''
 | 
					
						
							|  |  |  |           ${cfg.package}/bin/ovs-vswitchd \ | 
					
						
							| 
									
										
										
										
											2015-09-24 14:51:44 +02:00
										 |  |  |           --pidfile=/var/run/openvswitch/ovs-vswitchd.pid \ | 
					
						
							|  |  |  |           --detach | 
					
						
							| 
									
										
										
										
											2015-04-25 15:35:02 +02:00
										 |  |  |         '';
 | 
					
						
							|  |  |  |         PIDFile = "/var/run/openvswitch/ovs-vswitchd.pid"; | 
					
						
							| 
									
										
										
										
											2015-09-24 14:51:44 +02:00
										 |  |  |         # Use service type 'forking' to correctly determine when vswitchd is ready. | 
					
						
							|  |  |  |         Type = "forking"; | 
					
						
							| 
									
										
										
										
											2015-04-25 15:35:02 +02:00
										 |  |  |       }; | 
					
						
							| 
									
										
										
										
											2014-06-12 15:16:38 +02:00
										 |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-25 15:35:02 +02:00
										 |  |  |   } | 
					
						
							|  |  |  |   (mkIf cfg.ipsec { | 
					
						
							|  |  |  |     services.racoon.enable = true; | 
					
						
							|  |  |  |     services.racoon.configPath = "${runDir}/ipsec/etc/racoon/racoon.conf"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     networking.firewall.extraCommands = ''
 | 
					
						
							|  |  |  |       iptables -I INPUT -t mangle -p esp -j MARK --set-mark 1/1 | 
					
						
							|  |  |  |       iptables -I INPUT -t mangle -p udp --dport 4500 -j MARK --set-mark 1/1 | 
					
						
							|  |  |  |     '';
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     systemd.services.ovs-monitor-ipsec = { | 
					
						
							|  |  |  |       description = "Open_vSwitch Ipsec Daemon"; | 
					
						
							|  |  |  |       wantedBy = [ "multi-user.target" ]; | 
					
						
							| 
									
										
										
										
											2015-08-29 18:21:43 +02:00
										 |  |  |       requires = [ "ovsdb.service" ]; | 
					
						
							|  |  |  |       before = [ "vswitchd.service" "racoon.service" ]; | 
					
						
							| 
									
										
										
										
											2015-04-25 15:35:02 +02:00
										 |  |  |       environment.UNIXCTLPATH = "/tmp/ovsdb.ctl.sock"; | 
					
						
							|  |  |  |       serviceConfig = { | 
					
						
							|  |  |  |         ExecStart = ''
 | 
					
						
							|  |  |  |           ${cfg.package}/bin/ovs-monitor-ipsec \ | 
					
						
							|  |  |  |             --root-prefix ${runDir}/ipsec \ | 
					
						
							|  |  |  |             --pidfile /var/run/openvswitch/ovs-monitor-ipsec.pid \ | 
					
						
							| 
									
										
										
										
											2015-09-24 14:51:44 +02:00
										 |  |  |             --monitor --detach \ | 
					
						
							| 
									
										
										
										
											2015-04-25 15:35:02 +02:00
										 |  |  |             unix:/var/run/openvswitch/db.sock | 
					
						
							|  |  |  |         '';
 | 
					
						
							|  |  |  |         PIDFile = "/var/run/openvswitch/ovs-monitor-ipsec.pid"; | 
					
						
							| 
									
										
										
										
											2015-09-24 14:51:44 +02:00
										 |  |  |         # Use service type 'forking' to correctly determine when ovs-monitor-ipsec is ready. | 
					
						
							|  |  |  |         Type = "forking"; | 
					
						
							| 
									
										
										
										
											2015-04-25 15:35:02 +02:00
										 |  |  |       }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       preStart = ''
 | 
					
						
							|  |  |  |         rm -r ${runDir}/ipsec/etc/racoon/certs || true | 
					
						
							|  |  |  |         mkdir -p ${runDir}/ipsec/{etc/racoon,etc/init.d/,usr/sbin/} | 
					
						
							|  |  |  |         ln -fs ${pkgs.ipsecTools}/bin/setkey ${runDir}/ipsec/usr/sbin/setkey | 
					
						
							|  |  |  |         ln -fs ${pkgs.writeScript "racoon-restart" ''
 | 
					
						
							|  |  |  |         #!${pkgs.stdenv.shell} | 
					
						
							|  |  |  |         /var/run/current-system/sw/bin/systemctl $1 racoon | 
					
						
							|  |  |  |         ''} ${runDir}/ipsec/etc/init.d/racoon
 | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |   })])); | 
					
						
							| 
									
										
										
										
											2014-06-12 15:16:38 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | } |