[Guide] Eigener MacOSX Updateserver mit Reposado

Steffen.

\[T]/ Praise the sun!
Thread Starter
Mitglied seit
24.12.2004
Beiträge
3.362
Wer in einer etwas größeren Firma arbeitet und ein paar mehr Apfelcomputer im Betrieb hat, kann sich einmal die kostenlose und quelloffene Python Software Reposado anschauen. Mit dieser ist es möglich sehr schnell und einfach einen eigenen MacOSX Updateserver aufzubauen. Über diese können sich eure MacOSX Clients Updates laden. Das spart natürlich viel Traffic nach außen und ist vor allem massiv schneller da es über das lokale Netzwerk funktioniert.

Ihr könnt Reposado theoretisch auf einem Windows, Linux oder MacOSX Rechner installieren. Ich werde jedoch folgende Konfiguration wählen:
- Ubuntu Server 64bit 12.04 LTS
- Nginx Webserver
- Python 2.5 - 2.7
- Curl
- freier Port 80 in der Firewall für diesen Host

Hardwaretechnisch seit ihr relativ unlimitiert. Ich habe den Server in meinem Fall auf einem ESX Cluster System installiert. 2GB RAM reichen vollkommen, jedoch solltet ihr mindestens 200GB Festplattenplatz haben. Denn alle herruntergeladenen Updates von Apple wiegen schon gut und gerne 130GB (Tendenz steigend).

Zuerst solltet ihr also einen aufgesetzten und nutzbaren Ubuntu Server vor euch haben. Am besten natürlich jungfräulich ohne viel Schindluder installiert. SSH ist natürlich in Ordnung. Ich führe alle Kommandos als root aus. Falls ihr alles lieber über "sudo" in eurem User machen wollt setzt einfach immer ein "sudo" vor die Befehle.

Als erstes installieren wir die Versionierungssoftware "Git". Dies machen wir über den Befehl "apt-get install git-core". Mit Git clonen wir die neuste Version von Reposado über Github auf unseren Server. Deswegen cd´en wir uns erstmal in "/opt/". Dort clonen wir nun das Repository mit dem Befehl "git clone https://github.com/wdas/reposado.git". Wenn das durchgelaufen ist können wir uns einmal den Ordnerinhalt anzeigen lassen mit "ls". Dort sollten wir nun einen "reposado" Ordner sehen. Bevor wir die Installation starten, müssen wir jedoch erstmal die Basis für das Updateverzeichnis erstellen.

Daher erstellen wir zwei Verzeichnisse die später vom Webserver als Auslieferungsverzeichnis für die Updates dienen. Ich habe diese auf einer seperaten Festplatte in "/mnt/reposado" erstellt. Ihr könnt sie jedoch auch z.B. in "/var/www/" erstellen. Das bleibt euch überlassen. Erstellt an dem Ort eures Vertrauens daher die beiden Ordner "html" und "metadata". Der Besitzer des Ordners sollte der User sein der später den Sync Prozess immer anstoßen wird. In meinem Fall wieder root. Die Gruppenrechte sollten www-data sein. Daher chown´en wir die beiden Verzeichnisse passend mit "chown -R root:www-data html metadata". Danach noch die Lese,Schreibrecht setzen mit "chmod -R 775 hmtl metadata". Damit sind die Verzeichnisse fertisch für den Sync.

Wir gehen nun wieder zurück in unser reposado Verzeichnis mit "cd /opt/reposado". Schauen wir uns an was drinliegt mit "ls". Es sollte ungefähr folgender Kram drin sein: "code docs other setup.py". Wir interessieren uns aber nur für das "code" Verzeichnis. Deswegen ab rein da mit "cd code". Dort drin zeigen wir uns wieder an was drin liegt und es müssten ungefähr diese Files drin liegen: "reposadolib repo_sync repoutil". Wir starten nun die Konfiguration mit "./repoutil --configure". Ihr bekommt nun drei Fragen gestellt:

Code:
- Path to store replicated catalogs and updates: (Pfad zum HTML Verzeichnis das ihr vorher erstellt habt)
- Path to store Reposado metadata: (Pfad zum Metadata Verzeichnis das ihr vorher erstellt habt)
- Base URL for your local Software Update Service: (Falls ihr die Updates über eine URL verteilen wollt. Ich habe einfach die IP des Servers angebenen z.B. [URL]http://13.37.0.1[/URL])

Wenn ihr damit fertig seit wird im Code Verzeichnis nun eine Datei zu finden sein die sich "preferences.plist" nennt. Darin gespeichert sich die Einstellungen die wir gerade angegeben haben. Dort könnt ihr also Änderungen durchführen ohne wieder den configure machen zu müssen.

Nun starten wir den Sync Prozess. Dieser kann, je nachdem wie schnell die Internetleitung ist, ein paar Stunden dauern. Startet ihn mit "./repo_sync". Jetzt lädt sich Reposado die ganzen Updates runter. Daher lehnt euch zurück und zockt ein bisschen was ... oder lasst es einfach über Nacht laufen. Wenn der Sync Prozess fertig ist seht ihr am Ende folgende Nachricht: "repo_sync run ended". Jetzt installieren wir einen Webserver zur Auslieferung der Updates.

Wie bereits erwähnt wähle ich einen Nginx Webserver. Da dieser sehr schnell und relativ klein für das System ist. Ihr könnt jedoch auch einen Apache2 Webserver nutzen. Wir installieren jetzt den Nginx Server mit "apt-get install nginx". Wenn dieser Prozess durchgelaufen ist, modifizieren wir noch die Standard vHost Konfiguration mit dem Befehl "vi /etc/nginx/sites-enabled/default". Dort passen wir nun den Auslieferungspfad an. Dies sieht bei mir wie folgt aus:

Code:
server {
        #listen   80; ## listen for ipv4; this line is default and implied
        #listen   [::]:80 default ipv6only=on; ## listen for ipv6


        root /mnt/reposado/html/;
        index index.html index.htm;


        # Make site accessible from http://localhost/
        server_name localhost;


        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to index.html
                try_files $uri $uri/ /index.html;
                # Uncomment to enable naxsi on this location
                # include /etc/nginx/naxsi.rules
        }

Nun folgt noch eine kleine Modifikation. Damit wir später weniger Aufwand haben, fügen wir eine kleine Rewrite Rule ein die automatisch die richtige Catalog Datei dem ankommenden OSX System anbietet. Diese fügen wir einfach nach dem letzten "}" von obiger Serverkonfiguration ein:

Code:
## 10.4.x - Tiger
if ( $http_user_agent ~ "Darwin/8" ){
  rewrite ^/index(.*)\.sucatalog$ /content/catalogs/index$1.sucatalog last;
}
## 10.5.x - Leopard
if ( $http_user_agent ~ "Darwin/9" ){
  rewrite ^/index(.*)\.sucatalog$ /content/catalogs/others/index-leopard.merged-1$1.sucatalog last;
}
## 10.6.x - Snow Leopard
if ( $http_user_agent ~ "Darwin/10" ){
  rewrite ^/index(.*)\.sucatalog$ /content/catalogs/others/index-leopard-snowleopard.merged-1$1.sucatalog last;
}
## 10.7.x - Lion
if ( $http_user_agent ~ "Darwin/11" ){
  rewrite ^/index(.*)\.sucatalog$ /content/catalogs/others/index-lion-snowleopard-leopard.merged-1$1.sucatalog last;
}
## 10.8.x - Mountain Lion
if ( $http_user_agent ~ "Darwin/12" ){
  rewrite ^/index(.*)\.sucatalog$ /content/catalogs/others/index-mountainlion-lion-snowleopard-leopard.merged-1$1.sucatalog last;
}

Danach starten wir unseren Nginx Webserver neu mit dem Befehle "/etc/init.d/nginx restart". Wenn dort nun steht das alles ohne Fehler neugestartet ist machen wir weiter. Falls ein Fehler auftritt, prüft noch einmal ob das root Verzeichnis des vHosts korrekt ist. Wir gehen davon aus das alles geklappt hat. Geht nun einfach mal mit eurem Browser auf folgende Adresse: "http://IP.DES.SERVERS/content/catalogs/others/index-leopard-snowleopard.merged-1.sucatalog". Ihr sollte nun eine Datei runterladen oder angezeigt bekommen. Schaut einfach mal rein was drin steht, dürfte ein bisschen was sein :) Damit klappt die grundlegende Funktionalität des Servers schon einmal. Wir stellen jetzt noch einen Cronjob damit Reposado stündlich prüft ob neue Updates verfügbar sind. Dies machen wir mit "vi /etc/crontab". Dort tragen wir ganz am Ende folgendes ein:

Code:
# Reposado RepoSync anstoßen
0 *     * * *   root    /opt/reposado/code/repo_sync >> /opt/reposado/code/sync_log

Dadurch führt der User root stündlich und an jedem Tag das "repo_sync" Skript aus und schreibt ein Log mit dem Infos des letzten Sync in die Datei "sync_log" im Verzeichnis "/opt/reposado/code/". Damit ist die Konfiguration von Reposado abgeschlossen. Nun geht es an die Clients.

Ihr habt zwei Möglichkeiten die Clients mit euren Updates zu versorgen, das ist einmal die DNS Variante (diese funktioniert jedoch nicht mehr mit Mountain Lion) und einmal die OSX Updatepfad Konfiguration. Letztere ist einfacher aber verhindert das sich Mitarbeiter mit ihren Arbeitsrechner zuhause Updates laden können. Bei Interesse schreibe ich auch die DNS Variante hier dazu, der einfachheit halber nutzen wir jedoch jetzt die OSX Updatepfad Konfiguration. Öffnet ein Terminal auf eurem Mac und tippt diesen Befehl ein "sudo defaults read /Library/Preferences/com.apple.SoftwareUpdate CatalogURL". Ihr solltet als Antwort ungefähr folgendes erhalten:

Code:
CatalogURL
2012-10-05 11:54:18.741 defaults[3793:a07] 
The domain/default pair of (/Library/Preferences/com.apple.SoftwareUpdate, CatalogURL) does not exist

Das bedeutet das ihr keinen anderen Updateserver konfiguriert habt. Dies machen wir jetzt jedoch mit dem Befehl "sudo defaults write /Library/Preferences/com.apple.SoftwareUpdate CatalogURL http://IP.DES.SERVERS/index.sucatalog". Nun gehen wir zurück an den Ubuntu Server und starten den Befehl "tail -f /var/log/nginx/access.log". Damit hängen wir uns an die Logdatei dran und zeigen direkt Änderungen an der Datei an. Geht nun wieder zurück an euren Mac und startet das Softwareupdate. Auf dem Ubuntu Server sollte es jetzt rundgehen und einige Nachrichten auftauchen wie z.B.:

Code:
IP.DES.CLIENTS - - [05/Oct/2012:11:57:30 +0200] "GET /index.sucatalog HTTP/1.1" 200 1203104 "-" "App%20Store/129.7 CFNetwork/596.2.3 Darwin/12.2.0 (x86_64) (MacBookPro8%2C2)"
IP.DES.CLIENTS  - - [05/Oct/2012:11:57:30 +0200] "GET /content/downloads/34/44/041-7696/f26r8rlps7os813indz4y58qjllw9dte9e/041-7696.German.dist HTTP/1.1" 200 4860 "-" "App%20Store/129.7 CFNetwork/596.2.3 Darwin/12.2.0 (x86_64) (MacBookPro8%2C2)"

Das bedeutet das der Client an den Reposado Server kommt und sich nun die Informationen zieht die er momentan benötigt zum Updaten. Und damit seit ihr fertig! Glückwunsch, ihr habt nun euren eigenen MacOSX Updateserver konfiguriert. Sorry für den ganzen Text, aber Bilder dazu kann man wenig machen :)
 
Zuletzt bearbeitet:
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
Noch eine Info zu dem letzten Part mit der Konfiguration der Clients. Ich habe für uns in der Firma ein kleines Python Skript erstellt was die Umstellung des Updateservers anhand der DNS Einstellungen vornimmt. Dies ist momentan nur für die Mountain Lion Clients relevant. Werden die DNS Server der Firma erkannt wird auf den Reposado intern geschwenkt. Wenn DNS von Zuhause oder ähnliches erkannt wird. Einfach die DNS IP Adresse von euch eintragen dann sollte es im Prinzip laufen. Dann noch mit Lingon oder händisch in die launchd von OSX eintragen damit das Skript stündlich, oder öfters, läuft und prüft wo sich der User befindet.

Code:
#!/usr/bin/env python# -*- coding: UTF-8 -*-
################################################
# OSX Updateserverswitch von Steffen.
################################################
import os
import sys
import commands
debug = 'false'  # true oder false


def check():
    resolv1 = commands.getoutput("egrep -o 'DNS IP /etc/resolv.conf")
    resolv2 = commands.getoutput("egrep -o 'DNS IP2' /etc/resolv.conf")
    catalogurl = commands.getoutput("defaults read /Library/Preferences/com.apple.SoftwareUpdate CatalogURL")
    dns = resolv1 + resolv2
    if debug == 'true': print dns
    if debug == 'true': print catalogurl
    if dns == "DNSIPDNSIP2":
        if debug == 'true': print 'DNS von Firma gefunden!'
        if catalogurl == 'http://reposado/index.sucatalog':
            if debug == 'true': print "Updates werden von Reposado gezogen"
            sys.exit(0)
        else:
            catalog = commands.getoutput("sudo defaults write /Library/Preferences/com.apple.SoftwareUpdate CatalogURL http://reposado/index.sucatalog")
            if debug == 'true': print catalog
            sys.exit(0)
    else:
        if not catalogurl == "http://reposado/index.sucatalog":
            sys.exit(0)
        else:
            if debug == 'true': print 'DNS nicht gefunden!'
            catalog = commands.getoutput("sudo defaults delete /Library/Preferences/com.apple.SoftwareUpdate CatalogURL")
            if debug == 'true': print catalog
        sys.exit(0)
check()
 
Coole Sache! Danke Steffen, gibt es irgendwo auch ein Howto für Windows? :d
Hab auf meinem Hyper-V zuhause leider keinen Platz mehr für ne Virtuelle Disk, aber auf meinem Windows Server hab ich noch "bissl" Platz :d
 
Coole Sache! Danke Steffen, gibt es irgendwo auch ein Howto für Windows? :d
Hab auf meinem Hyper-V zuhause leider keinen Platz mehr für ne Virtuelle Disk, aber auf meinem Windows Server hab ich noch "bissl" Platz :d
Es gibt auch die Möglichkeit das ganze unter Windows zu nutzen. Dafür aber am besten die Doku anschauen von Reposado :)
https://github.com/wdas/reposado/blob/master/docs/reposado_py2exe.txt
Jaaaaa! :)
 
Wenn wir gerade bei Python sind: Cool wäre noch ne django App, die Statistiken sammelt und einzelne Rechner von Updates aussperrt.
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh