├── .buildkite
└── pipeline.yml
├── .gitignore
├── .reuse
└── dep5
├── LICENSE
├── LICENSES
└── MPL-2.0.txt
├── Main.hs
├── README.md
├── Setup.hs
├── default.nix
├── flake.lock
├── flake.lock.license
├── flake.nix
├── service.nix
├── shell.nix
├── test
├── cache-priv-key.pem
├── cache-priv-key.pem.license
├── cache-pub-key.pem
├── cache-pub-key.pem.license
├── default.nix
├── test-build.nix
└── upload-daemon.nix
└── upload-daemon.cabal
/.buildkite/pipeline.yml:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: 2020 Serokell
2 | #
3 | # SPDX-License-Identifier: MPL-2.0
4 |
5 | steps:
6 | - label: Run checks
7 | commands:
8 | - nix-build -A checks.x86_64-linux
9 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: 2020 Serokell
2 | #
3 | # SPDX-License-Identifier: MPL-2.0
4 |
5 | result*
6 |
--------------------------------------------------------------------------------
/.reuse/dep5:
--------------------------------------------------------------------------------
1 | Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
2 | Upstream-Name: upload-daemon
3 | Upstream-Contact: Serokell
4 | Source: https://github.com/serokell/upload-daemon
5 |
6 | # Sample paragraph, commented out:
7 | #
8 | # Files: src/*
9 | # Copyright: $YEAR $NAME <$CONTACT>
10 | # License: ...
11 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Mozilla Public License Version 2.0
2 | ==================================
3 |
4 | 1. Definitions
5 | --------------
6 |
7 | 1.1. "Contributor"
8 | means each individual or legal entity that creates, contributes to
9 | the creation of, or owns Covered Software.
10 |
11 | 1.2. "Contributor Version"
12 | means the combination of the Contributions of others (if any) used
13 | by a Contributor and that particular Contributor's Contribution.
14 |
15 | 1.3. "Contribution"
16 | means Covered Software of a particular Contributor.
17 |
18 | 1.4. "Covered Software"
19 | means Source Code Form to which the initial Contributor has attached
20 | the notice in Exhibit A, the Executable Form of such Source Code
21 | Form, and Modifications of such Source Code Form, in each case
22 | including portions thereof.
23 |
24 | 1.5. "Incompatible With Secondary Licenses"
25 | means
26 |
27 | (a) that the initial Contributor has attached the notice described
28 | in Exhibit B to the Covered Software; or
29 |
30 | (b) that the Covered Software was made available under the terms of
31 | version 1.1 or earlier of the License, but not also under the
32 | terms of a Secondary License.
33 |
34 | 1.6. "Executable Form"
35 | means any form of the work other than Source Code Form.
36 |
37 | 1.7. "Larger Work"
38 | means a work that combines Covered Software with other material, in
39 | a separate file or files, that is not Covered Software.
40 |
41 | 1.8. "License"
42 | means this document.
43 |
44 | 1.9. "Licensable"
45 | means having the right to grant, to the maximum extent possible,
46 | whether at the time of the initial grant or subsequently, any and
47 | all of the rights conveyed by this License.
48 |
49 | 1.10. "Modifications"
50 | means any of the following:
51 |
52 | (a) any file in Source Code Form that results from an addition to,
53 | deletion from, or modification of the contents of Covered
54 | Software; or
55 |
56 | (b) any new file in Source Code Form that contains any Covered
57 | Software.
58 |
59 | 1.11. "Patent Claims" of a Contributor
60 | means any patent claim(s), including without limitation, method,
61 | process, and apparatus claims, in any patent Licensable by such
62 | Contributor that would be infringed, but for the grant of the
63 | License, by the making, using, selling, offering for sale, having
64 | made, import, or transfer of either its Contributions or its
65 | Contributor Version.
66 |
67 | 1.12. "Secondary License"
68 | means either the GNU General Public License, Version 2.0, the GNU
69 | Lesser General Public License, Version 2.1, the GNU Affero General
70 | Public License, Version 3.0, or any later versions of those
71 | licenses.
72 |
73 | 1.13. "Source Code Form"
74 | means the form of the work preferred for making modifications.
75 |
76 | 1.14. "You" (or "Your")
77 | means an individual or a legal entity exercising rights under this
78 | License. For legal entities, "You" includes any entity that
79 | controls, is controlled by, or is under common control with You. For
80 | purposes of this definition, "control" means (a) the power, direct
81 | or indirect, to cause the direction or management of such entity,
82 | whether by contract or otherwise, or (b) ownership of more than
83 | fifty percent (50%) of the outstanding shares or beneficial
84 | ownership of such entity.
85 |
86 | 2. License Grants and Conditions
87 | --------------------------------
88 |
89 | 2.1. Grants
90 |
91 | Each Contributor hereby grants You a world-wide, royalty-free,
92 | non-exclusive license:
93 |
94 | (a) under intellectual property rights (other than patent or trademark)
95 | Licensable by such Contributor to use, reproduce, make available,
96 | modify, display, perform, distribute, and otherwise exploit its
97 | Contributions, either on an unmodified basis, with Modifications, or
98 | as part of a Larger Work; and
99 |
100 | (b) under Patent Claims of such Contributor to make, use, sell, offer
101 | for sale, have made, import, and otherwise transfer either its
102 | Contributions or its Contributor Version.
103 |
104 | 2.2. Effective Date
105 |
106 | The licenses granted in Section 2.1 with respect to any Contribution
107 | become effective for each Contribution on the date the Contributor first
108 | distributes such Contribution.
109 |
110 | 2.3. Limitations on Grant Scope
111 |
112 | The licenses granted in this Section 2 are the only rights granted under
113 | this License. No additional rights or licenses will be implied from the
114 | distribution or licensing of Covered Software under this License.
115 | Notwithstanding Section 2.1(b) above, no patent license is granted by a
116 | Contributor:
117 |
118 | (a) for any code that a Contributor has removed from Covered Software;
119 | or
120 |
121 | (b) for infringements caused by: (i) Your and any other third party's
122 | modifications of Covered Software, or (ii) the combination of its
123 | Contributions with other software (except as part of its Contributor
124 | Version); or
125 |
126 | (c) under Patent Claims infringed by Covered Software in the absence of
127 | its Contributions.
128 |
129 | This License does not grant any rights in the trademarks, service marks,
130 | or logos of any Contributor (except as may be necessary to comply with
131 | the notice requirements in Section 3.4).
132 |
133 | 2.4. Subsequent Licenses
134 |
135 | No Contributor makes additional grants as a result of Your choice to
136 | distribute the Covered Software under a subsequent version of this
137 | License (see Section 10.2) or under the terms of a Secondary License (if
138 | permitted under the terms of Section 3.3).
139 |
140 | 2.5. Representation
141 |
142 | Each Contributor represents that the Contributor believes its
143 | Contributions are its original creation(s) or it has sufficient rights
144 | to grant the rights to its Contributions conveyed by this License.
145 |
146 | 2.6. Fair Use
147 |
148 | This License is not intended to limit any rights You have under
149 | applicable copyright doctrines of fair use, fair dealing, or other
150 | equivalents.
151 |
152 | 2.7. Conditions
153 |
154 | Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
155 | in Section 2.1.
156 |
157 | 3. Responsibilities
158 | -------------------
159 |
160 | 3.1. Distribution of Source Form
161 |
162 | All distribution of Covered Software in Source Code Form, including any
163 | Modifications that You create or to which You contribute, must be under
164 | the terms of this License. You must inform recipients that the Source
165 | Code Form of the Covered Software is governed by the terms of this
166 | License, and how they can obtain a copy of this License. You may not
167 | attempt to alter or restrict the recipients' rights in the Source Code
168 | Form.
169 |
170 | 3.2. Distribution of Executable Form
171 |
172 | If You distribute Covered Software in Executable Form then:
173 |
174 | (a) such Covered Software must also be made available in Source Code
175 | Form, as described in Section 3.1, and You must inform recipients of
176 | the Executable Form how they can obtain a copy of such Source Code
177 | Form by reasonable means in a timely manner, at a charge no more
178 | than the cost of distribution to the recipient; and
179 |
180 | (b) You may distribute such Executable Form under the terms of this
181 | License, or sublicense it under different terms, provided that the
182 | license for the Executable Form does not attempt to limit or alter
183 | the recipients' rights in the Source Code Form under this License.
184 |
185 | 3.3. Distribution of a Larger Work
186 |
187 | You may create and distribute a Larger Work under terms of Your choice,
188 | provided that You also comply with the requirements of this License for
189 | the Covered Software. If the Larger Work is a combination of Covered
190 | Software with a work governed by one or more Secondary Licenses, and the
191 | Covered Software is not Incompatible With Secondary Licenses, this
192 | License permits You to additionally distribute such Covered Software
193 | under the terms of such Secondary License(s), so that the recipient of
194 | the Larger Work may, at their option, further distribute the Covered
195 | Software under the terms of either this License or such Secondary
196 | License(s).
197 |
198 | 3.4. Notices
199 |
200 | You may not remove or alter the substance of any license notices
201 | (including copyright notices, patent notices, disclaimers of warranty,
202 | or limitations of liability) contained within the Source Code Form of
203 | the Covered Software, except that You may alter any license notices to
204 | the extent required to remedy known factual inaccuracies.
205 |
206 | 3.5. Application of Additional Terms
207 |
208 | You may choose to offer, and to charge a fee for, warranty, support,
209 | indemnity or liability obligations to one or more recipients of Covered
210 | Software. However, You may do so only on Your own behalf, and not on
211 | behalf of any Contributor. You must make it absolutely clear that any
212 | such warranty, support, indemnity, or liability obligation is offered by
213 | You alone, and You hereby agree to indemnify every Contributor for any
214 | liability incurred by such Contributor as a result of warranty, support,
215 | indemnity or liability terms You offer. You may include additional
216 | disclaimers of warranty and limitations of liability specific to any
217 | jurisdiction.
218 |
219 | 4. Inability to Comply Due to Statute or Regulation
220 | ---------------------------------------------------
221 |
222 | If it is impossible for You to comply with any of the terms of this
223 | License with respect to some or all of the Covered Software due to
224 | statute, judicial order, or regulation then You must: (a) comply with
225 | the terms of this License to the maximum extent possible; and (b)
226 | describe the limitations and the code they affect. Such description must
227 | be placed in a text file included with all distributions of the Covered
228 | Software under this License. Except to the extent prohibited by statute
229 | or regulation, such description must be sufficiently detailed for a
230 | recipient of ordinary skill to be able to understand it.
231 |
232 | 5. Termination
233 | --------------
234 |
235 | 5.1. The rights granted under this License will terminate automatically
236 | if You fail to comply with any of its terms. However, if You become
237 | compliant, then the rights granted under this License from a particular
238 | Contributor are reinstated (a) provisionally, unless and until such
239 | Contributor explicitly and finally terminates Your grants, and (b) on an
240 | ongoing basis, if such Contributor fails to notify You of the
241 | non-compliance by some reasonable means prior to 60 days after You have
242 | come back into compliance. Moreover, Your grants from a particular
243 | Contributor are reinstated on an ongoing basis if such Contributor
244 | notifies You of the non-compliance by some reasonable means, this is the
245 | first time You have received notice of non-compliance with this License
246 | from such Contributor, and You become compliant prior to 30 days after
247 | Your receipt of the notice.
248 |
249 | 5.2. If You initiate litigation against any entity by asserting a patent
250 | infringement claim (excluding declaratory judgment actions,
251 | counter-claims, and cross-claims) alleging that a Contributor Version
252 | directly or indirectly infringes any patent, then the rights granted to
253 | You by any and all Contributors for the Covered Software under Section
254 | 2.1 of this License shall terminate.
255 |
256 | 5.3. In the event of termination under Sections 5.1 or 5.2 above, all
257 | end user license agreements (excluding distributors and resellers) which
258 | have been validly granted by You or Your distributors under this License
259 | prior to termination shall survive termination.
260 |
261 | ************************************************************************
262 | * *
263 | * 6. Disclaimer of Warranty *
264 | * ------------------------- *
265 | * *
266 | * Covered Software is provided under this License on an "as is" *
267 | * basis, without warranty of any kind, either expressed, implied, or *
268 | * statutory, including, without limitation, warranties that the *
269 | * Covered Software is free of defects, merchantable, fit for a *
270 | * particular purpose or non-infringing. The entire risk as to the *
271 | * quality and performance of the Covered Software is with You. *
272 | * Should any Covered Software prove defective in any respect, You *
273 | * (not any Contributor) assume the cost of any necessary servicing, *
274 | * repair, or correction. This disclaimer of warranty constitutes an *
275 | * essential part of this License. No use of any Covered Software is *
276 | * authorized under this License except under this disclaimer. *
277 | * *
278 | ************************************************************************
279 |
280 | ************************************************************************
281 | * *
282 | * 7. Limitation of Liability *
283 | * -------------------------- *
284 | * *
285 | * Under no circumstances and under no legal theory, whether tort *
286 | * (including negligence), contract, or otherwise, shall any *
287 | * Contributor, or anyone who distributes Covered Software as *
288 | * permitted above, be liable to You for any direct, indirect, *
289 | * special, incidental, or consequential damages of any character *
290 | * including, without limitation, damages for lost profits, loss of *
291 | * goodwill, work stoppage, computer failure or malfunction, or any *
292 | * and all other commercial damages or losses, even if such party *
293 | * shall have been informed of the possibility of such damages. This *
294 | * limitation of liability shall not apply to liability for death or *
295 | * personal injury resulting from such party's negligence to the *
296 | * extent applicable law prohibits such limitation. Some *
297 | * jurisdictions do not allow the exclusion or limitation of *
298 | * incidental or consequential damages, so this exclusion and *
299 | * limitation may not apply to You. *
300 | * *
301 | ************************************************************************
302 |
303 | 8. Litigation
304 | -------------
305 |
306 | Any litigation relating to this License may be brought only in the
307 | courts of a jurisdiction where the defendant maintains its principal
308 | place of business and such litigation shall be governed by laws of that
309 | jurisdiction, without reference to its conflict-of-law provisions.
310 | Nothing in this Section shall prevent a party's ability to bring
311 | cross-claims or counter-claims.
312 |
313 | 9. Miscellaneous
314 | ----------------
315 |
316 | This License represents the complete agreement concerning the subject
317 | matter hereof. If any provision of this License is held to be
318 | unenforceable, such provision shall be reformed only to the extent
319 | necessary to make it enforceable. Any law or regulation which provides
320 | that the language of a contract shall be construed against the drafter
321 | shall not be used to construe this License against a Contributor.
322 |
323 | 10. Versions of the License
324 | ---------------------------
325 |
326 | 10.1. New Versions
327 |
328 | Mozilla Foundation is the license steward. Except as provided in Section
329 | 10.3, no one other than the license steward has the right to modify or
330 | publish new versions of this License. Each version will be given a
331 | distinguishing version number.
332 |
333 | 10.2. Effect of New Versions
334 |
335 | You may distribute the Covered Software under the terms of the version
336 | of the License under which You originally received the Covered Software,
337 | or under the terms of any subsequent version published by the license
338 | steward.
339 |
340 | 10.3. Modified Versions
341 |
342 | If you create software not governed by this License, and you want to
343 | create a new license for such software, you may create and use a
344 | modified version of this License if you rename the license and remove
345 | any references to the name of the license steward (except to note that
346 | such modified license differs from this License).
347 |
348 | 10.4. Distributing Source Code Form that is Incompatible With Secondary
349 | Licenses
350 |
351 | If You choose to distribute Source Code Form that is Incompatible With
352 | Secondary Licenses under the terms of this version of the License, the
353 | notice described in Exhibit B of this License must be attached.
354 |
355 | Exhibit A - Source Code Form License Notice
356 | -------------------------------------------
357 |
358 | This Source Code Form is subject to the terms of the Mozilla Public
359 | License, v. 2.0. If a copy of the MPL was not distributed with this
360 | file, You can obtain one at http://mozilla.org/MPL/2.0/.
361 |
362 | If it is not possible or desirable to put the notice in a particular
363 | file, then You may include the notice in a location (such as a LICENSE
364 | file in a relevant directory) where a recipient would be likely to look
365 | for such a notice.
366 |
367 | You may add additional accurate notices of copyright ownership.
368 |
369 | Exhibit B - "Incompatible With Secondary Licenses" Notice
370 | ---------------------------------------------------------
371 |
372 | This Source Code Form is "Incompatible With Secondary Licenses", as
373 | defined by the Mozilla Public License, v. 2.0.
374 |
--------------------------------------------------------------------------------
/LICENSES/MPL-2.0.txt:
--------------------------------------------------------------------------------
1 | Mozilla Public License Version 2.0
2 |
3 | 1. Definitions
4 |
5 | 1.1. "Contributor" means each individual or legal entity that creates, contributes
6 | to the creation of, or owns Covered Software.
7 |
8 | 1.2. "Contributor Version" means the combination of the Contributions of others
9 | (if any) used by a Contributor and that particular Contributor's Contribution.
10 |
11 | 1.3. "Contribution" means Covered Software of a particular Contributor.
12 |
13 | 1.4. "Covered Software" means Source Code Form to which the initial Contributor
14 | has attached the notice in Exhibit A, the Executable Form of such Source Code
15 | Form, and Modifications of such Source Code Form, in each case including portions
16 | thereof.
17 |
18 | 1.5. "Incompatible With Secondary Licenses" means
19 |
20 | (a) that the initial Contributor has attached the notice described in Exhibit
21 | B to the Covered Software; or
22 |
23 | (b) that the Covered Software was made available under the terms of version
24 | 1.1 or earlier of the License, but not also under the terms of a Secondary
25 | License.
26 |
27 | 1.6. "Executable Form" means any form of the work other than Source Code Form.
28 |
29 | 1.7. "Larger Work" means a work that combines Covered Software with other
30 | material, in a separate file or files, that is not Covered Software.
31 |
32 | 1.8. "License" means this document.
33 |
34 | 1.9. "Licensable" means having the right to grant, to the maximum extent possible,
35 | whether at the time of the initial grant or subsequently, any and all of the
36 | rights conveyed by this License.
37 |
38 | 1.10. "Modifications" means any of the following:
39 |
40 | (a) any file in Source Code Form that results from an addition to, deletion
41 | from, or modification of the contents of Covered Software; or
42 |
43 | (b) any new file in Source Code Form that contains any Covered Software.
44 |
45 | 1.11. "Patent Claims" of a Contributor means any patent claim(s), including
46 | without limitation, method, process, and apparatus claims, in any patent Licensable
47 | by such Contributor that would be infringed, but for the grant of the License,
48 | by the making, using, selling, offering for sale, having made, import, or
49 | transfer of either its Contributions or its Contributor Version.
50 |
51 | 1.12. "Secondary License" means either the GNU General Public License, Version
52 | 2.0, the GNU Lesser General Public License, Version 2.1, the GNU Affero General
53 | Public License, Version 3.0, or any later versions of those licenses.
54 |
55 | 1.13. "Source Code Form" means the form of the work preferred for making modifications.
56 |
57 | 1.14. "You" (or "Your") means an individual or a legal entity exercising rights
58 | under this License. For legal entities, "You" includes any entity that controls,
59 | is controlled by, or is under common control with You. For purposes of this
60 | definition, "control" means (a) the power, direct or indirect, to cause the
61 | direction or management of such entity, whether by contract or otherwise,
62 | or (b) ownership of more than fifty percent (50%) of the outstanding shares
63 | or beneficial ownership of such entity.
64 |
65 | 2. License Grants and Conditions
66 |
67 | 2.1. Grants
68 | Each Contributor hereby grants You a world-wide, royalty-free, non-exclusive
69 | license:
70 |
71 | (a) under intellectual property rights (other than patent or trademark) Licensable
72 | by such Contributor to use, reproduce, make available, modify, display, perform,
73 | distribute, and otherwise exploit its Contributions, either on an unmodified
74 | basis, with Modifications, or as part of a Larger Work; and
75 |
76 | (b) under Patent Claims of such Contributor to make, use, sell, offer for
77 | sale, have made, import, and otherwise transfer either its Contributions or
78 | its Contributor Version.
79 |
80 | 2.2. Effective Date
81 | The licenses granted in Section 2.1 with respect to any Contribution become
82 | effective for each Contribution on the date the Contributor first distributes
83 | such Contribution.
84 |
85 | 2.3. Limitations on Grant Scope
86 | The licenses granted in this Section 2 are the only rights granted under this
87 | License. No additional rights or licenses will be implied from the distribution
88 | or licensing of Covered Software under this License. Notwithstanding Section
89 | 2.1(b) above, no patent license is granted by a Contributor:
90 |
91 | (a) for any code that a Contributor has removed from Covered Software; or
92 |
93 | (b) for infringements caused by: (i) Your and any other third party's modifications
94 | of Covered Software, or (ii) the combination of its Contributions with other
95 | software (except as part of its Contributor Version); or
96 |
97 | (c) under Patent Claims infringed by Covered Software in the absence of its
98 | Contributions.
99 |
100 | This License does not grant any rights in the trademarks, service marks, or
101 | logos of any Contributor (except as may be necessary to comply with the notice
102 | requirements in Section 3.4).
103 |
104 | 2.4. Subsequent Licenses
105 | No Contributor makes additional grants as a result of Your choice to distribute
106 | the Covered Software under a subsequent version of this License (see Section
107 | 10.2) or under the terms of a Secondary License (if permitted under the terms
108 | of Section 3.3).
109 |
110 | 2.5. Representation
111 | Each Contributor represents that the Contributor believes its Contributions
112 | are its original creation(s) or it has sufficient rights to grant the rights
113 | to its Contributions conveyed by this License.
114 |
115 | 2.6. Fair Use
116 | This License is not intended to limit any rights You have under applicable
117 | copyright doctrines of fair use, fair dealing, or other equivalents.
118 |
119 | 2.7. Conditions
120 | Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in
121 | Section 2.1.
122 |
123 | 3. Responsibilities
124 |
125 | 3.1. Distribution of Source Form
126 | All distribution of Covered Software in Source Code Form, including any Modifications
127 | that You create or to which You contribute, must be under the terms of this
128 | License. You must inform recipients that the Source Code Form of the Covered
129 | Software is governed by the terms of this License, and how they can obtain
130 | a copy of this License. You may not attempt to alter or restrict the recipients'
131 | rights in the Source Code Form.
132 |
133 | 3.2. Distribution of Executable Form
134 | If You distribute Covered Software in Executable Form then:
135 |
136 | (a) such Covered Software must also be made available in Source Code Form,
137 | as described in Section 3.1, and You must inform recipients of the Executable
138 | Form how they can obtain a copy of such Source Code Form by reasonable means
139 | in a timely manner, at a charge no more than the cost of distribution to the
140 | recipient; and
141 |
142 | (b) You may distribute such Executable Form under the terms of this License,
143 | or sublicense it under different terms, provided that the license for the
144 | Executable Form does not attempt to limit or alter the recipients' rights
145 | in the Source Code Form under this License.
146 |
147 | 3.3. Distribution of a Larger Work
148 | You may create and distribute a Larger Work under terms of Your choice, provided
149 | that You also comply with the requirements of this License for the Covered
150 | Software. If the Larger Work is a combination of Covered Software with a work
151 | governed by one or more Secondary Licenses, and the Covered Software is not
152 | Incompatible With Secondary Licenses, this License permits You to additionally
153 | distribute such Covered Software under the terms of such Secondary License(s),
154 | so that the recipient of the Larger Work may, at their option, further distribute
155 | the Covered Software under the terms of either this License or such Secondary
156 | License(s).
157 |
158 | 3.4. Notices
159 | You may not remove or alter the substance of any license notices (including
160 | copyright notices, patent notices, disclaimers of warranty, or limitations
161 | of liability) contained within the Source Code Form of the Covered Software,
162 | except that You may alter any license notices to the extent required to remedy
163 | known factual inaccuracies.
164 |
165 | 3.5. Application of Additional Terms
166 | You may choose to offer, and to charge a fee for, warranty, support, indemnity
167 | or liability obligations to one or more recipients of Covered Software. However,
168 | You may do so only on Your own behalf, and not on behalf of any Contributor.
169 | You must make it absolutely clear that any such warranty, support, indemnity,
170 | or liability obligation is offered by You alone, and You hereby agree to indemnify
171 | every Contributor for any liability incurred by such Contributor as a result
172 | of warranty, support, indemnity or liability terms You offer. You may include
173 | additional disclaimers of warranty and limitations of liability specific to
174 | any jurisdiction.
175 |
176 | 4. Inability to Comply Due to Statute or Regulation
177 | If it is impossible for You to comply with any of the terms of this License
178 | with respect to some or all of the Covered Software due to statute, judicial
179 | order, or regulation then You must: (a) comply with the terms of this License
180 | to the maximum extent possible; and (b) describe the limitations and the code
181 | they affect. Such description must be placed in a text file included with
182 | all distributions of the Covered Software under this License. Except to the
183 | extent prohibited by statute or regulation, such description must be sufficiently
184 | detailed for a recipient of ordinary skill to be able to understand it.
185 |
186 | 5. Termination
187 |
188 | 5.1. The rights granted under this License will terminate automatically if
189 | You fail to comply with any of its terms. However, if You become compliant,
190 | then the rights granted under this License from a particular Contributor are
191 | reinstated (a) provisionally, unless and until such Contributor explicitly
192 | and finally terminates Your grants, and (b) on an ongoing basis, if such Contributor
193 | fails to notify You of the non-compliance by some reasonable means prior to
194 | 60 days after You have come back into compliance. Moreover, Your grants from
195 | a particular Contributor are reinstated on an ongoing basis if such Contributor
196 | notifies You of the non-compliance by some reasonable means, this is the first
197 | time You have received notice of non-compliance with this License from such
198 | Contributor, and You become compliant prior to 30 days after Your receipt
199 | of the notice.
200 |
201 | 5.2. If You initiate litigation against any entity by asserting a patent infringement
202 | claim (excluding declaratory judgment actions, counter-claims, and cross-claims)
203 | alleging that a Contributor Version directly or indirectly infringes any patent,
204 | then the rights granted to You by any and all Contributors for the Covered
205 | Software under Section 2.1 of this License shall terminate.
206 |
207 | 5.3. In the event of termination under Sections 5.1 or 5.2 above, all end
208 | user license agreements (excluding distributors and resellers) which have
209 | been validly granted by You or Your distributors under this License prior
210 | to termination shall survive termination.
211 |
212 | 6. Disclaimer of Warranty
213 | Covered Software is provided under this License on an "as is" basis, without
214 | warranty of any kind, either expressed, implied, or statutory, including,
215 | without limitation, warranties that the Covered Software is free of defects,
216 | merchantable, fit for a particular purpose or non-infringing. The entire risk
217 | as to the quality and performance of the Covered Software is with You. Should
218 | any Covered Software prove defective in any respect, You (not any Contributor)
219 | assume the cost of any necessary servicing, repair, or correction. This disclaimer
220 | of warranty constitutes an essential part of this License. No use of any Covered
221 | Software is authorized under this License except under this disclaimer.
222 |
223 | 7. Limitation of Liability
224 | Under no circumstances and under no legal theory, whether tort (including
225 | negligence), contract, or otherwise, shall any Contributor, or anyone who
226 | distributes Covered Software as permitted above, be liable to You for any
227 | direct, indirect, special, incidental, or consequential damages of any character
228 | including, without limitation, damages for lost profits, loss of goodwill,
229 | work stoppage, computer failure or malfunction, or any and all other commercial
230 | damages or losses, even if such party shall have been informed of the possibility
231 | of such damages. This limitation of liability shall not apply to liability
232 | for death or personal injury resulting from such party's negligence to the
233 | extent applicable law prohibits such limitation. Some jurisdictions do not
234 | allow the exclusion or limitation of incidental or consequential damages,
235 | so this exclusion and limitation may not apply to You.
236 |
237 | 8. Litigation
238 | Any litigation relating to this License may be brought only in the courts
239 | of a jurisdiction where the defendant maintains its principal place of business
240 | and such litigation shall be governed by laws of that jurisdiction, without
241 | reference to its conflict-of-law provisions. Nothing in this Section shall
242 | prevent a party's ability to bring cross-claims or counter-claims.
243 |
244 | 9. Miscellaneous
245 | This License represents the complete agreement concerning the subject matter
246 | hereof. If any provision of this License is held to be unenforceable, such
247 | provision shall be reformed only to the extent necessary to make it enforceable.
248 | Any law or regulation which provides that the language of a contract shall
249 | be construed against the drafter shall not be used to construe this License
250 | against a Contributor.
251 |
252 | 10. Versions of the License
253 |
254 | 10.1. New Versions
255 | Mozilla Foundation is the license steward. Except as provided in Section 10.3,
256 | no one other than the license steward has the right to modify or publish new
257 | versions of this License. Each version will be given a distinguishing version
258 | number.
259 |
260 | 10.2. Effect of New Versions
261 | You may distribute the Covered Software under the terms of the version of
262 | the License under which You originally received the Covered Software, or under
263 | the terms of any subsequent version published by the license steward.
264 |
265 | 10.3. Modified Versions
266 | If you create software not governed by this License, and you want to create
267 | a new license for such software, you may create and use a modified version
268 | of this License if you rename the license and remove any references to the
269 | name of the license steward (except to note that such modified license differs
270 | from this License).
271 |
272 | 10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses
273 | If You choose to distribute Source Code Form that is Incompatible With Secondary
274 | Licenses under the terms of this version of the License, the notice described
275 | in Exhibit B of this License must be attached.
276 |
277 | Exhibit A - Source Code Form License Notice
278 |
279 | This Source Code Form is subject to the terms of the Mozilla Public License,
280 | v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain
281 | one at http://mozilla.org/MPL/2.0/.
282 |
283 | If it is not possible or desirable to put the notice in a particular file,
284 | then You may include the notice in a location (such as a LICENSE file in a
285 | relevant directory) where a recipient would be likely to look for such a notice.
286 |
287 | You may add additional accurate notices of copyright ownership.
288 |
289 | Exhibit B - "Incompatible With Secondary Licenses" Notice
290 |
291 | This Source Code Form is "Incompatible With Secondary Licenses", as defined
292 | by the Mozilla Public License, v. 2.0.
293 |
--------------------------------------------------------------------------------
/Main.hs:
--------------------------------------------------------------------------------
1 | -- SPDX-FileCopyrightText: 2020 Serokell
2 | --
3 | -- SPDX-License-Identifier: MPL-2.0
4 |
5 | {-# LANGUAGE OverloadedStrings, RecordWildCards #-}
6 |
7 | module Main (main) where
8 |
9 | import Conduit
10 | import Control.Concurrent
11 | import Control.Concurrent.Async (async, Concurrently(Concurrently), runConcurrently, forConcurrently)
12 | import Control.Monad (forM_, forever, void, when)
13 | import Control.Monad.IO.Class (liftIO)
14 | import Control.Applicative (many)
15 | import Data.ByteString.Char8 (ByteString)
16 | import qualified Data.ByteString.Char8 as BS
17 | import qualified Data.Conduit.List as CL
18 | import Data.Conduit.Network as TCP
19 | import Data.Conduit.Network.Unix as UNIX
20 | import Data.Semigroup ((<>))
21 | import Data.Streaming.Network (HasReadWrite)
22 | import Data.Text (unpack)
23 | import Data.Text.Encoding (decodeUtf8)
24 | import Options.Applicative
25 | (Parser, auto, execParser, fullDesc, header, help, helper, info, long, metavar, option, optional,
26 | progDesc, short, showDefault, strOption, value, (<**>))
27 | import System.Exit (ExitCode(ExitSuccess))
28 | import System.IO (hPutStr, hPutStrLn, stderr)
29 | import System.Metrics.Prometheus.Concurrent.RegistryT (registerCounter, registerGauge, runRegistryT)
30 | import System.Metrics.Prometheus.Http.Scrape (serveMetricsT)
31 | import System.Metrics.Prometheus.Metric.Counter as C (Counter, inc)
32 | import System.Metrics.Prometheus.Metric.Gauge as G (Gauge, dec, inc, add)
33 | import System.Metrics.Prometheus.MetricId (addLabel, fromList)
34 | import System.Process (readProcessWithExitCode)
35 |
36 | data StatisticsHandlers
37 | = StatisticsHandlers
38 | { requests :: Counter
39 | , success :: Gauge
40 | , failure :: Gauge
41 | , running :: Gauge
42 | , queued :: Gauge
43 | }
44 |
45 | type UploadTarget = String
46 |
47 | data UploadOptions = UploadOptions
48 | { port :: Maybe Int
49 | , unix :: Maybe FilePath
50 | , prometheusPort :: Int
51 | , uploadTargets :: [UploadTarget]
52 | , nrWorkers :: Int
53 | }
54 |
55 | uploadOptions :: Parser UploadOptions
56 | uploadOptions = UploadOptions
57 | <$> optional
58 | ( option auto
59 | ( long "port"
60 | <> short 'p'
61 | <> metavar "PORT"
62 | <> help "TCP port to listen on" ) )
63 | <*> optional
64 | ( strOption
65 | ( long "unix"
66 | <> short 'u'
67 | <> metavar "UNIX"
68 | <> help "UNIX Domain Socket to listen on" ) )
69 | <*> option auto
70 | ( long "stat-port"
71 | <> short 's'
72 | <> metavar "SPORT"
73 | <> value 8081
74 | <> showDefault
75 | <> help "Prometheus listening port" )
76 | <*> many (strOption
77 | ( long "target"
78 | <> short 't'
79 | <> metavar "TARGET"
80 | <> help "Where to upload; may be specified multiple times for multiple target stores" ))
81 | <*> option auto
82 | ( long "workers"
83 | <> short 'j'
84 | <> metavar "WORKERS"
85 | <> value 2
86 | <> showDefault
87 | <> help "Number of nix-copies to run at the same time" )
88 |
89 |
90 | -- | Upload a path to target binary cache
91 | upload :: StatisticsHandlers -> ByteString -> UploadTarget -> IO ()
92 | upload StatisticsHandlers {..} path target = do
93 | G.dec queued
94 | G.inc running
95 | (code, _, stderrOutput) <- readProcessWithExitCode "nix"
96 | [ "copy", "--to", target, unpack $ decodeUtf8 path ]
97 | ""
98 | G.dec running
99 | if code /= ExitSuccess
100 | then do
101 | hPutStr stderr "Could not upload "
102 | BS.hPutStr stderr path
103 | hPutStr stderr $ " to "<>target<>":"
104 | hPutStrLn stderr stderrOutput
105 | G.inc failure
106 | else do
107 | hPutStr stderr "Uploaded "
108 | BS.hPutStr stderr path
109 | hPutStrLn stderr $ " to "<>target
110 | G.inc success
111 |
112 | uploadWorker :: StatisticsHandlers -> Chan (ByteString, UploadTarget) -> IO ()
113 | uploadWorker shand uploadCh = forever $
114 | readChan uploadCh >>= uncurry (upload shand)
115 |
116 | response :: [ByteString] -> BS.ByteString
117 | response paths = BS.pack $ "Queued " <> show (length paths) <> " paths"
118 |
119 | logUploading :: ConduitT BS.ByteString Void IO ()
120 | logUploading = CL.mapM_ $ \paths -> BS.hPutStrLn stderr $ "Queued " <> paths
121 |
122 | queueUpload :: [UploadTarget] -> Chan (ByteString, UploadTarget) -> StatisticsHandlers -> ConduitT BS.ByteString BS.ByteString IO ()
123 | queueUpload targets uploadCh StatisticsHandlers {..} =
124 | passthroughSink logUploading return
125 | .| passthroughSink (CL.mapM_ $ const $ C.inc requests) return
126 | .| CL.map BS.words
127 | .| passthroughSink (CL.mapM_ . mapM_ $ const $ G.add (fromIntegral $ length targets) queued) return
128 | .| passthroughSink (CL.mapM_ . mapM_ $ forM_ targets . curry (writeChan uploadCh)) return
129 | .| CL.map response
130 |
131 | handleConnection :: (HasReadWrite ad) => ConduitT BS.ByteString BS.ByteString IO () -> ad -> IO ()
132 | handleConnection conduit appData = runConduit $ appSource appData .| conduit .| appSink appData
133 |
134 | main :: IO ()
135 | main = do
136 | UploadOptions{..} <- execParser opts
137 |
138 |
139 | when ((port, unix) == (Nothing, Nothing)) $ error "Specify either --port or --unix to start the server"
140 |
141 | hPutStrLn stderr $ "Starting server on "
142 | <> maybe "" (\p -> "localhost:" <> show p <> " ") port
143 | <> maybe "" (show <> const " ") unix
144 | <> "uploading to " <> show uploadTargets
145 | uploadCh <- newChan
146 | runRegistryT $ do
147 | shand <- StatisticsHandlers
148 | <$> registerCounter "requests_total" mempty
149 | <*> registerGauge "uploads" (fromList [("upload", "success")])
150 | <*> registerGauge "uploads" (addLabel "upload" "failure" mempty)
151 | <*> registerGauge "uploads" (addLabel "upload" "running" mempty)
152 | <*> registerGauge "uploads" (addLabel "upload" "queued" mempty)
153 | let conduit = queueUpload uploadTargets uploadCh shand
154 |
155 | void $ liftIO $ async $ runConcurrently
156 | $ Concurrently (forM_ port $ \p -> runTCPServer (TCP.serverSettings p "*") $ handleConnection conduit)
157 | <>Concurrently (forM_ unix $ \u -> runUnixServer (UNIX.serverSettings u) $ handleConnection conduit)
158 | <>(mconcat . replicate nrWorkers $ Concurrently $ uploadWorker shand uploadCh)
159 |
160 | serveMetricsT prometheusPort [ "metrics" ]
161 | where
162 | opts = info (uploadOptions <**> helper)
163 | ( fullDesc
164 | <> progDesc "Listen on PORT and/or UNIX for paths to be uploaded to TARGET"
165 | <> header "nix-upload-daemon - keep a queue of uploading paths to a remote store" )
166 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
6 |
7 | # upload-daemon
8 |
9 | A daemon that asynchronously copies paths to a remote store.
10 |
11 | ## Building
12 |
13 | Build with `nix-build` or `nix build`
14 |
15 | ## Usage
16 |
17 | You must provide `-t/--target` argument, which should be a valid nix store url, and at least one of `-p/--port` or `-u/--unix` for a control socket.
18 |
19 | There's a NixOS module in [./service.nix](./service.nix) available as `nixosModules.upload-daemon` which adds a systemd service that runs upload-daemon for you and optionally configures a nix post-build-hook that signs and uploads all paths that were built on the machine to the remote store.
20 |
21 | ## License
22 |
23 | Licensed under Mozilla Public License version 2. Read [./LICENSE](./LICENSE) for more details.
24 |
25 | ## About Serokell
26 |
27 | upload-daemon is maintained and funded with ❤ by [Serokell](https://serokell.io/).
28 | The names and logo for Serokell are trademark of Serokell OÜ.
29 |
30 | We love open source software! See [our other projects](https://serokell.io/community?utm_source=github) or [hire us](https://serokell.io/hire-us?utm_source=github) to design, develop and grow your idea!
31 |
--------------------------------------------------------------------------------
/Setup.hs:
--------------------------------------------------------------------------------
1 | -- SPDX-FileCopyrightText: 2020 Serokell
2 | --
3 | -- SPDX-License-Identifier: MPL-2.0
4 |
5 | import Distribution.Simple
6 | main = defaultMain
7 |
--------------------------------------------------------------------------------
/default.nix:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: 2020 Serokell
2 | #
3 | # SPDX-License-Identifier: MPL-2.0
4 |
5 | (import (fetchTarball https://github.com/edolstra/flake-compat/archive/master.tar.gz) {
6 | src = builtins.fetchGit ./.;
7 | }).defaultNix
8 |
--------------------------------------------------------------------------------
/flake.lock:
--------------------------------------------------------------------------------
1 | {
2 | "nodes": {
3 | "flake-utils": {
4 | "locked": {
5 | "lastModified": 1629481132,
6 | "narHash": "sha256-JHgasjPR0/J1J3DRm4KxM4zTyAj4IOJY8vIl75v/kPI=",
7 | "owner": "numtide",
8 | "repo": "flake-utils",
9 | "rev": "997f7efcb746a9c140ce1f13c72263189225f482",
10 | "type": "github"
11 | },
12 | "original": {
13 | "owner": "numtide",
14 | "repo": "flake-utils",
15 | "type": "github"
16 | }
17 | },
18 | "nixpkgs": {
19 | "locked": {
20 | "lastModified": 1700813934,
21 | "narHash": "sha256-IdlI60suH7yVBU8m4wGfDqTr4dLAzWc2eWCUpNeaKUs=",
22 | "owner": "serokell",
23 | "repo": "nixpkgs",
24 | "rev": "0f42a542b4dc890901c36d708eae797beb6c7d77",
25 | "type": "github"
26 | },
27 | "original": {
28 | "owner": "serokell",
29 | "repo": "nixpkgs",
30 | "type": "github"
31 | }
32 | },
33 | "root": {
34 | "inputs": {
35 | "flake-utils": "flake-utils",
36 | "nixpkgs": "nixpkgs"
37 | }
38 | }
39 | },
40 | "root": "root",
41 | "version": 7
42 | }
43 |
--------------------------------------------------------------------------------
/flake.lock.license:
--------------------------------------------------------------------------------
1 | SPDX-FileCopyrightText: 2020 Serokell
2 |
3 | SPDX-License-Identifier: MPL-2.0
--------------------------------------------------------------------------------
/flake.nix:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: 2020 Serokell
2 | #
3 | # SPDX-License-Identifier: MPL-2.0
4 |
5 | {
6 | description = "";
7 |
8 | inputs.nixpkgs.url = "github:serokell/nixpkgs";
9 | inputs.flake-utils.url = "github:numtide/flake-utils";
10 |
11 | outputs = { self, nixpkgs, flake-utils }:
12 | flake-utils.lib.eachSystem [ "x86_64-linux" "aarch64-linux" ] (system: {
13 | packages = {
14 | upload-daemon =
15 | nixpkgs.legacyPackages.${system}.haskellPackages.callCabal2nix
16 | "upload-daemon" ./. { };
17 | };
18 |
19 | defaultPackage = self.packages.${system}.upload-daemon;
20 |
21 | defaultApp = {
22 | type = "app";
23 | program = "${self.defaultPackage.${system}}/bin/upload-daemon";
24 | };
25 |
26 | checks = {
27 | build = self.defaultPackage.${system};
28 | } // (import ./test {
29 | inherit self system;
30 | pkgs = nixpkgs.legacyPackages.${system};
31 | nixosPath = "${nixpkgs}/nixos";
32 | });
33 |
34 | devShell = nixpkgs.legacyPackages.${system}.mkShell {
35 | inputsFrom = [ self.packages.${system}.upload-daemon.env ];
36 | };
37 | }) // {
38 | nixosModules.upload-daemon = import ./service.nix self;
39 | };
40 | }
41 |
--------------------------------------------------------------------------------
/service.nix:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: 2020 Serokell
2 | #
3 | # SPDX-License-Identifier: MPL-2.0
4 |
5 | self:
6 |
7 | { pkgs, lib, config, ... }:
8 | with lib;
9 | let
10 | cfg = config.services.upload-daemon;
11 | description = "a daemon that asynchronously copies paths to a remote store";
12 | upload-paths = pkgs.writeShellScript "upload-paths" ''
13 | nix store sign -r -k ${cfg.post-build-hook.secretKey} $OUT_PATHS
14 | ${pkgs.netcat}/bin/nc -U ${cfg.socket} -N <<< $OUT_PATHS || echo "Uploading failed"
15 | '';
16 | in
17 | {
18 | options.services.upload-daemon = with types; {
19 | enable = mkEnableOption description;
20 | targets = mkOption {
21 | description = "List of stores to upload paths to";
22 | type = listOf str;
23 | };
24 | port = mkOption {
25 | description = "Port to listen for paths to upload";
26 | type = nullOr port;
27 | default = null;
28 | };
29 | socket = mkOption {
30 | description = "UNIX socket to listen on";
31 | type = nullOr path;
32 | default = "/run/upload-daemon/upload.sock";
33 | };
34 | prometheusPort = mkOption {
35 | description = "Port that prometheus endpoint listens on";
36 | type = nullOr port;
37 | default = 8082;
38 | };
39 | package = mkOption {
40 | description = "Package containing upload-daemon";
41 | type = package;
42 | default = self.defaultPackage.${pkgs.stdenv.system};
43 | };
44 | post-build-hook = {
45 | enable = mkEnableOption "post-build-hook that uploads the built path to a remote store";
46 | secretKey = mkOption {
47 | type = path;
48 | description = "Path to the key with which to sign the paths";
49 | };
50 | };
51 | workers = mkOption {
52 | description = "Number of nix-copies to run at the same time, null means use the number of CPUs";
53 | type = nullOr int;
54 | default = null;
55 | example = 4;
56 | };
57 | };
58 | config = mkIf cfg.enable {
59 | systemd.services.upload-daemon = {
60 | inherit description;
61 | wantedBy = [ "multi-user.target" ];
62 | path = with pkgs; [ nix ];
63 | script =
64 | ''
65 | workers=${if cfg.workers == null then "$(nproc)" else toString cfg.workers}
66 |
67 | ${cfg.package}/bin/upload-daemon \
68 | ${lib.concatMapStringsSep " \\\n" (target: "--target '${target}'") cfg.targets} \
69 | ${lib.optionalString (! isNull cfg.port) "--port ${toString cfg.port}"} \
70 | ${lib.optionalString (! isNull cfg.socket) "--unix \"${toString cfg.socket}\""} \
71 | ${lib.optionalString (! isNull cfg.prometheusPort) "--stat-port ${toString cfg.prometheusPort}"} \
72 | -j "$workers" \
73 | +RTS -N"$workers"
74 | '';
75 | serviceConfig = {
76 | Restart = "always";
77 | RuntimeDirectory = "upload-daemon";
78 | };
79 | };
80 | nix.extraOptions = lib.optionalString cfg.post-build-hook.enable "post-build-hook = ${upload-paths}";
81 | };
82 | }
83 |
--------------------------------------------------------------------------------
/shell.nix:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: 2020 Serokell
2 | #
3 | # SPDX-License-Identifier: MPL-2.0
4 |
5 | (import (fetchTarball https://github.com/edolstra/flake-compat/archive/master.tar.gz) {
6 | src = builtins.fetchGit ./.;
7 | }).shellNix
8 |
--------------------------------------------------------------------------------
/test/cache-priv-key.pem:
--------------------------------------------------------------------------------
1 | binarycache.example.com:uy9P/XA7tD14rJtpq5hetCQ1gwDdaLOlZuxFubNvroELja0DTVoKBVSiWB3nQsuysKb6vu6tHCLWdGLYmoqW7Q==
--------------------------------------------------------------------------------
/test/cache-priv-key.pem.license:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: 2020 Serokell
2 | #
3 | # SPDX-License-Identifier: MPL-2.0
--------------------------------------------------------------------------------
/test/cache-pub-key.pem:
--------------------------------------------------------------------------------
1 | binarycache.example.com:C42tA01aCgVUolgd50LLsrCm+r7urRwi1nRi2JqKlu0=
--------------------------------------------------------------------------------
/test/cache-pub-key.pem.license:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: 2020 Serokell
2 | #
3 | # SPDX-License-Identifier: MPL-2.0
--------------------------------------------------------------------------------
/test/default.nix:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: 2020 Serokell
2 | #
3 | # SPDX-License-Identifier: MPL-2.0
4 |
5 | args:
6 | let handleTest = path: (import path args).test;
7 | in { upload-daemon = handleTest ./upload-daemon.nix; }
8 |
--------------------------------------------------------------------------------
/test/test-build.nix:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: 2020 Serokell
2 | #
3 | # SPDX-License-Identifier: MPL-2.0
4 |
5 | { system ? builtins.currentSystem }: derivation {
6 | name = "test-build";
7 | inherit system;
8 | builder = "/bin/sh";
9 | args = [(builtins.toFile "builder.sh" "echo hello > $out")];
10 | }
11 |
--------------------------------------------------------------------------------
/test/upload-daemon.nix:
--------------------------------------------------------------------------------
1 | # SPDX-FileCopyrightText: 2020 Serokell
2 | #
3 | # SPDX-License-Identifier: MPL-2.0
4 |
5 | { self, pkgs, nixosPath, ... }@args:
6 |
7 | (import "${nixosPath}/tests/make-test-python.nix" ({ pkgs, ... }: {
8 | name = "upload-daemon";
9 |
10 | nodes = {
11 |
12 | runner = { pkgs, ... }: {
13 | imports = [ self.nixosModules.upload-daemon ];
14 |
15 | environment.systemPackages = [ pkgs.stdenv ];
16 |
17 | nix.binaryCachePublicKeys = [ (builtins.readFile ./cache-pub-key.pem) ];
18 | nix.settings.experimental-features = [ "nix-command" "flakes" ];
19 |
20 | services.upload-daemon = {
21 | enable = true;
22 | post-build-hook = {
23 | enable = true;
24 | secretKey = ./cache-priv-key.pem;
25 | };
26 | targets = [ "/tmp/test1" "/tmp/test2" ];
27 | };
28 | };
29 |
30 | };
31 |
32 | testScript =''
33 | start_all()
34 |
35 | runner.wait_for_unit("multi-user.target")
36 | runner.wait_for_unit("upload-daemon.service")
37 |
38 | runner.succeed(
39 | "nix-build --no-substitute ${./test-build.nix}"
40 | )
41 | runner.succeed("sleep 3")
42 | runner.succeed(
43 | "cat /tmp/test1${pkgs.callPackage ./test-build.nix {}} | grep hello"
44 | )
45 | runner.succeed(
46 | "cat /tmp/test2${pkgs.callPackage ./test-build.nix {}} | grep hello"
47 | )
48 | '';
49 | })) args
50 |
--------------------------------------------------------------------------------
/upload-daemon.cabal:
--------------------------------------------------------------------------------
1 | -- SPDX-FileCopyrightText: 2020 Serokell
2 | --
3 | -- SPDX-License-Identifier: MPL-2.0
4 |
5 | cabal-version: >=2.0
6 |
7 | name: upload-daemon
8 | version: 0.1.0.0
9 | synopsis: Upload daemon for nix post-build-hook
10 | -- description:
11 | -- bug-reports:
12 | license: MPL-2.0
13 | license-file: LICENSE
14 | author: Alexander Bantyev
15 | maintainer: balsoft@balsoft.ru
16 | -- copyright:
17 | -- category:
18 | build-type: Simple
19 | extra-source-files: CHANGELOG.md
20 |
21 | executable upload-daemon
22 | main-is: Main.hs
23 | -- other-modules:
24 | -- other-extensions:
25 | build-depends: base
26 | , prometheus ^>= 2.2
27 | , conduit
28 | , conduit-extra
29 | , async
30 | , text
31 | , bytestring
32 | , process
33 | , optparse-applicative
34 | , streaming-commons
35 | -- hs-source-dirs:
36 | default-language: Haskell2010
37 | ghc-options: -threaded
38 |
--------------------------------------------------------------------------------