Merge lp:~mvo/unattended-upgrades/whitelisting into lp:unattended-upgrades
- whitelisting
- Merge into trunk
Proposed by
Michael Vogt
Status: | Merged |
---|---|
Merged at revision: | 312 |
Proposed branch: | lp:~mvo/unattended-upgrades/whitelisting |
Merge into: | lp:unattended-upgrades |
Diff against target: |
1672 lines (+521/-456) 14 files modified
README.md (+40/-1) debian/changelog (+33/-6) debian/po/de.po (+23/-222) debian/po/tr.po (+40/-0) debian/unattended-upgrades.service (+12/-0) po/da.po (+85/-73) po/de.po (+84/-72) setup.py (+1/-1) test/test_in_chroot.py (+49/-10) test/test_origin_pattern.py (+34/-13) test/test_pep8.py (+5/-2) test/test_pyflakes.py (+1/-1) unattended-upgrade (+113/-54) unattended-upgrade-shutdown (+1/-1) |
To merge this branch: | bzr merge lp:~mvo/unattended-upgrades/whitelisting |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Christopher Warner (community) | Approve | ||
unattended-upgrades-developers | Pending | ||
Review via email:
|
Commit message
Description of the change
Based on lp:~cwarner/unattended-upgrades/whitelisting/ - provide a whitelist option.
To post a comment you must log in.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'README.md' |
2 | --- README.md 2013-05-16 08:45:15 +0000 |
3 | +++ README.md 2014-10-15 08:16:16 +0000 |
4 | @@ -42,7 +42,7 @@ |
5 | "origin:archive". |
6 | |
7 | Origins-Pattern allows you to give a list of |
8 | -patterns to match against. For example: |
9 | +(glob-style) patterns to match against. For example: |
10 | ``` |
11 | Unattended-Upgrade::Origins-Pattern { |
12 | "origin=Google\, Inc.,suite=contrib"; |
13 | @@ -54,6 +54,14 @@ |
14 | component "main". The apt-cache policy short identifiers |
15 | (e.g. "o" for "origin") are also supported. |
16 | |
17 | +If you already configure what to install via apt pinning, you can |
18 | +simply use "origin=*", e.g.: |
19 | +``` |
20 | + Unattended-Upgrade::Origins-Pattern { |
21 | + "origin=*"; |
22 | + }; |
23 | +``` |
24 | + |
25 | All operations are be logged in /var/log/unattended-upgrades/. This |
26 | includes the dpkg output as well. |
27 | |
28 | @@ -89,3 +97,34 @@ |
29 | your needs. If you do not have this file, just create it or |
30 | create/edit /etc/apt/apt.conf - you can check your configuration by |
31 | running "apt-config dump". |
32 | + |
33 | + |
34 | +Supported Options Reference |
35 | +--------------------------- |
36 | + |
37 | +* `Unattended-Upgrade::Package-Whitelist` - list of regular expressions |
38 | + |
39 | + Only packages that match the regular expressions in this list will be |
40 | + marked for upgrade. By default dependencies of whitelisted packages |
41 | + are allowed. This can be changed to allow only ever allow whitelisted |
42 | + packages with the `Unattended-Upgrade::Package-Whitelist-Strict` |
43 | + boolean option. |
44 | + |
45 | + Example: |
46 | + ``` |
47 | + Unattended-Upgrade::Package-Whitelist { |
48 | + "bash"; |
49 | + }; |
50 | + ``` |
51 | + |
52 | +* `Unattended-Upgrade::Package-Whitelist-Strict` - boolean |
53 | + |
54 | + When set, allow only packages in `Unattended-Upgrade::Package-Whitelist` |
55 | + to be upgraded. This means that you also need to list all dependencies |
56 | + of a whitelisted packages, e.g. if A depends on B and only A is |
57 | + whitelisted, it will be held back. |
58 | + |
59 | + Example: |
60 | + ``` |
61 | + Unattended-Upgrade::Package-Whitelist-Strict "true"; |
62 | + ``` |
63 | |
64 | === modified file 'debian/changelog' |
65 | --- debian/changelog 2014-09-11 13:12:05 +0000 |
66 | +++ debian/changelog 2014-10-15 08:16:16 +0000 |
67 | @@ -1,8 +1,35 @@ |
68 | -unattended-upgrades (0.82.8) UNRELEASED; urgency=low |
69 | - |
70 | - * unattended-upgrade: |
71 | - - use mode 0640 and root:adm for the dpkg terminal log files |
72 | - (closes: #757438) |
73 | +unattended-upgrades (0.82.10) unstable; urgency=medium |
74 | + |
75 | + [ Helge Kreutzmann ] |
76 | + * Move misplaced German program translation update from debian/po/de.po to |
77 | + po/de.po and update debconf translation from Chris Leick, closes: #751162 |
78 | + |
79 | + -- Michael Vogt <mvo@debian.org> Sun, 21 Sep 2014 21:31:20 +0200 |
80 | + |
81 | +unattended-upgrades (0.82.9) unstable; urgency=low |
82 | + |
83 | + * po/da.po: |
84 | + - updated, thanks to Joe Dalton, closes: #754130 |
85 | + * debian/po/tr.po: |
86 | + - add Turkish translation, thanks to Mert Dirik |
87 | + closes: #757500 |
88 | + * unattended-upgrades: |
89 | + - improve docstring for adjust_candidate_versions |
90 | + - ignore versions with pin priority < 100 (instead of < 0), |
91 | + thanks to Stefano Zacchiroli |
92 | + - raise error if there are marked removals in the cache |
93 | + (as a extra precaution) |
94 | + * README.md: |
95 | + - add example for matching all upgradable packages |
96 | + (thanks to Paul van der Vlis for the suggestion) |
97 | + |
98 | + -- Michael Vogt <mvo@debian.org> Thu, 21 Aug 2014 09:42:52 +0200 |
99 | + |
100 | +unattended-upgrades (0.82.8) unstable; urgency=low |
101 | + |
102 | + * really add unattended-upgrades.service file, thanks |
103 | + to Simon McVittie (closes: #745992) |
104 | + * pep8 fixes |
105 | - fix output when "dpkg --configure -a" is run to recover |
106 | from a unclean state |
107 | - log to a rotated and compressed |
108 | @@ -13,7 +40,7 @@ |
109 | - set /var/log/unattended-upgrades/ permissions to 0750 |
110 | (closes: #757438). Thanks to Joey Hess |
111 | |
112 | - -- Michael Vogt <mvo@debian.org> Thu, 11 Sep 2014 13:26:03 +0200 |
113 | + -- Michael Vogt <mvo@debian.org> Fri, 04 Jul 2014 16:55:19 +0200 |
114 | |
115 | unattended-upgrades (0.82.7) unstable; urgency=low |
116 | |
117 | |
118 | === modified file 'debian/po/de.po' |
119 | --- debian/po/de.po 2014-03-18 15:04:13 +0000 |
120 | +++ debian/po/de.po 2014-10-15 08:16:16 +0000 |
121 | @@ -6,10 +6,10 @@ |
122 | # |
123 | msgid "" |
124 | msgstr "" |
125 | -"Project-Id-Version: unattended-upgrades 0.82.3\n" |
126 | +"Project-Id-Version: unattended-upgrades 0.82.7\n" |
127 | "Report-Msgid-Bugs-To: unattended-upgrades@packages.debian.org\n" |
128 | -"POT-Creation-Date: 2013-09-13 08:12+0200\n" |
129 | -"PO-Revision-Date: 2014-03-16 13:16+0100\n" |
130 | +"POT-Creation-Date: 2009-07-06 17:32+0100\n" |
131 | +"PO-Revision-Date: 2014-06-04 22:34+0100\n" |
132 | "Last-Translator: Chris Leick <c.leick@vollbio.de>\n" |
133 | "Language-Team: German <debian-l10n-german@lists.debian.org>\n" |
134 | "Language: de\n" |
135 | @@ -18,222 +18,23 @@ |
136 | "Content-Transfer-Encoding: 8bit\n" |
137 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" |
138 | |
139 | -#: ../unattended-upgrade:136 |
140 | -#, c-format |
141 | -msgid "Progress: %s %% (%s)" |
142 | -msgstr "Fortschritt: %s %% (%s)" |
143 | - |
144 | -#: ../unattended-upgrade:352 ../unattended-upgrade:436 |
145 | -#: ../unattended-upgrade-shutdown:161 |
146 | -msgid "All upgrades installed" |
147 | -msgstr "alle Upgrades installiert" |
148 | - |
149 | -#: ../unattended-upgrade:354 ../unattended-upgrade:428 |
150 | -msgid "Installing the upgrades failed!" |
151 | -msgstr "Installation der Upgrades fehlgeschlagen!" |
152 | - |
153 | -#: ../unattended-upgrade:355 ../unattended-upgrade:429 |
154 | -#, c-format |
155 | -msgid "error message: '%s'" |
156 | -msgstr "Fehlermeldung: »%s«" |
157 | - |
158 | -#: ../unattended-upgrade:356 ../unattended-upgrade:430 |
159 | -#, c-format |
160 | -msgid "dpkg returned a error! See '%s' for details" |
161 | -msgstr "Dpkg gab einen Fehler zurück. Siehe »%s« für Einzelheiten" |
162 | - |
163 | -#: ../unattended-upgrade:685 |
164 | -msgid "" |
165 | -"No '/usr/bin/mail' or '/usr/sbin/sendmail',can not send mail. You probably " |
166 | -"want to install the 'mailx' package." |
167 | -msgstr "" |
168 | -"kein »/usr/bin/mail« oder »/usr/sbin/sendmail«, Mail kann nicht gesandt " |
169 | -"werden. Möglicherweise möchten Sie das Paket »mailx« installieren." |
170 | - |
171 | -#: ../unattended-upgrade:698 |
172 | -#, c-format |
173 | -msgid "[reboot required] unattended-upgrades result for '%s': %s" |
174 | -msgstr "[Neustart erforderlich] Unattended-Upgrades-Ergebnis für »%s«: %s" |
175 | - |
176 | -#: ../unattended-upgrade:701 |
177 | -#, c-format |
178 | -msgid "unattended-upgrades result for '%s': '%s'" |
179 | -msgstr "Unattended-Upgrades-Ergebnis für »%s«: %s" |
180 | - |
181 | -#: ../unattended-upgrade:703 |
182 | -#, c-format |
183 | -msgid "" |
184 | -"Unattended upgrade returned: %s\n" |
185 | -"\n" |
186 | -msgstr "" |
187 | -"Das unbeaufsichtigte Upgrade gab %s zurück.\n" |
188 | -"\n" |
189 | - |
190 | -#: ../unattended-upgrade:706 |
191 | -msgid "" |
192 | -"Warning: A reboot is required to complete this upgrade.\n" |
193 | -"\n" |
194 | -msgstr "" |
195 | -"Warnung: Um dieses Upgrade zu komplettieren, ist ein Neustart erforderlich.\n" |
196 | -"\n" |
197 | - |
198 | -#: ../unattended-upgrade:708 |
199 | -msgid "Packages that were upgraded:\n" |
200 | -msgstr "Pakete, von denen ein Upgrade durchgeführt wurde:\n" |
201 | - |
202 | -#: ../unattended-upgrade:710 |
203 | -msgid "Packages that attempted to upgrade:\n" |
204 | -msgstr "Pakete, bei denen versucht wurde, ein Upgrade durchzuführen:\n" |
205 | - |
206 | -#: ../unattended-upgrade:714 |
207 | -msgid "Packages with upgradable origin but kept back:\n" |
208 | -msgstr "" |
209 | -"Pakete, von deren Ursprung ein Upgrade durchgeführt werden kann, die aber\n" |
210 | -"zurückgehalten werden.\n" |
211 | - |
212 | -#: ../unattended-upgrade:719 |
213 | -msgid "Package installation log:" |
214 | -msgstr "Paketinstallationsprotokoll:" |
215 | - |
216 | -#: ../unattended-upgrade:723 |
217 | -msgid "Unattended-upgrades log:\n" |
218 | -msgstr "Unattended-Upgrades-Protokoll:\n" |
219 | - |
220 | -#: ../unattended-upgrade:747 |
221 | -#, c-format |
222 | -msgid "Writing dpkg log to '%s'" |
223 | -msgstr "Dpkg-Protokoll wird nach »%s« geschrieben" |
224 | - |
225 | -#: ../unattended-upgrade:873 |
226 | -#, c-format |
227 | -msgid "Initial blacklisted packages: %s" |
228 | -msgstr "Pakete, die anfangs auf die schwarzen Liste standen: %s" |
229 | - |
230 | -#: ../unattended-upgrade:875 |
231 | -msgid "Starting unattended upgrades script" |
232 | -msgstr "Skript für unbeaufsichtigte Upgrades wird gestartet." |
233 | - |
234 | -#: ../unattended-upgrade:878 |
235 | -#, c-format |
236 | -msgid "Allowed origins are: %s" |
237 | -msgstr "erlaubte Ursprünge sind: %s" |
238 | - |
239 | -#: ../unattended-upgrade:891 ../unattended-upgrade:892 |
240 | -msgid "Unclean dpkg state detected, trying to correct" |
241 | -msgstr "unsauberer Dpkg-Status entdeckt, es wird versucht dies zu korrigieren" |
242 | - |
243 | -#: ../unattended-upgrade:901 |
244 | -#, c-format |
245 | -msgid "" |
246 | -"dpkg --configure -a output:\n" |
247 | -"%s" |
248 | -msgstr "" |
249 | -"»dpkg --configure -a«-Ausgabe:\n" |
250 | -"%s" |
251 | - |
252 | -#: ../unattended-upgrade:910 |
253 | -msgid "Lock could not be acquired (another package manager running?)" |
254 | -msgstr "" |
255 | -"Sperrung konnte nicht erreicht werden (läuft eine weitere Paketverwaltung?)" |
256 | - |
257 | -#: ../unattended-upgrade:912 |
258 | -msgid "Cache lock can not be acquired, exiting" |
259 | -msgstr "Zwischenspeicher konnte nicht gesperrt werden, wird beendet" |
260 | - |
261 | -#: ../unattended-upgrade:919 ../unattended-upgrade:920 |
262 | -msgid "Cache has broken packages, exiting" |
263 | -msgstr "Zwischenspeicher enthält beschädigte Pakete, wird beendet" |
264 | - |
265 | -#: ../unattended-upgrade:961 |
266 | -#, c-format |
267 | -msgid "package '%s' upgradable but fails to be marked for upgrade (%s)" |
268 | -msgstr "" |
269 | -"Von Paket »%s« könnte ein Upgrade durchgeführt werden, es ist jedoch " |
270 | -"fehlgeschlagen, dies für das Upgrade zu markieren (%s)" |
271 | - |
272 | -#: ../unattended-upgrade:982 |
273 | -#, c-format |
274 | -msgid "GetArchives() failed: '%s'" |
275 | -msgstr "GetArchives() fehlgeschlagen: »%s«" |
276 | - |
277 | -#: ../unattended-upgrade:992 ../unattended-upgrade:993 |
278 | -#, c-format |
279 | -msgid "An error occurred: '%s'" |
280 | -msgstr "Es ist ein Fehler aufgetreten: »%s«" |
281 | - |
282 | -#: ../unattended-upgrade:995 ../unattended-upgrade:997 |
283 | -#, c-format |
284 | -msgid "The URI '%s' failed to download, aborting" |
285 | -msgstr "Herunterladen von der URI »%s« fehlgeschlagen, wird abgebrochen" |
286 | - |
287 | -#: ../unattended-upgrade:1001 |
288 | -#, c-format |
289 | -msgid "Download finished, but file '%s' not there?!?" |
290 | -msgstr "Herunterladen beendet, aber Datei »%s« ist nicht dort!?" |
291 | - |
292 | -#: ../unattended-upgrade:1017 ../unattended-upgrade:1021 |
293 | -#, c-format |
294 | -msgid "Package '%s' has conffile prompt and needs to be upgraded manually" |
295 | -msgstr "" |
296 | -"Das Paket »%s« hat eine Conffile-Abfrage und muss einem manuellen Upgrade " |
297 | -"unterzogen werden." |
298 | - |
299 | -#: ../unattended-upgrade:1044 |
300 | -#, c-format |
301 | -msgid "package '%s' not upgraded" |
302 | -msgstr "Von Paket »%s« wurde kein Upgrade durchgeführt." |
303 | - |
304 | -#: ../unattended-upgrade:1059 |
305 | -#, c-format |
306 | -msgid "Packages that are auto removed: '%s'" |
307 | -msgstr "Pakete, die automatisch entfernt wurden: »%s«" |
308 | - |
309 | -#: ../unattended-upgrade:1068 |
310 | -msgid "No packages found that can be upgraded unattended" |
311 | -msgstr "" |
312 | -"Es wurden keine Pakete gefunden, von denen ein unbeaufsichtigtes Upgrade " |
313 | -"durchgeführt werden kann." |
314 | - |
315 | -#: ../unattended-upgrade:1088 |
316 | -#, c-format |
317 | -msgid "Packages that will be upgraded: %s" |
318 | -msgstr "Pakete, von denen ein Upgrade durchgeführt wird: %s" |
319 | - |
320 | -#: ../unattended-upgrade:1125 |
321 | -msgid "print debug messages" |
322 | -msgstr "Nachrichten zur Fehlersuche ausgeben" |
323 | - |
324 | -#: ../unattended-upgrade:1128 |
325 | -msgid "make apt/libapt print verbose debug messages" |
326 | -msgstr "APT/LibAPT detaillierte Nachrichten zur Fehlersuche ausgeben lassen" |
327 | - |
328 | -#: ../unattended-upgrade:1131 |
329 | -msgid "print info messages" |
330 | -msgstr "Informationsnachrichten ausgeben" |
331 | - |
332 | -#: ../unattended-upgrade:1134 |
333 | -msgid "Simulation, download but do not install" |
334 | -msgstr "Simulation, herunterladen, aber nicht installieren" |
335 | - |
336 | -#: ../unattended-upgrade:1137 |
337 | -msgid "Upgrade in minimal steps (and allow interrupting with SIGINT" |
338 | -msgstr "Upgrade in minimalen Schritten (Unterbrechung mit SIGINT erlaubt)" |
339 | - |
340 | -#: ../unattended-upgrade:1142 |
341 | -msgid "You need to be root to run this application" |
342 | -msgstr "Sie müssen Root sein, um diese Anwendung auszuführen." |
343 | - |
344 | -#: ../unattended-upgrade-shutdown:72 |
345 | -msgid "Unattended-upgrade in progress during shutdown, sleeping for 5s" |
346 | -msgstr "" |
347 | -"Unattended-Upgrade läuft während des Herunterfahrens weiter, es wird fünf " |
348 | -"Sekunden lang gewartet." |
349 | - |
350 | -#: ../unattended-upgrade-shutdown:125 |
351 | -msgid "Running unattended-upgrades in shutdown mode" |
352 | -msgstr "Unattended-Upgrades im Herunterfahrmodus ausführen" |
353 | - |
354 | -#: ../unattended-upgrade-shutdown:153 |
355 | -#, c-format |
356 | -msgid "Giving up on lockfile after %s delay" |
357 | -msgstr "Sperrdatei, hier wird nach %s Verzögerung aufgegeben." |
358 | +#. Type: boolean |
359 | +#. Description |
360 | +#: ../templates:2001 |
361 | +msgid "Automatically download and install stable updates?" |
362 | +msgstr "Aktualisierungen für Stable automatisch herunterladen und installieren?" |
363 | + |
364 | +#. Type: boolean |
365 | +#. Description |
366 | +#: ../templates:2001 |
367 | +msgid "" |
368 | +"Applying updates on a frequent basis is an important part of keeping systems " |
369 | +"secure. By default, updates need to be applied manually using package " |
370 | +"management tools. Alternatively, you can choose to have this system " |
371 | +"automatically download and install security updates." |
372 | +msgstr "" |
373 | +"Häufige Aktualisierungen sind wichtig, um Systeme sicher zu halten. " |
374 | +"Standardmäßig müssen Aktualisierungen manuell mittels " |
375 | +"Paketverwaltungswerkzeugen durchgeführt werden. Alternativ können Sie " |
376 | +"auswählen, dass dieses System Sicherheitsaktualisierungen automatisch " |
377 | +"herunterlädt und installiert." |
378 | |
379 | === added file 'debian/po/tr.po' |
380 | --- debian/po/tr.po 1970-01-01 00:00:00 +0000 |
381 | +++ debian/po/tr.po 2014-10-15 08:16:16 +0000 |
382 | @@ -0,0 +1,40 @@ |
383 | +# Turkish translation of unattended-upgrades package |
384 | +# Copyright (C) 2014 Mert Dirik |
385 | +# This file is distributed under the same license as the unattended-upgrades package. |
386 | +# Mert Dirik <mertdirik@gmail.com>, 2014. |
387 | +# |
388 | +msgid "" |
389 | +msgstr "" |
390 | +"Project-Id-Version: unattended-upgrades 0.82.8\n" |
391 | +"Report-Msgid-Bugs-To: unattended-upgrades@packages.debian.org\n" |
392 | +"POT-Creation-Date: 2009-07-06 17:32+0100\n" |
393 | +"PO-Revision-Date: 2014-08-03 17:03+0200\n" |
394 | +"Last-Translator: Mert Dirik <mertdirik@gmail.com>\n" |
395 | +"Language-Team: Debian L10n Turkish <debian-l10n-turkish@lists.debian.org>\n" |
396 | +"MIME-Version: 1.0\n" |
397 | +"Content-Type: text/plain; charset=UTF-8\n" |
398 | +"Content-Transfer-Encoding: 8bit\n" |
399 | +"X-Generator: Poedit 1.5.4\n" |
400 | +"Language: tr\n" |
401 | + |
402 | +#. Type: boolean |
403 | +#. Description |
404 | +#: ../templates:2001 |
405 | +msgid "Automatically download and install stable updates?" |
406 | +msgstr "" |
407 | +"Kararlı sürüm güncellemeleri otomatik olarak indirilsin ve kurulsun mu?" |
408 | + |
409 | +#. Type: boolean |
410 | +#. Description |
411 | +#: ../templates:2001 |
412 | +msgid "" |
413 | +"Applying updates on a frequent basis is an important part of keeping systems " |
414 | +"secure. By default, updates need to be applied manually using package " |
415 | +"management tools. Alternatively, you can choose to have this system " |
416 | +"automatically download and install security updates." |
417 | +msgstr "" |
418 | +"Sisteminiz için yayımlanan güncellemeleri sık sık uygulamak sisteminizi " |
419 | +"güvenli tutmanın önemli bir parçasıdır. Öntanımlı durumda güncellemeleri " |
420 | +"paket yönetim araçlarını kullanarak elle uygulamanız gerekir. Bunun yerine, " |
421 | +"bu sistemi güvenlik güncellemelerini otomatik olarak indirecek ve kuracak " |
422 | +"şekilde ayarlayabilirsiniz." |
423 | |
424 | === added file 'debian/unattended-upgrades.service' |
425 | --- debian/unattended-upgrades.service 1970-01-01 00:00:00 +0000 |
426 | +++ debian/unattended-upgrades.service 2014-10-15 08:16:16 +0000 |
427 | @@ -0,0 +1,12 @@ |
428 | +[Unit] |
429 | +Description=Unattended Upgrades |
430 | +DefaultDependencies=no |
431 | +Before=shutdown.target reboot.target halt.target |
432 | +Documentation=man:unattended-upgrade(8) |
433 | + |
434 | +[Service] |
435 | +Type=oneshot |
436 | +ExecStart=/usr/share/unattended-upgrades/unattended-upgrade-shutdown |
437 | + |
438 | +[Install] |
439 | +WantedBy=shutdown.target |
440 | |
441 | === modified file 'po/da.po' |
442 | --- po/da.po 2012-06-18 07:22:43 +0000 |
443 | +++ po/da.po 2014-10-15 08:16:16 +0000 |
444 | @@ -1,14 +1,14 @@ |
445 | # Danish translation unattended-upgrades. |
446 | -# Copyright (C) 2012 unattended-upgrades & nedenstående oversættere. |
447 | +# Copyright (C) 2014 unattended-upgrades & nedenstående oversættere. |
448 | # This file is distributed under the same license as the unattended-upgrades package. |
449 | -# Joe Hansen <joedalton2@yahoo.dk>, 2012. |
450 | +# Joe Hansen <joedalton2@yahoo.dk>, 2012, 2014. |
451 | # |
452 | msgid "" |
453 | msgstr "" |
454 | "Project-Id-Version: unattended-upgrades\n" |
455 | "Report-Msgid-Bugs-To: \n" |
456 | -"POT-Creation-Date: 2011-07-19 15:24+0200\n" |
457 | -"PO-Revision-Date: 2012-06-16 23:51+0200\n" |
458 | +"POT-Creation-Date: 2013-09-13 08:12+0200\n" |
459 | +"PO-Revision-Date: 2014-07-07 23:51+0200\n" |
460 | "Last-Translator: Joe Hansen <joedalton2@yahoo.dk>\n" |
461 | "Language-Team: Danish <debian-l10n-danish@lists.debian.org>\n" |
462 | "Language: da\n" |
463 | @@ -16,53 +16,49 @@ |
464 | "Content-Type: text/plain; charset=UTF-8\n" |
465 | "Content-Transfer-Encoding: 8bit\n" |
466 | |
467 | -#: ../unattended-upgrade:72 |
468 | +#: ../unattended-upgrade:136 |
469 | #, c-format |
470 | msgid "Progress: %s %% (%s)" |
471 | msgstr "Status: %s %% (%s)" |
472 | |
473 | -#: ../unattended-upgrade:190 ../unattended-upgrade:254 |
474 | +#: ../unattended-upgrade:352 ../unattended-upgrade:436 |
475 | +#: ../unattended-upgrade-shutdown:161 |
476 | msgid "All upgrades installed" |
477 | msgstr "Alle opgraderinger er installeret" |
478 | |
479 | -#: ../unattended-upgrade:192 ../unattended-upgrade:246 |
480 | +#: ../unattended-upgrade:354 ../unattended-upgrade:428 |
481 | msgid "Installing the upgrades failed!" |
482 | msgstr "Installation af opgraderingerne mislykkedes!" |
483 | |
484 | -#: ../unattended-upgrade:193 ../unattended-upgrade:247 |
485 | +#: ../unattended-upgrade:355 ../unattended-upgrade:429 |
486 | #, c-format |
487 | msgid "error message: '%s'" |
488 | msgstr "fejlbesked: »%s«" |
489 | |
490 | -#: ../unattended-upgrade:194 ../unattended-upgrade:248 |
491 | +#: ../unattended-upgrade:356 ../unattended-upgrade:430 |
492 | #, c-format |
493 | msgid "dpkg returned a error! See '%s' for details" |
494 | msgstr "dpkg returnerede en fejl! Se »%s« for detaljer" |
495 | |
496 | -#: ../unattended-upgrade:231 |
497 | -#, c-format |
498 | -msgid "Progress: %s %%: (%s)" |
499 | -msgstr "Status: %s %%: (%s)" |
500 | - |
501 | -#: ../unattended-upgrade:412 |
502 | +#: ../unattended-upgrade:685 |
503 | msgid "" |
504 | -"No '/usr/bin/mail', can not send mail. You probably want to install the " |
505 | -"'mailx' package." |
506 | +"No '/usr/bin/mail' or '/usr/sbin/sendmail',can not send mail. You probably " |
507 | +"want to install the 'mailx' package." |
508 | msgstr "" |
509 | -"Ingen »/usr/bin/mail«, kan ikke sende post. Du skal sikkert installere " |
510 | -"pakken »mailx«." |
511 | - |
512 | -#: ../unattended-upgrade:423 |
513 | -#, c-format |
514 | -msgid "[reboot required] unattended-upgrades result for '%s'" |
515 | -msgstr "[genstart krævet] unattended-upgrades resultat for »%s«" |
516 | - |
517 | -#: ../unattended-upgrade:425 |
518 | -#, c-format |
519 | -msgid "unattended-upgrades result for '%s'" |
520 | -msgstr "unattended-upgrades resultat for »%s«" |
521 | - |
522 | -#: ../unattended-upgrade:428 |
523 | +"Ingen »/usr/bin/mail« eller »/usr/sbin/sendmail« kan sende post. Du skal " |
524 | +"sikkert installere pakken »mailx«." |
525 | + |
526 | +#: ../unattended-upgrade:698 |
527 | +#, c-format |
528 | +msgid "[reboot required] unattended-upgrades result for '%s': %s" |
529 | +msgstr "[genstart krævet] unattended-upgrades resultat for »%s: %s«" |
530 | + |
531 | +#: ../unattended-upgrade:701 |
532 | +#, c-format |
533 | +msgid "unattended-upgrades result for '%s': '%s'" |
534 | +msgstr "unattended-upgrades resultat for »%s«: »%s«" |
535 | + |
536 | +#: ../unattended-upgrade:703 |
537 | #, c-format |
538 | msgid "" |
539 | "Unattended upgrade returned: %s\n" |
540 | @@ -71,7 +67,7 @@ |
541 | "Unattended upgrade returnerede: %s\n" |
542 | "\n" |
543 | |
544 | -#: ../unattended-upgrade:430 |
545 | +#: ../unattended-upgrade:706 |
546 | msgid "" |
547 | "Warning: A reboot is required to complete this upgrade.\n" |
548 | "\n" |
549 | @@ -79,41 +75,50 @@ |
550 | "Advarsel: En genstart er krævet for at færdiggøre denne opgradering.\n" |
551 | "\n" |
552 | |
553 | -#: ../unattended-upgrade:431 |
554 | -msgid "Packages that are upgraded:\n" |
555 | -msgstr "Pakker som opgraderes:\n" |
556 | - |
557 | -#: ../unattended-upgrade:435 |
558 | +#: ../unattended-upgrade:708 |
559 | +msgid "Packages that were upgraded:\n" |
560 | +msgstr "Pakker som blev opgraderet:\n" |
561 | + |
562 | +#: ../unattended-upgrade:710 |
563 | +msgid "Packages that attempted to upgrade:\n" |
564 | +msgstr "Pakker som forsøgte at opgradere:\n" |
565 | + |
566 | +#: ../unattended-upgrade:714 |
567 | msgid "Packages with upgradable origin but kept back:\n" |
568 | msgstr "Pakker med opgraderbar oprindelse men holdt tilbage:\n" |
569 | |
570 | -#: ../unattended-upgrade:439 |
571 | +#: ../unattended-upgrade:719 |
572 | msgid "Package installation log:" |
573 | msgstr "Log for pakkeinstallation:" |
574 | |
575 | -#: ../unattended-upgrade:442 |
576 | +#: ../unattended-upgrade:723 |
577 | msgid "Unattended-upgrades log:\n" |
578 | msgstr "Log for unattended-upgrades:\n" |
579 | |
580 | -#: ../unattended-upgrade:513 |
581 | +#: ../unattended-upgrade:747 |
582 | +#, c-format |
583 | +msgid "Writing dpkg log to '%s'" |
584 | +msgstr "Skriver dpkg-log til »%s«" |
585 | + |
586 | +#: ../unattended-upgrade:873 |
587 | #, c-format |
588 | msgid "Initial blacklisted packages: %s" |
589 | msgstr "Oprindelig sortlistede pakker: %s" |
590 | |
591 | -#: ../unattended-upgrade:514 |
592 | +#: ../unattended-upgrade:875 |
593 | msgid "Starting unattended upgrades script" |
594 | msgstr "Starter skript for unattended upgrades" |
595 | |
596 | -#: ../unattended-upgrade:517 |
597 | +#: ../unattended-upgrade:878 |
598 | #, c-format |
599 | msgid "Allowed origins are: %s" |
600 | msgstr "Tilladte oprindelser er: %s" |
601 | |
602 | -#: ../unattended-upgrade:528 ../unattended-upgrade:529 |
603 | +#: ../unattended-upgrade:891 ../unattended-upgrade:892 |
604 | msgid "Unclean dpkg state detected, trying to correct" |
605 | msgstr "Uklar dpkg-tilstand detekteret, forsøger at rette" |
606 | |
607 | -#: ../unattended-upgrade:538 |
608 | +#: ../unattended-upgrade:901 |
609 | #, c-format |
610 | msgid "" |
611 | "dpkg --configure -a output:\n" |
612 | @@ -122,95 +127,102 @@ |
613 | "dpkg --configure -a output:\n" |
614 | "%s" |
615 | |
616 | -#: ../unattended-upgrade:546 |
617 | +#: ../unattended-upgrade:910 |
618 | msgid "Lock could not be acquired (another package manager running?)" |
619 | msgstr "Lås kunne ikke indhentes (kører en anden pakkehåndtering?)" |
620 | |
621 | -#: ../unattended-upgrade:548 |
622 | +#: ../unattended-upgrade:912 |
623 | msgid "Cache lock can not be acquired, exiting" |
624 | msgstr "Lås for mellemlager kan ikke indhentes, afslutter" |
625 | |
626 | -#: ../unattended-upgrade:554 ../unattended-upgrade:555 |
627 | +#: ../unattended-upgrade:919 ../unattended-upgrade:920 |
628 | msgid "Cache has broken packages, exiting" |
629 | msgstr "Mellemlager har ødelagte pakker, afslutter" |
630 | |
631 | -#: ../unattended-upgrade:581 |
632 | +#: ../unattended-upgrade:961 |
633 | #, c-format |
634 | msgid "package '%s' upgradable but fails to be marked for upgrade (%s)" |
635 | msgstr "pakke »%s« kan opgraderes men fejler i markering for opgradering (%s)" |
636 | |
637 | -#: ../unattended-upgrade:601 |
638 | +#: ../unattended-upgrade:982 |
639 | #, c-format |
640 | msgid "GetArchives() failed: '%s'" |
641 | msgstr "GetArchives() mislykkedes: »%s«" |
642 | |
643 | -#: ../unattended-upgrade:610 ../unattended-upgrade:611 |
644 | +#: ../unattended-upgrade:992 ../unattended-upgrade:993 |
645 | #, c-format |
646 | -msgid "An error ocured: '%s'" |
647 | +msgid "An error occurred: '%s'" |
648 | msgstr "Der opstod en fejl: »%s«" |
649 | |
650 | -#: ../unattended-upgrade:613 ../unattended-upgrade:614 |
651 | +#: ../unattended-upgrade:995 ../unattended-upgrade:997 |
652 | #, c-format |
653 | msgid "The URI '%s' failed to download, aborting" |
654 | msgstr "Der kunne ikke hentes fra adressen »%s«, afbryder" |
655 | |
656 | -#: ../unattended-upgrade:617 |
657 | +#: ../unattended-upgrade:1001 |
658 | #, c-format |
659 | msgid "Download finished, but file '%s' not there?!?" |
660 | msgstr "Hentning færdig, men filen »%s« var der ikke?!?" |
661 | |
662 | -#: ../unattended-upgrade:626 |
663 | +#: ../unattended-upgrade:1017 ../unattended-upgrade:1021 |
664 | #, c-format |
665 | msgid "Package '%s' has conffile prompt and needs to be upgraded manually" |
666 | msgstr "" |
667 | "Pakke »%s« bliver spurgt om oplysninger fra konfigurationsfilen og skal " |
668 | "opgraderes manuelt" |
669 | |
670 | -#: ../unattended-upgrade:648 |
671 | +#: ../unattended-upgrade:1044 |
672 | #, c-format |
673 | msgid "package '%s' not upgraded" |
674 | msgstr "pakke »%s« blev ikke opgraderet" |
675 | |
676 | -#: ../unattended-upgrade:662 |
677 | +#: ../unattended-upgrade:1059 |
678 | #, c-format |
679 | msgid "Packages that are auto removed: '%s'" |
680 | msgstr "Pakker som automatisk fjernes: »%s«" |
681 | |
682 | -#: ../unattended-upgrade:669 |
683 | +#: ../unattended-upgrade:1068 |
684 | msgid "No packages found that can be upgraded unattended" |
685 | msgstr "Ingen pakker fundet som kan opgraderes uden ledsager" |
686 | |
687 | -#: ../unattended-upgrade:679 |
688 | -#, c-format |
689 | -msgid "Packages that are upgraded: %s" |
690 | -msgstr "Pakker som blev opgraderet: %s" |
691 | - |
692 | -#: ../unattended-upgrade:693 |
693 | -#, c-format |
694 | -msgid "Writing dpkg log to '%s'" |
695 | -msgstr "Skriver dpkg-log til »%s«" |
696 | - |
697 | -#: ../unattended-upgrade:744 |
698 | +#: ../unattended-upgrade:1088 |
699 | +#, c-format |
700 | +msgid "Packages that will be upgraded: %s" |
701 | +msgstr "Pakker som vil blive opgraderet: %s" |
702 | + |
703 | +#: ../unattended-upgrade:1125 |
704 | msgid "print debug messages" |
705 | msgstr "vis fejlsøgningsbeskeder" |
706 | |
707 | -#: ../unattended-upgrade:747 |
708 | +#: ../unattended-upgrade:1128 |
709 | +msgid "make apt/libapt print verbose debug messages" |
710 | +msgstr "lad apt/libapt vise uddybende fejlsøgningsbeskeder" |
711 | + |
712 | +#: ../unattended-upgrade:1131 |
713 | +msgid "print info messages" |
714 | +msgstr "vis informationsbeskeder" |
715 | + |
716 | +#: ../unattended-upgrade:1134 |
717 | msgid "Simulation, download but do not install" |
718 | msgstr "Simulation, hent men installer ikke" |
719 | |
720 | -#: ../unattended-upgrade:750 |
721 | +#: ../unattended-upgrade:1137 |
722 | msgid "Upgrade in minimal steps (and allow interrupting with SIGINT" |
723 | msgstr "Opgrader i små trin (og tillad afbrydelse med SIGINT)" |
724 | |
725 | -#: ../unattended-upgrade:754 |
726 | +#: ../unattended-upgrade:1142 |
727 | msgid "You need to be root to run this application" |
728 | msgstr "Du skal være administrator (root) for at køre dette program" |
729 | |
730 | -#: ../unattended-upgrade-shutdown:95 |
731 | +#: ../unattended-upgrade-shutdown:72 |
732 | msgid "Unattended-upgrade in progress during shutdown, sleeping for 5s" |
733 | msgstr "Unattended-upgrade i gang under nedlukning, sover for 5 sekunder" |
734 | |
735 | -#: ../unattended-upgrade-shutdown:106 |
736 | +#: ../unattended-upgrade-shutdown:125 |
737 | +msgid "Running unattended-upgrades in shutdown mode" |
738 | +msgstr "Kører unattended-upgrades i nedlukningstilstand" |
739 | + |
740 | +#: ../unattended-upgrade-shutdown:153 |
741 | #, c-format |
742 | msgid "Giving up on lockfile after %s delay" |
743 | msgstr "Opgiver låsefilen efter %s forsinkelse" |
744 | |
745 | === modified file 'po/de.po' |
746 | --- po/de.po 2012-06-20 07:02:22 +0000 |
747 | +++ po/de.po 2014-10-15 08:16:16 +0000 |
748 | @@ -1,15 +1,15 @@ |
749 | # Translation of unattended-upgrades to German. |
750 | -# Copyright (C) . |
751 | +# Copyright (C) 2005-2009 Canonical Ltd. |
752 | # This file is distributed under the same license as the |
753 | # unattended-upgrades package. |
754 | -# Copyright (C) of this file 2012 Chris Leick. |
755 | +# Copyright (C) of this file 2012-2014 Chris Leick. |
756 | # |
757 | msgid "" |
758 | msgstr "" |
759 | -"Project-Id-Version: unattended-upgrades 0.77\n" |
760 | +"Project-Id-Version: unattended-upgrades 0.82.3\n" |
761 | "Report-Msgid-Bugs-To: unattended-upgrades@packages.debian.org\n" |
762 | -"POT-Creation-Date: 2011-07-19 15:24+0200\n" |
763 | -"PO-Revision-Date: 2012-06-14 21:28+0200\n" |
764 | +"POT-Creation-Date: 2013-09-13 08:12+0200\n" |
765 | +"PO-Revision-Date: 2014-03-16 13:16+0100\n" |
766 | "Last-Translator: Chris Leick <c.leick@vollbio.de>\n" |
767 | "Language-Team: German <debian-l10n-german@lists.debian.org>\n" |
768 | "Language: de\n" |
769 | @@ -18,53 +18,49 @@ |
770 | "Content-Transfer-Encoding: 8bit\n" |
771 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" |
772 | |
773 | -#: ../unattended-upgrade:72 |
774 | +#: ../unattended-upgrade:136 |
775 | #, c-format |
776 | msgid "Progress: %s %% (%s)" |
777 | msgstr "Fortschritt: %s %% (%s)" |
778 | |
779 | -#: ../unattended-upgrade:190 ../unattended-upgrade:254 |
780 | +#: ../unattended-upgrade:352 ../unattended-upgrade:436 |
781 | +#: ../unattended-upgrade-shutdown:161 |
782 | msgid "All upgrades installed" |
783 | msgstr "alle Upgrades installiert" |
784 | |
785 | -#: ../unattended-upgrade:192 ../unattended-upgrade:246 |
786 | +#: ../unattended-upgrade:354 ../unattended-upgrade:428 |
787 | msgid "Installing the upgrades failed!" |
788 | msgstr "Installation der Upgrades fehlgeschlagen!" |
789 | |
790 | -#: ../unattended-upgrade:193 ../unattended-upgrade:247 |
791 | +#: ../unattended-upgrade:355 ../unattended-upgrade:429 |
792 | #, c-format |
793 | msgid "error message: '%s'" |
794 | msgstr "Fehlermeldung: »%s«" |
795 | |
796 | -#: ../unattended-upgrade:194 ../unattended-upgrade:248 |
797 | +#: ../unattended-upgrade:356 ../unattended-upgrade:430 |
798 | #, c-format |
799 | msgid "dpkg returned a error! See '%s' for details" |
800 | msgstr "Dpkg gab einen Fehler zurück. Siehe »%s« für Einzelheiten" |
801 | |
802 | -#: ../unattended-upgrade:231 |
803 | -#, c-format |
804 | -msgid "Progress: %s %%: (%s)" |
805 | -msgstr "Fortschritt: %s %%: (%s)" |
806 | - |
807 | -#: ../unattended-upgrade:412 |
808 | +#: ../unattended-upgrade:685 |
809 | msgid "" |
810 | -"No '/usr/bin/mail', can not send mail. You probably want to install the " |
811 | -"'mailx' package." |
812 | +"No '/usr/bin/mail' or '/usr/sbin/sendmail',can not send mail. You probably " |
813 | +"want to install the 'mailx' package." |
814 | msgstr "" |
815 | -"kein »/usr/bin/mail«, Mail kann nicht gesandt werden. Möglicherweise möchten " |
816 | -"Sie das Paket »mailx« installieren." |
817 | - |
818 | -#: ../unattended-upgrade:423 |
819 | -#, c-format |
820 | -msgid "[reboot required] unattended-upgrades result for '%s'" |
821 | -msgstr "[Neustart erforderlich] Unattended-Upgrades-Ergebnis für »%s«" |
822 | - |
823 | -#: ../unattended-upgrade:425 |
824 | -#, c-format |
825 | -msgid "unattended-upgrades result for '%s'" |
826 | -msgstr "Unattended-Upgrades-Ergebnis für »%s«" |
827 | - |
828 | -#: ../unattended-upgrade:428 |
829 | +"kein »/usr/bin/mail« oder »/usr/sbin/sendmail«, Mail kann nicht gesandt " |
830 | +"werden. Möglicherweise möchten Sie das Paket »mailx« installieren." |
831 | + |
832 | +#: ../unattended-upgrade:698 |
833 | +#, c-format |
834 | +msgid "[reboot required] unattended-upgrades result for '%s': %s" |
835 | +msgstr "[Neustart erforderlich] Unattended-Upgrades-Ergebnis für »%s«: %s" |
836 | + |
837 | +#: ../unattended-upgrade:701 |
838 | +#, c-format |
839 | +msgid "unattended-upgrades result for '%s': '%s'" |
840 | +msgstr "Unattended-Upgrades-Ergebnis für »%s«: %s" |
841 | + |
842 | +#: ../unattended-upgrade:703 |
843 | #, c-format |
844 | msgid "" |
845 | "Unattended upgrade returned: %s\n" |
846 | @@ -73,7 +69,7 @@ |
847 | "Das unbeaufsichtigte Upgrade gab %s zurück.\n" |
848 | "\n" |
849 | |
850 | -#: ../unattended-upgrade:430 |
851 | +#: ../unattended-upgrade:706 |
852 | msgid "" |
853 | "Warning: A reboot is required to complete this upgrade.\n" |
854 | "\n" |
855 | @@ -81,43 +77,52 @@ |
856 | "Warnung: Um dieses Upgrade zu komplettieren, ist ein Neustart erforderlich.\n" |
857 | "\n" |
858 | |
859 | -#: ../unattended-upgrade:431 |
860 | -msgid "Packages that are upgraded:\n" |
861 | +#: ../unattended-upgrade:708 |
862 | +msgid "Packages that were upgraded:\n" |
863 | msgstr "Pakete, von denen ein Upgrade durchgeführt wurde:\n" |
864 | |
865 | -#: ../unattended-upgrade:435 |
866 | +#: ../unattended-upgrade:710 |
867 | +msgid "Packages that attempted to upgrade:\n" |
868 | +msgstr "Pakete, bei denen versucht wurde, ein Upgrade durchzuführen:\n" |
869 | + |
870 | +#: ../unattended-upgrade:714 |
871 | msgid "Packages with upgradable origin but kept back:\n" |
872 | msgstr "" |
873 | "Pakete, von deren Ursprung ein Upgrade durchgeführt werden kann, die aber\n" |
874 | "zurückgehalten werden.\n" |
875 | |
876 | -#: ../unattended-upgrade:439 |
877 | +#: ../unattended-upgrade:719 |
878 | msgid "Package installation log:" |
879 | msgstr "Paketinstallationsprotokoll:" |
880 | |
881 | -#: ../unattended-upgrade:442 |
882 | +#: ../unattended-upgrade:723 |
883 | msgid "Unattended-upgrades log:\n" |
884 | msgstr "Unattended-Upgrades-Protokoll:\n" |
885 | |
886 | -#: ../unattended-upgrade:513 |
887 | +#: ../unattended-upgrade:747 |
888 | +#, c-format |
889 | +msgid "Writing dpkg log to '%s'" |
890 | +msgstr "Dpkg-Protokoll wird nach »%s« geschrieben" |
891 | + |
892 | +#: ../unattended-upgrade:873 |
893 | #, c-format |
894 | msgid "Initial blacklisted packages: %s" |
895 | msgstr "Pakete, die anfangs auf die schwarzen Liste standen: %s" |
896 | |
897 | -#: ../unattended-upgrade:514 |
898 | +#: ../unattended-upgrade:875 |
899 | msgid "Starting unattended upgrades script" |
900 | msgstr "Skript für unbeaufsichtigte Upgrades wird gestartet." |
901 | |
902 | -#: ../unattended-upgrade:517 |
903 | +#: ../unattended-upgrade:878 |
904 | #, c-format |
905 | msgid "Allowed origins are: %s" |
906 | msgstr "erlaubte Ursprünge sind: %s" |
907 | |
908 | -#: ../unattended-upgrade:528 ../unattended-upgrade:529 |
909 | +#: ../unattended-upgrade:891 ../unattended-upgrade:892 |
910 | msgid "Unclean dpkg state detected, trying to correct" |
911 | msgstr "unsauberer Dpkg-Status entdeckt, es wird versucht dies zu korrigieren" |
912 | |
913 | -#: ../unattended-upgrade:538 |
914 | +#: ../unattended-upgrade:901 |
915 | #, c-format |
916 | msgid "" |
917 | "dpkg --configure -a output:\n" |
918 | @@ -126,102 +131,109 @@ |
919 | "»dpkg --configure -a«-Ausgabe:\n" |
920 | "%s" |
921 | |
922 | -#: ../unattended-upgrade:546 |
923 | +#: ../unattended-upgrade:910 |
924 | msgid "Lock could not be acquired (another package manager running?)" |
925 | msgstr "" |
926 | "Sperrung konnte nicht erreicht werden (läuft eine weitere Paketverwaltung?)" |
927 | |
928 | -#: ../unattended-upgrade:548 |
929 | +#: ../unattended-upgrade:912 |
930 | msgid "Cache lock can not be acquired, exiting" |
931 | msgstr "Zwischenspeicher konnte nicht gesperrt werden, wird beendet" |
932 | |
933 | -#: ../unattended-upgrade:554 ../unattended-upgrade:555 |
934 | +#: ../unattended-upgrade:919 ../unattended-upgrade:920 |
935 | msgid "Cache has broken packages, exiting" |
936 | msgstr "Zwischenspeicher enthält beschädigte Pakete, wird beendet" |
937 | |
938 | -#: ../unattended-upgrade:581 |
939 | +#: ../unattended-upgrade:961 |
940 | #, c-format |
941 | msgid "package '%s' upgradable but fails to be marked for upgrade (%s)" |
942 | msgstr "" |
943 | "Von Paket »%s« könnte ein Upgrade durchgeführt werden, es ist jedoch " |
944 | "fehlgeschlagen, dies für das Upgrade zu markieren (%s)" |
945 | |
946 | -#: ../unattended-upgrade:601 |
947 | +#: ../unattended-upgrade:982 |
948 | #, c-format |
949 | msgid "GetArchives() failed: '%s'" |
950 | msgstr "GetArchives() fehlgeschlagen: »%s«" |
951 | |
952 | -#: ../unattended-upgrade:610 ../unattended-upgrade:611 |
953 | +#: ../unattended-upgrade:992 ../unattended-upgrade:993 |
954 | #, c-format |
955 | -msgid "An error ocured: '%s'" |
956 | +msgid "An error occurred: '%s'" |
957 | msgstr "Es ist ein Fehler aufgetreten: »%s«" |
958 | |
959 | -#: ../unattended-upgrade:613 ../unattended-upgrade:614 |
960 | +#: ../unattended-upgrade:995 ../unattended-upgrade:997 |
961 | #, c-format |
962 | msgid "The URI '%s' failed to download, aborting" |
963 | msgstr "Herunterladen von der URI »%s« fehlgeschlagen, wird abgebrochen" |
964 | |
965 | -#: ../unattended-upgrade:617 |
966 | +#: ../unattended-upgrade:1001 |
967 | #, c-format |
968 | msgid "Download finished, but file '%s' not there?!?" |
969 | msgstr "Herunterladen beendet, aber Datei »%s« ist nicht dort!?" |
970 | |
971 | -#: ../unattended-upgrade:626 |
972 | +#: ../unattended-upgrade:1017 ../unattended-upgrade:1021 |
973 | #, c-format |
974 | msgid "Package '%s' has conffile prompt and needs to be upgraded manually" |
975 | msgstr "" |
976 | "Das Paket »%s« hat eine Conffile-Abfrage und muss einem manuellen Upgrade " |
977 | "unterzogen werden." |
978 | |
979 | -#: ../unattended-upgrade:648 |
980 | +#: ../unattended-upgrade:1044 |
981 | #, c-format |
982 | msgid "package '%s' not upgraded" |
983 | msgstr "Von Paket »%s« wurde kein Upgrade durchgeführt." |
984 | |
985 | -#: ../unattended-upgrade:662 |
986 | +#: ../unattended-upgrade:1059 |
987 | #, c-format |
988 | msgid "Packages that are auto removed: '%s'" |
989 | msgstr "Pakete, die automatisch entfernt wurden: »%s«" |
990 | |
991 | -#: ../unattended-upgrade:669 |
992 | +#: ../unattended-upgrade:1068 |
993 | msgid "No packages found that can be upgraded unattended" |
994 | msgstr "" |
995 | "Es wurden keine Pakete gefunden, von denen ein unbeaufsichtigtes Upgrade " |
996 | "durchgeführt werden kann." |
997 | |
998 | -#: ../unattended-upgrade:679 |
999 | -#, c-format |
1000 | -msgid "Packages that are upgraded: %s" |
1001 | -msgstr "Pakete, von denen ein Upgrade durchgeführt wurde: %s" |
1002 | - |
1003 | -#: ../unattended-upgrade:693 |
1004 | -#, c-format |
1005 | -msgid "Writing dpkg log to '%s'" |
1006 | -msgstr "Dpkg-Protokoll wird nach »%s« geschrieben" |
1007 | - |
1008 | -#: ../unattended-upgrade:744 |
1009 | +#: ../unattended-upgrade:1088 |
1010 | +#, c-format |
1011 | +msgid "Packages that will be upgraded: %s" |
1012 | +msgstr "Pakete, von denen ein Upgrade durchgeführt wird: %s" |
1013 | + |
1014 | +#: ../unattended-upgrade:1125 |
1015 | msgid "print debug messages" |
1016 | msgstr "Nachrichten zur Fehlersuche ausgeben" |
1017 | |
1018 | -#: ../unattended-upgrade:747 |
1019 | +#: ../unattended-upgrade:1128 |
1020 | +msgid "make apt/libapt print verbose debug messages" |
1021 | +msgstr "APT/LibAPT detaillierte Nachrichten zur Fehlersuche ausgeben lassen" |
1022 | + |
1023 | +#: ../unattended-upgrade:1131 |
1024 | +msgid "print info messages" |
1025 | +msgstr "Informationsnachrichten ausgeben" |
1026 | + |
1027 | +#: ../unattended-upgrade:1134 |
1028 | msgid "Simulation, download but do not install" |
1029 | msgstr "Simulation, herunterladen, aber nicht installieren" |
1030 | |
1031 | -#: ../unattended-upgrade:750 |
1032 | +#: ../unattended-upgrade:1137 |
1033 | msgid "Upgrade in minimal steps (and allow interrupting with SIGINT" |
1034 | msgstr "Upgrade in minimalen Schritten (Unterbrechung mit SIGINT erlaubt)" |
1035 | |
1036 | -#: ../unattended-upgrade:754 |
1037 | +#: ../unattended-upgrade:1142 |
1038 | msgid "You need to be root to run this application" |
1039 | msgstr "Sie müssen Root sein, um diese Anwendung auszuführen." |
1040 | |
1041 | -#: ../unattended-upgrade-shutdown:95 |
1042 | +#: ../unattended-upgrade-shutdown:72 |
1043 | msgid "Unattended-upgrade in progress during shutdown, sleeping for 5s" |
1044 | msgstr "" |
1045 | "Unattended-Upgrade läuft während des Herunterfahrens weiter, es wird fünf " |
1046 | "Sekunden lang gewartet." |
1047 | |
1048 | -#: ../unattended-upgrade-shutdown:106 |
1049 | +#: ../unattended-upgrade-shutdown:125 |
1050 | +msgid "Running unattended-upgrades in shutdown mode" |
1051 | +msgstr "Unattended-Upgrades im Herunterfahrmodus ausführen" |
1052 | + |
1053 | +#: ../unattended-upgrade-shutdown:153 |
1054 | #, c-format |
1055 | msgid "Giving up on lockfile after %s delay" |
1056 | msgstr "Sperrdatei, hier wird nach %s Verzögerung aufgegeben." |
1057 | |
1058 | === modified file 'setup.py' |
1059 | --- setup.py 2014-04-09 20:22:26 +0000 |
1060 | +++ setup.py 2014-10-15 08:16:16 +0000 |
1061 | @@ -28,6 +28,6 @@ |
1062 | ["debian/source_unattended-upgrades.py"]) |
1063 | ], |
1064 | cmdclass={"build": build_extra.build_extra, |
1065 | - "build_i18n": build_i18n.build_i18n}, |
1066 | + "build_i18n": build_i18n.build_i18n}, |
1067 | test_suite="test", |
1068 | ) |
1069 | |
1070 | === modified file 'test/test_in_chroot.py' |
1071 | --- test/test_in_chroot.py 2014-04-08 13:43:45 +0000 |
1072 | +++ test/test_in_chroot.py 2014-10-15 08:16:16 +0000 |
1073 | @@ -86,7 +86,8 @@ |
1074 | # run it |
1075 | target = self._run_upgrade_test_in_real_chroot(options) |
1076 | # ensure we upgraded the expected packages |
1077 | - self.assertTrue(self._verify_install_log_in_real_chroot(target)) |
1078 | + self.assertTrue( |
1079 | + self._verify_install_log_in_real_chroot(target, "ca-certificates")) |
1080 | |
1081 | def test_minimal_steps_upgrade(self): |
1082 | print("Running minimal steps unattended upgrade in chroot") |
1083 | @@ -95,7 +96,8 @@ |
1084 | # run it |
1085 | target = self._run_upgrade_test_in_real_chroot(options) |
1086 | # ensure we upgraded the expected packages |
1087 | - self.assertTrue(self._verify_install_log_in_real_chroot(target)) |
1088 | + self.assertTrue( |
1089 | + self._verify_install_log_in_real_chroot(target, "ca-certificates")) |
1090 | |
1091 | def test_upgrade_on_shutdown_upgrade(self): |
1092 | print("Running unattended upgrade on shutdown (download and install) " |
1093 | @@ -105,7 +107,45 @@ |
1094 | os.environ["UNATTENDED_UPGRADES_FORCE_INSTALL_ON_SHUTDOWN"] = "1" |
1095 | apt.apt_pkg.config.set("Unattended-Upgrade::InstallOnShutdown", "1") |
1096 | target = self._run_upgrade_test_in_real_chroot(options) |
1097 | - self.assertTrue(self._verify_install_log_in_real_chroot(target)) |
1098 | + self.assertTrue( |
1099 | + self._verify_install_log_in_real_chroot(target, "ca-certificates")) |
1100 | + |
1101 | + def test_whitelist_upgrade(self): |
1102 | + print("Running unattended upgrade in chroot with whitelisted pkg") |
1103 | + options = MockOptions() |
1104 | + apt.apt_pkg.config.set( |
1105 | + "Unattended-Upgrade::Package-Whitelist::", "^libc6$") |
1106 | + # run it |
1107 | + target = self._run_upgrade_test_in_real_chroot(options) |
1108 | + # libc6 has a strict dependency on libc-bin so both packages |
1109 | + # will have to get installed. ensure that the relaxed whitelist is ok |
1110 | + self.assertTrue( |
1111 | + self._verify_install_log_in_real_chroot(target, "libc6")) |
1112 | + self.assertFalse( |
1113 | + self._verify_install_log_in_real_chroot(target, "ca-certificates")) |
1114 | + apt.apt_pkg.config.clear("Unattended-Upgrade::Package-Whitelist") |
1115 | + |
1116 | + def test_whitelist_upgrade_strict(self): |
1117 | + print( |
1118 | + "Running unattended upgrade in chroot with strict whitelisted pkg") |
1119 | + options = MockOptions() |
1120 | + apt.apt_pkg.config.set( |
1121 | + "Unattended-Upgrade::Package-Whitelist::", "^apt$") |
1122 | + apt.apt_pkg.config.set( |
1123 | + "Unattended-Upgrade::Package-Whitelist::", "^libc6$") |
1124 | + apt.apt_pkg.config.set( |
1125 | + "Unattended-Upgrade::Package-Whitelist-Strict", "true") |
1126 | + # run it |
1127 | + target = self._run_upgrade_test_in_real_chroot(options) |
1128 | + # we upgraded apt, but not libc6 because libc6 needs libc-bin and |
1129 | + # its not whitelisted (in strict mode) |
1130 | + self.assertTrue( |
1131 | + self._verify_install_log_in_real_chroot(target, "apt")) |
1132 | + self.assertFalse( |
1133 | + self._verify_install_log_in_real_chroot(target, "libc6")) |
1134 | + self.assertFalse( |
1135 | + self._verify_install_log_in_real_chroot(target, "libc-bin")) |
1136 | + apt.apt_pkg.config.clear("Unattended-Upgrade::Package-Whitelist") |
1137 | |
1138 | def _get_lockfile_location(self, target): |
1139 | return os.path.join( |
1140 | @@ -166,7 +206,7 @@ |
1141 | apt.apt_pkg.config.clear("Unattended-Upgrade::Origins-Pattern") |
1142 | apt.apt_pkg.config.set( |
1143 | "Unattended-Upgrade::Origins-Pattern::", ORIGINS_PATTERN) |
1144 | - unattended_upgrade.DISTRO_CODENAME = "lucid" |
1145 | + unattended_upgrade.DISTRO_CODENAME = DISTRO |
1146 | unattended_upgrade.main(options) |
1147 | os._exit(0) |
1148 | else: |
1149 | @@ -196,16 +236,15 @@ |
1150 | self.assertTrue(len(all_progress) > 5) |
1151 | return target |
1152 | |
1153 | - def _verify_install_log_in_real_chroot(self, target): |
1154 | + def _verify_install_log_in_real_chroot(self, target, needle_pkg): |
1155 | # examine log |
1156 | log = self._get_lockfile_location(target) |
1157 | logfile = open(log).read() |
1158 | #print(logfile) |
1159 | - NEEDLE_PKG = "ca-certificates" |
1160 | - if not re.search("Packages that will be upgraded:.*%s" % NEEDLE_PKG, |
1161 | + if not re.search("Packages that will be upgraded:.*%s" % needle_pkg, |
1162 | logfile): |
1163 | logging.warn( |
1164 | - "Can not find expected %s upgrade in log" % NEEDLE_PKG) |
1165 | + "Can not find expected %s upgrade in log" % needle_pkg) |
1166 | return False |
1167 | if "ERROR Installing the upgrades failed" in logfile: |
1168 | logging.warn("Got a ERROR in the logfile") |
1169 | @@ -213,9 +252,9 @@ |
1170 | dpkg_log = os.path.join( |
1171 | target, "var/log/unattended-upgrades/*-dpkg*.log") |
1172 | dpkg_logfile = open(glob.glob(dpkg_log)[0]).read() |
1173 | - if not "Preparing to replace %s" % NEEDLE_PKG in dpkg_logfile: |
1174 | + if not "Preparing to replace %s" % needle_pkg in dpkg_logfile: |
1175 | logging.warn("Did not find %s upgrade in %s" % ( |
1176 | - dpkg_log, NEEDLE_PKG)) |
1177 | + dpkg_log, needle_pkg)) |
1178 | return False |
1179 | #print(dpkg_logfile) |
1180 | return True |
1181 | |
1182 | === modified file 'test/test_origin_pattern.py' |
1183 | --- test/test_origin_pattern.py 2013-04-11 04:59:50 +0000 |
1184 | +++ test/test_origin_pattern.py 2014-10-15 08:16:16 +0000 |
1185 | @@ -26,8 +26,10 @@ |
1186 | pass |
1187 | |
1188 | |
1189 | -class MockCache(list): |
1190 | - pass |
1191 | +class MockCache(dict): |
1192 | + def __iter__(self): |
1193 | + for pkgname in self.keys(): |
1194 | + yield self[pkgname] |
1195 | |
1196 | |
1197 | class MockDepCache(): |
1198 | @@ -101,23 +103,42 @@ |
1199 | self.assertTrue(match_whitelist_string(s, None)) |
1200 | |
1201 | def test_blacklist(self): |
1202 | - # mock pkg (yeah, complicated) |
1203 | - pkg = self._get_mock_package() |
1204 | - # mock cache |
1205 | - cache = MockCache() |
1206 | - cache._depcache = MockDepCache() |
1207 | - cache._depcache.broken_count = 0 |
1208 | - cache.append(pkg) |
1209 | + # get the mocks |
1210 | + pkg = self._get_mock_package("linux-image") |
1211 | + cache = self._get_mock_cache() |
1212 | + cache[pkg.name] = pkg |
1213 | # origins and blacklist |
1214 | allowed_origins = ["o=Ubuntu"] |
1215 | blacklist = ["linux-.*"] |
1216 | # with blacklist pkg |
1217 | self.assertFalse( |
1218 | - check_changes_for_sanity(cache, allowed_origins, blacklist)) |
1219 | + check_changes_for_sanity(cache, allowed_origins, blacklist, [".*"])) |
1220 | # with "normal" pkg |
1221 | pkg.name = "apt" |
1222 | self.assertTrue( |
1223 | - check_changes_for_sanity(cache, allowed_origins, blacklist)) |
1224 | + check_changes_for_sanity(cache, allowed_origins, blacklist, [".*"])) |
1225 | + |
1226 | + def test_whitelist_with_strict_whitelisting(self): |
1227 | + cache = self._get_mock_cache() |
1228 | + for pkgname in ["not-whitelisted", "whitelisted"]: |
1229 | + pkg = self._get_mock_package(name=pkgname) |
1230 | + cache[pkg.name] = pkg |
1231 | + # origins and blacklist |
1232 | + allowed_origins = ["o=Ubuntu"] |
1233 | + whitelist = ["whitelisted"] |
1234 | + # test with strict whitelist |
1235 | + apt_pkg.config.set( |
1236 | + "Unattended-Upgrades::Packages-Whitelist-Strict", "true") |
1237 | + # ensure that a not-whitelisted pkg will fail |
1238 | + self.assertTrue(cache["not-whitelisted"].marked_upgrade) |
1239 | + self.assertFalse( |
1240 | + check_changes_for_sanity(cache, allowed_origins, [], whitelist)) |
1241 | + |
1242 | + def _get_mock_cache(self): |
1243 | + cache = MockCache() |
1244 | + cache._depcache = MockDepCache() |
1245 | + cache._depcache.broken_count = 0 |
1246 | + return cache |
1247 | |
1248 | def _get_mock_origin(self, aorigin="", label="", archive="", |
1249 | site="", component=""): |
1250 | @@ -129,11 +150,11 @@ |
1251 | origin.compoent = component |
1252 | return origin |
1253 | |
1254 | - def _get_mock_package(self): |
1255 | + def _get_mock_package(self, name="foo"): |
1256 | pkg = MockPackage() |
1257 | pkg._pkg = MockPackage() |
1258 | pkg._pkg.selected_state = 0 |
1259 | - pkg.name = "linux-image" |
1260 | + pkg.name = name |
1261 | pkg.marked_install = True |
1262 | pkg.marked_upgrade = True |
1263 | pkg.marked_delete = False |
1264 | |
1265 | === modified file 'test/test_pep8.py' (properties changed: +x to -x) |
1266 | --- test/test_pep8.py 2013-09-12 20:31:54 +0000 |
1267 | +++ test/test_pep8.py 2014-10-15 08:16:16 +0000 |
1268 | @@ -2,6 +2,8 @@ |
1269 | import subprocess |
1270 | import unittest |
1271 | |
1272 | +IGNORE = "E265" |
1273 | + |
1274 | |
1275 | class PackagePep8TestCase(unittest.TestCase): |
1276 | |
1277 | @@ -11,8 +13,9 @@ |
1278 | top_src_dir, |
1279 | os.path.join(top_src_dir, "unattended-upgrade"), |
1280 | os.path.join(top_src_dir, "unattended-upgrade-shutdown"), |
1281 | - ] |
1282 | - self.assertEqual(subprocess.call(["pep8", "--repeat", ] + targets), 0) |
1283 | + ] |
1284 | + self.assertEqual(subprocess.call( |
1285 | + ["pep8", "--repeat", "--ignore=%s" % IGNORE] + targets), 0) |
1286 | |
1287 | |
1288 | if __name__ == "__main__": |
1289 | |
1290 | === modified file 'test/test_pyflakes.py' |
1291 | --- test/test_pyflakes.py 2013-09-12 20:25:37 +0000 |
1292 | +++ test/test_pyflakes.py 2014-10-15 08:16:16 +0000 |
1293 | @@ -12,7 +12,7 @@ |
1294 | top_src_dir, |
1295 | os.path.join(top_src_dir, "unattended-upgrade"), |
1296 | os.path.join(top_src_dir, "unattended-upgrade-shutdown"), |
1297 | - ] |
1298 | + ] |
1299 | self.assertEqual(subprocess.call(["pyflakes", ] + targets), 0) |
1300 | |
1301 | |
1302 | |
1303 | === modified file 'unattended-upgrade' |
1304 | --- unattended-upgrade 2014-09-11 13:12:05 +0000 |
1305 | +++ unattended-upgrade 2014-10-15 08:16:16 +0000 |
1306 | @@ -96,7 +96,9 @@ |
1307 | """ Adjust candidate versions to match highest allowed origin |
1308 | |
1309 | This adjusts the origin even if the candidate has a higher |
1310 | - version |
1311 | + version. This is needed when e.g. a package is available in |
1312 | + the security pocket but there is also a package in the |
1313 | + updates pocket with a higher version number |
1314 | """ |
1315 | for pkg in self: |
1316 | # important! this avoids downgrades below |
1317 | @@ -110,9 +112,10 @@ |
1318 | # not the candidate |
1319 | new_cand = None |
1320 | for ver in pkg.versions: |
1321 | - # ignore versions that the user marked with priority < 0 |
1322 | + # ignore versions that the user marked with priority < 100 |
1323 | # (and ensure we have a python-apt that supports this) |
1324 | - if hasattr(ver, "policy_priority") and ver.policy_priority < 0: |
1325 | + if (hasattr(ver, "policy_priority") and |
1326 | + ver.policy_priority < 100): |
1327 | logging.debug("ignoring ver '%s' with priority < 0" % ver) |
1328 | continue |
1329 | if is_allowed_origin(ver, self.allowed_origins): |
1330 | @@ -364,8 +367,8 @@ |
1331 | raise UnknownMatcherError( |
1332 | "Unknown whitelist entry for macher '%s' (token '%s')" % ( |
1333 | what, token)) |
1334 | - logging.debug("matching '%s'='%s' against '%s'" % ( |
1335 | - what, value, origin)) |
1336 | + #logging.debug("matching '%s'='%s' against '%s'" % ( |
1337 | + # what, value, origin)) |
1338 | return res |
1339 | |
1340 | |
1341 | @@ -391,7 +394,7 @@ |
1342 | |
1343 | |
1344 | def upgrade_in_minimal_steps(cache, pkgs_to_upgrade, blacklist, |
1345 | - logfile_dpkg="", verbose=False): |
1346 | + whitelist, logfile_dpkg="", verbose=False): |
1347 | |
1348 | install_log = LogInstallProgress(logfile_dpkg, verbose) |
1349 | install_log.progress_log += ".minimal-steps" |
1350 | @@ -420,7 +423,8 @@ |
1351 | continue |
1352 | # double check that we are not running into side effects like |
1353 | # what could have been caused LP: #1020680 |
1354 | - if not check_changes_for_sanity(cache, allowed_origins, blacklist): |
1355 | + if not check_changes_for_sanity(cache, allowed_origins, blacklist, |
1356 | + whitelist): |
1357 | logging.info("While building minimal partition: " |
1358 | "cache has not allowed changes") |
1359 | cache.clear() |
1360 | @@ -491,8 +495,19 @@ |
1361 | return True |
1362 | return False |
1363 | |
1364 | - |
1365 | -def check_changes_for_sanity(cache, allowed_origins, blacklist): |
1366 | +def is_pkgname_in_whitelist(pkgname, whitelist): |
1367 | + # a empty whitelist means the user does not want to use this feature |
1368 | + if not whitelist: |
1369 | + return True |
1370 | + for whitelist_regexp in whitelist: |
1371 | + if re.match(whitelist_regexp, pkgname): |
1372 | + logging.debug("only upgrading the following package '%s'" % |
1373 | + pkgname) |
1374 | + return True |
1375 | + return False |
1376 | + |
1377 | + |
1378 | +def check_changes_for_sanity(cache, allowed_origins, blacklist, whitelist): |
1379 | if cache._depcache.broken_count != 0: |
1380 | return False |
1381 | for pkg in cache: |
1382 | @@ -504,6 +519,19 @@ |
1383 | logging.debug("pkg '%s' not in allowed origin" % pkg.name) |
1384 | return False |
1385 | if is_pkgname_in_blacklist(pkg.name, blacklist): |
1386 | + logging.debug("pkg '%s' package has been blacklisted" % |
1387 | + pkg.name) |
1388 | + return False |
1389 | + # a strict whitelist will not allow any changes not in the |
1390 | + # whitelist, most people will want the relaxed whitelist |
1391 | + # that whitelists a package but pulls in the package |
1392 | + # dependencies |
1393 | + strict_whitelist = apt_pkg.config.find_b( |
1394 | + "Unattended-Upgrade::Package-Whitelist-Strict", False) |
1395 | + if (strict_whitelist and |
1396 | + not is_pkgname_in_whitelist(pkg.name, whitelist)): |
1397 | + logging.debug("pkg '%s' package is not whitelisted" % |
1398 | + pkg.name) |
1399 | return False |
1400 | if pkg._pkg.selected_state == apt_pkg.SELSTATE_HOLD: |
1401 | logging.debug("pkg '%s' is on hold" % pkg.name) |
1402 | @@ -595,7 +623,7 @@ |
1403 | # might be a dpkg prompt (LP: #936870) |
1404 | if md5 == "newconffile": |
1405 | continue |
1406 | - if not pkg_conffiles or not conf_file in pkg_conffiles.split("\n"): |
1407 | + if not pkg_conffiles or conf_file not in pkg_conffiles.split("\n"): |
1408 | logging.debug("'%s' not in package conffiles '%s'" % ( |
1409 | conf_file, pkg_conffiles)) |
1410 | continue |
1411 | @@ -625,7 +653,7 @@ |
1412 | # in the previous version in the dpkg status file |
1413 | if pkg_conffiles: |
1414 | for conf_file in pkg_conffiles.split("\n"): |
1415 | - if (not conf_file in dpkg_status_conffiles and |
1416 | + if (conf_file not in dpkg_status_conffiles and |
1417 | os.path.exists(prefix + conf_file)): |
1418 | logging.debug("found conffile '%s' in new pkg but on dpkg " |
1419 | "status" % conf_file) |
1420 | @@ -637,7 +665,7 @@ |
1421 | |
1422 | |
1423 | def dpkg_conffile_prompt(): |
1424 | - if not "DPkg::Options" in apt_pkg.config: |
1425 | + if "DPkg::Options" not in apt_pkg.config: |
1426 | return True |
1427 | options = apt_pkg.config.value_list("DPkg::Options") |
1428 | for option in options: |
1429 | @@ -693,7 +721,7 @@ |
1430 | # ascii only system like the buildds) |
1431 | mail = subprocess.Popen( |
1432 | [MAIL_BINARY, "-s", subject, to_address], |
1433 | - stdin=subprocess.PIPE, universal_newlines=False) |
1434 | + stdin=subprocess.PIPE, universal_newlines=False) |
1435 | mail.stdin.write(encoded_body) |
1436 | mail.stdin.close() |
1437 | ret = mail.wait() |
1438 | @@ -778,14 +806,20 @@ |
1439 | logging.debug("mail returned: %s" % ret) |
1440 | |
1441 | |
1442 | -def do_install(cache, pkgs_to_upgrade, blacklisted_pkgs, options, |
1443 | - logfile_dpkg): |
1444 | +def do_install(cache, pkgs_to_upgrade, blacklisted_pkgs, whitelisted_pkgs, |
1445 | + options, logfile_dpkg): |
1446 | # set debconf to NON_INTERACTIVE, redirect output |
1447 | os.putenv("DEBIAN_FRONTEND", "noninteractive") |
1448 | setup_apt_listchanges() |
1449 | |
1450 | logging.info(_("Writing dpkg log to '%s'") % logfile_dpkg) |
1451 | |
1452 | + marked_delete = [pkg for pkg in cache.get_changes() if pkg.marked_delete] |
1453 | + if marked_delete: |
1454 | + raise AssertionError( |
1455 | + "Internal error. The following packages are marked for " |
1456 | + "removal:%s" % "".join([pkg.name for pkg in marked_delete])) |
1457 | + |
1458 | pkg_install_success = False |
1459 | try: |
1460 | if (options.minimal_upgrade_steps or |
1461 | @@ -801,7 +835,7 @@ |
1462 | # try upgrade all "pkgs" in minimal steps |
1463 | pkg_install_success = upgrade_in_minimal_steps( |
1464 | cache, [pkg.name for pkg in pkgs_to_upgrade], |
1465 | - blacklisted_pkgs, logfile_dpkg, |
1466 | + blacklisted_pkgs, whitelisted_pkgs, logfile_dpkg, |
1467 | options.verbose or options.debug) |
1468 | else: |
1469 | pkg_install_success = upgrade_normal( |
1470 | @@ -855,7 +889,6 @@ |
1471 | # COMPAT only |
1472 | apt_pkg.config.find("APT::UnattendedUpgrades::LogFile", |
1473 | "unattended-upgrades.log"))) |
1474 | - |
1475 | if not options.dry_run and not os.path.exists(logdir): |
1476 | os.makedirs(logdir) |
1477 | |
1478 | @@ -886,6 +919,10 @@ |
1479 | return apt_pkg.config.value_list("Unattended-Upgrade::Package-Blacklist") |
1480 | |
1481 | |
1482 | +def get_whitelisted_pkgs(): |
1483 | + return apt_pkg.config.value_list("Unattended-Upgrade::Package-Whitelist") |
1484 | + |
1485 | + |
1486 | def reboot_if_requested_and_needed(shutdown_lock=0): |
1487 | # auto-reboot (if required and the config for this is set |
1488 | if (apt_pkg.config.find_b( |
1489 | @@ -906,43 +943,57 @@ |
1490 | pass |
1491 | |
1492 | |
1493 | +def try_to_upgrade(pkg, pkgs_to_upgrade, pkgs_kept_back, cache, allowed_origins, |
1494 | + blacklisted_pkgs, whitelisted_pkgs): |
1495 | + |
1496 | + try: |
1497 | + pkg.mark_upgrade() |
1498 | + if check_changes_for_sanity(cache, allowed_origins, |
1499 | + blacklisted_pkgs, whitelisted_pkgs): |
1500 | + # add to packages to upgrade |
1501 | + pkgs_to_upgrade.append(pkg) |
1502 | + # re-eval pkgs_kept_back as the resolver may fail to |
1503 | + # directly upgrade a pkg, but that may work during |
1504 | + # a subsequent operation, see debian bug #639840 |
1505 | + for pkgname in pkgs_kept_back: |
1506 | + if (cache[pkgname].marked_install or |
1507 | + cache[pkgname].marked_upgrade): |
1508 | + pkgs_kept_back.remove(pkgname) |
1509 | + pkgs_to_upgrade.append(cache[pkgname]) |
1510 | + else: |
1511 | + logging.debug("sanity check failed") |
1512 | + rewind_cache(cache, pkgs_to_upgrade) |
1513 | + pkgs_kept_back.append(pkg.name) |
1514 | + except SystemError as e: |
1515 | + # can't upgrade |
1516 | + logging.warning( |
1517 | + _("package '%s' upgradable but fails to " |
1518 | + "be marked for upgrade (%s)") % (pkg.name, e)) |
1519 | + rewind_cache(cache, pkgs_to_upgrade) |
1520 | + pkgs_kept_back.append(pkg.name) |
1521 | + |
1522 | + |
1523 | def calculate_upgradable_pkgs(cache, options, allowed_origins, |
1524 | - blacklisted_pkgs): |
1525 | + blacklisted_pkgs, whitelisted_pkgs): |
1526 | pkgs_to_upgrade = [] |
1527 | pkgs_kept_back = [] |
1528 | + |
1529 | # now do the actual upgrade |
1530 | for pkg in cache: |
1531 | if options.debug and pkg.is_upgradable: |
1532 | logging.debug("Checking: %s (%s)" % ( |
1533 | pkg.name, getattr(pkg.candidate, "origins", []))) |
1534 | if (pkg.is_upgradable and |
1535 | - not is_pkgname_in_blacklist(pkg.name, blacklisted_pkgs) and |
1536 | - is_allowed_origin(pkg.candidate, allowed_origins)): |
1537 | - try: |
1538 | - pkg.mark_upgrade() |
1539 | - if check_changes_for_sanity(cache, allowed_origins, |
1540 | - blacklisted_pkgs): |
1541 | - # add to packages to upgrade |
1542 | - pkgs_to_upgrade.append(pkg) |
1543 | - # re-eval pkgs_kept_back as the resolver may fail to |
1544 | - # directly upgrade a pkg, but that may work during |
1545 | - # a subsequent operation, see debian bug #639840 |
1546 | - for pkgname in pkgs_kept_back: |
1547 | - if (cache[pkgname].marked_install or |
1548 | - cache[pkgname].marked_upgrade): |
1549 | - pkgs_kept_back.remove(pkgname) |
1550 | - pkgs_to_upgrade.append(cache[pkgname]) |
1551 | - else: |
1552 | - logging.debug("sanity check failed") |
1553 | - rewind_cache(cache, pkgs_to_upgrade) |
1554 | - pkgs_kept_back.append(pkg.name) |
1555 | - except SystemError as e: |
1556 | - # can't upgrade |
1557 | - logging.warning( |
1558 | - _("package '%s' upgradable but fails to " |
1559 | - "be marked for upgrade (%s)") % (pkg.name, e)) |
1560 | - rewind_cache(cache, pkgs_to_upgrade) |
1561 | - pkgs_kept_back.append(pkg.name) |
1562 | + not is_pkgname_in_blacklist(pkg.name, blacklisted_pkgs) and |
1563 | + is_pkgname_in_whitelist(pkg.name, whitelisted_pkgs) and |
1564 | + is_allowed_origin(pkg.candidate, allowed_origins)): |
1565 | + try_to_upgrade(pkg, |
1566 | + pkgs_to_upgrade, |
1567 | + pkgs_kept_back, |
1568 | + cache, |
1569 | + allowed_origins, |
1570 | + blacklisted_pkgs, |
1571 | + whitelisted_pkgs) |
1572 | return pkgs_to_upgrade, pkgs_kept_back |
1573 | |
1574 | |
1575 | @@ -958,10 +1009,16 @@ |
1576 | # format (origin, archive), e.g. ("Ubuntu","dapper-security") |
1577 | allowed_origins = get_allowed_origins() |
1578 | |
1579 | - # pkgs that are (for some reason) not save to install |
1580 | + # pkgs that are (for some reason) not safe to install |
1581 | blacklisted_pkgs = get_blacklisted_pkgs() |
1582 | logging.info(_("Initial blacklisted packages: %s"), |
1583 | " ".join(blacklisted_pkgs)) |
1584 | + |
1585 | + # install only these packages regardless of other upgrades available |
1586 | + whitelisted_pkgs = get_whitelisted_pkgs() |
1587 | + logging.info(_("Initial whitelisted packages: %s"), |
1588 | + " ".join(whitelisted_pkgs)) |
1589 | + |
1590 | logging.info(_("Starting unattended upgrades script")) |
1591 | |
1592 | # display available origin |
1593 | @@ -1025,7 +1082,7 @@ |
1594 | if pkg.is_auto_removable]) |
1595 | # find out about the packages that are upgradable (in a allowed_origin) |
1596 | pkgs_to_upgrade, pkgs_kept_back = calculate_upgradable_pkgs( |
1597 | - cache, options, allowed_origins, blacklisted_pkgs) |
1598 | + cache, options, allowed_origins, blacklisted_pkgs, whitelisted_pkgs) |
1599 | pkgs_to_upgrade.sort(key=lambda p: p.name) |
1600 | pkgs = "\n".join([pkg.name for pkg in pkgs_to_upgrade]) |
1601 | logging.debug("pkgs that look like they should be upgraded: %s" % pkgs) |
1602 | @@ -1094,16 +1151,19 @@ |
1603 | # redo the selection about the packages to upgrade based on the new |
1604 | # blacklist |
1605 | logging.debug("blacklist: %s" % blacklisted_pkgs) |
1606 | + # whitelist |
1607 | + logging.debug("whitelist: %s" % whitelisted_pkgs) |
1608 | # find out about the packages that are upgradable (in a allowed_origin) |
1609 | - if len(blacklisted_pkgs) > 0: |
1610 | + if len(blacklisted_pkgs) > 0 or len(whitelisted_pkgs) > 0: |
1611 | cache.clear() |
1612 | old_pkgs_to_upgrade = pkgs_to_upgrade[:] |
1613 | pkgs_to_upgrade = [] |
1614 | for pkg in old_pkgs_to_upgrade: |
1615 | - logging.debug("Checking (blacklist): %s" % (pkg.name)) |
1616 | + logging.debug("Checking the black and whitelist: %s" % |
1617 | + (pkg.name)) |
1618 | pkg.mark_upgrade() |
1619 | if check_changes_for_sanity(cache, allowed_origins, |
1620 | - blacklisted_pkgs): |
1621 | + blacklisted_pkgs, whitelisted_pkgs): |
1622 | pkgs_to_upgrade.append(pkg) |
1623 | else: |
1624 | if not (pkg.name in pkgs_kept_back): |
1625 | @@ -1140,7 +1200,7 @@ |
1626 | # check if its configured for install on shutdown, if so, the |
1627 | # environment UNATTENDED_UPGRADES_FORCE_INSTALL_ON_SHUTDOWN will |
1628 | # be set by the unatteded-upgrades-shutdown script |
1629 | - if (not "UNATTENDED_UPGRADES_FORCE_INSTALL_ON_SHUTDOWN" in os.environ and |
1630 | + if ("UNATTENDED_UPGRADES_FORCE_INSTALL_ON_SHUTDOWN" not in os.environ and |
1631 | apt_pkg.config.find_b( |
1632 | "Unattended-Upgrade::InstallOnShutdown", False)): |
1633 | logger = logging.getLogger() |
1634 | @@ -1157,7 +1217,6 @@ |
1635 | logging.info(_("Packages that will be upgraded: %s" % pkgs)) |
1636 | |
1637 | # get log |
1638 | - now = datetime.datetime.now() |
1639 | logfile_dpkg = os.path.join(_get_logdir(), 'unattended-upgrades-dpkg.log') |
1640 | |
1641 | # only perform install step if we actually have packages to install |
1642 | @@ -1169,7 +1228,7 @@ |
1643 | shutdown_lock = apt_pkg.get_lock("/var/run/unattended-upgrades.lock") |
1644 | # do install |
1645 | pkg_install_success = do_install( |
1646 | - cache, pkgs_to_upgrade, blacklisted_pkgs, options, logfile_dpkg) |
1647 | + cache, pkgs_to_upgrade, blacklisted_pkgs, whitelisted_pkgs, options, logfile_dpkg) |
1648 | |
1649 | # send a mail (if needed) |
1650 | if not options.dry_run: |
1651 | @@ -1193,7 +1252,7 @@ |
1652 | |
1653 | # this ensures the commandline is logged in /var/log/apt/history.log |
1654 | apt_pkg.config.set("Commandline::AsString", " ".join(sys.argv)) |
1655 | - |
1656 | + |
1657 | # init the options |
1658 | parser = OptionParser() |
1659 | parser.add_option("-d", "--debug", |
1660 | |
1661 | === modified file 'unattended-upgrade-shutdown' |
1662 | --- unattended-upgrade-shutdown 2013-09-12 20:28:39 +0000 |
1663 | +++ unattended-upgrade-shutdown 2014-10-15 08:16:16 +0000 |
1664 | @@ -149,7 +149,7 @@ |
1665 | # show log |
1666 | log_progress() |
1667 | time.sleep(5) |
1668 | - if (time.time() - start_time) > options.delay*60: |
1669 | + if (time.time() - start_time) > options.delay * 60: |
1670 | logging.warning(_("Giving up on lockfile after %s delay") % |
1671 | options.delay) |
1672 | sys.exit(1) |
Looking good, works, covers all intended and possible use cases for the whitelisting feature with all niceties. Thanks for all your help here Michael, this should help lots of people.