ftp_fget -> Permission denied... evtl. nach Update auf 2.60

Hallo zusammen,
mir ist heute durch Zufall aufgefallen, das mein Anrufbeantworter nicht wirklich funktioniert. Ich bekommen hierbei:


$File = $files1[1];
			$filename = "ftp://192.168.0.11/Intenso-MicroLine-01/FRITZ/voicebox/rec/$File";
			$source = "ftp://192.168.0.11/Intenso-MicroLine-01/FRITZ/voicebox/rec/$File";
                    
			$target =  fopen("C:\IP-Symcon\anrufb.fritz", "w");
			$conn = ftp_connect("192.168.0.11");
			ftp_login($conn,"ftpuser","1132");
			ftp_fget($conn,$target,$source,FTP_ASCII);

Die Fehlermeldung:


Warning: ftp_fget(): ftp://192.168.0.11/Intenso-MicroLine-01/FRITZ/voicebox/rec/rec.0.004: Permission denied. in C:\IP-Symcon\scripts\25706.ips.php on line 132
[0] in function ftp_fget in C:\IP-Symcon\scripts\25706.ips.php on line 132

Ich habe vor kurzem von 2.4 auf 2.6 geupdated, außerdem war der Usb-Stick an der Fritzbox def und wurde ersetzt. Der Pfad (ftp://192.168.0.11/Intenso-MicroLine-01/FRITZ/voicebox/rec/rec.0.004) ist aber korrekt. Auch wird ein, ein paar Zeilen weiter unten stehendes,

unlink("$filename")

korrekt ausgeführt.

Hat jemand eine Idee?

Danke schonmal und schöne Grüße

goran

so, Fehler gefunden. War natürlich mal wieder meine eigene Schussligkeit.

ich habe ja geschrieben:

$source = "ftp://192.168.0.11/Intenso-MicroLine-01/FRITZ/voicebox/rec/$File"; 

Es musss aber

$source = "/Intenso-MicroLine-01/FRITZ/voicebox/rec/$File"; 

heißen. Dummer kleiner Copy&Paste Fehler beim Pfad ändern für den neuen Usb Stick :eek:

Thema hat sich somit erledigt.

gruß
goran

Welches Script nutzt du? Kannst du Uhrzeit und Rufnummern der Datei zuordnen?

Es ist zusammengebasteltes Script auf Basis des von paresy. Ich kann die Aufnahmen deswegen Anrufer und Zeit zuordnen weil ich direkt nach der „disconect“ Meldung der Fritzbox das File vom USB auf die Festplatte kopiere und den Dateinamen ändere.

Kann aber auch gerne noch mal das Script Posten wenn Bedarf besteht.

Gruß
goran

Ich hätte Interesse :slight_smile: .

Also wie gesagt, Basis ist das hier.

Nachdem ich die Anrufliste im Dashboard und nicht im Webfront anzeige, habe ich einige Html-Sachen aus dem Script entfernt. Auch Teile der Installationsroutine fehlen. Dafür sind dann wieder Teile aus anderen Scripten hinzu gefügt.

Im großen und ganzen ist das sehr auf meine Bedürfnisse und Umgebung angepasst. Das wird sich nicht auf andere Umgebungen übernehmen lassen. Jedenfalls nicht ohne weiteres.

Vorraussetzung das mein Prinzip funktioniert, ist das nach dem Ende jedes Anrufes das Script ausgeführt wird. Ausgelöst wird das mit der Meldung „Disconnect“. Siehe hier

Das Anrufbeantworter-Script ist das hier. Den orginalen Beitrag finde ich nicht mehr, ich weis leider auch nicht mehr aus wessen Feder das entsprungen ist.

Wichtig ist auch das keine weiteren Nachrichten auf der Box liegen. Sonst funktioniert die Zuordnung File<->Anrufer nicht mehr. Im /Rec Ordner liegt nur eine „Dummy“ Datei (ein leeres txt oder so), damit war es für mich leichter zu Programmieren.

Der Ablauf ist, simpel gesagt, folgender:
-Anruf ist beendet (also auch wenn eine Nachricht hinterlassen wurde)
-Script wird gestartet
-Wenn eine neue Nachricht vorhanden ist, wird sie auf die Festplatte kopiert
-Sie wird in eine *.wav umgewandelt und mit dem Namen „Datum“.„Uhrzeit“.„Anrufername“ versehen
-Nachricht auf der Box wird gelöscht

Also hier nochmal meine Version das ganzen. Bitte nicht hauen, der Syntax bzw. die Programmierung ist bestimmt grausam, ich versuche halt mit meinen bescheidenen Kentnissen was zu erreichen.

<?
				$dir    = 'ftp://192.168.0.11/Intenso-MicroLine-01/FRITZ/voicebox/rec/';
				$files1 = scandir($dir,0);
    			$zaehler = count ($files1) -1;
//Konfiguration
$fritzbox = 'fritz.box';
$fritzgui = 'http://' . $fritzbox . '/cgi-bin/webcm';
$password = 'xxx';
$anzahl = 10;

//Ab hier nichts mehr ändern
$object = IPS_GetObject($IPS_SELF);
$parentID = $object['ParentID'];


$login = file_get_contents('http://' . $fritzbox . '/cgi-bin/webcm?getpage=../html/login_sid.xml');

$session_status_simplexml = @simplexml_load_string($login);

if($session_status_simplexml === false)
{
    die("Fehler beim einlesen der XML Daten. Wahrscheinlich ist eine zu alte Firmware installiert");
}
else if ($session_status_simplexml->iswriteaccess == 1)
{
    $SID = $session_status_simplexml->SID;
}
else
{
   $challenge = $session_status_simplexml->Challenge;
    $response = $challenge . '-' . md5(iconv("UTF-8", "UCS-2LE", $challenge . '-' . $password));
   $postdata = http_build_query(array('getpage' => '../html/de/menus/menu2.html', 'login:command/response' => $response));

    $opts = array('http' =>
                                array(
                                    'method' => 'POST',
                                 'header' => 'Content-Length: '.strlen($postdata)."
".
                                                'Content-Type: application/x-www-form-urlencoded',
                                    'content'=> $postdata
            )
    );

    $context  = stream_context_create($opts);
   $sendlogin = file_get_contents($fritzgui, false, $context);

   preg_match('@<input type="hidden" name="sid" value="([A-Fa-f0-9]{16})" id="uiPostSid">@i', $sendlogin, $matches);
   if (isset($matches[1]) && $matches[1] != '0000000000000000')
   {
      $SID = $matches[1];
   }
   else
   {
      echo "Fehler: Login fehlgeschlagen";
      return;
    }
}

//Anrufliste aktualisieren
$postdata = http_build_query(array('getpage' => '../html/de/menus/menu2.html','sid' => $SID, 'var:menu' => 'home', 'var:pagename' => 'foncalls'));

$opts = array('http' =>
                            array(
                                'method'  => 'POST',
                             'header'=> 'Content-Length: '.strlen($postdata)."
".
                                           'Content-Type: application/x-www-form-urlencoded',
                                'content' => $postdata
        )
);

$context  = stream_context_create($opts);
$getnewlist = file_get_contents($fritzgui, false, $context);

//Anrufliste abholen

$postdata = http_build_query(array('getpage' => '../html/de/FRITZ!Box_Anrufliste.csv', 'sid' => $SID));

$opts = array('http' =>
                            array(
                                'method'  => 'POST',
                             'header'=> 'Content-Length: '.strlen($postdata)."
".
                                           'Content-Type: application/x-www-form-urlencoded',
                                'content' => $postdata
        )
);

$context  = stream_context_create($opts);
$anrufliste = file_get_contents($fritzgui, false, $context);

$anrufliste = explode("
", $anrufliste);

//Verarbeitung

$str1 = "";
$str2 = "";
$str3 = "";
$pos = 0;
$pos1= 0;
$pos2= 0;
$pos3= 0;
for($i=3; $i<=sizeof($anrufliste); $i++)
{
    $eintrag = explode(";", $anrufliste[$i]);
    if(strlen($eintrag[2]) > 0)     //Test ob Anrufername in [2]
      $eintrag[3] = $eintrag[2];    //wenn ja dann nur Name anzeigen auf [3]
    unset($eintrag[2]);             //löscht eintrag [2]
    if(strlen($eintrag[4]) > 0)     //wenn Nebenstelle vorhanden eigene Nummer nicht Anzeigen
      $eintrag[5] = $eintrag[4];
    if(strlen($eintrag[3]) == 0)    //wenn Rufnummer 0 dann Unbekannt anzeigen
      $eintrag[3] = "Unbekannt";
    unset($eintrag[4]);
	 if($eintrag[5] == "Anrufbeantworter") //Anrufe auf AB als "abwesend" kennzeichnen
	   {		$eintrag[0] = "2";

			if ($zaehler >0)
		{
         //*                    Nachrichten zählen                           *

			$counter = ($eintrag[1]." ".$eintrag[3]);
			$counter = preg_replace("/:/", ".", $counter);
			$dir    = 'ftp://192.168.0.11/Intenso-MicroLine-01/FRITZ/voicebox/rec/';
			$files1 = scandir($dir,0);

			//*             Nachrichten auf Festplatte kopieren                 *

			$File = $files1[1];
			$filename = "ftp://192.168.0.11/Intenso-MicroLine-01/FRITZ/voicebox/rec/$File";
			$source = "/Intenso-MicroLine-01/FRITZ/voicebox/rec/$File";
                    
			$target =  fopen("C:\IP-Symcon\anrufb.fritz", "w");
			$conn = ftp_connect("192.168.0.11");
			ftp_login($conn,"ftpuser","1132");
			ftp_fget($conn,$target,$source,FTP_ASCII);

			//*                Nachrichten in Wav umwandeln                     *

			IPS_Sleep(3500);
			unlink("$filename");
			IPS_Execute("C:\IP-Symcon\dec.exe", "C:\IP-Symcon\anrufb.fritz C:\IP-Symcon\Aktuell.wav", false, false);
			IPS_Sleep(2000);
            if (file_exists("C:\IP-Symcon\Aktuell.wav"))
            {
				copy ("C:\IP-Symcon\Aktuell.wav", "C:\IP-Symcon\Anrufbeantw/$counter.new.wav");             //hier dateinamen festlegen (statt $counter)
            }

			//*                FTP Tunnel wieder schließen                     *

			ftp_close($conn);
			$zaehler = 0;
		}}
	 unset($eintrag[5]);             //Mobilteilname entfernen
    $eintrag[6] = $eintrag[6].";";  //; nach Verbindungszeit hinzufügen
    $caller = $eintrag[0];          //1,2,3 duch Eing... ersetzten

	 switch($caller){
		case 1:
		      {
             if($pos1 != $anzahl)
		        {foreach($eintrag as $data)
	           $str1 .= " ".$data;
		        $pos1++;
          	 }}
			break;
		case 2:
		      {
				 if($pos2 != $anzahl)
		        {foreach($eintrag as $data)
	           $str2 .= " ".$data;
		        $pos2++;
				 }}
			break;
		case 3:
		      {
		       if($pos3 != $anzahl)
		        {foreach($eintrag as $data)
	           $str3 .= " ".$data;
		        $pos3++;
				 }}
			break;
	 }
    if(($pos1+$pos2+$pos3) >= ($anzahl*3))
        break;
}


SetValueString(12702 /*[Dashboard\Fritzbox\Ankommend]*/, $str1);
SetValueString(43809 /*[Dashboard\Fritzbox\Abwesend]*/, $str2);
SetValueString(11937 /*[Dashboard\Fritzbox\Abgehend]*/, $str3);



$postdata = http_build_query(array('getpage' => '../html/de/menus/menu2.html', 'sid' => $SID, 'security:command/logout' => 'logout'));

$opts = array('http' =>
                            array(
                                'method'  => 'POST',
                             'header'=> 'Content-Length: '.strlen($postdata)."
".
                                           'Content-Type: application/x-www-form-urlencoded',
                                'content' => $postdata
        )
);

$context  = stream_context_create($opts);
$logout = file_get_contents($fritzgui, false, $context);

// Ab hier eigener Code - Anrufe Abwesend vergleichen, zählen

$abw=GetValueString(43809 /*[Dashboard\Fritzbox\Abwesend]*/);
$abwalt=GetValueString(26645 /*[Dashboard\Fritzbox\Abwesend_alt]*/);

if ($abw != $abwalt)
	{$aenderung = array_diff(explode(";", $abw), explode(";", $abwalt));
	 $anz = (count($aenderung));
	 SetValueInteger(35582 /*[Dashboard\Hauptbild\Anzahl Anrufe]*/, $anz);
	 

		}
// Anrufbeantworternachrichten zählen

$dir    = "C://IP-Symcon//Anrufbeantw/";
$files = scandir($dir,0);
$anz = 0;
foreach ($files as $var)
    		{if (substr_count($var, '.new') > 0)
			   {$anz ++;}
			}
SetValueInteger(18597 /*[Dashboard\Hauptbild\Anzahl Nachrichten_AB]*/, $anz);
?>

falls du etwas ähnliches vor hast oder Teile verwenden möchtest versuche ich natürlich so gut ich kann weiter zu helfen.

gruß
goran