Seite 1 von 2

Verfasst: Dienstag 12. Januar 2010, 22:49
von kabu

Code: Alles auswählen

#!/usr/bin/python
call_from=67553434634646346346

datei = open("/etc/capisuite/banned_caller.conf", "r")
x = datei.read().split()
print x #zu testen was drinnesteht.
for zeile in x:
	if zeile == str(call_from):
		print "treffer"
		break
	else:
		print "nix"
datei.close()
fritzbox:~# echo "67553434634646346346" >> /etc/capisuite/banned_caller.conf
fritzbox:~# ./test
['12', '67', '13', '67', '76', '67553434634646346346']
nix
nix
nix
nix
nix
treffer
fritzbox:~#
drauf gekommen das es str(variableirgendwas) heißen muß
Bin ich als ich mal die variable und call_from im skript zusammen rechnen lassen wollte.Da kam dann das
fritzbox:~# ./test
['12', '67', '13', '67', '76']
12
67
Traceback (most recent call last):
File "./test", line 19, in <module>
r=zeile+call_from
TypeError: cannot concatenate 'str' and 'int' objects
fritzbox:~#

Verfasst: Dienstag 12. Januar 2010, 23:01
von Hyperion
Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# wieso nicht gleich als String, wenn es schon fix im Code steht?
call_from = "67553434634646346346"

# mapper für die Ausgabe als Dictionary
ouput = {
    True: "treffer",
    False: "nix"
}

# es kann ein IOError auftreten, also fangen wir den mal ab
try:
    # mit with wird die Datei auf jeden Fall geschlossen
    with open(r"/etc/capisuite/banned_caller.conf", "r") as in_file:
        # für Anfänger sicher tricky:
        # any(iterable) -> einmal True -> insgesamt True
        # danach eine list comprehension
        #    in_file.readlines() iteriert über jede Zeile der Datei
        #    anstelle von zeile generieren wir eine Liste von Trues, WENN
        #    die Bedingung am Schluss erfüllt ist (kann ja mehrfach vorkommen)
        # state = any([True for zeile in in_file.readlines() if zeile==call_from])
        # Ok, hier die richtige und konzeptuell bessere Variante von BlackJack
        state = any(call_from == line.strip() for line in in_file)
except IOError, e:
    print e
else:
    # Je nach Wert von State wird der entsprechende Wert des Dicts ausgegeben.
    print output[state]

Verfasst: Dienstag 12. Januar 2010, 23:04
von BlackJack
Mir stellt sich irgendwie die Frage, warum Du überhaupt eine Zahl verwendest. Du könntest die Telefonnummer auch gleich als Zeichenkette schreiben, denn letztendlich sind Telefonnummern auch keine Zahlen. Niemand rechnet damit -- es macht keinen Sinn sie zu addieren, zu dividieren, oder 19% Mehrwertsteuer von einer Telefonnummer zu berechnen. ;-)

Und dann ginge auch der einfache ``in``-Test statt einer Schleife.

Verfasst: Dienstag 12. Januar 2010, 23:06
von Hyperion

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

call_from = "67553434634646346346"

ouput = {
    True: "treffer",
    False: "nix"
}

try:
    with open(r"/etc/capisuite/banned_caller.conf", "r") as in_file:
        # so gehts ja noch einfacher :-)
        print output[call_from in in_file.read().split()]
except IOError, e:
    print e

Verfasst: Dienstag 12. Januar 2010, 23:12
von BlackJack
@Hyperion: WTF!? Mal abgesehen vom einfacheren Test mit ``in`` klappt das schonmal so nicht weil die Zeilen in der Datei mit einem Zeilenende-Zeichen enden, also nicht gleich einer Telefonnummer ohne dieses sein werden. Und dann ist das Argument von `any()` viel zu umständlich. Eine "list comprehension" statt eines Generatorausdrucks, `readlines()` statt über das Dateiobjekt iterieren, literales `True` und angehängte ``if``-Bedingung statt *vorne* einfach *nur* die Bedingung. Also: ``any(call_from == line.strip() for line in in_file)``

Verfasst: Dienstag 12. Januar 2010, 23:12
von jbs
BlackJack hat geschrieben:Und dann ginge auch der einfache ``in``-Test statt einer Schleife.
@Hyperion: Ich glaube er meint ``if call_from in in_file.read()``, oder?

Edit: Meinte er doch nicht :D

Verfasst: Dienstag 12. Januar 2010, 23:23
von Hyperion
BlackJack hat geschrieben:@Hyperion: WTF!? Mal abgesehen vom einfacheren Test mit ``in`` klappt das schonmal so nicht weil die Zeilen in der Datei mit einem Zeilenende-Zeichen enden, also nicht gleich einer Telefonnummer ohne dieses sein werden. Und dann ist das Argument von `any()` viel zu umständlich. Eine "list comprehension" statt eines Generatorausdrucks, `readlines()` statt über das Dateiobjekt iterieren, literales `True` und angehängte ``if``-Bedingung statt *vorne* einfach *nur* die Bedingung. Also: ``any(call_from == line.strip() for line in in_file)``
*seufz* Ich sollte dringend ins Bett gehen :oops:

Verfasst: Mittwoch 13. Januar 2010, 07:02
von kabu

Code: Alles auswählen

import capisuite,cs_helpers
my_path="/root/capisuite-examples/"

def callIncoming(call,service,call_from,call_to):
        try:
                if (call_to=="meineMSN"):
			datei = open("/etc/capisuite/banned_caller.conf", "r")
			x = datei.read().split()
			print "es ruft", call_from
			print x #zu testen was drinnesteht.
			for zeile in x:
				if zeile == str(call_from):
#	                        	filename=cs_helpers.uniqueName(my_path,"voice","la")
#                        		capisuite.connect_voice(call,1)
#					capisuite.audio_send(call,my_path+"announce.la")
#					capisuite.audio_send(call,my_path+"beep.la")
#                        		capisuite.audio_receive(call,filename,20,3)
#                        		capisuite.disconnect(call)
					print "treffer"
					break
				else:
					print "nix"
			datei.close()
		else:
                        capisuite.reject(call,1)
        except capisuite.CallGoneError:
                capisuite.disconnect(call)
geht aber ich kriege
fritzbox:~# capisuite -c /root/capisuite.conf
es ruftxxxxxxxxx
['12', '67', '13', '67', '76', '67553434634646346346', '67553434634646346346']
nix
nix
nix
nix
nix
nix
nix
Speicherzugriffsfehler
fritzbox:~# pidof capisuite
fritzbox:~#
danach ist capiuite aus.

wie verhindert mann den Speicherzugriffsfehler und woher kommt er?

Verfasst: Mittwoch 13. Januar 2010, 08:31
von kabu
scheit aber wenn ich das normal über das system laufen lasse zu gehen.

Ich probier das mal so ein Zeit lang und fülle langsam mal die blacklist.

Code: Alles auswählen

import capisuite,cs_helpers
my_path="/root/capisuite-examples/"

def callIncoming(call,service,call_from,call_to):
        try:
                if (call_to=="123456"): #<Hier die MSN (eigende nummer) eintragen
			datei = open("/etc/capisuite/banned_caller.conf", "r")
			x = datei.read().split()
#			print "es ruft", call_from
			print x #zu testen was drinnesteht.
			for zeile in x:
				if zeile == str(call_from):
	                        	filename=cs_helpers.uniqueName(my_path,"voice","la")
                        		capisuite.connect_voice(call,1)
#					capisuite.audio_send(call,my_path+"announce.la")
					capisuite.audio_send(call,my_path+"beep.la")
                        		capisuite.audio_receive(call,filename,20,3)
                        		capisuite.disconnect(call)
					break
			datei.close()
		else:
                        capisuite.reject(call,1)
        except capisuite.CallGoneError:
               capisuite.disconnect(call)

Verfasst: Mittwoch 13. Januar 2010, 09:42
von Rebecca
BlackJack hat geschrieben:Mir stellt sich irgendwie die Frage, warum Du überhaupt eine Zahl verwendest. Du könntest die Telefonnummer auch gleich als Zeichenkette schreiben, denn letztendlich sind Telefonnummern auch keine Zahlen.
Insbesondere, da bei Telefonnummern fuehrende Nullen wichtig sind.