Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
C
CCS
Manage
Activity
Members
Plan
Wiki
Code
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Deploy
Releases
Package registry
Model registry
Operate
Terraform modules
Analyze
Contributor analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Marko Mecina
CCS
Commits
38722561
Commit
38722561
authored
2 years ago
by
Marko Mecina
Browse files
Options
Downloads
Patches
Plain Diff
improve robustness of log_server
parent
95129e11
Branches
Branches containing commit
No related tags found
No related merge requests found
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
Ccs/DBus_Basic.py
+15
-12
15 additions, 12 deletions
Ccs/DBus_Basic.py
Ccs/log_server.py
+42
-46
42 additions, 46 deletions
Ccs/log_server.py
with
57 additions
and
58 deletions
Ccs/DBus_Basic.py
+
15
−
12
View file @
38722561
# This file is used to set up a D-Bus
import
dbus
import
dbus.service
import
ccs_function_lib
as
cfl
import
os
import
log_server
# STDOUT = '/dev/null'
STDOUT
=
'
/tmp/log_server.log
'
# Set up
two M
ethod
e
s to
ex
cess
over
a given dbus name
# Set up
m
ethods to
ac
cess
via
a given dbus name
class
MessageListener
(
dbus
.
service
.
Object
):
def
__init__
(
self
,
win
,
Bus_Name
,
*
args
):
project
=
None
...
...
@@ -22,7 +26,7 @@ class MessageListener(dbus.service.Object):
# Check if the Bus name already exists and increase the number if it does
counting
=
1
check
=
True
while
check
==
True
:
while
check
:
counting
+=
1
for
service
in
dbus
.
SessionBus
().
list_names
():
if
service
==
Bus_Name
:
...
...
@@ -37,9 +41,10 @@ class MessageListener(dbus.service.Object):
self
.
name
=
dbus
.
service
.
BusName
(
self
.
Bus_Name
,
bus
=
self
.
bus
)
super
().
__init__
(
self
.
name
,
'
/MessageListener
'
)
self
.
win
=
win
#### This will be a series of functions to let the user use more than one 'instance' of the CCS running on the
# This will be a series of functions to let the user use more than one 'instance' of the CCS running on the
# same machine,
# Variab
e
l project is the name of the group of application working together
# Variabl
e
project is the name of the group of application
s
working together
if
not
project
:
project
=
self
.
win
.
cfg
[
'
ccs-database
'
][
'
project
'
]
...
...
@@ -48,18 +53,16 @@ class MessageListener(dbus.service.Object):
# This exception is necessary for the Poolmanager since most of the time a GUI does not exist
try
:
self
.
win
.
set_title
(
str
(
project
)
+
'
:
'
+
str
(
self
.
win
.
get_title
())
+
'
'
+
str
(
counting
-
1
))
except
:
# Looks like a odd title name but is reshaped in pus_datapool.py
except
Exception
as
err
:
print
(
err
)
# Looks like an odd title name but is reshaped in pus_datapool.py
self
.
win
.
windowname
=
str
(
project
)
+
'
: @
'
+
str
(
counting
-
1
)
###
# Tell the terminal that a bus has been set up, this function has to exist in every file
self
.
win
.
connect_to_all
(
Bus_Name
,
counting
-
1
)
# Start the Logging TCP-Server, the check if it is already setup is in log_server.py
import
log_server
log_server_path
=
log_server
.
__file__
os
.
system
(
'
nohup python3
'
+
str
(
log_server_path
)
+
'
>/dev/null 2>&1 &
'
)
os
.
system
(
'
nohup python3 {} >{} 2>&1 &
'
.
format
(
log_server
.
__file__
,
STDOUT
))
# subprocess.Popen(['python3', log_server_path])
# Return all available methods
...
...
@@ -70,7 +73,7 @@ class MessageListener(dbus.service.Object):
for
method
in
method_list_former
:
if
method
.
startswith
(
'
__
'
):
pass
elif
argument
and
not
argument
in
method
:
elif
argument
and
argument
not
in
method
:
pass
else
:
method_list
.
append
(
method
)
...
...
This diff is collapsed.
Click to expand it.
Ccs/log_server.py
+
42
−
46
View file @
38722561
...
...
@@ -2,16 +2,21 @@ import pickle
import
logging
import
logging.handlers
import
socketserver
import
struct
import
datetime
import
dbus
import
dbus.service
import
time
import
select
import
os
from
os
import
listdir
from
os.path
import
isfile
,
join
import
confignator
cfg
=
confignator
.
get_config
()
SOCKET_TIMEOUT
=
0.5
SOCKET_RD_INTERVAL
=
0.5
LOGFMT
=
'
%(asctime)s: %(name)-15s %(levelname)-8s %(message)s
'
class
LogRecordStreamHandler
(
socketserver
.
StreamRequestHandler
):
...
...
@@ -30,17 +35,14 @@ class LogRecordStreamHandler(socketserver.StreamRequestHandler):
chunk
=
self
.
connection
.
recv
(
4
)
if
len
(
chunk
)
<
4
:
break
slen
=
struct
.
unpack
(
'
>L
'
,
chunk
)[
0
]
slen
=
int
.
from_bytes
(
chunk
,
'
big
'
)
chunk
=
self
.
connection
.
recv
(
slen
)
while
len
(
chunk
)
<
slen
:
chunk
=
chunk
+
self
.
connection
.
recv
(
slen
-
len
(
chunk
))
obj
=
self
.
unPickle
(
chunk
)
obj
=
pickle
.
loads
(
chunk
)
record
=
logging
.
makeLogRecord
(
obj
)
self
.
handleLogRecord
(
record
)
def
unPickle
(
self
,
data
):
return
pickle
.
loads
(
data
)
def
handleLogRecord
(
self
,
record
):
# if a name is specified, we use the named logger rather than the one
# implied by the record.
...
...
@@ -65,57 +67,40 @@ class LogRecordSocketReceiver(socketserver.ThreadingTCPServer):
def
__init__
(
self
,
host
=
'
localhost
'
,
port
=
logging
.
handlers
.
DEFAULT_TCP_LOGGING_PORT
,
handler
=
LogRecordStreamHandler
):
socketserver
.
ThreadingTCPServer
.
__init__
(
self
,
(
host
,
port
),
handler
)
self
.
abort
=
0
self
.
timeout
=
1
super
(
LogRecordSocketReceiver
,
self
).
__init__
((
host
,
port
),
handler
)
# socketserver.ThreadingTCPServer.__init__(self, (host, port), handler)
# self.abort = 0
self
.
timeout
=
SOCKET_TIMEOUT
self
.
logname
=
None
def
serve_until_stopped
(
self
,
cfg
):
import
select
# Check all dbus connections if any process is running, if not close the logging file
dbustype
=
dbus
.
SessionBus
()
while
True
:
dbus_names
=
cfg
[
'
ccs-dbus_names
'
]
closing
=
True
dbus_names
=
cfg
[
'
ccs-dbus_names
'
].
values
()
our_con
=
[]
for
service
in
dbus
.
SessionBus
().
list_names
():
if
service
.
startswith
(
'
com
'
):
our_con
.
append
(
service
)
for
app
in
our_con
:
if
app
[:
-
1
]
in
cfg
[
'
ccs-dbus_names
'
].
values
():
if
service
.
startswith
(
'
com
'
)
and
service
[:
-
1
]
in
dbus_names
:
closing
=
False
#for name in dbus_names:
# Bus_name = cfg.get('ccs-dbus_names', name)
# try:
# connection = dbustype.get_object(Bus_name, '/MessageListener')
# connection.LoggingCheck()
# except:
# closing += 1
# If anything is incomming call the handler and log it
rd
,
wr
,
ex
=
select
.
select
([
self
.
socket
.
fileno
()],
[],
[],
self
.
timeout
)
# If anything is incoming call the handler and log it
rd
,
wr
,
ex
=
select
.
select
([
self
.
socket
.
fileno
()],
[],
[],
self
.
timeout
)
if
rd
:
self
.
handle_request
()
abort
=
self
.
abort
# Close the file if there is no more dbus connection
if
closing
:
break
else
:
time
.
sleep
(
.
1
)
time
.
sleep
(
SOCKET_RD_INTERVAL
)
def
main
():
# Specify how the format of the Log-Filename is and where to save it
logname
=
'
%Y%m%d_%H%M%S
'
logpath
=
c
onfignator
.
get_option
(
'
ccs-paths
'
,
'
log-file-dir
'
)
logpath
=
c
fg
.
get
(
'
ccs-paths
'
,
'
log-file-dir
'
)
# Choose which time should be used for the title
tnow
=
datetime
.
datetime
.
now
# Use the local- Time for the log file title
...
...
@@ -124,18 +109,28 @@ def main():
# Get the time in the correct format
logtimestart
=
datetime
.
datetime
.
strftime
(
tnow
(),
logname
)
logfilename
=
os
.
path
.
join
(
logpath
,
logtimestart
+
'
.log
'
)
logfmt
=
LOGFMT
# Connect to the config file
cfg
=
confignator
.
get_config
(
file_path
=
confignator
.
get_option
(
'
config-files
'
,
'
ccs
'
))
logger
=
logging
.
getLogger
(
'
log_server
'
)
# Start the server
# If it is already running LogRecordSocketReciever() will give an error and the server is therefor not started again
try
:
tcpserver
=
LogRecordSocketReceiver
()
# set up the file logging
# logging.basicConfig(format='%(asctime)s: %(name)-15s %(levelname)-8s %(message)s', filename=logfilename)
fh
=
logging
.
FileHandler
(
filename
=
logfilename
)
fh
.
setFormatter
(
logging
.
Formatter
(
logfmt
))
rl
=
logging
.
getLogger
()
rl
.
addHandler
(
fh
)
rl
.
setLevel
(
getattr
(
logging
,
cfg
.
get
(
'
ccs-logging
'
,
'
level
'
).
upper
()))
# rl.setLevel(logging.INFO)
# Check how many log files should be kept and delete the rest
amount
=
cfg
.
get
(
'
ccs-logging
'
,
'
max_logs
'
)
if
amount
:
# If amount is empty keep an endless amount of logs
# If amount is empty keep an endless amount of logs
if
amount
:
while
True
:
onlyfiles
=
[
f
for
f
in
listdir
(
"
logs/
"
)
if
isfile
(
join
(
"
logs/
"
,
f
))]
onlyfiles
.
sort
()
...
...
@@ -144,20 +139,21 @@ def main():
else
:
break
# Give a format and filename configuration for logging
logging
.
basicConfig
(
format
=
'
%(asctime)s: %(name)-15s %(levelname)-8s %(message)s
'
,
filename
=
logfilename
)
# print('TCP-server for logging is started')
logger
.
info
(
'
TCP-server for logging started
'
)
tcpserver
.
serve_until_stopped
(
cfg
)
except
:
pass
logger
.
info
(
'
TCP-server for logging shutting down
'
)
# Catch exception if log_server is already running and address/port is already in use
except
OSError
:
logger
.
info
(
'
TCP-server for logging seems to be already running.
'
)
except
Exception
as
err
:
raise
err
class
Logging
()
:
class
Logging
:
# This sets up a logging client for the already running TCP-logging Server,
# The logger is returned with the given name an can be used like a normal logger
# The logger is returned with the given name an
d
can be used like a normal logger
def
start_logging
(
self
,
name
):
loglevel
=
confignator
.
get_option
(
'
logging
'
,
'
level
'
)
loglevel
=
confignator
.
get_option
(
'
ccs-
logging
'
,
'
level
'
)
rootLogger
=
logging
.
getLogger
(
''
)
rootLogger
.
setLevel
(
loglevel
)
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment