Build iso.pl
TDF LibreOffice Document Liberation Project Community Blogs Weblate Nextcloud Redmine Ask LibreOffice Donate
#!/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