summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--customized/factorio-fetch.nix33
-rw-r--r--customized/factorio.nix5
-rw-r--r--customized/fetch.sh55
-rw-r--r--ymir/factorio.nix3
4 files changed, 92 insertions, 4 deletions
diff --git a/customized/factorio-fetch.nix b/customized/factorio-fetch.nix
new file mode 100644
index 00000000..04b31ac1
--- /dev/null
+++ b/customized/factorio-fetch.nix
@@ -0,0 +1,33 @@
1{ stdenv, curl, xidel, cacert
2# Begin download parameters
3, username ? ""
4, password ? ""
5}:
6
7{
8 # URL to fetch.
9 url ? ""
10
11 # Login URL.
12, loginUrl ? "https://www.factorio.com/login"
13
14 # SHA256 of the fetched URL.
15, sha256 ? ""
16}:
17
18stdenv.mkDerivation {
19 name = "factorio.tar.gz";
20
21 buildInputs = [ curl xidel ];
22
23 inherit url loginUrl username password cacert;
24
25 builder = ./fetch.sh;
26
27 outputHashAlgo = "sha256";
28 outputHash = sha256;
29 outputHashMode = "flat";
30
31 # There's no point in downloading remotely, we'd just slow things down.
32 preferLocalBuild = true;
33}
diff --git a/customized/factorio.nix b/customized/factorio.nix
index a718c9c7..b2832aad 100644
--- a/customized/factorio.nix
+++ b/customized/factorio.nix
@@ -1,9 +1,8 @@
1{ stdenv, callPackage, fetchurl, makeWrapper 1{ stdenv, callPackage, fetchurl, makeWrapper
2, alsaLib, libX11, libXcursor, libXinerama, libXrandr, libXi, mesa_noglu 2, alsaLib, libX11, libXcursor, libXinerama, libXrandr, libXi, mesa_noglu
3, factorio-utils 3, factorio-utils, factorio-fetch
4, releaseType 4, releaseType
5, mods ? [] 5, mods ? []
6, username ? "" , password ? ""
7}: 6}:
8 7
9assert releaseType == "alpha" || releaseType == "headless"; 8assert releaseType == "alpha" || releaseType == "headless";
@@ -21,7 +20,7 @@ let
21 inTar = "i386"; 20 inTar = "i386";
22 } else abort "Unsupported platform"; 21 } else abort "Unsupported platform";
23 22
24 authenticatedFetch = callPackage ./fetch.nix { inherit username password; }; 23 authenticatedFetch = factorio-fetch;
25 24
26 fetch = rec { 25 fetch = rec {
27 url = "https://www.factorio.com/get-download/${version}/${releaseType}/${arch.inUrl}"; 26 url = "https://www.factorio.com/get-download/${version}/${releaseType}/${arch.inUrl}";
diff --git a/customized/fetch.sh b/customized/fetch.sh
new file mode 100644
index 00000000..30d9c9fd
--- /dev/null
+++ b/customized/fetch.sh
@@ -0,0 +1,55 @@
1source $stdenv/setup
2
3# Curl flags to increase reliability a bit.
4#
5# Can't use fetchurl, for several reasons. One is that we definitely
6# don't want --insecure for the login, though we need it for the
7# download as their download cert isn't in the standard linux bundle.
8curl="curl \
9 --max-redirs 20 \
10 --retry 3 \
11 --cacert $cacert/etc/ssl/certs/ca-bundle.crt \
12 -b cookies \
13 -c cookies \
14 $curlOpts \
15 $NIX_CURL_FLAGS"
16
17# We don't want the password to be on any program's argv, as it may be
18# visible in /proc. Writing it to file with echo should be safe, since
19# it's a shell builtin.
20echo -n "$password" > password
21# Might as well hide the username as well.
22echo -n "$username" > username
23
24# Get a CSRF token.
25csrf=$($curl $loginUrl | xidel - -e '//input[@id="csrf_token"]/@value')
26
27# Log in. We don't especially care about the result, but let's check if login failed.
28$curl --data-urlencode csrf_token="$csrf" \
29 --data-urlencode username_or_email@username \
30 --data-urlencode password@password \
31 -d action=Login \
32 $loginUrl -D headers > /dev/null
33
34if grep -q 'Location: https://' headers; then
35 # Now download. We need --insecure for this, but the sha256 should cover us.
36 $curl --insecure --location $url > $out
37 set +x
38else
39 set +x
40 echo 'Login failed'
41 echo 'Please set username and password with config.nix,'
42 echo 'or /etc/nix/nixpkgs-config.nix if on NixOS.'
43 echo
44 echo 'Example:'
45 echo '{'
46 echo ' packageOverrides = pkgs: rec {'
47 echo ' factorio = pkgs.factorio.override {'
48 echo ' username = "<username or email address>";'
49 echo ' password = "<password>";'
50 echo ' };'
51 echo ' };'
52 echo '}'
53
54 exit 1
55fi
diff --git a/ymir/factorio.nix b/ymir/factorio.nix
index 0379c452..b6a3e149 100644
--- a/ymir/factorio.nix
+++ b/ymir/factorio.nix
@@ -6,7 +6,7 @@ let
6 allOptionalMods = false; 6 allOptionalMods = false;
7 }; 7 };
8 modPortalDrv = { id, name, version, sha256, deps ? [], optionalDeps ? [], recommendedDeps ? [] }: modDrv { 8 modPortalDrv = { id, name, version, sha256, deps ? [], optionalDeps ? [], recommendedDeps ? [] }: modDrv {
9 src = pkgs.fetchurl { 9 src = factorio-fetch {
10 url = ''https://mods.factorio.com/api/downloads/data/mods/${id}_${version}.zip''; 10 url = ''https://mods.factorio.com/api/downloads/data/mods/${id}_${version}.zip'';
11 inherit sha256; 11 inherit sha256;
12 }; 12 };
@@ -86,5 +86,6 @@ in {
86 factorio-mkModDirDrv = pkgs.factorio-utils.mkModDirDrv; 86 factorio-mkModDirDrv = pkgs.factorio-utils.mkModDirDrv;
87 factorio = pkgs.callPackage ../customized/factorio.nix { releaseType = "alpha"; }; 87 factorio = pkgs.callPackage ../customized/factorio.nix { releaseType = "alpha"; };
88 factorio-headless = pkgs.callPackage ../customized/factorio.nix { releaseType = "headless"; }; 88 factorio-headless = pkgs.callPackage ../customized/factorio.nix { releaseType = "headless"; };
89 factorio-fetch = pkgs.callPackage customized/factorio-fetch.nix {};
89 }; 90 };
90} 91}