diff options
| author | Fuwn <[email protected]> | 2024-10-13 08:48:54 +0000 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2024-10-13 08:48:54 +0000 |
| commit | 898acdb368307d9fff8f7605f24f42ca0ef19936 (patch) | |
| tree | 6ad20068fa1ddf6dae13095ead7da8a3adaad84d | |
| parent | docs(readme): update remote repository (diff) | |
| download | pia.nix-898acdb368307d9fff8f7605f24f42ca0ef19936.tar.xz pia.nix-898acdb368307d9fff8f7605f24f42ca0ef19936.zip | |
feat(flake): helper commands
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | README.md | 8 | ||||
| -rw-r--r-- | flake.nix | 155 |
3 files changed, 105 insertions, 59 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e2f5dd2 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +result
\ No newline at end of file @@ -40,14 +40,14 @@ attribute set. ```sh # Activate VPN in a specific region -sudo systemctl start openvpn-japan +pia-start japan # Deactivate VPN -sudo systemctl stop openvpn-japan +pia-stop japan # List all available VPN regions -ls /etc/systemd/system/ | grep openvpn +pia-list # List all available VPN regions with fuzzy search support -ls /etc/systemd/system/ | awk '/openvpn/ { print $1 }' | fzf +pia-search ``` @@ -10,70 +10,115 @@ nixpkgs, self, }: - flake-utils.lib.eachDefaultSystem (system: { - nixosModules.default = - { config, ... }: - { - options.services.pia = { - enable = nixpkgs.lib.mkOption { - default = false; - type = nixpkgs.lib.types.bool; - }; + flake-utils.lib.eachDefaultSystem ( + system: + let + pkgs = import nixpkgs { + inherit system; + }; + + lib = pkgs.lib; + in + { + packages = + let + makeShellScript = + name: action: + pkgs.writeScriptBin name '' + #!${pkgs.runtimeShell} + + if [ "$(id -u)" -ne 0 ]; then + exec sudo "$0" "$@" + fi + + ${action} + ''; + in + { + pia-start = makeShellScript "pia-start" "sudo systemctl start openvpn-$1.service"; + pia-stop = makeShellScript "pia-stop" "sudo systemctl stop openvpn-$1.service"; + pia-list = makeShellScript "pia-list" "ls /etc/systemd/system/ | awk '/openvpn/ {gsub(/openvpn-|.service/, \"\"); print}'"; - authUserPass = { - username = nixpkgs.lib.mkOption { + pia-search = makeShellScript "pia-search" "${ + lib.getExe self.packages.${system}.pia-list + } | ${lib.getExe pkgs.fzf}"; + }; + + nixosModules.default = + { config, ... }: + { + options.services.pia = { + enable = nixpkgs.lib.mkOption { default = false; - type = nixpkgs.lib.types.str; + type = nixpkgs.lib.types.bool; }; - password = nixpkgs.lib.mkOption { - default = false; - type = nixpkgs.lib.types.str; + authUserPass = { + username = nixpkgs.lib.mkOption { + default = false; + type = nixpkgs.lib.types.str; + }; + + password = nixpkgs.lib.mkOption { + default = false; + type = nixpkgs.lib.types.str; + }; }; }; - }; - config = nixpkgs.lib.mkIf config.services.pia.enable { - services.openvpn.servers = - let - resources = nixpkgs.legacyPackages.${system}.fetchzip { - name = "pia-vpn-config"; - url = "https://www.privateinternetaccess.com/openvpn/openvpn.zip"; - sha256 = "ZA8RS6eIjMVQfBt+9hYyhaq8LByy5oJaO9Ed+x8KtW8="; - stripRoot = false; - }; - in - builtins.listToAttrs ( - map - (name: { - name = - (builtins.replaceStrings - [ - ".ovpn" - "_" - ] - [ - "" - "-" - ] - ) - name; + config = nixpkgs.lib.mkIf config.services.pia.enable { + environment.systemPackages = + let + piaPackages = self.packages.${system}; + in + [ + piaPackages.pia-start + piaPackages.pia-stop + piaPackages.pia-list + piaPackages.pia-search + ]; - value = { - inherit (config.services.pia) authUserPass; + services.openvpn.servers = + let + resources = nixpkgs.legacyPackages.${system}.fetchzip { + name = "pia-vpn-config"; + url = "https://www.privateinternetaccess.com/openvpn/openvpn.zip"; + sha256 = "ZA8RS6eIjMVQfBt+9hYyhaq8LByy5oJaO9Ed+x8KtW8="; + stripRoot = false; + }; + in + builtins.listToAttrs ( + map + (name: { + name = + (builtins.replaceStrings + [ + ".ovpn" + "_" + ] + [ + "" + "-" + ] + ) + name; - autoStart = false; - config = "config ${resources}/${name}"; - updateResolvConf = true; - }; - }) - ( - builtins.filter (name: (builtins.match ".+ovpn$" name) != null) ( - builtins.attrNames (builtins.readDir resources) + value = { + inherit (config.services.pia) authUserPass; + + autoStart = false; + config = "config ${resources}/${name}"; + updateResolvConf = true; + }; + }) + ( + builtins.filter (name: (builtins.match ".+ovpn$" name) != null) ( + builtins.attrNames (builtins.readDir resources) + ) ) - ) - ); + ); + }; }; - }; - }); + } + ); } |