Bug 28893 - Anpassung: announce_errata_update auf neues Errata-Verfahren
Anpassung: announce_errata_update auf neues Errata-Verfahren
Status: CLOSED FIXED
Product: UCS
Classification: Unclassified
Component: General
UCS 3.0
Other Linux
: P5 normal (vote)
: UCS 3.1
Assigned To: Moritz Muehlenhoff
Philipp Hahn
: interim-3
Depends on:
Blocks:
  Show dependency treegraph
 
Reported: 2012-10-24 09:47 CEST by Moritz Muehlenhoff
Modified: 2012-12-12 21:10 CET (History)
1 user (show)

See Also:
What kind of report is it?: ---
What type of bug is this?: ---
Who will be affected by this bug?: ---
How will those affected feel about the bug?: ---
User Pain:
Enterprise Customer affected?:
School Customer affected?:
ISV affected?:
Waiting Support:
Flags outvoted (downgraded) after PO Review:
Ticket number:
Bug group (optional):
Max CVSS v3 score:


Attachments
Meine (teilweise bereits besser) funktionierende Variante zum Vergleich (19.80 KB, text/plain)
2012-11-21 16:29 CET, Philipp Hahn
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Moritz Muehlenhoff univentionstaff 2012-10-24 09:47:54 CEST
Das Announce-Skript für Errata-Updates muss auf das neue Errata-Verfahren aus 3.1 angepasst werden.
Comment 1 Stefan Gohmann univentionstaff 2012-11-05 13:57:16 CET
announce_ucs_release.py sollte nach Möglichkeit auch direkt das leere errata-Verzeichnis für das Release anlegen.
Comment 2 Stefan Gohmann univentionstaff 2012-11-05 15:26:12 CET
Das Paket ucs/base/univention-errata-level wird jetzt auf jedem System mit installiert. Das Pakete sollte bei jedem Announce automatisch aktualisiert und installiert werden.
Comment 3 Moritz Muehlenhoff univentionstaff 2012-11-07 13:26:36 CET
Support für die neuen Pfade und den Announce wurden in Repo-NG integriert. Ich habe ein Beispiel unter http://hutten/mediawiki/index.php/Errata-Updates
eingefügt.

Das automatisch Generieren des univention-errata-level Pakets steht noch aus
Comment 4 Moritz Muehlenhoff univentionstaff 2012-11-07 15:04:55 CET
announce_errata aktualisiert jetzt univention-errata-level automatisch bei jedem Announce über einen Patch und führt einen Neubuild des Pakets durch.
Comment 5 Philipp Hahn univentionstaff 2012-11-21 16:23:02 CET
FAIL: In der YAML Datei muß scheinbar neuderings eine zusätzliche 'version' angegeben werden. Das und deren Bedeutung ist nirgendwo dokumentiert. Ist hier 'Patchlevel' gemeint?

FAIL: In univention-errata-level/debian/univention-errata-level.postinst sollten die letzten beiden Zeilen im Copyright-CLOB entfernt werden, weil das nicht mit dem rules-File zu tun hat.

FAIL: In der Datei univention-errata-level/debian/univention-errata-level.postinst sollte der #DEBHELPER#-Platzhalter stehen.

+++ b/branches/ucs-3.0/internal/repo-ng/announce/announce_errata.py
FIXME: trailing whitespace
FIXME: svn ps svn:executable 1

+import commands
...
+       hostname = commands.getoutput("hostname")
FIXME: ungenutzt, sollte entfernt werden

>+               version_blob = str(opt.ucsrelease)
>+               if errata_new_style:
>+                       if int(version) == 0:
>+                               version_blob = str(opt.ucsrelease) + " (applicable to all releases)"
>+                       else:
>+                               version_blob = str(opt.ucsrelease) + " (applicable to " + str(opt.ucsrelease) + "-" + version + " onwards"
FIXME: ungenutzt. Entweder entfernrn oder benutzen.

> +atexit.register(shutil.rmtree, tmpdir, ignore_errors=True)
FAIL: Hierfür fehlt ein "import atexit"

+               '3.1': 'univention-errata-level/3.1-0-0-ucs/1.0.0-1-errata3.1-0/bump-version.patch',
+       svn_path = 'svn+ssh://build@' + configRegistry['repong/patchrepo'] + '/univention-errata-level'
+       rp.run_expect('svn co %s' % (svn_path), build_password,10800)
+       patchfile = tmpdir + "/" + ERRATALEVELPATCH[opt.ucsrelease]
FYI: Das auschecken aller Patches für univention-errata-level ist hier eigentlich unnötig, wesser wäre es vermutlich nur die letzte Ebene in ein Verzeichnis mit festem Namen auszuchecken.

+                       if a.startswith("ucr set version/erratalevel"):
+                               a = "ucr set version/erratalevel=" + str(errata_level)
FAIL: Das funktioniert nicht, weil die Datei ein Patch ist und die Zeile mit einem '+' (Pluszeichen) anfängt.
 PREFIX = '+ucr set version/erratalevel='
 if a.startswith(PREFIX):
  a = PREFIX + str(errata_level)

+               subprocess.call(cmd, shell=True)
FAIL: Unbedingt den Exit-Status prüfen!
FIXME: Shell

+       errata_new_style = False
FIXME: In einem Jahr ist das dann nicht mehr 'new', besser wäre errata_31_style.

+               print "Malformed advisory file, no version specified"
FIXME: >> systs.sdterr,

+       for i in range(0,10):
+               if errata_base_version >= i:
RFC: Was soll diese Schleife bewirken.
RFC: woher kommt die magische Zahl 10?
FATAL: Das führt dazu, daß die Pakete nach /mnt/omar/vmwares/mirror/ftp/3.1/unmaintained/component/3.1-9-errata/source installiert werden.
FIXME: for patch_level in range(errata_base_version, 10):

-rp.create_sources_files(os.path.join(mirror_base, "unmaintained"), errata_id)
FIXME: Der Aufruf fehlt dann für die Komponente.

+       pass # TODO
RFC: Kommt da noch was?

+++ b/branches/ucs-3.0/internal/repo-ng/debian/changelog
FIXME: trailing whitespace


NOTE: Das Testen wird dadurch erschwert, daß das Tool 2 PGP-Schlüssel-IDs benötigt: Den für die Release-Datei kann man auf der Kommandozeile anegeben, den 2. für das signieren der Mail ist hart kodiert und erfordert root-Rechte.

TODO: run_expect liefert keinen Return-Value, d.h. Skripte haben keine Möglichkeit zu gucken, ob das "svn"-Kommando funktioniert hat oder nicht.

OK: ChangeLog nicht notwendig
Comment 6 Philipp Hahn univentionstaff 2012-11-21 16:29:02 CET
Created attachment 4826 [details]
Meine (teilweise bereits besser) funktionierende Variante zum Vergleich
Comment 7 Moritz Muehlenhoff univentionstaff 2012-11-27 12:50:23 CET
(In reply to comment #5)
> FAIL: In der YAML Datei muß scheinbar neuderings eine zusätzliche 'version'
> angegeben werden. Das und deren Bedeutung ist nirgendwo dokumentiert. Ist hier
> 'Patchlevel' gemeint?

Ist jetzt dokumentiert unter

http://hutten/mediawiki/index.php/Errata-Updates#Assignee_-_Definition_der_Advisory-Metadaten__in_YAML
 
> FAIL: In univention-errata-level/debian/univention-errata-level.postinst
> sollten die letzten beiden Zeilen im Copyright-CLOB entfernt werden, weil das
> nicht mit dem rules-File zu tun hat.
> FAIL: In der Datei
> univention-errata-level/debian/univention-errata-level.postinst sollte der
> #DEBHELPER#-Platzhalter stehen.

Angepasst.

> +       hostname = commands.getoutput("hostname")
> FIXME: ungenutzt, sollte entfernt werden

Entfernt.

> >+                               version_blob = str(opt.ucsrelease) + " (applicable to " + str(opt.ucsrelease) + "-" + version + " onwards"
> FIXME: ungenutzt. Entweder entfernrn oder benutzen.

Wird jetzt verwendet in der Übersicht der Errata-updates.
 
> > +atexit.register(shutil.rmtree, tmpdir, ignore_errors=True)
> FAIL: Hierfür fehlt ein "import atexit"

Angepasst.
 
> +                       if a.startswith("ucr set version/erratalevel"):
> +                               a = "ucr set version/erratalevel=" +
> str(errata_level)
> FAIL: Das funktioniert nicht, weil die Datei ein Patch ist und die Zeile mit
> einem '+' (Pluszeichen) anfängt.
>  PREFIX = '+ucr set version/erratalevel='
>  if a.startswith(PREFIX):
>   a = PREFIX + str(errata_level)

Angepasst.
 
> +               subprocess.call(cmd, shell=True)
> FAIL: Unbedingt den Exit-Status prüfen!

Angepasst.
 
> +       errata_new_style = False
> FIXME: In einem Jahr ist das dann nicht mehr 'new', besser wäre
> errata_31_style.

In einem Jahr ist die Maintenance für 3.1 beendet und der alte Code kann ohnehin raus.

> +       for i in range(0,10):
> +               if errata_base_version >= i:
> RFC: Was soll diese Schleife bewirken.
> RFC: woher kommt die magische Zahl 10?

Ist jetzt kommentiert.

> FATAL: Das führt dazu, daß die Pakete nach
> /mnt/omar/vmwares/mirror/ftp/3.1/unmaintained/component/3.1-9-errata/source
> installiert werden.
> FIXME: for patch_level in range(errata_base_version, 10):

Angepasst, 
 
> -rp.create_sources_files(os.path.join(mirror_base, "unmaintained"), errata_id)
> FIXME: Der Aufruf fehlt dann für die Komponente.

Angepasst.

> TODO: run_expect liefert keinen Return-Value, d.h. Skripte haben keine
> Möglichkeit zu gucken, ob das "svn"-Kommando funktioniert hat oder nicht.

Das (und ein paar kleinere Punkte wie Whitespace-Änderungen) kann später ergänzt werden. Wenn dafür schon lokale Anpassungen existieren, dann bitte separaten Bug anlegen.
Comment 8 Philipp Hahn univentionstaff 2012-11-27 15:40:26 CET
(In reply to comment #7)
> (In reply to comment #5)
> > FAIL: In der YAML Datei muß scheinbar neuderings eine zusätzliche 'version'
> > angegeben werden. Das und deren Bedeutung ist nirgendwo dokumentiert. Ist hier
> > 'Patchlevel' gemeint?
> 
> Ist jetzt dokumentiert unter

IMHO ist "version" ein bescheidener Name, wenn eigentlich "min_patchlevel(-version)" gemeint ist. Das macht es später nicht gerade einfacher, da intuitiv das Richtige für einzusetzen, wenn man eine YAML-Datei erstellen soll.


> > +       hostname = commands.getoutput("hostname")
> > FIXME: ungenutzt, sollte entfernt werden
> 
> Entfernt.

Das "import commands" könnte auch noch entfernt werden.


> > +                       if a.startswith("ucr set version/erratalevel"):
> > +                               a = "ucr set version/erratalevel=" +
> > str(errata_level)
> > FAIL: Das funktioniert nicht, weil die Datei ein Patch ist und die Zeile mit
> > einem '+' (Pluszeichen) anfängt.
> >  PREFIX = '+ucr set version/erratalevel='
> >  if a.startswith(PREFIX):
> >   a = PREFIX + str(errata_level)
> 
> Angepasst.

FAIL: Da verschwindes jedesmal das Newline, siehe svn11118..11124


> > +               subprocess.call(cmd, shell=True)
> > FAIL: Unbedingt den Exit-Status prüfen!
> 
> Angepasst.

Bitte nicht nur bei exit status 1, sondern bei allem ungleich 0 abbbrechen! b31-scope kann auch 2 zurückliefern und als Shell-Skript durch ein "kill" fast beliebiges.


> > +       for i in range(0,10):
> > +               if errata_base_version >= i:
> > RFC: Was soll diese Schleife bewirken.
> > RFC: woher kommt die magische Zahl 10?
> 
> Ist jetzt kommentiert.

Der Kommentar verwirrt mich:
> »···for i in range(0,99): # Check up to 99 possible errata updates

Es geht hier nicht um "99 errata updates", sondern die (jetzt nur noch) _eine_ errata-Componente für den letzen existierenden der maximal 99 Patchlevel (ab 'errata_base_version')
Ein 'for i in range(errata_base_version, 99): # Determin latest existing patchlevel for errata component' beschreibt das für mich mich klarer.

Und das Konstrukt:
»···for i in range(0,99): # Check up to 99 possible errata updates
...
»···»···»···if errata_base_version >= i:
auch; ich musste mir das 3× anschauen, bis ich den Sinn dahiner als "range(errata_base_version, 99)" identifiziert hatte.

Und wenn es keins der 99 Verzeichnisse gibt, verwendet er immer noch stillschweigend das 99er Verzeichnis. Vorschlag:
if errata_new_style:
	comp = None
	for patch_level in range(errata_base_version, 99): # Determin latest existing patchlevel for errata component
		if os.path.exists(os.path.join(buildsystem_basedir, "ucs_%s-0-errata%s-%s" % (opt.ucsrelease, opt.ucsrelease, patch_level))):
			comp = '%s-%s-errata' % (opt.ucsrelease, patch_level)
	if not comp:
		print >> sys.stderr, "No patchlevel >= %d found. Aborting." % (errata_base_version,)
		sys.exit(1)
	errata_dir_maintained = os.path.join(mirror_base, "maintained", "component", comp)
	errata_dir_unmaintained = os.path.join(mirror_base, "unmaintained", "component", comp)
else:
	errata_dir_maintained = os.path.join(mirror_base, "maintained", errata_id)
	errata_dir_unmaintained = os.path.join(mirror_base, "unmaintained", errata_id)
Comment 9 Moritz Muehlenhoff univentionstaff 2012-11-28 10:09:55 CET
(In reply to comment #8)
> (In reply to comment #7)
> > (In reply to comment #5)
> > > FAIL: In der YAML Datei muß scheinbar neuderings eine zusätzliche 'version'
> > > angegeben werden. Das und deren Bedeutung ist nirgendwo dokumentiert. Ist hier
> > > 'Patchlevel' gemeint?
> > 
> > Ist jetzt dokumentiert unter
> 
> IMHO ist "version" ein bescheidener Name, wenn eigentlich
> "min_patchlevel(-version)" gemeint ist. Das macht es später nicht gerade
> einfacher, da intuitiv das Richtige für einzusetzen, wenn man eine YAML-Datei
> erstellen soll.

Ist entsprechend im Wiki dokumentiert.
 
> Das "import commands" könnte auch noch entfernt werden.

Habe ich entfernt.

> FAIL: Da verschwindes jedesmal das Newline, siehe svn11118..11124

Wurde eingefügt.

> > > +               subprocess.call(cmd, shell=True)
> > > FAIL: Unbedingt den Exit-Status prüfen!
> > 
> > Angepasst.
> 
> Bitte nicht nur bei exit status 1, sondern bei allem ungleich 0 abbbrechen!
> b31-scope kann auch 2 zurückliefern und als Shell-Skript durch ein "kill" fast
> beliebiges.

Angepasst.

> > > +       for i in range(0,10):
> > > +               if errata_base_version >= i:
> > > RFC: Was soll diese Schleife bewirken.
> > > RFC: woher kommt die magische Zahl 10?
> > 
> > Ist jetzt kommentiert.
> 
> Der Kommentar verwirrt mich:
> > »···for i in range(0,99): # Check up to 99 possible errata updates
> 
> Es geht hier nicht um "99 errata updates", sondern die (jetzt nur noch) _eine_
> errata-Componente für den letzen existierenden der maximal 99 Patchlevel (ab
> 'errata_base_version')
> Ein 'for i in range(errata_base_version, 99): # Determin latest existing
> patchlevel for errata component' beschreibt das für mich mich klarer.
> 
> Und das Konstrukt:
> »···for i in range(0,99): # Check up to 99 possible errata updates
> ...
> »···»···»···if errata_base_version >= i:
> auch; ich musste mir das 3× anschauen, bis ich den Sinn dahiner als
> "range(errata_base_version, 99)" identifiziert hatte.
> 
> Und wenn es keins der 99 Verzeichnisse gibt, verwendet er immer noch
> stillschweigend das 99er Verzeichnis. Vorschlag:
> if errata_new_style:
>     comp = None
>     for patch_level in range(errata_base_version, 99): # Determin latest
> existing patchlevel for errata component
>         if os.path.exists(os.path.join(buildsystem_basedir,
> "ucs_%s-0-errata%s-%s" % (opt.ucsrelease, opt.ucsrelease, patch_level))):
>             comp = '%s-%s-errata' % (opt.ucsrelease, patch_level)
>     if not comp:
>         print >> sys.stderr, "No patchlevel >= %d found. Aborting." %
> (errata_base_version,)
>         sys.exit(1)
>     errata_dir_maintained = os.path.join(mirror_base, "maintained",
> "component", comp)
>     errata_dir_unmaintained = os.path.join(mirror_base, "unmaintained",
> "component", comp)
> else:
>     errata_dir_maintained = os.path.join(mirror_base, "maintained", errata_id)
>     errata_dir_unmaintained = os.path.join(mirror_base, "unmaintained",
> errata_id)

Wir sollten in der aktuellen Releasephase nur minimale Bugfixes/Änderungen machen, von daher habe nur den Kommentar angepasst.
Comment 10 Philipp Hahn univentionstaff 2012-11-28 18:00:07 CET
OK: Funktioniert soweit.
OK: /var/univention/buildsystem2/errata/ und /var/univention/buildsystem2/apt/ucs_3.1-0-errata3.1-0/ wurden nach meinen Tests wieder geleert.
Comment 11 Stefan Gohmann univentionstaff 2012-12-12 21:10:22 CET
UCS 3.1-0 has been released: 
 http://forum.univention.de/viewtopic.php?f=54&t=2125

If this error occurs again, please use "Clone This Bug".