Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vmj-qt
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Kulya
vmj-qt
Commits
59b2c363
Commit
59b2c363
authored
Jul 01, 2010
by
Luci Stanescu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added support for logging to files
parent
9889da8a
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
239 additions
and
1 deletion
+239
-1
__init__.py
blink/__init__.py
+9
-0
settings.py
blink/configuration/settings.py
+9
-1
log.py
blink/log.py
+221
-0
No files found.
blink/__init__.py
View file @
59b2c363
...
@@ -20,6 +20,7 @@ from sipsimple.configuration.settings import SIPSimpleSettings
...
@@ -20,6 +20,7 @@ from sipsimple.configuration.settings import SIPSimpleSettings
from
blink.configuration.account
import
AccountExtension
,
BonjourAccountExtension
from
blink.configuration.account
import
AccountExtension
,
BonjourAccountExtension
from
blink.configuration.settings
import
SIPSimpleSettingsExtension
from
blink.configuration.settings
import
SIPSimpleSettingsExtension
from
blink.log
import
LogManager
from
blink.mainwindow
import
MainWindow
from
blink.mainwindow
import
MainWindow
from
blink.resources
import
ApplicationData
from
blink.resources
import
ApplicationData
from
blink.sessions
import
SessionManager
from
blink.sessions
import
SessionManager
...
@@ -63,10 +64,18 @@ class Blink(QApplication):
...
@@ -63,10 +64,18 @@ class Blink(QApplication):
handler
=
getattr
(
self
,
'_NH_
%
s'
%
notification
.
name
,
Null
)
handler
=
getattr
(
self
,
'_NH_
%
s'
%
notification
.
name
,
Null
)
handler
(
notification
)
handler
(
notification
)
def
_NH_SIPApplicationWillStart
(
self
,
notification
):
log_manager
=
LogManager
()
log_manager
.
start
()
@
run_in_gui_thread
@
run_in_gui_thread
def
_NH_SIPApplicationDidStart
(
self
,
notification
):
def
_NH_SIPApplicationDidStart
(
self
,
notification
):
self
.
main_window
.
show
()
self
.
main_window
.
show
()
def
_NH_SIPApplicationDidEnd
(
self
,
notification
):
log_manager
=
LogManager
()
log_manager
.
stop
()
def
_initialize_sipsimple
(
self
):
def
_initialize_sipsimple
(
self
):
notification_center
=
NotificationCenter
()
notification_center
=
NotificationCenter
()
notification_center
.
add_observer
(
self
,
sender
=
self
.
application
)
notification_center
.
add_observer
(
self
,
sender
=
self
.
application
)
...
...
blink/configuration/settings.py
View file @
59b2c363
...
@@ -6,7 +6,7 @@
...
@@ -6,7 +6,7 @@
__all__
=
[
'SIPSimpleSettingsExtension'
]
__all__
=
[
'SIPSimpleSettingsExtension'
]
from
sipsimple.configuration
import
Setting
,
SettingsGroup
,
SettingsObjectExtension
from
sipsimple.configuration
import
Setting
,
SettingsGroup
,
SettingsObjectExtension
from
sipsimple.configuration.settings
import
AudioSettings
from
sipsimple.configuration.settings
import
AudioSettings
,
LogsSettings
from
blink.configuration.datatypes
import
ApplicationDataPath
,
SoundFile
from
blink.configuration.datatypes
import
ApplicationDataPath
,
SoundFile
from
blink.resources
import
Resources
from
blink.resources
import
Resources
...
@@ -16,6 +16,13 @@ class AudioSettingsExtension(AudioSettings):
...
@@ -16,6 +16,13 @@ class AudioSettingsExtension(AudioSettings):
recordings_directory
=
Setting
(
type
=
ApplicationDataPath
,
default
=
ApplicationDataPath
(
'recordings'
),
nillable
=
False
)
recordings_directory
=
Setting
(
type
=
ApplicationDataPath
,
default
=
ApplicationDataPath
(
'recordings'
),
nillable
=
False
)
class
LogsSettingsExtension
(
LogsSettings
):
trace_sip
=
Setting
(
type
=
bool
,
default
=
False
)
trace_pjsip
=
Setting
(
type
=
bool
,
default
=
False
)
trace_msrp
=
Setting
(
type
=
bool
,
default
=
False
)
trace_notifications
=
Setting
(
type
=
bool
,
default
=
False
)
class
SoundSettings
(
SettingsGroup
):
class
SoundSettings
(
SettingsGroup
):
inbound_ringtone
=
Setting
(
type
=
SoundFile
,
default
=
SoundFile
(
Resources
.
get
(
'sounds/inbound_ringtone.wav'
)),
nillable
=
True
)
inbound_ringtone
=
Setting
(
type
=
SoundFile
,
default
=
SoundFile
(
Resources
.
get
(
'sounds/inbound_ringtone.wav'
)),
nillable
=
True
)
outbound_ringtone
=
Setting
(
type
=
SoundFile
,
default
=
SoundFile
(
Resources
.
get
(
'sounds/outbound_ringtone.wav'
)),
nillable
=
True
)
outbound_ringtone
=
Setting
(
type
=
SoundFile
,
default
=
SoundFile
(
Resources
.
get
(
'sounds/outbound_ringtone.wav'
)),
nillable
=
True
)
...
@@ -23,6 +30,7 @@ class SoundSettings(SettingsGroup):
...
@@ -23,6 +30,7 @@ class SoundSettings(SettingsGroup):
class
SIPSimpleSettingsExtension
(
SettingsObjectExtension
):
class
SIPSimpleSettingsExtension
(
SettingsObjectExtension
):
audio
=
AudioSettingsExtension
audio
=
AudioSettingsExtension
logs
=
LogsSettingsExtension
sounds
=
SoundSettings
sounds
=
SoundSettings
blink/log.py
0 → 100644
View file @
59b2c363
# Copyright (C) 2010 AG Projects. See LICENSE for details.
# This module will be replaced by an improved logging system. -Luci
#
__all__
=
[
'LogManager'
]
import
os
import
sys
from
datetime
import
datetime
from
application
import
log
from
application.notification
import
IObserver
,
NotificationCenter
from
application.python.queue
import
EventQueue
from
application.python.util
import
Null
,
Singleton
from
zope.interface
import
implements
from
pprint
import
pformat
from
sipsimple.configuration.settings
import
SIPSimpleSettings
from
sipsimple.util
import
makedirs
from
blink.resources
import
ApplicationData
class
LogFile
(
object
):
def
__init__
(
self
,
filename
):
self
.
filename
=
filename
def
_get_filename
(
self
):
return
self
.
__dict__
[
'filename'
]
def
_set_filename
(
self
,
filename
):
if
filename
==
self
.
__dict__
.
get
(
'filename'
):
return
old_file
=
self
.
__dict__
.
pop
(
'file'
,
Null
)
old_file
.
close
()
self
.
__dict__
[
'filename'
]
=
filename
filename
=
property
(
_get_filename
,
_set_filename
)
del
_get_filename
,
_set_filename
@
property
def
file
(
self
):
if
'file'
not
in
self
.
__dict__
:
directory
=
os
.
path
.
dirname
(
self
.
filename
)
makedirs
(
directory
)
self
.
__dict__
[
'file'
]
=
open
(
self
.
filename
,
'a'
)
return
self
.
__dict__
[
'file'
]
def
write
(
self
,
string
):
self
.
file
.
write
(
string
)
def
flush
(
self
):
file
=
self
.
__dict__
.
get
(
'file'
,
Null
)
file
.
flush
()
def
close
(
self
):
file
=
self
.
__dict__
.
get
(
'file'
,
Null
)
file
.
close
()
class
LogManager
(
object
):
__metaclass__
=
Singleton
implements
(
IObserver
)
def
__init__
(
self
):
self
.
msrp_level
=
log
.
level
.
INFO
self
.
siptrace_file
=
Null
self
.
msrptrace_file
=
Null
self
.
pjsiptrace_file
=
Null
self
.
notifications_file
=
Null
self
.
event_queue
=
EventQueue
(
handler
=
self
.
_process_notification
,
name
=
'Log handling'
)
self
.
_siptrace_start_time
=
None
self
.
_siptrace_packet_count
=
None
def
start
(
self
):
settings
=
SIPSimpleSettings
()
notification_center
=
NotificationCenter
()
notification_center
.
add_observer
(
self
)
if
settings
.
logs
.
trace_sip
:
self
.
siptrace_file
=
LogFile
(
os
.
path
.
join
(
ApplicationData
.
directory
,
'logs'
,
'sip_trace.txt'
))
if
settings
.
logs
.
trace_msrp
:
self
.
msrptrace_file
=
LogFile
(
os
.
path
.
join
(
ApplicationData
.
directory
,
'logs'
,
'msrp_trace.txt'
))
if
settings
.
logs
.
trace_pjsip
:
self
.
pjsiptrace_file
=
LogFile
(
os
.
path
.
join
(
ApplicationData
.
directory
,
'logs'
,
'pjsip_trace.txt'
))
if
settings
.
logs
.
trace_notifications
:
self
.
notifications_file
=
LogFile
(
os
.
path
.
join
(
ApplicationData
.
directory
,
'logs'
,
'notifications_trace.txt'
))
self
.
_siptrace_start_time
=
datetime
.
now
()
self
.
_siptrace_packet_count
=
0
self
.
event_queue
.
start
()
def
stop
(
self
):
self
.
event_queue
.
stop
()
self
.
event_queue
.
join
()
self
.
siptrace_file
=
Null
self
.
msrptrace_file
=
Null
self
.
pjsiptrace_file
=
Null
self
.
notifications_file
=
Null
notification_center
=
NotificationCenter
()
notification_center
.
remove_observer
(
self
)
def
handle_notification
(
self
,
notification
):
self
.
event_queue
.
put
(
notification
)
def
_process_notification
(
self
,
notification
):
handler
=
getattr
(
self
,
'_NH_
%
s'
%
notification
.
name
,
Null
)
handler
(
notification
)
handler
=
getattr
(
self
,
'_LH_
%
s'
%
notification
.
name
,
Null
)
handler
(
notification
)
settings
=
SIPSimpleSettings
()
if
notification
.
name
not
in
(
'SIPEngineLog'
,
'SIPEngineSIPTrace'
)
and
settings
.
logs
.
trace_notifications
:
message
=
'Notification name=
%
s sender=
%
s data=
%
s'
%
(
notification
.
name
,
notification
.
sender
,
pformat
(
notification
.
data
))
try
:
self
.
notifications_file
.
write
(
'
%
s:
%
s
\n
'
%
(
datetime
.
now
(),
message
))
self
.
notifications_file
.
flush
()
except
Exception
:
pass
def
_NH_CFGSettingsObjectDidChange
(
self
,
notification
):
settings
=
SIPSimpleSettings
()
if
notification
.
sender
is
settings
:
if
'logs.trace_sip'
in
notification
.
data
.
modified
:
self
.
siptrace_file
=
LogFile
(
os
.
path
.
join
(
ApplicationData
.
directory
,
'logs'
,
'sip_trace.txt'
))
if
settings
.
logs
.
trace_sip
else
Null
elif
'logs.trace_msrp'
in
notification
.
data
.
modified
:
self
.
msrptrace_file
=
LogFile
(
os
.
path
.
join
(
ApplicationData
.
directory
,
'logs'
,
'msrp_trace.txt'
))
if
settings
.
logs
.
trace_msrp
else
Null
elif
'logs.trace_pjsip'
in
notification
.
data
.
modified
:
self
.
pjsiptrace_file
=
LogFile
(
os
.
path
.
join
(
ApplicationData
.
directory
,
'logs'
,
'pjsip_trace.txt'
))
if
settings
.
logs
.
trace_pjsip
else
Null
elif
'logs.trace_notifications'
in
notification
.
data
.
modified
:
self
.
notifications_file
=
LogFile
(
os
.
path
.
join
(
ApplicationData
.
directory
,
'logs'
,
'notifications_trace.txt'
))
if
settings
.
logs
.
trace_notifications
else
Null
def
_LH_SIPEngineSIPTrace
(
self
,
notification
):
settings
=
SIPSimpleSettings
()
if
not
settings
.
logs
.
trace_sip
:
return
self
.
_siptrace_packet_count
+=
1
if
notification
.
data
.
received
:
direction
=
"RECEIVED"
else
:
direction
=
"SENDING"
buf
=
[
"
%
s: Packet
%
d, +
%
s"
%
(
direction
,
self
.
_siptrace_packet_count
,
(
notification
.
data
.
timestamp
-
self
.
_siptrace_start_time
))]
buf
.
append
(
"
%(source_ip)
s:
%(source_port)
d -(SIP over
%(transport)
s)->
%(destination_ip)
s:
%(destination_port)
d"
%
notification
.
data
.
__dict__
)
buf
.
append
(
notification
.
data
.
data
)
buf
.
append
(
'--'
)
message
=
'
\n
'
.
join
(
buf
)
try
:
self
.
siptrace_file
.
write
(
'
%
s [
%
s
%
d]:
%
s
\n
'
%
(
notification
.
data
.
timestamp
,
os
.
path
.
basename
(
sys
.
argv
[
0
])
.
rstrip
(
'.py'
),
os
.
getpid
(),
message
))
self
.
siptrace_file
.
flush
()
except
Exception
:
pass
def
_LH_SIPEngineLog
(
self
,
notification
):
settings
=
SIPSimpleSettings
()
if
not
settings
.
logs
.
trace_pjsip
:
return
message
=
"(
%(level)
d)
%(sender)14
s:
%(message)
s"
%
notification
.
data
.
__dict__
try
:
self
.
pjsiptrace_file
.
write
(
'
%
s [
%
s
%
d]
%
s
\n
'
%
(
notification
.
data
.
timestamp
,
os
.
path
.
basename
(
sys
.
argv
[
0
])
.
rstrip
(
'.py'
),
os
.
getpid
(),
message
))
self
.
pjsiptrace_file
.
flush
()
except
Exception
:
pass
def
_LH_DNSLookupTrace
(
self
,
notification
):
settings
=
SIPSimpleSettings
()
if
not
settings
.
logs
.
trace_sip
:
return
message
=
'DNS lookup
%(query_type)
s
%(query_name)
s'
%
notification
.
data
.
__dict__
if
notification
.
data
.
error
is
None
:
message
+=
' succeeded, ttl=
%
d: '
%
notification
.
data
.
answer
.
ttl
if
notification
.
data
.
query_type
==
'A'
:
message
+=
", "
.
join
(
record
.
address
for
record
in
notification
.
data
.
answer
)
elif
notification
.
data
.
query_type
==
'SRV'
:
message
+=
", "
.
join
(
'
%
d
%
d
%
d
%
s'
%
(
record
.
priority
,
record
.
weight
,
record
.
port
,
record
.
target
)
for
record
in
notification
.
data
.
answer
)
elif
notification
.
data
.
query_type
==
'NAPTR'
:
message
+=
", "
.
join
(
'
%
d
%
d "
%
s" "
%
s" "
%
s"
%
s'
%
(
record
.
order
,
record
.
preference
,
record
.
flags
,
record
.
service
,
record
.
regexp
,
record
.
replacement
)
for
record
in
notification
.
data
.
answer
)
else
:
import
dns.resolver
message_map
=
{
dns
.
resolver
.
NXDOMAIN
:
'DNS record does not exist'
,
dns
.
resolver
.
NoAnswer
:
'DNS response contains no answer'
,
dns
.
resolver
.
NoNameservers
:
'no DNS name servers could be reached'
,
dns
.
resolver
.
Timeout
:
'no DNS response received, the query has timed out'
}
message
+=
' failed:
%
s'
%
message_map
.
get
(
notification
.
data
.
error
.
__class__
,
''
)
try
:
self
.
siptrace_file
.
write
(
'
%
s [
%
s
%
d]:
%
s
\n
'
%
(
notification
.
data
.
timestamp
,
os
.
path
.
basename
(
sys
.
argv
[
0
])
.
rstrip
(
'.py'
),
os
.
getpid
(),
message
))
self
.
siptrace_file
.
flush
()
except
Exception
:
pass
def
_LH_MSRPTransportTrace
(
self
,
notification
):
settings
=
SIPSimpleSettings
()
if
not
settings
.
logs
.
trace_msrp
:
return
arrow
=
{
'incoming'
:
'<--'
,
'outgoing'
:
'-->'
}[
notification
.
data
.
direction
]
local_address
=
notification
.
sender
.
getHost
()
local_address
=
'
%
s:
%
d'
%
(
local_address
.
host
,
local_address
.
port
)
remote_address
=
notification
.
sender
.
getPeer
()
remote_address
=
'
%
s:
%
d'
%
(
remote_address
.
host
,
remote_address
.
port
)
message
=
'
%
s
%
s
%
s
\n
'
%
(
local_address
,
arrow
,
remote_address
)
+
notification
.
data
.
data
try
:
self
.
msrptrace_file
.
write
(
'
%
s [
%
s
%
d]:
%
s
\n
'
%
(
notification
.
data
.
timestamp
,
os
.
path
.
basename
(
sys
.
argv
[
0
])
.
rstrip
(
'.py'
),
os
.
getpid
(),
message
))
self
.
msrptrace_file
.
flush
()
except
Exception
:
pass
def
_LH_MSRPLibraryLog
(
self
,
notification
):
settings
=
SIPSimpleSettings
()
if
not
settings
.
logs
.
trace_msrp
:
return
if
notification
.
data
.
level
<
self
.
msrp_level
:
return
message
=
'
%
s
%
s'
%
(
notification
.
data
.
level
.
prefix
,
notification
.
data
.
message
)
try
:
self
.
msrptrace_file
.
write
(
'
%
s [
%
s
%
d]:
%
s
\n
'
%
(
notification
.
data
.
timestamp
,
os
.
path
.
basename
(
sys
.
argv
[
0
])
.
rstrip
(
'.py'
),
os
.
getpid
(),
message
))
self
.
msrptrace_file
.
flush
()
except
Exception
:
pass
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment