Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
H
hidra
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container Registry
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
steinbac
hidra
Commits
23bc4586
Commit
23bc4586
authored
9 years ago
by
Manuela Kuhn
Browse files
Options
Downloads
Patches
Plain Diff
Added different logger for each class in receiver
parent
d7e2d543
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
ZeroMQTunnel/receiver.py
+87
-70
87 additions, 70 deletions
ZeroMQTunnel/receiver.py
with
87 additions
and
70 deletions
ZeroMQTunnel/receiver.py
+
87
−
70
View file @
23bc4586
...
...
@@ -15,7 +15,6 @@ from stat import S_ISREG, ST_MTIME, ST_MODE
import
threading
class
FileReceiver
:
zmqContext
=
None
liveViewerZmqContext
=
None
...
...
@@ -30,6 +29,8 @@ class FileReceiver:
maxRingBufferSize
=
200
timeToWaitForRingBuffer
=
2
log
=
None
# sockets
zmqSocket
=
None
exchangeSocket
=
None
...
...
@@ -47,20 +48,23 @@ class FileReceiver:
self
.
zmqContext
=
context
or
zmq
.
Context
()
self
.
log
=
self
.
getLogger
()
self
.
log
.
debug
(
"
Init
"
)
# create pull socket
self
.
zmqSocket
=
self
.
zmqContext
.
socket
(
zmq
.
PULL
)
connectionStrZmqSocket
=
"
tcp://
"
+
self
.
zmqDataStreamIp
+
"
:%s
"
%
self
.
zmqDataStreamPort
self
.
zmqSocket
.
bind
(
connectionStrZmqSocket
)
loggin
g
.
debug
(
"
zmqSocket started for
'"
+
connectionStrZmqSocket
+
"'"
)
self
.
lo
g
.
debug
(
"
zmqSocket started for
'"
+
connectionStrZmqSocket
+
"'"
)
self
.
exchangeSocket
=
self
.
zmqContext
.
socket
(
zmq
.
PAIR
)
connectionStrExchangeSocket
=
"
tcp://
"
+
self
.
zmqLiveViewerExchangeIp
+
"
:%s
"
%
self
.
zmqLiveViewerExchangePort
self
.
exchangeSocket
.
bind
(
connectionStrExchangeSocket
)
loggin
g
.
debug
(
"
exchangeSocket started (bind) for
'"
+
connectionStrExchangeSocket
+
"'"
)
self
.
lo
g
.
debug
(
"
exchangeSocket started (bind) for
'"
+
connectionStrExchangeSocket
+
"'"
)
# thread to communicate with live viewer
self
.
liveViewerThread
=
threading
.
Thread
(
target
=
l
iveViewer
)
self
.
liveViewerThread
=
threading
.
Thread
(
target
=
L
iveViewer
)
self
.
liveViewerThread
.
start
()
# initialize ring buffer
...
...
@@ -78,19 +82,24 @@ class FileReceiver:
ringBuffer
=
sorted
(
ringBuffer
,
reverse
=
True
)
try
:
loggin
g
.
info
(
"
Start receiving new files
"
)
self
.
lo
g
.
info
(
"
Start receiving new files
"
)
self
.
startReceiving
()
loggin
g
.
info
(
"
Stopped receiving.
"
)
self
.
lo
g
.
info
(
"
Stopped receiving.
"
)
except
Exception
,
e
:
loggin
g
.
error
(
"
Unknown error while receiving files. Need to abort.
"
)
loggin
g
.
debug
(
"
Error was:
"
+
str
(
e
))
self
.
lo
g
.
error
(
"
Unknown error while receiving files. Need to abort.
"
)
self
.
lo
g
.
debug
(
"
Error was:
"
+
str
(
e
))
except
:
trace
=
traceback
.
format_exc
()
loggin
g
.
info
(
"
Unkown error state. Shutting down...
"
)
loggin
g
.
debug
(
"
Error was:
"
+
str
(
trace
))
self
.
lo
g
.
info
(
"
Unkown error state. Shutting down...
"
)
self
.
lo
g
.
debug
(
"
Error was:
"
+
str
(
trace
))
self
.
zmqContext
.
destroy
()
logging
.
info
(
"
Quitting.
"
)
self
.
log
.
info
(
"
Quitting.
"
)
def
getLogger
(
self
):
logger
=
logging
.
getLogger
(
"
fileReceiver
"
)
return
logger
def
addFileToRingBuffer
(
self
,
filename
,
fileModTime
):
...
...
@@ -117,43 +126,40 @@ class FileReceiver:
#TODO is string conversion needed here?
payloadMetadata
=
str
(
multipartMessage
[
0
])
except
:
loggin
g
.
error
(
"
an empty config was transferred for multipartMessage
"
)
self
.
lo
g
.
error
(
"
an empty config was transferred for multipartMessage
"
)
#TODO validate multipartMessage (like correct dict-values for metadata)
loggin
g
.
debug
(
"
multipartMessage.metadata =
"
+
str
(
payloadMetadata
))
self
.
lo
g
.
debug
(
"
multipartMessage.metadata =
"
+
str
(
payloadMetadata
))
#extraction metadata from multipart-message
payloadMetadataDict
=
json
.
loads
(
payloadMetadata
)
#append to file
try
:
loggin
g
.
debug
(
"
append to file based on multipart-message...
"
)
self
.
lo
g
.
debug
(
"
append to file based on multipart-message...
"
)
#TODO: save message to file using a thread (avoids blocking)
#TODO: instead of open/close file for each chunk recyle the file-descriptor for all chunks opened
self
.
appendChunksToFileFromMultipartMessage
(
payloadMetadataDict
,
multipartMessage
)
loggin
g
.
debug
(
"
append to file based on multipart-message...success.
"
)
self
.
lo
g
.
debug
(
"
append to file based on multipart-message...success.
"
)
except
Exception
,
e
:
errorMessage
=
"
Unable to append multipart-content to file.
"
loggin
g
.
error
(
errorMessage
)
loggin
g
.
debug
(
"
Error was:
"
+
str
(
e
))
loggin
g
.
debug
(
"
append to file based on multipart-message...failed.
"
)
self
.
lo
g
.
error
(
errorMessage
)
self
.
lo
g
.
debug
(
"
Error was:
"
+
str
(
e
))
self
.
lo
g
.
debug
(
"
append to file based on multipart-message...failed.
"
)
except
:
errorMessage
=
"
Unable to append multipart-content to file. Unknown Error.
"
loggin
g
.
error
(
errorMessage
)
loggin
g
.
debug
(
"
append to file based on multipart-message...failed.
"
)
self
.
lo
g
.
error
(
errorMessage
)
self
.
lo
g
.
debug
(
"
append to file based on multipart-message...failed.
"
)
if
len
(
multipartMessage
[
1
])
<
payloadMetadataDict
[
"
chunkSize
"
]
:
#indicated end of file. closing file and leave loop
loggin
g
.
debug
(
"
last file-chunk received. stop appending.
"
)
self
.
lo
g
.
debug
(
"
last file-chunk received. stop appending.
"
)
break
filename
=
self
.
generateTargetFilepath
(
payloadMetadataDict
)
fileModTime
=
payloadMetadataDict
[
"
fileModificationTime
"
]
logging
.
info
(
"
New file with modification time
"
+
str
(
fileModTime
)
+
"
received and saved:
"
+
str
(
filename
))
# logging.debug("message-type : " + str(type(multipartMessage)))
# logging.debug("message-length: " + str(len(multipartMessage)))
self
.
log
.
info
(
"
New file with modification time
"
+
str
(
fileModTime
)
+
"
received and saved:
"
+
str
(
filename
))
# add to ring buffer
loggin
g
.
debug
(
"
add file to ring buffer:
"
+
str
(
filename
)
+
"
,
"
+
str
(
fileModTime
))
self
.
lo
g
.
debug
(
"
add file to ring buffer:
"
+
str
(
filename
)
+
"
,
"
+
str
(
fileModTime
))
self
.
addFileToRingBuffer
(
str
(
filename
),
fileModTime
)
...
...
@@ -163,26 +169,26 @@ class FileReceiver:
continueStreaming
=
True
loopCounter
=
0
#counter of total received messages
continueReceiving
=
True
#receiving will stop if value gets False
loggin
g
.
debug
(
"
Waiting for new messages...
"
)
self
.
lo
g
.
debug
(
"
Waiting for new messages...
"
)
while
continueReceiving
:
try
:
self
.
combineMessage
(
self
.
zmqSocket
)
loopCounter
+=
1
except
KeyboardInterrupt
:
loggin
g
.
debug
(
"
Keyboard interrupt detected. Stop receiving.
"
)
self
.
lo
g
.
debug
(
"
Keyboard interrupt detected. Stop receiving.
"
)
break
except
:
loggin
g
.
error
(
"
receive message...failed.
"
)
loggin
g
.
error
(
sys
.
exc_info
())
self
.
lo
g
.
error
(
"
receive message...failed.
"
)
self
.
lo
g
.
error
(
sys
.
exc_info
())
continueReceiving
=
False
loggin
g
.
info
(
"
shutting down receiver...
"
)
self
.
lo
g
.
info
(
"
shutting down receiver...
"
)
try
:
self
.
stopReceiving
(
self
.
zmqSocket
,
self
.
zmqContext
)
loggin
g
.
debug
(
"
shutting down receiver...done.
"
)
self
.
lo
g
.
debug
(
"
shutting down receiver...done.
"
)
except
:
loggin
g
.
error
(
sys
.
exc_info
())
loggin
g
.
error
(
"
shutting down receiver...failed.
"
)
self
.
lo
g
.
error
(
sys
.
exc_info
())
self
.
lo
g
.
error
(
"
shutting down receiver...failed.
"
)
def
generateTargetFilepath
(
self
,
configDict
):
...
...
@@ -226,13 +232,13 @@ class FileReceiver:
chunkCount
=
len
(
multipartMessage
)
-
1
#-1 as the first element keeps the dictionary/metadata
payload
=
multipartMessage
[
1
:]
except
:
loggin
g
.
warning
(
"
an empty file was received within the multipart-message
"
)
self
.
lo
g
.
warning
(
"
an empty file was received within the multipart-message
"
)
payload
=
None
#generate target filepath
targetFilepath
=
self
.
generateTargetFilepath
(
configDict
)
loggin
g
.
debug
(
"
new file is going to be created at:
"
+
targetFilepath
)
self
.
lo
g
.
debug
(
"
new file is going to be created at:
"
+
targetFilepath
)
#append payload to file
...
...
@@ -246,18 +252,18 @@ class FileReceiver:
targetPath
=
self
.
generateTargetPath
(
configDict
)
os
.
makedirs
(
targetPath
)
newFile
=
open
(
targetFilepath
,
"
w
"
)
loggin
g
.
info
(
"
New target directory created:
"
+
str
(
targetPath
))
self
.
lo
g
.
info
(
"
New target directory created:
"
+
str
(
targetPath
))
except
Exception
,
f
:
errorMessage
=
"
unable to save payload to file:
'"
+
targetFilepath
+
"'"
loggin
g
.
error
(
errorMessage
)
loggin
g
.
debug
(
"
Error was:
"
+
str
(
f
))
loggin
g
.
debug
(
"
targetPath=
"
+
str
(
targetPath
))
self
.
lo
g
.
error
(
errorMessage
)
self
.
lo
g
.
debug
(
"
Error was:
"
+
str
(
f
))
self
.
lo
g
.
debug
(
"
targetPath=
"
+
str
(
targetPath
))
raise
Exception
(
errorMessage
)
except
Exception
,
e
:
loggin
g
.
error
(
"
failed to append payload to file:
'"
+
targetFilepath
+
"'"
)
loggin
g
.
debug
(
"
Error was:
"
+
str
(
e
))
loggin
g
.
debug
(
"
ErrorTyp:
"
+
str
(
type
(
e
)))
loggin
g
.
debug
(
"
e.errno =
"
+
str
(
e
.
errno
)
+
"
errno.EEXIST==
"
+
str
(
errno
.
EEXIST
))
self
.
lo
g
.
error
(
"
failed to append payload to file:
'"
+
targetFilepath
+
"'"
)
self
.
lo
g
.
debug
(
"
Error was:
"
+
str
(
e
))
self
.
lo
g
.
debug
(
"
ErrorTyp:
"
+
str
(
type
(
e
)))
self
.
lo
g
.
debug
(
"
e.errno =
"
+
str
(
e
.
errno
)
+
"
errno.EEXIST==
"
+
str
(
errno
.
EEXIST
))
#only write data if a payload exist
try
:
if
payload
!=
None
:
...
...
@@ -266,47 +272,49 @@ class FileReceiver:
newFile
.
close
()
except
Exception
,
e
:
errorMessage
=
"
unable to append data to file.
"
loggin
g
.
error
(
errorMessage
)
loggin
g
.
debug
(
"
Error was:
"
+
str
(
e
))
self
.
lo
g
.
error
(
errorMessage
)
self
.
lo
g
.
debug
(
"
Error was:
"
+
str
(
e
))
raise
Exception
(
errorMessage
)
def
stopReceiving
(
self
,
zmqSocket
,
zmqContext
):
loggin
g
.
debug
(
"
stopReceiving...
"
)
self
.
lo
g
.
debug
(
"
stopReceiving...
"
)
try
:
zmqSocket
.
close
()
loggin
g
.
debug
(
"
closing zmqSocket...done.
"
)
self
.
lo
g
.
debug
(
"
closing zmqSocket...done.
"
)
except
:
loggin
g
.
error
(
"
closing zmqSocket...failed.
"
)
loggin
g
.
error
(
sys
.
exc_info
())
self
.
lo
g
.
error
(
"
closing zmqSocket...failed.
"
)
self
.
lo
g
.
error
(
sys
.
exc_info
())
loggin
g
.
debug
(
"
sending exit signal to thread...
"
)
self
.
lo
g
.
debug
(
"
sending exit signal to thread...
"
)
self
.
exchangeSocket
.
send
(
"
Exit
"
)
time
.
sleep
(
0.1
)
self
.
exchangeSocket
.
close
()
loggin
g
.
debug
(
"
sending exit signal to thread...done
"
)
self
.
lo
g
.
debug
(
"
sending exit signal to thread...done
"
)
try
:
zmqContext
.
destroy
()
loggin
g
.
debug
(
"
closing zmqContext...done.
"
)
self
.
lo
g
.
debug
(
"
closing zmqContext...done.
"
)
except
:
loggin
g
.
error
(
"
closing zmqContext...failed.
"
)
loggin
g
.
error
(
sys
.
exc_info
())
self
.
lo
g
.
error
(
"
closing zmqContext...failed.
"
)
self
.
lo
g
.
error
(
sys
.
exc_info
())
class
liveViewer
():
zmqContext
=
None
liveViewerIp
=
None
liveViewerPort
=
None
exchangeIp
=
"
127.0.0.1
"
exchangePort
=
"
6072
"
class
LiveViewer
():
zmqContext
=
None
liveViewerIp
=
None
liveViewerPort
=
None
exchangeIp
=
"
127.0.0.1
"
exchangePort
=
"
6072
"
log
=
None
# sockets
liveViewerSocket
=
None
exchangeSocket
=
None
liveViewerSocket
=
None
exchangeSocket
=
None
poller
=
None
poller
=
None
def
__init__
(
self
,
liveViewerIp
=
"
127.0.0.1
"
,
liveViewerPort
=
"
6071
"
,
context
=
None
):
...
...
@@ -318,17 +326,20 @@ class liveViewer():
self
.
zmqContext
=
context
or
zmq
.
Context
()
self
.
log
=
self
.
getLogger
()
self
.
log
.
debug
(
"
Init
"
)
# create socket for live viewer
self
.
liveViewerSocket
=
self
.
zmqContext
.
socket
(
zmq
.
REP
)
connectionStrLiveViewerSocket
=
"
tcp://
"
+
self
.
liveViewerIp
+
"
:%s
"
%
self
.
liveViewerPort
self
.
liveViewerSocket
.
bind
(
connectionStrLiveViewerSocket
)
loggin
g
.
debug
(
"
zmqLiveViewerSocket started for
'"
+
connectionStrLiveViewerSocket
+
"'"
)
self
.
lo
g
.
debug
(
"
zmqLiveViewerSocket started for
'"
+
connectionStrLiveViewerSocket
+
"'"
)
# create socket for message exchange
self
.
exchangeSocket
=
self
.
zmqContext
.
socket
(
zmq
.
PAIR
)
connectionStrExchangeSocket
=
"
tcp://
"
+
self
.
exchangeIp
+
"
:%s
"
%
self
.
exchangePort
self
.
exchangeSocket
.
connect
(
connectionStrExchangeSocket
)
loggin
g
.
debug
(
"
exchangeSocket started (connect) for
'"
+
connectionStrExchangeSocket
+
"'"
)
self
.
lo
g
.
debug
(
"
exchangeSocket started (connect) for
'"
+
connectionStrExchangeSocket
+
"'"
)
self
.
poller
=
zmq
.
Poller
()
self
.
poller
.
register
(
self
.
liveViewerSocket
,
zmq
.
POLLIN
)
...
...
@@ -337,6 +348,11 @@ class liveViewer():
self
.
sendFileToLiveViewer
()
def
getLogger
(
self
):
logger
=
logging
.
getLogger
(
"
liveViewer
"
)
return
logger
def
sendFileToLiveViewer
(
self
):
should_continue
=
True
...
...
@@ -344,15 +360,15 @@ class liveViewer():
socks
=
dict
(
self
.
poller
.
poll
())
if
self
.
exchangeSocket
in
socks
and
socks
[
self
.
exchangeSocket
]
==
zmq
.
POLLIN
:
message
=
self
.
exchangeSocket
.
recv
()
loggin
g
.
debug
(
"
Recieved control command: %s
"
%
message
)
self
.
lo
g
.
debug
(
"
Recieved control command: %s
"
%
message
)
if
message
==
"
Exit
"
:
loggin
g
.
debug
(
"
Recieved exit command, liveViewer thread will stop recieving messages
"
)
self
.
lo
g
.
debug
(
"
Recieved exit command, liveViewer thread will stop recieving messages
"
)
should_continue
=
False
break
if
self
.
liveViewerSocket
in
socks
and
socks
[
self
.
liveViewerSocket
]
==
zmq
.
POLLIN
:
message
=
self
.
liveViewerSocket
.
recv
()
loggin
g
.
debug
(
"
Call for next file...
"
)
self
.
lo
g
.
debug
(
"
Call for next file...
"
)
# send first element in ring buffer to live viewer (the path of this file is the second entry)
if
self
.
ringBuffer
:
answer
=
self
.
ringBuffer
[
0
][
1
]
...
...
@@ -365,7 +381,7 @@ class liveViewer():
except
zmq
.
error
.
ContextTerminated
:
break
loggin
g
.
debug
(
"
LiveViewerThread: closing socket
"
)
self
.
lo
g
.
debug
(
"
LiveViewerThread: closing socket
"
)
self
.
liveViewerSocket
.
close
()
self
.
exchangeSocket
.
close
()
...
...
@@ -412,6 +428,7 @@ def initLogging(filenameFullPath, verbose):
console
.
setLevel
(
logging
.
WARNING
)
formatter
=
logging
.
Formatter
(
"
%(asctime)s > %(message)s
"
)
console
.
setFormatter
(
formatter
)
logging
.
getLogger
(
""
).
addHandler
(
console
)
...
...
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