aboutsummaryrefslogtreecommitdiffstats
path: root/lib/default.nix
Commit message (Collapse)AuthorAgeFilesLines
* populate: cope with unusual names and pathstv33 hours1-0/+21
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Names and paths with characters that mean something to shells, to find, or in URLs get handled as what they are, or refused: - Pruning, and removing state that sources don't need anymore, list entries with find instead of a loop reading names, which strips blanks at the ends of names and splits names at newlines. So an entry named "trail " gets pruned instead of reported as pruned and left. - Pruning doesn't make entries writable before removing them, which would change the mode of files elsewhere that are hard links to files therein. - Source names are portable file names: letters, digits, and ._-, not starting with -. nixpkgs' writers accept nothing else in the names of the scripts populating the sources, which contain the source names, and fail with an assertion that doesn't mention the source. - Paths get percent-encoded where they go into URLs for Nix, which refuses blanks there and takes ? and # for delimiters. - rsync gets the target path protected from the target's shell (--protect-args), which expands wildcards in it otherwise: a file source delivered to /var/src/a?c ends up in /var/src/abc if that exists. A safety scenario deploys every kind of state to a target path with a blank, wildcards, #, and %. An edge case prunes entries with blanks at the ends of their names, with a newline, and with wildcards, and the scenario pruning links also prunes hard links to a read-only file outside, and lists what's left in the C locale, where ls sorts .populate first. The scenario with unusual source names also draws inputs from a source named self.
* populate: draw inputs by rewriting lock files, add materialize and patchestv33 hours1-0/+17
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Sources drawing inputs from other sources get the lock file of their flake rewritten with nix flake lock --override-input, so the flake in the source itself uses the other sources, and needs no generated flake to be found. file and git sources get their lock file rewritten in place. flake and flake-input sources get delivered as a copy with the rewritten lock file, which gets added to the store with nix-store --add-fixed, and the target path links to that. With rewriteLock set to false, and for symlink sources, the source stays as it is and gets a generated flake in .populate/flakes/<name>, which writeDeploy's flake parameter uses. flake and flake-input sources get two more options: - patches: patches on the deploying machine, which get uploaded to .populate/patches/<name> and applied in order with patch -p1 on the target, in the directory the target path shows. - materialize: the target path becomes a writable copy instead of a link into the store. Sources that get patched, rewritten, or materialized get delivered to .populate/derived/<name>/original, which also roots the delivered store path, and the flakes step derives the target path from there. Copies get made again only if what they derive from changes, which a key in .populate/derived/<name> records. The matrices of the file, flake, flake-input, and git tests cover both ways of drawing inputs, those of flake and flake-input materialize, the deploy test a source with a rewritten lock file, and features and edge cases run the scenarios drawing inputs both ways. New features cover patches, a patch that doesn't apply, patches in a subdirectory, reusing copies, and materializing.
* lib: add flakeFollowstv3 days1-0/+14
| | | | | flakeFollows lists the inputs a source draws from other sources, with the paths of nested inputs flattened.
* lib shell: add requireFlakestv3 days1-0/+14
| | | | | | Shell code that enables flakes for the Nix commands following it, and fails with an error message naming the host and the Nix version found, unless Nix supports flakes.
* target: use default port from SSH configErik Arvstedt2021-11-201-2/+6
| | | | | This is the expected behavior. The SSH config is also implicitly used for other SSH-related settings.
* isLocalTarget: use "localhost" as defaultv1.24.1tv2021-01-161-5/+12
| | | | | This fixes an issue when trying to deploy using sudo from systems that don't provide means to determine the real host name.
* lib: add firstWordtv2020-06-081-0/+3
|
* support default target attrs for attrSetsErik Arvstedt2020-04-181-7/+12
|
* add target.extraOptionsErik Arvstedt2020-04-181-0/+1
|
* ssh: support using ssh-configured usertv2019-11-291-1/+1
| | | | | | | Let ssh use the user configured in its configuration files when the target user is set to the empty string. Closes https://github.com/krebs/krops/issues/2
* ssh, rsync: support using sudo on remoteMilan Pässler2019-11-291-2/+3
| | | | | | | | This allows deployment of remote hosts without having ssh access to the root user. Passwordless sudo is recommended since krops will use multiple ssh sessions and the password will not be remembered. Closes https://github.com/krebs/krops/issues/3
* populate file: add useChecksumv1.8.0tv2018-11-281-0/+1
|
* populate git: add clean.excludev1.7.0tv2018-10-311-0/+1
|
* lib: add shell.quotetv2018-07-121-0/+10
|
* lib: add isLocalTargettv2018-07-121-0/+6
|
* import stockholm's deployment toolstv2018-02-281-0/+56
https://cgit.krebsco.de/stockholm 877b4104370c1ea9698a449e376e2842d7c372fd