RemoteRF 0.0.7.45__tar.gz → 0.0.7.46__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. {remoterf-0.0.7.45/src/remoteRF.egg-info → remoterf-0.0.7.46}/PKG-INFO +1 -1
  2. {remoterf-0.0.7.45 → remoterf-0.0.7.46}/setup.py +2 -3
  3. remoterf-0.0.7.46/src/remoteRF/core/certs/ca.crt +32 -0
  4. remoterf-0.0.7.46/src/remoteRF/core/certs/ca.key +52 -0
  5. remoterf-0.0.7.46/src/remoteRF/core/certs/cert.pem +19 -0
  6. remoterf-0.0.7.46/src/remoteRF/core/certs/key.pem +28 -0
  7. remoterf-0.0.7.46/src/remoteRF/core/certs/server.crt +19 -0
  8. remoterf-0.0.7.46/src/remoteRF/core/certs/server.key +28 -0
  9. {remoterf-0.0.7.45 → remoterf-0.0.7.46}/src/remoteRF/core/grpc_client.py +5 -7
  10. {remoterf-0.0.7.45 → remoterf-0.0.7.46/src/remoteRF.egg-info}/PKG-INFO +1 -1
  11. {remoterf-0.0.7.45 → remoterf-0.0.7.46}/src/remoteRF.egg-info/SOURCES.txt +7 -3
  12. {remoterf-0.0.7.45 → remoterf-0.0.7.46}/src/remoteRF.egg-info/entry_points.txt +0 -1
  13. remoterf-0.0.7.45/src/remoteRF/config/cert_fetcher.py +0 -140
  14. remoterf-0.0.7.45/src/remoteRF/config/config_cli.py +0 -139
  15. {remoterf-0.0.7.45 → remoterf-0.0.7.46}/LICENSE +0 -0
  16. {remoterf-0.0.7.45 → remoterf-0.0.7.46}/MANIFEST.in +0 -0
  17. {remoterf-0.0.7.45 → remoterf-0.0.7.46}/README.md +0 -0
  18. {remoterf-0.0.7.45 → remoterf-0.0.7.46}/setup.cfg +0 -0
  19. {remoterf-0.0.7.45 → remoterf-0.0.7.46}/src/remoteRF/__init__.py +0 -0
  20. {remoterf-0.0.7.45 → remoterf-0.0.7.46}/src/remoteRF/common/__init__.py +0 -0
  21. {remoterf-0.0.7.45 → remoterf-0.0.7.46}/src/remoteRF/common/grpc/__init__.py +0 -0
  22. {remoterf-0.0.7.45 → remoterf-0.0.7.46}/src/remoteRF/common/grpc/grpc_pb2.py +0 -0
  23. {remoterf-0.0.7.45 → remoterf-0.0.7.46}/src/remoteRF/common/grpc/grpc_pb2_grpc.py +0 -0
  24. {remoterf-0.0.7.45 → remoterf-0.0.7.46}/src/remoteRF/common/utils/__init__.py +0 -0
  25. {remoterf-0.0.7.45 → remoterf-0.0.7.46}/src/remoteRF/common/utils/ansi_codes.py +0 -0
  26. {remoterf-0.0.7.45 → remoterf-0.0.7.46}/src/remoteRF/common/utils/api_token.py +0 -0
  27. {remoterf-0.0.7.45 → remoterf-0.0.7.46}/src/remoteRF/common/utils/list_string.py +0 -0
  28. {remoterf-0.0.7.45 → remoterf-0.0.7.46}/src/remoteRF/common/utils/process_arg.py +0 -0
  29. {remoterf-0.0.7.45 → remoterf-0.0.7.46}/src/remoteRF/core/__init__.py +0 -0
  30. {remoterf-0.0.7.45 → remoterf-0.0.7.46}/src/remoteRF/core/acc_login.py +0 -0
  31. {remoterf-0.0.7.45 → remoterf-0.0.7.46}/src/remoteRF/core/app.py +0 -0
  32. {remoterf-0.0.7.45/src/remoteRF/config → remoterf-0.0.7.46/src/remoteRF/core/certs}/__init__.py +0 -0
  33. {remoterf-0.0.7.45 → remoterf-0.0.7.46}/src/remoteRF/core/grpc_acc.py +0 -0
  34. {remoterf-0.0.7.45 → remoterf-0.0.7.46}/src/remoteRF/core/version.py +0 -0
  35. {remoterf-0.0.7.45 → remoterf-0.0.7.46}/src/remoteRF/drivers/__init__.py +0 -0
  36. {remoterf-0.0.7.45 → remoterf-0.0.7.46}/src/remoteRF/drivers/adalm_pluto/__init__.py +0 -0
  37. {remoterf-0.0.7.45 → remoterf-0.0.7.46}/src/remoteRF/drivers/adalm_pluto/pluto_remote.py +0 -0
  38. {remoterf-0.0.7.45 → remoterf-0.0.7.46}/src/remoteRF.egg-info/dependency_links.txt +0 -0
  39. {remoterf-0.0.7.45 → remoterf-0.0.7.46}/src/remoteRF.egg-info/requires.txt +0 -0
  40. {remoterf-0.0.7.45 → remoterf-0.0.7.46}/src/remoteRF.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: remoterf
3
- Version: 0.0.7.45
3
+ Version: 0.0.7.46
4
4
  Summary: A python API to remotely access signal centric hardware. Client-side only! Courtesy of Wireless Lab @ UCLA & Prof. Ian Roberts.
5
5
  Author: Ethan Ge
6
6
  Author-email: ethoGalaxy@gmail.com
@@ -6,7 +6,7 @@ with open("README.md", "r", encoding="utf-8") as fh:
6
6
 
7
7
  setup(
8
8
  name="remoterf",
9
- version="0.0.7.45",
9
+ version="0.0.7.46",
10
10
  author="Ethan Ge",
11
11
  author_email="ethoGalaxy@gmail.com",
12
12
  description="A python API to remotely access signal centric hardware. Client-side only! Courtesy of Wireless Lab @ UCLA & Prof. Ian Roberts.",
@@ -28,8 +28,7 @@ setup(
28
28
  entry_points={
29
29
  'console_scripts': [
30
30
  'remoterf-login=remoteRF.core.acc_login:main',
31
- 'remoterf-v=remoteRF.core.version:main',
32
- 'remoterf-config=remoteRF.config.config_cli:main',
31
+ 'remoterf-v=remoteRF.core.version:main'
33
32
  ],
34
33
  },
35
34
  )
@@ -0,0 +1,32 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIFmzCCA4OgAwIBAgIURcP62Zj3L/2bVIIdFu+UcAMklBQwDQYJKoZIhvcNAQEL
3
+ BQAwXTELMAkGA1UEBhMCVVMxDjAMBgNVBAgMBVN0YXRlMQ0wCwYDVQQHDARDaXR5
4
+ MRUwEwYDVQQKDAxDb21wYW55IE5hbWUxGDAWBgNVBAMMD3d3dy5leGFtcGxlLmNv
5
+ bTAeFw0yNDA2MjcyMDQ3MTNaFw0yNTA2MjcyMDQ3MTNaMF0xCzAJBgNVBAYTAlVT
6
+ MQ4wDAYDVQQIDAVTdGF0ZTENMAsGA1UEBwwEQ2l0eTEVMBMGA1UECgwMQ29tcGFu
7
+ eSBOYW1lMRgwFgYDVQQDDA93d3cuZXhhbXBsZS5jb20wggIiMA0GCSqGSIb3DQEB
8
+ AQUAA4ICDwAwggIKAoICAQCc92USDLn60Ju8+/fIMMsgIRD71cfuO2R0nD0+Tfe7
9
+ QOvnGpY7xSmtFbzjXadqjjqM8JsADyOJzudYf+KhfbfMcX6WYj1Flx3XVrjws5Nf
10
+ XPSYYT/uo+vBKJl7rFCYdrGFPVTI8oBz9EsdURriXOGn+rhUP4vIcx/0SKYQvWgI
11
+ oJ8huQ1A7bgrfl2qhyjYa+4AhMAF+YtWSI4fsSR3hwb2wR2Xb8zenVvaTAoc0GvY
12
+ TgxQ5Xue2UD/qR/wezGDQozPIsLXAYiK7fIvHxq1rzhAOOIGEtyp2uMAoq7NtYfu
13
+ 5ZgRcoD/O6pAPKZKdpC6toGu3kqj2W7bAWAeZzMOCa3DxYCa+r+dW96fhGhA5HLc
14
+ 4rwZDVa3hK1d8n0NmkkX2LUdFT5KXuB6InyeXKK/ZKNEAnxSn3cdaqKZWr9Bxbsz
15
+ G9osCNOzN8IQGILTGdQlGirraCQM+P0SvVFj8C22Mo5tuBG1eal1vFvO9LMwl2GP
16
+ SnZ4QB8BXpwAVEpOWe72lLRE99+5GhZvWQAi4RQ+0Mn2xwyJY8gkrK5i5m8kHKzs
17
+ naIfpRrtZ9oo821WTisVYQq5U7QUbPaiE4xEOMEDTiOSatvxQMqu6OGDWLxlqcgv
18
+ Fh317R+H6dhn+hLTGe6wnCozPTHqZoqv664gTs7KFHUgI/gU/dBc3oI/VEyrmuTI
19
+ GwIDAQABo1MwUTAdBgNVHQ4EFgQU/iskMPrT7yToKDJudHOUHRhnRG0wHwYDVR0j
20
+ BBgwFoAU/iskMPrT7yToKDJudHOUHRhnRG0wDwYDVR0TAQH/BAUwAwEB/zANBgkq
21
+ hkiG9w0BAQsFAAOCAgEAJpU4vErO68CduIzqr925gmKzUeSOqoXCLJGvlbUl3HWa
22
+ ieba6oL33UjB/6s5BUHjqTtUiYa1hHoPsI6S9HC7cCaykdWzrtPOrXpF/G4clT8H
23
+ 3xkk7lQNwYH0+OP3ITbrY0OiqsTBjVY0ltKOOqzrzRMHcAw6Jc1Zp/7tYv9ZzqYx
24
+ NiwDYlGO8rhyGa2k1zNazJbh7YT0hBKPYkhqF/jheMFBwT3cpw6rJomP3rcSUaK2
25
+ 0DP+v4taW7xxfxf8vI2Xdhy9XLdqyVNq0btFxy2cAOj19zSjnHvPlwXSjuRPht0W
26
+ 4ZV7moOQYNAGG2376j/LFD5tojkJLWEsiOAd5ve/6FovkPiDfVnPpvTCsidnvqA3
27
+ nNvTV5UJOBYzM1zI8xfDRa5Mg2ggQR75fvXjTo2Jo/FDx+PN70brXJM/1zuH0Znh
28
+ z7Y03uS8cbkLiXgtp/8x9KIRASG/WFMMNtG/YmPcufCGhHlAELI6iKLdcQ5+8dHk
29
+ pmDiRWixBnkyNXu152TZBLvGUHtOAzw3aTZsir+CCdlNeNNqEW1FV21WAsYzDT2M
30
+ TsCr/azaguNozPlapt+nORWMyMR1jr7zcE2XBfmMZzLzf5t7V8RC2UoeSy09fFjT
31
+ vA6swXwe32eKYfeNJSvjiajlqXhZUrQJFBCHhOBgKQxFvU4OzVpPy8q7yszRCtg=
32
+ -----END CERTIFICATE-----
@@ -0,0 +1,52 @@
1
+ -----BEGIN PRIVATE KEY-----
2
+ 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
51
+ dnNqQyFgF4k8C3gXyqzTr+Zlc4xaFQ==
52
+ -----END PRIVATE KEY-----
@@ -0,0 +1,19 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDFDCCAfygAwIBAgIUaORvuL3d7VVDuewDxgBibhqrWqkwDQYJKoZIhvcNAQEL
3
+ BQAwETEPMA0GA1UEAwwGdW51c2VkMB4XDTI0MDYyNzIxMDU1OVoXDTI1MDYyNzIx
4
+ MDU1OVowETEPMA0GA1UEAwwGdW51c2VkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
5
+ MIIBCgKCAQEAlT1YZUyg3YZXzHxP6/dS7vmH/unpODa5vSFTnKnOF+lR1GSCok4j
6
+ ItBS9LeUjFcCxAlDBXU+ICQZVGi65udELi00wdewMF/uQb/6dyAb6TVVZUf/LGrM
7
+ rgg4kGfZhSP8IoB+n5qMGIwsypi3Ta1SAKL8xDypSxqqfbC2jeYTJy/3OwNMMs2C
8
+ vqWshdgIHn+hgY0Ge2zkx4GLi6P4ubmSfog6Nxk/2OrCUKmfXn359WawKEzfrXaY
9
+ UOzW9HmfGfF40u66i1TpACNc/BDR4eYaRZEizPLDWdrpz7JWyHBxEojclwvbLfT5
10
+ fSza69x2XGSP39sb3L10dZA0TKe2+j8qJQIDAQABo2QwYjAdBgNVHQ4EFgQUUlVE
11
+ SRlVWR+2IYH8JwBmyy5ntP4wHwYDVR0jBBgwFoAUUlVESRlVWR+2IYH8JwBmyy5n
12
+ tP4wDwYDVR0TAQH/BAUwAwEB/zAPBgNVHREECDAGhwTAqAFrMA0GCSqGSIb3DQEB
13
+ CwUAA4IBAQAvTM1MsqhQo47SNWgn2coGyHHrKFmK7XnFgw9raN9EKJJA67dfv+rj
14
+ ttl+SXuxRFlkQjP8VbHkopyiiL8qNUjW4N4Un4RSEvHZG5oJtQ83a6pwjW3cud1J
15
+ O8+whCU0QCxsXIapNDvsZyaE9rnH+Quq5lyOxrxqGgpEtJG1dTU81Cgpk25ODH1n
16
+ JNxC9vm4bbOBjJdB3YcAJ/K6iIepyP//owN9U2IiIsmpxpdvJi1P/Lp4zD3EHhzF
17
+ MmTwJBCxjOkN66VFjecLXeLlYvs8Xx45BZav+3D3H45XUvafn2cqR2pcmdMOkZAC
18
+ JHTjecrfKzWmnSTxxiY7qWWvxJPUp5KC
19
+ -----END CERTIFICATE-----
@@ -0,0 +1,28 @@
1
+ -----BEGIN PRIVATE KEY-----
2
+ MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCVPVhlTKDdhlfM
3
+ fE/r91Lu+Yf+6ek4Nrm9IVOcqc4X6VHUZIKiTiMi0FL0t5SMVwLECUMFdT4gJBlU
4
+ aLrm50QuLTTB17AwX+5Bv/p3IBvpNVVlR/8sasyuCDiQZ9mFI/wigH6fmowYjCzK
5
+ mLdNrVIAovzEPKlLGqp9sLaN5hMnL/c7A0wyzYK+payF2Agef6GBjQZ7bOTHgYuL
6
+ o/i5uZJ+iDo3GT/Y6sJQqZ9effn1ZrAoTN+tdphQ7Nb0eZ8Z8XjS7rqLVOkAI1z8
7
+ ENHh5hpFkSLM8sNZ2unPslbIcHESiNyXC9st9Pl9LNrr3HZcZI/f2xvcvXR1kDRM
8
+ p7b6PyolAgMBAAECggEAIkNWhVFJuHpEs42R0siySWvQIYIF+ZI04/tgBR6GEr7O
9
+ Ou9Ff6plTjOabBUuvWanm6bNtJXViM8I4rR1vpf3cwuNaniQupZ3rrA6+nkMd2b3
10
+ f1x/dOzjJ4x7Igo5qiPYGfq6t31lrygVi4DyypphcoR4+Du+GWBapqc4zky1doAm
11
+ iXYU08/Q4hToP1VJGNo9chMuOcSrJeiA0RgYlnkCfbL591PGf7VuQzS+PcbcnbiA
12
+ ODOFdBez39+Dlo4nZosIlgLgFPSX/M57zP6WgRcVkLqL75rECqtcs/52dJ73uxMu
13
+ a5GukSY5z5A4r0hCGOZDDqpW2B+IRfAqzSL/ViS7gQKBgQDN0o7GgOsLBqeoj27W
14
+ xOzT1dX39AkFsvdI8f47B1blYFd3egN5y0nLWLEbK/LcpanrCX+nkRz/M51DNGKa
15
+ 1lvMDDwt/99wSKUJFhO1SvuA6SB1DlPgLNRqXZu2cwzpZs1xJU6oVyK70ih3uWmW
16
+ lmi109pDlOkBPSHkIUx5GNXQpQKBgQC5n28/R3VV0L4zzWokewWbHtXVp87owXlh
17
+ 6typ/Stz98kkMNmQNkkQyQ3SxeBNXMkItLA9yYw2MDhDm6ZdyP+ZUdTv+FwMjg5M
18
+ 1FEty94LUAscDbu4QSADR0cfNQH/oPavPMWoFj/eTGnRVY76uKAzgkIPZP112Gqg
19
+ IYaPcs87gQKBgQCtzFrbrAjNqrTwVQ3XNTp2Nl8TnXHw6gp+AjoXRj9OOWgib1l4
20
+ Av0xRJdoxlexkgJFgiPVL2g45zCoixeof9HMH5jBjwryGaWiYo4JzGNLm4/YyFxz
21
+ M+e6WYkfK09/11sra8FbzRh7WR7q2hobGq8YuufXoWqPrTttE+ErcJk8MQKBgCTq
22
+ qothQNrCWzGeRt/ef6zsIwcNCr+LywJIXX6JVV0JCL3j4UEnKrzl35PtusBoFatf
23
+ lDWVogcc6/O2Pw4j7YGmnrzjHht5HSr2hvaetxh04ODBcnYgrac5Q9HXDwCyGJ2d
24
+ booRcr5ZYCo74+XFVkcoPs8k/Ku1UO9r+4EICmMBAoGAdFXHggoQu7fz0maZoH1o
25
+ TgFVhD8p4McuN+L0ddOWvS7l+0Lz/9J2KKmHRElfpMvJsSoXGp7Anyymwqukw8zq
26
+ iD/ZqGavuzcRWPWO6W514asHU1AxLSYGFqNuCYag/jElcWhgQyHojPMypaDM2Xfv
27
+ rgkCz2uZ2Zg2/GJ65CtboCA=
28
+ -----END PRIVATE KEY-----
@@ -0,0 +1,19 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDJjCCAg6gAwIBAgIUEutLmDonaXbPUYklSjQw9IoSI/wwDQYJKoZIhvcNAQEL
3
+ BQAwGTEXMBUGA1UEAwwOMTY0LjY3LjE5NS4yMDcwIBcNMjUwOTI5MjAyNjI2WhgP
4
+ MjEyNTA5MDUyMDI2MjZaMBkxFzAVBgNVBAMMDjE2NC42Ny4xOTUuMjA3MIIBIjAN
5
+ BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzTdU+Of3lKJlNVzPvB5FVF/o3TBT
6
+ DC+xi9O1cjAfm6IDBfBTyP8oD1kTyevNP+N14p6zn7Xxd1Dd6M0m4h+381+fwHQx
7
+ hKzPXaH1Xefy7OuKmMuyZH7i5GZtnOXMa+2sMuekEQhwqn9U2NIwL1jr2/z3sd3b
8
+ W52bdDfstU29htpTEgLZ3cS0zknElg7R5Qhd6ZX9L1/O8DP2XaOcM3UG4YcXXwuh
9
+ EV7fGy28JIwKHyUXHWNLOSINOKfsXdBTUJa1WEzid2pTDKjd1oKAMta3LP38MTK4
10
+ xkGQ7mQnBGhh4cbHSWNKqglGc/ZWBVlLC6jZJw6Q+RZpnHBZbpVN0kbXGQIDAQAB
11
+ o2QwYjAdBgNVHQ4EFgQUe1g9n2C1VBHUdIutCWzU/WNqUnswHwYDVR0jBBgwFoAU
12
+ e1g9n2C1VBHUdIutCWzU/WNqUnswDwYDVR0TAQH/BAUwAwEB/zAPBgNVHREECDAG
13
+ hwSkQ8PPMA0GCSqGSIb3DQEBCwUAA4IBAQBetHfCe999KPuT5rnL8+P+DKhCHYm1
14
+ vX6rmIhtYUj/m50xvf+TCJv/799fXfpX/G2fe1Gm40uPGjwNHYaUuJHaTDtqR7vs
15
+ R9F7+tOlJ+03u2Ue8e8jIzPbXt/ThpCbUPDsXbAImqgYEF6b2xR6abf5zn9jiBiM
16
+ jCawdjsB2mcgKp/5BlTeajQj6rM7Gyvl6YpQ5v03f2xDTIyqV9sAVChyv63jPU6j
17
+ iH9FFEFoBx7i3Vszx95lExid/bL/OTZoaQkpXHjSsqSwfL0BG3ZJEfjVsbfKolZN
18
+ HNIbcnf/t/B+XmLFFBy/wpVPuALnAOxMmYatrB/qMzq/UDIvA4DHgaSl
19
+ -----END CERTIFICATE-----
@@ -0,0 +1,28 @@
1
+ -----BEGIN PRIVATE KEY-----
2
+ MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDNN1T45/eUomU1
3
+ XM+8HkVUX+jdMFMML7GL07VyMB+bogMF8FPI/ygPWRPJ680/43XinrOftfF3UN3o
4
+ zSbiH7fzX5/AdDGErM9dofVd5/Ls64qYy7JkfuLkZm2c5cxr7awy56QRCHCqf1TY
5
+ 0jAvWOvb/Pex3dtbnZt0N+y1Tb2G2lMSAtndxLTOScSWDtHlCF3plf0vX87wM/Zd
6
+ o5wzdQbhhxdfC6ERXt8bLbwkjAofJRcdY0s5Ig04p+xd0FNQlrVYTOJ3alMMqN3W
7
+ goAy1rcs/fwxMrjGQZDuZCcEaGHhxsdJY0qqCUZz9lYFWUsLqNknDpD5FmmccFlu
8
+ lU3SRtcZAgMBAAECggEADBKewZvn8UsSeC6zG+aN/pY73VNb92IQ6GB2krapDV9d
9
+ HSrTywXTxf9gDid8pi8L/t6GQ7WQ9IuB2pHDIVdrW3p7K/fJ9/uwoVoHVNRx8qUy
10
+ vKVzI71hPL2X4jyUp57OXBpLiSL9edJO3AiVhBuPmJwLuF+MaZnejNpDZzEhHr87
11
+ RhD50umMNSXSL16pPuWihV73700UkoGbi4UChmbVPza0EJnS9trIqTeoKsQmAhC6
12
+ idmzfJGaTLl6BoQYJSxi8OR+zeGYN91OMtGOM10W0kZSV0p92/SOoaKN9LH7wgK1
13
+ HEabo5eyGpsDMAhBCDQ7XrcqZywpF88Ttp09GbzrjwKBgQD5f3TMEp3k0ADvf1DX
14
+ ln+f+MhVeDu3yfN4F/lPJciWHp24uu4feF++z78FKvlplDhXko6e85tSJKk86N8/
15
+ 6/kgkc9Ndljw6YxelhItPStHjQZXVMXOEQJr5x6patV+oeF5O+nnmYUcydw96PeA
16
+ rGiuJj1+y2QEppTi3aU0uK0TowKBgQDSkHJfeKjppLX4O/gApNw+Y3D5u6ezcjM1
17
+ yiB81UcBtN8gNMWoEFTphAQnD5ieNFvChmY6x0NpSVPstcWj7NSNOHfTU9ctptg8
18
+ LkuJtfDgcfoPUuRKqFZx30EAr/zDce3tvhR/98KyffjomYOdycUPWgVaIdcpXp+A
19
+ 8eIS3C42EwKBgAlkTd48uSra1Z4uWbmz1ZwM/mWRQBY8COk1ZdIf5vwXrPI+PyZ6
20
+ HoiNQ3CLXJYn2TMatjmvi+I8tQ4w6e57EIa0VmxhDxoKgJky5v5C9jUcTufMriGC
21
+ rGepbJMODXlV2Kn6omRwd/1Mb/j4oxB57PrZP6ldOKegKayckVJ5vTInAoGAUeP7
22
+ l0XF65gzbSdlfFqhjWH/PiDNR+zSHclOeT45L2C4pj3f4Uz4uRiuxMI8CMs0JKNA
23
+ fvugLAJosVbAVtB0mbesYnPo68hHsKAQoK4x0BiDuBH011RAymiZTzsigqB8eEnE
24
+ j0A8aE61z0Bk/6jJCv9ntXYTx/MU9YEc+1jGYCECgYB9Y32sH3xV2LdMKlhFtjux
25
+ WAyyAN+C7Ly8jzwpHQMxpSxHZ16tO/V+0mMIqZHRz1X+DKqO4h6t1j3Bn0u9Tm/i
26
+ vXNDEfy9RF/9U16s0ByK6QzwTodevNg7SEP6YzagR6DlCzIwj0Xbs9m9BHT7Ypia
27
+ J2qGfS7rsnmSP31AtQhikA==
28
+ -----END PRIVATE KEY-----
@@ -1,17 +1,15 @@
1
1
  import socket
2
2
  import getpass
3
3
  from pathlib import Path
4
- import os
5
- from dotenv import load_dotenv
6
4
 
7
5
  import grpc
8
6
  from ..common.grpc import grpc_pb2
9
7
  from ..common.grpc import grpc_pb2_grpc
10
8
  from ..common.utils import *
11
9
 
12
- load_dotenv(Path.home() / ".config" / "remoterf" / ".env")
13
- addr = os.getenv("REMOTERF_ADDR") # "host:port"
14
- ca_path = os.getenv("REMOTERF_CA_CERT") # path to saved CA cert
10
+ # wlab credentials
11
+ server_ip = '164.67.195.207'
12
+ server_port = '61005'
15
13
 
16
14
  options = [
17
15
  ('grpc.max_send_message_length', 100 * 1024 * 1024),
@@ -19,12 +17,12 @@ options = [
19
17
  ]
20
18
 
21
19
  # Server.crt
22
- certs_path = Path(ca_path).expanduser().resolve()
20
+ certs_path = Path(__file__).resolve().parent.parent/'core'/'certs'/'server.crt'
23
21
  with certs_path.open('rb') as f:
24
22
  trusted_certs = f.read()
25
23
 
26
24
  credentials = grpc.ssl_channel_credentials(root_certificates=trusted_certs)
27
- channel = grpc.secure_channel(addr, credentials, options=options)
25
+ channel = grpc.secure_channel(f'{server_ip}:{server_port}', credentials, options=options)
28
26
  stub = grpc_pb2_grpc.GenericRPCStub(channel)
29
27
 
30
28
  tcp_calls = 0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: remoterf
3
- Version: 0.0.7.45
3
+ Version: 0.0.7.46
4
4
  Summary: A python API to remotely access signal centric hardware. Client-side only! Courtesy of Wireless Lab @ UCLA & Prof. Ian Roberts.
5
5
  Author: Ethan Ge
6
6
  Author-email: ethoGalaxy@gmail.com
@@ -18,15 +18,19 @@ src/remoteRF/common/utils/ansi_codes.py
18
18
  src/remoteRF/common/utils/api_token.py
19
19
  src/remoteRF/common/utils/list_string.py
20
20
  src/remoteRF/common/utils/process_arg.py
21
- src/remoteRF/config/__init__.py
22
- src/remoteRF/config/cert_fetcher.py
23
- src/remoteRF/config/config_cli.py
24
21
  src/remoteRF/core/__init__.py
25
22
  src/remoteRF/core/acc_login.py
26
23
  src/remoteRF/core/app.py
27
24
  src/remoteRF/core/grpc_acc.py
28
25
  src/remoteRF/core/grpc_client.py
29
26
  src/remoteRF/core/version.py
27
+ src/remoteRF/core/certs/__init__.py
28
+ src/remoteRF/core/certs/ca.crt
29
+ src/remoteRF/core/certs/ca.key
30
+ src/remoteRF/core/certs/cert.pem
31
+ src/remoteRF/core/certs/key.pem
32
+ src/remoteRF/core/certs/server.crt
33
+ src/remoteRF/core/certs/server.key
30
34
  src/remoteRF/drivers/__init__.py
31
35
  src/remoteRF/drivers/adalm_pluto/__init__.py
32
36
  src/remoteRF/drivers/adalm_pluto/pluto_remote.py
@@ -1,4 +1,3 @@
1
1
  [console_scripts]
2
- remoterf-config = remoteRF.config.config_cli:main
3
2
  remoterf-login = remoteRF.core.acc_login:main
4
3
  remoterf-v = remoteRF.core.version:main
@@ -1,140 +0,0 @@
1
- # cert_fetcher.py
2
- """
3
- RemoteRF Client-Side Cert Fetcher (bootstrap)
4
-
5
- Purpose:
6
- - Fetch the public CA certificate (ca.crt) from a server's bootstrap endpoint
7
- (your cert_provider) and save it locally for later use in:
8
- grpc.ssl_channel_credentials(root_certificates=ca_bytes)
9
-
10
- Security note (TOFU):
11
- - This fetch is typically done over plaintext HTTP (or raw TCP). The CA cert is public,
12
- but authenticity is not guaranteed on first fetch. If you want TOFU done "right",
13
- you should display the SHA256 fingerprint and require user confirmation elsewhere.
14
- This module focuses only on: fetch + save + return success.
15
-
16
- Behavior:
17
- - Attempts HTTP GET first: http://{host}:{port}/ca.crt
18
- - If HTTP fails, falls back to raw TCP (reads until EOF).
19
- - Saves to a per-profile file under ~/.config/remoterf/certs/ by default.
20
-
21
- Exported API:
22
- - fetch_and_save_ca_cert(host, port, *, out_path=None, profile=None, timeout_sec=3.0) -> bool
23
- """
24
-
25
- from __future__ import annotations
26
-
27
- import hashlib
28
- import os
29
- import socket
30
- import urllib.request
31
- from pathlib import Path
32
- from typing import Optional
33
-
34
-
35
- CERT_FILENAME_DEFAULT = "ca.crt"
36
-
37
-
38
- def _default_config_dir() -> Path:
39
- # Cross-platform-ish default; adjust if you already have a standard in your project.
40
- # Linux: ~/.config/remoterf
41
- # macOS: also acceptable; if you want Apple-standard, use ~/Library/Application Support/remoterf
42
- base = Path(os.path.expanduser("~")) / ".config" / "remoterf"
43
- return base
44
-
45
-
46
- def _ensure_parent_dir(p: Path) -> None:
47
- p.parent.mkdir(parents=True, exist_ok=True)
48
-
49
-
50
- def _looks_like_pem_cert(data: bytes) -> bool:
51
- return b"BEGIN CERTIFICATE" in data and b"END CERTIFICATE" in data
52
-
53
-
54
- def sha256_fingerprint_pem(pem_bytes: bytes) -> str:
55
- h = hashlib.sha256(pem_bytes).hexdigest()
56
- return ":".join(h[i:i+2] for i in range(0, len(h), 2))
57
-
58
-
59
- def _fetch_http(host: str, port: int, timeout_sec: float) -> bytes:
60
- url = f"http://{host}:{port}/ca.crt"
61
- req = urllib.request.Request(url, method="GET")
62
- with urllib.request.urlopen(req, timeout=timeout_sec) as resp:
63
- data = resp.read()
64
- return data
65
-
66
-
67
- def _fetch_raw_tcp(host: str, port: int, timeout_sec: float) -> bytes:
68
- chunks: list[bytes] = []
69
- with socket.create_connection((host, port), timeout=timeout_sec) as s:
70
- s.settimeout(timeout_sec)
71
- while True:
72
- try:
73
- b = s.recv(4096)
74
- except socket.timeout:
75
- break
76
- if not b:
77
- break
78
- chunks.append(b)
79
- return b"".join(chunks)
80
-
81
-
82
- def fetch_and_save_ca_cert(
83
- host: str,
84
- port: int,
85
- *,
86
- out_path: Optional[str | Path] = None,
87
- profile: Optional[str] = None,
88
- timeout_sec: float = 3.0,
89
- overwrite: bool = True,
90
- ) -> bool:
91
- """
92
- Fetch CA cert from the server bootstrap endpoint and save it to disk.
93
-
94
- Args:
95
- host: server host/ip running cert_provider
96
- port: cert_provider port (NOT the TLS gRPC port)
97
- out_path: explicit output path (overrides profile/default location)
98
- profile: if provided, saves as ~/.config/remoterf/certs/<profile>.crt
99
- timeout_sec: network timeout
100
- overwrite: whether to overwrite existing file
101
-
102
- Returns:
103
- True on success, False on any failure.
104
- """
105
- try:
106
- if not isinstance(port, int):
107
- port = int(port)
108
-
109
- # Determine destination path
110
- if out_path is not None:
111
- dest = Path(out_path).expanduser().resolve()
112
- else:
113
- cfg = _default_config_dir()
114
- certs_dir = cfg / "certs"
115
- name = f"{profile}.crt" if profile else CERT_FILENAME_DEFAULT
116
- dest = certs_dir / name
117
-
118
- _ensure_parent_dir(dest)
119
-
120
- if dest.exists() and not overwrite:
121
- return True # already present, treat as success
122
-
123
- # Fetch (HTTP first, then raw TCP fallback)
124
- data = b""
125
- try:
126
- data = _fetch_http(host, port, timeout_sec)
127
- except Exception:
128
- data = _fetch_raw_tcp(host, port, timeout_sec)
129
-
130
- if not data or not _looks_like_pem_cert(data):
131
- return False
132
-
133
- # Save
134
- dest.write_bytes(data)
135
-
136
- # Optional: you may want to return/print fingerprint, but requested API is bool.
137
- return True
138
-
139
- except Exception:
140
- return False
@@ -1,139 +0,0 @@
1
- # src/remoteRF/core/remoterf_config.py
2
-
3
- from __future__ import annotations
4
-
5
- import argparse
6
- import os
7
- import sys
8
- from pathlib import Path
9
- from typing import Tuple
10
-
11
- from .cert_fetcher import fetch_and_save_ca_cert # your earlier module
12
-
13
- # -----------------------------
14
- # Local config locations
15
- # -----------------------------
16
- def _config_root() -> Path:
17
- # Keep it simple and consistent with earlier suggestions.
18
- return Path(os.path.expanduser("~")) / ".config" / "remoterf"
19
-
20
- def _env_path() -> Path:
21
- return _config_root() / ".env"
22
-
23
- def _certs_dir() -> Path:
24
- return _config_root() / "certs"
25
-
26
- def _parse_hostport(s: str) -> Tuple[str, int]:
27
- s = s.strip()
28
- if "://" in s:
29
- s = s.split("://", 1)[1]
30
-
31
- if ":" not in s:
32
- raise ValueError("Expected format host:port")
33
-
34
- host, port_str = s.rsplit(":", 1)
35
- host = host.strip()
36
- port = int(port_str.strip())
37
- if not host:
38
- raise ValueError("Host is empty")
39
- if port <= 0 or port > 65535:
40
- raise ValueError("Port out of range")
41
- return host, port
42
-
43
-
44
- def _write_env_kv(path: Path, kv: dict[str, str]) -> None:
45
- """
46
- Writes/overwrites a simple dotenv-style file.
47
- (We overwrite the whole file for simplicity and correctness.)
48
- """
49
- path.parent.mkdir(parents=True, exist_ok=True)
50
- lines = []
51
- for k, v in kv.items():
52
- # Quote only if needed; keep simple and safe.
53
- if any(c.isspace() for c in v) or any(c in v for c in ['"', "'"]):
54
- v = v.replace('"', '\\"')
55
- lines.append(f'{k}="{v}"')
56
- else:
57
- lines.append(f"{k}={v}")
58
- path.write_text("\n".join(lines) + "\n", encoding="utf-8")
59
-
60
- def main() -> None:
61
- import argparse
62
- import sys
63
-
64
- parser = argparse.ArgumentParser(
65
- prog="remoterf-config",
66
- add_help=True,
67
- formatter_class=argparse.RawTextHelpFormatter,
68
- description=(
69
- "Configure RemoteRF to talk to a server.\n"
70
- "Fetches the server CA certificate and saves the gRPC target locally."
71
- ),
72
- )
73
-
74
- parser.add_argument(
75
- "addr",
76
- nargs="?",
77
- help="Server address in host:port form. Example: 164.67.195.207:61005",
78
- )
79
-
80
- args = parser.parse_args()
81
-
82
- if not args.addr:
83
- print(
84
- "\nError: missing required argument: host:port\n\n"
85
- "Usage:\n"
86
- " remoterf-config <host:port>\n\n"
87
- "Example:\n"
88
- " remoterf-config 123.45.678.901:12345\n"
89
- )
90
- sys.exit(2)
91
-
92
- try:
93
- host, grpc_port = _parse_hostport(args.addr)
94
- except Exception as e:
95
- print(f"Error: invalid addr '{args.addr}': {e}", file=sys.stderr)
96
- sys.exit(2)
97
-
98
- cert_port = args.cert_port if args.cert_port is not None else (grpc_port + 1)
99
-
100
- # Destination CA cert file
101
- certs_dir = _certs_dir()
102
- certs_dir.mkdir(parents=True, exist_ok=True)
103
- ca_out = certs_dir / f"{args.profile}.crt"
104
-
105
- if ca_out.exists() and not (args.overwrite):
106
- # Treat as OK; still (re)write env target.
107
- fetched_ok = True
108
- else:
109
- fetched_ok = fetch_and_save_ca_cert(
110
- host,
111
- cert_port,
112
- out_path=ca_out,
113
- timeout_sec=args.timeout,
114
- overwrite=True,
115
- )
116
-
117
- if not fetched_ok:
118
- print(
119
- f"Failed to fetch CA cert from {host}:{cert_port}.\n",
120
- file=sys.stderr
121
- )
122
- sys.exit(1)
123
-
124
- # Write local .env (or config) with chosen server and CA path
125
- env_file = _env_path()
126
- _write_env_kv(env_file, {
127
- "REMOTERF_ADDR": f"{host}:{grpc_port}",
128
- "REMOTERF_CA_CERT": str(ca_out),
129
- "REMOTERF_PROFILE": args.profile,
130
- })
131
-
132
- print("RemoteRF configured successfully.")
133
- print(f" gRPC target : {host}:{grpc_port}")
134
- print(f" cert port : {host}:{cert_port}")
135
- print(f" CA cert : {ca_out}")
136
- print(f" env file : {env_file}")
137
-
138
- if __name__ == "__main__":
139
- main()
File without changes
File without changes
File without changes
File without changes