11 Commits

Author SHA1 Message Date
Tobias Kurze
419056bf03 using python 3.6 (as requirement as well on production) 2020-03-12 11:38:19 +01:00
tobias.kurze
26251ed8e7 Add README.md 2020-03-12 11:28:39 +01:00
f181e4a785 further advanced state api and stream checks 2020-02-25 17:00:01 +01:00
1d011af64b added state api 2020-02-24 16:00:41 +01:00
6ba38cd42d removed flask-restplus and replaced with flask-restx 2020-02-24 09:26:47 +01:00
1745f56ac7 added stream sanity checks (sound, singe color) 2020-02-21 17:10:14 +01:00
Tobias Kurze
6971b4b618 added stream checks 2020-02-21 07:22:26 +01:00
bb4db25dcd code to call recorder functions from frointend 2019-12-12 18:44:07 +01:00
Tobias Kurze
da200f95b8 working websocket communication for recorder states 2019-12-11 08:31:42 +01:00
Tobias Kurze
190f728eb7 changed a lot regarding rec state, etc. 2019-12-03 16:05:02 +01:00
a709dbcaef added permissions api and websocket stuff 2019-11-28 19:39:53 +01:00
51 changed files with 2653 additions and 5452 deletions

View File

@@ -1,15 +1,14 @@
[tool.poetry] [[source]]
name = "lrc-backend" url = "https://pypi.org/simple"
version = "0.1.0" verify_ssl = true
description = "" name = "pypi"
authors = ["Tobias Kurze <it@t-kurze.de>"]
readme = "README.md"
[tool.poetry.dependencies] [packages]
python = "^3.11" ffmpeg-python = "*"
flask = "*" flask = "*"
flask-httpauth = "*" flask-httpauth = "*"
flask-sqlalchemy = "*" flask-sqlalchemy = "*"
flask-login = "*"
pyjwt = "*" pyjwt = "*"
passlib = "*" passlib = "*"
sqlalchemy = "*" sqlalchemy = "*"
@@ -32,10 +31,16 @@ ics = "*"
coloredlogs = "*" coloredlogs = "*"
pythonping = "*" pythonping = "*"
scapy = "*" scapy = "*"
flask-login = "^0.6.2" python-socketio = {version = "*",extras = ["client"]}
werkzeug = "2.*" socketio-client = "*"
flask-restx = "^1.1.0" websocket-client = "*"
apscheduler = "*"
pillow = "*"
pydub = "*"
simpleaudio = "*"
flask-restx = "*"
[build-system] [dev-packages]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api" [requires]
python_version = "3.6"

846
Pipfile.lock generated Normal file
View File

@@ -0,0 +1,846 @@
{
"_meta": {
"hash": {
"sha256": "ed9faf5db1ecd9f6524b4e3903b2d2e3cfedff03a928c6921dd799bb1e4ed90b"
},
"pipfile-spec": 6,
"requires": {
"python_version": "3.6"
},
"sources": [
{
"name": "pypi",
"url": "https://pypi.org/simple",
"verify_ssl": true
}
]
},
"default": {
"alembic": {
"hashes": [
"sha256:791a5686953c4b366d3228c5377196db2f534475bb38d26f70eb69668efd9028"
],
"version": "==1.4.1"
},
"aniso8601": {
"hashes": [
"sha256:529dcb1f5f26ee0df6c0a1ee84b7b27197c3c50fc3a6321d66c544689237d072",
"sha256:c033f63d028b9a58e3ab0c2c7d0532ab4bfa7452bfc788fbfe3ddabd327b181a"
],
"version": "==8.0.0"
},
"apscheduler": {
"hashes": [
"sha256:3bb5229eed6fbbdafc13ce962712ae66e175aa214c69bed35a06bffcf0c5e244",
"sha256:e8b1ecdb4c7cb2818913f766d5898183c7cb8936680710a4d3a966e02262e526"
],
"index": "pypi",
"version": "==3.6.3"
},
"arrow": {
"hashes": [
"sha256:4bfacea734ead51495dc47df00421ecfd4ca1f2c0fbe58b9a26eaeddedc31caf",
"sha256:67f8be7c0cf420424bc62d8d7dc40b44e4bb2f7b515f9cc2954fb36e35797656"
],
"version": "==0.14.7"
},
"attrs": {
"hashes": [
"sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c",
"sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72"
],
"version": "==19.3.0"
},
"beaker": {
"hashes": [
"sha256:ad5d1c05027ee3be3a482ea39f8cb70339b41e5d6ace0cb861382754076d187e"
],
"version": "==1.11.0"
},
"beautifulsoup4": {
"hashes": [
"sha256:05fd825eb01c290877657a56df4c6e4c311b3965bda790c613a3d6fb01a5462a",
"sha256:9fbb4d6e48ecd30bcacc5b63b94088192dcda178513b2ae3c394229f8911b887",
"sha256:e1505eeed31b0f4ce2dbb3bc8eb256c04cc2b3b72af7d551a4ab6efd5cbe5dae"
],
"index": "pypi",
"version": "==4.8.2"
},
"certifi": {
"hashes": [
"sha256:017c25db2a153ce562900032d5bc68e9f191e44e9a0f762f373977de9df1fbb3",
"sha256:25b64c7da4cd7479594d035c08c2d809eb4aab3a26e5a990ea98cc450c320f1f"
],
"version": "==2019.11.28"
},
"cffi": {
"hashes": [
"sha256:001bf3242a1bb04d985d63e138230802c6c8d4db3668fb545fb5005ddf5bb5ff",
"sha256:00789914be39dffba161cfc5be31b55775de5ba2235fe49aa28c148236c4e06b",
"sha256:028a579fc9aed3af38f4892bdcc7390508adabc30c6af4a6e4f611b0c680e6ac",
"sha256:14491a910663bf9f13ddf2bc8f60562d6bc5315c1f09c704937ef17293fb85b0",
"sha256:1cae98a7054b5c9391eb3249b86e0e99ab1e02bb0cc0575da191aedadbdf4384",
"sha256:2089ed025da3919d2e75a4d963d008330c96751127dd6f73c8dc0c65041b4c26",
"sha256:2d384f4a127a15ba701207f7639d94106693b6cd64173d6c8988e2c25f3ac2b6",
"sha256:337d448e5a725bba2d8293c48d9353fc68d0e9e4088d62a9571def317797522b",
"sha256:399aed636c7d3749bbed55bc907c3288cb43c65c4389964ad5ff849b6370603e",
"sha256:3b911c2dbd4f423b4c4fcca138cadde747abdb20d196c4a48708b8a2d32b16dd",
"sha256:3d311bcc4a41408cf5854f06ef2c5cab88f9fded37a3b95936c9879c1640d4c2",
"sha256:62ae9af2d069ea2698bf536dcfe1e4eed9090211dbaafeeedf5cb6c41b352f66",
"sha256:66e41db66b47d0d8672d8ed2708ba91b2f2524ece3dee48b5dfb36be8c2f21dc",
"sha256:675686925a9fb403edba0114db74e741d8181683dcf216be697d208857e04ca8",
"sha256:7e63cbcf2429a8dbfe48dcc2322d5f2220b77b2e17b7ba023d6166d84655da55",
"sha256:8a6c688fefb4e1cd56feb6c511984a6c4f7ec7d2a1ff31a10254f3c817054ae4",
"sha256:8c0ffc886aea5df6a1762d0019e9cb05f825d0eec1f520c51be9d198701daee5",
"sha256:95cd16d3dee553f882540c1ffe331d085c9e629499ceadfbda4d4fde635f4b7d",
"sha256:99f748a7e71ff382613b4e1acc0ac83bf7ad167fb3802e35e90d9763daba4d78",
"sha256:b8c78301cefcf5fd914aad35d3c04c2b21ce8629b5e4f4e45ae6812e461910fa",
"sha256:c420917b188a5582a56d8b93bdd8e0f6eca08c84ff623a4c16e809152cd35793",
"sha256:c43866529f2f06fe0edc6246eb4faa34f03fe88b64a0a9a942561c8e22f4b71f",
"sha256:cab50b8c2250b46fe738c77dbd25ce017d5e6fb35d3407606e7a4180656a5a6a",
"sha256:cef128cb4d5e0b3493f058f10ce32365972c554572ff821e175dbc6f8ff6924f",
"sha256:cf16e3cf6c0a5fdd9bc10c21687e19d29ad1fe863372b5543deaec1039581a30",
"sha256:e56c744aa6ff427a607763346e4170629caf7e48ead6921745986db3692f987f",
"sha256:e577934fc5f8779c554639376beeaa5657d54349096ef24abe8c74c5d9c117c3",
"sha256:f2b0fa0c01d8a0c7483afd9f31d7ecf2d71760ca24499c8697aeb5ca37dc090c"
],
"version": "==1.14.0"
},
"chardet": {
"hashes": [
"sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae",
"sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"
],
"version": "==3.0.4"
},
"click": {
"hashes": [
"sha256:8a18b4ea89d8820c5d0c7da8a64b2c324b4dabb695804dbfea19b9be9d88c0cc",
"sha256:e345d143d80bf5ee7534056164e5e112ea5e22716bbb1ce727941f4c8b471b9a"
],
"version": "==7.1.1"
},
"coloredlogs": {
"hashes": [
"sha256:346f58aad6afd48444c2468618623638dadab76e4e70d5e10822676f2d32226a",
"sha256:a1fab193d2053aa6c0a97608c4342d031f1f93a3d1218432c59322441d31a505"
],
"index": "pypi",
"version": "==14.0"
},
"coverage": {
"hashes": [
"sha256:15cf13a6896048d6d947bf7d222f36e4809ab926894beb748fc9caa14605d9c3",
"sha256:1daa3eceed220f9fdb80d5ff950dd95112cd27f70d004c7918ca6dfc6c47054c",
"sha256:1e44a022500d944d42f94df76727ba3fc0a5c0b672c358b61067abb88caee7a0",
"sha256:25dbf1110d70bab68a74b4b9d74f30e99b177cde3388e07cc7272f2168bd1477",
"sha256:3230d1003eec018ad4a472d254991e34241e0bbd513e97a29727c7c2f637bd2a",
"sha256:3dbb72eaeea5763676a1a1efd9b427a048c97c39ed92e13336e726117d0b72bf",
"sha256:5012d3b8d5a500834783689a5d2292fe06ec75dc86ee1ccdad04b6f5bf231691",
"sha256:51bc7710b13a2ae0c726f69756cf7ffd4362f4ac36546e243136187cfcc8aa73",
"sha256:527b4f316e6bf7755082a783726da20671a0cc388b786a64417780b90565b987",
"sha256:722e4557c8039aad9592c6a4213db75da08c2cd9945320220634f637251c3894",
"sha256:76e2057e8ffba5472fd28a3a010431fd9e928885ff480cb278877c6e9943cc2e",
"sha256:77afca04240c40450c331fa796b3eab6f1e15c5ecf8bf2b8bee9706cd5452fef",
"sha256:7afad9835e7a651d3551eab18cbc0fdb888f0a6136169fbef0662d9cdc9987cf",
"sha256:9bea19ac2f08672636350f203db89382121c9c2ade85d945953ef3c8cf9d2a68",
"sha256:a8b8ac7876bc3598e43e2603f772d2353d9931709345ad6c1149009fd1bc81b8",
"sha256:b0840b45187699affd4c6588286d429cd79a99d509fe3de0f209594669bb0954",
"sha256:b26aaf69713e5674efbde4d728fb7124e429c9466aeaf5f4a7e9e699b12c9fe2",
"sha256:b63dd43f455ba878e5e9f80ba4f748c0a2156dde6e0e6e690310e24d6e8caf40",
"sha256:be18f4ae5a9e46edae3f329de2191747966a34a3d93046dbdf897319923923bc",
"sha256:c312e57847db2526bc92b9bfa78266bfbaabac3fdcd751df4d062cd4c23e46dc",
"sha256:c60097190fe9dc2b329a0eb03393e2e0829156a589bd732e70794c0dd804258e",
"sha256:c62a2143e1313944bf4a5ab34fd3b4be15367a02e9478b0ce800cb510e3bbb9d",
"sha256:cc1109f54a14d940b8512ee9f1c3975c181bbb200306c6d8b87d93376538782f",
"sha256:cd60f507c125ac0ad83f05803063bed27e50fa903b9c2cfee3f8a6867ca600fc",
"sha256:d513cc3db248e566e07a0da99c230aca3556d9b09ed02f420664e2da97eac301",
"sha256:d649dc0bcace6fcdb446ae02b98798a856593b19b637c1b9af8edadf2b150bea",
"sha256:d7008a6796095a79544f4da1ee49418901961c97ca9e9d44904205ff7d6aa8cb",
"sha256:da93027835164b8223e8e5af2cf902a4c80ed93cb0909417234f4a9df3bcd9af",
"sha256:e69215621707119c6baf99bda014a45b999d37602cb7043d943c76a59b05bf52",
"sha256:ea9525e0fef2de9208250d6c5aeeee0138921057cd67fcef90fbed49c4d62d37",
"sha256:fca1669d464f0c9831fd10be2eef6b86f5ebd76c724d1e0706ebdff86bb4adf0"
],
"index": "pypi",
"version": "==5.0.3"
},
"cryptography": {
"hashes": [
"sha256:02079a6addc7b5140ba0825f542c0869ff4df9a69c360e339ecead5baefa843c",
"sha256:1df22371fbf2004c6f64e927668734070a8953362cd8370ddd336774d6743595",
"sha256:369d2346db5934345787451504853ad9d342d7f721ae82d098083e1f49a582ad",
"sha256:3cda1f0ed8747339bbdf71b9f38ca74c7b592f24f65cdb3ab3765e4b02871651",
"sha256:44ff04138935882fef7c686878e1c8fd80a723161ad6a98da31e14b7553170c2",
"sha256:4b1030728872c59687badcca1e225a9103440e467c17d6d1730ab3d2d64bfeff",
"sha256:58363dbd966afb4f89b3b11dfb8ff200058fbc3b947507675c19ceb46104b48d",
"sha256:6ec280fb24d27e3d97aa731e16207d58bd8ae94ef6eab97249a2afe4ba643d42",
"sha256:7270a6c29199adc1297776937a05b59720e8a782531f1f122f2eb8467f9aab4d",
"sha256:73fd30c57fa2d0a1d7a49c561c40c2f79c7d6c374cc7750e9ac7c99176f6428e",
"sha256:7f09806ed4fbea8f51585231ba742b58cbcfbfe823ea197d8c89a5e433c7e912",
"sha256:90df0cc93e1f8d2fba8365fb59a858f51a11a394d64dbf3ef844f783844cc793",
"sha256:971221ed40f058f5662a604bd1ae6e4521d84e6cad0b7b170564cc34169c8f13",
"sha256:a518c153a2b5ed6b8cc03f7ae79d5ffad7315ad4569b2d5333a13c38d64bd8d7",
"sha256:b0de590a8b0979649ebeef8bb9f54394d3a41f66c5584fff4220901739b6b2f0",
"sha256:b43f53f29816ba1db8525f006fa6f49292e9b029554b3eb56a189a70f2a40879",
"sha256:d31402aad60ed889c7e57934a03477b572a03af7794fa8fb1780f21ea8f6551f",
"sha256:de96157ec73458a7f14e3d26f17f8128c959084931e8997b9e655a39c8fde9f9",
"sha256:df6b4dca2e11865e6cfbfb708e800efb18370f5a46fd601d3755bc7f85b3a8a2",
"sha256:ecadccc7ba52193963c0475ac9f6fa28ac01e01349a2ca48509667ef41ffd2cf",
"sha256:fb81c17e0ebe3358486cd8cc3ad78adbae58af12fc2bf2bc0bb84e8090fa5ce8"
],
"version": "==2.8"
},
"decorator": {
"hashes": [
"sha256:41fa54c2a0cc4ba648be4fd43cff00aedf5b9465c9bf18d64325bc225f08f760",
"sha256:e3a62f0520172440ca0dcc823749319382e377f37f140a0b99ef45fecb84bfe7"
],
"version": "==4.4.2"
},
"defusedxml": {
"hashes": [
"sha256:6687150770438374ab581bb7a1b327a847dd9c5749e396102de3fad4e8a3ef93",
"sha256:f684034d135af4c6cbb949b8a4d2ed61634515257a67299e5f940fbaa34377f5"
],
"version": "==0.6.0"
},
"dnspython": {
"hashes": [
"sha256:36c5e8e38d4369a08b6780b7f27d790a292b2b08eea01607865bf0936c558e01",
"sha256:f69c21288a962f4da86e56c4905b49d11aba7938d3d740e80d9e366ee4f1632d"
],
"version": "==1.16.0"
},
"ecdsa": {
"hashes": [
"sha256:867ec9cf6df0b03addc8ef66b56359643cb5d0c1dc329df76ba7ecfe256c8061",
"sha256:8f12ac317f8a1318efa75757ef0a651abe12e51fc1af8838fb91079445227277"
],
"version": "==0.15"
},
"eventlet": {
"hashes": [
"sha256:658b1cd80937adc1a4860de2841e0528f64e2ca672885c4e00fc0e2217bde6b1",
"sha256:6c9c625af48424c4680d89314dbe45a76cc990cf002489f9469ff214b044ffc1"
],
"index": "pypi",
"version": "==0.25.1"
},
"ffmpeg-python": {
"hashes": [
"sha256:65225db34627c578ef0e11c8b1eb528bb35e024752f6f10b78c011f6f64c4127",
"sha256:ac441a0404e053f8b6a1113a77c0f452f1cfc62f6344a769475ffdc0f56c23c5"
],
"index": "pypi",
"version": "==0.2.0"
},
"flask": {
"hashes": [
"sha256:13f9f196f330c7c2c5d7a5cf91af894110ca0215ac051b5844701f2bfd934d52",
"sha256:45eb5a6fd193d6cf7e0cf5d8a5b31f83d5faae0293695626f539a823e93b13f6"
],
"index": "pypi",
"version": "==1.1.1"
},
"flask-cors": {
"hashes": [
"sha256:72170423eb4612f0847318afff8c247b38bd516b7737adfc10d1c2cdbb382d16",
"sha256:f4d97201660e6bbcff2d89d082b5b6d31abee04b1b3003ee073a6fd25ad1d69a"
],
"index": "pypi",
"version": "==3.0.8"
},
"flask-httpauth": {
"hashes": [
"sha256:0149953720489407e51ec24bc2f86273597b7973d71cd51f9443bd0e2a89bd72",
"sha256:6ef8b761332e780f9ff74d5f9056c2616f52babc1998b01d9f361a1e439e61b9"
],
"index": "pypi",
"version": "==3.3.0"
},
"flask-jwt-extended": {
"hashes": [
"sha256:0aa8ee6fa7eb3be9314e39dd199ac8e19389a95371f9d54e155c7aa635e319dd"
],
"index": "pypi",
"version": "==3.24.1"
},
"flask-login": {
"hashes": [
"sha256:6d33aef15b5bcead780acc339464aae8a6e28f13c90d8b1cf9de8b549d1c0b4b",
"sha256:7451b5001e17837ba58945aead261ba425fdf7b4f0448777e597ddab39f4fba0"
],
"index": "pypi",
"version": "==0.5.0"
},
"flask-migrate": {
"hashes": [
"sha256:6fb038be63d4c60727d5dfa5f581a6189af5b4e2925bc378697b4f0a40cfb4e1",
"sha256:a96ff1875a49a40bd3e8ac04fce73fdb0870b9211e6168608cbafa4eb839d502"
],
"index": "pypi",
"version": "==2.5.2"
},
"flask-pyoidc": {
"hashes": [
"sha256:215f91ec5f08d7a40b5fc10f88bec06bf39840f9242bb18e0ead3a249c1329ee"
],
"index": "pypi",
"version": "==3.2.0"
},
"flask-restx": {
"hashes": [
"sha256:641759fe7cba1cb073d15b4258b1b15840af8cffe6edbd0da3e6b61eae0a67a6",
"sha256:fe0845112014201d618c1b0f3e41fa5f818a17c1d9e3fb6600d4e2c2bbc76a42"
],
"index": "pypi",
"version": "==0.1.1"
},
"flask-script": {
"hashes": [
"sha256:6425963d91054cfcc185807141c7314a9c5ad46325911bd24dcb489bd0161c65"
],
"index": "pypi",
"version": "==2.0.6"
},
"flask-socketio": {
"hashes": [
"sha256:2172dff1e42415ba480cee02c30c2fc833671ff326f1598ee3d69aa02cf768ec",
"sha256:7ff5b2f5edde23e875a8b0abf868584e5706e11741557449bc5147df2cd78268"
],
"index": "pypi",
"version": "==4.2.1"
},
"flask-sqlalchemy": {
"hashes": [
"sha256:0078d8663330dc05a74bc72b3b6ddc441b9a744e2f56fe60af1a5bfc81334327",
"sha256:6974785d913666587949f7c2946f7001e4fa2cb2d19f4e69ead02e4b8f50b33d"
],
"index": "pypi",
"version": "==2.4.1"
},
"flask-testing": {
"hashes": [
"sha256:d849bf53eb1ceb09dff6611888588cb60f20238058fb1ebcd917d69febc373e6"
],
"index": "pypi",
"version": "==0.8.0"
},
"future": {
"hashes": [
"sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d"
],
"version": "==0.18.2"
},
"greenlet": {
"hashes": [
"sha256:000546ad01e6389e98626c1367be58efa613fa82a1be98b0c6fc24b563acc6d0",
"sha256:0d48200bc50cbf498716712129eef819b1729339e34c3ae71656964dac907c28",
"sha256:23d12eacffa9d0f290c0fe0c4e81ba6d5f3a5b7ac3c30a5eaf0126bf4deda5c8",
"sha256:37c9ba82bd82eb6a23c2e5acc03055c0e45697253b2393c9a50cef76a3985304",
"sha256:51155342eb4d6058a0ffcd98a798fe6ba21195517da97e15fca3db12ab201e6e",
"sha256:51503524dd6f152ab4ad1fbd168fc6c30b5795e8c70be4410a64940b3abb55c0",
"sha256:7457d685158522df483196b16ec648b28f8e847861adb01a55d41134e7734122",
"sha256:8041e2de00e745c0e05a502d6e6db310db7faa7c979b3a5877123548a4c0b214",
"sha256:81fcd96a275209ef117e9ec91f75c731fa18dcfd9ffaa1c0adbdaa3616a86043",
"sha256:853da4f9563d982e4121fed8c92eea1a4594a2299037b3034c3c898cb8e933d6",
"sha256:8b4572c334593d449113f9dc8d19b93b7b271bdbe90ba7509eb178923327b625",
"sha256:9416443e219356e3c31f1f918a91badf2e37acf297e2fa13d24d1cc2380f8fbc",
"sha256:9854f612e1b59ec66804931df5add3b2d5ef0067748ea29dc60f0efdcda9a638",
"sha256:99a26afdb82ea83a265137a398f570402aa1f2b5dfb4ac3300c026931817b163",
"sha256:a19bf883b3384957e4a4a13e6bd1ae3d85ae87f4beb5957e35b0be287f12f4e4",
"sha256:a9f145660588187ff835c55a7d2ddf6abfc570c2651c276d3d4be8a2766db490",
"sha256:ac57fcdcfb0b73bb3203b58a14501abb7e5ff9ea5e2edfa06bb03035f0cff248",
"sha256:bcb530089ff24f6458a81ac3fa699e8c00194208a724b644ecc68422e1111939",
"sha256:beeabe25c3b704f7d56b573f7d2ff88fc99f0138e43480cecdfcaa3b87fe4f87",
"sha256:d634a7ea1fc3380ff96f9e44d8d22f38418c1c381d5fac680b272d7d90883720",
"sha256:d97b0661e1aead761f0ded3b769044bb00ed5d33e1ec865e891a8b128bf7c656",
"sha256:e538b8dae561080b542b0f5af64d47ef859f22517f7eca617bb314e0e03fd7ef"
],
"version": "==0.4.15"
},
"html5lib": {
"hashes": [
"sha256:20b159aa3badc9d5ee8f5c647e5efd02ed2a66ab8d354930bd9ff139fc1dc0a3",
"sha256:66cb0dcfdbbc4f9c3ba1a63fdb511ffdbd4f513b2b6d81b80cd26ce6b3fb3736"
],
"index": "pypi",
"version": "==1.0.1"
},
"humanfriendly": {
"hashes": [
"sha256:25c2108a45cfd1e8fbe9cdb30b825d34ef5d5675c8e11e4775c9aedbfb0bdee2",
"sha256:3a831920e40e55ad49adb64c9179ed50c604cabca72cd300e7bd5b51310e4ebb"
],
"version": "==8.1"
},
"ics": {
"hashes": [
"sha256:bf5fbdef6e1e073afdadf1b996f0271186dd114a148e38e795919a1ae644d6ac"
],
"index": "pypi",
"version": "==0.7"
},
"idna": {
"hashes": [
"sha256:7588d1c14ae4c77d74036e8c22ff447b26d0fde8f007354fd48a7814db15b7cb",
"sha256:a068a21ceac8a4d63dbfd964670474107f541babbd2250d61922f029858365fa"
],
"version": "==2.9"
},
"importlib-metadata": {
"hashes": [
"sha256:06f5b3a99029c7134207dd882428a66992a9de2bef7c2b699b5641f9886c3302",
"sha256:b97607a1a18a5100839aec1dc26a1ea17ee0d93b20b0f008d80a5a050afb200b"
],
"markers": "python_version < '3.8'",
"version": "==1.5.0"
},
"importlib-resources": {
"hashes": [
"sha256:1dff36d42d94bd523eeb847c25c7dd327cb56686d74a26dfcc8d67c504922d59",
"sha256:7f0e1b2b5f3981e39c52da0f99b2955353c5a139c314994d1126c2551ace9bdf"
],
"version": "==1.3.1"
},
"itsdangerous": {
"hashes": [
"sha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19",
"sha256:b12271b2047cb23eeb98c8b5622e2e5c5e9abd9784a153e9d8ef9cb4dd09d749"
],
"version": "==1.1.0"
},
"jinja2": {
"hashes": [
"sha256:93187ffbc7808079673ef52771baa950426fd664d3aad1d0fa3e95644360e250",
"sha256:b0eaf100007721b5c16c1fc1eecb87409464edc10469ddc9a22a27a99123be49"
],
"version": "==2.11.1"
},
"jsonschema": {
"hashes": [
"sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163",
"sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a"
],
"version": "==3.2.0"
},
"mako": {
"hashes": [
"sha256:3139c5d64aa5d175dbafb95027057128b5fbd05a40c53999f3905ceb53366d9d",
"sha256:8e8b53c71c7e59f3de716b6832c4e401d903af574f6962edbbbf6ecc2a5fe6c9"
],
"version": "==1.1.2"
},
"markupsafe": {
"hashes": [
"sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473",
"sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161",
"sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235",
"sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5",
"sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42",
"sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff",
"sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b",
"sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1",
"sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e",
"sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183",
"sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66",
"sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b",
"sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1",
"sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15",
"sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1",
"sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e",
"sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b",
"sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905",
"sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735",
"sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d",
"sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e",
"sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d",
"sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c",
"sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21",
"sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2",
"sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5",
"sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b",
"sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6",
"sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f",
"sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f",
"sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2",
"sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7",
"sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"
],
"version": "==1.1.1"
},
"monotonic": {
"hashes": [
"sha256:23953d55076df038541e648a53676fb24980f7a1be290cdda21300b3bc21dfb0",
"sha256:552a91f381532e33cbd07c6a2655a21908088962bb8fa7239ecbcc6ad1140cc7"
],
"version": "==1.5"
},
"oic": {
"hashes": [
"sha256:091b20c0a4866e5afeef8fc21bfdffd65382763f09d782e14f8ce9081326e1ed",
"sha256:865da7ade1291c2f39dd196c34e5641a782b29871c3a48289e317d62fa49ef20"
],
"version": "==1.1.2"
},
"passlib": {
"hashes": [
"sha256:68c35c98a7968850e17f1b6892720764cc7eed0ef2b7cb3116a89a28e43fe177",
"sha256:8d666cef936198bc2ab47ee9b0410c94adf2ba798e5a84bf220be079ae7ab6a8"
],
"index": "pypi",
"version": "==1.7.2"
},
"pbr": {
"hashes": [
"sha256:139d2625547dbfa5fb0b81daebb39601c478c21956dc57e2e07b74450a8c506b",
"sha256:61aa52a0f18b71c5cc58232d2cf8f8d09cd67fcad60b742a60124cb8d6951488"
],
"version": "==5.4.4"
},
"pillow": {
"hashes": [
"sha256:0a628977ac2e01ca96aaae247ec2bd38e729631ddf2221b4b715446fd45505be",
"sha256:4d9ed9a64095e031435af120d3c910148067087541131e82b3e8db302f4c8946",
"sha256:54ebae163e8412aff0b9df1e88adab65788f5f5b58e625dc5c7f51eaf14a6837",
"sha256:5bfef0b1cdde9f33881c913af14e43db69815c7e8df429ceda4c70a5e529210f",
"sha256:5f3546ceb08089cedb9e8ff7e3f6a7042bb5b37c2a95d392fb027c3e53a2da00",
"sha256:5f7ae9126d16194f114435ebb79cc536b5682002a4fa57fa7bb2cbcde65f2f4d",
"sha256:62a889aeb0a79e50ecf5af272e9e3c164148f4bd9636cc6bcfa182a52c8b0533",
"sha256:7406f5a9b2fd966e79e6abdaf700585a4522e98d6559ce37fc52e5c955fade0a",
"sha256:8453f914f4e5a3d828281a6628cf517832abfa13ff50679a4848926dac7c0358",
"sha256:87269cc6ce1e3dee11f23fa515e4249ae678dbbe2704598a51cee76c52e19cda",
"sha256:875358310ed7abd5320f21dd97351d62de4929b0426cdb1eaa904b64ac36b435",
"sha256:8ac6ce7ff3892e5deaab7abaec763538ffd011f74dc1801d93d3c5fc541feee2",
"sha256:91b710e3353aea6fc758cdb7136d9bbdcb26b53cefe43e2cba953ac3ee1d3313",
"sha256:9d2ba4ed13af381233e2d810ff3bab84ef9f18430a9b336ab69eaf3cd24299ff",
"sha256:a62ec5e13e227399be73303ff301f2865bf68657d15ea50b038d25fc41097317",
"sha256:ab76e5580b0ed647a8d8d2d2daee170e8e9f8aad225ede314f684e297e3643c2",
"sha256:bf4003aa538af3f4205c5fac56eacaa67a6dd81e454ffd9e9f055fff9f1bc614",
"sha256:bf598d2e37cf8edb1a2f26ed3fb255191f5232badea4003c16301cb94ac5bdd0",
"sha256:c18f70dc27cc5d236f10e7834236aff60aadc71346a5bc1f4f83a4b3abee6386",
"sha256:c5ed816632204a2fc9486d784d8e0d0ae754347aba99c811458d69fcdfd2a2f9",
"sha256:dc058b7833184970d1248135b8b0ab702e6daa833be14035179f2acb78ff5636",
"sha256:ff3797f2f16bf9d17d53257612da84dd0758db33935777149b3334c01ff68865"
],
"index": "pypi",
"version": "==7.0.0"
},
"pyasn1": {
"hashes": [
"sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d",
"sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"
],
"version": "==0.4.8"
},
"pycparser": {
"hashes": [
"sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0",
"sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"
],
"version": "==2.20"
},
"pycryptodomex": {
"hashes": [
"sha256:1537d2d15b604b303aef56e7f440895a1c81adbee786b91f1f06eddc34da5314",
"sha256:1d20ab8369b7558168fc014a0745c678613f9f486dae468cca2d68145196b8a4",
"sha256:1ecc9db7409db67765eb008e558879d298406642d33ade43a6488224d23e8081",
"sha256:37033976f72af829fe15f7fe5fe1dbed308cc43a98d9dd9d2a0a76de8ca5ee78",
"sha256:3c3dd9d4c9c1e279d3945ae422895c901f98987333acc132dc094faf52afec35",
"sha256:3c9b3fba037ea52c626060c5a87ee6de7e86c99e8a7c6ee07302539985d2bd64",
"sha256:45ee555fc5e28c119a46d44ce373f5237e54a35c61b750fb3a94446b09855dbc",
"sha256:4c93038ac011b36512cb0bf2ee3e2aec774e8bc81021d015917c89fe02bb0ee5",
"sha256:50163324834edd0c9ce3e4512ded3e221c969086e10fdd5d3fdcaadac5e24a78",
"sha256:59b0ea9cda5490f924771456912a225d8d9e678891f9f986661af718534719b2",
"sha256:5cf306a17cccc327a33cdc3845629fa13f4573a4ec620ed607c79cf6785f2e27",
"sha256:5fff8da399af16a1855f58771223acbbdac720b9969cd03fc5013d2e9a7bd9a4",
"sha256:68650ce5b9f7152b8283302a4617269f821695a612692640dd247bd12ab21c0b",
"sha256:6b3a9a562688996f760b5077714c3ab8b62ca56061b6e9ab7906841e43e19f91",
"sha256:7e938ed51a59e29431ea86fab60423ada2757728db0f78952329fa02a789bd31",
"sha256:87aa70daad6f039e814790a06422a3189311198b674b62f13933a2bdcb6b1bcc",
"sha256:99be3a1df2b2b9f731ebe1c264a2c07c465e71cee68e35e1640b645b5213a755",
"sha256:a3f2908666e6f74b8c4893f86dd02e16170f50e4a78ae7f3468b6208d54bc205",
"sha256:ae3d44a639fd11dbdeca47e35e94febb1ee8bc15daf26673331add37146e0b85",
"sha256:afb4c2fa3c6f492fd9a8b38d76e13f32d429b8e5e1e00238309391b5591cde0d",
"sha256:b1515ce3a8a2c3fa537d137c5ca5f8b7a902044d04e07d7c3aa26c3e026120fb",
"sha256:bf391b377413a197000b43ef2b74359974d8927d329a897c9f5ba7b63dca7b9c",
"sha256:c436919117c23355740c669f89720673578b9aa4569bbfe105f6c10101fc1966",
"sha256:d2c3c280975638e2a2c2fd9cb36ab111980219757fa163a2755594b9448e4138",
"sha256:e585d530764c459cbd5d460aed0288807bb881f376ca9a20e653645217895961",
"sha256:e76e6638ead4a7d93262a24218f0ff3ff74de6b6c823b7e19dccb31b6a481978",
"sha256:ebfc2f885cafda076c31ae30fa0dd81e7e919ec34059a88d3018ed66e83fcce3",
"sha256:f5797a39933a3d41526da60856735e6684b2b71a8ca99d5f79555ca121be2f4b",
"sha256:f7e5fc5e124200b19a14be33fb0099e956e6ebb5e25d287b0829ef0a78ed76c7",
"sha256:fb350e31e55211fec8ddc89fc0256f3b9bc3b44b68a8bde1cf44b3b4e80c0e42"
],
"version": "==3.9.7"
},
"pydub": {
"hashes": [
"sha256:c362fa02da1eebd1d08bd47aa9b0102582dff7ca2269dbe9e043d228a0c1ea93",
"sha256:d29901a486fb421c5d7b0f3d5d3a60527179204d8ffb20e74e1ae81c17e81b46"
],
"index": "pypi",
"version": "==0.23.1"
},
"pyjwkest": {
"hashes": [
"sha256:5560fd5ba08655f29ff6ad1df1e15dc05abc9d976fcbcec8d2b5167f49b70222"
],
"version": "==1.4.2"
},
"pyjwt": {
"hashes": [
"sha256:5c6eca3c2940464d106b99ba83b00c6add741c9becaec087fb7ccdefea71350e",
"sha256:8d59a976fb773f3e6a39c85636357c4f0e242707394cadadd9814f5cbaa20e96"
],
"index": "pypi",
"version": "==1.7.1"
},
"pyrsistent": {
"hashes": [
"sha256:cdc7b5e3ed77bed61270a47d35434a30617b9becdf2478af76ad2c6ade307280"
],
"version": "==0.15.7"
},
"python-dateutil": {
"hashes": [
"sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c",
"sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a"
],
"version": "==2.8.1"
},
"python-editor": {
"hashes": [
"sha256:1bf6e860a8ad52a14c3ee1252d5dc25b2030618ed80c022598f00176adc8367d",
"sha256:51fda6bcc5ddbbb7063b2af7509e43bd84bfc32a4ff71349ec7847713882327b",
"sha256:5f98b069316ea1c2ed3f67e7f5df6c0d8f10b689964a4a811ff64f0106819ec8"
],
"version": "==1.0.4"
},
"python-engineio": {
"hashes": [
"sha256:47ae4a9b3b4f2e8a68929f37a518338838e119f24c9a9121af92c49f8bea55c3",
"sha256:c3a3822deb51fdf9c7fe4d78abf807c73b83ea538036a50862d3024450746253"
],
"version": "==3.11.2"
},
"python-jose": {
"hashes": [
"sha256:1ac4caf4bfebd5a70cf5bd82702ed850db69b0b6e1d0ae7368e5f99ac01c9571",
"sha256:8484b7fdb6962e9d242cce7680469ecf92bda95d10bbcbbeb560cacdff3abfce"
],
"index": "pypi",
"version": "==3.1.0"
},
"python-socketio": {
"extras": [
"client"
],
"hashes": [
"sha256:48cba5b827ac665dbf923a4f5ec590812aed5299a831fc43576a9af346272534",
"sha256:af6c23c35497960f82106e36688123ecb52ad5a77d0ca27954ff3811c4d9d562"
],
"index": "pypi",
"version": "==4.4.0"
},
"pythonping": {
"hashes": [
"sha256:05269d459d2290ff57665aa3b3c9ed1b64bb96106d22712e0054b52d51c6bb13"
],
"index": "pypi",
"version": "==1.0.8"
},
"pytz": {
"hashes": [
"sha256:1c557d7d0e871de1f5ccd5833f60fb2550652da6be2693c1e02300743d21500d",
"sha256:b02c06db6cf09c12dd25137e563b31700d3b80fcc4ad23abb7a315f2789819be"
],
"version": "==2019.3"
},
"requests": {
"hashes": [
"sha256:43999036bfa82904b6af1d99e4882b560e5e2c68e5c4b0aa03b655f3d7d73fee",
"sha256:b3f43d496c6daba4493e7c431722aeb7dbc6288f52a6e04e7b6023b0247817e6"
],
"version": "==2.23.0"
},
"rsa": {
"hashes": [
"sha256:14ba45700ff1ec9eeb206a2ce76b32814958a98e372006c8fb76ba820211be66",
"sha256:1a836406405730121ae9823e19c6e806c62bbad73f890574fff50efa4122c487"
],
"version": "==4.0"
},
"scapy": {
"hashes": [
"sha256:e2f8d11f6a941c14a789ae8b236b27bd634681f1b29b5e893861e284d234f6b0"
],
"index": "pypi",
"version": "==2.4.3"
},
"simpleaudio": {
"hashes": [
"sha256:05b63da515f5fc7c6f40e4d9673d22239c5e03e2bda200fc09fd21c185d73713",
"sha256:67348e3d3ccbae73bd126beed7f1e242976889620dbc6974c36800cd286430fc",
"sha256:691c88649243544db717e7edf6a9831df112104e1aefb5f6038a5d071e8cf41d",
"sha256:86f1b0985629852afe67259ac6c24905ca731cb202a6e96b818865c56ced0c27",
"sha256:f1a4fe3358429b2ea3181fd782e4c4fff5c123ca86ec7fc29e01ee9acd8a227a",
"sha256:f346a4eac9cdbb1b3f3d0995095b7e86c12219964c022f4d920c22f6ca05fb4c",
"sha256:f68820297ad51577e3a77369e7e9b23989d30d5ae923bf34c92cf983c04ade04"
],
"index": "pypi",
"version": "==1.0.4"
},
"six": {
"hashes": [
"sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a",
"sha256:8f3cd2e254d8f793e7f3d6d9df77b92252b52637291d0f0da013c76ea2724b6c"
],
"version": "==1.14.0"
},
"socketio-client": {
"hashes": [
"sha256:64cd84fba79cf97f28c11e64d1fc42a2221f2d7a4fada05ab381e2d73d74d2c1"
],
"index": "pypi",
"version": "==0.7.2"
},
"soupsieve": {
"hashes": [
"sha256:e914534802d7ffd233242b785229d5ba0766a7f487385e3f714446a07bf540ae",
"sha256:fcd71e08c0aee99aca1b73f45478549ee7e7fc006d51b37bec9e9def7dc22b69"
],
"version": "==2.0"
},
"sqlalchemy": {
"hashes": [
"sha256:c4cca4aed606297afbe90d4306b49ad3a4cd36feb3f87e4bfd655c57fd9ef445"
],
"index": "pypi",
"version": "==1.3.15"
},
"sqlalchemy-migrate": {
"hashes": [
"sha256:0bc02e292a040ade5e35a01d3ea744119e1309cdddb704fdb99bac13236614f8",
"sha256:e5d2348db19a5062132d93e3b4d9e7644af552fffbec4c78cc5358f848d2f6c1"
],
"index": "pypi",
"version": "==0.13.0"
},
"sqlparse": {
"hashes": [
"sha256:022fb9c87b524d1f7862b3037e541f68597a730a8843245c349fc93e1643dc4e",
"sha256:e162203737712307dfe78860cc56c8da8a852ab2ee33750e33aeadf38d12c548"
],
"version": "==0.3.1"
},
"ssh2-python": {
"hashes": [
"sha256:054f2cab611ddca34095eb78d1ae1f6e29521678c82f0de17f696072a0b924fe",
"sha256:097d74684172f163d5025aef316987c1c7acf852d9fb75e4735720c8690adf87",
"sha256:0f4555b79e19ca6fdd84a74e85152d375a921d167ed9dc680d05f1f9f5dfc463",
"sha256:0fb3d9eca454b2874748c69e7e836ea5c6544f1b7acd87d8a876f99f618c806c",
"sha256:180c2728796f777a5856b23e5e1656a15a3e8602b4270348f892599ae5426f45",
"sha256:49aaa9d48cf52798d89f466a5e774e9dab8b76dc380b90645fd8d5c6622df177",
"sha256:4b5ba1390ff5e8faa6b2409df750e4650de3934c3b76ad707d7b54b477600226",
"sha256:57a4452dfc5c7f414de14e32f29e21f680fb8d7bdf94306e5f6bc8c2a235fa7a",
"sha256:584f753f0401217a55e70d2ae97a7e5220f4d37993a1bba275c4c5e110d87193",
"sha256:692cf27ddc5583da9b07b0f0348f0577579f8d798a0b8e4bf495b8d7f19fc854",
"sha256:6dc75bacc37de63aa9c86f9982642982c3a8103297fbbb73543a76e3db9abc6a",
"sha256:7a029275e62a1e31333ee7f2f151f661dedfac0345f1108e1a8d0b62e08ddf9b",
"sha256:7a3d761c669392e778c24a0eabcf6f1ba48ad68bb3b82a2d98235f56500bc8b0",
"sha256:8632684aae2f523e603381cf51a1da134fd5937cf0ae9650b1b9e7b4f328c133",
"sha256:8acab66dd73554d2c68abaccf96cdddfc10449ad6c7c273ac4b7a91779d414b2",
"sha256:9410b63c2361b2b65a55b5e8dc8187270de0f81e11864a427ad52b82b926bcc9",
"sha256:abe29ad01ed2ac4465e61c8de42b6850fca9c87d8792686a2de7c7d06c6eb72d",
"sha256:de151500a2a027a29bca3d7196c76008b41bb97db29378f29c4651ba1bcb00e8",
"sha256:debc56711643b82ab60a9c8b8cbf2978b65c0293aa7e53557a3c0d1fc57799cf",
"sha256:f508144d684b3c3c0f264ce67058f05ae3729ae77cc3a8f2051b442e01594849"
],
"index": "pypi",
"version": "==0.18.0.post1"
},
"style": {
"hashes": [
"sha256:6485a4bcb84629341a5fd1587fe3ac4887daa4741f0c8a1d01b9c3c8a263afe7",
"sha256:8eb365fc15039b19b728bd4e6e85fb7daf24e7aeeec6a15a666f97484c564005"
],
"version": "==1.1.0"
},
"tatsu": {
"hashes": [
"sha256:80713413473a009f2081148d0f494884cabaf9d6866b71f2a68a92b6442f343d",
"sha256:c9211eeee9a2d4c90f69879ec0b518b1aa0d9450249cb0dd181f5f5b18be0a92"
],
"version": "==4.4.0"
},
"tempita": {
"hashes": [
"sha256:cacecf0baa674d356641f1d406b8bff1d756d739c46b869a54de515d08e6fc9c"
],
"version": "==0.5.2"
},
"typing-extensions": {
"hashes": [
"sha256:091ecc894d5e908ac75209f10d5b4f118fbdb2eb1ede6a63544054bb1edb41f2",
"sha256:910f4656f54de5993ad9304959ce9bb903f90aadc7c67a0bef07e678014e892d",
"sha256:cf8b63fedea4d89bab840ecbb93e75578af28f76f66c35889bd7065f5af88575"
],
"version": "==3.7.4.1"
},
"tzlocal": {
"hashes": [
"sha256:11c9f16e0a633b4b60e1eede97d8a46340d042e67b670b290ca526576e039048",
"sha256:949b9dd5ba4be17190a80c0268167d7e6c92c62b30026cf9764caf3e308e5590"
],
"version": "==2.0.0"
},
"update": {
"hashes": [
"sha256:a25522b4bf60e3e3c1a3ff3ca3a4f5a328ac4b8ff400fdc9614483147e313323"
],
"index": "pypi",
"version": "==0.0.1"
},
"urllib3": {
"hashes": [
"sha256:2f3db8b19923a873b3e5256dc9c2dedfa883e33d87c690d9c7913e1f40673cdc",
"sha256:87716c2d2a7121198ebcb7ce7cccf6ce5e9ba539041cfbaeecfb641dc0bf6acc"
],
"version": "==1.25.8"
},
"webencodings": {
"hashes": [
"sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78",
"sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"
],
"version": "==0.5.1"
},
"websocket-client": {
"hashes": [
"sha256:0fc45c961324d79c781bab301359d5a1b00b13ad1b10415a4780229ef71a5549",
"sha256:d735b91d6d1692a6a181f2a8c9e0238e5f6373356f561bb9dc4c7af36f452010"
],
"index": "pypi",
"version": "==0.57.0"
},
"werkzeug": {
"hashes": [
"sha256:1e0dedc2acb1f46827daa2e399c1485c8fa17c0d8e70b6b875b4e7f54bf408d2",
"sha256:b353856d37dec59d6511359f97f6a4b2468442e454bd1c98298ddce53cac1f04"
],
"version": "==0.16.1"
},
"zipp": {
"hashes": [
"sha256:aa36550ff0c0b7ef7fa639055d797116ee891440eac1a56f378e2d3179e0320b",
"sha256:c599e4d75c98f6798c509911d08a22e6c021d074469042177c8c86fb92eefd96"
],
"markers": "python_version < '3.8'",
"version": "==3.1.0"
}
},
"develop": {}
}

7
README.md Normal file
View File

@@ -0,0 +1,7 @@
Backend code for LRC
requirements:
- python > 3.6
- libasound2-dev

View File

@@ -3,18 +3,18 @@
Backend base module Backend base module
""" """
import logging import logging
from io import StringIO
from logging.config import dictConfig from logging.config import dictConfig
from logging.handlers import MemoryHandler from logging.handlers import MemoryHandler
from typing import Union from typing import Union
import coloredlogs import coloredlogs as coloredlogs
import jwt import jwt
import requests import requests
from flask import Flask, jsonify from flask import Flask, jsonify, abort
from flask_httpauth import HTTPTokenAuth, HTTPBasicAuth, MultiAuth from flask_httpauth import HTTPTokenAuth, HTTPBasicAuth, MultiAuth
from flask_jwt_extended import JWTManager, decode_token from flask_jwt_extended import JWTManager, decode_token
from flask_login import LoginManager from flask_login import LoginManager
from flask_restx import abort
from flask_sqlalchemy import SQLAlchemy from flask_sqlalchemy import SQLAlchemy
from flask_cors import CORS from flask_cors import CORS
from backend.config import Config from backend.config import Config
@@ -108,11 +108,11 @@ class LrcException(Exception):
def __repr__(self): def __repr__(self):
if self.type is None: if self.type is None:
msg = f"LRC Exception: \"{', '.join(super().args)}\"" msg = "LRC Exception: \"{}\"".format(', '.join(super().args))
else: else:
msg = f"LRC Exception: (original Exception: {self.type}) \"{', '.join(super().args)}\"" msg = "LRC Exception: (original Exception: {}) \"{}\"".format(self.type, ', '.join(super().args))
if self.html_code is not None: if self.html_code is not None:
msg += f" (HTML Code: {self.html_code})" msg += " (HTML Code: {})".format(self.html_code)
return msg return msg
def __str__(self): def __str__(self):
@@ -134,7 +134,7 @@ jwt_auth = HTTPTokenAuth('Bearer')
@jwt_extended.invalid_token_loader @jwt_extended.invalid_token_loader
def unauthorized_jwt(token): def unauthorized_jwt(token):
main_logger.info("Unauthorized access; invalid token provided: %s", token) main_logger.info("Unauthorized access; invalid token provided: {}".format(token))
abort(401) abort(401)
@@ -146,10 +146,10 @@ def verify_token(token):
try: try:
decoded = decode_token(token) decoded = decode_token(token)
except jwt.exceptions.DecodeError as e: except jwt.exceptions.DecodeError as e:
app.logger.warning("Could not verify token: %s", str(e)) app.logger.warn("Could not verify token: {}".format(str(e)))
return False return False
except jwt.exceptions.ExpiredSignatureError as e: except jwt.exceptions.ExpiredSignatureError as e:
app.logger.warning("Could not verify token: %s", str(e)) app.logger.warn("Could not verify token: {}".format(str(e)))
return False return False
app.logger.info(decoded) app.logger.info(decoded)
return True return True
@@ -163,22 +163,20 @@ from backend.auth import oidc_auth, auth_bp
try: try:
oidc_auth.init_app(app) oidc_auth.init_app(app)
except requests.exceptions.ConnectionError as err: except requests.exceptions.ConnectionError as err:
app.logger.exception("Could not connect to OIDC!!", exc_info=err) app.logger.error("Could not connect to OIDC!!", err)
# oidc_multi_auth = MultiAuth(oidc_auth, jwt_auth) <- can't work as OIDCAuthentication not implementing HTTPAuth # oidc_multi_auth = MultiAuth(oidc_auth, jwt_auth) <- can't work as OIDCAuthentication not implementing HTTPAuth
from .serve_frontend import fe_bp from .serve_frontend import fe_bp
from .api import auth_api_bp, api_v1, api_bp from .api import auth_api_bp, api_v1, api_bp
CORS(app)
CORS(api_bp)
app.register_blueprint(auth_bp) app.register_blueprint(auth_bp)
app.register_blueprint(auth_api_bp) app.register_blueprint(auth_api_bp)
app.register_blueprint(api_bp) app.register_blueprint(api_bp)
app.register_blueprint(fe_bp) app.register_blueprint(fe_bp)
CORS(app)
CORS(api_bp)
# Fix jwt_extended by duck typing error handlers
# Fix flask-restplus by duck typing error handlers
jwt_extended._set_error_handler_callbacks(api_v1) jwt_extended._set_error_handler_callbacks(api_v1)

View File

@@ -4,32 +4,29 @@
# Copyright (c) 2019. Tobias Kurze # Copyright (c) 2019. Tobias Kurze
import logging import logging
import ssl import ssl
import sys
from jinja2.exceptions import TemplateNotFound from jinja2.exceptions import TemplateNotFound
from backend import app, db from backend import app, db
from backend.models import room_model, recorder_model, RecorderCommand from backend.cron import get_default_scheduler, add_default_jobs
from backend.models import *
from backend.models import room_model, recorder_model, RecorderCommand, Recorder
from backend.recorder_adapters import get_defined_recorder_adapters from backend.recorder_adapters import get_defined_recorder_adapters
from backend.tools.model_updater import update_recorder_models_database, create_default_recorders from backend.tools.model_updater import update_recorder_models_database, create_default_recorders
from backend.websocket.base import WebSocketBase
def setup_database(app):
with app.app_context():
#db.drop_all()
db.create_all()
room_model.pre_fill_table()
update_recorder_models_database(drop=False)
create_default_recorders()
def get_app():
setup_database(app)
#app.register_blueprint(api_blueprint)
return app
def main(): def main():
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
app = get_app()
#db.drop_all()
#db.create_all()
#Recorder()
room_model.pre_fill_table()
update_recorder_models_database(drop=False)
create_default_recorders()
print(app.config.get("SERVER_NAME", None)) print(app.config.get("SERVER_NAME", None))
server_name = app.config.get("SERVER_NAME", None) server_name = app.config.get("SERVER_NAME", None)
@@ -46,7 +43,25 @@ def main():
except Exception as e: except Exception as e:
logging.critical(e) logging.critical(e)
app.run(debug=True, host="0.0.0.0") print("Starting Scheduler")
scheduler = get_default_scheduler()
add_default_jobs(scheduler)
scheduler.start()
wsb = WebSocketBase()
print("running websocket...(replaces normal app.run()")
wsb.start_websocket(debug=True)
# print("running web app...")
#app.run(debug=True, host="0.0.0.0", threaded=True)
wsb.send_test_msg()
while True:
user_in = input("Type >exit< to quit.")
if user_in == "exit" or user_in == ">exit<":
break
scheduler.shutdown()
sys.exit(0)
if __name__ == '__main__': if __name__ == '__main__':

View File

@@ -27,8 +27,10 @@ api_v1 = Api(api_bp, prefix="/v1", version='0.1', title='Vue Test API',
api_user = Namespace('user', description="User management namespace", authorizations=api_authorizations) api_user = Namespace('user', description="User management namespace", authorizations=api_authorizations)
api_group = Namespace('group', description="Group management namespace", authorizations=api_authorizations) api_group = Namespace('group', description="Group management namespace", authorizations=api_authorizations)
api_permissions = Namespace('permissions', description="Permissions management namespace", authorizations=api_authorizations)
api_room = Namespace('room', description="Room management namespace", authorizations=api_authorizations) api_room = Namespace('room', description="Room management namespace", authorizations=api_authorizations)
api_recorder = Namespace('recorder', description="Recorder management namespace", authorizations=api_authorizations) api_recorder = Namespace('recorder', description="Recorder management namespace", authorizations=api_authorizations)
api_state = Namespace('state', description="Object state management namespace", authorizations=api_authorizations)
api_virtual_command = Namespace('virtual_command', description="Virtual command namespace", api_virtual_command = Namespace('virtual_command', description="Virtual command namespace",
authorizations=api_authorizations) authorizations=api_authorizations)
api_cron_job = Namespace('cron_job', description="Cron job namespace", api_cron_job = Namespace('cron_job', description="Cron job namespace",
@@ -38,8 +40,10 @@ api_control = Namespace('control', description="Control namespace",
api_v1.add_namespace(api_user) api_v1.add_namespace(api_user)
api_v1.add_namespace(api_group) api_v1.add_namespace(api_group)
api_v1.add_namespace(api_permissions)
api_v1.add_namespace(api_room) api_v1.add_namespace(api_room)
api_v1.add_namespace(api_recorder) api_v1.add_namespace(api_recorder)
api_v1.add_namespace(api_state)
api_v1.add_namespace(api_virtual_command) api_v1.add_namespace(api_virtual_command)
api_v1.add_namespace(api_cron_job) api_v1.add_namespace(api_cron_job)
api_v1.add_namespace(api_control) api_v1.add_namespace(api_control)
@@ -58,9 +62,11 @@ auth_api_v1.add_namespace(auth_api_register_ns)
from .example_api import * from .example_api import *
from .auth_api import * from .auth_api import *
from .user_api import * from .user_api import *
from .permission_api import *
from .group_api import * from .group_api import *
from .room_api import * from .room_api import *
from .recorder_api import * from .recorder_api import *
from .state_api import *
from .control_api import * from .control_api import *
from .virtual_command_api import * from .virtual_command_api import *

View File

@@ -10,16 +10,21 @@ import json
from pprint import pprint from pprint import pprint
import flask import flask
from datetime import datetime, timedelta
import jwt import jwt
from flask import request, jsonify, current_app, url_for, redirect, make_response from flask import request, jsonify, current_app, url_for, Response, session, redirect, make_response
from flask_jwt_extended import create_access_token, create_refresh_token, get_jwt, get_jwt_identity, jwt_required from flask_jwt_extended import create_access_token, create_refresh_token, jwt_refresh_token_required, get_jwt_identity, \
get_raw_jwt, jwt_required
from functools import wraps
from random import randint
from flask_login import logout_user, login_user
from typing import Iterable from typing import Iterable
from flask_restx import Resource, fields from flask_restx import Resource, fields
from werkzeug.routing import BuildError from werkzeug.routing import BuildError
from backend import db, app from backend import db, app, jwt_extended
from backend.api import auth_api_bp, auth_api_providers_ns, auth_api_register_ns from backend.api import auth_api_bp, auth_api_providers_ns, auth_api_register_ns
from backend.auth import AUTH_PROVIDERS, oidc_auth from backend.auth import AUTH_PROVIDERS, oidc_auth
from backend.models.user_model import User, Group, BlacklistToken from backend.models.user_model import User, Group, BlacklistToken
@@ -53,19 +58,19 @@ def register():
return jsonify(user.to_dict()), 201 return jsonify(user.to_dict()), 201
# @auth_api_register_ns.route('/') @auth_api_register_ns.route('/')
# @auth_api_register_ns.expect(auth_api_register_ns.model('RegisterModel', { @auth_api_register_ns.expect(auth_api_register_ns.model('RegisterModel', {
# 'nickname': fields.String(required=False, description='The user\'s nickname'), 'nickname': fields.String(required=False, description='The user\'s nickname'),
# 'first_name': fields.String(required=False, description='The user\'s first name'), 'first_name': fields.String(required=False, description='The user\'s first name'),
# 'last_name': fields.String(required=False, description='The user\'s last name'), 'last_name': fields.String(required=False, description='The user\'s last name'),
# 'lang': fields.String(required=False, description='The user\'s preferred language'), 'lang': fields.String(required=False, description='The user\'s preferred language'),
# 'timezone': fields.String(required=False, description='The user\'s preferred timezone'), 'timezone': fields.String(required=False, description='The user\'s preferred timezone'),
# 'email': fields.String(required=True, description='The user\'s e-mail address'), 'email': fields.String(required=True, description='The user\'s e-mail address'),
# 'password': fields.String(required=False, description='The group\'s name') 'password': fields.String(required=False, description='The group\'s name')
# })) }))
# class AuthProviders(Resource): class AuthProviders(Resource):
# def get(self): def get(self):
# return register() return register()
@auth_api_bp.route('/login', methods=('GET', 'POST',)) @auth_api_bp.route('/login', methods=('GET', 'POST',))
@@ -91,7 +96,7 @@ def login():
@auth_api_bp.route('/logout', methods=['GET', 'DELETE']) @auth_api_bp.route('/logout', methods=['GET', 'DELETE'])
@jwt_required @jwt_required
def logout(): def logout():
jti = get_jwt()['jti'] jti = get_raw_jwt()['jti']
db.session.add(BlacklistToken(token=jti)) db.session.add(BlacklistToken(token=jti))
db.session.commit() db.session.commit()
return jsonify({"msg": "Successfully logged out"}), 200 return jsonify({"msg": "Successfully logged out"}), 200
@@ -99,9 +104,9 @@ def logout():
# Endpoint for revoking the current users refresh token # Endpoint for revoking the current users refresh token
@auth_api_bp.route('/logout2', methods=['GET', 'DELETE']) @auth_api_bp.route('/logout2', methods=['GET', 'DELETE'])
@jwt_required(refresh=True) @jwt_refresh_token_required
def logout2(): def logout2():
jti = get_jwt()['jti'] jti = get_raw_jwt()['jti']
db.session.add(BlacklistToken(token=jti)) db.session.add(BlacklistToken(token=jti))
db.session.commit() db.session.commit()
return jsonify({"msg": "Successfully logged out"}), 200 return jsonify({"msg": "Successfully logged out"}), 200
@@ -177,7 +182,7 @@ def oidc(redirect_url=None):
@auth_api_bp.route('/refresh', methods=['GET']) @auth_api_bp.route('/refresh', methods=['GET'])
@jwt_required(refresh=True) @jwt_refresh_token_required
def refresh(): def refresh():
"""Refresh token endpoint. This will generate a new access token from """Refresh token endpoint. This will generate a new access token from
the refresh token, but will mark that access token as non-fresh, the refresh token, but will mark that access token as non-fresh,

View File

@@ -8,17 +8,18 @@ Login through API does not start a new session, but instead returns JWT.
import json import json
from datetime import datetime from datetime import datetime
from flask_jwt_extended import jwt_required, get_current_user, get_jwt from flask_jwt_extended import jwt_required, get_current_user, get_jwt_claims
from flask_restx import fields, Resource from flask_restx import fields, Resource
from backend import db from backend import db
from backend.api import api_control, get_jwt_identity from backend.api import api_control, get_jwt_identity, Recorder, RecorderCommand, pprint
from backend.recorder_adapters.helpers import execute_recorder_command
control_command_response_model = api_control.model('Control Command Response', { control_command_response_model = api_control.model('Control Command Response', {
'time': fields.DateTime(required=False, description='Creation date of the recorder'), 'time': fields.DateTime(required=False, description='Creation date of the recorder'),
'state': fields.String(min_length=3, required=True, description='The recorder\'s name'), 'ok': fields.Boolean(required=True, description='Field indicating whether command execution was successful.'),
'output': fields.String(required=False, description='The recorder\'s description'), 'output': fields.String(required=False, description='Command output in case of success'),
'error': fields.String(required=False, description='The recorder\'s description'), 'error': fields.String(required=False, description='Error description in case of a problem.'),
}) })
@@ -27,16 +28,28 @@ class ControlCommand(Resource):
control_command_parser = api_control.parser() control_command_parser = api_control.parser()
control_command_parser.add_argument('recorder_id', type=int, default=1, required=True) control_command_parser.add_argument('recorder_id', type=int, default=1, required=True)
control_command_parser.add_argument('command_id', type=int, default=1, required=True) control_command_parser.add_argument('command_id', type=int, default=1, required=True)
control_command_parser.add_argument('parameters', default=json.dumps({'p1': 'v1'}), type=dict, required=False, control_command_parser.add_argument('parameters', default={}, type=dict, required=False,
location='json') location='json')
@jwt_required #@jwt_required
@api_control.doc('run_command') @api_control.doc('run_command')
@api_control.expect(control_command_parser) @api_control.expect(control_command_parser)
@api_control.marshal_with(control_command_response_model, skip_none=False, code=201) @api_control.marshal_with(control_command_response_model, skip_none=False, code=201)
def post(self): def post(self):
print(get_current_user()) #print(get_current_user())
print(get_jwt_identity()) #print(get_jwt_identity())
current_user = {'user': get_current_user(), 'claims': get_jwt()} #current_user = {'user': get_current_user(), 'claims': get_jwt_claims()}
#TODO: right check! (acl, etc.)
args = self.control_command_parser.parse_args() args = self.control_command_parser.parse_args()
return {'time': datetime.utcnow(), 'output': args, 'state': current_user} recorder = Recorder.get_by_identifier(args.get('recorder_id'))
if recorder is None:
api_control.abort(404, "Recorder not found!")
command = RecorderCommand.get_by_identifier(args.get('command_id'))
if command is None:
api_control.abort(404, "Command not found!")
success, output = execute_recorder_command(recorder, command, args.get('parameters', None))
if success:
return {'time': datetime.utcnow(), 'output': output, 'ok': success}
return {'time': datetime.utcnow(), 'error': output, 'ok': success}

View File

@@ -21,7 +21,11 @@ group_model = api_group.model('Group', {
'first_name': fields.String(), 'last_name': fields.String(), 'first_name': fields.String(), 'last_name': fields.String(),
'email': fields.String(), 'registered_on': fields.DateTime(), 'email': fields.String(), 'registered_on': fields.DateTime(),
'last_seen': fields.DateTime()})), 'last_seen': fields.DateTime()})),
required=False, description='Group members.') required=False, description='Group members.'),
'permissions': fields.List(fields.Nested(api_group.model('group_permissions',
{'id': fields.Integer,
'name': fields.String})),
required=False, description='Group permissions.'),
}) })

View File

@@ -1,5 +1,5 @@
from flask_restx import fields from flask_restx import fields
from backend.api import api_user, api_recorder, api_v1 from backend.api import api_user, api_recorder, api_v1, api_state
generic_id_parser = api_v1.parser() generic_id_parser = api_v1.parser()
generic_id_parser.add_argument('id', type=str, required=True, store_missing=False) generic_id_parser.add_argument('id', type=str, required=True, store_missing=False)
@@ -20,7 +20,9 @@ user_model = api_user.model('User', {
fields.Nested(api_user.model('user_group', {'id': fields.Integer(), 'name': fields.String()})), fields.Nested(api_user.model('user_group', {'id': fields.Integer(), 'name': fields.String()})),
required=False, description='Group memberships.'), required=False, description='Group memberships.'),
'favorite_recorders': fields.List( 'favorite_recorders': fields.List(
fields.Nested(api_user.model('favorite_recorder', {'id': fields.Integer(), 'name': fields.String()})), fields.Nested(api_user.model('favorite_recorder',
{'id': fields.Integer(), 'name': fields.String(), 'offline': fields.Boolean(),
'created_at': fields.DateTime(), 'last_time_modified': fields.DateTime()})),
required=False, description='Favorite recorders.'), required=False, description='Favorite recorders.'),
}) })
@@ -100,3 +102,6 @@ recorder_model_model = api_recorder.model('Recorder Model', {
description='Model of the recorder.'), description='Model of the recorder.'),
'commands': fields.List(fields.Nested(recorder_command_model), attribute="recorder_commands") 'commands': fields.List(fields.Nested(recorder_command_model), attribute="recorder_commands")
}) })
state_model = api_state.model('Recorder', {
})

View File

@@ -0,0 +1,91 @@
# Copyright (c) 2019. Tobias Kurze
"""
This module provides functions related to authentication through the API.
For example: listing of available auth providers or registration of users.
Login through API does not start a new session, but instead returns JWT.
"""
from flask_jwt_extended import jwt_required
from flask_restx import fields, Resource
from backend import db
from backend.api import api_permissions
from backend.models.user_model import Permission
permission_model = api_permissions.model('Permission', {
'id': fields.String(required=False, description='The permission\'s identifier'),
'name': fields.String(required=True, description='The permission\'s name'),
'description': fields.String(required=False, description='The permission\'s description'),
'groups': fields.List(fields.Nested(api_permissions.model('group_member',
{'id': fields.Integer(),
'name': fields.String(),
'description': fields.String()})),
required=False, description='Groups having the permission.'),
'access_control_entry': fields.Nested(api_permissions.model('group_member',
{'id': fields.Integer(),
'name': fields.String(),
'url': fields.String()}),
required=False, description="Access Control Entry"),
})
@api_permissions.route('/<int:id>')
@api_permissions.response(404, 'permission not found')
@api_permissions.param('id', 'The permission identifier')
class PermissionResource(Resource):
@jwt_required
@api_permissions.doc('get_permission')
@api_permissions.marshal_with(permission_model)
def get(self, id):
"""Fetch a user given its identifier"""
permission = Permission.get_by_id(id)
if permission is not None:
return permission
api_permissions.abort(404)
@jwt_required
@api_permissions.doc('delete_permission')
@api_permissions.response(204, 'permission deleted')
def delete(self, id):
"""Delete a permission given its identifier"""
permission = Permission.get_by_id(id)
if permission is not None:
permission.delete()
return '', 204
api_permissions.abort(404)
@jwt_required
@api_permissions.doc('update_permission')
@api_permissions.expect(permission_model)
@api_permissions.marshal_with(permission_model)
def put(self, id):
"""Update a task given its identifier"""
permission = Permission.get_by_id(id)
if permission is not None:
permission.name = api_permissions["name"]
db.session.commit()
return permission
api_permissions.abort(404)
@api_permissions.route('')
class PermissionList(Resource):
@jwt_required
@api_permissions.doc('permissions')
@api_permissions.marshal_list_with(permission_model)
def get(self):
"""
List all permissions
:return: permissions
"""
return Permission.get_all()
@jwt_required
@api_permissions.doc('create_permission')
@api_permissions.expect(permission_model)
@api_permissions.marshal_with(permission_model, code=201)
def post(self):
permission = Permission(**api_permissions.payload)
db.session.add(permission)
db.session.commit()
return permission

View File

@@ -1,9 +1,6 @@
# Copyright (c) 2019. Tobias Kurze # Copyright (c) 2019. Tobias Kurze
""" """
This module provides functions related to authentication through the API. This module provides functions related to recorders through the API.
For example: listing of available auth providers or registration of users.
Login through API does not start a new session, but instead returns JWT.
""" """
from datetime import datetime from datetime import datetime
from pprint import pprint from pprint import pprint

67
backend/api/state_api.py Normal file
View File

@@ -0,0 +1,67 @@
# Copyright (c) 2019. Tobias Kurze
"""
This module provides functions related to object states through the API.
"""
from datetime import datetime
from pprint import pprint
from flask_jwt_extended import jwt_required
from flask_restx import fields, Resource, inputs
from backend import db, app
from backend.api import api_state
from backend.api.models import recorder_model, recorder_model_model, recorder_command_model, state_model
from backend.cron import async_cron_recorder_checker
from backend.cron.cron_state_checker import StateChecker
from backend.models.recorder_model import Recorder, RecorderModel, RecorderCommand
from backend.models.room_model import Room
import backend.recorder_adapters as r_a
# ==
from backend.tools.recorder_state_checker import get_recorder_adapter, check_capture_agent_state, check_stream_sanity
@api_state.route('/recorder/<int:id>')
@api_state.response(404, 'Recorder not found')
@api_state.param('id', 'The recorder identifier')
class RecorderStateResource(Resource):
@jwt_required
@api_state.doc('get_recorder_state')
@api_state.marshal_with(state_model, skip_none=False)
def get(self, id):
"""Fetch a recorder given its identifier"""
recorder: Recorder = Recorder.query.get(id)
if recorder is None:
api_state.abort(404)
current_states_by_checker = async_cron_recorder_checker.get_current_state()
state = async_cron_recorder_checker.get_current_state_for_recorder_id(recorder.id)
if state is None:
state_checker = StateChecker([check_capture_agent_state], Recorder)
state_checker.add_object_to_state_check(recorder)
state_checker.check_object_state()
state = state_checker.get_current_state_for_recorder_id(recorder.id)
if not state.get('state_ok', False): # if state is not OK, return state -> no more checks!
return state
# do additional checks, such as: check for single color, sound check, etc.
stream_state = check_stream_sanity(recorder)
print(stream_state)
return stream_state
@api_state.route('/recorder')
class RecorderStateList(Resource):
@jwt_required
@api_state.doc('get_recorders_states')
@api_state.marshal_list_with(state_model, skip_none=False)
def get(self):
"""
Get state of all recorders
:return: state
"""
return Recorder.get_all()

View File

@@ -8,14 +8,14 @@ Login through API does not start a new session, but instead returns JWT.
from datetime import datetime from datetime import datetime
from pprint import pprint from pprint import pprint
from flask_jwt_extended import get_jwt_identity, jwt_required, current_user, verify_jwt_in_request from flask_jwt_extended import get_jwt_identity, jwt_required, current_user
from flask_restx import Resource, inputs, abort from flask_restx import Resource, fields, inputs, abort
from backend import db, app, jwt_auth from backend import db, app, jwt_auth
from backend.api import api_user from backend.api import api_user
from backend.api.models import user_model, recorder_model, generic_id_parser from backend.api.models import user_model, recorder_model, generic_id_parser
from backend.models.recorder_model import Recorder from backend.models import Recorder
from backend.models.user_model import User from backend.models.user_model import User, Group
user_update_parser = api_user.parser() user_update_parser = api_user.parser()
@@ -27,11 +27,10 @@ user_update_parser.add_argument('last_name', type=str, required=False, store_mis
@api_user.route('/profile') @api_user.route('/profile')
class Profile(Resource): class Profile(Resource):
@jwt_required() @jwt_required
@api_user.marshal_with(user_model) @api_user.marshal_with(user_model)
def get(self): def get(self):
"""Get infos about logged in user.""" """Get infos about logged in user."""
print("hey!")
current_user_id = get_jwt_identity() current_user_id = get_jwt_identity()
app.logger.info(current_user_id) app.logger.info(current_user_id)
return User.get_by_identifier(current_user_id) return User.get_by_identifier(current_user_id)
@@ -71,7 +70,7 @@ class UserFavoriteRecorders(Resource):
args = generic_id_parser.parse_args() args = generic_id_parser.parse_args()
current_user_id = get_jwt_identity() current_user_id = get_jwt_identity()
user = User.get_by_identifier(current_user_id) user = User.get_by_identifier(current_user_id)
print(user) print(args)
recorder = Recorder.get_by_identifier(args["id"]) recorder = Recorder.get_by_identifier(args["id"])
print(recorder) print(recorder)
if recorder is None: if recorder is None:
@@ -103,7 +102,7 @@ class UserList(Resource):
return User.get_all() return User.get_all()
@jwt_required @jwt_required
@api_user.doc('create_user') @api_user.doc('create_group')
@api_user.expect(user_model) @api_user.expect(user_model)
@api_user.marshal_with(user_model, code=201) @api_user.marshal_with(user_model, code=201)
def post(self): def post(self):

View File

@@ -54,7 +54,7 @@ def logout():
logout_user() logout_user()
@jwt_extended.additional_claims_loader @jwt_extended.user_claims_loader
def add_claims_to_access_token(user): def add_claims_to_access_token(user):
if isinstance(user, str): if isinstance(user, str):
return {} return {}
@@ -66,13 +66,13 @@ def user_identity_loader(user):
return user.email return user.email
@jwt_extended.user_lookup_loader @jwt_extended.user_loader_callback_loader
def user_loader_callback(identity): def user_loader_callback(identity):
print("### user_loader_callback_loader") print("### user_loader_callback_loader")
return User.get_by_identifier(identity) return User.get_by_identifier(identity)
@jwt_extended.token_in_blocklist_loader @jwt_extended.token_in_blacklist_loader
def check_if_token_in_blacklist(decrypted_token): def check_if_token_in_blacklist(decrypted_token):
jti = decrypted_token['jti'] jti = decrypted_token['jti']
return BlacklistToken.get_by_token(jti) is not None return BlacklistToken.get_by_token(jti) is not None

Binary file not shown.

View File

@@ -1,7 +1,98 @@
import logging # -*- coding: utf-8 -*-
cron_log_handler = logging.FileHandler(CRON_LOG_FILE) import logging
cron_logger = logging.getLogger("mal.cron") import random
import signal
import sys
import time
from logging.handlers import TimedRotatingFileHandler
from pprint import pprint
from backend import app, main_logger
from apscheduler.schedulers.background import BackgroundScheduler
from backend.cron.cron_state_checker import async_cron_recorder_checker
from backend.websocket.handlers import send_state_update_to_recorders
cron_log_handler = TimedRotatingFileHandler(app.config.get('CRON_LOG_FILE'), interval=1, when='d', backupCount=3)
cron_log_handler.setFormatter(logging.Formatter('[%(asctime)s] - %(funcName)20s() %(message)s'))
cron_logger = logging.getLogger("lrc.cron")
cron_logger.addHandler(cron_log_handler) cron_logger.addHandler(cron_log_handler)
logging.getLogger("apscheduler.scheduler").addHandler(cron_log_handler) logging.getLogger("apscheduler.scheduler").addHandler(cron_log_handler)
logging.getLogger("apscheduler.executors.default").addHandler(cron_log_handler) logging.getLogger("apscheduler.executors.default").addHandler(cron_log_handler)
scheduler = None
def get_default_scheduler():
cron_logger.debug("creating scheduler!")
global scheduler
scheduler = BackgroundScheduler(timezone='utc')
scheduler.daemonic = False
return scheduler
def add_default_jobs(sched=None, testing=False):
global scheduler
if sched is None:
sched = scheduler
if testing:
check_recorder_state_job = sched.add_job(async_cron_recorder_checker.check_object_state, 'interval', seconds=40,
id="check_recorder_state_job")
else:
check_recorder_state_job = sched.add_job(async_cron_recorder_checker.check_object_state, 'interval', minutes=2,
id="check_recorder_state_job")
"""
Job regularly sending the state to "frontend recorders" through websocket
"""
send_update_state_to_recorder_job = sched.add_job(
lambda: send_state_update_to_recorders(async_cron_recorder_checker.get_current_state()), 'interval', minutes=1,
id="send_update_state_to_recorder_job")
return [check_recorder_state_job, send_update_state_to_recorder_job]
def signal_handler(sig, frame):
print('You pressed Ctrl+C -> shutting down scheduler!')
if scheduler is not None:
scheduler.shutdown()
sys.exit(0)
if __name__ == '__main__':
# check_for_ingestibles_and_ingest()
# remove_obsolete_media_files_objects()
stream_handler = logging.StreamHandler()
stream_handler.setFormatter(
logging.Formatter('[%(asctime)s] {%(threadName)s} %(levelname)s in %(module)s, line %(lineno)d: %(message)s'))
cron_logger.addHandler(stream_handler)
cron_logger.setLevel(logging.INFO)
signal.signal(signal.SIGINT, signal_handler)
get_default_scheduler()
add_default_jobs(testing=True)
cron_logger.info("Starting internal scheduler")
scheduler.start()
c = 0
while c < 10:
sleep_time = random.randint(10, 20)
cron_logger.info("Sleeping for {}s".format(sleep_time))
time.sleep(sleep_time)
recorder_id = random.randint(0, 15)
cron_logger.info("Using recorder id {}".format(recorder_id))
async_cron_recorder_checker.add_object_to_state_check(recorder_id)
async_cron_recorder_checker.add_object_to_state_check(recorder_id + 1)
pprint(async_cron_recorder_checker.get_current_state())
while True:
user_in = input("Type >exit< to quit.")
if user_in == "exit" or user_in == ">exit<":
break
scheduler.shutdown()

View File

@@ -0,0 +1,165 @@
# -*- coding: utf-8 -*-
import copy
import datetime
import logging
from multiprocessing.context import TimeoutError
from multiprocessing.pool import ThreadPool
from pprint import pprint
from threading import Lock
from typing import Union, Callable, TypeVar, Generic, Set, List
from backend.models import Recorder
from backend.tools.recorder_state_checker import check_capture_agent_state, ping_capture_agent
logger = logging.getLogger("lrc.cron.recorder_state")
recorder_jobs_lock = Lock()
recorder_jobs = set()
NUM_THREADS = 8
T = TypeVar('T')
class StateChecker(Generic[T]):
"""
This class is designed generically to regularly check the state of objects with given function(s).
The determined state is stored "locally" in the state checker object and NOT reflected back to the checked objects!
It can be retrieved by calling get_current_state.
"""
def __init__(self, state_checker_func: Union[Callable, List[Callable]], type_to_check: T, type_name=None,
threads=NUM_THREADS):
self.num_threads = threads
self.lock = Lock()
self.jobs: Set[T] = set()
self.checker_func = state_checker_func
self.checker_type = type_to_check
self.update_state_lock = Lock()
self.state_results = {}
self.type_name = type_name if type_name is not None else self.checker_type.__name__
def add_object_to_state_check(self, object_to_check: Union[int, T]):
if isinstance(object_to_check, int):
if not hasattr(self.checker_type, 'get_by_identifier'):
logger.error(
'Can\'t add object to state check, as >get_by_identifier< not defined on checker_type ({})!'.format(
str(self.checker_type)))
return
object_to_check = self.checker_type.get_by_identifier(object_to_check)
if object_to_check is None:
logger.warning(
"Could not add object ({}) to state check, as specified >id ({})< could not be found / object is None".format(
self.type_name, object_to_check))
return
with self.lock:
if hasattr(object_to_check, 'name'):
name = object_to_check.name
else:
name = str(object_to_check)
if any([j.id == object_to_check.id for j in self.jobs]):
logger.info(
"Not adding {} ({}) ({}) to state check (already in job list)".format(object_to_check.id, name,
self.type_name))
else:
logger.debug("Adding {} to object ({}) to state check".format(self.type_name, name))
self.jobs.add(object_to_check)
def remove_recorder_from_state_check(self, object_to_check: Union[int, T]):
if isinstance(object_to_check, int):
object_to_check = self.checker_type.get_by_identifier(object_to_check)
if object_to_check is None:
logger.warning(
"Could not remove object ({}) from state check, as specified id could not be found / object is None".format(
self.type_name))
return
self.lock.acquire()
if hasattr(object_to_check, 'name'):
name = object_to_check.name
else:
name = str(object_to_check)
logger.debug("Removing {} from object ({}) to state check".format(self.type_name, name))
self.jobs.remove(object_to_check)
self.lock.release()
def execute_checker_func(self, func, jobs: List[T], object_states: dict) -> dict:
with ThreadPool(self.num_threads) as pool:
results = [pool.apply_async(func, (job,)) for job in jobs]
try:
state_results = [res.get(timeout=12) for res in results]
for r in state_results:
if r[0]: # ok :)
if object_states[r[2]].get('msg', "") == "unknown state!":
del object_states[r[2]]['msg']
ok = True
else:
ok = object_states[r[2]].get('state_ok', False),
object_states[r[2]] = {
'id': object_states[r[2]].get('id', None),
'msg': ", ".join([s for s in [object_states[r[2]].get('msg', None), r[1]] if s]),
'state_ok': ok}
else:
object_states[r[2]] = {'id': object_states[r[2]].get('id', None),
'msg': r[1],
'state_ok': False}
except TimeoutError as e:
logger.error("Timeout while performing state check func! {}".format(e))
return object_states
def check_object_state(self) -> dict:
logger.info("checking object ({}) state...".format(self.type_name))
self.lock.acquire()
jobs = list(self.jobs)
self.lock.release()
if len(jobs) <= 0:
logger.info("No objects ({}) to check... returning".format(self.type_name))
return {}
logger.info("checking state of {} recorders".format(len(jobs)))
object_states = {j.name: {'id': j.id, 'state_ok': False, 'msg': 'unknown state!'} for j in jobs}
if isinstance(self.checker_func, list):
for c_f in self.checker_func:
self.execute_checker_func(c_f, jobs, object_states)
else:
self.execute_checker_func(self.checker_func, jobs, object_states)
self.update_state_dict(object_states)
return object_states
def update_state_dict(self, object_states: dict):
self.update_state_lock.acquire()
for o_s in object_states.keys():
if o_s in self.state_results:
# update existing state
self.state_results[o_s] = {**object_states[o_s],
'time_stamp': datetime.datetime.now(datetime.timezone.utc).strftime(
"%d.%m.%Y - %H:%M:%S %Z"),
'previous': {'state_ok': self.state_results[o_s]['state_ok'],
'msg': self.state_results[o_s].get('msg', None),
'time_stamp': self.state_results[o_s].get('time_stamp', None)}}
else:
self.state_results[o_s] = object_states[o_s]
self.update_state_lock.release()
def get_current_state(self):
with self.update_state_lock:
return copy.deepcopy(self.state_results)
def get_current_state_for_recorder_name(self, recorder_name: str):
return self.get_current_state().get(recorder_name, None)
def get_current_state_for_recorder_id(self, recorder_id: int):
states = self.get_current_state()
for key in states:
state = states[key]
if state.get('id', None) == recorder_id: # found!
return state
return None
async_cron_recorder_checker = StateChecker([check_capture_agent_state, ping_capture_agent], Recorder)

View File

@@ -1,10 +1,10 @@
""" """
Import all models... Import all models...
""" """
from backend.models.access_control_model import *
from backend.models.example_model import * from backend.models.example_model import *
from backend.models.user_model import *
from backend.models.post_model import * from backend.models.post_model import *
from backend.models.recorder_model import * from backend.models.recorder_model import *
from backend.models.access_control_model import *
from backend.models.room_model import * from backend.models.room_model import *
from backend.models.user_model import *
from backend.models.virtual_command_model import * from backend.models.virtual_command_model import *

View File

@@ -21,12 +21,13 @@ class AccessControlEntry(db.Model):
name = db.Column(db.Unicode(127), unique=False, nullable=False) name = db.Column(db.Unicode(127), unique=False, nullable=False)
url = db.Column(db.Unicode(2047), unique=False, nullable=True, default="") url = db.Column(db.Unicode(2047), unique=False, nullable=True, default="")
required_permission_id = db.Column(db.Integer, db.ForeignKey("permission.id")) required_permission_id = db.Column(db.Integer, db.ForeignKey('permission.id'))
required_permission = db.relationship( required_permission = db.relationship('Permission', back_populates='access_control_entry')
"Permission", back_populates="access_control_entry"
)
__table_args__ = (CheckConstraint("length(name) > 2", name="name_min_length"),) __table_args__ = (
CheckConstraint('length(name) > 2',
name='name_min_length'),
)
def __init__(self, **kwargs): def __init__(self, **kwargs):
super(AccessControlEntry, self).__init__(**kwargs) super(AccessControlEntry, self).__init__(**kwargs)
@@ -55,24 +56,15 @@ class AccessControlEntry(db.Model):
return dict(id=self.id, name=self.name) return dict(id=self.id, name=self.name)
def toJSON(self): def toJSON(self):
return json.dumps( return json.dumps(self.to_dict(), default=lambda o: o.__dict__,
self.to_dict(), default=lambda o: o.__dict__, sort_keys=True, indent=4 sort_keys=True, indent=4)
)
def pre_fill_table(): def pre_fill_table():
a_es = { a_es = {"url": "", }
"url": "", access_entries = [AccessControlEntry(name=room['name'], number=room['room_number'],
} building_name=room['building_name'], building_number=room['building_number']) for room in
access_entries = [ a_es]
AccessControlEntry(
name=room["name"],
number=room["room_number"],
building_name=room["building_name"],
building_number=room["building_number"],
)
for room in a_es
]
try: try:
db.session.bulk_save_objects(access_entries) db.session.bulk_save_objects(access_entries)

View File

@@ -7,18 +7,9 @@ class ExampleDataItem(db.Model):
""" """
just an example class... just an example class...
""" """
id = db.Column(db.Integer, primary_key=True, autoincrement=True) id = db.Column(db.Integer, primary_key=True, autoincrement=True)
mac = db.Column(db.String(32), nullable=False, unique=True, index=True) mac = db.Column(db.String(32), nullable=False, unique=True, index=True)
uuid = db.Column( uuid = db.Column(db.String(36), nullable=False, unique=True, index=True, default=str(uuid.uuid4()))
db.String(36),
nullable=False,
unique=True,
index=True,
default=str(uuid.uuid4()),
)
some_string_value = db.Column(db.String, nullable=True, index=True) some_string_value = db.Column(db.String, nullable=True, index=True)
name = db.Column( name = db.Column(db.String(128), default="<not set>", nullable=False, index=True, unique=False)
db.String(128), default="<not set>", nullable=False, index=True, unique=False
)
description = db.Column(db.String(4096), nullable=True, unique=False) description = db.Column(db.String(4096), nullable=True, unique=False)

View File

@@ -0,0 +1,11 @@
class ModelBase:
def get(self, attribute_name, default_value=None):
if hasattr(self, attribute_name):
return getattr(self, attribute_name)
elif False: # a check for properties?
pass
elif default_value is not None:
return default_value
else:
raise KeyError("{} not found".format(attribute_name))

View File

@@ -10,11 +10,10 @@ class Post(db.Model):
""" """
A post example class A post example class
""" """
id = db.Column(db.Integer, primary_key=True) id = db.Column(db.Integer, primary_key=True)
body = db.Column(db.String(140)) body = db.Column(db.String(140))
timestamp = db.Column(db.DateTime) timestamp = db.Column(db.DateTime)
user_id = db.Column(db.Integer, db.ForeignKey("user.id")) user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
def __repr__(self): def __repr__(self):
return "<Post %r>" % self.body return '<Post %r>' % self.body

View File

@@ -8,8 +8,9 @@ import json
import pkgutil import pkgutil
import os import os
import re import re
from typing import Union
from sqlalchemy import MetaData from sqlalchemy import MetaData, ForeignKeyConstraint
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from sqlalchemy.ext.hybrid import hybrid_property from sqlalchemy.ext.hybrid import hybrid_property
from sqlalchemy.orm import validates from sqlalchemy.orm import validates
@@ -18,52 +19,82 @@ from backend import db, app, login_manager, LrcException
from sqlalchemy import or_ from sqlalchemy import or_
from datetime import datetime, timedelta from datetime import datetime, timedelta
from backend.models.virtual_command_model import ( from backend.models.model_base import ModelBase
virtual_command_recorder_command_table, from backend.models.virtual_command_model import virtual_command_recorder_command_table, virtual_command_recorder_table
virtual_command_recorder_table,
)
metadata = MetaData() metadata = MetaData()
# This is the association table for the many-to-many relationship between
# recorders and permissions.
recorder_permission_table = db.Table('recorder_permission',
db.Column('recorder_id', db.Integer,
db.ForeignKey('recorder.id',
onupdate="CASCADE",
ondelete="CASCADE"),
primary_key=True),
db.Column('permission_id', db.Integer,
db.ForeignKey('permission.id',
onupdate="CASCADE",
ondelete="CASCADE"),
primary_key=True),
extend_existing=True)
class RecorderModel(db.Model): # This is the association table for the many-to-many relationship between
__table_args__ = {"extend_existing": True} # recorders and recorderCommands and permissions.
recorder_rec_commands_permission_table = db.Table('recorder_rec_command_permission',
db.Column('recorder_id', db.Integer,
db.ForeignKey('recorder.id',
onupdate="CASCADE",
ondelete="CASCADE"),
primary_key=True),
db.Column('recorder_command_id', db.Integer,
db.ForeignKey('recorder_command.id',
onupdate="CASCADE",
ondelete="CASCADE"),
primary_key=True),
db.Column('permission_id', db.Integer,
db.ForeignKey('permission.id',
onupdate="CASCADE",
ondelete="CASCADE"),
primary_key=True),
extend_existing=True)
class RecorderModel(db.Model, ModelBase):
__table_args__ = {'extend_existing': True}
id = db.Column(db.Integer, autoincrement=True, primary_key=True) id = db.Column(db.Integer, autoincrement=True, primary_key=True)
created_at = db.Column(db.DateTime, nullable=False, default=datetime.utcnow()) created_at = db.Column(db.DateTime, nullable=False, default=datetime.utcnow())
last_time_modified = db.Column(db.DateTime, nullable=True, default=None) last_time_modified = db.Column(db.DateTime, nullable=True, default=None)
record_adapter_id = db.Column(db.Unicode(63), unique=True, nullable=False) record_adapter_id = db.Column(db.Unicode(63), unique=True, nullable=False)
model_name = db.Column(db.Unicode(63), unique=True, nullable=False) model_name = db.Column(db.Unicode(63), unique=True, nullable=False)
notes = db.Column(db.Unicode(255), unique=False, nullable=True, default=None) notes = db.Column(db.Unicode(255), unique=False, nullable=True, default=None)
recorder_commands = db.relationship( recorder_commands = db.relationship('RecorderCommand', back_populates='recorder_model')
"RecorderCommand", back_populates="recorder_model" recorders = db.relationship('Recorder', back_populates='recorder_model')
) checksum = db.Column(db.String(63), unique=True,
recorders = db.relationship("Recorder", back_populates="recorder_model") nullable=False) # checksum of the recorder commands! (see: model_updater.py)
checksum = db.Column(
db.String(63), unique=True, nullable=False
) # checksum of the recorder commands! (see: model_updater.py)
last_checksum_change = db.Column(db.DateTime, nullable=True, default=None) last_checksum_change = db.Column(db.DateTime, nullable=True, default=None)
_requires_user = db.Column(db.Integer, default=False, name="requires_user") _requires_user = db.Column(db.Integer, default=False, name='requires_user')
_requires_password = db.Column(db.Integer, default=True, name="requires_password") _requires_password = db.Column(db.Integer, default=True, name='requires_password')
@staticmethod @staticmethod
def get_all(): def get_all():
return RecorderModel.query.all() return RecorderModel.query.all()
@staticmethod
def get_by_id(id):
return RecorderModel.query.filter(RecorderModel.id == id).first()
@staticmethod @staticmethod
def get_by_name(name): def get_by_name(name):
return RecorderModel.query.filter(RecorderModel.model_name == name).first() return RecorderModel.query.filter(RecorderModel.model_name == name).first()
@staticmethod @staticmethod
def get_by_adapter_id(name): def get_by_adapter_id(name):
return RecorderModel.query.filter( return RecorderModel.query.filter(RecorderModel.record_adapter_id == name).first()
RecorderModel.record_adapter_id == name
).first()
@staticmethod @staticmethod
def get_where_adapter_id_contains(adapter_id): def get_where_adapter_id_contains(adapter_id):
return RecorderModel.query.filter( return RecorderModel.query.filter(RecorderModel.record_adapter_id.contains(adapter_id)).first()
RecorderModel.record_adapter_id.contains(adapter_id)
).first()
@staticmethod @staticmethod
def get_by_checksum(md5_sum): def get_by_checksum(md5_sum):
@@ -89,13 +120,11 @@ class RecorderModel(db.Model):
return self.model_name + " (record adapter: {})".format(self.record_adapter_id) return self.model_name + " (record adapter: {})".format(self.record_adapter_id)
class Recorder(db.Model): class Recorder(db.Model, ModelBase):
__table_args__ = {"extend_existing": True} __table_args__ = {'extend_existing': True}
id = db.Column(db.Integer, autoincrement=True, primary_key=True) id = db.Column(db.Integer, autoincrement=True, primary_key=True)
created_at = db.Column(db.DateTime, nullable=False, default=datetime.utcnow()) created_at = db.Column(db.DateTime, nullable=False, default=datetime.utcnow())
last_time_modified = db.Column( last_time_modified = db.Column(db.DateTime, nullable=False, default=datetime.utcnow())
db.DateTime, nullable=False, default=datetime.utcnow()
)
name = db.Column(db.Unicode(63), unique=True, nullable=False) name = db.Column(db.Unicode(63), unique=True, nullable=False)
model_name = db.Column(db.Unicode(63), unique=False, nullable=False) model_name = db.Column(db.Unicode(63), unique=False, nullable=False)
serial_number = db.Column(db.Unicode(63), unique=True, nullable=True) serial_number = db.Column(db.Unicode(63), unique=True, nullable=True)
@@ -111,21 +140,22 @@ class Recorder(db.Model):
ssh_port = db.Column(db.Integer, unique=False, nullable=False, default=22) ssh_port = db.Column(db.Integer, unique=False, nullable=False, default=22)
username = db.Column(db.String, nullable=True, default=None) username = db.Column(db.String, nullable=True, default=None)
password = db.Column(db.String, nullable=True, default=None) password = db.Column(db.String, nullable=True, default=None)
_configured_options_json_string = db.Column(db.UnicodeText, default="") _configured_options_json_string = db.Column(db.UnicodeText, default='')
_additional_notes_json_string = db.Column(db.UnicodeText, default="") _additional_notes_json_string = db.Column(db.UnicodeText, default='')
additional_camera_connected = db.Column(db.Boolean, default=False) additional_camera_connected = db.Column(db.Boolean, default=False)
firmware_version = db.Column(db.String, nullable=True, default=None) firmware_version = db.Column(db.String, nullable=True, default=None)
room_id = db.Column(db.Integer, db.ForeignKey("room.id")) archive_stream1 = db.Column(db.String, nullable=True, default=None)
room = db.relationship( archive_stream2 = db.Column(db.String, nullable=True, default=None)
"Room", uselist=False, back_populates="recorder" confidence_stream = db.Column(db.String, nullable=True, default=None)
) # one-to-one relation (uselist=False) room_id = db.Column(db.Integer, db.ForeignKey('room.id'))
recorder_model_id = db.Column(db.Integer, db.ForeignKey("recorder_model.id")) room = db.relationship('Room', uselist=False, back_populates='recorder') # one-to-one relation (uselist=False)
recorder_model = db.relationship("RecorderModel", back_populates="recorders") recorder_model_id = db.Column(db.Integer, db.ForeignKey('recorder_model.id'))
virtual_commands = db.relationship( recorder_model = db.relationship('RecorderModel', back_populates='recorders')
"VirtualCommand", virtual_commands = db.relationship('VirtualCommand', secondary=virtual_command_recorder_table,
secondary=virtual_command_recorder_table, back_populates='recorders')
back_populates="recorders",
) required_read_permissions = db.relationship('Permission', secondary=recorder_permission_table)
required_write_permissions = db.relationship('Permission', secondary=recorder_permission_table)
def __init__(self, **kwargs): def __init__(self, **kwargs):
super(Recorder, self).__init__(**kwargs) super(Recorder, self).__init__(**kwargs)
@@ -140,16 +170,16 @@ class Recorder(db.Model):
@staticmethod @staticmethod
def get_by_mac(mac: str): def get_by_mac(mac: str):
if mac is None or mac == "": if mac is None or mac == '':
return None return None
mac = mac.replace("-", ":").lower() mac = mac.replace('-', ':').lower()
return Recorder.query.filter(Recorder._mac == mac).first() return Recorder.query.filter(Recorder._mac == mac).first()
@staticmethod @staticmethod
def get_all(): def get_all():
return Recorder.query.all() return Recorder.query.all()
@validates("name") @validates('name')
def validate_name(self, key, value): def validate_name(self, key, value):
assert len(value) > 2 assert len(value) > 2
return value return value
@@ -163,9 +193,7 @@ class Recorder(db.Model):
self._configured_options_json_string = json.dumps(value) self._configured_options_json_string = json.dumps(value)
def add_configured_option(self, value: str): def add_configured_option(self, value: str):
self._configured_options_json_string = json.dumps( self._configured_options_json_string = json.dumps(self.configured_options.append(value))
self.configured_options.append(value)
)
@hybrid_property @hybrid_property
def additional_notes(self) -> list: def additional_notes(self) -> list:
@@ -176,9 +204,7 @@ class Recorder(db.Model):
self._additional_notes_json_string = json.dumps(value) self._additional_notes_json_string = json.dumps(value)
def add_additional_notes(self, value: str): def add_additional_notes(self, value: str):
self._additional_notes_json_string = json.dumps( self._additional_notes_json_string = json.dumps(self._additional_notes_json_string.append(value))
self._additional_notes_json_string.append(value)
)
@hybrid_property @hybrid_property
def mac(self) -> str: def mac(self) -> str:
@@ -186,10 +212,10 @@ class Recorder(db.Model):
@mac.setter @mac.setter
def mac(self, value: str): def mac(self, value: str):
if value is None or value == "": if value is None or value == '':
return return
if re.match("[0-9a-f]{2}([-:]?)[0-9a-f]{2}(\\1[0-9a-f]{2}){4}$", value.lower()): if re.match("[0-9a-f]{2}([-:]?)[0-9a-f]{2}(\\1[0-9a-f]{2}){4}$", value.lower()):
self._mac = value.replace("-", ":").lower() self._mac = value.replace('-', ':').lower()
else: else:
raise LrcException("'{}' is not a valid MAC Address!".format(value)) raise LrcException("'{}' is not a valid MAC Address!".format(value))
@@ -226,42 +252,49 @@ class Recorder(db.Model):
return dict(id=self.id, name=self.name) return dict(id=self.id, name=self.name)
def toJSON(self): def toJSON(self):
return json.dumps( return json.dumps(self.to_dict(), default=lambda o: o.__dict__,
self.to_dict(), default=lambda o: o.__dict__, sort_keys=True, indent=4 sort_keys=True, indent=4)
)
class RecorderCommand(db.Model): class RecorderCommandPermission(db.Model, ModelBase):
__table_args__ = {"extend_existing": True} __table_args__ = {'extend_existing': True}
"""Table containing permissions associated with groups.""" id = db.Column(db.Integer, autoincrement=True, primary_key=True)
recorder = db.relationship('Recorder')
recorder_id = db.Column(db.Integer, db.ForeignKey('recorder.id'))
recorder_command = db.relationship('RecorderCommand')
recorder_command_id = db.Column(db.Integer, db.ForeignKey('recorder_command.id'))
permission = db.relationship('Permission')
permission_id = db.Column(db.Integer, db.ForeignKey('permission.id'))
class RecorderCommand(db.Model, ModelBase):
__table_args__ = {'extend_existing': True}
id = db.Column(db.Integer, autoincrement=True, primary_key=True) id = db.Column(db.Integer, autoincrement=True, primary_key=True)
created_at = db.Column(db.DateTime, nullable=False, default=datetime.utcnow()) created_at = db.Column(db.DateTime, nullable=False, default=datetime.utcnow())
last_time_modified = db.Column( last_time_modified = db.Column(db.DateTime, nullable=True, default=datetime.utcnow())
db.DateTime, nullable=True, default=datetime.utcnow()
)
name = db.Column(db.Unicode(63), unique=True, nullable=False) name = db.Column(db.Unicode(63), unique=True, nullable=False)
alternative_name = db.Column( alternative_name = db.Column(db.Unicode(63), unique=True, nullable=True, default=None)
db.Unicode(63), unique=True, nullable=True, default=None
)
disabled = db.Column(db.Boolean, default=False) disabled = db.Column(db.Boolean, default=False)
description = db.Column(db.Unicode(511), nullable=True, default=None) description = db.Column(db.Unicode(511), nullable=True, default=None)
parameters_string = db.Column(db.String(2047), nullable=True) parameters_string = db.Column(db.String(2047), nullable=True)
recorder_model = db.relationship( recorder_model = db.relationship('RecorderModel', back_populates='recorder_commands')
"RecorderModel", back_populates="recorder_commands" recorder_model_id = db.Column(db.Integer, db.ForeignKey('recorder_model.id'))
) virtual_commands = db.relationship('VirtualCommand', secondary=virtual_command_recorder_command_table,
recorder_model_id = db.Column(db.Integer, db.ForeignKey("recorder_model.id")) back_populates='recorder_commands')
virtual_commands = db.relationship(
"VirtualCommand", required_show_permissions = db.relationship('RecorderCommandPermission')
secondary=virtual_command_recorder_command_table, required_execute_permissions = db.relationship('RecorderCommandPermission')
back_populates="recorder_commands",
)
@staticmethod @staticmethod
def get_all(): def get_all():
return RecorderCommand.query.all() return RecorderCommand.query.all()
@staticmethod
def get_by_identifier(identifier):
return RecorderCommand.query.filter(RecorderCommand.id == identifier).first()
@property @property
def parameters(self): def parameters(self) -> Union[dict, None]:
if self.parameters_string is None: if self.parameters_string is None:
return None return None
return json.loads(self.parameters_string) return json.loads(self.parameters_string)
@@ -269,3 +302,7 @@ class RecorderCommand(db.Model):
@parameters.setter @parameters.setter
def parameters(self, parameters_dict: dict): def parameters(self, parameters_dict: dict):
self.parameters_string = json.dumps(parameters_dict) self.parameters_string = json.dumps(parameters_dict)
if __name__ == '__main__':
Recorder(name="RecTest")

View File

@@ -8,13 +8,12 @@ import logging
from sqlalchemy import MetaData, CheckConstraint from sqlalchemy import MetaData, CheckConstraint
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from datetime import datetime from datetime import datetime, timedelta
from backend import db from backend import db, app, login_manager
from backend.models.recorder_model import Recorder
from backend.tools.scrape_rooms import scrape_rooms from backend.tools.scrape_rooms import scrape_rooms
logger = logging.getLogger("lrc." + __name__) logger = logging.getLogger("lrc."+__name__)
metadata = MetaData() metadata = MetaData()
@@ -23,22 +22,21 @@ class Room(db.Model):
id = db.Column(db.Integer, autoincrement=True, primary_key=True) id = db.Column(db.Integer, autoincrement=True, primary_key=True)
created_at = db.Column(db.DateTime, nullable=False, default=datetime.utcnow()) created_at = db.Column(db.DateTime, nullable=False, default=datetime.utcnow())
name = db.Column(db.Unicode(127), unique=False, nullable=False) name = db.Column(db.Unicode(127), unique=False, nullable=False)
alternate_name = db.Column( alternate_name = db.Column(db.Unicode(127), unique=False, nullable=True, default=None)
db.Unicode(127), unique=False, nullable=True, default=None
)
comment = db.Column(db.Unicode(2047), unique=False, nullable=True, default="") comment = db.Column(db.Unicode(2047), unique=False, nullable=True, default="")
number = db.Column(db.Unicode(63), unique=False, nullable=True) number = db.Column(db.Unicode(63), unique=False, nullable=True)
building_name = db.Column(db.Unicode(63), unique=False, nullable=True) building_name = db.Column(db.Unicode(63), unique=False, nullable=True)
building_number = db.Column(db.Unicode(63), unique=False, nullable=True) building_number = db.Column(db.Unicode(63), unique=False, nullable=True)
recorder = db.relationship( recorder = db.relationship('Recorder', uselist=False, back_populates='room') # one-to-one relation (uselist=False)
Recorder, uselist=False, back_populates="room"
) # one-to-one relation (uselist=False)
__table_args__ = (CheckConstraint("length(name) > 2", name="name_min_length"),) __table_args__ = (
CheckConstraint('length(name) > 2',
name='name_min_length'),
)
def __init__(self, **kwargs): def __init__(self, **kwargs):
db.Model.__init__(self, **kwargs) super(Room, self).__init__(**kwargs)
@staticmethod @staticmethod
def get_by_name(name): def get_by_name(name):
@@ -73,24 +71,17 @@ class Room(db.Model):
return dict(id=self.id, name=self.name) return dict(id=self.id, name=self.name)
def toJSON(self): def toJSON(self):
return json.dumps( return json.dumps(self.to_dict(), default=lambda o: o.__dict__,
self.to_dict(), default=lambda o: o.__dict__, sort_keys=True, indent=4 sort_keys=True, indent=4)
)
def pre_fill_table(): def pre_fill_table():
rooms = scrape_rooms() rooms = scrape_rooms()
logger.debug("tada") logger.debug("tada")
logger.debug("got {} rooms".format(len(rooms))) logger.debug("got {} rooms".format(len(rooms)))
db_rooms = [ db_rooms = [Room(name=room['name'], number=room['room_number'],
Room( building_name=room['building_name'], building_number=room['building_number']) for room in
name=room["name"], rooms]
number=room["room_number"],
building_name=room["building_name"],
building_number=room["building_number"],
)
for room in rooms
]
try: try:
db.session.bulk_save_objects(db_rooms) db.session.bulk_save_objects(db_rooms)

View File

@@ -4,10 +4,10 @@ Example user model and related models
""" """
import json import json
from sqlalchemy.orm import relation
from sqlalchemy import MetaData from sqlalchemy import MetaData
from backend import db, app, login_manager from backend import db, app, login_manager
from backend.models.recorder_model import Recorder
from backend.config import Config from backend.config import Config
from backend.models.post_model import Post from backend.models.post_model import Post
from backend.models.example_model import ExampleDataItem from backend.models.example_model import ExampleDataItem
@@ -21,76 +21,75 @@ from hashlib import md5
metadata = MetaData() metadata = MetaData()
followers = db.Table( followers = db.Table('followers',
"followers", db.Column('follower_id', db.Integer, db.ForeignKey('user.id')),
db.Column("follower_id", db.Integer, db.ForeignKey("user.id")), db.Column('followed_id', db.Integer, db.ForeignKey('user.id'))
db.Column("followed_id", db.Integer, db.ForeignKey("user.id")), )
)
acquaintances = db.Table( acquaintances = db.Table('acquaintances',
"acquaintances", db.Column('me_id', db.Integer, db.ForeignKey('user.id')),
db.Column("me_id", db.Integer, db.ForeignKey("user.id")), db.Column('acquaintance_id', db.Integer, db.ForeignKey('user.id'))
db.Column("acquaintance_id", db.Integer, db.ForeignKey("user.id")), )
)
user_favorite_recorders_table = db.Table( user_favorite_recorders_table = db.Table('user_favorite_recorders',
"user_favorite_recorders", db.Column('user_id', db.Integer,
db.Column( db.ForeignKey('user.id',
"user_id", onupdate="CASCADE",
db.Integer, ondelete="CASCADE"),
db.ForeignKey("user.id", onupdate="CASCADE", ondelete="CASCADE"), primary_key=True),
primary_key=True, db.Column('recorder_id', db.Integer,
), db.ForeignKey('recorder.id',
db.Column( onupdate="CASCADE",
"recorder_id", ondelete="CASCADE"),
db.Integer, primary_key=True))
db.ForeignKey("recorder.id", onupdate="CASCADE", ondelete="CASCADE"),
primary_key=True,
),
)
# This is the association table for the many-to-many relationship between # This is the association table for the many-to-many relationship between
# groups and members - this is, the memberships. # groups and members - this is, the memberships.
user_group_table = db.Table( user_group_table = db.Table('user_group',
"user_group", db.Column('user_id', db.Integer,
db.Column( db.ForeignKey('user.id',
"user_id", onupdate="CASCADE",
db.Integer, ondelete="CASCADE"),
db.ForeignKey("user.id", onupdate="CASCADE", ondelete="CASCADE"), primary_key=True),
primary_key=True, db.Column('group_id', db.Integer,
), db.ForeignKey('group.id',
db.Column( onupdate="CASCADE",
"group_id", ondelete="CASCADE"),
db.Integer, primary_key=True))
db.ForeignKey("group.id", onupdate="CASCADE", ondelete="CASCADE"),
primary_key=True,
),
)
# This is the association table for the many-to-many relationship between # This is the association table for the many-to-many relationship between
# groups and permissions. # groups and permissions.
group_permission_table = db.Table( group_permission_table = db.Table('group_permission',
"group_permission", db.Column('group_id', db.Integer,
db.Column( db.ForeignKey('group.id',
"group_id", onupdate="CASCADE",
db.Integer, ondelete="CASCADE"),
db.ForeignKey("group.id", onupdate="CASCADE", ondelete="CASCADE"), primary_key=True),
primary_key=True, db.Column('permission_id', db.Integer,
), db.ForeignKey('permission.id',
db.Column( onupdate="CASCADE",
"permission_id", ondelete="CASCADE"),
db.Integer, primary_key=True))
db.ForeignKey("permission.id", onupdate="CASCADE", ondelete="CASCADE"),
primary_key=True, # This is the association table for the many-to-many relationship between
), # users and permissions.
) user_permission_table = db.Table('user_permission',
db.Column('user_id', db.Integer,
db.ForeignKey('user.id',
onupdate="CASCADE",
ondelete="CASCADE"),
primary_key=True),
db.Column('permission_id', db.Integer,
db.ForeignKey('permission.id',
onupdate="CASCADE",
ondelete="CASCADE"),
primary_key=True))
class User(UserMixin, db.Model): class User(UserMixin, db.Model):
""" """
Example user model representation. Example user model representation.
""" """
id = db.Column(db.Integer, primary_key=True) id = db.Column(db.Integer, primary_key=True)
social_id = db.Column(db.Unicode(63), nullable=True, unique=True) social_id = db.Column(db.Unicode(63), nullable=True, unique=True)
nickname = db.Column(db.Unicode(63), index=True, unique=True) nickname = db.Column(db.Unicode(63), index=True, unique=True)
@@ -99,40 +98,33 @@ class User(UserMixin, db.Model):
email = db.Column(db.String(120), nullable=False, index=True, unique=True) email = db.Column(db.String(120), nullable=False, index=True, unique=True)
lang = db.Column(db.Unicode(32), index=False, unique=False) lang = db.Column(db.Unicode(32), index=False, unique=False)
timezone = db.Column(db.Unicode(63), index=False, unique=False) timezone = db.Column(db.Unicode(63), index=False, unique=False)
posts = db.relationship(Post, backref="author", lazy="dynamic") posts = db.relationship('Post', backref='author', lazy='dynamic')
example_data_item = db.relationship(ExampleDataItem, backref="owner") example_data_item = db.relationship('ExampleDataItem', backref='owner')
example_data_item_id = db.Column(db.ForeignKey(ExampleDataItem.id)) example_data_item_id = db.Column(db.ForeignKey(ExampleDataItem.id))
about_me = db.Column(db.Unicode(255)) about_me = db.Column(db.Unicode(255))
role = db.Column(db.Unicode(63)) role = db.Column(db.Unicode(63))
groups = db.relationship( groups = db.relationship('Group', secondary=user_group_table, back_populates='users')
"Group", secondary=user_group_table, back_populates="users" permissions = db.relationship('Permission', secondary=user_permission_table, back_populates='users')
)
password = db.Column(db.String(255), nullable=True) password = db.Column(db.String(255), nullable=True)
registered_on = db.Column(db.DateTime, nullable=False, default=datetime.utcnow()) registered_on = db.Column(db.DateTime, nullable=False, default=datetime.utcnow())
external_user = db.Column(db.Boolean, default=False) external_user = db.Column(db.Boolean, default=False)
last_seen = db.Column(db.DateTime, default=datetime.utcnow()) last_seen = db.Column(db.DateTime, default=datetime.utcnow())
last_time_modified = db.Column(db.DateTime, default=datetime.utcnow()) last_time_modified = db.Column(db.DateTime, default=datetime.utcnow())
jwt_exp_delta_seconds = db.Column(db.Integer, nullable=True) jwt_exp_delta_seconds = db.Column(db.Integer, nullable=True)
acquainted = db.relationship( acquainted = db.relationship('User',
"User", secondary=acquaintances,
secondary=acquaintances, primaryjoin=(acquaintances.c.me_id == id),
primaryjoin=(acquaintances.c.me_id == id), secondaryjoin=(acquaintances.c.acquaintance_id == id),
secondaryjoin=(acquaintances.c.acquaintance_id == id), backref=db.backref('acquaintances', lazy='dynamic'),
backref=db.backref("acquaintances", lazy="dynamic"), lazy='dynamic')
lazy="dynamic", followed = db.relationship('User',
) secondary=followers,
followed = db.relationship( primaryjoin=(followers.c.follower_id == id),
"User", secondaryjoin=(followers.c.followed_id == id),
secondary=followers, backref=db.backref('followers', lazy='dynamic'),
primaryjoin=(followers.c.follower_id == id), lazy='dynamic')
secondaryjoin=(followers.c.followed_id == id),
backref=db.backref("followers", lazy="dynamic"),
lazy="dynamic",
)
favorite_recorders = db.relationship( favorite_recorders = db.relationship('Recorder', secondary=user_favorite_recorders_table)
Recorder, secondary=user_favorite_recorders_table
)
def __init__(self, **kwargs): def __init__(self, **kwargs):
super(User, self).__init__(**kwargs) super(User, self).__init__(**kwargs)
@@ -151,13 +143,9 @@ class User(UserMixin, db.Model):
:param identifier: :param identifier:
:return: :return:
""" """
return User.query.filter( return User.query.filter(or_(User.nickname == identifier,
or_( User.email == identifier,
User.nickname == identifier, User.id == identifier)).first()
User.email == identifier,
User.id == identifier,
)
).first()
@staticmethod @staticmethod
@login_manager.user_loader @login_manager.user_loader
@@ -201,12 +189,12 @@ class User(UserMixin, db.Model):
:param nickname: :param nickname:
:return: :return:
""" """
return re.sub("[^a-zA-Z0-9_.]", "", nickname) return re.sub('[^a-zA-Z0-9_.]', '', nickname)
@classmethod @classmethod
def authenticate(cls, **kwargs): def authenticate(cls, **kwargs):
email = kwargs.get("email") email = kwargs.get('email')
password = kwargs.get("password") password = kwargs.get('password')
if not email or not password: if not email or not password:
return None return None
@@ -271,16 +259,16 @@ class User(UserMixin, db.Model):
:return: integer|string :return: integer|string
""" """
try: try:
payload = jwt.decode(auth_token, app.config.get("SECRET_KEY")) payload = jwt.decode(auth_token, app.config.get('SECRET_KEY'))
is_blacklisted_token = BlacklistToken.check_blacklist(auth_token) is_blacklisted_token = BlacklistToken.check_blacklist(auth_token)
if is_blacklisted_token: if is_blacklisted_token:
return "Token blacklisted. Please log in again." return 'Token blacklisted. Please log in again.'
else: else:
return payload["sub"] return payload['sub']
except jwt.ExpiredSignatureError: except jwt.ExpiredSignatureError:
return "Signature expired. Please log in again." return 'Signature expired. Please log in again.'
except jwt.InvalidTokenError: except jwt.InvalidTokenError:
return "Invalid token. Please log in again." return 'Invalid token. Please log in again.'
def encode_auth_token(self): def encode_auth_token(self):
""" """
@@ -289,11 +277,15 @@ class User(UserMixin, db.Model):
""" """
try: try:
payload = { payload = {
"exp": datetime.utcnow() + timedelta(days=0, hours=3, seconds=5), 'exp': datetime.utcnow() + timedelta(days=0, hours=3, seconds=5),
"iat": datetime.utcnow(), 'iat': datetime.utcnow(),
"sub": self.id, 'sub': self.id
} }
return jwt.encode(payload, app.config.get("SECRET_KEY"), algorithm="HS256") return jwt.encode(
payload,
app.config.get('SECRET_KEY'),
algorithm='HS256'
)
except Exception as e: except Exception as e:
return e return e
@@ -332,10 +324,7 @@ class User(UserMixin, db.Model):
:param size: :param size:
:return: :return:
""" """
return "https://s.gravatar.com/avatar/%s?d=mm&s=%d" % ( return 'https://s.gravatar.com/avatar/%s?d=mm&s=%d' % (md5(self.email.encode('utf-8')).hexdigest(), size)
md5(self.email.encode("utf-8")).hexdigest(),
size,
)
def acquaint(self, user): def acquaint(self, user):
""" """
@@ -363,35 +352,24 @@ class User(UserMixin, db.Model):
:param user: :param user:
:return: :return:
""" """
return ( return self.acquainted.filter(acquaintances.c.acquaintance_id == user.id).count() > 0
self.acquainted.filter(acquaintances.c.acquaintance_id == user.id).count()
> 0
)
def get_acquaintances(self): def get_acquaintances(self):
""" """
Returns the list of acquaintances. Returns the list of acquaintances.
:return: :return:
""" """
return ( return User.query.join(acquaintances, (acquaintances.c.acquaintance_id == User.id)).filter(
User.query.join(acquaintances, (acquaintances.c.acquaintance_id == User.id)) acquaintances.c.me_id == self.id).order_by(User.nickname.desc())
.filter(acquaintances.c.me_id == self.id)
.order_by(User.nickname.desc())
)
def shared_example_data_items(self): def shared_example_data_items(self):
""" """
Returns a list of the shared data items. Returns a list of the shared data items.
:return: :return:
""" """
return ( return ExampleDataItem.query.join(acquaintances,
ExampleDataItem.query.join( (acquaintances.c.acquaintance_id == ExampleDataItem.user_id)).filter(
acquaintances, acquaintances.c.me_id == self.id).order_by(ExampleDataItem.timestamp.desc())
(acquaintances.c.acquaintance_id == ExampleDataItem.user_id),
)
.filter(acquaintances.c.me_id == self.id)
.order_by(ExampleDataItem.timestamp.desc())
)
def follow(self, user): def follow(self, user):
""" """
@@ -426,33 +404,26 @@ class User(UserMixin, db.Model):
Returns list of followed posts. Returns list of followed posts.
:return: :return:
""" """
return ( return Post.query.join(followers, (followers.c.followed_id == Post.user_id)).filter(
Post.query.join(followers, (followers.c.followed_id == Post.user_id)) followers.c.follower_id == self.id).order_by(Post.timestamp.desc())
.filter(followers.c.follower_id == self.id)
.order_by(Post.timestamp.desc())
)
def to_dict(self): def to_dict(self):
# return self.__dict__ # return self.__dict__
return dict( return dict(id=self.id, email=self.email, groups=[g.to_dict() for g in self.groups])
id=self.id, email=self.email, groups=[g.to_dict() for g in self.groups]
)
def toJSON(self): def toJSON(self):
return json.dumps( return json.dumps(self.to_dict(), default=lambda o: o.__dict__,
self.to_dict(), default=lambda o: o.__dict__, sort_keys=True, indent=4 sort_keys=True, indent=4)
)
def __repr__(self): def __repr__(self):
return "<User %r>" % self.email return '<User %r>' % self.email
class BlacklistToken(db.Model): class BlacklistToken(db.Model):
""" """
Token Model for storing JWT tokens Token Model for storing JWT tokens
""" """
__tablename__ = 'blacklist_tokens'
__tablename__ = "blacklist_tokens"
id = db.Column(db.Integer, primary_key=True, autoincrement=True) id = db.Column(db.Integer, primary_key=True, autoincrement=True)
token = db.Column(db.String(500), unique=True, nullable=False) token = db.Column(db.String(500), unique=True, nullable=False)
@@ -463,7 +434,7 @@ class BlacklistToken(db.Model):
self.blacklisted_on = datetime.now() self.blacklisted_on = datetime.now()
def __repr__(self): def __repr__(self):
return "<id: token: {}".format(self.token) return '<id: token: {}'.format(self.token)
@staticmethod @staticmethod
def get_by_token(jwt_id): def get_by_token(jwt_id):
@@ -487,19 +458,10 @@ class Group(db.Model):
id = db.Column(db.Integer, autoincrement=True, primary_key=True) id = db.Column(db.Integer, autoincrement=True, primary_key=True)
name = db.Column(db.Unicode(63), unique=True, nullable=False) name = db.Column(db.Unicode(63), unique=True, nullable=False)
description = db.Column(db.Unicode(255), unique=False, nullable=True, default="") description = db.Column(db.Unicode(255), unique=False, nullable=True, default="")
users = db.relationship("User", secondary=user_group_table, back_populates="groups") users = db.relationship('User', secondary=user_group_table, back_populates='groups')
permissions = db.relationship( permissions = db.relationship('Permission', secondary=group_permission_table, back_populates='groups')
"Permission", secondary=group_permission_table, back_populates="groups"
)
def __init__(self, **kwargs): def __init__(self, **kwargs):
# get permissions from kwargs and make Permission objects out of them
permissions = kwargs.pop("permissions", [])
if permissions is not None:
for p in permissions:
permission = Permission(name=p)
if permission is not None:
self.permissions.append(permission)
super(Group, self).__init__(**kwargs) super(Group, self).__init__(**kwargs)
@staticmethod @staticmethod
@@ -526,40 +488,56 @@ class Group(db.Model):
return dict(id=self.id, name=self.name) return dict(id=self.id, name=self.name)
def toJSON(self): def toJSON(self):
return json.dumps( return json.dumps(self.to_dict(), default=lambda o: o.__dict__,
self.to_dict(), default=lambda o: o.__dict__, sort_keys=True, indent=4 sort_keys=True, indent=4)
)
class Permission(db.Model): class Permission(db.Model):
"""Table containing permissions associated with groups.""" """Table containing permissions associated with groups."""
id = db.Column(db.Integer, autoincrement=True, primary_key=True) id = db.Column(db.Integer, autoincrement=True, primary_key=True)
name = db.Column(db.Unicode(63), unique=True, nullable=False) name = db.Column(db.Unicode(63), unique=True, nullable=False)
description = db.Column(db.Unicode(511)) description = db.Column(db.Unicode(511))
groups = db.relationship( #read_only = db.Column(db.Boolean, default=False)
Group, secondary=group_permission_table, back_populates="permissions" groups = db.relationship(Group, secondary=group_permission_table,
) back_populates='permissions')
access_control_entry = db.relationship( users = db.relationship(User, secondary=user_permission_table,
"AccessControlEntry", back_populates="required_permission" back_populates='permissions')
) access_control_entry = db.relationship('AccessControlEntry', back_populates='required_permission')
@event.listens_for(User.__table__, "after_create") @staticmethod
def get_by_name(name):
"""
Find permission by name
:param name:
:return:
"""
return Permission.query.filter(Permission.name == name).first()
@staticmethod
def get_all():
"""
Return all permissions
:return:
"""
return Permission.query.all()
@event.listens_for(User.__table__, 'after_create')
def insert_initial_users(*args, **kwargs): def insert_initial_users(*args, **kwargs):
for u in app.config.get("USERS", []): for u in app.config.get("USERS", []):
db.session.add(User(**u)) db.session.add(User(**u))
db.session.commit() db.session.commit()
@event.listens_for(Permission.__table__, "after_create") @event.listens_for(Group.__table__, 'after_create')
def insert_initial_groups(*args, **kwargs):
for g in app.config.get("GROUPS", []):
db.session.add(Group(**g))
db.session.commit()
@event.listens_for(Permission.__table__, 'after_create')
def insert_initial_permissions(*args, **kwargs): def insert_initial_permissions(*args, **kwargs):
for p in app.config.get("PERMISSIONS", []): for p in app.config.get("PERMISSIONS", []):
db.session.add(Permission(name=p)) db.session.add(Permission(name=p))
db.session.commit() db.session.commit()
@event.listens_for(Group.__table__, "after_create")
def insert_initial_groups(*args, **kwargs):
for g in app.config.get("GROUPS", []):
db.session.add(Group(**g))
db.session.commit()

View File

@@ -8,39 +8,31 @@ from backend import db
# This is the association table for the many-to-many relationship between # This is the association table for the many-to-many relationship between
# virtual commands and recorder commands. # virtual commands and recorder commands.
virtual_command_recorder_command_table = db.Table( virtual_command_recorder_command_table = db.Table('virtual_command_recorder_command',
"virtual_command_recorder_command", db.Column('virtual_command_id', db.Integer,
db.Column( db.ForeignKey('virtual_command.id',
"virtual_command_id", onupdate="CASCADE",
db.Integer, ondelete="CASCADE"),
db.ForeignKey("virtual_command.id", onupdate="CASCADE", ondelete="CASCADE"), primary_key=True),
primary_key=True, db.Column('recorder_command_id', db.Integer,
), db.ForeignKey('recorder_command.id',
db.Column( onupdate="CASCADE",
"recorder_command_id", ondelete="CASCADE"),
db.Integer, primary_key=True))
db.ForeignKey("recorder_command.id", onupdate="CASCADE", ondelete="CASCADE"),
primary_key=True,
),
)
# This is the association table for the many-to-many relationship between # This is the association table for the many-to-many relationship between
# virtual commands and recorder commands. # virtual commands and recorder commands.
virtual_command_recorder_table = db.Table( virtual_command_recorder_table = db.Table('virtual_command_recorder',
"virtual_command_recorder", db.Column('virtual_command_id', db.Integer,
db.Column( db.ForeignKey('virtual_command.id',
"virtual_command_id", onupdate="CASCADE",
db.Integer, ondelete="CASCADE"),
db.ForeignKey("virtual_command.id", onupdate="CASCADE", ondelete="CASCADE"), primary_key=True),
primary_key=True, db.Column('recorder_id', db.Integer,
), db.ForeignKey('recorder.id',
db.Column( onupdate="CASCADE",
"recorder_id", ondelete="CASCADE"),
db.Integer, primary_key=True))
db.ForeignKey("recorder.id", onupdate="CASCADE", ondelete="CASCADE"),
primary_key=True,
),
)
class VirtualCommand(db.Model): class VirtualCommand(db.Model):
@@ -49,25 +41,16 @@ class VirtualCommand(db.Model):
name = db.Column(db.Unicode(63), unique=True, nullable=False) name = db.Column(db.Unicode(63), unique=True, nullable=False)
description = db.Column(db.Unicode(255), unique=False, nullable=True, default="") description = db.Column(db.Unicode(255), unique=False, nullable=True, default="")
recorders = db.relationship( recorders = db.relationship('Recorder', secondary=virtual_command_recorder_table,
"Recorder", back_populates='virtual_commands')
secondary=virtual_command_recorder_table,
back_populates="virtual_commands",
)
recorder_commands = db.relationship( recorder_commands = db.relationship('RecorderCommand', secondary=virtual_command_recorder_command_table,
"RecorderCommand", back_populates='virtual_commands')
secondary=virtual_command_recorder_command_table,
back_populates="virtual_commands",
)
# parent_virtual_command = db.relationship('VirtualCommand', back_populates='child_virtual_commands') # parent_virtual_command = db.relationship('VirtualCommand', back_populates='child_virtual_commands')
parent_virtual_command_id = db.Column( parent_virtual_command_id = db.Column(db.Integer, db.ForeignKey('virtual_command.id'))
db.Integer, db.ForeignKey("virtual_command.id") child_virtual_commands = db.relationship('VirtualCommand',
) backref=backref('parent_virtual_command', remote_side=[id]))
child_virtual_commands = db.relationship(
"VirtualCommand", backref=backref("parent_virtual_command", remote_side=[id])
)
command_order_string = db.Column(db.String) command_order_string = db.Column(db.String)
@@ -108,6 +91,5 @@ class VirtualCommand(db.Model):
return dict(id=self.id, name=self.name, description=self.description) return dict(id=self.id, name=self.name, description=self.description)
def toJSON(self): def toJSON(self):
return json.dumps( return json.dumps(self.to_dict(), default=lambda o: o.__dict__,
self.to_dict(), default=lambda o: o.__dict__, sort_keys=True, indent=4 sort_keys=True, indent=4)
)

View File

@@ -76,7 +76,7 @@ class TelnetAdapter(ABC):
def _run_cmd(self, cmd, timeout=1, auto_connect=True): def _run_cmd(self, cmd, timeout=1, auto_connect=True):
if self.tn is None and not auto_connect: if self.tn is None and not auto_connect:
raise LrcException("Not connected!") raise Exception("Not connected!")
elif self.tn is None: elif self.tn is None:
self._login() self._login()
self.tn.write(cmd) self.tn.write(cmd)

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,61 @@
import logging
from typing import Union
from backend.models import Recorder, RecorderCommand, LrcException
from backend.recorder_adapters import get_recorder_adapter_by_id
logger = logging.getLogger("lrc.recorder_adapters.helpers")
def validate_recorder_command_params(recorder_command: RecorderCommand, params: dict, fail_on_missing_params=False):
if recorder_command.parameters is None or len(recorder_command.parameters) == 0:
if len(params) == 0:
logger.debug("Number (0) of parameters matching expected number of args of command signature.")
return True
logger.info("More arguments specified ({}) than expected!".format(len(params)))
return False
for p_n in recorder_command.parameters:
p_t = recorder_command.parameters[p_n]
p = params.get(p_n, None)
if p is None:
if fail_on_missing_params:
return False
else:
if p_t == 'int':
params[p_n] = int(p)
return True
def get_function_from_recorder_command(recorder: Recorder, recorder_command: RecorderCommand,
connect_by_network_name=True):
adapter_name, function_name = recorder_command.name.split(':')
if connect_by_network_name and recorder.network_name is not None:
address = recorder.network_name
elif recorder.ip6 is not None:
address = recorder.ip6
else:
address = recorder.ip
logger.debug("Using {} to create recorder adapter to connect to {}.".format(address, recorder.name))
package_name, class_name = adapter_name.split('.')
adapter = get_recorder_adapter_by_id(class_name, address=address, user=recorder.username,
password=recorder.password, firmware_version=recorder.firmware_version)
logger.debug("Built adapter {}".format(adapter))
return getattr(adapter, function_name)
def execute_recorder_command(recorder: Recorder, recorder_command: RecorderCommand, params: Union[dict, None] = None,
connect_by_network_name=True):
if params is None:
params = dict()
if validate_recorder_command_params(recorder_command, params):
try:
func = get_function_from_recorder_command(recorder, recorder_command, connect_by_network_name)
logger.debug(
"Executing func: {} with params: '{}'".format(func, ", ".join(": ".join(str(_)) for _ in params.items())))
out = func(**params)
return True, out
except LrcException as e:
return False, str(e)
else:
logger.info("Could not validate given parameters!")
return False

View File

@@ -16,8 +16,8 @@ if not os.path.exists(fe_path) or not os.path.exists(os.path.join(fe_path, "inde
app.logger.critical( app.logger.critical(
"Frontend path and/or index.html does not exist! Please build frontend before continuing! " "Frontend path and/or index.html does not exist! Please build frontend before continuing! "
"You might want to go to ../frontend and continue from there.") "You might want to go to ../frontend and continue from there.")
print("ERROR: Frontend path wrong or index.html missing -> NO WEB-UI AVAILABLE!") print("FATAL: Frontend path wrong or index.html missing -> EXITING!")
#exit() exit()
fe_bp = Blueprint('frontend', __name__, url_prefix='/', template_folder=os.path.join(fe_path, "")) fe_bp = Blueprint('frontend', __name__, url_prefix='/', template_folder=os.path.join(fe_path, ""))

View File

@@ -19,12 +19,12 @@ def print_tn(tn_response):
print(str(tn_response).rstrip()) print(str(tn_response).rstrip())
def run_cmd(telnet_con, cmd, _timeout=1): def run_cmd(tn, cmd, timeout=1):
telnet_con.write(cmd) tn.write(cmd)
out = telnet_con.read_until_non_empty_line() out = tn.read_until_non_empty_line()
res = out res = out
while out is not None and out != "": while out is not None and out != "":
out = telnet_con.read_until_non_empty_line() out = tn.read_until_non_empty_line()
print(out) print(out)
res += out res += out
return res return res

View File

@@ -1,30 +1,13 @@
# pylint: disable=missing-module-docstring,missing-function-docstring,missing-class-docstring
from backend import LrcException from backend import LrcException
def exception_decorator(*exceptions): def exception_decorator(*exceptions):
"""
A decorator that catches specified exceptions and raises them as LrcExceptions.
Args:
*exceptions: A variable-length argument list of exceptions to catch.
Returns:
A decorator function that can be applied to other functions.
Example:
@exception_decorator(ValueError, TypeError)
def my_function():
# code here
"""
def decorator(func): def decorator(func):
def new_func(*args, **kwargs): def new_func(*args, **kwargs):
try: try:
ret = func(*args, **kwargs) ret = func(*args, **kwargs)
return ret return ret
except exceptions as e: except exceptions as e:
raise LrcException(e) from e raise LrcException(e)
return new_func return new_func
return decorator return decorator

View File

@@ -67,34 +67,40 @@ def update_recorder_models_database(drop: bool = False):
db.session.commit() db.session.commit()
r_as = get_defined_recorder_adapters() r_as = get_defined_recorder_adapters()
for r_a in r_as: for r_a in r_as:
if r_a.get('class') is None: # skip modules without class (helpers.py, e.g.)
continue
logger.info("Checking Recorder Adapter {} for possible updates".format(r_a["id"]))
try: try:
r_m = RecorderModel.get_by_adapter_id(r_a["id"]) r_m = RecorderModel.get_by_adapter_id(r_a["id"])
model_checksum = calculate_md5_checksum(dumps(r_a["commands"])) model_checksum = calculate_md5_checksum(dumps(r_a["commands"]))
logger.debug("Recorder Adapter commands checksum: {}".format(model_checksum))
logger.debug(r_m)
if r_m is None: if r_m is None:
r_m = RecorderModel(record_adapter_id=r_a["id"], model_name=r_a["name"], checksum=model_checksum, r_m = RecorderModel(record_adapter_id=r_a["id"], model_name=r_a["name"], checksum=model_checksum,
**r_a.get('class', {}).get_recorder_params()) **r_a.get('class').get_recorder_params())
db.session.add(r_m) db.session.add(r_m)
db.session.flush() db.session.flush()
db.session.refresh(r_m) db.session.refresh(r_m)
logger.debug("Creating command definitions for rec mod adapter {}".format(r_m.record_adapter_id)) logger.debug("Creating command definitions for rec mod adapter {}".format(r_m.record_adapter_id))
create_recorder_commands_for_recorder_adapter(r_a["commands"], r_m) create_recorder_commands_for_recorder_adapter(r_a["commands"], r_m)
else: else:
logger.debug("Model command checksum already in db: {}".format(r_m.checksum))
if r_m.model_name != r_a["name"]: if r_m.model_name != r_a["name"]:
r_m.model_name = r_a["name"] r_m.model_name = r_a["name"]
r_m.last_time_modified = datetime.utcnow() r_m.last_time_modified = datetime.utcnow()
if model_checksum != r_m.checksum: if model_checksum != r_m.checksum:
create_recorder_commands_for_recorder_adapter(r_a["commands"], r_m)
r_m.last_time_modified = datetime.utcnow() r_m.last_time_modified = datetime.utcnow()
r_m.checksum = model_checksum r_m.checksum = model_checksum
r_m.last_checksum_change = datetime.utcnow() r_m.last_checksum_change = datetime.utcnow()
logger.debug("Updating command definitions for rec mod adapter {}".format(r_m.record_adapter_id)) logger.debug("Updating command definitions for rec mod adapter {}".format(r_m.record_adapter_id))
create_recorder_commands_for_recorder_adapter(r_a["commands"], r_m)
except IntegrityError as e: except IntegrityError as e:
logger.error(e) logger.error(e)
db.session.rollback() db.session.rollback()
db.session.commit() db.session.commit()
def get_recorder_room(rec: dict) -> Room(): def get_recorder_room(rec: dict):
rooms = Room.get_by_building_number(rec.get('building', None)) rooms = Room.get_by_building_number(rec.get('building', None))
if rooms.count() <= 0: if rooms.count() <= 0:
logger.warning("Building {} unknown! Can not find room for recorder {}.".format(rec['building'], rec['name'])) logger.warning("Building {} unknown! Can not find room for recorder {}.".format(rec['building'], rec['name']))

View File

@@ -0,0 +1,300 @@
import json
import os
import logging
import subprocess
import threading
import time
from io import StringIO
from logging.handlers import MemoryHandler
from pprint import pprint
from typing import Union
import requests
from requests.auth import HTTPBasicAuth
from multiprocessing.pool import ThreadPool
from multiprocessing.context import TimeoutError
from ics import Calendar
from backend import LrcException
from backend.config import Config
from backend.models import Recorder, RecorderModel
from backend.recorder_adapters import RecorderAdapter
from backend.recorder_adapters.epiphan_base import Epiphan
from backend.recorder_adapters.extron_smp import SMP35x
from backend.tools.recorder_streams_sanity_checks import check_frame_is_valid, check_if_audio_is_valid
from backend.tools.send_mail import send_error_mail, get_smtp_error_handler
logger = logging.getLogger("lrc.tools.simple_state_checker")
smtp_error_handler = get_smtp_error_handler(subject="Errors have been detected while checking recorder states!")
# mem_handler = MemoryHandler(capacity=100, flushLevel=logging.FATAL, target=smtp_error_handler)
# mem_handler.setLevel(logging.WARNING)
rec_err_state_log_stream = StringIO()
rec_err_state_log_stream_handler = logging.StreamHandler(stream=rec_err_state_log_stream)
rec_err_state_log_stream_handler.setLevel(logging.WARNING)
logger.addHandler(rec_err_state_log_stream_handler)
# logger.addHandler(mem_handler)
session = requests.session()
session.auth = HTTPBasicAuth(Config.OPENCAST_USER, Config.OPENCAST_PW)
config = {'service_urls': {}}
recorders = None
agent_states_lock = threading.RLock()
agent_states = {}
def get_service_url(service_type: str):
if service_type in config['service_urls']:
return config['service_urls'][service_type]
params = {'serviceType': service_type}
url = Config.OPENCAST_URL + "/services/available.json"
res = session.get(url, params=params)
if res.ok:
service = res.json()["services"]["service"]
config["service_urls"][service_type] = service["host"] + \
service["path"]
return service["host"] + service["path"]
return None
def get_calender(rec_id):
params = {'agentid': rec_id}
url = get_service_url('org.opencastproject.scheduler') + "/calendars"
res = session.get(url, params=params)
if res.ok:
return Calendar(res.text)
def get_capture_agents():
url = get_service_url("org.opencastproject.capture.admin") + "/agents.json"
res = session.get(url)
if res.ok:
return res.json()["agents"]["agent"]
def get_recorder_details_old():
"""Temporary implementation using initial_recorders.json. Should be replaced by DB layer later!"""
global recorders
if recorders is None:
f = os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir, 'models', 'initial_recorders.json'))
with open(f, 'r') as json_file:
recorders = json.load(json_file)['recorders']
return recorders
def get_recorder_details():
"""New implementation using DB"""
global recorders
if recorders is None:
recorders = list(Recorder.get_all())
return recorders
def get_recorder_by_name(name: str):
for r in get_recorder_details():
logger.debug("Got recorder {}".format(r.get("name")))
if r.get("name") == name or r.get("name") + " Recorder" == name or r.get("name") == name + " Recorder":
return r
logger.error("Could not find recorder for name {}".format(name))
return None
def notify_users_of_problem(msg: str):
pass
def get_recorder_adapter(recorder_info: Union[dict, Recorder]) -> RecorderAdapter:
if recorder_info is None:
raise LrcException("Could not find recorder Adapter as recorder info was NONE!")
try:
type = recorder_info.get("type")
except KeyError:
type = RecorderModel.get_by_id(recorder_info.get('recorder_model_id')).model_name
if "SMP" in type:
rec = SMP35x(recorder_info.get('ip'), recorder_info.get('password'))
else:
rec = Epiphan(recorder_info.get('ip'), recorder_info.get("username"), recorder_info.get("password"))
return rec
def check_stream_sanity(recorder_agent: Union[Recorder, dict], recorder_adapter: RecorderAdapter = None):
if recorder_adapter is None:
recorder_info = get_recorder_by_name(recorder_agent.get('name'))
recorder_adapter = get_recorder_adapter(recorder_info)
if not recorder_adapter.is_recording():
return True, "not recording, so there is no stream!", recorder_agent.get('name')
if recorder_agent.get('archive_stream1') is None and recorder_agent.get(
'archive_stream2') is None: # fall back to default names and rtsp
archive_stream_1_url = "rtsp://{}/{}".format(recorder_adapter.address, Config.DEFAULT_ARCHIVE_STREAM_1_NAME)
archive_stream_2_url = "rtsp://{}/{}".format(recorder_adapter.address, Config.DEFAULT_ARCHIVE_STREAM_2_NAME)
else:
archive_stream_1_url = recorder_agent.get('archive_stream1')
archive_stream_2_url = recorder_agent.get('archive_stream2')
frame_msg = frame_msg2 = sound_msg = sound_msg2 = "unknown"
for i in range(0, Config.STREAM_SANITY_CHECK_RETRIES):
frame_ok, frame_msg = check_frame_is_valid(archive_stream_1_url, raise_errors=False)
if not frame_ok:
logger.warning(
"Archive stream 1 ({}) of {} is not ok (frame): {}".format(archive_stream_1_url,
recorder_agent.get('name'),
frame_msg))
frame_ok, frame_msg2 = check_frame_is_valid(archive_stream_2_url, raise_errors=False)
if not frame_ok:
logger.warning(
"Archive stream 2 {} of ({}) is not ok: {} (frame)".format(archive_stream_2_url,
recorder_agent.get('name'),
frame_msg2))
sound_ok, sound_msg = check_if_audio_is_valid(archive_stream_1_url, raise_errors=False)
if not sound_ok:
logger.warning(
"Archive stream 1 {} of ({}) is not ok (audio): {}".format(archive_stream_1_url,
recorder_agent.get('name'),
sound_msg))
sound_ok, sound_msg2 = check_if_audio_is_valid(archive_stream_2_url, raise_errors=False)
if not sound_ok:
logger.warning(
"Archive stream 2 {} of ({}) is not ok (audio): {}".format(archive_stream_2_url,
recorder_agent.get('name'),
sound_msg2))
if frame_ok and sound_ok:
return True, "At least one archive stream is fine (audio and image)! " \
"(s1: a: {}, v: {}, s2: a: {}, v: {})".format(sound_msg, frame_msg, sound_msg2,
frame_msg2), recorder_agent.get('name')
else:
time.sleep(Config.STREAM_SANITY_CHECK_INTERVAL_SEC)
error_msg = "After {} retries, stream checks failed and returned: archive_stream1: audio:{}, frame:{}, " \
"archive_stream2: audio:{}, frame:{}".format(Config.STREAM_SANITY_CHECK_RETRIES, sound_msg,
frame_msg, sound_msg2, frame_msg2)
logger.error(error_msg)
return False, error_msg, recorder_agent.get('name') # stream sanity check failed!
def check_capture_agent_state(recorder_agent: Union[Recorder, dict]):
if recorder_agent.get('offline', False):
logger.info("OK - Recorder {} is in offline / maintenance mode".format(recorder_agent.get('name')))
return True, "Recorder is in offline / maintenance mode", recorder_agent.get('name')
agent_state_error_msg = None
logger.debug("Checking Agent {}".format(recorder_agent.get('name')))
c = get_calender(recorder_agent.get('name'))
is_recording_in_calendar = len(list(c.timeline.now())) >= 1
if is_recording_in_calendar:
logger.info("{} has entry in Calender and should therefore be recording... checking now!".format(
recorder_agent.get('name')))
if recorder_agent['state'] == "capturing":
recorder_info = get_recorder_by_name(recorder_agent.get('name'))
try:
rec = get_recorder_adapter(recorder_info)
if rec.is_recording():
logger.info("OK recorder {} is recording :)".format(recorder_agent.get('name')))
with agent_states_lock:
agent_states[recorder_agent.get('name')] = 'OK - recorder is recording'
else:
logger.info(rec.get_recording_status())
logger.error(
"FATAL - recorder {} must be recording but is not!!!!".format(recorder_agent.get('name')))
agent_state_error_msg = "FATAL - recorder must be recording but is not!"
with agent_states_lock:
agent_states[recorder_agent['name']] = 'FATAL - recorder is NOT recording, but should!'
except LrcException as e:
logger.fatal("Exception occurred: {}".format(str(e)))
logger.error("Could not check state of recorder {}, Address: {}".format(recorder_agent.get('name'),
recorder_info.get('ip')))
else:
logger.error("FATAL: {} is not in capturing state...but should be!!".format(recorder_agent.get('name')))
agent_state_error_msg = "FATAL - is not in capturing state...but should be!"
else:
recorder_info = get_recorder_by_name(recorder_agent.get('name'))
try:
rec = get_recorder_adapter(recorder_info)
if rec.is_recording():
logger.error("FATAL - recorder must not be recording!!!!")
agent_state_error_msg = "FATAL - is not in capturing state...but should be!"
with agent_states_lock:
agent_states[recorder_agent.get('name')] = 'FATAL - recorder IS recording, but should NOT!'
else:
logger.info("OK recorder is not recording :)")
with agent_states_lock:
agent_states[recorder_agent.get('name')] = 'OK - recorder is NOT recording'
except LrcException as e:
logger.fatal("Exception occurred: {}".format(str(e)))
logger.error("Could not check state of recorder {}, Address: {}".format(recorder_agent.get('name'),
recorder_info.get('ip')))
agent_state_error_msg = "FATAL - Could not check state of recorder! Address: {}".format(
recorder_info.get('ip'))
if agent_state_error_msg is None:
return True, agent_states[recorder_agent.get('name')], recorder_agent.get('name')
return False, agent_state_error_msg, recorder_agent.get('name')
def ping_capture_agent(recorder_agent: Union[Recorder, dict]):
if recorder_agent.get('offline', False):
print("is offline!")
logger.info("OK - Ping skipped, recorder {} is in offline mode.".format(recorder_agent.get('name')))
return True, "Recorder is in offline / maintenance mode", recorder_agent.get('name')
recorder_ip = get_recorder_by_name(recorder_agent.get('name')).get('ip')
try:
subprocess.check_call(
['ping', '-W', '10', '-c', '2', recorder_ip],
# stderr=subprocess.STDOUT, # get all output
stdout=subprocess.DEVNULL, # suppress output
stderr=subprocess.DEVNULL,
universal_newlines=True # return string not bytes
)
logger.info("Successfully pinged {} ({}). :-)".format(recorder_agent.get('name'), recorder_ip))
return True, "Successfully pinged {}. :-)".format(recorder_agent.get('name')), recorder_agent.get('name')
except subprocess.CalledProcessError:
logger.error("Can not ping {} ({})!!".format(recorder_agent.get('name'), recorder_ip))
return False, "Unable to ping {} ({})".format(recorder_agent.get('name'), recorder_ip), recorder_agent.get(
'name')
if __name__ == '__main__':
agents = get_capture_agents()
logger.info("Got {} capture agents that will be checked...".format(len(agents)))
for a in agents:
agent_states[a.get('name')] = 'PROBLEMATIC - unknown'
# pool = ThreadPool(5)
# pool.map(check_capture_agent_state, agents)
NUM_THREADS = 8
recorders = get_recorder_details()
with ThreadPool(NUM_THREADS) as pool:
# results = [pool.apply_async(ping_capture_agent, (agent,)) for agent in agents]
results = [pool.apply_async(ping_capture_agent, (agent,)) for agent in recorders]
try:
[res.get(timeout=12) for res in results]
except TimeoutError as e:
logger.error("Timeout while pinging capture agent! {}".format(e))
with ThreadPool(NUM_THREADS) as pool:
results = [pool.apply_async(check_capture_agent_state, (agent,)) for agent in agents]
try:
[res.get(timeout=12) for res in results]
except TimeoutError as e:
logger.error("Timeout while getting capture agent state! {}".format(e))
logger.info("DONE checking capture agents / recorders!")
logged_events = rec_err_state_log_stream.getvalue()
if len(logged_events) > 0:
logged_events += "\n\n=============\nAgent States:\n\n{}".format(''.join(
"{:<48}: {}\n".format(a, agent_states[a]) for a in agent_states
))
send_error_mail(logged_events, "Errors have been detected while checking recorder states!")
# mem_handler.close()

View File

@@ -0,0 +1,119 @@
import io
import logging
import sys
import ffmpeg
import os
import tempfile
from PIL import Image
from pydub import AudioSegment
from pydub.playback import play
logger = logging.getLogger("lrc.tools.recorder_streams_sanity_checks")
def is_single_color_image(image):
single_color_image = True
color = {}
count = 0
color_channels = image.split()
for c in color_channels: # r, g, b
hist = c.histogram()
num_of_non_zero_values = len([v for v in hist if v != 0])
logger.debug("color_channel: {}, num_of_non_zero_values (NON-BLACK): {}".format(c, num_of_non_zero_values))
if num_of_non_zero_values > 1:
single_color_image = False
break
else:
color[count] = [i for i in enumerate(hist) if i[1] != 0][0][0]
count += 1
return single_color_image, color
def check_frame_is_valid(stream_url, raise_errors=True):
try:
frame, _ = (
ffmpeg
.input(stream_url)
.output('pipe:', vframes=1, format='image2', vcodec='mjpeg')
.run(capture_stdout=True, capture_stderr=True)
)
image = Image.open(io.BytesIO(frame))
single_color_image, color = is_single_color_image(image)
if not single_color_image:
image.show()
return True, "all good :-)"
else:
if all(map(lambda x: x == 0, color.values())):
return False, "Image is entirely black! (color: {} (RGB))".format(
':'.join([str(x) for x in color.values()]))
return False, "Image has only one single color! (color: {} (RGB))".format(
':'.join([str(x) for x in color.values()]))
except ffmpeg.Error as e:
msg = "Could not connect to stream URL or other error!"
logger.error(msg)
try:
msg += " ({})".format(e.stderr.decode('utf-8').strip().split("\n")[-1])
except IndexError:
pass
if raise_errors:
raise Exception(msg)
else:
return False, msg
def check_if_audio_is_valid(stream_url, sample_length_sec=3, lower_alert_limit_dBFS=-40.0, raise_errors=True):
file_name = tempfile.NamedTemporaryFile(suffix='.aac').name
if os.path.exists(file_name):
os.remove(file_name)
try:
frame, _ = (
ffmpeg
.input(stream_url, t=sample_length_sec)
.output(file_name)
.run(capture_stdout=True, capture_stderr=True)
)
sound = AudioSegment.from_file(file_name, "aac")
# print(sound.dBFS)
# play(sound)
if sound.max_dBFS == -float('inf'):
return False, "No active audio signal detected!"
elif sound.max_dBFS < lower_alert_limit_dBFS:
return False, "Very low volume (< {} dBFS) detected! ({})".format(lower_alert_limit_dBFS, sound.max_dBFS)
return True, "good audio signal detected! ({} max dBFS in {}s sample)".format(sound.max_dBFS, sample_length_sec)
except ffmpeg.Error as e:
msg = "Could not connect to stream URL or other error!"
logger.error(msg)
try:
msg += " ({})".format(e.stderr.decode('utf-8').strip().split("\n")[-1])
except IndexError:
pass
if raise_errors:
raise Exception(msg)
else:
return False, msg
"""
Following code is not working correctly - ffmpeg parameters are wrong.
"""
"""
def check_if_audio_is_valid_stream(stream_url, raise_errors=True):
audio, _ = (
ffmpeg
.input(stream_url, t=2)
.output('pipe:', f="adts", acodec='copy')
.run(capture_stdout=False, capture_stderr=False)
)
audio = io.BytesIO(audio)
sound = AudioSegment.from_file(audio, "aac")
play(sound)
# check_if_audio_is_valid('rtsp://172.22.246.207/extron1')
"""
if __name__ == '__main__':
# print(check_frame_is_valid('rtsp://172.22.246.207/extron2'))
print(check_if_audio_is_valid('rtsp://172.22.246.207/extron1'))

View File

@@ -1,221 +0,0 @@
import json
import os
import logging
import subprocess
import threading
from io import StringIO
from logging.handlers import MemoryHandler
import requests
from requests.auth import HTTPBasicAuth
from multiprocessing.pool import ThreadPool
from multiprocessing.context import TimeoutError
from tatsu.exceptions import ParseException
from ics import Calendar
from ics.grammar.parse import ParseError
from backend import LrcException
from backend.config import Config
from backend.recorder_adapters import RecorderAdapter
from backend.recorder_adapters.epiphan_base import Epiphan
from backend.recorder_adapters.extron_smp import SMP35x
from backend.tools.send_mail import send_error_mail, get_smtp_error_handler
logger = logging.getLogger("lrc.tools.simple_state_checker")
smtp_error_handler = get_smtp_error_handler(subject="Errors have been detected while checking recorder states!")
#mem_handler = MemoryHandler(capacity=100, flushLevel=logging.FATAL, target=smtp_error_handler)
#mem_handler.setLevel(logging.WARNING)
rec_err_state_log_stream = StringIO()
rec_err_state_log_stream_handler = logging.StreamHandler(stream=rec_err_state_log_stream)
rec_err_state_log_stream_handler.setLevel(logging.WARNING)
logger.addHandler(rec_err_state_log_stream_handler)
#logger.addHandler(mem_handler)
base_url = "https://oc-bib-admin.bibliothek.kit.edu"
session = requests.session()
session.auth = HTTPBasicAuth(Config.OPENCAST_USER, Config.OPENCAST_PW)
config = {'service_urls': {}}
recorders = None
agent_states_lock = threading.RLock()
agent_states = {}
def get_service_url(service_type: str):
if service_type in config['service_urls']:
return config['service_urls'][service_type]
params = {'serviceType': service_type}
url = base_url + "/services/available.json"
res = session.get(url, params=params)
if res.ok:
service = res.json()["services"]["service"]
config["service_urls"][service_type] = service["host"] + \
service["path"]
return service["host"] + service["path"]
return None
def get_calender(rec_id):
params = {'agentid': rec_id}
url = get_service_url('org.opencastproject.scheduler') + "/calendars"
res = session.get(url, params=params)
if res.ok:
try:
return Calendar(res.text)
except (ValueError, ParseException, IndexError, ParseError) as ex:
logger.debug(res.text)
logger.error("Could not parse calendar for agent {}! ({})".format(rec_id, ex))
return None
def get_capture_agents():
url = get_service_url("org.opencastproject.capture.admin") + "/agents.json"
res = session.get(url)
if res.ok:
return res.json()["agents"]["agent"]
def get_recorder_details():
"""Temporary implementation using initial_recorders.json. Should be replaced by DB layer later!"""
global recorders
if recorders is None:
f = os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir, 'models', 'initial_recorders.json'))
with open(f, 'r') as json_file:
recorders = json.load(json_file)['recorders']
return recorders
def get_recorder_by_name(name: str):
for r in get_recorder_details():
if r["name"] == name:
return r
return None
def notify_users_of_problem(msg: str):
pass
def get_recorder_adapter(recorder_info: dict) -> RecorderAdapter:
if "SMP" in recorder_info["type"]:
rec = SMP35x(recorder_info['ip'], recorder_info['password'])
else:
rec = Epiphan(recorder_info['ip'], recorder_info["username"], recorder_info["password"])
return rec
def check_capture_agent_state(a: dict):
logger.debug("Checking Agent {}".format(a['name']))
c = get_calender(a['name'])
if c is None:
logger.error("Could not get calendar for agent {}!".format(a['name']))
return
is_recording_in_calendar = len(list(c.timeline.now())) >= 1
if is_recording_in_calendar:
logger.info("{} has entry in Calender and should therefore be recording... checking now!".format(a['name']))
if a['state'] == "capturing":
recorder_info = get_recorder_by_name(a['name'])
if recorder_info is None:
logger.error("FATAL: Could not find recorder info for {}!".format(a['name']))
return
try:
rec = get_recorder_adapter(recorder_info)
if rec.is_recording():
logger.info("OK recorder {} is recording :)".format(a['name']))
with agent_states_lock:
agent_states[a['name']] = 'OK - recorder is recording'
else:
logger.info(rec.get_recording_status())
logger.error("FATAL - recorder {} must be recording but is not!!!!".format(a['name']))
with agent_states_lock:
agent_states[a['name']] = 'FATAL - recorder is NOT recording, but should!'
except LrcException as e:
logger.fatal("Exception occurred: {}".format(str(e)))
logger.error("Could not check state of recorder {}, Address: {}".format(a['name'], recorder_info['ip']))
else:
logger.error("FATAL: {} is not in capturing state...but should be!!".format(a['name']))
else:
recorder_info = get_recorder_by_name(a['name'])
if recorder_info is None:
logger.error("FATAL: Could not find recorder info for {}!".format(a['name']))
return
try:
rec = get_recorder_adapter(recorder_info)
if rec.is_recording():
logger.error("FATAL - recorder must not be recording!!!!")
with agent_states_lock:
agent_states[a['name']] = 'FATAL - recorder IS recording, but should NOT!'
else:
logger.info("OK recorder is not recording :)")
with agent_states_lock:
agent_states[a['name']] = 'OK - recorder is NOT recording'
except LrcException as e:
logger.fatal("Exception occurred: {}".format(str(e)))
logger.error("Could not check state of recorder {}, Address: {}".format(a['name'], recorder_info['ip']))
def ping_capture_agent(a: dict):
logger.debug(get_recorder_by_name(a['name']))
recorder = get_recorder_by_name(a['name'])
if recorder is None:
return
recorder_ip = recorder['ip']
try:
response = subprocess.check_call(
['ping', '-W', '10', '-c', '2', recorder_ip],
# stderr=subprocess.STDOUT, # get all output
stdout=subprocess.DEVNULL, # suppress output
stderr=subprocess.DEVNULL,
universal_newlines=True # return string not bytes
)
logger.info("Successfully pinged {} ({}). :-)".format(a['name'], recorder_ip))
except subprocess.CalledProcessError:
logger.error("Can not ping {} ({})!!".format(a['name'], recorder_ip))
agents = get_capture_agents()
logger.info("Got {} capture agents that will be checked...".format(len(agents)))
for a in agents:
agent_states[a['name']] = 'PROBLEMATIC - unknown'
# pool = ThreadPool(5)
# pool.map(check_capture_agent_state, agents)
NUM_THREADS = 8
with ThreadPool(NUM_THREADS) as pool:
results = [pool.apply_async(ping_capture_agent, (agent,)) for agent in agents]
try:
[res.get(timeout=12) for res in results]
except TimeoutError as e:
logger.error("Timeout while pinging capture agent! {}".format(e))
with ThreadPool(NUM_THREADS) as pool:
results = [pool.apply_async(check_capture_agent_state, (agent,)) for agent in agents]
try:
[res.get(timeout=12) for res in results]
except TimeoutError as e:
logger.error("Timeout while getting capture agent state! {}".format(e))
logger.info("DONE checking capture agents / recorders!")
logged_events = rec_err_state_log_stream.getvalue()
if len(logged_events) > 0:
logged_events += "\n\n=============\nAgent States:\n\n{}".format(''.join(
"{:<48}: {}\n".format(a, agent_states[a]) for a in agent_states
))
send_error_mail(logged_events, "Errors have been detected while checking recorder states!")
#mem_handler.close()

View File

@@ -1,2 +1,4 @@
# Copyright (c) 2019. Tobias Kurze # Copyright (c) 2019. Tobias Kurze
import backend.websocket.handlers

View File

@@ -1,8 +1,10 @@
import logging import logging
import threading import threading
from flask_jwt_extended import verify_jwt_in_request, get_current_user, jwt_required, get_jwt_claims, get_jwt_identity
from flask_login import current_user from flask_login import current_user
from flask_socketio import SocketIO, emit from flask_socketio import SocketIO, emit
from jwt import ExpiredSignatureError
from backend import app from backend import app
@@ -31,29 +33,60 @@ class WebSocketBase:
debug = self.flask_app_context.debug debug = self.flask_app_context.debug
socketio.run(self.flask_app_context, host=host, port=port, debug=debug) socketio.run(self.flask_app_context, host=host, port=port, debug=debug)
def send_test_msg(self):
socketio.emit('test', "tolle nachricht")
@staticmethod @staticmethod
@socketio.on('connect') @socketio.on('connect')
def connect_handler(): def connect_handler():
logger.debug("new connection...") logger.debug("new connection...")
print(current_user) try:
if current_user.is_authenticated: print(verify_jwt_in_request())
logger.debug("user is authenticated") print(get_jwt_identity())
print("allowed!") except ExpiredSignatureError:
emit('my response', logger.info("user is not authenticated! Signature expired.")
{'message': '{0} has joined'.format(current_user.name)}, except Exception as e:
broadcast=True)
else:
logger.info("user is not authenticated!") logger.info("user is not authenticated!")
print(str(e))
print(type(e))
print("not allowed!!") print("not allowed!!")
return False # not allowed here return False # not allowed here
logger.debug("user is authenticated")
print("allowed!")
return True
@staticmethod
@socketio.on('message')
def handle_message(message):
print('received message: ' + message)
@staticmethod
@socketio.on('json')
def handle_json(json):
print('received json: ' + str(json))
@staticmethod
def _request_request_recorder_status_update():
pass
@staticmethod
def _test_on_msg_func():
pass
@staticmethod
@socketio.on('update_message_test_blabla')
def handle_msg(msg=None):
print('received msg: ' + str(msg))
socketio.on_event('my event', WebSocketBase._test_on_msg_func, namespace='/')
@staticmethod
@socketio.on_error() @socketio.on_error()
def handle_error(self, error): def handle_error(error):
logger.error(error) logger.error(error)
print(error) print(error)
if __name__ == '__main__': if __name__ == '__main__':
wsb = WebSocketBase() wsb = WebSocketBase()
#wsb.start_websocket_in_thread(debug=True) # wsb.start_websocket_in_thread(debug=True)
wsb.start_websocket(debug=True) wsb.start_websocket(debug=True)

View File

@@ -0,0 +1,50 @@
import json
import logging
from backend.cron import async_cron_recorder_checker
from backend.websocket.base import socketio
logger = logging.getLogger("lrc.websocket.handlers")
recorder_state_checker = async_cron_recorder_checker
@socketio.on('request_recorder_state_updates')
def handle_request_recorder_state_updates_msg(recorder_id=None):
if recorder_id is None:
logger.warning("No recorder_id communicated, ignoring!")
return
logger.info("Adding recorder {} to state checker".format(recorder_id))
recorder_state_checker.add_object_to_state_check(recorder_id)
@socketio.on('force_recorder_state_update')
def handle_force_recorder_state_update_msg(recorder_id=None):
if recorder_id is None:
logger.warning("No recorder_id communicated, ignoring!")
return
current_states = recorder_state_checker.get_current_state()
for key in current_states:
state = current_states[key]
if state.get('id', None) == recorder_id:
logger.debug("Sending state to: {}".format(
'recorder_state_update_{}'.format(recorder_id)))
socketio.emit('recorder_state_update_{}'.format(recorder_id),
json.dumps(state))
return
logger.warning("Can't force update, no state found for recorder id {}.".format(recorder_id))
def send_state_update_to_recorders(recorder_results_dict: dict):
if len(recorder_results_dict) <= 0:
logger.debug("Sending state of recorders via web socket... => nothing to send!")
return
logger.debug("Sending state of recorders via web socket...")
for recorder_id in recorder_results_dict:
print(recorder_results_dict[recorder_id])
logger.debug("Sending state to: {}".format(
'recorder_state_update_{}'.format(recorder_results_dict[recorder_id].get('id'))))
socketio.emit('recorder_state_update_{}'.format(recorder_results_dict[recorder_id].get('id')),
json.dumps(recorder_results_dict[recorder_id]))

View File

@@ -3,19 +3,23 @@
import logging import logging
import threading import threading
import time import time
from socketIO_client import SocketIO, LoggingNamespace
from flask import Flask
from flask_socketio import SocketIO, emit
from backend import app
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
logging.basicConfig() logging.basicConfig()
token = "# replace with: JWT Access Token"
#print(token)
print("params")
#socketIO = SocketIO('127.0.0.1', 5443, params={'jwt': '{}'.format(token)})
print("headers")
#socketIO = SocketIO('127.0.0.1', 5443, headers={'Authorization': 'Bearer {}'.format(token)})
print("cookies")
socketIO = SocketIO('127.0.0.1', 5443, cookies={'access_token_cookie': '{}'.format(token)})
#socketio = SocketIO(message_queue="redis://") #socketio = SocketIO(message_queue="redis://")
socketio = SocketIO(app, port=5443, debug=True) socketio = SocketIO('127.0.0.1', 5443)
#socketio.run(app, host="localhost", port=5000) #socketio.run(app, host="localhost", port=5000)
#socketio.init_app(app, host="localhost", port=5000, cors_allowed_origins="*", ) #socketio.init_app(app, host="localhost", port=5000, cors_allowed_origins="*", )

View File

@@ -1,620 +0,0 @@
[2019-11-14 14:16:53,247] {MainThread} INFO in simple_state_checker, line 136: Got 19 capture agents that will be checked...
[2019-11-14 14:16:53,255] {Thread-1} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.11 Hertz-Hoersaal
[2019-11-14 14:16:53,255] {Thread-2} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.21 Carl-Benz-Hörsaal
[2019-11-14 14:16:53,256] {Thread-3} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.21 Gottlieb-Daimler-Hörsaal
[2019-11-14 14:16:53,261] {Thread-4} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.50 Bauingenieure Grosser Hoersaal
[2019-11-14 14:16:53,261] {Thread-5} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.50 Bauingenieure, Kleiner Hörsaal
[2019-11-14 14:16:53,386] {Thread-4} INFO in extron_smp, line 32: Connecting to 129.13.51.101 ...
[2019-11-14 14:16:54,344] {Thread-5} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:16:54,355] {Thread-5} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.91 Grashof-Hörsaal
[2019-11-14 14:16:54,811] {Thread-3} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:16:54,827] {Thread-3} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.91 Redtenbacher-Hörsaal
[2019-11-14 14:16:55,195] {Thread-2} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:16:55,206] {Thread-2} DEBUG in simple_state_checker, line 99: Checking Agent CS 11.40 Johann-Gottfried-Tulla-Hoersaal
[2019-11-14 14:16:55,988] {Thread-5} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:16:56,019] {Thread-5} DEBUG in simple_state_checker, line 99: Checking Agent CS 30.10 Nachrichtentechnik-Hoersaal NTI
[2019-11-14 14:16:56,265] {Thread-3} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:16:56,276] {Thread-3} DEBUG in simple_state_checker, line 99: Checking Agent CS 30.21 Gerthsen-Hörsaal
[2019-11-14 14:16:56,323] {Thread-1} INFO in simple_state_checker, line 103: CS 10.11 Hertz-Hoersaal has entry in Calender and should therfor be recording... checking now!
[2019-11-14 14:16:56,365] {Thread-1} INFO in simple_state_checker, line 107: CS 10.11 Hertz-Hoersaal is in capturing state, so there should be an entry in the calendar of the recorder, right? -> True
[2019-11-14 14:16:56,380] {Thread-1} INFO in extron_smp, line 32: Connecting to 129.13.51.109 ...
[2019-11-14 14:16:57,008] {Thread-2} INFO in extron_smp, line 32: Connecting to 129.13.51.106 ...
[2019-11-14 14:16:57,095] {Thread-5} INFO in extron_smp, line 32: Connecting to 129.13.51.104 ...
[2019-11-14 14:16:57,272] {Thread-1} INFO in simple_state_checker, line 115: 1
[2019-11-14 14:16:57,283] {Thread-1} ERROR in simple_state_checker, line 116: FATAL - recorder CS 10.11 Hertz-Hoersaal must be recording but is not!!!!
[2019-11-14 14:16:57,321] {Thread-1} DEBUG in simple_state_checker, line 99: Checking Agent CS 30.22 Gaede-Hoersaal
[2019-11-14 14:16:57,530] {Thread-3} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:16:57,541] {Thread-3} DEBUG in simple_state_checker, line 99: Checking Agent CS 30.22 Otto-Lehmann-Hoersaal - Mittl. HS
[2019-11-14 14:16:57,744] {Thread-1} INFO in extron_smp, line 32: Connecting to 129.13.51.108 ...
[2019-11-14 14:16:57,936] {Thread-5} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:16:57,952] {Thread-5} DEBUG in simple_state_checker, line 99: Checking Agent CS 30.41 Chemie-Hörsaal Nr.3
[2019-11-14 14:16:57,954] {Thread-2} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:16:57,965] {Thread-3} INFO in extron_smp, line 32: Connecting to 129.13.51.107 ...
[2019-11-14 14:16:57,966] {Thread-2} DEBUG in simple_state_checker, line 99: Checking Agent CS 30.46 Chemie Neuer Hoersaal
[2019-11-14 14:16:58,634] {Thread-1} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:16:58,655] {Thread-1} DEBUG in simple_state_checker, line 99: Checking Agent CS 30.95 Forum Hoersaal Audimax
[2019-11-14 14:16:58,902] {Thread-2} INFO in extron_smp, line 32: Connecting to 129.13.51.103 ...
[2019-11-14 14:16:58,904] {Thread-3} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:16:58,904] {Thread-3} DEBUG in simple_state_checker, line 99: Checking Agent CS 40.50 EBI Hoersaal
[2019-11-14 14:16:59,563] {Thread-5} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:16:59,579] {Thread-5} DEBUG in simple_state_checker, line 99: Checking Agent CS 50.24 Hörsaal-101
[2019-11-14 14:16:59,668] {Thread-3} INFO in extron_smp, line 32: Connecting to 129.13.51.105 ...
[2019-11-14 14:16:59,797] {Thread-2} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:16:59,818] {Thread-2} DEBUG in simple_state_checker, line 99: Checking Agent CS 50.35 Fasansengarten-Hörsaal (Hs a.F.)
[2019-11-14 14:17:00,764] {Thread-3} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:17:00,780] {Thread-3} DEBUG in simple_state_checker, line 99: Checking Agent Campus Ost 70.04 SR219
[2019-11-14 14:17:00,983] {Thread-3} INFO in extron_smp, line 32: Connecting to 129.13.51.110 ...
[2019-11-14 14:17:01,618] {Thread-3} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:17:01,670] {Thread-1} INFO in extron_smp, line 32: Connecting to 129.13.51.102 ...
[2019-11-14 14:17:01,960] {Thread-2} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:19:03,660] {Thread-4} CRITICAL in simple_state_checker, line 131: Exception occurred: LRC Exception: "[Errno 110] Connection timed out"
[2019-11-14 14:19:03,661] {Thread-4} ERROR in simple_state_checker, line 132: Could not check state of recorder CS 10.50 Bauingenieure Grosser Hoersaal, Address: 129.13.51.101
[2019-11-14 14:23:51,783] {MainThread} INFO in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-14 14:25:33,337] {MainThread} INFO in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-14 14:27:00,957] {MainThread} INFO in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-14 14:27:14,952] {MainThread} INFO in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-14 14:28:15,602] {MainThread} INFO in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-14 14:29:24,029] {MainThread} INFO in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-14 14:29:58,640] {MainThread} INFO in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-14 14:32:30,592] {MainThread} INFO in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-14 14:34:08,425] {MainThread} INFO in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-14 14:36:35,216] {MainThread} INFO in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-14 14:38:11,521] {MainThread} INFO in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-14 14:39:43,884] {MainThread} INFO in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-14 14:39:53,493] {MainThread} INFO in simple_state_checker, line 136: Got 19 capture agents that will be checked...
[2019-11-14 14:39:53,497] {Thread-1} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.11 Hertz-Hoersaal
[2019-11-14 14:39:53,497] {Thread-2} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.21 Carl-Benz-Hörsaal
[2019-11-14 14:39:53,497] {Thread-3} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.21 Gottlieb-Daimler-Hörsaal
[2019-11-14 14:39:53,500] {Thread-4} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.50 Bauingenieure Grosser Hoersaal
[2019-11-14 14:39:53,500] {Thread-5} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.50 Bauingenieure, Kleiner Hörsaal
[2019-11-14 14:39:53,619] {Thread-4} INFO in extron_smp, line 34: Connecting to 129.13.51.101 ...
[2019-11-14 14:39:54,913] {Thread-3} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:39:54,942] {Thread-3} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.91 Grashof-Hörsaal
[2019-11-14 14:39:55,178] {Thread-5} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:39:55,220] {Thread-5} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.91 Redtenbacher-Hörsaal
[2019-11-14 14:39:55,395] {Thread-2} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:39:55,416] {Thread-2} DEBUG in simple_state_checker, line 99: Checking Agent CS 11.40 Johann-Gottfried-Tulla-Hoersaal
[2019-11-14 14:39:56,048] {Thread-3} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:39:56,092] {Thread-1} INFO in simple_state_checker, line 103: CS 10.11 Hertz-Hoersaal has entry in Calender and should therfor be recording... checking now!
[2019-11-14 14:39:56,098] {Thread-3} DEBUG in simple_state_checker, line 99: Checking Agent CS 30.10 Nachrichtentechnik-Hoersaal NTI
[2019-11-14 14:39:56,108] {Thread-1} INFO in simple_state_checker, line 107: CS 10.11 Hertz-Hoersaal is in capturing state, so there should be an entry in the calendar of the recorder, right? -> True
[2019-11-14 14:39:56,127] {Thread-1} INFO in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-14 14:39:56,248] {Thread-5} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:39:56,269] {Thread-5} DEBUG in simple_state_checker, line 99: Checking Agent CS 30.21 Gerthsen-Hörsaal
[2019-11-14 14:39:56,761] {Thread-2} INFO in extron_smp, line 34: Connecting to 129.13.51.106 ...
[2019-11-14 14:39:57,066] {Thread-1} INFO in simple_state_checker, line 113: OK recorder CS 10.11 Hertz-Hoersaal is recording :)
[2019-11-14 14:39:57,087] {Thread-1} DEBUG in simple_state_checker, line 99: Checking Agent CS 30.22 Gaede-Hoersaal
[2019-11-14 14:39:57,545] {Thread-3} INFO in extron_smp, line 34: Connecting to 129.13.51.104 ...
[2019-11-14 14:39:57,770] {Thread-2} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:39:57,817] {Thread-2} DEBUG in simple_state_checker, line 99: Checking Agent CS 30.22 Otto-Lehmann-Hoersaal - Mittl. HS
[2019-11-14 14:39:58,182] {Thread-1} INFO in extron_smp, line 34: Connecting to 129.13.51.108 ...
[2019-11-14 14:39:58,362] {Thread-5} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:39:58,378] {Thread-5} DEBUG in simple_state_checker, line 99: Checking Agent CS 30.41 Chemie-Hörsaal Nr.3
[2019-11-14 14:39:58,425] {Thread-2} INFO in extron_smp, line 34: Connecting to 129.13.51.107 ...
[2019-11-14 14:39:58,599] {Thread-3} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:39:58,610] {Thread-3} DEBUG in simple_state_checker, line 99: Checking Agent CS 30.46 Chemie Neuer Hoersaal
[2019-11-14 14:39:58,950] {Thread-1} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:39:58,951] {Thread-1} DEBUG in simple_state_checker, line 99: Checking Agent CS 30.95 Forum Hoersaal Audimax
[2019-11-14 14:39:59,487] {Thread-2} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:39:59,513] {Thread-2} DEBUG in simple_state_checker, line 99: Checking Agent CS 40.50 EBI Hoersaal
[2019-11-14 14:39:59,604] {Thread-3} INFO in extron_smp, line 34: Connecting to 129.13.51.103 ...
[2019-11-14 14:39:59,908] {Thread-5} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:39:59,918] {Thread-5} DEBUG in simple_state_checker, line 99: Checking Agent CS 50.24 Hörsaal-101
[2019-11-14 14:40:00,356] {Thread-2} INFO in extron_smp, line 34: Connecting to 129.13.51.105 ...
[2019-11-14 14:40:00,436] {Thread-3} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:40:00,451] {Thread-3} DEBUG in simple_state_checker, line 99: Checking Agent CS 50.35 Fasansengarten-Hörsaal (Hs a.F.)
[2019-11-14 14:40:01,582] {Thread-2} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:40:01,608] {Thread-2} DEBUG in simple_state_checker, line 99: Checking Agent Campus Ost 70.04 SR219
[2019-11-14 14:40:01,789] {Thread-2} INFO in extron_smp, line 34: Connecting to 129.13.51.110 ...
[2019-11-14 14:40:02,326] {Thread-1} INFO in extron_smp, line 34: Connecting to 129.13.51.102 ...
[2019-11-14 14:40:02,497] {Thread-3} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:40:02,648] {Thread-2} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:57:02,691] {MainThread} INFO in simple_state_checker, line 132: Got 19 capture agents that will be checked...
[2019-11-14 14:57:50,259] {MainThread} INFO in simple_state_checker, line 132: Got 19 capture agents that will be checked...
[2019-11-14 14:57:50,261] {Thread-1} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.11 Hertz-Hoersaal
[2019-11-14 14:57:51,265] {Thread-1} INFO in simple_state_checker, line 103: CS 10.11 Hertz-Hoersaal has entry in Calender and should therefore be recording... checking now!
[2019-11-14 14:57:51,266] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-14 14:57:52,257] {Thread-1} INFO in simple_state_checker, line 109: OK recorder CS 10.11 Hertz-Hoersaal is recording :)
[2019-11-14 14:57:52,259] {Thread-3} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.21 Carl-Benz-Hörsaal
[2019-11-14 14:57:53,279] {Thread-3} INFO in simple_state_checker, line 125: OK recorder is not recording :)
[2019-11-14 14:57:53,279] {Thread-5} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.21 Gottlieb-Daimler-Hörsaal
[2019-11-14 14:57:53,873] {Thread-5} INFO in simple_state_checker, line 125: OK recorder is not recording :)
[2019-11-14 14:57:53,873] {Thread-1} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.50 Bauingenieure Grosser Hoersaal
[2019-11-14 14:57:53,892] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.101 ...
[2019-11-14 15:02:35,956] {MainThread} INFO in simple_state_checker, line 132: Got 19 capture agents that will be checked...
[2019-11-14 15:02:35,961] {Thread-1} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.11 Hertz-Hoersaal
[2019-11-14 15:02:35,961] {Thread-2} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.21 Carl-Benz-Hörsaal
[2019-11-14 15:02:35,961] {Thread-3} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.21 Gottlieb-Daimler-Hörsaal
[2019-11-14 15:02:35,962] {Thread-4} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.50 Bauingenieure Grosser Hoersaal
[2019-11-14 15:02:35,966] {Thread-5} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.50 Bauingenieure, Kleiner Hörsaal
[2019-11-14 15:02:36,101] {Thread-4} DEBUG in extron_smp, line 34: Connecting to 129.13.51.101 ...
[2019-11-14 15:02:36,867] {Thread-5} INFO in simple_state_checker, line 125: OK recorder is not recording :)
[2019-11-14 15:02:36,878] {Thread-5} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.91 Grashof-Hörsaal
[2019-11-14 15:02:37,586] {Thread-3} INFO in simple_state_checker, line 125: OK recorder is not recording :)
[2019-11-14 15:02:37,616] {Thread-3} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.91 Redtenbacher-Hörsaal
[2019-11-14 15:02:38,200] {Thread-2} INFO in simple_state_checker, line 125: OK recorder is not recording :)
[2019-11-14 15:02:38,232] {Thread-2} DEBUG in simple_state_checker, line 99: Checking Agent CS 11.40 Johann-Gottfried-Tulla-Hoersaal
[2019-11-14 15:02:38,487] {Thread-5} INFO in simple_state_checker, line 125: OK recorder is not recording :)
[2019-11-14 15:02:38,503] {Thread-5} DEBUG in simple_state_checker, line 99: Checking Agent CS 30.10 Nachrichtentechnik-Hoersaal NTI
[2019-11-14 15:02:38,698] {Thread-3} INFO in simple_state_checker, line 125: OK recorder is not recording :)
[2019-11-14 15:02:38,710] {Thread-3} DEBUG in simple_state_checker, line 99: Checking Agent CS 30.21 Gerthsen-Hörsaal
[2019-11-14 15:02:38,856] {Thread-1} INFO in simple_state_checker, line 103: CS 10.11 Hertz-Hoersaal has entry in Calender and should therefore be recording... checking now!
[2019-11-14 15:02:38,908] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-14 15:02:39,323] {Thread-5} DEBUG in extron_smp, line 34: Connecting to 129.13.51.104 ...
[2019-11-14 15:02:39,609] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.106 ...
[2019-11-14 15:02:39,673] {Thread-1} INFO in simple_state_checker, line 109: OK recorder CS 10.11 Hertz-Hoersaal is recording :)
[2019-11-14 15:02:39,693] {Thread-1} DEBUG in simple_state_checker, line 99: Checking Agent CS 30.22 Gaede-Hoersaal
[2019-11-14 15:02:40,001] {Thread-3} INFO in simple_state_checker, line 125: OK recorder is not recording :)
[2019-11-14 15:02:40,011] {Thread-3} DEBUG in simple_state_checker, line 99: Checking Agent CS 30.22 Otto-Lehmann-Hoersaal - Mittl. HS
[2019-11-14 15:02:40,115] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.108 ...
[2019-11-14 15:02:40,400] {Thread-3} DEBUG in extron_smp, line 34: Connecting to 129.13.51.107 ...
[2019-11-14 15:02:40,409] {Thread-5} INFO in simple_state_checker, line 125: OK recorder is not recording :)
[2019-11-14 15:02:40,410] {Thread-5} DEBUG in simple_state_checker, line 99: Checking Agent CS 30.41 Chemie-Hörsaal Nr.3
[2019-11-14 15:02:40,604] {Thread-2} INFO in simple_state_checker, line 125: OK recorder is not recording :)
[2019-11-14 15:02:40,621] {Thread-2} DEBUG in simple_state_checker, line 99: Checking Agent CS 30.46 Chemie Neuer Hoersaal
[2019-11-14 15:02:40,828] {Thread-1} INFO in simple_state_checker, line 125: OK recorder is not recording :)
[2019-11-14 15:02:40,828] {Thread-1} DEBUG in simple_state_checker, line 99: Checking Agent CS 30.95 Forum Hoersaal Audimax
[2019-11-14 15:02:41,529] {Thread-3} INFO in simple_state_checker, line 125: OK recorder is not recording :)
[2019-11-14 15:02:41,549] {Thread-3} DEBUG in simple_state_checker, line 99: Checking Agent CS 40.50 EBI Hoersaal
[2019-11-14 15:02:41,621] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.103 ...
[2019-11-14 15:02:41,849] {Thread-5} INFO in simple_state_checker, line 125: OK recorder is not recording :)
[2019-11-14 15:02:41,850] {Thread-5} DEBUG in simple_state_checker, line 99: Checking Agent CS 50.24 Hörsaal-101
[2019-11-14 15:02:42,655] {Thread-2} INFO in simple_state_checker, line 125: OK recorder is not recording :)
[2019-11-14 15:02:42,687] {Thread-2} DEBUG in simple_state_checker, line 99: Checking Agent CS 50.35 Fasansengarten-Hörsaal (Hs a.F.)
[2019-11-14 15:02:43,620] {Thread-3} DEBUG in extron_smp, line 34: Connecting to 129.13.51.105 ...
[2019-11-14 15:02:44,782] {Thread-3} INFO in simple_state_checker, line 125: OK recorder is not recording :)
[2019-11-14 15:02:44,876] {Thread-3} DEBUG in simple_state_checker, line 99: Checking Agent Campus Ost 70.04 SR219
[2019-11-14 15:02:45,342] {Thread-3} DEBUG in extron_smp, line 34: Connecting to 129.13.51.110 ...
[2019-11-14 15:02:45,550] {Thread-2} INFO in simple_state_checker, line 125: OK recorder is not recording :)
[2019-11-14 15:02:45,716] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.102 ...
[2019-11-14 15:02:46,265] {Thread-3} INFO in simple_state_checker, line 125: OK recorder is not recording :)
[2019-11-14 15:05:15,774] {MainThread} INFO in simple_state_checker, line 133: Got 19 capture agents that will be checked...
[2019-11-14 15:05:15,776] {Thread-1} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.11 Hertz-Hoersaal
[2019-11-14 15:05:15,776] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.21 Carl-Benz-Hörsaal
[2019-11-14 15:05:15,778] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.21 Gottlieb-Daimler-Hörsaal
[2019-11-14 15:05:15,778] {Thread-4} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.50 Bauingenieure Grosser Hoersaal
[2019-11-14 15:05:15,780] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.50 Bauingenieure, Kleiner Hörsaal
[2019-11-14 15:05:15,840] {Thread-4} DEBUG in extron_smp, line 34: Connecting to 129.13.51.101 ...
[2019-11-14 15:05:17,298] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:05:17,314] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.91 Grashof-Hörsaal
[2019-11-14 15:05:17,677] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:05:17,694] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.91 Redtenbacher-Hörsaal
[2019-11-14 15:05:17,842] {Thread-3} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:05:17,853] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 11.40 Johann-Gottfried-Tulla-Hoersaal
[2019-11-14 15:05:18,841] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:05:18,887] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.10 Nachrichtentechnik-Hoersaal NTI
[2019-11-14 15:05:19,101] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:05:19,137] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.21 Gerthsen-Hörsaal
[2019-11-14 15:05:19,149] {Thread-1} INFO in simple_state_checker, line 104: CS 10.11 Hertz-Hoersaal has entry in Calender and should therefore be recording... checking now!
[2019-11-14 15:05:19,210] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-14 15:05:19,575] {Thread-3} DEBUG in extron_smp, line 34: Connecting to 129.13.51.106 ...
[2019-11-14 15:05:19,886] {Thread-5} DEBUG in extron_smp, line 34: Connecting to 129.13.51.104 ...
[2019-11-14 15:05:20,281] {Thread-1} INFO in simple_state_checker, line 110: OK recorder CS 10.11 Hertz-Hoersaal is recording :)
[2019-11-14 15:05:20,282] {Thread-1} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.22 Gaede-Hoersaal
[2019-11-14 15:05:20,333] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:05:20,333] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.22 Otto-Lehmann-Hoersaal - Mittl. HS
[2019-11-14 15:05:20,383] {Thread-3} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:05:20,383] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.41 Chemie-Hörsaal Nr.3
[2019-11-14 15:05:20,616] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:05:20,632] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.46 Chemie Neuer Hoersaal
[2019-11-14 15:05:21,026] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.108 ...
[2019-11-14 15:05:21,456] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.107 ...
[2019-11-14 15:05:21,827] {Thread-1} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:05:21,848] {Thread-1} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.95 Forum Hoersaal Audimax
[2019-11-14 15:05:22,128] {Thread-5} DEBUG in extron_smp, line 34: Connecting to 129.13.51.103 ...
[2019-11-14 15:05:22,566] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:05:22,567] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 40.50 EBI Hoersaal
[2019-11-14 15:05:22,813] {Thread-3} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:05:22,819] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 50.24 Hörsaal-101
[2019-11-14 15:05:23,169] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:05:23,205] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 50.35 Fasansengarten-Hörsaal (Hs a.F.)
[2019-11-14 15:05:23,731] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.105 ...
[2019-11-14 15:05:24,776] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.102 ...
[2019-11-14 15:05:24,963] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:05:24,963] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent Campus Ost 70.04 SR219
[2019-11-14 15:05:25,042] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:05:25,131] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.110 ...
[2019-11-14 15:05:25,828] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:05:32,282] {MainThread} ERROR in simple_state_checker, line 145: Timeout while getting capture agent state!
[2019-11-14 15:07:35,727] {MainThread} INFO in simple_state_checker, line 133: Got 19 capture agents that will be checked...
[2019-11-14 15:07:35,729] {Thread-1} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.11 Hertz-Hoersaal
[2019-11-14 15:07:35,729] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.21 Carl-Benz-Hörsaal
[2019-11-14 15:07:35,729] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.21 Gottlieb-Daimler-Hörsaal
[2019-11-14 15:07:35,730] {Thread-4} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.50 Bauingenieure Grosser Hoersaal
[2019-11-14 15:07:35,730] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.50 Bauingenieure, Kleiner Hörsaal
[2019-11-14 15:07:35,863] {Thread-4} DEBUG in extron_smp, line 34: Connecting to 129.13.51.101 ...
[2019-11-14 15:07:37,438] {Thread-3} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:07:37,453] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.91 Grashof-Hörsaal
[2019-11-14 15:07:37,481] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:07:37,497] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.91 Redtenbacher-Hörsaal
[2019-11-14 15:07:37,744] {Thread-1} INFO in simple_state_checker, line 104: CS 10.11 Hertz-Hoersaal has entry in Calender and should therefore be recording... checking now!
[2019-11-14 15:07:37,760] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-14 15:07:37,996] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:07:38,011] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 11.40 Johann-Gottfried-Tulla-Hoersaal
[2019-11-14 15:07:38,259] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:07:38,259] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.10 Nachrichtentechnik-Hoersaal NTI
[2019-11-14 15:07:38,503] {Thread-3} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:07:38,519] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.21 Gerthsen-Hörsaal
[2019-11-14 15:07:38,612] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.106 ...
[2019-11-14 15:07:38,612] {Thread-1} INFO in simple_state_checker, line 110: OK recorder CS 10.11 Hertz-Hoersaal is recording :)
[2019-11-14 15:07:38,633] {Thread-1} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.22 Gaede-Hoersaal
[2019-11-14 15:07:38,813] {Thread-5} DEBUG in extron_smp, line 34: Connecting to 129.13.51.104 ...
[2019-11-14 15:07:39,478] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:07:39,504] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.22 Otto-Lehmann-Hoersaal - Mittl. HS
[2019-11-14 15:07:39,592] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.108 ...
[2019-11-14 15:07:39,602] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:07:39,625] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.41 Chemie-Hörsaal Nr.3
[2019-11-14 15:07:39,837] {Thread-3} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:07:39,871] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.107 ...
[2019-11-14 15:07:39,886] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.46 Chemie Neuer Hoersaal
[2019-11-14 15:07:40,494] {Thread-1} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:07:40,520] {Thread-1} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.95 Forum Hoersaal Audimax
[2019-11-14 15:07:40,903] {Thread-3} DEBUG in extron_smp, line 34: Connecting to 129.13.51.103 ...
[2019-11-14 15:07:41,107] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:07:41,108] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 40.50 EBI Hoersaal
[2019-11-14 15:07:41,186] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:07:41,186] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 50.24 Hörsaal-101
[2019-11-14 15:07:41,731] {Thread-3} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:07:41,747] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 50.35 Fasansengarten-Hörsaal (Hs a.F.)
[2019-11-14 15:07:41,869] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.105 ...
[2019-11-14 15:07:42,952] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:07:42,973] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent Campus Ost 70.04 SR219
[2019-11-14 15:07:43,268] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.110 ...
[2019-11-14 15:07:44,224] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:07:44,634] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.102 ...
[2019-11-14 15:07:44,636] {Thread-3} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:07:50,654] {MainThread} ERROR in simple_state_checker, line 145: Timeout while getting capture agent state!
[2019-11-14 15:07:50,706] {MainThread} INFO in simple_state_checker, line 147: DONE checking capture agents / recorders!
[2019-11-14 15:20:07,570] {MainThread} INFO in simple_state_checker, line 133: Got 19 capture agents that will be checked...
[2019-11-14 15:20:07,572] {Thread-1} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.11 Hertz-Hoersaal
[2019-11-14 15:20:07,572] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.21 Carl-Benz-Hörsaal
[2019-11-14 15:20:07,572] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.21 Gottlieb-Daimler-Hörsaal
[2019-11-14 15:20:07,575] {Thread-4} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.50 Bauingenieure Grosser Hoersaal
[2019-11-14 15:20:07,576] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.50 Bauingenieure, Kleiner Hörsaal
[2019-11-14 15:20:07,702] {Thread-4} DEBUG in extron_smp, line 34: Connecting to 129.13.51.101 ...
[2019-11-14 15:20:09,335] {Thread-3} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:20:09,341] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.91 Grashof-Hörsaal
[2019-11-14 15:20:09,527] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:20:09,543] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.91 Redtenbacher-Hörsaal
[2019-11-14 15:20:10,343] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:20:10,375] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 11.40 Johann-Gottfried-Tulla-Hoersaal
[2019-11-14 15:20:11,090] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:20:11,106] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.10 Nachrichtentechnik-Hoersaal NTI
[2019-11-14 15:20:11,158] {Thread-1} INFO in simple_state_checker, line 104: CS 10.11 Hertz-Hoersaal has entry in Calender and should therefore be recording... checking now!
[2019-11-14 15:20:11,164] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-14 15:20:11,194] {Thread-3} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:20:11,215] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.21 Gerthsen-Hörsaal
[2019-11-14 15:20:11,464] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.106 ...
[2019-11-14 15:20:11,990] {Thread-1} INFO in simple_state_checker, line 110: OK recorder CS 10.11 Hertz-Hoersaal is recording :)
[2019-11-14 15:20:12,017] {Thread-5} DEBUG in extron_smp, line 34: Connecting to 129.13.51.104 ...
[2019-11-14 15:20:12,028] {Thread-1} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.22 Gaede-Hoersaal
[2019-11-14 15:20:12,376] {Thread-3} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:20:12,387] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.22 Otto-Lehmann-Hoersaal - Mittl. HS
[2019-11-14 15:20:12,399] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.108 ...
[2019-11-14 15:20:12,400] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:20:12,401] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.41 Chemie-Hörsaal Nr.3
[2019-11-14 15:20:12,906] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:20:12,922] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.46 Chemie Neuer Hoersaal
[2019-11-14 15:20:13,086] {Thread-3} DEBUG in extron_smp, line 34: Connecting to 129.13.51.107 ...
[2019-11-14 15:20:13,264] {Thread-1} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:20:13,264] {Thread-1} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.95 Forum Hoersaal Audimax
[2019-11-14 15:20:13,943] {Thread-5} DEBUG in extron_smp, line 34: Connecting to 129.13.51.103 ...
[2019-11-14 15:20:13,999] {Thread-3} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:20:13,999] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 40.50 EBI Hoersaal
[2019-11-14 15:20:14,191] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:20:14,192] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 50.24 Hörsaal-101
[2019-11-14 15:20:14,849] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:20:14,938] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 50.35 Fasansengarten-Hörsaal (Hs a.F.)
[2019-11-14 15:20:16,840] {Thread-3} DEBUG in extron_smp, line 34: Connecting to 129.13.51.105 ...
[2019-11-14 15:20:18,101] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:20:18,112] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent Campus Ost 70.04 SR219
[2019-11-14 15:20:18,197] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.102 ...
[2019-11-14 15:20:18,231] {Thread-3} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:20:18,279] {Thread-5} DEBUG in extron_smp, line 34: Connecting to 129.13.51.110 ...
[2019-11-14 15:20:18,965] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:20:20,327] {Thread-1} WARNING in extron_smp, line 52: Could not login (as admin) with given password! 129.13.51.102
[2019-11-14 15:20:22,329] {Thread-1} ERROR in extron_smp, line 59: Could definitely not login (as admin) with given password! 129.13.51.102
[2019-11-14 15:20:24,046] {MainThread} ERROR in simple_state_checker, line 145: Timeout while getting capture agent state!
[2019-11-14 15:20:24,118] {MainThread} INFO in simple_state_checker, line 147: DONE checking capture agents / recorders!
[2019-11-14 15:41:07,178] {MainThread} INFO in simple_state_checker, line 133: Got 19 capture agents that will be checked...
[2019-11-14 15:41:07,180] {Thread-1} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.11 Hertz-Hoersaal
[2019-11-14 15:41:07,180] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.21 Carl-Benz-Hörsaal
[2019-11-14 15:41:07,180] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.21 Gottlieb-Daimler-Hörsaal
[2019-11-14 15:41:07,180] {Thread-4} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.50 Bauingenieure Grosser Hoersaal
[2019-11-14 15:41:07,180] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.50 Bauingenieure, Kleiner Hörsaal
[2019-11-14 15:41:07,312] {Thread-4} DEBUG in extron_smp, line 34: Connecting to 129.13.51.101 ...
[2019-11-14 15:41:08,619] {Thread-2} INFO in simple_state_checker, line 104: CS 10.21 Carl-Benz-Hörsaal has entry in Calender and should therefore be recording... checking now!
[2019-11-14 15:41:08,634] {Thread-2} ERROR in simple_state_checker, line 118: FATAL: CS 10.21 Carl-Benz-Hörsaal is not in capturing state...but should be!!
[2019-11-14 15:41:08,640] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.91 Grashof-Hörsaal
[2019-11-14 15:41:08,822] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:41:08,864] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.91 Redtenbacher-Hörsaal
[2019-11-14 15:41:08,864] {Thread-3} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:41:08,919] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 11.40 Johann-Gottfried-Tulla-Hoersaal
[2019-11-14 15:41:10,309] {Thread-1} INFO in simple_state_checker, line 104: CS 10.11 Hertz-Hoersaal has entry in Calender and should therefore be recording... checking now!
[2019-11-14 15:41:10,319] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-14 15:41:10,595] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:41:10,610] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.10 Nachrichtentechnik-Hoersaal NTI
[2019-11-14 15:41:10,683] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:41:10,706] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.21 Gerthsen-Hörsaal
[2019-11-14 15:41:10,708] {Thread-3} DEBUG in extron_smp, line 34: Connecting to 129.13.51.106 ...
[2019-11-14 15:41:11,243] {Thread-1} INFO in simple_state_checker, line 110: OK recorder CS 10.11 Hertz-Hoersaal is recording :)
[2019-11-14 15:41:11,253] {Thread-1} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.22 Gaede-Hoersaal
[2019-11-14 15:41:11,261] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.104 ...
[2019-11-14 15:41:11,594] {Thread-3} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:41:11,594] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.22 Otto-Lehmann-Hoersaal - Mittl. HS
[2019-11-14 15:41:11,606] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.108 ...
[2019-11-14 15:41:11,624] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:41:11,624] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.41 Chemie-Hörsaal Nr.3
[2019-11-14 15:41:12,061] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:41:12,092] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.46 Chemie Neuer Hoersaal
[2019-11-14 15:41:12,311] {Thread-1} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:41:12,327] {Thread-1} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.95 Forum Hoersaal Audimax
[2019-11-14 15:41:12,600] {Thread-3} DEBUG in extron_smp, line 34: Connecting to 129.13.51.107 ...
[2019-11-14 15:41:13,130] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.103 ...
[2019-11-14 15:41:13,666] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:41:13,677] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 40.50 EBI Hoersaal
[2019-11-14 15:41:13,757] {Thread-3} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:41:13,777] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 50.24 Hörsaal-101
[2019-11-14 15:41:14,070] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:41:14,096] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 50.35 Fasansengarten-Hörsaal (Hs a.F.)
[2019-11-14 15:41:15,923] {Thread-1} INFO in simple_state_checker, line 104: CS 30.95 Forum Hoersaal Audimax has entry in Calender and should therefore be recording... checking now!
[2019-11-14 15:41:15,944] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.102 ...
[2019-11-14 15:41:16,093] {Thread-5} DEBUG in extron_smp, line 34: Connecting to 129.13.51.105 ...
[2019-11-14 15:41:16,804] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:41:16,805] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent Campus Ost 70.04 SR219
[2019-11-14 15:41:16,964] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.110 ...
[2019-11-14 15:41:17,043] {Thread-1} INFO in simple_state_checker, line 110: OK recorder CS 30.95 Forum Hoersaal Audimax is recording :)
[2019-11-14 15:41:17,168] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:41:17,905] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:41:23,261] {MainThread} ERROR in simple_state_checker, line 145: Timeout while getting capture agent state!
[2019-11-14 15:41:23,280] {MainThread} INFO in simple_state_checker, line 147: DONE checking capture agents / recorders!
[2019-11-14 15:45:17,132] {MainThread} INFO in simple_state_checker, line 133: Got 19 capture agents that will be checked...
[2019-11-14 15:45:17,136] {Thread-1} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.11 Hertz-Hoersaal
[2019-11-14 15:45:17,136] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.21 Carl-Benz-Hörsaal
[2019-11-14 15:45:17,136] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.21 Gottlieb-Daimler-Hörsaal
[2019-11-14 15:45:17,138] {Thread-4} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.50 Bauingenieure Grosser Hoersaal
[2019-11-14 15:45:17,140] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.50 Bauingenieure, Kleiner Hörsaal
[2019-11-14 15:45:17,246] {Thread-4} DEBUG in extron_smp, line 34: Connecting to 129.13.51.101 ...
[2019-11-14 15:45:18,711] {Thread-2} INFO in simple_state_checker, line 104: CS 10.21 Carl-Benz-Hörsaal has entry in Calender and should therefore be recording... checking now!
[2019-11-14 15:45:18,727] {Thread-2} ERROR in simple_state_checker, line 118: FATAL: CS 10.21 Carl-Benz-Hörsaal is not in capturing state...but should be!!
[2019-11-14 15:45:18,763] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.91 Grashof-Hörsaal
[2019-11-14 15:45:18,861] {Thread-3} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:45:18,872] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.91 Redtenbacher-Hörsaal
[2019-11-14 15:45:18,931] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:45:18,941] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 11.40 Johann-Gottfried-Tulla-Hoersaal
[2019-11-14 15:45:19,971] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-14 15:45:20,433] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:45:20,448] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.10 Nachrichtentechnik-Hoersaal NTI
[2019-11-14 15:45:20,537] {Thread-3} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:45:20,547] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.21 Gerthsen-Hörsaal
[2019-11-14 15:45:20,571] {Thread-5} DEBUG in extron_smp, line 34: Connecting to 129.13.51.106 ...
[2019-11-14 15:45:21,177] {Thread-1} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:45:21,197] {Thread-1} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.22 Gaede-Hoersaal
[2019-11-14 15:45:21,408] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.104 ...
[2019-11-14 15:45:21,543] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:45:21,564] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.22 Otto-Lehmann-Hoersaal - Mittl. HS
[2019-11-14 15:45:22,149] {Thread-3} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:45:22,165] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.41 Chemie-Hörsaal Nr.3
[2019-11-14 15:45:22,247] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.108 ...
[2019-11-14 15:45:22,247] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:45:22,268] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.46 Chemie Neuer Hoersaal
[2019-11-14 15:45:22,378] {Thread-5} DEBUG in extron_smp, line 34: Connecting to 129.13.51.107 ...
[2019-11-14 15:45:22,958] {Thread-1} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:45:22,978] {Thread-1} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.95 Forum Hoersaal Audimax
[2019-11-14 15:45:23,300] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.103 ...
[2019-11-14 15:45:23,351] {Thread-3} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:45:23,351] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 40.50 EBI Hoersaal
[2019-11-14 15:45:23,400] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:45:23,400] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 50.24 Hörsaal-101
[2019-11-14 15:45:24,216] {Thread-3} DEBUG in extron_smp, line 34: Connecting to 129.13.51.105 ...
[2019-11-14 15:45:24,306] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:45:24,337] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 50.35 Fasansengarten-Hörsaal (Hs a.F.)
[2019-11-14 15:45:25,245] {Thread-3} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:45:25,266] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent Campus Ost 70.04 SR219
[2019-11-14 15:45:25,600] {Thread-3} DEBUG in extron_smp, line 34: Connecting to 129.13.51.110 ...
[2019-11-14 15:45:26,328] {Thread-3} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:45:26,923] {Thread-1} INFO in simple_state_checker, line 104: CS 30.95 Forum Hoersaal Audimax has entry in Calender and should therefore be recording... checking now!
[2019-11-14 15:45:26,923] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.102 ...
[2019-11-14 15:45:27,178] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:45:27,986] {Thread-1} INFO in simple_state_checker, line 110: OK recorder CS 30.95 Forum Hoersaal Audimax is recording :)
[2019-11-14 15:45:33,213] {MainThread} ERROR in simple_state_checker, line 145: Timeout while getting capture agent state!
[2019-11-14 15:45:33,239] {MainThread} INFO in simple_state_checker, line 147: DONE checking capture agents / recorders!
[2019-11-15 09:00:02,960] {MainThread} INFO in simple_state_checker, line 139: Got 19 capture agents that will be checked...
[2019-11-15 09:00:02,962] {Thread-1} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.11 Hertz-Hoersaal
[2019-11-15 09:00:02,962] {Thread-2} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.21 Carl-Benz-Hörsaal
[2019-11-15 09:00:02,963] {Thread-3} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.21 Gottlieb-Daimler-Hörsaal
[2019-11-15 09:00:02,963] {Thread-4} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.50 Bauingenieure Grosser Hoersaal
[2019-11-15 09:00:02,963] {Thread-5} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.50 Bauingenieure, Kleiner Hörsaal
[2019-11-15 09:00:03,163] {Thread-4} DEBUG in extron_smp, line 34: Connecting to 129.13.51.101 ...
[2019-11-15 09:00:04,443] {Thread-5} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:00:04,454] {Thread-5} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.91 Grashof-Hörsaal
[2019-11-15 09:00:04,925] {Thread-3} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:00:04,941] {Thread-3} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.91 Redtenbacher-Hörsaal
[2019-11-15 09:00:05,486] {Thread-2} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:00:05,507] {Thread-2} DEBUG in simple_state_checker, line 106: Checking Agent CS 11.40 Johann-Gottfried-Tulla-Hoersaal
[2019-11-15 09:00:05,732] {Thread-5} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:00:05,753] {Thread-5} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.10 Nachrichtentechnik-Hoersaal NTI
[2019-11-15 09:00:05,807] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-15 09:00:06,018] {Thread-3} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:00:06,028] {Thread-3} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.21 Gerthsen-Hörsaal
[2019-11-15 09:00:06,443] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.106 ...
[2019-11-15 09:00:06,557] {Thread-1} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:00:06,583] {Thread-1} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.22 Gaede-Hoersaal
[2019-11-15 09:00:06,654] {Thread-5} DEBUG in extron_smp, line 34: Connecting to 129.13.51.104 ...
[2019-11-15 09:00:07,016] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.108 ...
[2019-11-15 09:00:07,028] {Thread-3} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:00:07,028] {Thread-3} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.22 Otto-Lehmann-Hoersaal - Mittl. HS
[2019-11-15 09:00:07,313] {Thread-2} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:00:07,333] {Thread-2} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.41 Chemie-Hörsaal Nr.3
[2019-11-15 09:00:07,435] {Thread-3} DEBUG in extron_smp, line 34: Connecting to 129.13.51.107 ...
[2019-11-15 09:00:07,681] {Thread-5} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:00:07,696] {Thread-5} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.46 Chemie Neuer Hoersaal
[2019-11-15 09:00:07,847] {Thread-1} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:00:07,848] {Thread-1} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.95 Forum Hoersaal Audimax
[2019-11-15 09:00:08,514] {Thread-3} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:00:08,514] {Thread-3} DEBUG in simple_state_checker, line 106: Checking Agent CS 40.50 EBI Hoersaal
[2019-11-15 09:00:08,955] {Thread-2} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:00:08,970] {Thread-2} DEBUG in simple_state_checker, line 106: Checking Agent CS 50.24 Hörsaal-101
[2019-11-15 09:00:09,158] {Thread-5} DEBUG in extron_smp, line 34: Connecting to 129.13.51.103 ...
[2019-11-15 09:00:09,479] {Thread-3} DEBUG in extron_smp, line 34: Connecting to 129.13.51.105 ...
[2019-11-15 09:00:10,422] {Thread-5} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:00:10,443] {Thread-5} DEBUG in simple_state_checker, line 106: Checking Agent CS 50.35 Fasansengarten-Hörsaal (Hs a.F.)
[2019-11-15 09:00:10,679] {Thread-1} INFO in simple_state_checker, line 110: CS 30.95 Forum Hoersaal Audimax has entry in Calender and should therefore be recording... checking now!
[2019-11-15 09:00:10,679] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.102 ...
[2019-11-15 09:00:10,756] {Thread-3} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:00:10,757] {Thread-3} DEBUG in simple_state_checker, line 106: Checking Agent Campus Ost 70.04 SR219
[2019-11-15 09:00:10,870] {Thread-3} DEBUG in extron_smp, line 34: Connecting to 129.13.51.110 ...
[2019-11-15 09:00:11,648] {Thread-1} INFO in simple_state_checker, line 116: OK recorder CS 30.95 Forum Hoersaal Audimax is recording :)
[2019-11-15 09:00:11,726] {Thread-3} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:00:11,959] {Thread-5} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:00:18,601] {MainThread} ERROR in simple_state_checker, line 151: Timeout while getting capture agent state!
[2019-11-15 09:00:18,945] {MainThread} INFO in simple_state_checker, line 153: DONE checking capture agents / recorders!
[2019-11-15 09:01:48,428] {MainThread} INFO in simple_state_checker, line 139: Got 19 capture agents that will be checked...
[2019-11-15 09:01:48,431] {Thread-1} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.11 Hertz-Hoersaal
[2019-11-15 09:01:48,431] {Thread-2} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.21 Carl-Benz-Hörsaal
[2019-11-15 09:01:48,431] {Thread-3} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.21 Gottlieb-Daimler-Hörsaal
[2019-11-15 09:01:48,432] {Thread-4} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.50 Bauingenieure Grosser Hoersaal
[2019-11-15 09:01:48,432] {Thread-5} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.50 Bauingenieure, Kleiner Hörsaal
[2019-11-15 09:01:48,538] {Thread-4} DEBUG in extron_smp, line 34: Connecting to 129.13.51.101 ...
[2019-11-15 09:01:49,684] {Thread-5} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:01:49,690] {Thread-3} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:01:49,705] {Thread-5} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.91 Grashof-Hörsaal
[2019-11-15 09:01:49,716] {Thread-3} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.91 Redtenbacher-Hörsaal
[2019-11-15 09:01:50,134] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-15 09:01:50,252] {Thread-2} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:01:50,268] {Thread-2} DEBUG in simple_state_checker, line 106: Checking Agent CS 11.40 Johann-Gottfried-Tulla-Hoersaal
[2019-11-15 09:01:50,800] {Thread-3} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:01:50,806] {Thread-3} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.10 Nachrichtentechnik-Hoersaal NTI
[2019-11-15 09:01:50,914] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.106 ...
[2019-11-15 09:01:50,915] {Thread-1} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:01:50,915] {Thread-1} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.21 Gerthsen-Hörsaal
[2019-11-15 09:01:51,069] {Thread-5} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:01:51,080] {Thread-5} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.22 Gaede-Hoersaal
[2019-11-15 09:01:51,673] {Thread-2} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:01:51,720] {Thread-2} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.22 Otto-Lehmann-Hoersaal - Mittl. HS
[2019-11-15 09:01:51,726] {Thread-3} DEBUG in extron_smp, line 34: Connecting to 129.13.51.104 ...
[2019-11-15 09:01:51,893] {Thread-5} DEBUG in extron_smp, line 34: Connecting to 129.13.51.108 ...
[2019-11-15 09:01:52,152] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.107 ...
[2019-11-15 09:01:52,231] {Thread-1} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:01:52,232] {Thread-1} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.41 Chemie-Hörsaal Nr.3
[2019-11-15 09:01:52,598] {Thread-5} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:01:52,618] {Thread-3} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:01:52,623] {Thread-5} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.46 Chemie Neuer Hoersaal
[2019-11-15 09:01:52,637] {Thread-3} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.95 Forum Hoersaal Audimax
[2019-11-15 09:01:52,956] {Thread-2} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:01:52,956] {Thread-2} DEBUG in simple_state_checker, line 106: Checking Agent CS 40.50 EBI Hoersaal
[2019-11-15 09:01:53,679] {Thread-1} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:01:53,721] {Thread-1} DEBUG in simple_state_checker, line 106: Checking Agent CS 50.24 Hörsaal-101
[2019-11-15 09:01:54,025] {Thread-5} DEBUG in extron_smp, line 34: Connecting to 129.13.51.103 ...
[2019-11-15 09:01:54,184] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.105 ...
[2019-11-15 09:01:54,998] {Thread-2} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:01:55,019] {Thread-2} DEBUG in simple_state_checker, line 106: Checking Agent CS 50.35 Fasansengarten-Hörsaal (Hs a.F.)
[2019-11-15 09:01:55,087] {Thread-5} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:01:55,108] {Thread-5} DEBUG in simple_state_checker, line 106: Checking Agent Campus Ost 70.04 SR219
[2019-11-15 09:01:55,254] {Thread-5} DEBUG in extron_smp, line 34: Connecting to 129.13.51.110 ...
[2019-11-15 09:01:55,445] {Thread-3} INFO in simple_state_checker, line 110: CS 30.95 Forum Hoersaal Audimax has entry in Calender and should therefore be recording... checking now!
[2019-11-15 09:01:55,445] {Thread-3} DEBUG in extron_smp, line 34: Connecting to 129.13.51.102 ...
[2019-11-15 09:01:55,943] {Thread-5} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:01:56,200] {Thread-3} INFO in simple_state_checker, line 116: OK recorder CS 30.95 Forum Hoersaal Audimax is recording :)
[2019-11-15 09:01:56,274] {Thread-2} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:02:02,915] {MainThread} ERROR in simple_state_checker, line 151: Timeout while getting capture agent state!
[2019-11-15 09:02:03,114] {MainThread} INFO in simple_state_checker, line 153: DONE checking capture agents / recorders!
[2019-11-15 09:03:16,872] {MainThread} INFO in simple_state_checker, line 139: Got 19 capture agents that will be checked...
[2019-11-15 09:03:16,875] {Thread-1} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.11 Hertz-Hoersaal
[2019-11-15 09:03:16,875] {Thread-2} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.21 Carl-Benz-Hörsaal
[2019-11-15 09:03:16,875] {Thread-3} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.21 Gottlieb-Daimler-Hörsaal
[2019-11-15 09:03:16,875] {Thread-4} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.50 Bauingenieure Grosser Hoersaal
[2019-11-15 09:03:16,875] {Thread-5} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.50 Bauingenieure, Kleiner Hörsaal
[2019-11-15 09:03:16,991] {Thread-4} DEBUG in extron_smp, line 34: Connecting to 129.13.51.101 ...
[2019-11-15 09:03:17,901] {Thread-3} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:03:17,917] {Thread-5} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:03:17,917] {Thread-3} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.91 Grashof-Hörsaal
[2019-11-15 09:03:17,933] {Thread-5} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.91 Redtenbacher-Hörsaal
[2019-11-15 09:03:18,497] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-15 09:03:18,639] {Thread-2} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:03:18,655] {Thread-2} DEBUG in simple_state_checker, line 106: Checking Agent CS 11.40 Johann-Gottfried-Tulla-Hoersaal
[2019-11-15 09:03:19,037] {Thread-5} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:03:19,047] {Thread-5} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.10 Nachrichtentechnik-Hoersaal NTI
[2019-11-15 09:03:19,189] {Thread-1} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:03:19,210] {Thread-1} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.21 Gerthsen-Hörsaal
[2019-11-15 09:03:19,310] {Thread-3} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:03:19,329] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.106 ...
[2019-11-15 09:03:19,329] {Thread-3} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.22 Gaede-Hoersaal
[2019-11-15 09:03:19,638] {Thread-5} DEBUG in extron_smp, line 34: Connecting to 129.13.51.104 ...
[2019-11-15 09:03:20,151] {Thread-3} DEBUG in extron_smp, line 34: Connecting to 129.13.51.108 ...
[2019-11-15 09:03:20,331] {Thread-2} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:03:20,331] {Thread-2} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.22 Otto-Lehmann-Hoersaal - Mittl. HS
[2019-11-15 09:03:20,462] {Thread-1} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:03:20,462] {Thread-1} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.41 Chemie-Hörsaal Nr.3
[2019-11-15 09:03:20,494] {Thread-5} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:03:20,510] {Thread-5} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.46 Chemie Neuer Hoersaal
[2019-11-15 09:03:20,633] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.107 ...
[2019-11-15 09:03:21,032] {Thread-3} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:03:21,053] {Thread-3} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.95 Forum Hoersaal Audimax
[2019-11-15 09:03:21,466] {Thread-5} DEBUG in extron_smp, line 34: Connecting to 129.13.51.103 ...
[2019-11-15 09:03:21,730] {Thread-2} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:03:21,731] {Thread-2} DEBUG in simple_state_checker, line 106: Checking Agent CS 40.50 EBI Hoersaal
[2019-11-15 09:03:22,061] {Thread-1} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:03:22,072] {Thread-1} DEBUG in simple_state_checker, line 106: Checking Agent CS 50.24 Hörsaal-101
[2019-11-15 09:03:22,445] {Thread-5} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:03:22,492] {Thread-5} DEBUG in simple_state_checker, line 106: Checking Agent CS 50.35 Fasansengarten-Hörsaal (Hs a.F.)
[2019-11-15 09:03:23,370] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.105 ...
[2019-11-15 09:03:24,285] {Thread-2} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:03:24,306] {Thread-2} DEBUG in simple_state_checker, line 106: Checking Agent Campus Ost 70.04 SR219
[2019-11-15 09:03:24,454] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.110 ...
[2019-11-15 09:03:24,681] {Thread-3} INFO in simple_state_checker, line 110: CS 30.95 Forum Hoersaal Audimax has entry in Calender and should therefore be recording... checking now!
[2019-11-15 09:03:24,682] {Thread-3} DEBUG in extron_smp, line 34: Connecting to 129.13.51.102 ...
[2019-11-15 09:03:24,682] {Thread-5} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:03:25,308] {Thread-2} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:03:25,616] {Thread-3} INFO in simple_state_checker, line 116: OK recorder CS 30.95 Forum Hoersaal Audimax is recording :)
[2019-11-15 09:03:31,225] {MainThread} ERROR in simple_state_checker, line 151: Timeout while getting capture agent state!
[2019-11-15 09:03:31,461] {MainThread} INFO in simple_state_checker, line 153: DONE checking capture agents / recorders!
[2019-11-15 15:56:02,776] {MainThread} INFO in simple_state_checker, line 139: Got 19 capture agents that will be checked...
[2019-11-15 15:56:02,783] {Thread-1} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.11 Hertz-Hoersaal
[2019-11-15 15:56:02,783] {Thread-2} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.21 Carl-Benz-Hörsaal
[2019-11-15 15:56:02,784] {Thread-3} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.21 Gottlieb-Daimler-Hörsaal
[2019-11-15 15:56:02,787] {Thread-4} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.50 Bauingenieure Grosser Hoersaal
[2019-11-15 15:56:02,787] {Thread-5} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.50 Bauingenieure, Kleiner Hörsaal
[2019-11-15 15:56:02,903] {Thread-4} DEBUG in extron_smp, line 34: Connecting to 129.13.51.101 ...
[2019-11-15 15:56:04,320] {Thread-5} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 15:56:04,331] {Thread-5} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.91 Grashof-Hörsaal
[2019-11-15 15:56:04,366] {Thread-3} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 15:56:04,377] {Thread-3} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.91 Redtenbacher-Hörsaal
[2019-11-15 15:56:04,654] {Thread-2} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 15:56:04,741] {Thread-2} DEBUG in simple_state_checker, line 106: Checking Agent CS 11.40 Johann-Gottfried-Tulla-Hoersaal
[2019-11-15 15:56:04,779] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-15 15:56:05,377] {Thread-3} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 15:56:05,388] {Thread-3} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.10 Nachrichtentechnik-Hoersaal NTI
[2019-11-15 15:56:05,479] {Thread-5} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 15:56:05,492] {Thread-5} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.21 Gerthsen-Hörsaal
[2019-11-15 15:56:05,698] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.106 ...
[2019-11-15 15:56:06,048] {Thread-1} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 15:56:06,105] {Thread-1} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.22 Gaede-Hoersaal
[2019-11-15 15:56:06,320] {Thread-3} DEBUG in extron_smp, line 34: Connecting to 129.13.51.104 ...
[2019-11-15 15:56:06,752] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.108 ...
[2019-11-15 15:56:06,834] {Thread-5} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 15:56:06,834] {Thread-5} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.22 Otto-Lehmann-Hoersaal - Mittl. HS
[2019-11-15 15:56:06,844] {Thread-2} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 15:56:06,845] {Thread-2} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.41 Chemie-Hörsaal Nr.3
[2019-11-15 15:56:07,320] {Thread-3} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 15:56:07,336] {Thread-3} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.46 Chemie Neuer Hoersaal
[2019-11-15 15:56:07,555] {Thread-5} DEBUG in extron_smp, line 34: Connecting to 129.13.51.107 ...
[2019-11-15 15:56:07,567] {Thread-1} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 15:56:07,568] {Thread-1} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.95 Forum Hoersaal Audimax
[2019-11-15 15:56:08,323] {Thread-5} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 15:56:08,324] {Thread-5} DEBUG in simple_state_checker, line 106: Checking Agent CS 40.50 EBI Hoersaal
[2019-11-15 15:56:08,638] {Thread-2} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 15:56:08,655] {Thread-2} DEBUG in simple_state_checker, line 106: Checking Agent CS 50.24 Hörsaal-101
[2019-11-15 15:56:08,687] {Thread-3} DEBUG in extron_smp, line 34: Connecting to 129.13.51.103 ...
[2019-11-15 15:56:09,544] {Thread-5} DEBUG in extron_smp, line 34: Connecting to 129.13.51.105 ...
[2019-11-15 15:56:09,757] {Thread-3} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 15:56:09,773] {Thread-3} DEBUG in simple_state_checker, line 106: Checking Agent CS 50.35 Fasansengarten-Hörsaal (Hs a.F.)
[2019-11-15 15:56:10,425] {Thread-5} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 15:56:10,441] {Thread-5} DEBUG in simple_state_checker, line 106: Checking Agent Campus Ost 70.04 SR219
[2019-11-15 15:56:10,740] {Thread-5} DEBUG in extron_smp, line 34: Connecting to 129.13.51.110 ...
[2019-11-15 15:56:11,549] {Thread-5} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 15:56:11,664] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.102 ...
[2019-11-15 15:56:12,063] {Thread-3} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 15:56:12,450] {Thread-1} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 15:56:18,121] {MainThread} ERROR in simple_state_checker, line 151: Timeout while getting capture agent state!
[2019-11-15 15:56:18,512] {MainThread} INFO in simple_state_checker, line 153: DONE checking capture agents / recorders!

View File

@@ -1 +0,0 @@
[2019-11-12 16:17:10,872] {Thread-3} ERROR in simple_state_checker, line 104: FATAL - recorder CS 30.46 Chemie Neuer Hoersaal must be recording!!!!

View File

@@ -1,30 +0,0 @@
[2019-11-14 14:16:57,283] {Thread-1} ERROR in simple_state_checker, line 116: FATAL - recorder CS 10.11 Hertz-Hoersaal must be recording but is not!!!!
[2019-11-14 14:16:57,283] {Thread-1} ERROR in simple_state_checker, line 116: FATAL - recorder CS 10.11 Hertz-Hoersaal must be recording but is not!!!!
[2019-11-14 14:19:03,660] {Thread-4} CRITICAL in simple_state_checker, line 131: Exception occurred: LRC Exception: "[Errno 110] Connection timed out"
[2019-11-14 14:19:03,660] {Thread-4} CRITICAL in simple_state_checker, line 131: Exception occurred: LRC Exception: "[Errno 110] Connection timed out"
[2019-11-14 14:19:03,661] {Thread-4} ERROR in simple_state_checker, line 132: Could not check state of recorder CS 10.50 Bauingenieure Grosser Hoersaal, Address: 129.13.51.101
[2019-11-14 14:19:03,661] {Thread-4} ERROR in simple_state_checker, line 132: Could not check state of recorder CS 10.50 Bauingenieure Grosser Hoersaal, Address: 129.13.51.101
[2019-11-14 15:05:32,282] {MainThread} ERROR in simple_state_checker, line 145: Timeout while getting capture agent state!
[2019-11-14 15:05:32,282] {MainThread} ERROR in simple_state_checker, line 145: Timeout while getting capture agent state!
[2019-11-14 15:07:50,654] {MainThread} ERROR in simple_state_checker, line 145: Timeout while getting capture agent state!
[2019-11-14 15:07:50,654] {MainThread} ERROR in simple_state_checker, line 145: Timeout while getting capture agent state!
[2019-11-14 15:20:22,329] {Thread-1} ERROR in extron_smp, line 59: Could definitely not login (as admin) with given password! 129.13.51.102
[2019-11-14 15:20:22,329] {Thread-1} ERROR in extron_smp, line 59: Could definitely not login (as admin) with given password! 129.13.51.102
[2019-11-14 15:20:24,046] {MainThread} ERROR in simple_state_checker, line 145: Timeout while getting capture agent state!
[2019-11-14 15:20:24,046] {MainThread} ERROR in simple_state_checker, line 145: Timeout while getting capture agent state!
[2019-11-14 15:41:08,634] {Thread-2} ERROR in simple_state_checker, line 118: FATAL: CS 10.21 Carl-Benz-Hörsaal is not in capturing state...but should be!!
[2019-11-14 15:41:08,634] {Thread-2} ERROR in simple_state_checker, line 118: FATAL: CS 10.21 Carl-Benz-Hörsaal is not in capturing state...but should be!!
[2019-11-14 15:41:23,261] {MainThread} ERROR in simple_state_checker, line 145: Timeout while getting capture agent state!
[2019-11-14 15:41:23,261] {MainThread} ERROR in simple_state_checker, line 145: Timeout while getting capture agent state!
[2019-11-14 15:45:18,727] {Thread-2} ERROR in simple_state_checker, line 118: FATAL: CS 10.21 Carl-Benz-Hörsaal is not in capturing state...but should be!!
[2019-11-14 15:45:18,727] {Thread-2} ERROR in simple_state_checker, line 118: FATAL: CS 10.21 Carl-Benz-Hörsaal is not in capturing state...but should be!!
[2019-11-14 15:45:33,213] {MainThread} ERROR in simple_state_checker, line 145: Timeout while getting capture agent state!
[2019-11-14 15:45:33,213] {MainThread} ERROR in simple_state_checker, line 145: Timeout while getting capture agent state!
[2019-11-15 09:00:18,601] {MainThread} ERROR in simple_state_checker, line 151: Timeout while getting capture agent state!
[2019-11-15 09:00:18,601] {MainThread} ERROR in simple_state_checker, line 151: Timeout while getting capture agent state!
[2019-11-15 09:02:02,915] {MainThread} ERROR in simple_state_checker, line 151: Timeout while getting capture agent state!
[2019-11-15 09:02:02,915] {MainThread} ERROR in simple_state_checker, line 151: Timeout while getting capture agent state!
[2019-11-15 09:03:31,225] {MainThread} ERROR in simple_state_checker, line 151: Timeout while getting capture agent state!
[2019-11-15 09:03:31,225] {MainThread} ERROR in simple_state_checker, line 151: Timeout while getting capture agent state!
[2019-11-15 15:56:18,121] {MainThread} ERROR in simple_state_checker, line 151: Timeout while getting capture agent state!
[2019-11-15 15:56:18,121] {MainThread} ERROR in simple_state_checker, line 151: Timeout while getting capture agent state!

View File

@@ -1,68 +0,0 @@
[2019-11-12 16:13:10,529] {MainThread} INFO in simple_state_checker, line 83: Got 19 capture agents that will be checked...
[2019-11-12 16:15:41,995] {MainThread} INFO in simple_state_checker, line 121: Got 19 capture agents that will be checked...
[2019-11-12 16:15:41,998] {Thread-1} DEBUG in simple_state_checker, line 84: Checking Agent CS 10.11 Hertz-Hoersaal
[2019-11-12 16:15:41,998] {Thread-2} DEBUG in simple_state_checker, line 84: Checking Agent CS 10.21 Carl-Benz-Hörsaal
[2019-11-12 16:15:41,998] {Thread-3} DEBUG in simple_state_checker, line 84: Checking Agent CS 10.21 Gottlieb-Daimler-Hörsaal
[2019-11-12 16:15:42,000] {Thread-4} DEBUG in simple_state_checker, line 84: Checking Agent CS 10.50 Bauingenieure Grosser Hoersaal
[2019-11-12 16:15:42,001] {Thread-5} DEBUG in simple_state_checker, line 84: Checking Agent CS 10.50 Bauingenieure, Kleiner Hörsaal
[2019-11-12 16:15:42,963] {Thread-3} DEBUG in simple_state_checker, line 84: Checking Agent CS 10.91 Grashof-Hörsaal
[2019-11-12 16:15:42,996] {Thread-2} DEBUG in simple_state_checker, line 84: Checking Agent CS 10.91 Redtenbacher-Hörsaal
[2019-11-12 16:15:43,018] {Thread-5} DEBUG in simple_state_checker, line 84: Checking Agent CS 11.40 Johann-Gottfried-Tulla-Hoersaal
[2019-11-12 16:15:44,138] {Thread-1} DEBUG in simple_state_checker, line 84: Checking Agent CS 30.10 Nachrichtentechnik-Hoersaal NTI
[2019-11-12 16:15:46,348] {Thread-3} DEBUG in simple_state_checker, line 84: Checking Agent CS 30.21 Gerthsen-Hörsaal
[2019-11-12 16:15:46,405] {Thread-2} DEBUG in simple_state_checker, line 84: Checking Agent CS 30.22 Gaede-Hoersaal
[2019-11-12 16:15:47,356] {Thread-1} DEBUG in simple_state_checker, line 84: Checking Agent CS 30.22 Otto-Lehmann-Hoersaal - Mittl. HS
[2019-11-12 16:15:50,079] {Thread-3} DEBUG in simple_state_checker, line 84: Checking Agent CS 30.41 Chemie-Hörsaal Nr.3
[2019-11-12 16:15:50,510] {Thread-2} DEBUG in simple_state_checker, line 84: Checking Agent CS 30.46 Chemie Neuer Hoersaal
[2019-11-12 16:15:50,692] {Thread-1} DEBUG in simple_state_checker, line 84: Checking Agent CS 30.95 Forum Hoersaal Audimax
[2019-11-12 16:15:50,850] {Thread-5} DEBUG in simple_state_checker, line 84: Checking Agent CS 40.50 EBI Hoersaal
[2019-11-12 16:15:51,893] {Thread-3} DEBUG in simple_state_checker, line 84: Checking Agent CS 50.24 Hörsaal-101
[2019-11-12 16:15:52,190] {Thread-3} DEBUG in simple_state_checker, line 84: Checking Agent CS 50.35 Fasansengarten-Hörsaal (Hs a.F.)
[2019-11-12 16:15:52,980] {Thread-5} DEBUG in simple_state_checker, line 84: Checking Agent Campus Ost 70.04 SR219
[2019-11-12 16:16:59,911] {MainThread} INFO in simple_state_checker, line 121: Got 19 capture agents that will be checked...
[2019-11-12 16:16:59,914] {Thread-1} DEBUG in simple_state_checker, line 84: Checking Agent CS 10.11 Hertz-Hoersaal
[2019-11-12 16:16:59,914] {Thread-2} DEBUG in simple_state_checker, line 84: Checking Agent CS 10.21 Carl-Benz-Hörsaal
[2019-11-12 16:16:59,914] {Thread-3} DEBUG in simple_state_checker, line 84: Checking Agent CS 10.21 Gottlieb-Daimler-Hörsaal
[2019-11-12 16:16:59,915] {Thread-4} DEBUG in simple_state_checker, line 84: Checking Agent CS 10.50 Bauingenieure Grosser Hoersaal
[2019-11-12 16:16:59,917] {Thread-5} DEBUG in simple_state_checker, line 84: Checking Agent CS 10.50 Bauingenieure, Kleiner Hörsaal
[2019-11-12 16:17:00,018] {Thread-4} DEBUG in simple_state_checker, line 110: using SMP adapter
[2019-11-12 16:17:01,983] {Thread-3} INFO in simple_state_checker, line 117: OK recorder is not recording :)
[2019-11-12 16:17:01,983] {Thread-3} DEBUG in simple_state_checker, line 84: Checking Agent CS 10.91 Grashof-Hörsaal
[2019-11-12 16:17:02,078] {Thread-5} INFO in simple_state_checker, line 117: OK recorder is not recording :)
[2019-11-12 16:17:02,078] {Thread-5} DEBUG in simple_state_checker, line 84: Checking Agent CS 10.91 Redtenbacher-Hörsaal
[2019-11-12 16:17:02,414] {Thread-2} INFO in simple_state_checker, line 117: OK recorder is not recording :)
[2019-11-12 16:17:02,414] {Thread-2} DEBUG in simple_state_checker, line 84: Checking Agent CS 11.40 Johann-Gottfried-Tulla-Hoersaal
[2019-11-12 16:17:04,596] {Thread-3} INFO in simple_state_checker, line 117: OK recorder is not recording :)
[2019-11-12 16:17:04,616] {Thread-3} DEBUG in simple_state_checker, line 84: Checking Agent CS 30.10 Nachrichtentechnik-Hoersaal NTI
[2019-11-12 16:17:04,784] {Thread-5} INFO in simple_state_checker, line 117: OK recorder is not recording :)
[2019-11-12 16:17:04,789] {Thread-5} DEBUG in simple_state_checker, line 84: Checking Agent CS 30.21 Gerthsen-Hörsaal
[2019-11-12 16:17:05,311] {Thread-2} DEBUG in simple_state_checker, line 110: using SMP adapter
[2019-11-12 16:17:05,765] {Thread-1} DEBUG in simple_state_checker, line 110: using SMP adapter
[2019-11-12 16:17:05,780] {Thread-3} DEBUG in simple_state_checker, line 110: using SMP adapter
[2019-11-12 16:17:06,242] {Thread-2} INFO in simple_state_checker, line 117: OK recorder is not recording :)
[2019-11-12 16:17:06,257] {Thread-2} DEBUG in simple_state_checker, line 84: Checking Agent CS 30.22 Gaede-Hoersaal
[2019-11-12 16:17:06,429] {Thread-1} INFO in simple_state_checker, line 117: OK recorder is not recording :)
[2019-11-12 16:17:06,430] {Thread-1} DEBUG in simple_state_checker, line 84: Checking Agent CS 30.22 Otto-Lehmann-Hoersaal - Mittl. HS
[2019-11-12 16:17:06,631] {Thread-5} INFO in simple_state_checker, line 117: OK recorder is not recording :)
[2019-11-12 16:17:06,631] {Thread-5} DEBUG in simple_state_checker, line 84: Checking Agent CS 30.41 Chemie-Hörsaal Nr.3
[2019-11-12 16:17:06,657] {Thread-3} INFO in simple_state_checker, line 117: OK recorder is not recording :)
[2019-11-12 16:17:06,658] {Thread-3} DEBUG in simple_state_checker, line 84: Checking Agent CS 30.46 Chemie Neuer Hoersaal
[2019-11-12 16:17:08,598] {Thread-2} DEBUG in simple_state_checker, line 110: using SMP adapter
[2019-11-12 16:17:08,714] {Thread-1} DEBUG in simple_state_checker, line 110: using SMP adapter
[2019-11-12 16:17:09,251] {Thread-2} INFO in simple_state_checker, line 117: OK recorder is not recording :)
[2019-11-12 16:17:09,266] {Thread-2} DEBUG in simple_state_checker, line 84: Checking Agent CS 30.95 Forum Hoersaal Audimax
[2019-11-12 16:17:09,386] {Thread-5} INFO in simple_state_checker, line 117: OK recorder is not recording :)
[2019-11-12 16:17:09,397] {Thread-5} DEBUG in simple_state_checker, line 84: Checking Agent CS 40.50 EBI Hoersaal
[2019-11-12 16:17:09,520] {Thread-1} INFO in simple_state_checker, line 117: OK recorder is not recording :)
[2019-11-12 16:17:09,536] {Thread-1} DEBUG in simple_state_checker, line 84: Checking Agent CS 50.24 Hörsaal-101
[2019-11-12 16:17:09,795] {Thread-1} INFO in simple_state_checker, line 117: OK recorder is not recording :)
[2019-11-12 16:17:09,795] {Thread-1} DEBUG in simple_state_checker, line 84: Checking Agent CS 50.35 Fasansengarten-Hörsaal (Hs a.F.)
[2019-11-12 16:17:10,460] {Thread-5} DEBUG in simple_state_checker, line 110: using SMP adapter
[2019-11-12 16:17:10,851] {Thread-3} INFO in simple_state_checker, line 103: 1
[2019-11-12 16:17:10,872] {Thread-3} ERROR in simple_state_checker, line 104: FATAL - recorder CS 30.46 Chemie Neuer Hoersaal must be recording!!!!
[2019-11-12 16:17:10,873] {Thread-3} DEBUG in simple_state_checker, line 84: Checking Agent Campus Ost 70.04 SR219
[2019-11-12 16:17:11,002] {Thread-3} DEBUG in simple_state_checker, line 110: using SMP adapter
[2019-11-12 16:17:11,588] {Thread-5} INFO in simple_state_checker, line 117: OK recorder is not recording :)
[2019-11-12 16:17:11,594] {Thread-1} INFO in simple_state_checker, line 117: OK recorder is not recording :)
[2019-11-12 16:17:11,829] {Thread-3} INFO in simple_state_checker, line 117: OK recorder is not recording :)
[2019-11-12 16:17:12,075] {Thread-2} DEBUG in simple_state_checker, line 110: using SMP adapter

View File

@@ -1,620 +0,0 @@
[2019-11-14 14:16:53,247] {MainThread} INFO in simple_state_checker, line 136: Got 19 capture agents that will be checked...
[2019-11-14 14:16:53,255] {Thread-1} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.11 Hertz-Hoersaal
[2019-11-14 14:16:53,255] {Thread-2} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.21 Carl-Benz-Hörsaal
[2019-11-14 14:16:53,256] {Thread-3} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.21 Gottlieb-Daimler-Hörsaal
[2019-11-14 14:16:53,261] {Thread-4} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.50 Bauingenieure Grosser Hoersaal
[2019-11-14 14:16:53,261] {Thread-5} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.50 Bauingenieure, Kleiner Hörsaal
[2019-11-14 14:16:53,386] {Thread-4} INFO in extron_smp, line 32: Connecting to 129.13.51.101 ...
[2019-11-14 14:16:54,344] {Thread-5} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:16:54,355] {Thread-5} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.91 Grashof-Hörsaal
[2019-11-14 14:16:54,811] {Thread-3} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:16:54,827] {Thread-3} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.91 Redtenbacher-Hörsaal
[2019-11-14 14:16:55,195] {Thread-2} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:16:55,206] {Thread-2} DEBUG in simple_state_checker, line 99: Checking Agent CS 11.40 Johann-Gottfried-Tulla-Hoersaal
[2019-11-14 14:16:55,988] {Thread-5} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:16:56,019] {Thread-5} DEBUG in simple_state_checker, line 99: Checking Agent CS 30.10 Nachrichtentechnik-Hoersaal NTI
[2019-11-14 14:16:56,265] {Thread-3} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:16:56,276] {Thread-3} DEBUG in simple_state_checker, line 99: Checking Agent CS 30.21 Gerthsen-Hörsaal
[2019-11-14 14:16:56,323] {Thread-1} INFO in simple_state_checker, line 103: CS 10.11 Hertz-Hoersaal has entry in Calender and should therfor be recording... checking now!
[2019-11-14 14:16:56,365] {Thread-1} INFO in simple_state_checker, line 107: CS 10.11 Hertz-Hoersaal is in capturing state, so there should be an entry in the calendar of the recorder, right? -> True
[2019-11-14 14:16:56,380] {Thread-1} INFO in extron_smp, line 32: Connecting to 129.13.51.109 ...
[2019-11-14 14:16:57,008] {Thread-2} INFO in extron_smp, line 32: Connecting to 129.13.51.106 ...
[2019-11-14 14:16:57,095] {Thread-5} INFO in extron_smp, line 32: Connecting to 129.13.51.104 ...
[2019-11-14 14:16:57,272] {Thread-1} INFO in simple_state_checker, line 115: 1
[2019-11-14 14:16:57,283] {Thread-1} ERROR in simple_state_checker, line 116: FATAL - recorder CS 10.11 Hertz-Hoersaal must be recording but is not!!!!
[2019-11-14 14:16:57,321] {Thread-1} DEBUG in simple_state_checker, line 99: Checking Agent CS 30.22 Gaede-Hoersaal
[2019-11-14 14:16:57,530] {Thread-3} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:16:57,541] {Thread-3} DEBUG in simple_state_checker, line 99: Checking Agent CS 30.22 Otto-Lehmann-Hoersaal - Mittl. HS
[2019-11-14 14:16:57,744] {Thread-1} INFO in extron_smp, line 32: Connecting to 129.13.51.108 ...
[2019-11-14 14:16:57,936] {Thread-5} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:16:57,952] {Thread-5} DEBUG in simple_state_checker, line 99: Checking Agent CS 30.41 Chemie-Hörsaal Nr.3
[2019-11-14 14:16:57,954] {Thread-2} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:16:57,965] {Thread-3} INFO in extron_smp, line 32: Connecting to 129.13.51.107 ...
[2019-11-14 14:16:57,966] {Thread-2} DEBUG in simple_state_checker, line 99: Checking Agent CS 30.46 Chemie Neuer Hoersaal
[2019-11-14 14:16:58,634] {Thread-1} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:16:58,655] {Thread-1} DEBUG in simple_state_checker, line 99: Checking Agent CS 30.95 Forum Hoersaal Audimax
[2019-11-14 14:16:58,902] {Thread-2} INFO in extron_smp, line 32: Connecting to 129.13.51.103 ...
[2019-11-14 14:16:58,904] {Thread-3} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:16:58,904] {Thread-3} DEBUG in simple_state_checker, line 99: Checking Agent CS 40.50 EBI Hoersaal
[2019-11-14 14:16:59,563] {Thread-5} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:16:59,579] {Thread-5} DEBUG in simple_state_checker, line 99: Checking Agent CS 50.24 Hörsaal-101
[2019-11-14 14:16:59,668] {Thread-3} INFO in extron_smp, line 32: Connecting to 129.13.51.105 ...
[2019-11-14 14:16:59,797] {Thread-2} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:16:59,818] {Thread-2} DEBUG in simple_state_checker, line 99: Checking Agent CS 50.35 Fasansengarten-Hörsaal (Hs a.F.)
[2019-11-14 14:17:00,764] {Thread-3} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:17:00,780] {Thread-3} DEBUG in simple_state_checker, line 99: Checking Agent Campus Ost 70.04 SR219
[2019-11-14 14:17:00,983] {Thread-3} INFO in extron_smp, line 32: Connecting to 129.13.51.110 ...
[2019-11-14 14:17:01,618] {Thread-3} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:17:01,670] {Thread-1} INFO in extron_smp, line 32: Connecting to 129.13.51.102 ...
[2019-11-14 14:17:01,960] {Thread-2} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:19:03,660] {Thread-4} CRITICAL in simple_state_checker, line 131: Exception occurred: LRC Exception: "[Errno 110] Connection timed out"
[2019-11-14 14:19:03,661] {Thread-4} ERROR in simple_state_checker, line 132: Could not check state of recorder CS 10.50 Bauingenieure Grosser Hoersaal, Address: 129.13.51.101
[2019-11-14 14:23:51,783] {MainThread} INFO in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-14 14:25:33,337] {MainThread} INFO in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-14 14:27:00,957] {MainThread} INFO in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-14 14:27:14,952] {MainThread} INFO in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-14 14:28:15,602] {MainThread} INFO in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-14 14:29:24,029] {MainThread} INFO in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-14 14:29:58,640] {MainThread} INFO in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-14 14:32:30,592] {MainThread} INFO in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-14 14:34:08,425] {MainThread} INFO in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-14 14:36:35,216] {MainThread} INFO in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-14 14:38:11,521] {MainThread} INFO in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-14 14:39:43,884] {MainThread} INFO in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-14 14:39:53,493] {MainThread} INFO in simple_state_checker, line 136: Got 19 capture agents that will be checked...
[2019-11-14 14:39:53,497] {Thread-1} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.11 Hertz-Hoersaal
[2019-11-14 14:39:53,497] {Thread-2} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.21 Carl-Benz-Hörsaal
[2019-11-14 14:39:53,497] {Thread-3} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.21 Gottlieb-Daimler-Hörsaal
[2019-11-14 14:39:53,500] {Thread-4} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.50 Bauingenieure Grosser Hoersaal
[2019-11-14 14:39:53,500] {Thread-5} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.50 Bauingenieure, Kleiner Hörsaal
[2019-11-14 14:39:53,619] {Thread-4} INFO in extron_smp, line 34: Connecting to 129.13.51.101 ...
[2019-11-14 14:39:54,913] {Thread-3} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:39:54,942] {Thread-3} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.91 Grashof-Hörsaal
[2019-11-14 14:39:55,178] {Thread-5} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:39:55,220] {Thread-5} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.91 Redtenbacher-Hörsaal
[2019-11-14 14:39:55,395] {Thread-2} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:39:55,416] {Thread-2} DEBUG in simple_state_checker, line 99: Checking Agent CS 11.40 Johann-Gottfried-Tulla-Hoersaal
[2019-11-14 14:39:56,048] {Thread-3} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:39:56,092] {Thread-1} INFO in simple_state_checker, line 103: CS 10.11 Hertz-Hoersaal has entry in Calender and should therfor be recording... checking now!
[2019-11-14 14:39:56,098] {Thread-3} DEBUG in simple_state_checker, line 99: Checking Agent CS 30.10 Nachrichtentechnik-Hoersaal NTI
[2019-11-14 14:39:56,108] {Thread-1} INFO in simple_state_checker, line 107: CS 10.11 Hertz-Hoersaal is in capturing state, so there should be an entry in the calendar of the recorder, right? -> True
[2019-11-14 14:39:56,127] {Thread-1} INFO in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-14 14:39:56,248] {Thread-5} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:39:56,269] {Thread-5} DEBUG in simple_state_checker, line 99: Checking Agent CS 30.21 Gerthsen-Hörsaal
[2019-11-14 14:39:56,761] {Thread-2} INFO in extron_smp, line 34: Connecting to 129.13.51.106 ...
[2019-11-14 14:39:57,066] {Thread-1} INFO in simple_state_checker, line 113: OK recorder CS 10.11 Hertz-Hoersaal is recording :)
[2019-11-14 14:39:57,087] {Thread-1} DEBUG in simple_state_checker, line 99: Checking Agent CS 30.22 Gaede-Hoersaal
[2019-11-14 14:39:57,545] {Thread-3} INFO in extron_smp, line 34: Connecting to 129.13.51.104 ...
[2019-11-14 14:39:57,770] {Thread-2} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:39:57,817] {Thread-2} DEBUG in simple_state_checker, line 99: Checking Agent CS 30.22 Otto-Lehmann-Hoersaal - Mittl. HS
[2019-11-14 14:39:58,182] {Thread-1} INFO in extron_smp, line 34: Connecting to 129.13.51.108 ...
[2019-11-14 14:39:58,362] {Thread-5} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:39:58,378] {Thread-5} DEBUG in simple_state_checker, line 99: Checking Agent CS 30.41 Chemie-Hörsaal Nr.3
[2019-11-14 14:39:58,425] {Thread-2} INFO in extron_smp, line 34: Connecting to 129.13.51.107 ...
[2019-11-14 14:39:58,599] {Thread-3} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:39:58,610] {Thread-3} DEBUG in simple_state_checker, line 99: Checking Agent CS 30.46 Chemie Neuer Hoersaal
[2019-11-14 14:39:58,950] {Thread-1} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:39:58,951] {Thread-1} DEBUG in simple_state_checker, line 99: Checking Agent CS 30.95 Forum Hoersaal Audimax
[2019-11-14 14:39:59,487] {Thread-2} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:39:59,513] {Thread-2} DEBUG in simple_state_checker, line 99: Checking Agent CS 40.50 EBI Hoersaal
[2019-11-14 14:39:59,604] {Thread-3} INFO in extron_smp, line 34: Connecting to 129.13.51.103 ...
[2019-11-14 14:39:59,908] {Thread-5} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:39:59,918] {Thread-5} DEBUG in simple_state_checker, line 99: Checking Agent CS 50.24 Hörsaal-101
[2019-11-14 14:40:00,356] {Thread-2} INFO in extron_smp, line 34: Connecting to 129.13.51.105 ...
[2019-11-14 14:40:00,436] {Thread-3} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:40:00,451] {Thread-3} DEBUG in simple_state_checker, line 99: Checking Agent CS 50.35 Fasansengarten-Hörsaal (Hs a.F.)
[2019-11-14 14:40:01,582] {Thread-2} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:40:01,608] {Thread-2} DEBUG in simple_state_checker, line 99: Checking Agent Campus Ost 70.04 SR219
[2019-11-14 14:40:01,789] {Thread-2} INFO in extron_smp, line 34: Connecting to 129.13.51.110 ...
[2019-11-14 14:40:02,326] {Thread-1} INFO in extron_smp, line 34: Connecting to 129.13.51.102 ...
[2019-11-14 14:40:02,497] {Thread-3} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:40:02,648] {Thread-2} INFO in simple_state_checker, line 129: OK recorder is not recording :)
[2019-11-14 14:57:02,691] {MainThread} INFO in simple_state_checker, line 132: Got 19 capture agents that will be checked...
[2019-11-14 14:57:50,259] {MainThread} INFO in simple_state_checker, line 132: Got 19 capture agents that will be checked...
[2019-11-14 14:57:50,261] {Thread-1} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.11 Hertz-Hoersaal
[2019-11-14 14:57:51,265] {Thread-1} INFO in simple_state_checker, line 103: CS 10.11 Hertz-Hoersaal has entry in Calender and should therefore be recording... checking now!
[2019-11-14 14:57:51,266] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-14 14:57:52,257] {Thread-1} INFO in simple_state_checker, line 109: OK recorder CS 10.11 Hertz-Hoersaal is recording :)
[2019-11-14 14:57:52,259] {Thread-3} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.21 Carl-Benz-Hörsaal
[2019-11-14 14:57:53,279] {Thread-3} INFO in simple_state_checker, line 125: OK recorder is not recording :)
[2019-11-14 14:57:53,279] {Thread-5} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.21 Gottlieb-Daimler-Hörsaal
[2019-11-14 14:57:53,873] {Thread-5} INFO in simple_state_checker, line 125: OK recorder is not recording :)
[2019-11-14 14:57:53,873] {Thread-1} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.50 Bauingenieure Grosser Hoersaal
[2019-11-14 14:57:53,892] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.101 ...
[2019-11-14 15:02:35,956] {MainThread} INFO in simple_state_checker, line 132: Got 19 capture agents that will be checked...
[2019-11-14 15:02:35,961] {Thread-1} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.11 Hertz-Hoersaal
[2019-11-14 15:02:35,961] {Thread-2} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.21 Carl-Benz-Hörsaal
[2019-11-14 15:02:35,961] {Thread-3} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.21 Gottlieb-Daimler-Hörsaal
[2019-11-14 15:02:35,962] {Thread-4} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.50 Bauingenieure Grosser Hoersaal
[2019-11-14 15:02:35,966] {Thread-5} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.50 Bauingenieure, Kleiner Hörsaal
[2019-11-14 15:02:36,101] {Thread-4} DEBUG in extron_smp, line 34: Connecting to 129.13.51.101 ...
[2019-11-14 15:02:36,867] {Thread-5} INFO in simple_state_checker, line 125: OK recorder is not recording :)
[2019-11-14 15:02:36,878] {Thread-5} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.91 Grashof-Hörsaal
[2019-11-14 15:02:37,586] {Thread-3} INFO in simple_state_checker, line 125: OK recorder is not recording :)
[2019-11-14 15:02:37,616] {Thread-3} DEBUG in simple_state_checker, line 99: Checking Agent CS 10.91 Redtenbacher-Hörsaal
[2019-11-14 15:02:38,200] {Thread-2} INFO in simple_state_checker, line 125: OK recorder is not recording :)
[2019-11-14 15:02:38,232] {Thread-2} DEBUG in simple_state_checker, line 99: Checking Agent CS 11.40 Johann-Gottfried-Tulla-Hoersaal
[2019-11-14 15:02:38,487] {Thread-5} INFO in simple_state_checker, line 125: OK recorder is not recording :)
[2019-11-14 15:02:38,503] {Thread-5} DEBUG in simple_state_checker, line 99: Checking Agent CS 30.10 Nachrichtentechnik-Hoersaal NTI
[2019-11-14 15:02:38,698] {Thread-3} INFO in simple_state_checker, line 125: OK recorder is not recording :)
[2019-11-14 15:02:38,710] {Thread-3} DEBUG in simple_state_checker, line 99: Checking Agent CS 30.21 Gerthsen-Hörsaal
[2019-11-14 15:02:38,856] {Thread-1} INFO in simple_state_checker, line 103: CS 10.11 Hertz-Hoersaal has entry in Calender and should therefore be recording... checking now!
[2019-11-14 15:02:38,908] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-14 15:02:39,323] {Thread-5} DEBUG in extron_smp, line 34: Connecting to 129.13.51.104 ...
[2019-11-14 15:02:39,609] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.106 ...
[2019-11-14 15:02:39,673] {Thread-1} INFO in simple_state_checker, line 109: OK recorder CS 10.11 Hertz-Hoersaal is recording :)
[2019-11-14 15:02:39,693] {Thread-1} DEBUG in simple_state_checker, line 99: Checking Agent CS 30.22 Gaede-Hoersaal
[2019-11-14 15:02:40,001] {Thread-3} INFO in simple_state_checker, line 125: OK recorder is not recording :)
[2019-11-14 15:02:40,011] {Thread-3} DEBUG in simple_state_checker, line 99: Checking Agent CS 30.22 Otto-Lehmann-Hoersaal - Mittl. HS
[2019-11-14 15:02:40,115] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.108 ...
[2019-11-14 15:02:40,400] {Thread-3} DEBUG in extron_smp, line 34: Connecting to 129.13.51.107 ...
[2019-11-14 15:02:40,409] {Thread-5} INFO in simple_state_checker, line 125: OK recorder is not recording :)
[2019-11-14 15:02:40,410] {Thread-5} DEBUG in simple_state_checker, line 99: Checking Agent CS 30.41 Chemie-Hörsaal Nr.3
[2019-11-14 15:02:40,604] {Thread-2} INFO in simple_state_checker, line 125: OK recorder is not recording :)
[2019-11-14 15:02:40,621] {Thread-2} DEBUG in simple_state_checker, line 99: Checking Agent CS 30.46 Chemie Neuer Hoersaal
[2019-11-14 15:02:40,828] {Thread-1} INFO in simple_state_checker, line 125: OK recorder is not recording :)
[2019-11-14 15:02:40,828] {Thread-1} DEBUG in simple_state_checker, line 99: Checking Agent CS 30.95 Forum Hoersaal Audimax
[2019-11-14 15:02:41,529] {Thread-3} INFO in simple_state_checker, line 125: OK recorder is not recording :)
[2019-11-14 15:02:41,549] {Thread-3} DEBUG in simple_state_checker, line 99: Checking Agent CS 40.50 EBI Hoersaal
[2019-11-14 15:02:41,621] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.103 ...
[2019-11-14 15:02:41,849] {Thread-5} INFO in simple_state_checker, line 125: OK recorder is not recording :)
[2019-11-14 15:02:41,850] {Thread-5} DEBUG in simple_state_checker, line 99: Checking Agent CS 50.24 Hörsaal-101
[2019-11-14 15:02:42,655] {Thread-2} INFO in simple_state_checker, line 125: OK recorder is not recording :)
[2019-11-14 15:02:42,687] {Thread-2} DEBUG in simple_state_checker, line 99: Checking Agent CS 50.35 Fasansengarten-Hörsaal (Hs a.F.)
[2019-11-14 15:02:43,620] {Thread-3} DEBUG in extron_smp, line 34: Connecting to 129.13.51.105 ...
[2019-11-14 15:02:44,782] {Thread-3} INFO in simple_state_checker, line 125: OK recorder is not recording :)
[2019-11-14 15:02:44,876] {Thread-3} DEBUG in simple_state_checker, line 99: Checking Agent Campus Ost 70.04 SR219
[2019-11-14 15:02:45,342] {Thread-3} DEBUG in extron_smp, line 34: Connecting to 129.13.51.110 ...
[2019-11-14 15:02:45,550] {Thread-2} INFO in simple_state_checker, line 125: OK recorder is not recording :)
[2019-11-14 15:02:45,716] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.102 ...
[2019-11-14 15:02:46,265] {Thread-3} INFO in simple_state_checker, line 125: OK recorder is not recording :)
[2019-11-14 15:05:15,774] {MainThread} INFO in simple_state_checker, line 133: Got 19 capture agents that will be checked...
[2019-11-14 15:05:15,776] {Thread-1} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.11 Hertz-Hoersaal
[2019-11-14 15:05:15,776] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.21 Carl-Benz-Hörsaal
[2019-11-14 15:05:15,778] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.21 Gottlieb-Daimler-Hörsaal
[2019-11-14 15:05:15,778] {Thread-4} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.50 Bauingenieure Grosser Hoersaal
[2019-11-14 15:05:15,780] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.50 Bauingenieure, Kleiner Hörsaal
[2019-11-14 15:05:15,840] {Thread-4} DEBUG in extron_smp, line 34: Connecting to 129.13.51.101 ...
[2019-11-14 15:05:17,298] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:05:17,314] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.91 Grashof-Hörsaal
[2019-11-14 15:05:17,677] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:05:17,694] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.91 Redtenbacher-Hörsaal
[2019-11-14 15:05:17,842] {Thread-3} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:05:17,853] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 11.40 Johann-Gottfried-Tulla-Hoersaal
[2019-11-14 15:05:18,841] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:05:18,887] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.10 Nachrichtentechnik-Hoersaal NTI
[2019-11-14 15:05:19,101] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:05:19,137] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.21 Gerthsen-Hörsaal
[2019-11-14 15:05:19,149] {Thread-1} INFO in simple_state_checker, line 104: CS 10.11 Hertz-Hoersaal has entry in Calender and should therefore be recording... checking now!
[2019-11-14 15:05:19,210] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-14 15:05:19,575] {Thread-3} DEBUG in extron_smp, line 34: Connecting to 129.13.51.106 ...
[2019-11-14 15:05:19,886] {Thread-5} DEBUG in extron_smp, line 34: Connecting to 129.13.51.104 ...
[2019-11-14 15:05:20,281] {Thread-1} INFO in simple_state_checker, line 110: OK recorder CS 10.11 Hertz-Hoersaal is recording :)
[2019-11-14 15:05:20,282] {Thread-1} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.22 Gaede-Hoersaal
[2019-11-14 15:05:20,333] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:05:20,333] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.22 Otto-Lehmann-Hoersaal - Mittl. HS
[2019-11-14 15:05:20,383] {Thread-3} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:05:20,383] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.41 Chemie-Hörsaal Nr.3
[2019-11-14 15:05:20,616] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:05:20,632] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.46 Chemie Neuer Hoersaal
[2019-11-14 15:05:21,026] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.108 ...
[2019-11-14 15:05:21,456] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.107 ...
[2019-11-14 15:05:21,827] {Thread-1} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:05:21,848] {Thread-1} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.95 Forum Hoersaal Audimax
[2019-11-14 15:05:22,128] {Thread-5} DEBUG in extron_smp, line 34: Connecting to 129.13.51.103 ...
[2019-11-14 15:05:22,566] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:05:22,567] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 40.50 EBI Hoersaal
[2019-11-14 15:05:22,813] {Thread-3} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:05:22,819] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 50.24 Hörsaal-101
[2019-11-14 15:05:23,169] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:05:23,205] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 50.35 Fasansengarten-Hörsaal (Hs a.F.)
[2019-11-14 15:05:23,731] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.105 ...
[2019-11-14 15:05:24,776] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.102 ...
[2019-11-14 15:05:24,963] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:05:24,963] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent Campus Ost 70.04 SR219
[2019-11-14 15:05:25,042] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:05:25,131] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.110 ...
[2019-11-14 15:05:25,828] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:05:32,282] {MainThread} ERROR in simple_state_checker, line 145: Timeout while getting capture agent state!
[2019-11-14 15:07:35,727] {MainThread} INFO in simple_state_checker, line 133: Got 19 capture agents that will be checked...
[2019-11-14 15:07:35,729] {Thread-1} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.11 Hertz-Hoersaal
[2019-11-14 15:07:35,729] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.21 Carl-Benz-Hörsaal
[2019-11-14 15:07:35,729] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.21 Gottlieb-Daimler-Hörsaal
[2019-11-14 15:07:35,730] {Thread-4} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.50 Bauingenieure Grosser Hoersaal
[2019-11-14 15:07:35,730] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.50 Bauingenieure, Kleiner Hörsaal
[2019-11-14 15:07:35,863] {Thread-4} DEBUG in extron_smp, line 34: Connecting to 129.13.51.101 ...
[2019-11-14 15:07:37,438] {Thread-3} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:07:37,453] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.91 Grashof-Hörsaal
[2019-11-14 15:07:37,481] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:07:37,497] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.91 Redtenbacher-Hörsaal
[2019-11-14 15:07:37,744] {Thread-1} INFO in simple_state_checker, line 104: CS 10.11 Hertz-Hoersaal has entry in Calender and should therefore be recording... checking now!
[2019-11-14 15:07:37,760] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-14 15:07:37,996] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:07:38,011] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 11.40 Johann-Gottfried-Tulla-Hoersaal
[2019-11-14 15:07:38,259] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:07:38,259] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.10 Nachrichtentechnik-Hoersaal NTI
[2019-11-14 15:07:38,503] {Thread-3} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:07:38,519] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.21 Gerthsen-Hörsaal
[2019-11-14 15:07:38,612] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.106 ...
[2019-11-14 15:07:38,612] {Thread-1} INFO in simple_state_checker, line 110: OK recorder CS 10.11 Hertz-Hoersaal is recording :)
[2019-11-14 15:07:38,633] {Thread-1} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.22 Gaede-Hoersaal
[2019-11-14 15:07:38,813] {Thread-5} DEBUG in extron_smp, line 34: Connecting to 129.13.51.104 ...
[2019-11-14 15:07:39,478] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:07:39,504] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.22 Otto-Lehmann-Hoersaal - Mittl. HS
[2019-11-14 15:07:39,592] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.108 ...
[2019-11-14 15:07:39,602] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:07:39,625] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.41 Chemie-Hörsaal Nr.3
[2019-11-14 15:07:39,837] {Thread-3} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:07:39,871] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.107 ...
[2019-11-14 15:07:39,886] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.46 Chemie Neuer Hoersaal
[2019-11-14 15:07:40,494] {Thread-1} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:07:40,520] {Thread-1} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.95 Forum Hoersaal Audimax
[2019-11-14 15:07:40,903] {Thread-3} DEBUG in extron_smp, line 34: Connecting to 129.13.51.103 ...
[2019-11-14 15:07:41,107] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:07:41,108] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 40.50 EBI Hoersaal
[2019-11-14 15:07:41,186] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:07:41,186] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 50.24 Hörsaal-101
[2019-11-14 15:07:41,731] {Thread-3} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:07:41,747] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 50.35 Fasansengarten-Hörsaal (Hs a.F.)
[2019-11-14 15:07:41,869] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.105 ...
[2019-11-14 15:07:42,952] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:07:42,973] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent Campus Ost 70.04 SR219
[2019-11-14 15:07:43,268] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.110 ...
[2019-11-14 15:07:44,224] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:07:44,634] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.102 ...
[2019-11-14 15:07:44,636] {Thread-3} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:07:50,654] {MainThread} ERROR in simple_state_checker, line 145: Timeout while getting capture agent state!
[2019-11-14 15:07:50,706] {MainThread} INFO in simple_state_checker, line 147: DONE checking capture agents / recorders!
[2019-11-14 15:20:07,570] {MainThread} INFO in simple_state_checker, line 133: Got 19 capture agents that will be checked...
[2019-11-14 15:20:07,572] {Thread-1} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.11 Hertz-Hoersaal
[2019-11-14 15:20:07,572] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.21 Carl-Benz-Hörsaal
[2019-11-14 15:20:07,572] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.21 Gottlieb-Daimler-Hörsaal
[2019-11-14 15:20:07,575] {Thread-4} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.50 Bauingenieure Grosser Hoersaal
[2019-11-14 15:20:07,576] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.50 Bauingenieure, Kleiner Hörsaal
[2019-11-14 15:20:07,702] {Thread-4} DEBUG in extron_smp, line 34: Connecting to 129.13.51.101 ...
[2019-11-14 15:20:09,335] {Thread-3} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:20:09,341] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.91 Grashof-Hörsaal
[2019-11-14 15:20:09,527] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:20:09,543] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.91 Redtenbacher-Hörsaal
[2019-11-14 15:20:10,343] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:20:10,375] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 11.40 Johann-Gottfried-Tulla-Hoersaal
[2019-11-14 15:20:11,090] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:20:11,106] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.10 Nachrichtentechnik-Hoersaal NTI
[2019-11-14 15:20:11,158] {Thread-1} INFO in simple_state_checker, line 104: CS 10.11 Hertz-Hoersaal has entry in Calender and should therefore be recording... checking now!
[2019-11-14 15:20:11,164] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-14 15:20:11,194] {Thread-3} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:20:11,215] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.21 Gerthsen-Hörsaal
[2019-11-14 15:20:11,464] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.106 ...
[2019-11-14 15:20:11,990] {Thread-1} INFO in simple_state_checker, line 110: OK recorder CS 10.11 Hertz-Hoersaal is recording :)
[2019-11-14 15:20:12,017] {Thread-5} DEBUG in extron_smp, line 34: Connecting to 129.13.51.104 ...
[2019-11-14 15:20:12,028] {Thread-1} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.22 Gaede-Hoersaal
[2019-11-14 15:20:12,376] {Thread-3} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:20:12,387] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.22 Otto-Lehmann-Hoersaal - Mittl. HS
[2019-11-14 15:20:12,399] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.108 ...
[2019-11-14 15:20:12,400] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:20:12,401] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.41 Chemie-Hörsaal Nr.3
[2019-11-14 15:20:12,906] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:20:12,922] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.46 Chemie Neuer Hoersaal
[2019-11-14 15:20:13,086] {Thread-3} DEBUG in extron_smp, line 34: Connecting to 129.13.51.107 ...
[2019-11-14 15:20:13,264] {Thread-1} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:20:13,264] {Thread-1} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.95 Forum Hoersaal Audimax
[2019-11-14 15:20:13,943] {Thread-5} DEBUG in extron_smp, line 34: Connecting to 129.13.51.103 ...
[2019-11-14 15:20:13,999] {Thread-3} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:20:13,999] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 40.50 EBI Hoersaal
[2019-11-14 15:20:14,191] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:20:14,192] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 50.24 Hörsaal-101
[2019-11-14 15:20:14,849] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:20:14,938] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 50.35 Fasansengarten-Hörsaal (Hs a.F.)
[2019-11-14 15:20:16,840] {Thread-3} DEBUG in extron_smp, line 34: Connecting to 129.13.51.105 ...
[2019-11-14 15:20:18,101] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:20:18,112] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent Campus Ost 70.04 SR219
[2019-11-14 15:20:18,197] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.102 ...
[2019-11-14 15:20:18,231] {Thread-3} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:20:18,279] {Thread-5} DEBUG in extron_smp, line 34: Connecting to 129.13.51.110 ...
[2019-11-14 15:20:18,965] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:20:20,327] {Thread-1} WARNING in extron_smp, line 52: Could not login (as admin) with given password! 129.13.51.102
[2019-11-14 15:20:22,329] {Thread-1} ERROR in extron_smp, line 59: Could definitely not login (as admin) with given password! 129.13.51.102
[2019-11-14 15:20:24,046] {MainThread} ERROR in simple_state_checker, line 145: Timeout while getting capture agent state!
[2019-11-14 15:20:24,118] {MainThread} INFO in simple_state_checker, line 147: DONE checking capture agents / recorders!
[2019-11-14 15:41:07,178] {MainThread} INFO in simple_state_checker, line 133: Got 19 capture agents that will be checked...
[2019-11-14 15:41:07,180] {Thread-1} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.11 Hertz-Hoersaal
[2019-11-14 15:41:07,180] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.21 Carl-Benz-Hörsaal
[2019-11-14 15:41:07,180] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.21 Gottlieb-Daimler-Hörsaal
[2019-11-14 15:41:07,180] {Thread-4} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.50 Bauingenieure Grosser Hoersaal
[2019-11-14 15:41:07,180] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.50 Bauingenieure, Kleiner Hörsaal
[2019-11-14 15:41:07,312] {Thread-4} DEBUG in extron_smp, line 34: Connecting to 129.13.51.101 ...
[2019-11-14 15:41:08,619] {Thread-2} INFO in simple_state_checker, line 104: CS 10.21 Carl-Benz-Hörsaal has entry in Calender and should therefore be recording... checking now!
[2019-11-14 15:41:08,634] {Thread-2} ERROR in simple_state_checker, line 118: FATAL: CS 10.21 Carl-Benz-Hörsaal is not in capturing state...but should be!!
[2019-11-14 15:41:08,640] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.91 Grashof-Hörsaal
[2019-11-14 15:41:08,822] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:41:08,864] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.91 Redtenbacher-Hörsaal
[2019-11-14 15:41:08,864] {Thread-3} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:41:08,919] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 11.40 Johann-Gottfried-Tulla-Hoersaal
[2019-11-14 15:41:10,309] {Thread-1} INFO in simple_state_checker, line 104: CS 10.11 Hertz-Hoersaal has entry in Calender and should therefore be recording... checking now!
[2019-11-14 15:41:10,319] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-14 15:41:10,595] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:41:10,610] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.10 Nachrichtentechnik-Hoersaal NTI
[2019-11-14 15:41:10,683] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:41:10,706] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.21 Gerthsen-Hörsaal
[2019-11-14 15:41:10,708] {Thread-3} DEBUG in extron_smp, line 34: Connecting to 129.13.51.106 ...
[2019-11-14 15:41:11,243] {Thread-1} INFO in simple_state_checker, line 110: OK recorder CS 10.11 Hertz-Hoersaal is recording :)
[2019-11-14 15:41:11,253] {Thread-1} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.22 Gaede-Hoersaal
[2019-11-14 15:41:11,261] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.104 ...
[2019-11-14 15:41:11,594] {Thread-3} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:41:11,594] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.22 Otto-Lehmann-Hoersaal - Mittl. HS
[2019-11-14 15:41:11,606] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.108 ...
[2019-11-14 15:41:11,624] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:41:11,624] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.41 Chemie-Hörsaal Nr.3
[2019-11-14 15:41:12,061] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:41:12,092] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.46 Chemie Neuer Hoersaal
[2019-11-14 15:41:12,311] {Thread-1} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:41:12,327] {Thread-1} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.95 Forum Hoersaal Audimax
[2019-11-14 15:41:12,600] {Thread-3} DEBUG in extron_smp, line 34: Connecting to 129.13.51.107 ...
[2019-11-14 15:41:13,130] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.103 ...
[2019-11-14 15:41:13,666] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:41:13,677] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 40.50 EBI Hoersaal
[2019-11-14 15:41:13,757] {Thread-3} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:41:13,777] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 50.24 Hörsaal-101
[2019-11-14 15:41:14,070] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:41:14,096] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 50.35 Fasansengarten-Hörsaal (Hs a.F.)
[2019-11-14 15:41:15,923] {Thread-1} INFO in simple_state_checker, line 104: CS 30.95 Forum Hoersaal Audimax has entry in Calender and should therefore be recording... checking now!
[2019-11-14 15:41:15,944] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.102 ...
[2019-11-14 15:41:16,093] {Thread-5} DEBUG in extron_smp, line 34: Connecting to 129.13.51.105 ...
[2019-11-14 15:41:16,804] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:41:16,805] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent Campus Ost 70.04 SR219
[2019-11-14 15:41:16,964] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.110 ...
[2019-11-14 15:41:17,043] {Thread-1} INFO in simple_state_checker, line 110: OK recorder CS 30.95 Forum Hoersaal Audimax is recording :)
[2019-11-14 15:41:17,168] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:41:17,905] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:41:23,261] {MainThread} ERROR in simple_state_checker, line 145: Timeout while getting capture agent state!
[2019-11-14 15:41:23,280] {MainThread} INFO in simple_state_checker, line 147: DONE checking capture agents / recorders!
[2019-11-14 15:45:17,132] {MainThread} INFO in simple_state_checker, line 133: Got 19 capture agents that will be checked...
[2019-11-14 15:45:17,136] {Thread-1} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.11 Hertz-Hoersaal
[2019-11-14 15:45:17,136] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.21 Carl-Benz-Hörsaal
[2019-11-14 15:45:17,136] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.21 Gottlieb-Daimler-Hörsaal
[2019-11-14 15:45:17,138] {Thread-4} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.50 Bauingenieure Grosser Hoersaal
[2019-11-14 15:45:17,140] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.50 Bauingenieure, Kleiner Hörsaal
[2019-11-14 15:45:17,246] {Thread-4} DEBUG in extron_smp, line 34: Connecting to 129.13.51.101 ...
[2019-11-14 15:45:18,711] {Thread-2} INFO in simple_state_checker, line 104: CS 10.21 Carl-Benz-Hörsaal has entry in Calender and should therefore be recording... checking now!
[2019-11-14 15:45:18,727] {Thread-2} ERROR in simple_state_checker, line 118: FATAL: CS 10.21 Carl-Benz-Hörsaal is not in capturing state...but should be!!
[2019-11-14 15:45:18,763] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.91 Grashof-Hörsaal
[2019-11-14 15:45:18,861] {Thread-3} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:45:18,872] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 10.91 Redtenbacher-Hörsaal
[2019-11-14 15:45:18,931] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:45:18,941] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 11.40 Johann-Gottfried-Tulla-Hoersaal
[2019-11-14 15:45:19,971] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-14 15:45:20,433] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:45:20,448] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.10 Nachrichtentechnik-Hoersaal NTI
[2019-11-14 15:45:20,537] {Thread-3} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:45:20,547] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.21 Gerthsen-Hörsaal
[2019-11-14 15:45:20,571] {Thread-5} DEBUG in extron_smp, line 34: Connecting to 129.13.51.106 ...
[2019-11-14 15:45:21,177] {Thread-1} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:45:21,197] {Thread-1} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.22 Gaede-Hoersaal
[2019-11-14 15:45:21,408] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.104 ...
[2019-11-14 15:45:21,543] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:45:21,564] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.22 Otto-Lehmann-Hoersaal - Mittl. HS
[2019-11-14 15:45:22,149] {Thread-3} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:45:22,165] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.41 Chemie-Hörsaal Nr.3
[2019-11-14 15:45:22,247] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.108 ...
[2019-11-14 15:45:22,247] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:45:22,268] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.46 Chemie Neuer Hoersaal
[2019-11-14 15:45:22,378] {Thread-5} DEBUG in extron_smp, line 34: Connecting to 129.13.51.107 ...
[2019-11-14 15:45:22,958] {Thread-1} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:45:22,978] {Thread-1} DEBUG in simple_state_checker, line 100: Checking Agent CS 30.95 Forum Hoersaal Audimax
[2019-11-14 15:45:23,300] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.103 ...
[2019-11-14 15:45:23,351] {Thread-3} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:45:23,351] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent CS 40.50 EBI Hoersaal
[2019-11-14 15:45:23,400] {Thread-5} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:45:23,400] {Thread-5} DEBUG in simple_state_checker, line 100: Checking Agent CS 50.24 Hörsaal-101
[2019-11-14 15:45:24,216] {Thread-3} DEBUG in extron_smp, line 34: Connecting to 129.13.51.105 ...
[2019-11-14 15:45:24,306] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:45:24,337] {Thread-2} DEBUG in simple_state_checker, line 100: Checking Agent CS 50.35 Fasansengarten-Hörsaal (Hs a.F.)
[2019-11-14 15:45:25,245] {Thread-3} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:45:25,266] {Thread-3} DEBUG in simple_state_checker, line 100: Checking Agent Campus Ost 70.04 SR219
[2019-11-14 15:45:25,600] {Thread-3} DEBUG in extron_smp, line 34: Connecting to 129.13.51.110 ...
[2019-11-14 15:45:26,328] {Thread-3} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:45:26,923] {Thread-1} INFO in simple_state_checker, line 104: CS 30.95 Forum Hoersaal Audimax has entry in Calender and should therefore be recording... checking now!
[2019-11-14 15:45:26,923] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.102 ...
[2019-11-14 15:45:27,178] {Thread-2} INFO in simple_state_checker, line 126: OK recorder is not recording :)
[2019-11-14 15:45:27,986] {Thread-1} INFO in simple_state_checker, line 110: OK recorder CS 30.95 Forum Hoersaal Audimax is recording :)
[2019-11-14 15:45:33,213] {MainThread} ERROR in simple_state_checker, line 145: Timeout while getting capture agent state!
[2019-11-14 15:45:33,239] {MainThread} INFO in simple_state_checker, line 147: DONE checking capture agents / recorders!
[2019-11-15 09:00:02,960] {MainThread} INFO in simple_state_checker, line 139: Got 19 capture agents that will be checked...
[2019-11-15 09:00:02,962] {Thread-1} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.11 Hertz-Hoersaal
[2019-11-15 09:00:02,962] {Thread-2} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.21 Carl-Benz-Hörsaal
[2019-11-15 09:00:02,963] {Thread-3} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.21 Gottlieb-Daimler-Hörsaal
[2019-11-15 09:00:02,963] {Thread-4} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.50 Bauingenieure Grosser Hoersaal
[2019-11-15 09:00:02,963] {Thread-5} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.50 Bauingenieure, Kleiner Hörsaal
[2019-11-15 09:00:03,163] {Thread-4} DEBUG in extron_smp, line 34: Connecting to 129.13.51.101 ...
[2019-11-15 09:00:04,443] {Thread-5} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:00:04,454] {Thread-5} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.91 Grashof-Hörsaal
[2019-11-15 09:00:04,925] {Thread-3} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:00:04,941] {Thread-3} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.91 Redtenbacher-Hörsaal
[2019-11-15 09:00:05,486] {Thread-2} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:00:05,507] {Thread-2} DEBUG in simple_state_checker, line 106: Checking Agent CS 11.40 Johann-Gottfried-Tulla-Hoersaal
[2019-11-15 09:00:05,732] {Thread-5} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:00:05,753] {Thread-5} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.10 Nachrichtentechnik-Hoersaal NTI
[2019-11-15 09:00:05,807] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-15 09:00:06,018] {Thread-3} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:00:06,028] {Thread-3} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.21 Gerthsen-Hörsaal
[2019-11-15 09:00:06,443] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.106 ...
[2019-11-15 09:00:06,557] {Thread-1} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:00:06,583] {Thread-1} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.22 Gaede-Hoersaal
[2019-11-15 09:00:06,654] {Thread-5} DEBUG in extron_smp, line 34: Connecting to 129.13.51.104 ...
[2019-11-15 09:00:07,016] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.108 ...
[2019-11-15 09:00:07,028] {Thread-3} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:00:07,028] {Thread-3} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.22 Otto-Lehmann-Hoersaal - Mittl. HS
[2019-11-15 09:00:07,313] {Thread-2} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:00:07,333] {Thread-2} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.41 Chemie-Hörsaal Nr.3
[2019-11-15 09:00:07,435] {Thread-3} DEBUG in extron_smp, line 34: Connecting to 129.13.51.107 ...
[2019-11-15 09:00:07,681] {Thread-5} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:00:07,696] {Thread-5} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.46 Chemie Neuer Hoersaal
[2019-11-15 09:00:07,847] {Thread-1} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:00:07,848] {Thread-1} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.95 Forum Hoersaal Audimax
[2019-11-15 09:00:08,514] {Thread-3} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:00:08,514] {Thread-3} DEBUG in simple_state_checker, line 106: Checking Agent CS 40.50 EBI Hoersaal
[2019-11-15 09:00:08,955] {Thread-2} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:00:08,970] {Thread-2} DEBUG in simple_state_checker, line 106: Checking Agent CS 50.24 Hörsaal-101
[2019-11-15 09:00:09,158] {Thread-5} DEBUG in extron_smp, line 34: Connecting to 129.13.51.103 ...
[2019-11-15 09:00:09,479] {Thread-3} DEBUG in extron_smp, line 34: Connecting to 129.13.51.105 ...
[2019-11-15 09:00:10,422] {Thread-5} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:00:10,443] {Thread-5} DEBUG in simple_state_checker, line 106: Checking Agent CS 50.35 Fasansengarten-Hörsaal (Hs a.F.)
[2019-11-15 09:00:10,679] {Thread-1} INFO in simple_state_checker, line 110: CS 30.95 Forum Hoersaal Audimax has entry in Calender and should therefore be recording... checking now!
[2019-11-15 09:00:10,679] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.102 ...
[2019-11-15 09:00:10,756] {Thread-3} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:00:10,757] {Thread-3} DEBUG in simple_state_checker, line 106: Checking Agent Campus Ost 70.04 SR219
[2019-11-15 09:00:10,870] {Thread-3} DEBUG in extron_smp, line 34: Connecting to 129.13.51.110 ...
[2019-11-15 09:00:11,648] {Thread-1} INFO in simple_state_checker, line 116: OK recorder CS 30.95 Forum Hoersaal Audimax is recording :)
[2019-11-15 09:00:11,726] {Thread-3} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:00:11,959] {Thread-5} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:00:18,601] {MainThread} ERROR in simple_state_checker, line 151: Timeout while getting capture agent state!
[2019-11-15 09:00:18,945] {MainThread} INFO in simple_state_checker, line 153: DONE checking capture agents / recorders!
[2019-11-15 09:01:48,428] {MainThread} INFO in simple_state_checker, line 139: Got 19 capture agents that will be checked...
[2019-11-15 09:01:48,431] {Thread-1} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.11 Hertz-Hoersaal
[2019-11-15 09:01:48,431] {Thread-2} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.21 Carl-Benz-Hörsaal
[2019-11-15 09:01:48,431] {Thread-3} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.21 Gottlieb-Daimler-Hörsaal
[2019-11-15 09:01:48,432] {Thread-4} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.50 Bauingenieure Grosser Hoersaal
[2019-11-15 09:01:48,432] {Thread-5} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.50 Bauingenieure, Kleiner Hörsaal
[2019-11-15 09:01:48,538] {Thread-4} DEBUG in extron_smp, line 34: Connecting to 129.13.51.101 ...
[2019-11-15 09:01:49,684] {Thread-5} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:01:49,690] {Thread-3} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:01:49,705] {Thread-5} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.91 Grashof-Hörsaal
[2019-11-15 09:01:49,716] {Thread-3} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.91 Redtenbacher-Hörsaal
[2019-11-15 09:01:50,134] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-15 09:01:50,252] {Thread-2} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:01:50,268] {Thread-2} DEBUG in simple_state_checker, line 106: Checking Agent CS 11.40 Johann-Gottfried-Tulla-Hoersaal
[2019-11-15 09:01:50,800] {Thread-3} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:01:50,806] {Thread-3} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.10 Nachrichtentechnik-Hoersaal NTI
[2019-11-15 09:01:50,914] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.106 ...
[2019-11-15 09:01:50,915] {Thread-1} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:01:50,915] {Thread-1} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.21 Gerthsen-Hörsaal
[2019-11-15 09:01:51,069] {Thread-5} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:01:51,080] {Thread-5} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.22 Gaede-Hoersaal
[2019-11-15 09:01:51,673] {Thread-2} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:01:51,720] {Thread-2} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.22 Otto-Lehmann-Hoersaal - Mittl. HS
[2019-11-15 09:01:51,726] {Thread-3} DEBUG in extron_smp, line 34: Connecting to 129.13.51.104 ...
[2019-11-15 09:01:51,893] {Thread-5} DEBUG in extron_smp, line 34: Connecting to 129.13.51.108 ...
[2019-11-15 09:01:52,152] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.107 ...
[2019-11-15 09:01:52,231] {Thread-1} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:01:52,232] {Thread-1} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.41 Chemie-Hörsaal Nr.3
[2019-11-15 09:01:52,598] {Thread-5} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:01:52,618] {Thread-3} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:01:52,623] {Thread-5} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.46 Chemie Neuer Hoersaal
[2019-11-15 09:01:52,637] {Thread-3} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.95 Forum Hoersaal Audimax
[2019-11-15 09:01:52,956] {Thread-2} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:01:52,956] {Thread-2} DEBUG in simple_state_checker, line 106: Checking Agent CS 40.50 EBI Hoersaal
[2019-11-15 09:01:53,679] {Thread-1} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:01:53,721] {Thread-1} DEBUG in simple_state_checker, line 106: Checking Agent CS 50.24 Hörsaal-101
[2019-11-15 09:01:54,025] {Thread-5} DEBUG in extron_smp, line 34: Connecting to 129.13.51.103 ...
[2019-11-15 09:01:54,184] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.105 ...
[2019-11-15 09:01:54,998] {Thread-2} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:01:55,019] {Thread-2} DEBUG in simple_state_checker, line 106: Checking Agent CS 50.35 Fasansengarten-Hörsaal (Hs a.F.)
[2019-11-15 09:01:55,087] {Thread-5} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:01:55,108] {Thread-5} DEBUG in simple_state_checker, line 106: Checking Agent Campus Ost 70.04 SR219
[2019-11-15 09:01:55,254] {Thread-5} DEBUG in extron_smp, line 34: Connecting to 129.13.51.110 ...
[2019-11-15 09:01:55,445] {Thread-3} INFO in simple_state_checker, line 110: CS 30.95 Forum Hoersaal Audimax has entry in Calender and should therefore be recording... checking now!
[2019-11-15 09:01:55,445] {Thread-3} DEBUG in extron_smp, line 34: Connecting to 129.13.51.102 ...
[2019-11-15 09:01:55,943] {Thread-5} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:01:56,200] {Thread-3} INFO in simple_state_checker, line 116: OK recorder CS 30.95 Forum Hoersaal Audimax is recording :)
[2019-11-15 09:01:56,274] {Thread-2} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:02:02,915] {MainThread} ERROR in simple_state_checker, line 151: Timeout while getting capture agent state!
[2019-11-15 09:02:03,114] {MainThread} INFO in simple_state_checker, line 153: DONE checking capture agents / recorders!
[2019-11-15 09:03:16,872] {MainThread} INFO in simple_state_checker, line 139: Got 19 capture agents that will be checked...
[2019-11-15 09:03:16,875] {Thread-1} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.11 Hertz-Hoersaal
[2019-11-15 09:03:16,875] {Thread-2} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.21 Carl-Benz-Hörsaal
[2019-11-15 09:03:16,875] {Thread-3} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.21 Gottlieb-Daimler-Hörsaal
[2019-11-15 09:03:16,875] {Thread-4} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.50 Bauingenieure Grosser Hoersaal
[2019-11-15 09:03:16,875] {Thread-5} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.50 Bauingenieure, Kleiner Hörsaal
[2019-11-15 09:03:16,991] {Thread-4} DEBUG in extron_smp, line 34: Connecting to 129.13.51.101 ...
[2019-11-15 09:03:17,901] {Thread-3} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:03:17,917] {Thread-5} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:03:17,917] {Thread-3} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.91 Grashof-Hörsaal
[2019-11-15 09:03:17,933] {Thread-5} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.91 Redtenbacher-Hörsaal
[2019-11-15 09:03:18,497] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-15 09:03:18,639] {Thread-2} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:03:18,655] {Thread-2} DEBUG in simple_state_checker, line 106: Checking Agent CS 11.40 Johann-Gottfried-Tulla-Hoersaal
[2019-11-15 09:03:19,037] {Thread-5} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:03:19,047] {Thread-5} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.10 Nachrichtentechnik-Hoersaal NTI
[2019-11-15 09:03:19,189] {Thread-1} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:03:19,210] {Thread-1} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.21 Gerthsen-Hörsaal
[2019-11-15 09:03:19,310] {Thread-3} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:03:19,329] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.106 ...
[2019-11-15 09:03:19,329] {Thread-3} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.22 Gaede-Hoersaal
[2019-11-15 09:03:19,638] {Thread-5} DEBUG in extron_smp, line 34: Connecting to 129.13.51.104 ...
[2019-11-15 09:03:20,151] {Thread-3} DEBUG in extron_smp, line 34: Connecting to 129.13.51.108 ...
[2019-11-15 09:03:20,331] {Thread-2} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:03:20,331] {Thread-2} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.22 Otto-Lehmann-Hoersaal - Mittl. HS
[2019-11-15 09:03:20,462] {Thread-1} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:03:20,462] {Thread-1} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.41 Chemie-Hörsaal Nr.3
[2019-11-15 09:03:20,494] {Thread-5} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:03:20,510] {Thread-5} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.46 Chemie Neuer Hoersaal
[2019-11-15 09:03:20,633] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.107 ...
[2019-11-15 09:03:21,032] {Thread-3} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:03:21,053] {Thread-3} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.95 Forum Hoersaal Audimax
[2019-11-15 09:03:21,466] {Thread-5} DEBUG in extron_smp, line 34: Connecting to 129.13.51.103 ...
[2019-11-15 09:03:21,730] {Thread-2} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:03:21,731] {Thread-2} DEBUG in simple_state_checker, line 106: Checking Agent CS 40.50 EBI Hoersaal
[2019-11-15 09:03:22,061] {Thread-1} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:03:22,072] {Thread-1} DEBUG in simple_state_checker, line 106: Checking Agent CS 50.24 Hörsaal-101
[2019-11-15 09:03:22,445] {Thread-5} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:03:22,492] {Thread-5} DEBUG in simple_state_checker, line 106: Checking Agent CS 50.35 Fasansengarten-Hörsaal (Hs a.F.)
[2019-11-15 09:03:23,370] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.105 ...
[2019-11-15 09:03:24,285] {Thread-2} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:03:24,306] {Thread-2} DEBUG in simple_state_checker, line 106: Checking Agent Campus Ost 70.04 SR219
[2019-11-15 09:03:24,454] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.110 ...
[2019-11-15 09:03:24,681] {Thread-3} INFO in simple_state_checker, line 110: CS 30.95 Forum Hoersaal Audimax has entry in Calender and should therefore be recording... checking now!
[2019-11-15 09:03:24,682] {Thread-3} DEBUG in extron_smp, line 34: Connecting to 129.13.51.102 ...
[2019-11-15 09:03:24,682] {Thread-5} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:03:25,308] {Thread-2} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 09:03:25,616] {Thread-3} INFO in simple_state_checker, line 116: OK recorder CS 30.95 Forum Hoersaal Audimax is recording :)
[2019-11-15 09:03:31,225] {MainThread} ERROR in simple_state_checker, line 151: Timeout while getting capture agent state!
[2019-11-15 09:03:31,461] {MainThread} INFO in simple_state_checker, line 153: DONE checking capture agents / recorders!
[2019-11-15 15:56:02,776] {MainThread} INFO in simple_state_checker, line 139: Got 19 capture agents that will be checked...
[2019-11-15 15:56:02,783] {Thread-1} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.11 Hertz-Hoersaal
[2019-11-15 15:56:02,783] {Thread-2} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.21 Carl-Benz-Hörsaal
[2019-11-15 15:56:02,784] {Thread-3} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.21 Gottlieb-Daimler-Hörsaal
[2019-11-15 15:56:02,787] {Thread-4} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.50 Bauingenieure Grosser Hoersaal
[2019-11-15 15:56:02,787] {Thread-5} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.50 Bauingenieure, Kleiner Hörsaal
[2019-11-15 15:56:02,903] {Thread-4} DEBUG in extron_smp, line 34: Connecting to 129.13.51.101 ...
[2019-11-15 15:56:04,320] {Thread-5} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 15:56:04,331] {Thread-5} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.91 Grashof-Hörsaal
[2019-11-15 15:56:04,366] {Thread-3} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 15:56:04,377] {Thread-3} DEBUG in simple_state_checker, line 106: Checking Agent CS 10.91 Redtenbacher-Hörsaal
[2019-11-15 15:56:04,654] {Thread-2} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 15:56:04,741] {Thread-2} DEBUG in simple_state_checker, line 106: Checking Agent CS 11.40 Johann-Gottfried-Tulla-Hoersaal
[2019-11-15 15:56:04,779] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.109 ...
[2019-11-15 15:56:05,377] {Thread-3} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 15:56:05,388] {Thread-3} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.10 Nachrichtentechnik-Hoersaal NTI
[2019-11-15 15:56:05,479] {Thread-5} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 15:56:05,492] {Thread-5} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.21 Gerthsen-Hörsaal
[2019-11-15 15:56:05,698] {Thread-2} DEBUG in extron_smp, line 34: Connecting to 129.13.51.106 ...
[2019-11-15 15:56:06,048] {Thread-1} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 15:56:06,105] {Thread-1} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.22 Gaede-Hoersaal
[2019-11-15 15:56:06,320] {Thread-3} DEBUG in extron_smp, line 34: Connecting to 129.13.51.104 ...
[2019-11-15 15:56:06,752] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.108 ...
[2019-11-15 15:56:06,834] {Thread-5} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 15:56:06,834] {Thread-5} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.22 Otto-Lehmann-Hoersaal - Mittl. HS
[2019-11-15 15:56:06,844] {Thread-2} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 15:56:06,845] {Thread-2} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.41 Chemie-Hörsaal Nr.3
[2019-11-15 15:56:07,320] {Thread-3} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 15:56:07,336] {Thread-3} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.46 Chemie Neuer Hoersaal
[2019-11-15 15:56:07,555] {Thread-5} DEBUG in extron_smp, line 34: Connecting to 129.13.51.107 ...
[2019-11-15 15:56:07,567] {Thread-1} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 15:56:07,568] {Thread-1} DEBUG in simple_state_checker, line 106: Checking Agent CS 30.95 Forum Hoersaal Audimax
[2019-11-15 15:56:08,323] {Thread-5} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 15:56:08,324] {Thread-5} DEBUG in simple_state_checker, line 106: Checking Agent CS 40.50 EBI Hoersaal
[2019-11-15 15:56:08,638] {Thread-2} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 15:56:08,655] {Thread-2} DEBUG in simple_state_checker, line 106: Checking Agent CS 50.24 Hörsaal-101
[2019-11-15 15:56:08,687] {Thread-3} DEBUG in extron_smp, line 34: Connecting to 129.13.51.103 ...
[2019-11-15 15:56:09,544] {Thread-5} DEBUG in extron_smp, line 34: Connecting to 129.13.51.105 ...
[2019-11-15 15:56:09,757] {Thread-3} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 15:56:09,773] {Thread-3} DEBUG in simple_state_checker, line 106: Checking Agent CS 50.35 Fasansengarten-Hörsaal (Hs a.F.)
[2019-11-15 15:56:10,425] {Thread-5} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 15:56:10,441] {Thread-5} DEBUG in simple_state_checker, line 106: Checking Agent Campus Ost 70.04 SR219
[2019-11-15 15:56:10,740] {Thread-5} DEBUG in extron_smp, line 34: Connecting to 129.13.51.110 ...
[2019-11-15 15:56:11,549] {Thread-5} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 15:56:11,664] {Thread-1} DEBUG in extron_smp, line 34: Connecting to 129.13.51.102 ...
[2019-11-15 15:56:12,063] {Thread-3} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 15:56:12,450] {Thread-1} INFO in simple_state_checker, line 132: OK recorder is not recording :)
[2019-11-15 15:56:18,121] {MainThread} ERROR in simple_state_checker, line 151: Timeout while getting capture agent state!
[2019-11-15 15:56:18,512] {MainThread} INFO in simple_state_checker, line 153: DONE checking capture agents / recorders!

1978
poetry.lock generated

File diff suppressed because it is too large Load Diff