Mac OS X

Aus Zebradem WIKI
Zur Navigation springenZur Suche springen

Das Board mit Freiheiten




Diese Seite beschäftigt sich mit der Nutzung der Fritz!Box im Zusammenspiel mit Mac OS X.

Drucken

Am USB-Anschluss der Fritz!Box kann ein USB-Drucker angeschlossen werden. Ebenso funktioniert ein USB PTR-Wandler, über den sogar ältere Apple-Drucker mit Parallel-Schnittstelle (Centronics) wie der LaserWriter Pro 600 problemlos vom Netzwerk aus genutzt werden können.

  • Drucker-Dienstprogramm öffnen
  • "Hinzufügen"
  • Protokoll: "HP Jet Direct - Socket"
  • Adresse: fritz-box
  • Drucken mit: PostScript bzw. entsprechendes PPD

Growl Anrufmonitor

Growl ist ein Programm, das Benachrichtigungen in die Oberfläche von Mac OS X einblendet. Es lässt sich über das Netzwerk ansteuern.

Dies lässt sich nutzen, um eingehende Anrufe auf einem laufenden Mac, der per LAN oder WLAN verbunden ist, zu signalisieren, samt dem Resultat der Rückwärtssuche im Telefonbuch.

Screenshot

http://lime.quickshareit.com/share/bild19e26a.png

Features

  • Anzeige von eingehenden Anrufen per Growl auf dem Mac
  • Anzeige des Namens und der Adresse per Rückwärtssuche auf telefonbuch.de
  • Alternativ Anzeige des Ortsnetzes, falls die Rufnummer über die Rückwärtssuche nicht auffindbar ist
  • Bei Mobilfunknummern Anzeige des Mobilfunknetzes
  • Läuft auf der Fritz!Box, geschrieben in PHP für einfache Erweiterbarkeit
  • Die gesamte Programmlogik ist auf der Fritz!Box (z.B. USB-Stick) untergebracht, keine Modifikationen der Firmware nötig. Nach Abziehen des USB-Sticks und Neustart ist alles wieder "verschwunden".

Installation

  • Growl auf dem Mac installieren, in den Systemeinstellungen unter Growl folgendes einstellen:
    • "Beim Anmelden starten"
    • Netzwerk -> "Eingehende Benachrichtigungen akzeptieren"
    • Netzwerk -> "Registrierung von Anwendungen erlauben" (optional Server Passwort)
  • Telnet-Zugang auf der Fritz!Box aktivieren und per Telnet folgendes auf der Fritz!Box installieren:
    • /var/calllog: ein einfaches Wrapper-Script, das das PHP-Script aufruft
    • /var/media/ftp/FlashDisk-Partition-0-1/php/php: PHP Binary (auf dem USB-Stick)
    • /var/media/ftp/FlashDisk-Partition-0-1/php/calllog.php php/Growl Anrufmonitor PHP-Script (auf dem USB-Stick)
    • /var/media/ftp/FlashDisk-Partition-0-1/calllog.txt: Optionales Protokoll (leere Datei anlegen, dort schreibt der Anrufmonitor hinein)
    • Die Scripte ausführbar machen:


chmod 755 scriptname
    • Anpassungen in php/callog.php vornehmen:
      • IP-Adresse des Rechners, dem die Growl Notifications zugestellt werden sollen
      • Server Passwort von Growl (Unter Server Passwort in der Growl Netzwerk Konfiguration)

Meine Fritz-Box hat den Speicherstick nicht unter FlashDisk-... einigehängt, sondern unter einem anderen Namen. Anpassungen in den Skripten /var/callog, php/calllog.php müssen entsprechend vorgenommen werden.

/var/calllog

Dieses Script wird von der Fritz!Box immer dann aufgerufen, wenn ein Anruf eingeht. Es dient lediglich dazu, bei jedem eingehenden Anruf das untenstehende PHP-Script aufzurufen, das die eigentliche Programmlogik enthält.

#!/bin/sh
/var/media/ftp/FlashDisk-Partition-0-1/php/calllog.php $1

externer Server: Alternative calllog Datei. Um die Anrufe an ein php script auf einem extern Server weiterzuleiten:

#!/bin/sh
./usr/bin/wget -O - http://<ip/hostname des externen Servers>/calllog.php?phone=$1

Zusätzlich muss man in der calllog.php folgenden Zeile umschreiben. Orginal calllog.php:

$phonenumber = $_SERVER["argv"][1];

calllog.php für extern server:

$phonenumber = $_GET["phone"];

Update: Dies überdauert sogar einen Neustart, wenn man es nach /var/flash/callog schreibt:

cat /var/calllog > /var/flash/calllog

Update: Bei der Firmware-Version 29.04.67 hat sich der Pfad geändert, in den USB-Sticks eingehängt werden. Daher ist die erste Zeile von calllog.php entsprechend anzupassen:

#!/var/media/ftp/CBM-FlashDisk-01/php/php -f

Download

Anmerkung: Läuft auf meiner 7270er leider nicht. PHP meint die Datei nicht finden zu können »No input file specified.« Könnte es evtl. dran liegen, dass php hier als fast-cgi statt als cli kompiliert wurde?


Modifiziertes Script (woehrl-mod):

Folgende Neuerungen:

 1.3 - Added support for multiple devices
     - Added "always" ($ATTACH_TYPE)
     - Changed debugging
     - Changed comments to english and made them more explainable (hopefully ;-))
     - Changed calllog-script (should now always work - no editing needed)
     - Configuration in separate file
     - Code cleanup

 1.2 - Changed PHP Binary (7270 Fix)
     - Removed utf8_encode

 1.1 - Added areacode number
     - Added localisation support
     - Added phonebook search
     - Fixed reverse lookup

calllog.php

IP und PASSWORD sind entsprechend einzutragen, wie bei dem Mac, auf dem Growl läuft.

#!/var/media/ftp/FlashDisk-Partition-0-1/php/php -f
<?

#
# Fritz!Box Growl Anrufmonitor
# Version 1.0
# Copyright (c) probono at myrealbox dot com
# GPL v2
#

#========================================================================================

#
# Variables
#

$IP="192.168.178.21"; # IP address where the notification should be sent to
$PASSWORD="asd"; # Growl password of the server where the notification should be sent to
$LOGFILE="/var/media/ftp/FlashDisk-Partition-0-1/calllog.txt";

#========================================================================================

#
# Functions 
#

function location($number){
	# Get location from google.de
	$shortnumber = substr($number."000000000",0,9);
	$html = file_get_contents("http://www.google.de/search?num=1&q=$shortnumber");
	preg_match_all("|<td valign=top><font size=-1>(.*?)<|",$html,$matches);
	return ($matches[1][0]);
}

function reverse($number){
	# Get reverse information from www4.dastelefonbuch.de
	$html = file_get_contents("http://www4.dastelefonbuch.de/?cmd=search&kw=$number");
	preg_match_all("|celname..(.*?</a>)|",$html,$matches);
	$name = strip_tags($matches[1][0]);
	preg_match_all("|celstreet..(.*?)<|",$html,$matches);
	$street = $matches[1][0];
	preg_match_all("|celcity..(.*?)<|",$html,$matches);
	$city = $matches[1][0];
	return (trim("$name $street $city"));
}

function reverseorlocation($number){
	# Get reverse information, fall back to location
	$reverse = reverse($number);
	if(!$reverse) $location = location($number);
	return trim("$reverse $location");
}

function utf8_encode($str){ 
	# Since our minimal PHP is lacking this function, we have to mimic it (to be fixed)
	$str = preg_replace("/&.*?;/i", " ", $str);
    $str2 = preg_replace("/[a-z0-9A-Z ]/i", "", $str);
    $sonderzeichen = array();
    for ($i=0; $i<strlen($str2); $i++) {
            if (!in_array($str2[$i], $sonderzeichen)) { 
                    $sonderzeichen[] = addslashes($str2[$i]);
            }
    }
    for ($i=0; $i<count($sonderzeichen); $i++) {
            $str = str_replace(stripslashes($sonderzeichen[$i]), $ersatz, $str); 
    }
    return $str;	
}

function sendgrowl($ip,$password,$applicationname,$notificationname,$title,$message){

	class Growl
	{
		public $appName = "PHP Notify";
		public $address;
		public $password;

		public $port = 9887;
		public $notifications = array();

		function __construct($app_name = null)
		{
			if(isset($app_name))
				$this->appName = utf8_encode($app_name);
		}
		
		function setAddress($address, $password = "")
		{
			$this->address = $address;
			$this->password = $password;
		}
		
		function addNotification($name, $enabled = true)
		{
			if($name != "")
				$this->notifications[] = array("name" => utf8_encode($name), "enabled" => $enabled);
		}
		
		function register($address = null, $password = "")
		{
			if(isset($address))
			{
				$this->address = $address;
				$this->password = $password;
			}
			
			$data = "";
			$defaults = "";
			$num_defaults = 0;
			
			for($i = 0; $i < count($this->notifications); $i++)
			{
				$data .= pack("n", strlen($this->notifications[$i]["name"])) . $this->notifications[$i]["name"];
				if($this->notifications[$i]["enabled"])
				{
					$defaults .= pack("c", $i);
					$num_defaults++;
				}
			}

			// pack(Protocol version, type, app name, number of notifications to register)
			$data  = pack("c2nc2", 1, 0, strlen($this->appName), count($this->notifications), $num_defaults) . $this->appName . $data . $defaults;
			$data .= pack("H32", md5($data . $this->password));

			$this->send($data);
		}
		
		function notify($name, $title, $message, $priority = 0, $sticky = false)
		{
			$name     = utf8_encode($name);
			$title    = utf8_encode($title);
			$message  = utf8_encode($message);
			$priority = intval($priority);
			
			$flags = ($priority & 7) * 2;
			if($priority < 0) $flags |= 8;
			if($sticky) $flags |= 1;

			// pack(protocol version, type, priority/sticky flags, notification name length, title length, message length. app name length)
			$data = pack("c2n5", 1, 1, $flags, strlen($name), strlen($title), strlen($message), strlen($this->appName));
			$data .= $name . $title . $message . $this->appName;
			$data .= pack("H32", md5($data . $this->password));

			$this->send($data);
		}
		
		function send($data)
		{
			if(function_exists("socket_create") && function_exists("socket_sendto"))
			{
				$sck = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
				socket_sendto($sck, $data, strlen($data), 0x100, $this->address, $this->port);
			}
			elseif(function_exists("fsockopen"))
			{
				$fp = fsockopen("udp://" . $this->address, $this->port);
				fwrite($fp, $data);
				fclose($fp);
			}
		}
	}

	$g = new Growl($applicationname); # application name
	$g->setAddress($ip, $password); 
	$g->addNotification($notificationname); # notification type
	$g->register(); 
	$g->notify($notificationname, $title, $message);
}

#
# Program logic
#

# Compose message
$arguments = $_SERVER["argv"];
$phonenumber = $arguments[1];
$mymessage = reverseorlocation($phonenumber);

# Send message with Growl
sendgrowl($IP,$PASSWORD,"FritzBox","Anruf",$phonenumber,$mymessage);

# Write message to logfile
if($LOGFILE) file_put_contents ($LOGFILE, date("d.m.Y H:i")." | $phonenumber | $mymessage \n\n", FILE_APPEND | LOCK_EX);

?>

Bonjour/Rendezvous/Avahi/Zeroconf

Mit folgendem Befehl kann man das lokale Netzwerk auf Bonjour/Rendezvous/Avahi/Zeroconf-Geräte (Macs, Drucker, iTunes,...) durchsuchen:

dig @224.0.0.251 -p 5353 _workstation._tcp.local ANY

Leider ist der "dig"-Befehl auf der Fritz!Box nicht vorhanden, deshalb würde ich gern PHP verwenden. Es existiert eine Erweiterung für PHP namens Pear Net_DNS, doch leider gibt es keine Dokumentation, wie man den oben gezeigten Befehl damit emulieren kann.

Leider funktioniert der folgende PHP-Code noch nicht: (wer kann helfen?)

<?php
require_once 'Net/DNS.php';

$resolver = new Net_DNS_Resolver();
$resolver->debug = 1; // Turn on debugging output to show the query
$resolver->nameservers = array(              //
                           '224.0.0.251'     // Dummy address for Zeroconf
                           );
$resolver->port = 5353;
$response = $resolver->rawQuery('_workstation._tcp.local', 'ANY');

if (! $response) {
  echo "\n";
  echo "ANCOUNT is 0, therefore the query() 'failed'\n";
  echo "See Net_DNS_Resolver::rawQuery() to receive this packet\n";
}
?>

Neue IP-Adresse per UPnP

Einfach im Terminal pasten, um eine neue IP-Adresse zu bekommen. Damit dies funktioniert, muss auf der Fritz!Box (leider) Universal Plug-and-Play (UPnP) aktiviert sein.

curl "http://fritz.box:49000/upnp/control/WANIPConn1" -H "Content-Type: text/xml; charset="utf-8"" -H "SoapAction:urn:schemas-upnp-org:service:WANIPConnection:1#ForceTermination" -d "<?xml version='1.0' encoding='utf-8'?> <s:Envelope s:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' xmlns:s='http://schemas.xmlsoap.org/soap/envelope/'> <s:Body> <u:ForceTermination xmlns:u='urn:schemas-upnp-org:service:WANIPConnection:1' /> </s:Body> </s:Envelope>"

Man kann auch diesen Code in eine Textdatei kopieren und mit dem Suffix .command speichern. chmod a+x nicht vergessen.


Dial!Fritz - der Anrufmanager für den Mac

Dial!Fritz ist der Anrufmanager für den Mac, in Verbindung mit der Fritz!Box Fon von AVM.

Eingehende Anrufe werden am Mac mit Anruferdetails aus dem Adressbuch angezeigt – und wenn diese nicht vorhanden sind, wird versucht den Namen per Rückwärtssuche zu ermitteln. Ausgehende Anrufe können mit Dial!Fritz vom Mac aus gestartet werden, entweder aus dem Adressbuch, Filemaker, LaunchBar, Quicksilver, Daylite oder direkt aus Dial!Fritz heraus. Mit Dial!Fritz haben Sie zudem die Möglichkeit die Anrufliste der Fritz!Box anzusehen, Gesprächsnotizen aufzuzeichnen oder zum Beispiel einen neuen Kontakt ins Adressbuch aufzunehmen. Viele weitere Funktionen machen Dial!Fritz zu einer vollständigen CTI-Lösung für den Mac in Verbindung mit der Fritz!Box Fon von AVM. AppleScript-Aktion steuern den Mac bei ein- bzw. ausgehenden Anrufen, oder geben Anruferinformationen an ein anderes Programm, Datenbank weiter. Durch AppleScript-Unterstützung bzw des callto-Protokolls können Sie Rufnummern direkt aus anderen Programmen oder aus dem Browser starten.

Lizenzgebühr : 19 €

fritz.mac Suite - Anrufbeantworter-Nachrichten verwalten / Faxen über die Fritz!Box vom Mac aus

fritz.mac Suite (kostenpflichtig, 30,00 EUR) erlaubt es, vom Mac aus Faxe über die Fritz!Box zu verschicken. (Genau das wollte ich auch schon programmieren...)

Ebenfalls integriert ist die Verwaltung von AB-Nachrichten auf einem USB-Stick, Wählen vom Mac aus sowie ein Anrufmonitor.

Screenshot

Frizzix - Kostenloser Fritz!Box Anrufmanager für OS X

Frizzix ist eine kostenlose Alternative zu den oben genannten Programmen, wenn ein geringerer Funktionsumfang ausreicht. Frizzix zeigt ebenfalls ein- und ausgehende Anrufe mit Growl an, ist in das OS X-Adressbuch integriert, kann verschiedene Mediaplayer pausieren, zeigt die Anrufliste an und bietet eine einfache Wählhilfe.

Adressbuchimport

Ich hab' da ein python-skript gehackt, dass die Adressbucheintraege unter OSX in einem CSV-Format rausschreibt, die der "FRITZ!Box Monitor" vertraegt (siehe Anleitung beim ersten link). Zwar ein wenig umstaendlich, aber immerhin klappt's so zumindest einigermassen. Mit dem rausschreiben einer XML-Adressbuch-Datei hab ich's zwar auch probiert, leider hat die box das file immer wieder geleert (also net angenommen). --

Alternative zu Fakes-Python Script - Erzeugt eine XML-Datei aus dem Mac os X Adressbuch zum Import über die Fritz.box Admin-Oberfläche. MacOsX-Adressbuch-Exporter

Quellenangaben

http://www.wehavemorefun.de/fritzbox/index.php/Mac_OS_X