fix merge conflict

This commit is contained in:
Huy Pham 2019-11-05 15:31:32 -08:00
commit 6db4be4e13
12 changed files with 639 additions and 357 deletions

View file

@ -15,3 +15,4 @@ pre-commit = "*"
[packages] [packages]
coretk = {editable = true,path = "."} coretk = {editable = true,path = "."}
core = {editable = true,path = "./../daemon"} core = {editable = true,path = "./../daemon"}
pyyaml = "*"

378
coretk/Pipfile.lock generated
View file

@ -1,7 +1,7 @@
{ {
"_meta": { "_meta": {
"hash": { "hash": {
"sha256": "2cb6b23bfb8b9bebb5ece1016de468cc57fe46cf4df08a61b1861aee4bed1028" "sha256": "eb59f8233d6608de2d67743d8d8afe51c929f837cf6cf4d991ffc79ab5134910"
}, },
"pipfile-spec": 6, "pipfile-spec": 6,
"requires": {}, "requires": {},
@ -14,12 +14,65 @@
] ]
}, },
"default": { "default": {
"configparser": { "bcrypt": {
"hashes": [ "hashes": [
"sha256:254c1d9c79f60c45dfde850850883d5aaa7f19a23f13561243a050d5a7c3fe4c", "sha256:0258f143f3de96b7c14f762c770f5fc56ccd72f8a1857a451c1cd9a655d9ac89",
"sha256:c7d282687a5308319bf3d2e7706e575c635b0a470342641c93bea0ea3b5331df" "sha256:0b0069c752ec14172c5f78208f1863d7ad6755a6fae6fe76ec2c80d13be41e42",
"sha256:19a4b72a6ae5bb467fea018b825f0a7d917789bcfe893e53f15c92805d187294",
"sha256:5432dd7b34107ae8ed6c10a71b4397f1c853bd39a4d6ffa7e35f40584cffd161",
"sha256:6305557019906466fc42dbc53b46da004e72fd7a551c044a827e572c82191752",
"sha256:69361315039878c0680be456640f8705d76cb4a3a3fe1e057e0f261b74be4b31",
"sha256:6fe49a60b25b584e2f4ef175b29d3a83ba63b3a4df1b4c0605b826668d1b6be5",
"sha256:74a015102e877d0ccd02cdeaa18b32aa7273746914a6c5d0456dd442cb65b99c",
"sha256:763669a367869786bb4c8fcf731f4175775a5b43f070f50f46f0b59da45375d0",
"sha256:8b10acde4e1919d6015e1df86d4c217d3b5b01bb7744c36113ea43d529e1c3de",
"sha256:9fe92406c857409b70a38729dbdf6578caf9228de0aef5bc44f859ffe971a39e",
"sha256:a190f2a5dbbdbff4b74e3103cef44344bc30e61255beb27310e2aec407766052",
"sha256:a595c12c618119255c90deb4b046e1ca3bcfad64667c43d1166f2b04bc72db09",
"sha256:c9457fa5c121e94a58d6505cadca8bed1c64444b83b3204928a866ca2e599105",
"sha256:cb93f6b2ab0f6853550b74e051d297c27a638719753eb9ff66d1e4072be67133",
"sha256:ce4e4f0deb51d38b1611a27f330426154f2980e66582dc5f438aad38b5f24fc1",
"sha256:d7bdc26475679dd073ba0ed2766445bb5b20ca4793ca0db32b399dccc6bc84b7",
"sha256:ff032765bb8716d9387fd5376d987a937254b0619eff0972779515b5c98820bc"
], ],
"version": "==4.0.2" "version": "==3.1.7"
},
"cffi": {
"hashes": [
"sha256:0b49274afc941c626b605fb59b59c3485c17dc776dc3cc7cc14aca74cc19cc42",
"sha256:0e3ea92942cb1168e38c05c1d56b0527ce31f1a370f6117f1d490b8dcd6b3a04",
"sha256:135f69aecbf4517d5b3d6429207b2dff49c876be724ac0c8bf8e1ea99df3d7e5",
"sha256:19db0cdd6e516f13329cba4903368bff9bb5a9331d3410b1b448daaadc495e54",
"sha256:2781e9ad0e9d47173c0093321bb5435a9dfae0ed6a762aabafa13108f5f7b2ba",
"sha256:291f7c42e21d72144bb1c1b2e825ec60f46d0a7468f5346841860454c7aa8f57",
"sha256:2c5e309ec482556397cb21ede0350c5e82f0eb2621de04b2633588d118da4396",
"sha256:2e9c80a8c3344a92cb04661115898a9129c074f7ab82011ef4b612f645939f12",
"sha256:32a262e2b90ffcfdd97c7a5e24a6012a43c61f1f5a57789ad80af1d26c6acd97",
"sha256:3c9fff570f13480b201e9ab69453108f6d98244a7f495e91b6c654a47486ba43",
"sha256:415bdc7ca8c1c634a6d7163d43fb0ea885a07e9618a64bda407e04b04333b7db",
"sha256:4424e42199e86b21fc4db83bd76909a6fc2a2aefb352cb5414833c030f6ed71b",
"sha256:4a43c91840bda5f55249413037b7a9b79c90b1184ed504883b72c4df70778579",
"sha256:599a1e8ff057ac530c9ad1778293c665cb81a791421f46922d80a86473c13346",
"sha256:5c4fae4e9cdd18c82ba3a134be256e98dc0596af1e7285a3d2602c97dcfa5159",
"sha256:5ecfa867dea6fabe2a58f03ac9186ea64da1386af2159196da51c4904e11d652",
"sha256:62f2578358d3a92e4ab2d830cd1c2049c9c0d0e6d3c58322993cc341bdeac22e",
"sha256:6471a82d5abea994e38d2c2abc77164b4f7fbaaf80261cb98394d5793f11b12a",
"sha256:6d4f18483d040e18546108eb13b1dfa1000a089bcf8529e30346116ea6240506",
"sha256:71a608532ab3bd26223c8d841dde43f3516aa5d2bf37b50ac410bb5e99053e8f",
"sha256:74a1d8c85fb6ff0b30fbfa8ad0ac23cd601a138f7509dc617ebc65ef305bb98d",
"sha256:7b93a885bb13073afb0aa73ad82059a4c41f4b7d8eb8368980448b52d4c7dc2c",
"sha256:7d4751da932caaec419d514eaa4215eaf14b612cff66398dd51129ac22680b20",
"sha256:7f627141a26b551bdebbc4855c1157feeef18241b4b8366ed22a5c7d672ef858",
"sha256:8169cf44dd8f9071b2b9248c35fc35e8677451c52f795daa2bb4643f32a540bc",
"sha256:aa00d66c0fab27373ae44ae26a66a9e43ff2a678bf63a9c7c1a9a4d61172827a",
"sha256:ccb032fda0873254380aa2bfad2582aedc2959186cce61e3a17abc1a55ff89c3",
"sha256:d754f39e0d1603b5b24a7f8484b22d2904fa551fe865fd0d4c3332f078d20d4e",
"sha256:d75c461e20e29afc0aee7172a0950157c704ff0dd51613506bd7d82b718e7410",
"sha256:dcd65317dd15bc0451f3e01c80da2216a31916bdcffd6221ca1202d96584aa25",
"sha256:e570d3ab32e2c2861c4ebe6ffcad6a8abf9347432a37608fe1fbd157b3f0036b",
"sha256:fd43a88e045cf992ed09fa724b5315b790525f2676883a6ea64e3263bae6549d"
],
"version": "==1.13.2"
}, },
"core": { "core": {
"editable": true, "editable": true,
@ -29,54 +82,106 @@
"editable": true, "editable": true,
"path": "." "path": "."
}, },
"future": { "cryptography": {
"hashes": [ "hashes": [
"sha256:67045236dcfd6816dc439556d009594abf643e5eb48992e36beac09c2ca659b8" "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": "==0.17.1" "version": "==2.8"
},
"fabric": {
"hashes": [
"sha256:160331934ea60036604928e792fa8e9f813266b098ef5562aa82b88527740389",
"sha256:24842d7d51556adcabd885ac3cf5e1df73fc622a1708bf3667bf5927576cdfa6"
],
"version": "==2.5.0"
}, },
"grpcio": { "grpcio": {
"hashes": [ "hashes": [
"sha256:0337debec20fe385bcd49048d6917270efbc17a5119857466559b4db91f8995b", "sha256:01cb705eafba1108e2a947ba0457da4f6a1e8142c729fc61702b5fdd11009eb1",
"sha256:164f82a99e08797ea786283b66b45ebe76772d321577d1674ba6fe0200155892", "sha256:0b5a79e29f167d3cd06faad6b15babbc2661066daaacf79373c3a8e67ca1fca1",
"sha256:172dfba8d9621048c2cbc1d1cf7a02244e9a9a8cff5bb79bb30bcb0c13c7fd31", "sha256:1097a61a0e97b3580642e6e1460a3a1f1ba1815e2a70d6057173bcc495417076",
"sha256:18f4b536d8a9cfa15b3214e0bb628071def94160699e91798f0a954c3b2db88d", "sha256:13970e665a4ec4cec7d067d7d3504a0398c657d91d26c581144ad9044e429c9a",
"sha256:2283b56bda49b068b0f08d006fffc7dd46eae72322f1a5dec87fc9c218f1dc2d", "sha256:1557817cea6e0b87fad2a3e20da385170efb03a313db164e8078955add2dfa1b",
"sha256:26b33f488a955bf49262d2ce3423d3a8174108506d8f819e8150aca21bdd3b99", "sha256:1b0fb036a2f9dd93d9a35c57c26420eeb4b571fcb14b51cddf5b1e73ea5d882b",
"sha256:31cc9b6f70bdd0d9ff53df2d563ea1fb278601d5c625932d8a82d03b08ff3de0", "sha256:24d9e58d08e8cd545d8a3247a18654aff0e5e60414701696a8098fbb0d792b75",
"sha256:37dd8684fbc2bc00766ae6784bcbd7f874bc96527636a341411db811d04ff650", "sha256:2c38b586163d2b91567fe5e6d9e7798f792012365adc838a64b66b22dce3f4d4",
"sha256:424c01189ef51a808669f020368b01204e0f1fa0bf2adab7c8d0d13166f92e9e", "sha256:2df3ab4348507de60e1cbf75196403df1b9b4c4d4dc5bd11ac4eb63c46f691c7",
"sha256:431c099f20a1f1d97def98f87bb74fa752e8819c2bab23d79089353aed1acc9b", "sha256:32f70f7c90454ea568b868af2e96616743718d9233d23f62407e98caed81dfbf",
"sha256:4c2f1d0b27bcef301e5d5c1da05ffd7d174f807f61889c006b8e708b16bc978e", "sha256:3af2a49d576820045c9c880ff29a5a96d020fe31b35d248519bfc6ccb8be4eac",
"sha256:59b8d738867b59c5daaff5df242b5f3f9c58b47862f603c6ee530964b897b69b", "sha256:4ff7d63800a63db031ebac6a6f581ae84877c959401c24c28f2cc51fd36c47ad",
"sha256:8d4f1ee2a67cf8f792d4fc9b8c7bb2148174e838d935f175653aec234752828b", "sha256:502aaa8be56f0ae69cda66bc27e1fb5531ceaa27ca515ec3c34f6178b1297180",
"sha256:97ab9e35b47bda0441332204960f95c1169c55ec8e989381bedd32bdb9f78b05", "sha256:55358ce3ec283222e435f7dbc6603521438458f3c65f7c1cb33b8dabf56d70d8",
"sha256:9cf93e185507bfdaa7ed45a90049bd3f1ed3f6357ad3772b31e993ff723cf67d", "sha256:5583b01c67f85fa64a2c3fb085e5517c88b9c1500a2cce12d473cd99d0ed2e49",
"sha256:a5a81472c0ca6181492b9291c316ff60c6c94dd3f21c1e8c481f21923d899af0", "sha256:58d9a5557d3eb7b734a3cea8b16c891099a522b3953a45a30bd4c034f75fc913",
"sha256:aaa1feb0fdd094af6db0a16cbd446ed94285a50e320aede5971152d9ea022df8", "sha256:5911f042c4ab177757eec5bcb4e2e9a2e823d888835d24577321bf55f02938fa",
"sha256:b36bf4408f8400ee9ab13ff129e71f2e4c72ce2d8886b744aeab77ce50a55cf6", "sha256:5e16ea922f4e5017c04fd94e2639b1006e03097e9dd0cbb7a1c852af3ea8bf2e",
"sha256:bb345f7e98b38a2c1ef33ff1145687234f78dfeedf308b41b3e41f4b42eba099", "sha256:656e19d3f1b9050ee01b457f92838a9679d7cf84c995f708780f44484048705e",
"sha256:c13ae15695e0eb4ba2db920d6a197171d2398c675afa4f27460b6381d20a6884", "sha256:6a1435449a82008c451c7e1a82a834387b9108f9a8d27910f86e7c482f5568e9",
"sha256:c4a233a00cc5b64543e97733902151bc6738396931b3c166aad03a3aaadbd479", "sha256:6ff02ca6cbed0ddb76e93ba0f8beb6a8c77d83a84eb7cafe2ae3399a8b9d69ea",
"sha256:c521c5f8a95baabba69c68dd0f5e34f37c8adf1a9691f9884dba3eab4ebadc29", "sha256:76de68f60102f333bf4817f38e81ecbee68b850f5a5da9f355235e948ac40981",
"sha256:c772edd094fe3e54d6d54fdecb90c51cb8d07b55e9c1cda2d33e9615e33d07e8", "sha256:7c6d7ddd50fc6548ea1dfe09c62509c4f95b8b40082287747be05aa8feb15ee2",
"sha256:cebfba6542855403b29e4bc95bbcd5ab444f21137b440f2fb7c7925ca0e55bfd", "sha256:836b9d29507de729129e363276fe7c7d6a34c7961e0f155787025552b15d22c0",
"sha256:d7490e013c4bad3e8db804fc6483b47125dc8df0ebcfd6e419bd25df35025301", "sha256:869242b2baf8a888a4fe0548f86abc47cb4b48bdfd76ae62d6456e939c202e65",
"sha256:dfb6063619f297cbd22c67530d7465d98348b35d0424bbc1756b36c5ef9f99d4", "sha256:8954b24bd08641d906ee50b2d638efc76df893fbd0913149b80484fd0eac40c9",
"sha256:e80a15b48a66f35c7c33db2a7df4034a533b362269d0e60e0036e23f14bac7b5", "sha256:8cdea65d1abb2e698420db8daf20c8d272fbd9d96a51b26a713c1c76f237d181",
"sha256:ea444fa1c1ec4f8d2ce965bb01e06148ef9ceb398fb2f627511d50f137eac35b", "sha256:90161840b4fe9636f91ed0d3ea1e7e615e488cbea4e77594c889e5f3d7a776db",
"sha256:ec986cbf8837a49f9612cc1cfc2a8ccb54875cfce5355a121279de35124ea1db", "sha256:90fb6316b4d7d36700c40db4335902b78dcae13b5466673c21fd3b08a3c1b0c6",
"sha256:fb641df6de8c4a55c784c24d334d53096954d9b30679d3ce5eb6a4d25c1020a3", "sha256:91b34f58db2611c9a93ecf751028f97fba1f06e65f49b38f272f6aa5d2977331",
"sha256:fb88bd791c8efbcb36de12f0aa519ceec0b7806d3decff16e412e097d4725d44", "sha256:9474944a96a33eb8734fa8dc5805403d57973a3526204a5e1c1780d02e0572b6",
"sha256:ffa1be3d566a9cbd21a5f2d95fd9262ec6c337c499291bfeb51547b8de18942e" "sha256:9a36275db2a4774ac16c6822e7af816ee048071d5030b4c035fd53942b361935",
"sha256:9cbe26e2976b994c5f7c2d35a63354674d6ca0ce62f5b513f078bf63c1745229",
"sha256:9eaeabb3c0eecd6ddd0c16767fd12d130e2cebb8c2618f959a278b1ff336ddc3",
"sha256:a2bc7e10ebcf4be503ae427f9887e75c0cc24e88ce467a8e6eaca6bd2862406e",
"sha256:a5b42e6292ba51b8e67e09fc256963ba4ca9c04026de004d2fe59cc17e3c3776",
"sha256:bd6ec1233c86c0b9bb5d03ec30dbe3ffbfa53335790320d99a7ae9018c5450f2",
"sha256:bef57530816af54d66b1f4c70a8f851f320cb6f84d4b5a0b422b0e9811ea4e59",
"sha256:c146a63eaadc6589b732780061f3c94cd0574388d372baccbb3c1597a9ebdb7a",
"sha256:c2efd3b130dc639d615b6f58980e1bfd1b177ad821f30827afa5001aa30ddd48",
"sha256:c888b18f7392e6cc79a33a803e7ebd7890ac3318f571fca6b356526f35b53b12",
"sha256:ca30721fda297ae22f16bc37aa7ed244970ddfdcb98247570cdd26daaad4665e",
"sha256:cf5f5340dd682ab034baa52f423a0f91326489c262ac9617fa06309ec05880e9",
"sha256:d0726aa0d9b57c56985db5952e90fb1033a317074f2877db5307cdd6eede1564",
"sha256:df442945b2dd6f8ae0e20b403e0fd4548cd5c2aad69200047cc3251257b78f65",
"sha256:e08e758c31919d167c0867539bd3b2441629ef00aa595e3ea2b635273659f40a",
"sha256:e4864339deeeaefaad34dd3a432ee618a039fca28efb292949c855e00878203c",
"sha256:f4cd049cb94d9f517b1cab5668a3b345968beba093bc79a637e671000b3540ec"
], ],
"version": "==1.24.0" "version": "==1.24.3"
},
"invoke": {
"hashes": [
"sha256:c52274d2e8a6d64ef0d61093e1983268ea1fc0cd13facb9448c4ef0c9a7ac7da",
"sha256:f4ec8a134c0122ea042c8912529f87652445d9f4de590b353d23f95bfa1f0efd",
"sha256:fc803a5c9052f15e63310aa81a43498d7c55542beb18564db88a9d75a176fa44"
],
"version": "==1.3.0"
}, },
"lxml": { "lxml": {
"hashes": [ "hashes": [
"sha256:02ca7bf899da57084041bb0f6095333e4d239948ad3169443f454add9f4e9cb4", "sha256:02ca7bf899da57084041bb0f6095333e4d239948ad3169443f454add9f4e9cb4",
"sha256:096b82c5e0ea27ce9138bcbb205313343ee66a6e132f25c5ed67e2c8d960a1bc", "sha256:096b82c5e0ea27ce9138bcbb205313343ee66a6e132f25c5ed67e2c8d960a1bc",
"sha256:0a920ff98cf1aac310470c644bc23b326402d3ef667ddafecb024e1713d485f1", "sha256:0a920ff98cf1aac310470c644bc23b326402d3ef667ddafecb024e1713d485f1",
"sha256:1409b14bf83a7d729f92e2a7fbfe7ec929d4883ca071b06e95c539ceedb6497c",
"sha256:17cae1730a782858a6e2758fd20dd0ef7567916c47757b694a06ffafdec20046", "sha256:17cae1730a782858a6e2758fd20dd0ef7567916c47757b694a06ffafdec20046",
"sha256:17e3950add54c882e032527795c625929613adbd2ce5162b94667334458b5a36", "sha256:17e3950add54c882e032527795c625929613adbd2ce5162b94667334458b5a36",
"sha256:1f4f214337f6ee5825bf90a65d04d70aab05526c08191ab888cb5149501923c5", "sha256:1f4f214337f6ee5825bf90a65d04d70aab05526c08191ab888cb5149501923c5",
@ -87,11 +192,14 @@
"sha256:760c12276fee05c36f95f8040180abc7fbebb9e5011447a97cdc289b5d6ab6fc", "sha256:760c12276fee05c36f95f8040180abc7fbebb9e5011447a97cdc289b5d6ab6fc",
"sha256:796685d3969815a633827c818863ee199440696b0961e200b011d79b9394bbe7", "sha256:796685d3969815a633827c818863ee199440696b0961e200b011d79b9394bbe7",
"sha256:891fe897b49abb7db470c55664b198b1095e4943b9f82b7dcab317a19116cd38", "sha256:891fe897b49abb7db470c55664b198b1095e4943b9f82b7dcab317a19116cd38",
"sha256:9277562f175d2334744ad297568677056861070399cec56ff06abbe2564d1232",
"sha256:a471628e20f03dcdfde00770eeaf9c77811f0c331c8805219ca7b87ac17576c5", "sha256:a471628e20f03dcdfde00770eeaf9c77811f0c331c8805219ca7b87ac17576c5",
"sha256:a63b4fd3e2cabdcc9d918ed280bdde3e8e9641e04f3c59a2a3109644a07b9832", "sha256:a63b4fd3e2cabdcc9d918ed280bdde3e8e9641e04f3c59a2a3109644a07b9832",
"sha256:ae88588d687bd476be588010cbbe551e9c2872b816f2da8f01f6f1fda74e1ef0",
"sha256:b0b84408d4eabc6de9dd1e1e0bc63e7731e890c0b378a62443e5741cfd0ae90a", "sha256:b0b84408d4eabc6de9dd1e1e0bc63e7731e890c0b378a62443e5741cfd0ae90a",
"sha256:be78485e5d5f3684e875dab60f40cddace2f5b2a8f7fede412358ab3214c3a6f", "sha256:be78485e5d5f3684e875dab60f40cddace2f5b2a8f7fede412358ab3214c3a6f",
"sha256:c27eaed872185f047bb7f7da2d21a7d8913457678c9a100a50db6da890bc28b9", "sha256:c27eaed872185f047bb7f7da2d21a7d8913457678c9a100a50db6da890bc28b9",
"sha256:c7fccd08b14aa437fe096c71c645c0f9be0655a9b1a4b7cffc77bcb23b3d61d2",
"sha256:c81cb40bff373ab7a7446d6bbca0190bccc5be3448b47b51d729e37799bb5692", "sha256:c81cb40bff373ab7a7446d6bbca0190bccc5be3448b47b51d729e37799bb5692",
"sha256:d11874b3c33ee441059464711cd365b89fa1a9cf19ae75b0c189b01fbf735b84", "sha256:d11874b3c33ee441059464711cd365b89fa1a9cf19ae75b0c189b01fbf735b84",
"sha256:e9c028b5897901361d81a4718d1db217b716424a0283afe9d6735fe0caf70f79", "sha256:e9c028b5897901361d81a4718d1db217b716424a0283afe9d6735fe0caf70f79",
@ -99,64 +207,126 @@
], ],
"version": "==4.4.1" "version": "==4.4.1"
}, },
"paramiko": {
"hashes": [
"sha256:99f0179bdc176281d21961a003ffdb2ec369daac1a1007241f53374e376576cf",
"sha256:f4b2edfa0d226b70bd4ca31ea7e389325990283da23465d572ed1f70a7583041"
],
"version": "==2.6.0"
},
"pillow": { "pillow": {
"hashes": [ "hashes": [
"sha256:0804f77cb1e9b6dbd37601cee11283bba39a8d44b9ddb053400c58e0c0d7d9de", "sha256:047d9473cf68af50ac85f8ee5d5f21a60f849bc17d348da7fc85711287a75031",
"sha256:0ab7c5b5d04691bcbd570658667dd1e21ca311c62dcfd315ad2255b1cd37f64f", "sha256:0f66dc6c8a3cc319561a633b6aa82c44107f12594643efa37210d8c924fc1c71",
"sha256:0b3e6cf3ea1f8cecd625f1420b931c83ce74f00c29a0ff1ce4385f99900ac7c4", "sha256:12c9169c4e8fe0a7329e8658c7e488001f6b4c8e88740e76292c2b857af2e94c",
"sha256:365c06a45712cd723ec16fa4ceb32ce46ad201eb7bbf6d3c16b063c72b61a3ed", "sha256:248cffc168896982f125f5c13e9317c059f74fffdb4152893339f3be62a01340",
"sha256:38301fbc0af865baa4752ddae1bb3cbb24b3d8f221bf2850aad96b243306fa03", "sha256:27faf0552bf8c260a5cee21a76e031acaea68babb64daf7e8f2e2540745082aa",
"sha256:3aef1af1a91798536bbab35d70d35750bd2884f0832c88aeb2499aa2d1ed4992", "sha256:285edafad9bc60d96978ed24d77cdc0b91dace88e5da8c548ba5937c425bca8b",
"sha256:3fe0ab49537d9330c9bba7f16a5f8b02da615b5c809cdf7124f356a0f182eccd", "sha256:384b12c9aa8ef95558abdcb50aada56d74bc7cc131dd62d28c2d0e4d3aadd573",
"sha256:45a619d5c1915957449264c81c008934452e3fd3604e36809212300b2a4dab68", "sha256:38950b3a707f6cef09cd3cbb142474357ad1a985ceb44d921bdf7b4647b3e13e",
"sha256:49f90f147883a0c3778fd29d3eb169d56416f25758d0f66775db9184debc8010", "sha256:4aad1b88933fd6dc2846552b89ad0c74ddbba2f0884e2c162aa368374bf5abab",
"sha256:571b5a758baf1cb6a04233fb23d6cf1ca60b31f9f641b1700bfaab1194020555", "sha256:4ac6148008c169603070c092e81f88738f1a0c511e07bd2bb0f9ef542d375da9",
"sha256:5ac381e8b1259925287ccc5a87d9cf6322a2dc88ae28a97fe3e196385288413f", "sha256:4deb1d2a45861ae6f0b12ea0a786a03d19d29edcc7e05775b85ec2877cb54c5e",
"sha256:6153db744a743c0c8c91b8e3b9d40e0b13a5d31dbf8a12748c6d9bfd3ddc01ad", "sha256:59aa2c124df72cc75ed72c8d6005c442d4685691a30c55321e00ed915ad1a291",
"sha256:6fd63afd14a16f5d6b408f623cc2142917a1f92855f0df997e09a49f0341be8a", "sha256:5a47d2123a9ec86660fe0e8d0ebf0aa6bc6a17edc63f338b73ea20ba11713f12",
"sha256:70acbcaba2a638923c2d337e0edea210505708d7859b87c2bd81e8f9902ae826", "sha256:5cc901c2ab9409b4b7ac7b5bcc3e86ac14548627062463da0af3b6b7c555a871",
"sha256:70b1594d56ed32d56ed21a7fbb2a5c6fd7446cdb7b21e749c9791eac3a64d9e4", "sha256:6c1db03e8dff7b9f955a0fb9907eb9ca5da75b5ce056c0c93d33100a35050281",
"sha256:76638865c83b1bb33bcac2a61ce4d13c17dba2204969dedb9ab60ef62bede686", "sha256:7ce80c0a65a6ea90ef9c1f63c8593fcd2929448613fc8da0adf3e6bfad669d08",
"sha256:7b2ec162c87fc496aa568258ac88631a2ce0acfe681a9af40842fc55deaedc99", "sha256:809c19241c14433c5d6135e1b6c72da4e3b56d5c865ad5736ab99af8896b8f41",
"sha256:7cee2cef07c8d76894ebefc54e4bb707dfc7f258ad155bd61d87f6cd487a70ff", "sha256:83792cb4e0b5af480588601467c0764242b9a483caea71ef12d22a0d0d6bdce2",
"sha256:7d16d4498f8b374fc625c4037742fbdd7f9ac383fd50b06f4df00c81ef60e829", "sha256:846fa202bd7ee0f6215c897a1d33238ef071b50766339186687bd9b7a6d26ac5",
"sha256:b50bc1780681b127e28f0075dfb81d6135c3a293e0c1d0211133c75e2179b6c0", "sha256:9f5529fc02009f96ba95bea48870173426879dc19eec49ca8e08cd63ecd82ddb",
"sha256:bd0582f831ad5bcad6ca001deba4568573a4675437db17c4031939156ff339fa", "sha256:a423c2ea001c6265ed28700df056f75e26215fd28c001e93ef4380b0f05f9547",
"sha256:cfd40d8a4b59f7567620410f966bb1f32dc555b2b19f82a91b147fac296f645c", "sha256:ac4428094b42907aba5879c7c000d01c8278d451a3b7cccd2103e21f6397ea75",
"sha256:e3ae410089de680e8f84c68b755b42bc42c0ceb8c03dbea88a5099747091d38e", "sha256:b1ae48d87f10d1384e5beecd169c77502fcc04a2c00a4c02b85f0a94b419e5f9",
"sha256:e9046e559c299b395b39ac7dbf16005308821c2f24a63cae2ab173bd6aa11616", "sha256:bf4e972a88f8841d8fdc6db1a75e0f8d763e66e3754b03006cbc3854d89f1cb1",
"sha256:ef6be704ae2bc8ad0ebc5cb850ee9139493b0fc4e81abcc240fb392a63ebc808", "sha256:c6414f6aad598364aaf81068cabb077894eb88fed99c6a65e6e8217bab62ae7a",
"sha256:f8dc19d92896558f9c4317ee365729ead9d7bbcf2052a9a19a3ef17abbb8ac5b" "sha256:c710fcb7ee32f67baf25aa9ffede4795fd5d93b163ce95fdc724383e38c9df96",
"sha256:c7be4b8a09852291c3c48d3c25d1b876d2494a0a674980089ac9d5e0d78bd132",
"sha256:c9e5ffb910b14f090ac9c38599063e354887a5f6d7e6d26795e916b4514f2c1a",
"sha256:e0697b826da6c2472bb6488db4c0a7fa8af0d52fa08833ceb3681358914b14e5",
"sha256:e9a3edd5f714229d41057d56ac0f39ad9bdba6767e8c888c951869f0bdd129b0"
], ],
"version": "==6.1.0" "version": "==6.2.1"
}, },
"protobuf": { "protobuf": {
"hashes": [ "hashes": [
"sha256:26c0d756c7ad6823fccbc3b5f84c619b9cc7ac281496fe0a9d78e32023c45034", "sha256:125713564d8cfed7610e52444c9769b8dcb0b55e25cc7841f2290ee7bc86636f",
"sha256:3200046e4d4f6c42ed66257dbe15e2e5dc76072c280e9b3d69dc8f3a4fa3fbbc", "sha256:1accdb7a47e51503be64d9a57543964ba674edac103215576399d2d0e34eac77",
"sha256:368f1bae6dd22d04fd2254d30cd301863408a96ff604422e3ddd8ab601f095a4", "sha256:27003d12d4f68e3cbea9eb67427cab3bfddd47ff90670cb367fcd7a3a89b9657",
"sha256:3902fa1920b4ef9f710797496b309efc5ccd0faeba44dc82ed6a711a244764a0", "sha256:3264f3c431a631b0b31e9db2ae8c927b79fc1a7b1b06b31e8e5bcf2af91fe896",
"sha256:3a7a8925ba6481b9241cdb5d69cd0b0700f23efed6bb691dc9543faa4aa25d6f", "sha256:3c5ab0f5c71ca5af27143e60613729e3488bb45f6d3f143dc918a20af8bab0bf",
"sha256:4bc33d49f43c6e9916fb56b7377cb4478cbf25824b4d2bedfb8a4e3df31c12ca", "sha256:45dcf8758873e3f69feab075e5f3177270739f146255225474ee0b90429adef6",
"sha256:568b434a36e31ed30d60d600b2227666ce150b8b5275948f50411481a4575d6d", "sha256:56a77d61a91186cc5676d8e11b36a5feb513873e4ae88d2ee5cf530d52bbcd3b",
"sha256:5c393cd665d03ce6b29561edd6b0cc4bcb3fb8e2a7843e8f223d693f07f61b40", "sha256:5984e4947bbcef5bd849d6244aec507d31786f2dd3344139adc1489fb403b300",
"sha256:80072e9ba36c73cf89c01f669c7b123733fc2de1780b428082a850f53cc7865f", "sha256:6b0441da73796dd00821763bb4119674eaf252776beb50ae3883bed179a60b2a",
"sha256:843f498e98ad1469ad54ecb4a7ccf48605a1c5d2bd26ae799c7a2cddab4a37ec", "sha256:6f6677c5ade94d4fe75a912926d6796d5c71a2a90c2aeefe0d6f211d75c74789",
"sha256:aa45443035651cbfae74c8deb53358ba660d8e7a5fbab3fc4beb33fb3e3ca4be", "sha256:84a825a9418d7196e2acc48f8746cf1ee75877ed2f30433ab92a133f3eaf8fbe",
"sha256:aaab817d9d038dd5f56a6fb2b2e8ae68caf1fd28cc6a963c755fa73268495c13", "sha256:b842c34fe043ccf78b4a6cf1019d7b80113707d68c88842d061fa2b8fb6ddedc",
"sha256:e6f68b9979dc8f75299293d682f67fecb72d78f98652da2eeb85c85edef1ca94", "sha256:ca33d2f09dae149a1dcf942d2d825ebb06343b77b437198c9e2ef115cf5d5bc1",
"sha256:e7366cabddff3441d583fdc0176ab42eba4ee7090ef857d50c4dd59ad124003a", "sha256:db83b5c12c0cd30150bb568e6feb2435c49ce4e68fe2d7b903113f0e221e58fe",
"sha256:f0144ad97cd28bfdda0567b9278d25061ada5ad2b545b538cd3577697b32bda3", "sha256:f50f3b1c5c1c1334ca7ce9cad5992f098f460ffd6388a3cabad10b66c2006b09",
"sha256:f655338491481f482042f19016647e50365ab41b75b486e0df56e0dcc425abf4" "sha256:f99f127909731cafb841c52f9216e447d3e4afb99b17bebfad327a75aee206de"
], ],
"version": "==3.9.2" "version": "==3.10.0"
},
"pycparser": {
"hashes": [
"sha256:a988718abfad80b6b157acce7bf130a30876d27603738ac39f140993246b25b3"
],
"version": "==2.19"
},
"pynacl": {
"hashes": [
"sha256:05c26f93964373fc0abe332676cb6735f0ecad27711035b9472751faa8521255",
"sha256:0c6100edd16fefd1557da078c7a31e7b7d7a52ce39fdca2bec29d4f7b6e7600c",
"sha256:0d0a8171a68edf51add1e73d2159c4bc19fc0718e79dec51166e940856c2f28e",
"sha256:1c780712b206317a746ace34c209b8c29dbfd841dfbc02aa27f2084dd3db77ae",
"sha256:2424c8b9f41aa65bbdbd7a64e73a7450ebb4aa9ddedc6a081e7afcc4c97f7621",
"sha256:2d23c04e8d709444220557ae48ed01f3f1086439f12dbf11976e849a4926db56",
"sha256:30f36a9c70450c7878053fa1344aca0145fd47d845270b43a7ee9192a051bf39",
"sha256:37aa336a317209f1bb099ad177fef0da45be36a2aa664507c5d72015f956c310",
"sha256:4943decfc5b905748f0756fdd99d4f9498d7064815c4cf3643820c9028b711d1",
"sha256:53126cd91356342dcae7e209f840212a58dcf1177ad52c1d938d428eebc9fee5",
"sha256:57ef38a65056e7800859e5ba9e6091053cd06e1038983016effaffe0efcd594a",
"sha256:5bd61e9b44c543016ce1f6aef48606280e45f892a928ca7068fba30021e9b786",
"sha256:6482d3017a0c0327a49dddc8bd1074cc730d45db2ccb09c3bac1f8f32d1eb61b",
"sha256:7d3ce02c0784b7cbcc771a2da6ea51f87e8716004512493a2b69016326301c3b",
"sha256:a14e499c0f5955dcc3991f785f3f8e2130ed504fa3a7f44009ff458ad6bdd17f",
"sha256:a39f54ccbcd2757d1d63b0ec00a00980c0b382c62865b61a505163943624ab20",
"sha256:aabb0c5232910a20eec8563503c153a8e78bbf5459490c49ab31f6adf3f3a415",
"sha256:bd4ecb473a96ad0f90c20acba4f0bf0df91a4e03a1f4dd6a4bdc9ca75aa3a715",
"sha256:bf459128feb543cfca16a95f8da31e2e65e4c5257d2f3dfa8c0c1031139c9c92",
"sha256:e2da3c13307eac601f3de04887624939aca8ee3c9488a0bb0eca4fb9401fc6b1",
"sha256:f67814c38162f4deb31f68d590771a29d5ae3b1bd64b75cf232308e5c74777e0"
],
"version": "==1.3.0"
},
"pyyaml": {
"hashes": [
"sha256:0113bc0ec2ad727182326b61326afa3d1d8280ae1122493553fd6f4397f33df9",
"sha256:01adf0b6c6f61bd11af6e10ca52b7d4057dd0be0343eb9283c878cf3af56aee4",
"sha256:5124373960b0b3f4aa7df1707e63e9f109b5263eca5976c66e08b1c552d4eaf8",
"sha256:5ca4f10adbddae56d824b2c09668e91219bb178a1eee1faa56af6f99f11bf696",
"sha256:7907be34ffa3c5a32b60b95f4d95ea25361c951383a894fec31be7252b2b6f34",
"sha256:7ec9b2a4ed5cad025c2278a1e6a19c011c80a3caaac804fd2d329e9cc2c287c9",
"sha256:87ae4c829bb25b9fe99cf71fbb2140c448f534e24c998cc60f39ae4f94396a73",
"sha256:9de9919becc9cc2ff03637872a440195ac4241c80536632fffeb6a1e25a74299",
"sha256:a5a85b10e450c66b49f98846937e8cfca1db3127a9d5d1e31ca45c3d0bef4c5b",
"sha256:b0997827b4f6a7c286c01c5f60384d218dca4ed7d9efa945c3e1aa623d5709ae",
"sha256:b631ef96d3222e62861443cc89d6563ba3eeb816eeb96b2629345ab795e53681",
"sha256:bf47c0607522fdbca6c9e817a6e81b08491de50f3766a7a0e6a5be7905961b41",
"sha256:f81025eddd0327c7d4cfe9b62cf33190e1e736cc6e97502b3ec425f574b3e7a8"
],
"index": "pypi",
"version": "==5.1.2"
}, },
"six": { "six": {
"hashes": [ "hashes": [
"sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c", "sha256:1f1b7d42e254082a9db6279deae68afb421ceba6158efa6131de7b3003ee93fd",
"sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73" "sha256:30f610279e8b2578cab6db20741130331735c781b56053c59c4076da27f06b66"
], ],
"version": "==1.12.0" "version": "==1.13.0"
} }
}, },
"develop": { "develop": {
@ -176,10 +346,10 @@
}, },
"attrs": { "attrs": {
"hashes": [ "hashes": [
"sha256:69c0dbf2ed392de1cb5ec704444b08a5ef81680a61cb899dc08127123af36a79", "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c",
"sha256:f0b870f674851ecbfbbbd364d6b5cbdff9dcedbc7f3f5e18a6891057f21fe399" "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72"
], ],
"version": "==19.1.0" "version": "==19.3.0"
}, },
"black": { "black": {
"hashes": [ "hashes": [
@ -212,11 +382,11 @@
}, },
"flake8": { "flake8": {
"hashes": [ "hashes": [
"sha256:19241c1cbc971b9962473e4438a2ca19749a7dd002dd1a946eaba171b4114548", "sha256:45681a117ecc81e870cbf1262835ae4af5e7a8b08e40b944a8a6e6b895914cfb",
"sha256:8e9dfa3cecb2400b3738a42c54c3043e821682b9c840b0448c0503f781130696" "sha256:49356e766643ad15072a789a20915d3c91dc89fd313ccd71802303fd67e4deca"
], ],
"index": "pypi", "index": "pypi",
"version": "==3.7.8" "version": "==3.7.9"
}, },
"identify": { "identify": {
"hashes": [ "hashes": [
@ -230,6 +400,7 @@
"sha256:aa18d7378b00b40847790e7c27e11673d7fed219354109d0e7b9e5b25dc3ad26", "sha256:aa18d7378b00b40847790e7c27e11673d7fed219354109d0e7b9e5b25dc3ad26",
"sha256:d5f18a79777f3aa179c145737780282e27b508fc8fd688cb17c7a813e8bd39af" "sha256:d5f18a79777f3aa179c145737780282e27b508fc8fd688cb17c7a813e8bd39af"
], ],
"markers": "python_version < '3.8'",
"version": "==0.23" "version": "==0.23"
}, },
"importlib-resources": { "importlib-resources": {
@ -270,11 +441,11 @@
}, },
"pre-commit": { "pre-commit": {
"hashes": [ "hashes": [
"sha256:1d3c0587bda7c4e537a46c27f2c84aa006acc18facf9970bf947df596ce91f3f", "sha256:9f152687127ec90642a2cc3e4d9e1e6240c4eb153615cb02aa1ad41d331cbb6e",
"sha256:fa78ff96e8e9ac94c748388597693f18b041a181c94a4f039ad20f45287ba44a" "sha256:c2e4810d2d3102d354947907514a78c5d30424d299dc0fe48f5aa049826e9b50"
], ],
"index": "pypi", "index": "pypi",
"version": "==1.18.3" "version": "==1.20.0"
}, },
"pycodestyle": { "pycodestyle": {
"hashes": [ "hashes": [
@ -306,14 +477,15 @@
"sha256:bf47c0607522fdbca6c9e817a6e81b08491de50f3766a7a0e6a5be7905961b41", "sha256:bf47c0607522fdbca6c9e817a6e81b08491de50f3766a7a0e6a5be7905961b41",
"sha256:f81025eddd0327c7d4cfe9b62cf33190e1e736cc6e97502b3ec425f574b3e7a8" "sha256:f81025eddd0327c7d4cfe9b62cf33190e1e736cc6e97502b3ec425f574b3e7a8"
], ],
"index": "pypi",
"version": "==5.1.2" "version": "==5.1.2"
}, },
"six": { "six": {
"hashes": [ "hashes": [
"sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c", "sha256:1f1b7d42e254082a9db6279deae68afb421ceba6158efa6131de7b3003ee93fd",
"sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73" "sha256:30f610279e8b2578cab6db20741130331735c781b56053c59c4076da27f06b66"
], ],
"version": "==1.12.0" "version": "==1.13.0"
}, },
"toml": { "toml": {
"hashes": [ "hashes": [
@ -324,10 +496,10 @@
}, },
"virtualenv": { "virtualenv": {
"hashes": [ "hashes": [
"sha256:680af46846662bb38c5504b78bad9ed9e4f3ba2d54f54ba42494fdf94337fe30", "sha256:11cb4608930d5fd3afb545ecf8db83fa50e1f96fc4fca80c94b07d2c83146589",
"sha256:f78d81b62d3147396ac33fc9d77579ddc42cc2a98dd9ea38886f616b33bc7fb2" "sha256:d257bb3773e48cac60e475a19b608996c73f4d333b3ba2e4e57d5ac6134e0136"
], ],
"version": "==16.7.5" "version": "==16.7.7"
}, },
"zipp": { "zipp": {
"hashes": [ "hashes": [

View file

@ -26,6 +26,7 @@ class Application(tk.Frame):
self.radiovar = tk.IntVar(value=1) self.radiovar = tk.IntVar(value=1)
self.show_grid_var = tk.IntVar(value=1) self.show_grid_var = tk.IntVar(value=1)
self.adjust_to_dim_var = tk.IntVar(value=0) self.adjust_to_dim_var = tk.IntVar(value=0)
self.config = appdirs.read_config()
self.core = CoreClient(self) self.core = CoreClient(self)
self.setup_app() self.setup_app()
self.draw_menu() self.draw_menu()

View file

@ -2,6 +2,8 @@ import logging
import shutil import shutil
from pathlib import Path from pathlib import Path
import yaml
# gui home paths # gui home paths
HOME_PATH = Path.home().joinpath(".coretk") HOME_PATH = Path.home().joinpath(".coretk")
BACKGROUNDS_PATH = HOME_PATH.joinpath("backgrounds") BACKGROUNDS_PATH = HOME_PATH.joinpath("backgrounds")
@ -17,6 +19,11 @@ LOCAL_ICONS_PATH = Path(__file__).parent.joinpath("icons").absolute()
LOCAL_BACKGROUND_PATH = Path(__file__).parent.joinpath("backgrounds").absolute() LOCAL_BACKGROUND_PATH = Path(__file__).parent.joinpath("backgrounds").absolute()
class IndentDumper(yaml.Dumper):
def increase_indent(self, flow=False, indentless=False):
return super().increase_indent(flow, False)
def check_directory(): def check_directory():
if HOME_PATH.exists(): if HOME_PATH.exists():
logging.info("~/.coretk exists") logging.info("~/.coretk exists")
@ -36,4 +43,14 @@ def check_directory():
new_background = BACKGROUNDS_PATH.joinpath(background.name) new_background = BACKGROUNDS_PATH.joinpath(background.name)
shutil.copy(background, new_background) shutil.copy(background, new_background)
with CONFIG_PATH.open("w") as f: with CONFIG_PATH.open("w") as f:
f.write("# gui config") yaml.dump(
{"servers": [{"name": "example", "address": "127.0.0.1", "port": 50051}]},
f,
Dumper=IndentDumper,
default_flow_style=False,
)
def read_config():
with CONFIG_PATH.open("r") as f:
return yaml.load(f, Loader=yaml.SafeLoader)

View file

@ -4,7 +4,7 @@ canvas graph action
from core.api.grpc import core_pb2 from core.api.grpc import core_pb2
from coretk.dialogs.emaneconfig import EmaneConfiguration from coretk.dialogs.emaneconfig import EmaneConfiguration
from coretk.dialogs.nodeconfig import NodeConfigDialog from coretk.dialogs.nodeconfig import NodeConfigDialog
from coretk.dialogs.wlanconfig import WlanConfiguration from coretk.dialogs.wlanconfig import WlanConfigDialog
# TODO, finish classifying node types # TODO, finish classifying node types
NODE_TO_TYPE = { NODE_TO_TYPE = {
@ -36,10 +36,15 @@ class CanvasAction:
self.node_to_show_config = None self.node_to_show_config = None
def display_wlan_configuration(self, canvas_node): def display_wlan_configuration(self, canvas_node):
wlan_config = self.canvas.core.wlanconfig_management.configurations[
# print(self.canvas.grpc_manager.wlanconfig_management.configurations)
wlan_config = self.master.core.wlanconfig_management.configurations[
canvas_node.core_id canvas_node.core_id
] ]
WlanConfiguration(self.canvas, self.node_to_show_config, wlan_config) dialog = WlanConfigDialog(
self.master, self.master, self.node_to_show_config, wlan_config
)
dialog.show()
self.node_to_show_config = None self.node_to_show_config = None
def display_emane_configuration(self): def display_emane_configuration(self):

View file

@ -57,6 +57,13 @@ class Edge:
self.interface_2 = None self.interface_2 = None
class CoreServer:
def __init__(self, name, address, port):
self.name = name
self.address = address
self.port = port
class CoreClient: class CoreClient:
def __init__(self, app): def __init__(self, app):
""" """
@ -69,6 +76,14 @@ class CoreClient:
self.master = app.master self.master = app.master
self.interface_helper = None self.interface_helper = None
# distributed server data
self.servers = {}
for server_config in self.app.config["servers"]:
server = CoreServer(
server_config["name"], server_config["address"], server_config["port"]
)
self.servers[server.name] = server
# data for managing the current session # data for managing the current session
self.nodes = {} self.nodes = {}
self.edges = {} self.edges = {}

View file

@ -616,7 +616,7 @@ class CoreMenubar(object):
) )
session_menu.add_command( session_menu.add_command(
label="Emulation servers...", label="Emulation servers...",
command=action.session_emulation_servers, command=self.menu_action.session_servers,
underline=0, underline=0,
) )
session_menu.add_command( session_menu.add_command(

View file

@ -32,7 +32,9 @@ class HookDialog(Dialog):
initial_state = core_pb2.SessionState.Enum.Name(core_pb2.SessionState.RUNTIME) initial_state = core_pb2.SessionState.Enum.Name(core_pb2.SessionState.RUNTIME)
self.state.set(initial_state) self.state.set(initial_state)
self.name.set(f"{initial_state.lower()}_hook.sh") self.name.set(f"{initial_state.lower()}_hook.sh")
combobox = ttk.Combobox(frame, textvariable=self.state, values=values) combobox = ttk.Combobox(
frame, textvariable=self.state, values=values, state="readonly"
)
combobox.grid(row=0, column=2, sticky="ew") combobox.grid(row=0, column=2, sticky="ew")
combobox.bind("<<ComboboxSelected>>", self.state_change) combobox.bind("<<ComboboxSelected>>", self.state_change)

View file

@ -43,10 +43,16 @@ class NodeConfigDialog(Dialog):
entry = tk.Entry(frame, textvariable=self.name) entry = tk.Entry(frame, textvariable=self.name)
entry.grid(row=0, column=0, padx=2, sticky="ew") entry.grid(row=0, column=0, padx=2, sticky="ew")
combobox = ttk.Combobox(frame, textvariable=self.type, values=DEFAULTNODES) combobox = ttk.Combobox(
frame, textvariable=self.type, values=DEFAULTNODES, state="readonly"
)
combobox.grid(row=0, column=1, padx=2, sticky="ew") combobox.grid(row=0, column=1, padx=2, sticky="ew")
combobox = ttk.Combobox(frame, textvariable=self.server, values=["localhost"]) servers = [""]
servers.extend(list(sorted(self.app.core.servers.keys())))
combobox = ttk.Combobox(
frame, textvariable=self.server, values=servers, state="readonly"
)
combobox.current(0) combobox.current(0)
combobox.grid(row=0, column=2, sticky="ew") combobox.grid(row=0, column=2, sticky="ew")

View file

@ -0,0 +1,169 @@
import tkinter as tk
from coretk.coreclient import CoreServer
from coretk.dialogs.dialog import Dialog
DEFAULT_NAME = "example"
DEFAULT_ADDRESS = "127.0.0.1"
DEFAULT_PORT = 50051
class ServersDialog(Dialog):
def __init__(self, master, app):
super().__init__(master, app, "CORE Servers", modal=True)
self.name = tk.StringVar(value=DEFAULT_NAME)
self.address = tk.StringVar(value=DEFAULT_ADDRESS)
self.port = tk.IntVar(value=DEFAULT_PORT)
self.servers = None
self.selected_index = None
self.selected = None
self.save_button = None
self.delete_button = None
self.draw()
def draw(self):
self.columnconfigure(0, weight=1)
self.rowconfigure(0, weight=1)
self.draw_servers()
self.draw_server_configuration()
self.draw_servers_buttons()
self.draw_apply_buttons()
def draw_servers(self):
frame = tk.Frame(self)
frame.grid(pady=2, sticky="nsew")
frame.columnconfigure(0, weight=1)
frame.rowconfigure(0, weight=1)
scrollbar = tk.Scrollbar(frame, orient=tk.VERTICAL)
scrollbar.grid(row=0, column=1, sticky="ns")
self.servers = tk.Listbox(
frame,
selectmode=tk.SINGLE,
yscrollcommand=scrollbar.set,
relief=tk.FLAT,
highlightthickness=0.5,
bd=0,
)
self.servers.grid(row=0, column=0, sticky="nsew")
self.servers.bind("<<ListboxSelect>>", self.handle_server_change)
for server in self.app.core.servers:
self.servers.insert(tk.END, server)
scrollbar.config(command=self.servers.yview)
def draw_server_configuration(self):
label = tk.Label(self, text="Server Configuration")
label.grid(pady=2, sticky="ew")
frame = tk.Frame(self)
frame.grid(pady=2, sticky="ew")
frame.columnconfigure(1, weight=1)
frame.columnconfigure(3, weight=1)
frame.columnconfigure(5, weight=1)
label = tk.Label(frame, text="Name")
label.grid(row=0, column=0, sticky="w")
entry = tk.Entry(frame, textvariable=self.name)
entry.grid(row=0, column=1, sticky="ew")
label = tk.Label(frame, text="Address")
label.grid(row=0, column=2, sticky="w")
entry = tk.Entry(frame, textvariable=self.address)
entry.grid(row=0, column=3, sticky="ew")
label = tk.Label(frame, text="Port")
label.grid(row=0, column=4, sticky="w")
entry = tk.Entry(frame, textvariable=self.port)
entry.grid(row=0, column=5, sticky="ew")
def draw_servers_buttons(self):
frame = tk.Frame(self)
frame.grid(pady=2, sticky="ew")
for i in range(3):
frame.columnconfigure(i, weight=1)
button = tk.Button(frame, text="Create", command=self.click_create)
button.grid(row=0, column=0, sticky="ew")
self.save_button = tk.Button(
frame, text="Save", state=tk.DISABLED, command=self.click_save
)
self.save_button.grid(row=0, column=1, sticky="ew")
self.delete_button = tk.Button(
frame, text="Delete", state=tk.DISABLED, command=self.click_delete
)
self.delete_button.grid(row=0, column=2, sticky="ew")
def draw_apply_buttons(self):
frame = tk.Frame(self)
frame.grid(sticky="ew")
for i in range(2):
frame.columnconfigure(i, weight=1)
button = tk.Button(
frame, text="Save Configuration", command=self.click_save_configuration
)
button.grid(row=0, column=0, sticky="ew")
button = tk.Button(frame, text="Cancel", command=self.destroy)
button.grid(row=0, column=1, sticky="ew")
def click_save_configuration(self):
pass
def click_create(self):
name = self.name.get()
if name not in self.app.core.servers:
address = self.address.get()
port = self.port.get()
server = CoreServer(name, address, port)
self.app.core.servers[name] = server
self.servers.insert(tk.END, name)
def click_save(self):
name = self.name.get()
if self.selected and name not in self.app.core.servers:
previous_name = self.selected
self.selected = name
server = self.app.core.servers.pop(previous_name)
server.name = name
server.address = self.address.get()
server.port = self.port.get()
self.app.core.servers[name] = server
self.servers.delete(self.selected_index)
self.servers.insert(self.selected_index, name)
self.servers.selection_set(self.selected_index)
def click_delete(self):
if self.selected:
self.servers.delete(self.selected_index)
del self.app.core.servers[self.selected]
self.selected = None
self.selected_index = None
self.name.set(DEFAULT_NAME)
self.address.set(DEFAULT_ADDRESS)
self.port.set(DEFAULT_PORT)
self.servers.selection_clear(0, tk.END)
self.save_button.config(state=tk.DISABLED)
self.delete_button.config(state=tk.DISABLED)
def handle_server_change(self, event):
selection = self.servers.curselection()
if selection:
self.selected_index = selection[0]
self.selected = self.servers.get(self.selected_index)
server = self.app.core.servers[self.selected]
self.name.set(server.name)
self.address.set(server.address)
self.port.set(server.port)
self.save_button.config(state=tk.NORMAL)
self.delete_button.config(state=tk.NORMAL)
else:
self.selected_index = None
self.selected = None
self.save_button.config(state=tk.DISABLED)
self.delete_button.config(state=tk.DISABLED)

View file

@ -3,305 +3,197 @@ wlan configuration
""" """
import tkinter as tk import tkinter as tk
from functools import partial
from coretk.dialogs.mobilityconfig import MobilityConfiguration from coretk.dialogs.dialog import Dialog
from coretk.dialogs.nodeicon import NodeIconDialog from coretk.dialogs.nodeicon import NodeIconDialog
class WlanConfiguration: class WlanConfigDialog(Dialog):
def __init__(self, canvas, canvas_node, config): def __init__(self, master, app, canvas_node, config):
""" """
create an instance of WlanConfiguration create an instance of WlanConfiguration
:param coretk.grpah.CanvasGraph canvas: canvas object :param coretk.grpah.CanvasGraph canvas: canvas object
:param coretk.graph.CanvasNode canvas_node: canvas node object :param coretk.graph.CanvasNode canvas_node: canvas node object
""" """
super().__init__(
self.canvas = canvas master, app, f"{canvas_node.name} Wlan Configuration", modal=True
)
self.image = canvas_node.image self.image = canvas_node.image
self.node_type = canvas_node.node_type
self.name = canvas_node.name
self.canvas_node = canvas_node self.canvas_node = canvas_node
self.top = tk.Toplevel()
self.top.title("wlan configuration")
self.node_name = tk.StringVar()
# self.range_var = tk.DoubleVar()
# self.range_var.set(275.0)
self.config = config self.config = config
self.range_var = tk.StringVar()
# self.range_var.set(config["basic_range"])
self.range_var.set(config["range"])
# self.bandwidth_var = tk.IntVar()
self.bandwidth_var = tk.StringVar()
self.bandwidth_var.set(config["bandwidth"])
self.delay_var = tk.StringVar() self.name = tk.StringVar(value=canvas_node.name)
self.range_var = tk.StringVar(value=config["basic_range"])
self.bandwidth_var = tk.StringVar(value=config["bandwidth"])
self.delay_var = tk.StringVar(value=config["delay"])
self.loss_var = tk.StringVar(value=config["error"])
self.jitter_var = tk.StringVar(value=config["jitter"])
self.ip4_subnet = tk.StringVar()
self.ip6_subnet = tk.StringVar()
self.image_button = None
self.draw()
self.image_modification() def draw(self):
self.wlan_configuration() self.columnconfigure(0, weight=1)
self.subnet() self.draw_name_config()
self.wlan_options() self.draw_wlan_config()
self.config_option() self.draw_subnet()
self.draw_wlan_buttons()
self.draw_apply_buttons()
def image_modification(self): def draw_name_config(self):
""" """
draw image modification part draw image modification part
:return: nothing :return: nothing
""" """
f = tk.Frame(self.top, bg="#d9d9d9") frame = tk.Frame(self)
lbl = tk.Label(f, text="Node name: ", bg="#d9d9d9") frame.grid(pady=2, sticky="ew")
lbl.grid(row=0, column=0, padx=3, pady=3) frame.columnconfigure(0, weight=1)
e = tk.Entry(f, textvariable=self.node_name, bg="white")
e.grid(row=0, column=1, padx=3, pady=3)
b = tk.Button(f, text="None")
b.grid(row=0, column=2, padx=3, pady=3)
b = tk.Button(f, image=self.image, command=lambda: self.click_image)
b.grid(row=0, column=3, padx=3, pady=3)
f.grid(padx=2, pady=2, ipadx=2, ipady=2)
def click_image(self): entry = tk.Entry(frame, textvariable=self.name, bg="white")
NodeIconDialog(self.app, canvas_node=self.canvas_node, node_config=self) entry.grid(row=0, column=0, padx=2, sticky="ew")
def create_string_var(self, val): self.image_button = tk.Button(frame, image=self.image, command=self.click_icon)
""" self.image_button.grid(row=0, column=1, padx=3)
create string variable for convenience
:param str val: text value def draw_wlan_config(self):
:return: nothing
"""
v = tk.StringVar()
v.set(val)
return v
def scrollbar_command(self, entry_widget, delta, event):
"""
change text in entry based on scrollbar action (click up or down)
:param tkinter.Entry entry_widget: entry needed for changing text
:param int or float delta: the amount to change
:param event: scrollbar event
:return: nothing
"""
try:
value = int(entry_widget.get())
except ValueError:
value = float(entry_widget.get())
entry_widget.delete(0, tk.END)
if event == "-1":
entry_widget.insert(tk.END, str(round(value + delta, 1)))
elif event == "1":
entry_widget.insert(tk.END, str(round(value - delta, 1)))
def wlan_configuration(self):
""" """
create wireless configuration table create wireless configuration table
:return: nothing :return: nothing
""" """
lbl = tk.Label(self.top, text="Wireless") label = tk.Label(self, text="Wireless")
lbl.grid(sticky=tk.W, padx=3, pady=3) label.grid(sticky="w", pady=2)
f = tk.Frame( frame = tk.Frame(self)
self.top, frame.grid(pady=2, sticky="ew")
highlightbackground="#b3b3b3", for i in range(2):
highlightcolor="#b3b3b3", frame.columnconfigure(i, weight=1)
highlightthickness=0.5,
bd=0, label = tk.Label(
bg="#d9d9d9", frame,
text=(
"The basic range model calculates on/off "
"connectivity based on pixel distance between nodes."
),
) )
label.grid(row=0, columnspan=2, pady=2, sticky="ew")
lbl = tk.Label( label = tk.Label(frame, text="Range")
f, label.grid(row=1, column=0, sticky="w")
text="The basic range model calculates on/off connectivity based on pixel distance between nodes.", entry = tk.Entry(frame, textvariable=self.range_var)
bg="#d9d9d9", entry.grid(row=1, column=1, sticky="ew")
)
lbl.grid(padx=4, pady=4)
f1 = tk.Frame(f, bg="#d9d9d9") label = tk.Label(frame, text="Bandwidth (bps)")
label.grid(row=2, column=0, sticky="w")
entry = tk.Entry(frame, textvariable=self.bandwidth_var)
entry.grid(row=2, column=1, sticky="ew")
lbl = tk.Label(f1, text="Range: ", bg="#d9d9d9") label = tk.Label(frame, text="Delay (us)")
lbl.grid(row=0, column=0) label.grid(row=3, column=0, sticky="w")
entry = tk.Entry(frame, textvariable=self.delay_var)
entry.grid(row=3, column=1, sticky="ew")
e = tk.Entry( label = tk.Label(frame, text="Loss (%)")
f1, label.grid(row=4, column=0, sticky="w")
# textvariable=self.create_string_var(self.config["basic_range"]), entry = tk.Entry(frame, textvariable=self.loss_var)
textvariable=self.create_string_var(self.config["range"]), entry.grid(row=4, column=1, sticky="ew")
width=5,
bg="white",
)
e.grid(row=0, column=1)
lbl = tk.Label(f1, text="Bandwidth (bps): ", bg="#d9d9d9") label = tk.Label(frame, text="Jitter (us)")
lbl.grid(row=0, column=2) label.grid(row=5, column=0, sticky="w")
entry = tk.Entry(frame, textvariable=self.jitter_var)
entry.grid(row=5, column=1, sticky="ew")
f11 = tk.Frame(f1, bg="#d9d9d9") def draw_subnet(self):
sb = tk.Scrollbar(f11, orient=tk.VERTICAL)
e = tk.Entry(
f11,
textvariable=self.create_string_var(self.config["bandwidth"]),
width=10,
bg="white",
)
sb.config(command=partial(self.scrollbar_command, e, 1000000))
e.grid()
sb.grid(row=0, column=1)
f11.grid(row=0, column=3)
# e = tk.Entry(f1, textvariable=self.bandwidth_var, width=10)
# e.grid(row=0, column=4)
f1.grid(sticky=tk.W, padx=4, pady=4)
f2 = tk.Frame(f, bg="#d9d9d9")
lbl = tk.Label(f2, text="Delay (us): ", bg="#d9d9d9")
lbl.grid(row=0, column=0)
f21 = tk.Frame(f2, bg="#d9d9d9")
sb = tk.Scrollbar(f21, orient=tk.VERTICAL)
e = tk.Entry(
f21, textvariable=self.create_string_var(self.config["delay"]), bg="white"
)
sb.config(command=partial(self.scrollbar_command, e, 5000))
e.grid()
sb.grid(row=0, column=1)
f21.grid(row=0, column=1)
lbl = tk.Label(f2, text="Loss (%): ", bg="#d9d9d9")
lbl.grid(row=0, column=2)
f22 = tk.Frame(f2, bg="#d9d9d9")
sb = tk.Scrollbar(f22, orient=tk.VERTICAL)
e = tk.Entry(
f22, textvariable=self.create_string_var(self.config["error"]), bg="white"
)
sb.config(command=partial(self.scrollbar_command, e, 0.1))
e.grid()
sb.grid(row=0, column=1)
f22.grid(row=0, column=3)
# e = tk.Entry(f2, textvariable=self.create_string_var(0))
# e.grid(row=0, column=3)
f2.grid(sticky=tk.W, padx=4, pady=4)
f3 = tk.Frame(f, bg="#d9d9d9")
lbl = tk.Label(f3, text="Jitter (us): ", bg="#d9d9d9")
lbl.grid()
f31 = tk.Frame(f3, bg="#d9d9d9")
sb = tk.Scrollbar(f31, orient=tk.VERTICAL)
e = tk.Entry(
f31, textvariable=self.create_string_var(self.config["jitter"]), bg="white"
)
sb.config(command=partial(self.scrollbar_command, e, 5000))
e.grid()
sb.grid(row=0, column=1)
f31.grid(row=0, column=1)
f3.grid(sticky=tk.W, padx=4, pady=4)
f.grid(padx=3, pady=3)
def subnet(self):
""" """
create the entries for ipv4 subnet and ipv6 subnet create the entries for ipv4 subnet and ipv6 subnet
:return: nothing :return: nothing
""" """
f = tk.Frame(self.top)
f1 = tk.Frame(f)
lbl = tk.Label(f1, text="IPv4 subnet")
lbl.grid()
e = tk.Entry(f1, width=30, bg="white", textvariable=self.create_string_var(""))
e.grid(row=0, column=1)
f1.grid()
f2 = tk.Frame(f) frame = tk.Frame(self)
lbl = tk.Label(f2, text="IPv6 subnet") frame.grid(pady=3, sticky="ew")
lbl.grid() frame.columnconfigure(1, weight=1)
e = tk.Entry(f2, width=30, bg="white", textvariable=self.create_string_var("")) frame.columnconfigure(3, weight=1)
e.grid(row=0, column=1)
f2.grid()
f.grid(sticky=tk.W, padx=3, pady=3)
def click_ns2_mobility_script(self): label = tk.Label(frame, text="IPv4 Subnet")
dialog = MobilityConfiguration(self.top, self.canvas.core.app, self.canvas_node) label.grid(row=0, column=0, sticky="w")
dialog.show() entry = tk.Entry(frame, textvariable=self.ip4_subnet)
entry.grid(row=0, column=1, sticky="ew")
def wlan_options(self): label = tk.Label(frame, text="IPv6 Subnet")
label.grid(row=0, column=2, sticky="w")
entry = tk.Entry(frame, textvariable=self.ip6_subnet)
entry.grid(row=0, column=3, sticky="ew")
def draw_wlan_buttons(self):
""" """
create wireless node options create wireless node options
:return: :return:
""" """
f = tk.Frame(self.top)
b = tk.Button(
f,
text="ns-2 mobility script...",
command=lambda: self.click_ns2_mobility_script(),
)
b.pack(side=tk.LEFT, padx=1)
b = tk.Button(f, text="Link to all routers")
b.pack(side=tk.LEFT, padx=1)
b = tk.Button(f, text="Choose WLAN members")
b.pack(side=tk.LEFT, padx=1)
f.grid(sticky=tk.W)
def wlan_config_apply(self): frame = tk.Frame(self)
""" frame.grid(pady=2, sticky="ew")
retrieve user's wlan configuration and store the new configuration values for i in range(3):
frame.columnconfigure(i, weight=1)
:return: nothing button = tk.Button(frame, text="ns-2 mobility script...")
""" button.grid(row=0, column=0, padx=2, sticky="ew")
config_frame = self.top.grid_slaves(row=2, column=0)[0]
range_and_bandwidth_frame = config_frame.grid_slaves(row=1, column=0)[0]
range_val = range_and_bandwidth_frame.grid_slaves(row=0, column=1)[0].get()
bandwidth = (
range_and_bandwidth_frame.grid_slaves(row=0, column=3)[0]
.grid_slaves(row=0, column=0)[0]
.get()
)
delay_and_loss_frame = config_frame.grid_slaves(row=2, column=0)[0] button = tk.Button(frame, text="Link to all routers")
delay = ( button.grid(row=0, column=1, padx=2, sticky="ew")
delay_and_loss_frame.grid_slaves(row=0, column=1)[0]
.grid_slaves(row=0, column=0)[0]
.get()
)
loss = (
delay_and_loss_frame.grid_slaves(row=0, column=3)[0]
.grid_slaves(row=0, column=0)[0]
.get()
)
jitter_frame = config_frame.grid_slaves(row=3, column=0)[0] button = tk.Button(frame, text="Choose WLAN members")
jitter_val = ( button.grid(row=0, column=2, padx=2, sticky="ew")
jitter_frame.grid_slaves(row=0, column=1)[0]
.grid_slaves(row=0, column=0)[0]
.get()
)
# set wireless node configuration here def draw_apply_buttons(self):
wlanconfig_manager = self.canvas.core.wlanconfig_management
wlanconfig_manager.set_custom_config(
node_id=self.canvas_node.core_id,
range=range_val,
bandwidth=bandwidth,
jitter=jitter_val,
delay=delay,
error=loss,
)
self.top.destroy()
def config_option(self):
""" """
create node configuration options create node configuration options
:return: nothing :return: nothing
""" """
f = tk.Frame(self.top, bg="#d9d9d9") frame = tk.Frame(self)
b = tk.Button(f, text="Apply", bg="#d9d9d9", command=self.wlan_config_apply) frame.grid(sticky="ew")
b.grid(padx=2, pady=2) for i in range(2):
b = tk.Button(f, text="Cancel", bg="#d9d9d9", command=self.top.destroy) frame.columnconfigure(i, weight=1)
b.grid(row=0, column=1, padx=2, pady=2)
f.grid(padx=4, pady=4) button = tk.Button(frame, text="Apply", command=self.click_apply)
button.grid(row=0, column=0, padx=2, sticky="ew")
button = tk.Button(frame, text="Cancel", command=self.destroy)
button.grid(row=0, column=1, padx=2, sticky="ew")
def click_icon(self):
dialog = NodeIconDialog(self, self.app, self.canvas_node)
dialog.show()
if dialog.image:
self.image = dialog.image
self.image_button.config(image=self.image)
def click_apply(self):
"""
retrieve user's wlan configuration and store the new configuration values
:return: nothing
"""
basic_range = self.range_var.get()
bandwidth = self.bandwidth_var.get()
delay = self.delay_var.get()
loss = self.loss_var.get()
jitter = self.jitter_var.get()
# set wireless node configuration here
wlanconfig_manager = self.app.core.wlanconfig_management
wlanconfig_manager.set_custom_config(
node_id=self.canvas_node.core_id,
range=basic_range,
bandwidth=bandwidth,
jitter=jitter,
delay=delay,
error=loss,
)
self.destroy()

View file

@ -11,6 +11,7 @@ from coretk.appdirs import XML_PATH
from coretk.dialogs.canvasbackground import CanvasBackgroundDialog from coretk.dialogs.canvasbackground import CanvasBackgroundDialog
from coretk.dialogs.canvassizeandscale import SizeAndScaleDialog from coretk.dialogs.canvassizeandscale import SizeAndScaleDialog
from coretk.dialogs.hooks import HooksDialog from coretk.dialogs.hooks import HooksDialog
from coretk.dialogs.servers import ServersDialog
from coretk.dialogs.sessionoptions import SessionOptionsDialog from coretk.dialogs.sessionoptions import SessionOptionsDialog
from coretk.dialogs.sessions import SessionsDialog from coretk.dialogs.sessions import SessionsDialog
@ -295,10 +296,6 @@ def session_reset_node_positions():
logging.debug("Click session reset node positions") logging.debug("Click session reset node positions")
def session_emulation_servers():
logging.debug("Click session emulation servers")
def help_about(): def help_about():
logging.debug("Click help About") logging.debug("Click help About")
@ -401,3 +398,8 @@ class MenuAction:
logging.debug("Click session hooks") logging.debug("Click session hooks")
dialog = HooksDialog(self.app, self.app) dialog = HooksDialog(self.app, self.app)
dialog.show() dialog.show()
def session_servers(self):
logging.debug("Click session emulation servers")
dialog = ServersDialog(self.app, self.app)
dialog.show()