Build iso.pl

From The Document Foundation Wiki
Jump to: navigation, search
#!/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 = "Mac OS X" 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