[Nix-dev] How to create dirs needed by a module before it runs?

Jeff Johnson jefdaj at gmail.com
Fri Jan 23 20:27:22 CET 2015


In case there isn't a hook I just thought of the obvious solution:
wrap `nixos-rebuild` in a shell script.

On 1/23/15, Jeff Johnson <jefdaj at gmail.com> wrote:
> Oh weird, maybe I need to go back and see if I did something wrong
> with the hostname, because now that I think about it you're
> right--they should all be evaluated at once. I think the
> system.activationScripts are an exception though. They seem to run
> after everything's evaluated (they print their "installing" messages
> right after nix does "setting up /etc..." but before it starts systemd
> units). Which is the sensible way to do it, you wouldn't want them to
> run before nix knows the expressions are valid. I was mostly wondering
> if there's a separate "pre-nix-eval" hook somewhere. I could see it
> being useful for other things too, like checking that the nixpkgs repo
> exists if you have your own or aborting if there's no network
> connection.
> Jeff
>
> On 1/23/15, Wout Mertens <wout.mertens at gmail.com> wrote:
>> What do you mean with "only get installed at the end"?
>>
>> Also, networking.hostName should work, the whole config gets evaluated
>> "at
>> once". There's no "running" in Nix, only side-effects of evaluation.
>>
>> Wout.
>>
>> On Fri Jan 23 2015 at 7:45:38 PM Jeff Johnson <jefdaj at gmail.com> wrote:
>>
>>> Hi all! I'm trying to set up tarsnap on nixos. This is my tarsnap.nix so
>>> far:
>>>
>>>     config:
>>>
>>>     let
>>>       keySrc   = ../rawpriv/tarsnap;
>>>       cacheDir = "/var/cache/tarsnap";
>>>
>>>       rcSrc = builtins.toFile "tarsnaprc" ''
>>>         aggressive-networking # TODO is this a good idea?
>>>         humanize-numbers
>>>       '';
>>>
>>>       script = homeDir:
>>>         let
>>>           keyDst = "${homeDir}/tarsnap.key";
>>>           rcDst  = "${homeDir}/.tarsnaprc";
>>>         in ''
>>>           echo "installing ${keyDst}"  ; install -m400
>>> ${keySrc}/`hostname`.key ${keyDst}
>>>           echo "installing ${rcDst}"   ; ln -fs ${rcSrc} ${rcDst}
>>>           echo "installing ${cacheDir}"; mkdir -p ${cacheDir}
>>>         '';
>>>
>>>     in {
>>>       system.activationScripts = { tarsnap = script "/root"; };
>>>       services.tarsnap = {
>>>         inherit config;
>>>         enable   = true;
>>>         keyfile  = keyDst;
>>>         cachedir = cacheDir;
>>>       };
>>>     }
>>>
>>> It works except that the keyfile and cachedir only get installed at
>>> the end, so nix complains that they don't exist unless I create them
>>> manually first. Is there a way to make the script run earlier? And
>>> another possibly-related question: is there a way to find out the
>>> hostname? I can't just do `networking.hostName` because that's set in
>>> the top-level config after this module runs. Do I just pass it as an
>>> argument? Thanks
>>> Jeff
>>> _______________________________________________
>>> nix-dev mailing list
>>> nix-dev at lists.science.uu.nl
>>> http://lists.science.uu.nl/mailman/listinfo/nix-dev
>>>
>>
>


More information about the nix-dev mailing list