Build iso.pl

    From The Document Foundation Wiki

    #!/usr/bin/perl
    
    # create ISO-file for LibreOffice-Box
    # Diese Datei wird über entsprechende Symlinks aus ~/ angesteuert,
    # deren Namen für die Namen der ISO-dateien verwendet werden.
    
    # Die Namen der Symlinks sind folgendermaßen zusammengesetzt:
    # build_<OOo-version>-<liboxzähler>[_snapshot]_(CD_<OS>|DVD)
    # also z.B. baue_2.3.1-2_CD_Win, oder baue_2.3.1-1_snapshot_DVD
    
    # $Id: build_iso.pl,v 1.2 2011/05/06 21:45:45 libox Exp $
    
    use strict;
    use warnings;
    use File::Basename;
    
    # Pfad zu mkisofs-programm
    my $mkisofsbinary = "/groups/libox/bin/mkisofs";
    
    my $datum = `date -u --rfc-3339=date`; # for snapshots, cebit und version.txt
    chomp($datum);
       $datum .= `date -u +_%H.%M.%S`; # + filename compatible time
    chomp($datum);
    
    
    #fetch name from calling symlink
    my $boxname = basename($0);
    
    # alternatively from parameter
     $boxname = $ARGV[1] if $ARGV[1];
    
    # used later
    my $kommando = "$boxname";
    
    $boxname =~  s/build_//; # reinen Namen übriglassen
    
    my $snapshot = 1 if $boxname =~ /snapshot/i; # snapshot?
    $boxname =~ s/_snapshot//i if $snapshot; # Namen bereinigen
    
    my $cebit = 1 if $boxname =~ /cebit/i; # cebit?
    $boxname =~ s/_cebit//i if $cebit; # Namen bereinigen
    
    # Laufwerksbezeichnung jetzt abgreifen
    my $VOLI = "LibreOffice-Box-$boxname"; # Version+Medium
    
    
    #bestimme Medium aus Name
    my $medium;
    $medium = "cd_win" if $boxname  =~  /cd_win\s*$/i; # Leerzeichen am Schluss stören nicht
    $medium = "cd_linux" if $boxname  =~  /cd_linux\s*$/i; # Leerzeichen am Schluss stören nicht
    $medium = "cd_linux-deb" if $boxname =~ /cd_linux-deb\s*$/i; # Leerzeichen am Schluss stören nicht
    $medium = "cd_linux-rpm" if $boxname =~ /cd_linux-rpm\s*$/i; # Leerzeichen am Schluss stören nicht
    $medium = "cd_mac" if $boxname  =~  /cd_mac\s*$/i; # Leerzeichen am Schluss stören nicht
    $medium = "cd_solaris" if $boxname =~ /cd_solaris\s*$/i; # Leerzeichen am Schluss stören nicht
    $medium = "cd_freebsd" if $boxname =~ /cd_freebsd\s*$/i; # Leerzeichen am Schluss stören nicht
    $medium = "dvd" if $boxname =~ /dvd\s*$/i; # Leerzeichen am Schluss stören nicht
    $medium = "cebit_dvd" if $boxname =~ /cebit_dvd\s*$/i; # Leerzeichen am Schluss stören nicht
    
    ## Verzeichnisse bestimmen:
    #  Basisverzeichnis für die Zusammenstellungen der ISO-Dateien
    my $werkstattdir = "/var/www/sites/libreofficebox.org/static/de/media";
    
    #  Basisverzeichnis für die PrOOo-Box
    my $probogroupdir = "/groups/libox";
    
    # Aus den Daten in diesem Verzeichnis wird das ISO gebaut
    my $basedir = "$werkstattdir/$medium";
    
    # hier kommt die ISO-Datei rein
    my $isodir = "$probogroupdir/download_private";
    
    # Verzeichnis der ISO-Datei für Bittorrent..
    my $torrent_isos = "$probogroupdir/boxtorrent/isos";
    
    # .. und für die .torrent Datei seed
    my $torrents_dir = "$probogroupdir/boxtorrent/torrents";
    
    # .. und für die .torrent Datei tracker
    my $tracker_dir = "$probogroupdir/boxtorrent/tracker";
    
    # .. und für die .torrent Datei parken
    my $parken_dir = "$probogroupdir/boxtorrent/parken";
    
    # _allplatforms ergänzen bei dvd
    $boxname .= "_allplatforms" if $medium eq "dvd"; # Plattformbezeichnung für DVD
    
    # snapshot-Name erzeugen
    if ($snapshot) {
    $snapshot = "_snapshot-$datum";
    $boxname .= $snapshot; # Datum in Namen reinbeamen
    }
    
    # cebit-Name erzeugen
    if ($cebit) {
    $cebit = "_cebit-$datum";
    $boxname .= $cebit; # Datum in Namen reinbeamen
    }
    
    # Name der ISO-Datei zusammenbauen
    my $isoname = "LibO-$boxname" . "_de.iso"; # normales ISO
    
    # für Bittorrent-Verteilung
    my $torrent_isoname = "LibO-" . $boxname;
    
    # DVD
    #$torrent_isoname .= "_allplatforms" if $medium eq "dvd";
    
    # DVD_2.4.3
    #$torrent_isoname .= "_prooo-box_allplatforms" if $medium eq "dvd_2.4.3";
    
    # Alle ISOs abweichend vom ursprünglichen "Zweiergespann"
    #$torrent_isoname .= "_prooo-box" if $boxname =~ /[cd]v?d_/i;
    
    # fertigstellen
    $torrent_isoname .= "_de.iso";
    
    # Hinweis für snapshots oder cebitvariante
    my $testhinweis   = "Dies ist eine Vorabversion für Testzwecke oder Sonderausgaben.
    Möglicherweise sind darin Softwarepakete enthalten, die noch
    nicht entgültig für den produktiven Einsatz freigegeben sind.";
    
    
    # Informationen für "version.txt" im ISO-Wurzelverzeichnis
    my $build  = "Name: $isoname\n";
       $build .= "build: $datum\n" unless $snapshot || $cebit; # Buildnummer nicht bei snapshot/cbit
       $build .= "\nHinweis:\n$testhinweis\n" if $snapshot || $cebit;
    
    # Zwischenstand
    my $versioninfo = $build;
    
    # DOS Zeilenenden verwenden
    $versioninfo =~ s/\n/\r\n/g;
    
    # Pfad zu "version.txt"
    my $build_datei = "$basedir/libox_version.txt";
    
    # Name für Versionsverwaltungsdatei
    my $build_archiv = "$probogroupdir/versions/$isoname";
       $build_archiv .= "_build-$datum" unless $snapshot || $cebit; # Buildnummer nicht bei snapshot/cbit
       $build_archiv .= ".txt";
    
    
    # nur user libox kann das script ausführen wegen Quotaüberschreitung bei dvd-iso..
    my $webuser = `id | grep uid=1018`;
    
    # Alle Dateien auflisten, die $boxname enthalten, um schon
    # vorhandene bei Bedarf auf einfache Weise löschen zu können ..
    #my $find = qq{find $isodir $torrent_isos $torrents_dir $tracker_dir -name '*$boxname*' 2>/dev/null | grep -v baue | grep -v version | grep -v mirror};
    my $find = qq{find -L $isodir $torrent_isos $torrents_dir $tracker_dir $parken_dir -name '*$boxname*'};
    my $dateien = `$find` if $webuser;
    my $dateien_loeschen = $dateien;
    $dateien_loeschen =~ s/\n/ /gs;
       $dateien = "\n    -- keine --\n" unless $dateien;
    
    
    # Informationen zum Startmodus (mit oder ohne Torrenterstellung)
    my $start = $ARGV[0];
    my $torrent_start;
    
    # nur starten, wenn start_torrent oder start als Parameter angegeben sind
    if ($start) {
       $torrent_start = 1 if $start eq "start_torrent";
       $start = 1 if $start eq "start";
       $start = undef if $start ne 1;
       }
    
    ### Meldungen ############
    
    # nur user libox kann das script ausführen wegen Quotaüberschreitung bei dvd-iso..
    unless ($webuser) {
    print <<ENDE;
    
    ======================================================
      Du kannst nur als Benutzer libox ISO-dateien
      für die PrOOo-Box erzeugen!
    
      gebe dazu das folgende Kommando ein
    
    sudo -i -u libox
      (dein Benutzerpasswort wird verlangt)
    
      danach führe den Befehl
    
    $probogroupdir/isobuild/$kommando
    
      nochmal aus.
    
      EINE ISODATEI WURDE NICHT ERSTELLT!
    
    ENDE
    exit 0
    }
    
    # falls jemand auf die Idee kommt, diese Datei direkt aufzurufen..
    if ($kommando eq "build_iso.pl") {
    print <<ENDE;
    
    ======================================================
      Du hast die Datei
      "$kommando" aufgerufen.
      Das ergibt keine brauchbaren Ergebnisse.
    
      wechsle in das Verzeichnis
    $probogroupdir/isobuild
      und rufe einen dort vorhandenen, hierher
      zeigenden Symlink auf.
      Starte den Befehl mit einem ./ also z. B.:
    ./build_2.3.1-2_CD_Win
    
      EINE ISODATEI WURDE NICHT ERSTELLT!
    
    ENDE
    exit 0
    }
    
    # Begrüßung
    unless ($torrent_start or $start) {
    print <<ENDE;
    
    ======================================================
      Hallo,
      Willkommen beim Bauen von "$isoname"!
    
      Es existieren mit derselben Versionsbezeichnung schon folgende
      Dateien:
    $dateien
      Du bekommst am Ende des Vorgangs Informationen darüber, was
      angelegt worden ist, damit Du reagieren kannst, falls Du es Dir
      anders überlegt hast.
    
    
      Es gibt zwei Möglichkeiten die ISO-datei zu erstellen:
    
    1. Die Dateien erstellen ohne die Verteilung per Bittorrent anzustoßen
       Befehl: start
    
       Es wird zwar eine torrent-Datei erstellt, aber wirkungslos in's
       "parken"-Verzeichnis verfrachtet.
    
    
    2. Verteilung in's Bittorrent Netzwerk gleich einleiten:
       Befehl: start_torrent
    
       Nach dem erstellen der ISO-Datei wird eine torrentdatei ins
       Torrentverzeichnis, und eine Kopie in's Trackerverzeichnis gelegt.
       Die Bittorrentauslieferung ist damit für den Testbetrieb
       eingerichtet, und kann sofort starten.
    
    
     Für die Beschickung der ftp Mirrors brauchst Du
     besondere Rechte, oder die Hilfe von jemandem, der diese hat.
    
     ******* los geht's ************
    
     Damit es losgehen kann, gib bitte ein:
    
    $probogroupdir/isobuild/$kommando start_torrent
    
      oder
    $probogroupdir/isobuild/$kommando start
    
    
      Viel Erfolg!
    
      EINE ISODATEI WURDE NICHT ERSTELLT!
    
    ENDE
      exit 0
    }
    
    
    # falls aus dem Symlinknamen das zu erstellende
    # medium nicht zu erkennen ist..
    unless ($medium) {
    print <<ENDE;
    
    ======================================================
      Es konnte nicht festgestellt werden,
      von welchen Daten die ISO-Datei erstellt
      werden soll.
    
      Die Namen der Symlinks sind folgendermaßen zusammengesetzt:
      build_<OOo-version>-<liboxzähler>[_snapshot]_(CD_<OS>|DVD)
      also z.B. build_2.3.1-2_CD_Win, oder build_2.3.1-1_snapshot_DVD
    
      build_<OOo-version>[-(snapshot|cebit)]_(CD|DVD)
      also z.B. build_2.3.1-2_CD_Win, oder build_2.3.1-2_snapshot_DVD
    
      Falls Du dir nicht erklären kannst, was nicht stimmt, nimm einen
      vorhandenen Symlink und erstelle eine geänderte Kopie davon.
    
    
      EINE ISODATEI WURDE NICHT ERSTELLT!
    
    ENDE
    exit 0
    }
    
    # ISO existiert bereits..
    if (-e "$isodir/$isoname") {
      print qq|
    
      Datei "$isodir/$isoname"
      existiert bereits!
    
      Bitte einen neuen Namen vergeben, oder
      die vorhandene(n) Datei(en) löschen.
    
      Folgende Dateien mit Versionsbezeichnung
    
      "$boxname"
    
      wurden gefunden:
    $dateien
    
    
    
      Befehl, um die nicht mehr benötigten Dateien zu löschen:
    rm $dateien_loeschen
    
      EINE ISODATEI WURDE NICHT ERSTELLT!
    
      |;
      exit 0
      }
    
    ################## Ende Meldungen #############
    
    ######### Das ISO wird aufgebaut
    
    # in's webuser$HOME wechseln
    chdir $probogroupdir;
    
    # Datei mit Versionsinformationen in's Wurzelverzeichnis des ISO schreiben
    Schreibe($build_datei,$versioninfo);
    
    # Programmversion für Isoerstellung
    my $mkisofsversion = `$mkisofsbinary -version`;
    
    # Name der Steuerdatei für mkisofs
    my $isofsrc = ".mkisofsrc";
    
    # OS-Bezeichnungen zuordnen
    my $os;
    $os = "Windows" if $medium =~ /cd_win/;
    $os = "Linux" if $medium =~ /cd_linux/;
    $os = "macOS" if $medium =~ /cd_mac/;
    $os = "Solaris" if $medium =~ /cd_solaris/;
    $os = "FreeBSD" if $medium =~ /cd_freebsd/;
    $os = "Alle Plattformen" if $medium =~ /dvd/;
    
    
    
    # erstelle Steuerdatei für mkisofs
    my $mkisofsrc =<<ENDE;
    PUBL=PrOOo-Box-Team <prooobox\@openoffice.org>
    PREP=PrOOo-Box-Team <prooobox\@openoffice.org>
    VOLI=$VOLI
    VOLS=$isoname 1/1
    SYSI=$os
    APPI=$mkisofsversion
    ENDE
    
    # mkisofsrc  anlegen
    Schreibe($isofsrc,$mkisofsrc);
    
    # Datei mit Positionierungsinformationen anlegen
    my $posfile = "$basedir/sort_file";
    
    my $posinfo =<<ENDE;
    $basedir/bin    -6000
    $basedir/start.exe      -6000
    $basedir/ende.exe       -6000
    $basedir/ShelExec.exe   -6000
    ENDE
    
    Schreibe($posfile, $posinfo) if $medium eq "cd_win" or "dvd";
    
    ##########
    # ISOerstellung..
    
    # in's Verzeichnis für das ISO wechseln
    chdir $isodir;
    
    # option -follow = folge symlinks - nur für CD
    my $option;
    #  $option = "-f" if $medium =~ /cd/;
       $option = " -sort $posfile" if (-r $posfile);
    
    # ISO erstellen..
    system "$mkisofsbinary $option -volset-size 1 -volset-seqno 1 -rational-rock  -joliet  -disable-deep-relocation -iso-level 3 -o $isoname $basedir";
    
    # version.txt wieder löschen,
    # da im dynamischen live-System ohne Sinn.
    unlink $build_datei;
    
    # md5sum erstellen..
    print qq|
    ermittle md5sum von $isoname ..
    
    |;
    
    my $md5sum_datei = "$isoname.md5sum.txt";
     system "md5sum $isoname | tee $md5sum_datei";
    
    # weitere Informationen für's Versionsarchiv
    $build .= "\nmd5sum:\n";
    $build .= Lese($md5sum_datei);
    $build .= "\n\nBemerkungen:\n";
    
    # DOS Zeilenenden verwenden
    $build =~ s/\n/\r\n/g;
    
    # Schreibe Datei ins Versionsarchiv
    Schreibe($build_archiv,$build);
    
    # Hardlink für torrent-ISO
    my $hardlink = "ln $isoname $torrent_isos/$torrent_isoname";
    print qq|
    
    erstelle Hardlink für Bittorrentverteilung ..
    
    $hardlink
    |;
    
    system $hardlink;
    
    # torrent-Datei erstellen..
    
    if ($torrent_start) { # temporär bis Modalitäten geklärt sind
    
    my $make_torrent = qq|/home/cloph/maketorrent-console --comment "see http://prooo-box.org/download for download issues" http://torrent.projects.ooodev.org:6969/announce $torrent_isos/$torrent_isoname|;
    
    print qq|
    
    erstelle torrent-Dateien..
    
    $make_torrent
    |;
    
    system $make_torrent;
    
    # in seed und tracker-Verzeichnis packen oder ausparken..
    
    my $go_torrent = "cp -a $torrent_isos/$torrent_isoname.torrent  $torrents_dir";
    my $go_tracker = "mv $torrent_isos/$torrent_isoname.torrent  $tracker_dir";
    my $go_parken  = "mv $torrent_isos/$torrent_isoname.torrent  $parken_dir";
    
    # torrent wird gestartet..
    if ($torrent_start) {
    print qq|
    
    .. und packe sie ins torrent- und tracker-Verzeichnis
    
    $go_torrent
    
    $go_tracker
    |;
    
    system $go_torrent;
    system $go_tracker;
    
    }else{
    
    # torrent wird nicht gestartet..
    print qq|
    
    .. und packe sie ins parken-Verzeichnis
    
    $go_parken
    
    der Bittorrent tracker und client wird nicht gestartet !!
    
    |;
    
    system $go_parken;
    }
    }
       # find nach der Erstellung aufrufen
       $dateien = `$find`;
    print qq|
    
      Alle Pfade, die "$boxname" enthalten:
    
    $dateien
    
    .. fertig
    
    |;
    
    #  Befehl, um die nicht mehr gewünschten Dateien zu löschen:
    #rm "$dateien"
    
     # "$inhalt" in "$datei" schreiben
    sub Schreibe {
      my ($datei,$inhalt) = @_;
      open DATEI, '>', $datei or die "kann '$datei' nicht schreiben: $!\n";
      print DATEI $inhalt;
      close DATEI or die "kann '$datei' nicht schließen: $!\n";
    }
    
     # Datei einlesen
     sub Lese {
      my $datei = shift;
    # {
    # local $/;
      open DATEI, '<', $datei or die "can't read '$datei': $!\n";
    # }
      my @zeilen = <DATEI>;
      close DATEI or die "can't close '$datei': $!\n";
      return "@zeilen";
     }
    
    
    1;
    
    # $Log: build_iso.pl,v $
    # Revision 1.2  2011/05/06 21:45:45  libox
    # minor chanches, removing old version log entries
    #
    # Revision 1.1  2011/05/04 11:51:36  libox
    # Initial revision