openc3-cosmos-tool-docs 6.9.2 → 6.10.1
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.
- checksums.yaml +4 -4
- data/tools/staticdocs/404.html +2 -2
- data/tools/staticdocs/assets/css/styles.9a220ac7.css +1 -0
- data/tools/staticdocs/assets/js/{019369f3.4a1653c3.js → 019369f3.d7bbc5e1.js} +1 -1
- data/tools/staticdocs/assets/js/{058ffc22.32f2b3f7.js → 058ffc22.e446ff0d.js} +1 -1
- data/tools/staticdocs/assets/js/0686a885.5b4c4b4d.js +1 -0
- data/tools/staticdocs/assets/js/{078dbab0.64ae8502.js → 078dbab0.656de457.js} +1 -1
- data/tools/staticdocs/assets/js/0f5d161c.7e54cdcf.js +1 -0
- data/tools/staticdocs/assets/js/0ff569c9.9566d390.js +1 -0
- data/tools/staticdocs/assets/js/10209fc9.b137dbd6.js +1 -0
- data/tools/staticdocs/assets/js/{103cc3be.6610d68d.js → 103cc3be.ee6acb84.js} +1 -1
- data/tools/staticdocs/assets/js/1202.d22d6899.js +101 -0
- data/tools/staticdocs/assets/js/13196248.8bbc13cd.js +1 -0
- data/tools/staticdocs/assets/js/13c1b4e4.4c262e75.js +1 -0
- data/tools/staticdocs/assets/js/1596.e0bc0cb8.js +1 -0
- data/tools/staticdocs/assets/js/{1c0a0c05.c66d2cd5.js → 1c0a0c05.ddb465d3.js} +1 -1
- data/tools/staticdocs/assets/js/{1e02e6a3.9bd7e41d.js → 1e02e6a3.73b5cfe6.js} +1 -1
- data/tools/staticdocs/assets/js/2047b354.6cacf929.js +1 -0
- data/tools/staticdocs/assets/js/{22b3ac48.afad8999.js → 22b3ac48.7b94bcf3.js} +1 -1
- data/tools/staticdocs/assets/js/26b8abb2.237c47e9.js +1 -0
- data/tools/staticdocs/assets/js/{2bb7bf90.417c7c24.js → 2bb7bf90.3bde2607.js} +1 -1
- data/tools/staticdocs/assets/js/{2c15ad40.9ac78174.js → 2c15ad40.4b4b971e.js} +1 -1
- data/tools/staticdocs/assets/js/3140.8b312c79.js +1 -0
- data/tools/staticdocs/assets/js/35398c5c.0f3180d9.js +1 -0
- data/tools/staticdocs/assets/js/3dd7ef3b.0221eef2.js +1 -0
- data/tools/staticdocs/assets/js/4015.6d6a3d14.js +1 -0
- data/tools/staticdocs/assets/js/40365d27.41de4945.js +1 -0
- data/tools/staticdocs/assets/js/{411898ad.2ba42394.js → 411898ad.6f36be2d.js} +1 -1
- data/tools/staticdocs/assets/js/42170351.3618f599.js +1 -0
- data/tools/staticdocs/assets/js/{43652efd.658da795.js → 43652efd.e2fc7748.js} +1 -1
- data/tools/staticdocs/assets/js/4581.bbe04eae.js +4 -0
- data/tools/staticdocs/assets/js/{53ca7c5b.dfd52859.js → 53ca7c5b.eccd9100.js} +1 -1
- data/tools/staticdocs/assets/js/54d0d530.cec50ece.js +1 -0
- data/tools/staticdocs/assets/js/{567dad64.2839bb3d.js → 567dad64.50613669.js} +1 -1
- data/tools/staticdocs/assets/js/{5738ba7a.d3cf18a7.js → 5738ba7a.cede7d7a.js} +1 -1
- data/tools/staticdocs/assets/js/{59ed27a4.eb69cbc8.js → 59ed27a4.1b2efe08.js} +1 -1
- data/tools/staticdocs/assets/js/{5b233ba7.c96c3512.js → 5b233ba7.9faed769.js} +1 -1
- data/tools/staticdocs/assets/js/{5bc719f6.1ac7eb68.js → 5bc719f6.789ebf64.js} +1 -1
- data/tools/staticdocs/assets/js/5c6ce5ec.16226a4e.js +1 -0
- data/tools/staticdocs/assets/js/5e3ed378.9ad2dcd2.js +1 -0
- data/tools/staticdocs/assets/js/5fe211ef.bfe87c27.js +1 -0
- data/tools/staticdocs/assets/js/{62df909c.1abd26b3.js → 62df909c.829748fb.js} +1 -1
- data/tools/staticdocs/assets/js/{630e5448.8195b015.js → 630e5448.5c8f1aee.js} +1 -1
- data/tools/staticdocs/assets/js/6831b732.1790429a.js +1 -0
- data/tools/staticdocs/assets/js/696b4199.7520348a.js +1 -0
- data/tools/staticdocs/assets/js/{6b210247.9645038a.js → 6b210247.fc77f080.js} +1 -1
- data/tools/staticdocs/assets/js/6b65133b.f2b11b07.js +1 -0
- data/tools/staticdocs/assets/js/{6f92e431.4af1d84b.js → 6f92e431.26f4227b.js} +1 -1
- data/tools/staticdocs/assets/js/72c6d8a8.0b8c5d2f.js +1 -0
- data/tools/staticdocs/assets/js/7399.857e78fe.js +1 -0
- data/tools/staticdocs/assets/js/75897369.e4626b79.js +1 -0
- data/tools/staticdocs/assets/js/75e64983.8112c73c.js +1 -0
- data/tools/staticdocs/assets/js/7f5b2696.176aadb5.js +1 -0
- data/tools/staticdocs/assets/js/{867640d5.8e389f8a.js → 867640d5.6bc9ed72.js} +1 -1
- data/tools/staticdocs/assets/js/89e76475.6411e788.js +1 -0
- data/tools/staticdocs/assets/js/8b939c74.5e039b7a.js +1 -0
- data/tools/staticdocs/assets/js/{8f7843ee.fffd1922.js → 8f7843ee.fb130406.js} +1 -1
- data/tools/staticdocs/assets/js/9424f0b3.90296433.js +1 -0
- data/tools/staticdocs/assets/js/{4212.6d8bdfa0.js → 9601.e8389133.js} +1 -1
- data/tools/staticdocs/assets/js/{964eb012.ee8b3c36.js → 964eb012.94a1dac1.js} +1 -1
- data/tools/staticdocs/assets/js/{97535711.237fc358.js → 97535711.3e76daa6.js} +1 -1
- data/tools/staticdocs/assets/js/{99581c43.0582936a.js → 99581c43.48391a19.js} +1 -1
- data/tools/staticdocs/assets/js/{9d6e81d0.2e825d3a.js → 9d6e81d0.c9e12517.js} +1 -1
- data/tools/staticdocs/assets/js/{9fb6059a.10a4e6be.js → 9fb6059a.2473a196.js} +1 -1
- data/tools/staticdocs/assets/js/{a677c089.b21f50bd.js → a677c089.4e7df83d.js} +1 -1
- data/tools/staticdocs/assets/js/a9987364.5ca31d27.js +1 -0
- data/tools/staticdocs/assets/js/{a9b2dc27.a75a110f.js → a9b2dc27.1f8d5c81.js} +1 -1
- data/tools/staticdocs/assets/js/aa6b6c1b.750dc927.js +1 -0
- data/tools/staticdocs/assets/js/b062d239.cd8e5784.js +1 -0
- data/tools/staticdocs/assets/js/b38a6d74.b0b07b64.js +1 -0
- data/tools/staticdocs/assets/js/b4596165.8792340f.js +1 -0
- data/tools/staticdocs/assets/js/{b6d70f94.5c2fecd8.js → b6d70f94.43a5cd5a.js} +1 -1
- data/tools/staticdocs/assets/js/b9f60ba6.f2b60175.js +1 -0
- data/tools/staticdocs/assets/js/{bd0034eb.4f47d05b.js → bd0034eb.f33ae892.js} +1 -1
- data/tools/staticdocs/assets/js/{c24eae19.59d90845.js → c24eae19.4d25de93.js} +1 -1
- data/tools/staticdocs/assets/js/c2598f55.0b5b0aff.js +1 -0
- data/tools/staticdocs/assets/js/{c5388ca4.0ddcb653.js → c5388ca4.09e2580f.js} +1 -1
- data/tools/staticdocs/assets/js/{c956ad1e.78603023.js → c956ad1e.38882e03.js} +1 -1
- data/tools/staticdocs/assets/js/{cb8c3f08.2df335b2.js → cb8c3f08.7ca03d18.js} +1 -1
- data/tools/staticdocs/assets/js/{cd879be4.c7304d91.js → cd879be4.f77d4fff.js} +1 -1
- data/tools/staticdocs/assets/js/{ce89ef36.73fcb368.js → ce89ef36.7b0f9079.js} +1 -1
- data/tools/staticdocs/assets/js/cf1c01b8.f5a9a237.js +1 -0
- data/tools/staticdocs/assets/js/d1b923aa.a5b3429d.js +1 -0
- data/tools/staticdocs/assets/js/d1bfc316.7c605bc5.js +1 -0
- data/tools/staticdocs/assets/js/{d24bf9b6.a79f1a36.js → d24bf9b6.f380debf.js} +1 -1
- data/tools/staticdocs/assets/js/{d57a4b5d.1c05ac31.js → d57a4b5d.7ce9d24e.js} +1 -1
- data/tools/staticdocs/assets/js/d59d8a14.41f22286.js +1 -0
- data/tools/staticdocs/assets/js/d5d77c37.ae6fba94.js +1 -0
- data/tools/staticdocs/assets/js/{d66bf9c0.742ff681.js → d66bf9c0.c87e9dc0.js} +1 -1
- data/tools/staticdocs/assets/js/{d8ca4191.1c930b0b.js → d8ca4191.b24de36d.js} +1 -1
- data/tools/staticdocs/assets/js/d9b92eba.b08eeda4.js +1 -0
- data/tools/staticdocs/assets/js/{db8fa1d0.7f3090fa.js → db8fa1d0.a05e2bae.js} +1 -1
- data/tools/staticdocs/assets/js/dbe31111.4f18bf2b.js +1 -0
- data/tools/staticdocs/assets/js/dc5f7beb.d439e98e.js +1 -0
- data/tools/staticdocs/assets/js/{dfbae5fd.011fc630.js → dfbae5fd.24d7316e.js} +1 -1
- data/tools/staticdocs/assets/js/{e501b0d1.c2d8ca29.js → e501b0d1.e7e284e5.js} +1 -1
- data/tools/staticdocs/assets/js/f15615f1.7dcf0c73.js +1 -0
- data/tools/staticdocs/assets/js/{f75a5f33.bc43f96a.js → f75a5f33.a7c7ff1d.js} +1 -1
- data/tools/staticdocs/assets/js/{fd886806.e52d2c97.js → fd886806.4b383c00.js} +1 -1
- data/tools/staticdocs/assets/js/main.81fa15db.js +38 -0
- data/tools/staticdocs/assets/js/runtime~main.e35f5fea.js +1 -0
- data/tools/staticdocs/docs/configuration/accessors.html +46 -46
- data/tools/staticdocs/docs/configuration/command.html +97 -81
- data/tools/staticdocs/docs/configuration/conversions.html +48 -48
- data/tools/staticdocs/docs/configuration/format.html +21 -21
- data/tools/staticdocs/docs/configuration/interfaces.html +55 -55
- data/tools/staticdocs/docs/configuration/limits-response.html +10 -10
- data/tools/staticdocs/docs/configuration/plugins.html +121 -121
- data/tools/staticdocs/docs/configuration/processors.html +15 -15
- data/tools/staticdocs/docs/configuration/protocols.html +66 -66
- data/tools/staticdocs/docs/configuration/ssl-tls.html +15 -15
- data/tools/staticdocs/docs/configuration/table.html +45 -45
- data/tools/staticdocs/docs/configuration/target.html +20 -20
- data/tools/staticdocs/docs/configuration/telemetry-screens.html +253 -253
- data/tools/staticdocs/docs/configuration/telemetry.html +93 -77
- data/tools/staticdocs/docs/configuration.html +2 -2
- data/tools/staticdocs/docs/development/curl.html +14 -14
- data/tools/staticdocs/docs/development/developing.html +17 -17
- data/tools/staticdocs/docs/development/json-api.html +15 -15
- data/tools/staticdocs/docs/development/log-structure.html +13 -15
- data/tools/staticdocs/docs/development/roadmap.html +4 -4
- data/tools/staticdocs/docs/development/streaming-api.html +26 -26
- data/tools/staticdocs/docs/development/testing.html +17 -17
- data/tools/staticdocs/docs/development.html +2 -2
- data/tools/staticdocs/docs/getting-started/cli.html +42 -42
- data/tools/staticdocs/docs/getting-started/generators.html +24 -24
- data/tools/staticdocs/docs/getting-started/gettingstarted.html +19 -19
- data/tools/staticdocs/docs/getting-started/installation.html +20 -20
- data/tools/staticdocs/docs/getting-started/key-concepts.html +20 -20
- data/tools/staticdocs/docs/getting-started/podman.html +23 -23
- data/tools/staticdocs/docs/getting-started/requirements.html +19 -19
- data/tools/staticdocs/docs/getting-started/upgrading.html +69 -42
- data/tools/staticdocs/docs/getting-started/util.html +25 -25
- data/tools/staticdocs/docs/getting-started.html +2 -2
- data/tools/staticdocs/docs/guides/bridges.html +14 -14
- data/tools/staticdocs/docs/guides/cfs.html +32 -32
- data/tools/staticdocs/docs/guides/custom-widgets.html +33 -33
- data/tools/staticdocs/docs/guides/dynamic-packets.html +6 -10
- data/tools/staticdocs/docs/guides/exposing-microservices.html +11 -11
- data/tools/staticdocs/docs/guides/little-endian-bitfields.html +4 -4
- data/tools/staticdocs/docs/guides/local-mode.html +13 -13
- data/tools/staticdocs/docs/guides/logging.html +9 -9
- data/tools/staticdocs/docs/guides/monitoring.html +18 -18
- data/tools/staticdocs/docs/guides/performance.html +10 -10
- data/tools/staticdocs/docs/guides/raspberrypi.html +4 -4
- data/tools/staticdocs/docs/guides/reference-architectures.html +6 -6
- data/tools/staticdocs/docs/guides/roles-permissions.html +29 -29
- data/tools/staticdocs/docs/guides/script-writing.html +68 -104
- data/tools/staticdocs/docs/guides/scripting-api.html +673 -666
- data/tools/staticdocs/docs/guides/troubleshooting.html +7 -7
- data/tools/staticdocs/docs/guides.html +2 -2
- data/tools/staticdocs/docs/meta/contributing.html +12 -12
- data/tools/staticdocs/docs/meta/licenses.html +9 -9
- data/tools/staticdocs/docs/meta/philosophy.html +3 -3
- data/tools/staticdocs/docs/meta/vulnerabilities.html +5 -5
- data/tools/staticdocs/docs/meta/xtce.html +12 -12
- data/tools/staticdocs/docs/meta.html +2 -2
- data/tools/staticdocs/docs/privacy.html +17 -17
- data/tools/staticdocs/docs/tools/admin.html +28 -28
- data/tools/staticdocs/docs/tools/autonomic.html +19 -19
- data/tools/staticdocs/docs/tools/bucket-explorer.html +12 -9
- data/tools/staticdocs/docs/tools/calendar.html +24 -24
- data/tools/staticdocs/docs/tools/cmd-sender.html +13 -13
- data/tools/staticdocs/docs/tools/cmd-tlm-server.html +24 -24
- data/tools/staticdocs/docs/tools/command-history.html +6 -6
- data/tools/staticdocs/docs/tools/command-queue.html +8 -8
- data/tools/staticdocs/docs/tools/data-extractor.html +23 -23
- data/tools/staticdocs/docs/tools/data-viewer.html +10 -10
- data/tools/staticdocs/docs/tools/handbooks.html +4 -4
- data/tools/staticdocs/docs/tools/limits-monitor.html +15 -15
- data/tools/staticdocs/docs/tools/log-explorer.html +9 -9
- data/tools/staticdocs/docs/tools/packet-viewer.html +10 -10
- data/tools/staticdocs/docs/tools/script-runner.html +39 -44
- data/tools/staticdocs/docs/tools/systemhealth.html +21 -21
- data/tools/staticdocs/docs/tools/table-manager.html +10 -10
- data/tools/staticdocs/docs/tools/tlm-grapher.html +20 -20
- data/tools/staticdocs/docs/tools/tlm-viewer.html +15 -15
- data/tools/staticdocs/docs/tools.html +2 -2
- data/tools/staticdocs/docs.html +12 -12
- data/tools/staticdocs/index.html +2 -2
- data/tools/staticdocs/lunr-index-1765340262146.json +1 -0
- data/tools/staticdocs/lunr-index.json +1 -1
- data/tools/staticdocs/markdown-page.html +3 -3
- data/tools/staticdocs/search-doc-1765340262146.json +1 -0
- data/tools/staticdocs/search-doc.json +1 -1
- metadata +102 -102
- data/tools/staticdocs/assets/css/styles.41902cce.css +0 -1
- data/tools/staticdocs/assets/js/0686a885.a7333b95.js +0 -1
- data/tools/staticdocs/assets/js/0f5d161c.7e279344.js +0 -1
- data/tools/staticdocs/assets/js/0ff569c9.2aab45f2.js +0 -1
- data/tools/staticdocs/assets/js/10209fc9.4565c03f.js +0 -1
- data/tools/staticdocs/assets/js/13196248.d66fca61.js +0 -1
- data/tools/staticdocs/assets/js/13c1b4e4.5bb027bf.js +0 -1
- data/tools/staticdocs/assets/js/2047b354.57091c5c.js +0 -1
- data/tools/staticdocs/assets/js/26b8abb2.dcaf4a64.js +0 -1
- data/tools/staticdocs/assets/js/2754.1aabb61a.js +0 -4
- data/tools/staticdocs/assets/js/35398c5c.e106e87e.js +0 -1
- data/tools/staticdocs/assets/js/3dd7ef3b.d7f8b9cd.js +0 -1
- data/tools/staticdocs/assets/js/40365d27.d9f50fa2.js +0 -1
- data/tools/staticdocs/assets/js/42170351.067ef5bf.js +0 -1
- data/tools/staticdocs/assets/js/4684.14bc5dde.js +0 -1
- data/tools/staticdocs/assets/js/5072.9a0a2752.js +0 -1
- data/tools/staticdocs/assets/js/54d0d530.2cb8d081.js +0 -1
- data/tools/staticdocs/assets/js/5c6ce5ec.507ee82d.js +0 -1
- data/tools/staticdocs/assets/js/5e3ed378.4df9c862.js +0 -1
- data/tools/staticdocs/assets/js/5fe211ef.f88f4388.js +0 -1
- data/tools/staticdocs/assets/js/6822.e7d145ca.js +0 -1
- data/tools/staticdocs/assets/js/6831b732.e1f6dba2.js +0 -1
- data/tools/staticdocs/assets/js/696b4199.ca5589ac.js +0 -1
- data/tools/staticdocs/assets/js/6b65133b.e20fd90a.js +0 -1
- data/tools/staticdocs/assets/js/72c6d8a8.33b4ade8.js +0 -1
- data/tools/staticdocs/assets/js/7453.c108c718.js +0 -101
- data/tools/staticdocs/assets/js/75897369.f13aa17b.js +0 -1
- data/tools/staticdocs/assets/js/75e64983.180a00e7.js +0 -1
- data/tools/staticdocs/assets/js/7724.decf13c5.js +0 -1
- data/tools/staticdocs/assets/js/7f5b2696.e1f3d862.js +0 -1
- data/tools/staticdocs/assets/js/89e76475.19eee62b.js +0 -1
- data/tools/staticdocs/assets/js/8b939c74.695b23ba.js +0 -1
- data/tools/staticdocs/assets/js/9424f0b3.b69449bb.js +0 -1
- data/tools/staticdocs/assets/js/a9987364.7fc39b81.js +0 -1
- data/tools/staticdocs/assets/js/aa6b6c1b.fe979b93.js +0 -1
- data/tools/staticdocs/assets/js/b062d239.17662e64.js +0 -1
- data/tools/staticdocs/assets/js/b38a6d74.8868b9d0.js +0 -1
- data/tools/staticdocs/assets/js/b4596165.2ed4461b.js +0 -1
- data/tools/staticdocs/assets/js/b9f60ba6.b670205f.js +0 -1
- data/tools/staticdocs/assets/js/c2598f55.7a2138ca.js +0 -1
- data/tools/staticdocs/assets/js/cf1c01b8.0e7608a1.js +0 -1
- data/tools/staticdocs/assets/js/d1b923aa.9f1cb7ab.js +0 -1
- data/tools/staticdocs/assets/js/d1bfc316.61e55cb2.js +0 -1
- data/tools/staticdocs/assets/js/d59d8a14.849274f0.js +0 -1
- data/tools/staticdocs/assets/js/d5d77c37.efea20c9.js +0 -1
- data/tools/staticdocs/assets/js/d9b92eba.df6e59c2.js +0 -1
- data/tools/staticdocs/assets/js/dbe31111.2d5f3225.js +0 -1
- data/tools/staticdocs/assets/js/dc5f7beb.53bef49e.js +0 -1
- data/tools/staticdocs/assets/js/f15615f1.7cc36bfe.js +0 -1
- data/tools/staticdocs/assets/js/main.1ae7ceb9.js +0 -38
- data/tools/staticdocs/assets/js/runtime~main.44a60fd4.js +0 -1
- data/tools/staticdocs/lunr-index-1762372934557.json +0 -1
- data/tools/staticdocs/search-doc-1762372934557.json +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([["5013"],{5735:function(e,n,t){t.r(n),t.d(n,{frontMatter:()=>o,toc:()=>l,default:()=>d,metadata:()=>s,assets:()=>a,contentTitle:()=>c});var s=JSON.parse('{"id":"getting-started/cli","title":"Command Line Interface","description":"Using openc3.sh","source":"@site/docs/getting-started/cli.md","sourceDirName":"getting-started","slug":"/getting-started/cli","permalink":"/tools/staticdocs/docs/getting-started/cli","draft":false,"unlisted":false,"editUrl":"https://github.com/OpenC3/cosmos/tree/main/docs.openc3.com/docs/getting-started/cli.md","tags":[],"version":"current","sidebarPosition":5,"frontMatter":{"sidebar_position":5,"title":"Command Line Interface","description":"Using openc3.sh","sidebar_custom_props":{"myEmoji":"\u2328\uFE0F"}},"sidebar":"defaultSidebar","previous":{"title":"Upgrading","permalink":"/tools/staticdocs/docs/getting-started/upgrading"},"next":{"title":"Utility Commands","permalink":"/tools/staticdocs/docs/getting-started/util"}}'),i=t(7259),r=t(5511);let o={sidebar_position:5,title:"Command Line Interface",description:"Using openc3.sh",sidebar_custom_props:{myEmoji:"\u2328\uFE0F"}},c,a={},l=[{value:"COSMOS Autocompletion in ZSH",id:"cosmos-autocompletion-in-zsh",level:3},{value:"Rake",id:"rake",level:2},{value:"IRB",id:"irb",level:2},{value:"Script",id:"script",level:2},{value:"Init (Enterprise Only since 6.3.0)",id:"init-enterprise-only-since-630",level:3},{value:"List",id:"list",level:3},{value:"Spawn",id:"spawn",level:3},{value:"Run",id:"run",level:3},{value:"Running (since 6.5.0)",id:"running-since-650",level:3},{value:"Status (since 6.5.0)",id:"status-since-650",level:3},{value:"Stop (since 6.5.0)",id:"stop-since-650",level:3},{value:"Validate",id:"validate",level:2},{value:"Load",id:"load",level:2},{value:"List",id:"list-1",level:2},{value:"Generate",id:"generate",level:2},{value:"Bridge",id:"bridge",level:2},{value:"Pkginstall and pkguninstall",id:"pkginstall-and-pkguninstall",level:2},{value:"Rubysloc (deprecated)",id:"rubysloc-deprecated",level:2},{value:"XTCE Converter",id:"xtce-converter",level:2},{value:"CSTOL Converter",id:"cstol-converter",level:2}];function p(e){let n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(n.p,{children:["The COSMOS Command Line Interface is a command on ",(0,i.jsx)(n.code,{children:"openc3.sh"})," and ",(0,i.jsx)(n.code,{children:"openc3.bat"})," which are included in the COSMOS ",(0,i.jsx)(n.a,{href:"https://github.com/OpenC3/cosmos-project",children:"project"})," (more about ",(0,i.jsx)(n.a,{href:"key-concepts#projects",children:"projects"}),")."]}),"\n",(0,i.jsxs)(n.p,{children:["If you followed the ",(0,i.jsx)(n.a,{href:"/tools/staticdocs/docs/getting-started/installation",children:"Installation Guide"})," you should already be inside a cloned ",(0,i.jsx)(n.a,{href:"https://github.com/OpenC3/cosmos-project",children:"cosmos-project"})," which is in your PATH (necessary for openc3.bat / openc3.sh to be resolved). To see all the available type the following:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"% openc3.sh cli\nUsage:\n cli help # Displays this information\n cli rake # Runs rake in the local directory\n cli irb # Runs irb in the local directory\n cli script # Interact with scripts. Run with --help for more info.\n cli validate /PATH/FILENAME.gem SCOPE variables.json # Validate a COSMOS plugin gem file\n cli load /PATH/FILENAME.gem SCOPE plugin_hash.json # Loads a COSMOS plugin gem file\n OPTIONS: --variables lets you pass a path to a JSON file containing your plugin\\'s variables\n cli list <SCOPE> # Lists installed plugins, SCOPE is DEFAULT if not given\n cli generate TYPE OPTIONS # Generate various COSMOS entities\n OPTIONS: --ruby or --python is required to specify the language in the generated code unless OPENC3_LANGUAGE is set\n cli bridge CONFIG_FILENAME # Run COSMOS host bridge\n cli bridgegem gem_name variable1=value1 variable2=value2 # Runs bridge using gem bridge.txt\n cli bridgesetup CONFIG_FILENAME # Create a default config file\n cli pkginstall PKGFILENAME SCOPE # Install loaded package (Ruby gem or python package)\n cli pkguninstall PKGFILENAME SCOPE # Uninstall loaded package (Ruby gem or python package)\n cli rubysloc # DEPRECATED: Please use scc (https://github.com/boyter/scc)\n cli xtce_converter # Convert to and from the XTCE format. Run with --help for more info.\n cli cstol_converter # Converts CSTOL files (.prc) to COSMOS. Run with --help for more info.\n"})}),"\n",(0,i.jsx)(n.admonition,{title:"seccomp profile",type:"note",children:(0,i.jsxs)(n.p,{children:["You can safely ignore ",(0,i.jsx)(n.code,{children:"WARNING: daemon is not using the default seccomp profile"})]})}),"\n",(0,i.jsx)(n.h3,{id:"cosmos-autocompletion-in-zsh",children:"COSMOS Autocompletion in ZSH"}),"\n",(0,i.jsxs)(n.p,{children:["Create a directory in your home for the autocomplete file if you do not have one already. For example, create ",(0,i.jsx)(n.code,{children:"~/.zsh/completions/"})," by running ",(0,i.jsx)(n.code,{children:"mkdir -p ~/.zsh/completions"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["Then, copy ",(0,i.jsx)(n.code,{children:"_openc3"})," from a cloned ",(0,i.jsx)(n.a,{href:"https://github.com/OpenC3/cosmos-project",children:"cosmos-project"})," repository and add the following to your ",(0,i.jsx)(n.code,{children:"~/.zshrc"})," file:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",children:"fpath=(~/.zsh/completions $fpath) \nautoload -Uz compinit\ncompinit\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Then, either run ",(0,i.jsx)(n.code,{children:"exec zsh"})," in your current shell or open a new shell in your terminal application."]}),"\n",(0,i.jsx)(n.admonition,{title:"issues getting argument completion",type:"note",children:(0,i.jsxs)(n.p,{children:['If you are having issues getting "argument completion" working for ',(0,i.jsx)(n.code,{children:"openc3.sh"})," try clearing the ZSH autocomplete cache running ",(0,i.jsx)(n.code,{children:"rm ~/.zcompdump*"})," and then reinitialize the completion system with ",(0,i.jsx)(n.code,{children:"compinit"}),"."]})}),"\n",(0,i.jsx)(n.h2,{id:"rake",children:"Rake"}),"\n",(0,i.jsxs)(n.p,{children:["You can execute rake tasks using ",(0,i.jsx)(n.code,{children:"openc3.sh cli rake"}),". The most typical usage is to generate a plugin and then build it. For example:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"% openc3.sh cli rake build VERSION=1.0.0\n"})}),"\n",(0,i.jsx)(n.h2,{id:"irb",children:"IRB"}),"\n",(0,i.jsxs)(n.p,{children:["IRB stands for Interactive Ruby and is a way to start a Ruby interpreter that you can play around with. When using it from the CLI, it includes the COSMOS Ruby path so you can ",(0,i.jsx)(n.code,{children:"require 'cosmos'"})," and try out various methods. For example:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'% openc3.sh cli irb\nirb(main):001:0> require \'cosmos\'\n=> true\nirb(main):002:0> Cosmos::Api::WHITELIST\n=>\n["get_interface",\n "get_interface_names",\n ...\n]\n'})}),"\n",(0,i.jsx)(n.h2,{id:"script",children:"Script"}),"\n",(0,i.jsx)(n.p,{children:"The script methods allow you to list the available scripts, spawn a script, and run a script while monitoring its output. Note that you must set the OPENC3_API_PASSWORD in COSMOS Core and both the OPENC3_API_USER and OPENC3_API_PASSWORD in COSMOS Enterprise."}),"\n",(0,i.jsx)(n.admonition,{title:"Offline Access Token (since 6.3.0)",type:"note",children:(0,i.jsx)(n.p,{children:'You must visit the frontend Script Runner page as the OPENC3_API_USER or run "openc3.sh cli script init" in order to obtain an offline access token before the other script cli methods will work.'})}),"\n",(0,i.jsx)(n.h3,{id:"init-enterprise-only-since-630",children:"Init (Enterprise Only since 6.3.0)"}),"\n",(0,i.jsx)(n.p,{children:"Obtain an offline access token without visiting the frontend GUI. This is required when running in a headless CI/CD environment before accessing any of the other commands."}),"\n",(0,i.jsx)(n.h3,{id:"list",children:"List"}),"\n",(0,i.jsx)(n.p,{children:"List all the available scripts which includes all the files in every target directory. You can filter this list using bash to only include procedures, Ruby files, Python files, etc."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"% export OPENC3_API_USER=operator\n% export OPENC3_API_PASSWORD=operator\n% openc3.sh cli script list\nEXAMPLE/cmd_tlm/example_cmds.txt\nEXAMPLE/cmd_tlm/example_tlm.txt\n...\n"})}),"\n",(0,i.jsx)(n.h3,{id:"spawn",children:"Spawn"}),"\n",(0,i.jsxs)(n.p,{children:["The ID of the spawned script is returned. You can connect to it in Script Runner by visiting ",(0,i.jsx)(n.code,{children:"http://localhost:2900/tools/scriptrunner/1"})," where the final value is the ID. For available options see ",(0,i.jsx)(n.code,{children:"Run"}),"."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"% openc3.sh cli script spawn INST/procedures/checks.rb\n4\n"})}),"\n",(0,i.jsx)(n.h3,{id:"run",children:"Run"}),"\n",(0,i.jsx)(n.p,{children:"Run spawns the script and then captures the output and prints it to the shell. Note that this will not work with user input prompts so the script must be written to prevent user input. You can also pass variables to the script as shown in the CLI help."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'% openc3.sh cli script run INST/procedures/stash.rb\nFilename INST/procedures/stash.rb scope DEFAULT\n2025/03/22 19:50:40.429 (SCRIPTRUNNER): Script config/DEFAULT/targets/INST/procedures/stash.rb spawned in 0.796683293 seconds <ruby 3.2.6>\n2025/03/22 19:50:40.453 (SCRIPTRUNNER): Starting script: stash.rb, line_delay = 0.1\nAt [INST/procedures/stash.rb:3] state [running]\nAt [INST/procedures/stash.rb:4] state [running]\n2025/03/22 19:50:40.732 (stash.rb:4): key1: val1\nAt [INST/procedures/stash.rb:5] state [running]\nAt [INST/procedures/stash.rb:6] state [running]\n2025/03/22 19:50:40.936 (stash.rb:6): key2: val2\nAt [INST/procedures/stash.rb:7] state [running]\n2025/03/22 19:50:41.039 (stash.rb:7): CHECK: \'val1\' == \'val1\' is TRUE\nAt [INST/procedures/stash.rb:8] state [running]\n2025/03/22 19:50:41.146 (stash.rb:8): CHECK: \'val2\' == \'val2\' is TRUE\nAt [INST/procedures/stash.rb:9] state [running]\n2025/03/22 19:50:41.256 (stash.rb:9): CHECK: \'["key1", "key2"]\' == \'["key1", "key2"]\' is TRUE\nAt [INST/procedures/stash.rb:10] state [running]\nAt [INST/procedures/stash.rb:11] state [running]\nAt [INST/procedures/stash.rb:12] state [running]\n2025/03/22 19:50:41.556 (stash.rb:12): CHECK: \'{"key1"=>1, "key2"=>2}\' == \'{"key1"=>1, "key2"=>2}\' is TRUE\nAt [INST/procedures/stash.rb:13] state [running]\nAt [INST/procedures/stash.rb:14] state [running]\n2025/03/22 19:50:41.763 (stash.rb:14): CHECK: true == true is TRUE\nAt [INST/procedures/stash.rb:15] state [running]\nAt [INST/procedures/stash.rb:16] state [running]\nAt [INST/procedures/stash.rb:17] state [running]\nAt [INST/procedures/stash.rb:18] state [running]\n2025/03/22 19:50:42.176 (stash.rb:18): CHECK: \'[1, 2, [3, 4]]\' == \'[1, 2, [3, 4]]\' is TRUE\nAt [INST/procedures/stash.rb:19] state [running]\nAt [INST/procedures/stash.rb:21] state [running]\nAt [INST/procedures/stash.rb:22] state [running]\nAt [INST/procedures/stash.rb:23] state [running]\n2025/03/22 19:50:42.587 (stash.rb:23): CHECK: \'{"one"=>1, "two"=>2, "string"=>"string"}\' == \'{"one"=>1, "two"=>2, "string"=>"string"}\' is TRUE\nAt [INST/procedures/stash.rb:24] state [running]\n2025/03/22 19:50:42.697 (SCRIPTRUNNER): Script completed: stash.rb\nAt [INST/procedures/stash.rb:0] state [stopped]\nscript complete\n%\n'})}),"\n",(0,i.jsxs)(n.p,{children:["You can also run Test Runner suites by passing the ",(0,i.jsx)(n.code,{children:"--suite SUITE"}),", ",(0,i.jsx)(n.code,{children:"--group GROUP"}),", and ",(0,i.jsx)(n.code,{children:"--script SCRIPT"})," options as shown below. Pass the ",(0,i.jsx)(n.code,{children:"--method"})," option to run ",(0,i.jsx)(n.code,{children:"--method setup"})," or ",(0,i.jsx)(n.code,{children:"--method teardown"}),". The default is ",(0,i.jsx)(n.code,{children:"--method start"}),". In addition you can pass an ",(0,i.jsx)(n.code,{children:"--options"})," argument to control the flags set in the Test Runner GUI. See the CLI help for more information."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'% openc3.sh cli script run INST2/procedures/my_script_suite.py --suite MySuite --group ExampleGroup --script script_2\nFilename INST2/procedures/my_script_suite.py scope DEFAULT\nFilename INST2/procedures/my_script_suite.py scope\nFilename INST2/procedures/utilities/clear.py scope\nFilename INST2/procedures/my_script_suite.py scope\nAt [INST2/procedures/my_script_suite.py:48] state [running]\nAt [INST2/procedures/my_script_suite.py:49] state [running]\n2025-07-31T04:45:31.284707Z (SCRIPTRUNNER): Script config/DEFAULT/targets/INST2/procedures/my_script_suite.py spawned in 0.0043256282806396484 seconds <python 3.12.11 (main, Jun 9 2025, 08:58:11) [GCC 14.2.0]>\n2025-07-31T04:45:31.310253Z (SCRIPTRUNNER): Starting script: my_script_suite.py, line_delay = 0.1\n2025-07-31T04:45:31.310949Z (my_script_suite.py:0): 2025-07-31T04:45:31.310253Z (SCRIPTRUNNER): Starting script: my_script_suite.py, line_delay = 0.1\nFilename INST2/procedures/my_script_suite.py scope\nAt [INST2/procedures/my_script_suite.py:21] state [running]\n2025-07-31T04:45:31.415640Z (my_script_suite.py:21): Running None:ExampleGroup:script_2\nAt [INST2/procedures/my_script_suite.py:24] state [running]\n2025-07-31T04:45:31.516645Z (my_script_suite.py:24): This test verifies requirement 2\nAt [INST2/procedures/my_script_suite.py:25] state [running]\nAt [INST2/procedures/my_script_suite.py:35] state [running]\nAt [INST2/procedures/my_script_suite.py:36] state [running]\n2025-07-31T04:45:31.822472Z (my_script_suite.py:36): help\nAt [INST2/procedures/my_script_suite.py:37] state [running]\nAt [INST2/procedures/my_script_suite.py:40] state [running]\nAt [INST2/procedures/my_script_suite.py:26] state [running]\nAt [INST2/procedures/my_script_suite.py:26] state [waiting]\nAt [INST2/procedures/my_script_suite.py:26] state [waiting]\n2025-07-31T04:45:34.129293Z (my_script_suite.py:26): WAIT: 2.0 seconds with actual time of 2.001 seconds\n2025-07-31T04:45:34.131468Z (SCRIPTRUNNER): Script completed: INST2/procedures/my_script_suite.py\nAt [INST2/procedures/my_script_suite.py:0] state [completed]\n{"report"=>\n "--- Script Report ---\\n" +\n "\\n" +\n "Settings:\\n" +\n "Manual = False\\n" +\n "Pause on Error = False\\n" +\n "Continue After Error = True\\n" +\n "Abort After Error = False\\n" +\n "Loop = False\\n" +\n "Break Loop On Error = False\\n" +\n "\\n" +\n "Results:\\n" +\n "2025-07-31T04:45:31.314286Z: Executing MySuite:ExampleGroup:script_2 \\n" +\n "2025-07-31T04:45:34.130958Z: ExampleGroup:script_2:PASS\\n" +\n " This test verifies requirement 2\\n" +\n " \\n" +\n "2025-07-31T04:45:34.132814Z: Completed MySuite:ExampleGroup:script_2 \\n" +\n "\\n" +\n "--- Test Summary ---\\n" +\n "\\n" +\n "Run Time: 2.8185291290283203\\n" +\n "Total Tests: 1\\n" +\n "Pass: 1\\n" +\n "Skip: 0\\n" +\n "Fail: 0\\n",\n "type"=>"report"}\nscript complete\n'})}),"\n",(0,i.jsx)(n.h3,{id:"running-since-650",children:"Running (since 6.5.0)"}),"\n",(0,i.jsx)(n.p,{children:"List all the running scripts. Add the --verbose option to print the raw output."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"% openc3.sh cli script running\nID User Filename Start Time State\n5 The Operator INST/procedures/collect.rb 2025-06-06T22:40:48Z paused\n4 The Operator INST/procedures/checks.rb 2025-06-06T22:40:21Z error\n"})}),"\n",(0,i.jsx)(n.h3,{id:"status-since-650",children:"Status (since 6.5.0)"}),"\n",(0,i.jsx)(n.p,{children:"List status for a specific script based on the script ID. Add the --verbose option to print the raw output."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"% openc3.sh cli script status 5\nID User Filename Start Time State\n5 The Operator INST/procedures/collect.rb 2025-06-06T22:40:48Z paused\n"})}),"\n",(0,i.jsx)(n.h3,{id:"stop-since-650",children:"Stop (since 6.5.0)"}),"\n",(0,i.jsx)(n.p,{children:"Stop a script based on the script ID."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"% openc3.sh cli script stop 5\n"})}),"\n",(0,i.jsx)(n.h2,{id:"validate",children:"Validate"}),"\n",(0,i.jsx)(n.p,{children:"Validate is used to validate built COSMOS plugins. It walks through the installation process without actually installing the plugin."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"% openc3.sh cli validate openc3-cosmos-cfdp-1.0.0.gem\nInstalling openc3-cosmos-cfdp-1.0.0.gem\nSuccessfully validated openc3-cosmos-cfdp-1.0.0.gem\n"})}),"\n",(0,i.jsxs)(n.p,{children:["You can optionally pass it the scope to install the plugin in (for Enterprise) and the path to a JSON file containing your plugin variables. If using COSMOS Core, use ",(0,i.jsx)(n.code,{children:"DEFAULT"})," for the scope. If you pass a variables file, any variables not defined in the file will take the default value (as defined in your ",(0,i.jsx)(n.code,{children:"plugin.txt"})," file)."]}),"\n",(0,i.jsx)(n.h2,{id:"load",children:"Load"}),"\n",(0,i.jsx)(n.p,{children:"Load can load a plugin into COSMOS without using the GUI. This is useful for scripts or CI/CD pipelines."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'% openc3.sh cli load openc3-cosmos-cfdp-1.0.0.gem\nLoading new plugin: openc3-cosmos-cfdp-1.0.0.gem\n{"name"=>"openc3-cosmos-cfdp-1.0.0.gem", "variables"=>{"cfdp_microservice_name"=>"CFDP", "cfdp_route_prefix"=>"/cfdp", "cfdp_port"=>"2905", "cfdp_cmd_target_name"=>"CFDP2", "cfdp_cmd_packet_name"=>"CFDP_PDU", "cfdp_cmd_item_name"=>"PDU", "cfdp_tlm_target_name"=>"CFDP2", "cfdp_tlm_packet_name"=>"CFDP_PDU", "cfdp_tlm_item_name"=>"PDU", "source_entity_id"=>"1", "destination_entity_id"=>"2", "root_path"=>"/DEFAULT/targets_modified/CFDP/tmp", "bucket"=>"config", "plugin_test_mode"=>"false"}, "plugin_txt_lines"=>["VARIABLE cfdp_microservice_name CFDP", "VARIABLE cfdp_route_prefix /cfdp", "VARIABLE cfdp_port 2905", "", "VARIABLE cfdp_cmd_target_name CFDP2", "VARIABLE cfdp_cmd_packet_name CFDP_PDU", "VARIABLE cfdp_cmd_item_name PDU", "", "VARIABLE cfdp_tlm_target_name CFDP2", "VARIABLE cfdp_tlm_packet_name CFDP_PDU", "VARIABLE cfdp_tlm_item_name PDU", "", "VARIABLE source_entity_id 1", "VARIABLE destination_entity_id 2", "VARIABLE root_path /DEFAULT/targets_modified/CFDP/tmp", "VARIABLE bucket config", "", "# Set to true to enable a test configuration", "VARIABLE plugin_test_mode \\"false\\"", "", "MICROSERVICE CFDP <%= cfdp_microservice_name %>", " WORK_DIR .", " ROUTE_PREFIX <%= cfdp_route_prefix %>", " ENV OPENC3_ROUTE_PREFIX <%= cfdp_route_prefix %>", " ENV SECRET_KEY_BASE 324973597349867207430793759437697498769349867349674", " PORT <%= cfdp_port %>", " CMD rails s -b 0.0.0.0 -p <%= cfdp_port %> -e production", " # MIB Options Follow -", " # You will need to modify these for your mission", " OPTION source_entity_id <%= source_entity_id %>", " OPTION tlm_info <%= cfdp_tlm_target_name %> <%= cfdp_tlm_packet_name %> <%= cfdp_tlm_item_name %>", " OPTION destination_entity_id <%= destination_entity_id %>", " OPTION cmd_info <%= cfdp_cmd_target_name %> <%= cfdp_cmd_packet_name %> <%= cfdp_cmd_item_name %>", " OPTION root_path <%= root_path %>", " <% if bucket.to_s.strip != \'\' %>", " OPTION bucket <%= bucket %>", " <% end %>", "", "<% include_test = (plugin_test_mode.to_s.strip.downcase == \\"true\\") %>", "<% if include_test %>", " TARGET CFDPTEST CFDP", " TARGET CFDPTEST CFDP2", "", " MICROSERVICE CFDP CFDP2", " WORK_DIR .", " ROUTE_PREFIX /cfdp2", " ENV OPENC3_ROUTE_PREFIX /cfdp2", " ENV SECRET_KEY_BASE 324973597349867207430793759437697498769349867349674", " PORT 2906", " CMD rails s -b 0.0.0.0 -p 2906 -e production", " OPTION source_entity_id <%= destination_entity_id %>", " OPTION tlm_info CFDP CFDP_PDU PDU", " OPTION destination_entity_id <%= source_entity_id %>", " OPTION cmd_info CFDP CFDP_PDU PDU", " OPTION root_path <%= root_path %>", " <% if bucket.to_s.strip != \'\' %>", " OPTION bucket <%= bucket %>", " <% end %>", "", " <% test_host = ENV[\'KUBERNETES_SERVICE_HOST\'] ? (scope.to_s.downcase + \\"-interface-cfdp2-int-service\\") : \\"openc3-operator\\" %>", " INTERFACE CFDP_INT tcpip_client_interface.rb <%= test_host %> 2907 2907 10.0 nil LENGTH 0 32 4 1 BIG_ENDIAN 0 nil nil true", " MAP_TARGET CFDP", "", " INTERFACE CFDP2_INT tcpip_server_interface.rb 2907 2907 10.0 nil LENGTH 0 32 4 1 BIG_ENDIAN 0 nil nil true", " PORT 2907", " MAP_TARGET CFDP2", "<% end %>"], "needs_dependencies"=>false, "updated_at"=>nil}\nUpdating local plugin files: /plugins/DEFAULT/openc3-cosmos-cfdp\n'})}),"\n",(0,i.jsxs)(n.p,{children:["You can optionally pass it the scope to install the plugin in (for Enterprise) and the path to a JSON file containing the entire ",(0,i.jsx)(n.code,{children:"plugin_hash"})," for your plugin. This lets you manually set things like the installed name, ",(0,i.jsx)(n.code,{children:"updated_at"})," timestamp, and other properties. Use this carefully."]}),"\n",(0,i.jsxs)(n.p,{children:["There is also a ",(0,i.jsx)(n.code,{children:"--variables"})," option, which allows you to pass the path to a JSON file containing your plugin variables. This is the same as the optional variables file mentioned above for ",(0,i.jsx)(n.code,{children:"cli validate"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"list-1",children:"List"}),"\n",(0,i.jsx)(n.p,{children:"List displays all the installed plugins."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"% openc3.sh cli list\nopenc3-cosmos-cfdp-1.0.0.gem__20250325160956\nopenc3-cosmos-demo-6.2.2.pre.beta0.20250325143120.gem__20250325160201\nopenc3-cosmos-enterprise-tool-admin-6.2.2.pre.beta0.20250325155648.gem__20250325160159\nopenc3-cosmos-tool-autonomic-6.2.2.pre.beta0.20250325155658.gem__20250325160225\nopenc3-cosmos-tool-bucketexplorer-6.2.2.pre.beta0.20250325143107.gem__20250325160227\nopenc3-cosmos-tool-calendar-6.2.2.pre.beta0.20250325155654.gem__20250325160224\nopenc3-cosmos-tool-cmdhistory-6.2.2.pre.beta0.20250325155651.gem__20250325160212\nopenc3-cosmos-tool-cmdsender-6.2.2.pre.beta0.20250325143111.gem__20250325160211\nopenc3-cosmos-tool-cmdtlmserver-6.2.2.pre.beta0.20250325143114.gem__20250325160208\nopenc3-cosmos-tool-dataextractor-6.2.2.pre.beta0.20250325143104.gem__20250325160219\nopenc3-cosmos-tool-dataviewer-6.2.2.pre.beta0.20250325143108.gem__20250325160220\nopenc3-cosmos-tool-docs-6.2.2.pre.beta0.20250325155535.gem__20250325160228\nopenc3-cosmos-tool-grafana-6.2.2.pre.beta0.20250325155658.gem__20250325160233\nopenc3-cosmos-tool-handbooks-6.2.2.pre.beta0.20250325143113.gem__20250325160222\nopenc3-cosmos-tool-iframe-6.2.2.pre.beta0.20250325143110.gem__20250325160158\nopenc3-cosmos-tool-limitsmonitor-6.2.2.pre.beta0.20250325155448.gem__20250325160209\nopenc3-cosmos-tool-packetviewer-6.2.2.pre.beta0.20250325143104.gem__20250325160215\nopenc3-cosmos-tool-scriptrunner-6.2.2.pre.beta0.20250325143111.gem__20250325160214\nopenc3-cosmos-tool-tablemanager-6.2.2.pre.beta0.20250325143116.gem__20250325160223\nopenc3-cosmos-tool-tlmgrapher-6.2.2.pre.beta0.20250325143105.gem__20250325160218\nopenc3-cosmos-tool-tlmviewer-6.2.2.pre.beta0.20250325143108.gem__20250325160216\nopenc3-enterprise-tool-base-6.2.2.pre.beta0.20250325155704.gem__20250325160153\n"})}),"\n",(0,i.jsx)(n.h2,{id:"generate",children:"Generate"}),"\n",(0,i.jsxs)(n.p,{children:["Generate is used to scaffold new COSMOS plugins, targets, conversions, and more! See the ",(0,i.jsx)(n.a,{href:"/docs/getting-started/generators",children:"Generators"})," page for more information."]}),"\n",(0,i.jsx)(n.h2,{id:"bridge",children:"Bridge"}),"\n",(0,i.jsxs)(n.p,{children:["A COSMOS Bridge is a small application that is run on the local computer to connect to hardware not available to Docker containers. A good example is connecting to a serial port on a non-linux system. See the\n",(0,i.jsx)(n.a,{href:"/docs/guides/bridges",children:"Bridge Guide"})," for more information."]}),"\n",(0,i.jsx)(n.h2,{id:"pkginstall-and-pkguninstall",children:"Pkginstall and pkguninstall"}),"\n",(0,i.jsx)(n.p,{children:"Allows you to install or remove Ruby gems or Python wheels into COSMOS. These are dependencies that are not packaged with the COSMOS plugin itself."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"% openc3.sh cli pkginstall rspec-3.13.0.gem\n"})}),"\n",(0,i.jsx)(n.h2,{id:"rubysloc-deprecated",children:"Rubysloc (deprecated)"}),"\n",(0,i.jsxs)(n.p,{children:["Calculates the Ruby Source Lines of Code (SLOC) from the current directory recursively. We recommend using ",(0,i.jsx)(n.a,{href:"https://github.com/boyter/scc",children:"scc"})," as it works across any programming language, calculates many more statistics, and is blazing fast."]}),"\n",(0,i.jsx)(n.h2,{id:"xtce-converter",children:"XTCE Converter"}),"\n",(0,i.jsx)(n.p,{children:"Converts from the XTCE format to the COSMOS format and also exports XTCE files given a COSMOS plugin."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"% openc3.sh cli xtce_converter\nUsage: xtce_converter [options] --import input_xtce_filename --output output_dir\n xtce_converter [options] --plugin /PATH/FILENAME.gem --output output_dir --variables variables.txt\n\n -h, --help Show this message\n -i, --import VALUE Import the specified .xtce file\n -o, --output DIRECTORY Create files in the directory\n -p, --plugin PLUGIN Export .xtce file(s) from the plugin\n -v, --variables Optional variables file to pass to the plugin\n"})}),"\n",(0,i.jsx)(n.h2,{id:"cstol-converter",children:"CSTOL Converter"}),"\n",(0,i.jsx)(n.p,{children:"Converts from the Colorado System Test and Operations Language (CSTOL) to a COSMOS Script Runner Ruby script. It currently does not support conversion to Python. Simply run it in the same directory as CSTOL files (*.prc) and it will convert them all."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"% openc3.sh cli cstol_converter\n"})})]})}function d(e={}){let{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(p,{...e})}):p(e)}},5511:function(e,n,t){t.d(n,{R:()=>o,x:()=>c});var s=t(6363);let i={},r=s.createContext(i);function o(e){let n=s.useContext(r);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]);
|
|
1
|
+
"use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([["5013"],{3020:function(e,n,t){t.r(n),t.d(n,{metadata:()=>s,default:()=>d,frontMatter:()=>o,contentTitle:()=>c,toc:()=>l,assets:()=>a});var s=JSON.parse('{"id":"getting-started/cli","title":"Command Line Interface","description":"Using openc3.sh","source":"@site/docs/getting-started/cli.md","sourceDirName":"getting-started","slug":"/getting-started/cli","permalink":"/tools/staticdocs/docs/getting-started/cli","draft":false,"unlisted":false,"editUrl":"https://github.com/OpenC3/cosmos/tree/main/docs.openc3.com/docs/getting-started/cli.md","tags":[],"version":"current","sidebarPosition":5,"frontMatter":{"sidebar_position":5,"title":"Command Line Interface","description":"Using openc3.sh","sidebar_custom_props":{"myEmoji":"\u2328\uFE0F"}},"sidebar":"defaultSidebar","previous":{"title":"Upgrading","permalink":"/tools/staticdocs/docs/getting-started/upgrading"},"next":{"title":"Utility Commands","permalink":"/tools/staticdocs/docs/getting-started/util"}}'),i=t(7259),r=t(9796);let o={sidebar_position:5,title:"Command Line Interface",description:"Using openc3.sh",sidebar_custom_props:{myEmoji:"\u2328\uFE0F"}},c,a={},l=[{value:"COSMOS Autocompletion in ZSH",id:"cosmos-autocompletion-in-zsh",level:3},{value:"Rake",id:"rake",level:2},{value:"IRB",id:"irb",level:2},{value:"Script",id:"script",level:2},{value:"Init (Enterprise Only since 6.3.0)",id:"init-enterprise-only-since-630",level:3},{value:"List",id:"list",level:3},{value:"Spawn",id:"spawn",level:3},{value:"Run",id:"run",level:3},{value:"Running (since 6.5.0)",id:"running-since-650",level:3},{value:"Status (since 6.5.0)",id:"status-since-650",level:3},{value:"Stop (since 6.5.0)",id:"stop-since-650",level:3},{value:"Validate",id:"validate",level:2},{value:"Load",id:"load",level:2},{value:"List",id:"list-1",level:2},{value:"Generate",id:"generate",level:2},{value:"Bridge",id:"bridge",level:2},{value:"Pkginstall and pkguninstall",id:"pkginstall-and-pkguninstall",level:2},{value:"Rubysloc (deprecated)",id:"rubysloc-deprecated",level:2},{value:"XTCE Converter",id:"xtce-converter",level:2},{value:"CSTOL Converter",id:"cstol-converter",level:2}];function p(e){let n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(n.p,{children:["The COSMOS Command Line Interface is a command on ",(0,i.jsx)(n.code,{children:"openc3.sh"})," and ",(0,i.jsx)(n.code,{children:"openc3.bat"})," which are included in the COSMOS ",(0,i.jsx)(n.a,{href:"https://github.com/OpenC3/cosmos-project",children:"project"})," (more about ",(0,i.jsx)(n.a,{href:"key-concepts#projects",children:"projects"}),")."]}),"\n",(0,i.jsxs)(n.p,{children:["If you followed the ",(0,i.jsx)(n.a,{href:"/tools/staticdocs/docs/getting-started/installation",children:"Installation Guide"})," you should already be inside a cloned ",(0,i.jsx)(n.a,{href:"https://github.com/OpenC3/cosmos-project",children:"cosmos-project"})," which is in your PATH (necessary for openc3.bat / openc3.sh to be resolved). To see all the available type the following:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"% openc3.sh cli\nUsage:\n cli help # Displays this information\n cli rake # Runs rake in the local directory\n cli irb # Runs irb in the local directory\n cli script # Interact with scripts. Run with --help for more info.\n cli validate /PATH/FILENAME.gem SCOPE variables.json # Validate a COSMOS plugin gem file\n cli load /PATH/FILENAME.gem SCOPE plugin_hash.json # Loads a COSMOS plugin gem file\n OPTIONS: --variables lets you pass a path to a JSON file containing your plugin\\'s variables\n cli list <SCOPE> # Lists installed plugins, SCOPE is DEFAULT if not given\n cli generate TYPE OPTIONS # Generate various COSMOS entities\n OPTIONS: --ruby or --python is required to specify the language in the generated code unless OPENC3_LANGUAGE is set\n cli bridge CONFIG_FILENAME # Run COSMOS host bridge\n cli bridgegem gem_name variable1=value1 variable2=value2 # Runs bridge using gem bridge.txt\n cli bridgesetup CONFIG_FILENAME # Create a default config file\n cli pkginstall PKGFILENAME SCOPE # Install loaded package (Ruby gem or python package)\n cli pkguninstall PKGFILENAME SCOPE # Uninstall loaded package (Ruby gem or python package)\n cli rubysloc # DEPRECATED: Please use scc (https://github.com/boyter/scc)\n cli xtce_converter # Convert to and from the XTCE format. Run with --help for more info.\n cli cstol_converter # Converts CSTOL files (.prc) to COSMOS. Run with --help for more info.\n"})}),"\n",(0,i.jsx)(n.admonition,{title:"seccomp profile",type:"note",children:(0,i.jsxs)(n.p,{children:["You can safely ignore ",(0,i.jsx)(n.code,{children:"WARNING: daemon is not using the default seccomp profile"})]})}),"\n",(0,i.jsx)(n.h3,{id:"cosmos-autocompletion-in-zsh",children:"COSMOS Autocompletion in ZSH"}),"\n",(0,i.jsxs)(n.p,{children:["Create a directory in your home for the autocomplete file if you do not have one already. For example, create ",(0,i.jsx)(n.code,{children:"~/.zsh/completions/"})," by running ",(0,i.jsx)(n.code,{children:"mkdir -p ~/.zsh/completions"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["Then, copy ",(0,i.jsx)(n.code,{children:"_openc3"})," from a cloned ",(0,i.jsx)(n.a,{href:"https://github.com/OpenC3/cosmos-project",children:"cosmos-project"})," repository and add the following to your ",(0,i.jsx)(n.code,{children:"~/.zshrc"})," file:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",children:"fpath=(~/.zsh/completions $fpath) \nautoload -Uz compinit\ncompinit\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Then, either run ",(0,i.jsx)(n.code,{children:"exec zsh"})," in your current shell or open a new shell in your terminal application."]}),"\n",(0,i.jsx)(n.admonition,{title:"issues getting argument completion",type:"note",children:(0,i.jsxs)(n.p,{children:['If you are having issues getting "argument completion" working for ',(0,i.jsx)(n.code,{children:"openc3.sh"})," try clearing the ZSH autocomplete cache running ",(0,i.jsx)(n.code,{children:"rm ~/.zcompdump*"})," and then reinitialize the completion system with ",(0,i.jsx)(n.code,{children:"compinit"}),"."]})}),"\n",(0,i.jsx)(n.h2,{id:"rake",children:"Rake"}),"\n",(0,i.jsxs)(n.p,{children:["You can execute rake tasks using ",(0,i.jsx)(n.code,{children:"openc3.sh cli rake"}),". The most typical usage is to generate a plugin and then build it. For example:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"% openc3.sh cli rake build VERSION=1.0.0\n"})}),"\n",(0,i.jsx)(n.h2,{id:"irb",children:"IRB"}),"\n",(0,i.jsxs)(n.p,{children:["IRB stands for Interactive Ruby and is a way to start a Ruby interpreter that you can play around with. When using it from the CLI, it includes the COSMOS Ruby path so you can ",(0,i.jsx)(n.code,{children:"require 'cosmos'"})," and try out various methods. For example:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'% openc3.sh cli irb\nirb(main):001:0> require \'cosmos\'\n=> true\nirb(main):002:0> Cosmos::Api::WHITELIST\n=>\n["get_interface",\n "get_interface_names",\n ...\n]\n'})}),"\n",(0,i.jsx)(n.h2,{id:"script",children:"Script"}),"\n",(0,i.jsx)(n.p,{children:"The script methods allow you to list the available scripts, spawn a script, and run a script while monitoring its output. Note that you must set the OPENC3_API_PASSWORD in COSMOS Core and both the OPENC3_API_USER and OPENC3_API_PASSWORD in COSMOS Enterprise."}),"\n",(0,i.jsx)(n.admonition,{title:"Offline Access Token (since 6.3.0)",type:"note",children:(0,i.jsx)(n.p,{children:'You must visit the frontend Script Runner page as the OPENC3_API_USER or run "openc3.sh cli script init" in order to obtain an offline access token before the other script cli methods will work.'})}),"\n",(0,i.jsx)(n.h3,{id:"init-enterprise-only-since-630",children:"Init (Enterprise Only since 6.3.0)"}),"\n",(0,i.jsx)(n.p,{children:"Obtain an offline access token without visiting the frontend GUI. This is required when running in a headless CI/CD environment before accessing any of the other commands."}),"\n",(0,i.jsx)(n.h3,{id:"list",children:"List"}),"\n",(0,i.jsx)(n.p,{children:"List all the available scripts which includes all the files in every target directory. You can filter this list using bash to only include procedures, Ruby files, Python files, etc."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"% export OPENC3_API_USER=operator\n% export OPENC3_API_PASSWORD=operator\n% openc3.sh cli script list\nEXAMPLE/cmd_tlm/example_cmds.txt\nEXAMPLE/cmd_tlm/example_tlm.txt\n...\n"})}),"\n",(0,i.jsx)(n.h3,{id:"spawn",children:"Spawn"}),"\n",(0,i.jsxs)(n.p,{children:["The ID of the spawned script is returned. You can connect to it in Script Runner by visiting ",(0,i.jsx)(n.code,{children:"http://localhost:2900/tools/scriptrunner/1"})," where the final value is the ID. For available options see ",(0,i.jsx)(n.code,{children:"Run"}),"."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"% openc3.sh cli script spawn INST/procedures/checks.rb\n4\n"})}),"\n",(0,i.jsx)(n.h3,{id:"run",children:"Run"}),"\n",(0,i.jsx)(n.p,{children:"Run spawns the script and then captures the output and prints it to the shell. Note that this will not work with user input prompts so the script must be written to prevent user input. You can also pass variables to the script as shown in the CLI help."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'% openc3.sh cli script run INST/procedures/stash.rb\nFilename INST/procedures/stash.rb scope DEFAULT\n2025/03/22 19:50:40.429 (SCRIPTRUNNER): Script config/DEFAULT/targets/INST/procedures/stash.rb spawned in 0.796683293 seconds <ruby 3.2.6>\n2025/03/22 19:50:40.453 (SCRIPTRUNNER): Starting script: stash.rb, line_delay = 0.1\nAt [INST/procedures/stash.rb:3] state [running]\nAt [INST/procedures/stash.rb:4] state [running]\n2025/03/22 19:50:40.732 (stash.rb:4): key1: val1\nAt [INST/procedures/stash.rb:5] state [running]\nAt [INST/procedures/stash.rb:6] state [running]\n2025/03/22 19:50:40.936 (stash.rb:6): key2: val2\nAt [INST/procedures/stash.rb:7] state [running]\n2025/03/22 19:50:41.039 (stash.rb:7): CHECK: \'val1\' == \'val1\' is TRUE\nAt [INST/procedures/stash.rb:8] state [running]\n2025/03/22 19:50:41.146 (stash.rb:8): CHECK: \'val2\' == \'val2\' is TRUE\nAt [INST/procedures/stash.rb:9] state [running]\n2025/03/22 19:50:41.256 (stash.rb:9): CHECK: \'["key1", "key2"]\' == \'["key1", "key2"]\' is TRUE\nAt [INST/procedures/stash.rb:10] state [running]\nAt [INST/procedures/stash.rb:11] state [running]\nAt [INST/procedures/stash.rb:12] state [running]\n2025/03/22 19:50:41.556 (stash.rb:12): CHECK: \'{"key1"=>1, "key2"=>2}\' == \'{"key1"=>1, "key2"=>2}\' is TRUE\nAt [INST/procedures/stash.rb:13] state [running]\nAt [INST/procedures/stash.rb:14] state [running]\n2025/03/22 19:50:41.763 (stash.rb:14): CHECK: true == true is TRUE\nAt [INST/procedures/stash.rb:15] state [running]\nAt [INST/procedures/stash.rb:16] state [running]\nAt [INST/procedures/stash.rb:17] state [running]\nAt [INST/procedures/stash.rb:18] state [running]\n2025/03/22 19:50:42.176 (stash.rb:18): CHECK: \'[1, 2, [3, 4]]\' == \'[1, 2, [3, 4]]\' is TRUE\nAt [INST/procedures/stash.rb:19] state [running]\nAt [INST/procedures/stash.rb:21] state [running]\nAt [INST/procedures/stash.rb:22] state [running]\nAt [INST/procedures/stash.rb:23] state [running]\n2025/03/22 19:50:42.587 (stash.rb:23): CHECK: \'{"one"=>1, "two"=>2, "string"=>"string"}\' == \'{"one"=>1, "two"=>2, "string"=>"string"}\' is TRUE\nAt [INST/procedures/stash.rb:24] state [running]\n2025/03/22 19:50:42.697 (SCRIPTRUNNER): Script completed: stash.rb\nAt [INST/procedures/stash.rb:0] state [stopped]\nscript complete\n%\n'})}),"\n",(0,i.jsxs)(n.p,{children:["You can also run Test Runner suites by passing the ",(0,i.jsx)(n.code,{children:"--suite SUITE"}),", ",(0,i.jsx)(n.code,{children:"--group GROUP"}),", and ",(0,i.jsx)(n.code,{children:"--script SCRIPT"})," options as shown below. Pass the ",(0,i.jsx)(n.code,{children:"--method"})," option to run ",(0,i.jsx)(n.code,{children:"--method setup"})," or ",(0,i.jsx)(n.code,{children:"--method teardown"}),". The default is ",(0,i.jsx)(n.code,{children:"--method start"}),". In addition you can pass an ",(0,i.jsx)(n.code,{children:"--options"})," argument to control the flags set in the Test Runner GUI. See the CLI help for more information."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'% openc3.sh cli script run INST2/procedures/my_script_suite.py --suite MySuite --group ExampleGroup --script script_2\nFilename INST2/procedures/my_script_suite.py scope DEFAULT\nFilename INST2/procedures/my_script_suite.py scope\nFilename INST2/procedures/utilities/clear.py scope\nFilename INST2/procedures/my_script_suite.py scope\nAt [INST2/procedures/my_script_suite.py:48] state [running]\nAt [INST2/procedures/my_script_suite.py:49] state [running]\n2025-07-31T04:45:31.284707Z (SCRIPTRUNNER): Script config/DEFAULT/targets/INST2/procedures/my_script_suite.py spawned in 0.0043256282806396484 seconds <python 3.12.11 (main, Jun 9 2025, 08:58:11) [GCC 14.2.0]>\n2025-07-31T04:45:31.310253Z (SCRIPTRUNNER): Starting script: my_script_suite.py, line_delay = 0.1\n2025-07-31T04:45:31.310949Z (my_script_suite.py:0): 2025-07-31T04:45:31.310253Z (SCRIPTRUNNER): Starting script: my_script_suite.py, line_delay = 0.1\nFilename INST2/procedures/my_script_suite.py scope\nAt [INST2/procedures/my_script_suite.py:21] state [running]\n2025-07-31T04:45:31.415640Z (my_script_suite.py:21): Running None:ExampleGroup:script_2\nAt [INST2/procedures/my_script_suite.py:24] state [running]\n2025-07-31T04:45:31.516645Z (my_script_suite.py:24): This test verifies requirement 2\nAt [INST2/procedures/my_script_suite.py:25] state [running]\nAt [INST2/procedures/my_script_suite.py:35] state [running]\nAt [INST2/procedures/my_script_suite.py:36] state [running]\n2025-07-31T04:45:31.822472Z (my_script_suite.py:36): help\nAt [INST2/procedures/my_script_suite.py:37] state [running]\nAt [INST2/procedures/my_script_suite.py:40] state [running]\nAt [INST2/procedures/my_script_suite.py:26] state [running]\nAt [INST2/procedures/my_script_suite.py:26] state [waiting]\nAt [INST2/procedures/my_script_suite.py:26] state [waiting]\n2025-07-31T04:45:34.129293Z (my_script_suite.py:26): WAIT: 2.0 seconds with actual time of 2.001 seconds\n2025-07-31T04:45:34.131468Z (SCRIPTRUNNER): Script completed: INST2/procedures/my_script_suite.py\nAt [INST2/procedures/my_script_suite.py:0] state [completed]\n{"report"=>\n "--- Script Report ---\\n" +\n "\\n" +\n "Settings:\\n" +\n "Manual = False\\n" +\n "Pause on Error = False\\n" +\n "Continue After Error = True\\n" +\n "Abort After Error = False\\n" +\n "Loop = False\\n" +\n "Break Loop On Error = False\\n" +\n "\\n" +\n "Results:\\n" +\n "2025-07-31T04:45:31.314286Z: Executing MySuite:ExampleGroup:script_2 \\n" +\n "2025-07-31T04:45:34.130958Z: ExampleGroup:script_2:PASS\\n" +\n " This test verifies requirement 2\\n" +\n " \\n" +\n "2025-07-31T04:45:34.132814Z: Completed MySuite:ExampleGroup:script_2 \\n" +\n "\\n" +\n "--- Test Summary ---\\n" +\n "\\n" +\n "Run Time: 2.8185291290283203\\n" +\n "Total Tests: 1\\n" +\n "Pass: 1\\n" +\n "Skip: 0\\n" +\n "Fail: 0\\n",\n "type"=>"report"}\nscript complete\n'})}),"\n",(0,i.jsx)(n.h3,{id:"running-since-650",children:"Running (since 6.5.0)"}),"\n",(0,i.jsx)(n.p,{children:"List all the running scripts. Add the --verbose option to print the raw output."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"% openc3.sh cli script running\nID User Filename Start Time State\n5 The Operator INST/procedures/collect.rb 2025-06-06T22:40:48Z paused\n4 The Operator INST/procedures/checks.rb 2025-06-06T22:40:21Z error\n"})}),"\n",(0,i.jsx)(n.h3,{id:"status-since-650",children:"Status (since 6.5.0)"}),"\n",(0,i.jsx)(n.p,{children:"List status for a specific script based on the script ID. Add the --verbose option to print the raw output."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"% openc3.sh cli script status 5\nID User Filename Start Time State\n5 The Operator INST/procedures/collect.rb 2025-06-06T22:40:48Z paused\n"})}),"\n",(0,i.jsx)(n.h3,{id:"stop-since-650",children:"Stop (since 6.5.0)"}),"\n",(0,i.jsx)(n.p,{children:"Stop a script based on the script ID."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"% openc3.sh cli script stop 5\n"})}),"\n",(0,i.jsx)(n.h2,{id:"validate",children:"Validate"}),"\n",(0,i.jsx)(n.p,{children:"Validate is used to validate built COSMOS plugins. It walks through the installation process without actually installing the plugin."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"% openc3.sh cli validate openc3-cosmos-cfdp-1.0.0.gem\nInstalling openc3-cosmos-cfdp-1.0.0.gem\nSuccessfully validated openc3-cosmos-cfdp-1.0.0.gem\n"})}),"\n",(0,i.jsxs)(n.p,{children:["You can optionally pass it the scope to install the plugin in (for Enterprise) and the path to a JSON file containing your plugin variables. If using COSMOS Core, use ",(0,i.jsx)(n.code,{children:"DEFAULT"})," for the scope. If you pass a variables file, any variables not defined in the file will take the default value (as defined in your ",(0,i.jsx)(n.code,{children:"plugin.txt"})," file)."]}),"\n",(0,i.jsx)(n.h2,{id:"load",children:"Load"}),"\n",(0,i.jsx)(n.p,{children:"Load can load a plugin into COSMOS without using the GUI. This is useful for scripts or CI/CD pipelines."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'% openc3.sh cli load openc3-cosmos-cfdp-1.0.0.gem\nLoading new plugin: openc3-cosmos-cfdp-1.0.0.gem\n{"name"=>"openc3-cosmos-cfdp-1.0.0.gem", "variables"=>{"cfdp_microservice_name"=>"CFDP", "cfdp_route_prefix"=>"/cfdp", "cfdp_port"=>"2905", "cfdp_cmd_target_name"=>"CFDP2", "cfdp_cmd_packet_name"=>"CFDP_PDU", "cfdp_cmd_item_name"=>"PDU", "cfdp_tlm_target_name"=>"CFDP2", "cfdp_tlm_packet_name"=>"CFDP_PDU", "cfdp_tlm_item_name"=>"PDU", "source_entity_id"=>"1", "destination_entity_id"=>"2", "root_path"=>"/DEFAULT/targets_modified/CFDP/tmp", "bucket"=>"config", "plugin_test_mode"=>"false"}, "plugin_txt_lines"=>["VARIABLE cfdp_microservice_name CFDP", "VARIABLE cfdp_route_prefix /cfdp", "VARIABLE cfdp_port 2905", "", "VARIABLE cfdp_cmd_target_name CFDP2", "VARIABLE cfdp_cmd_packet_name CFDP_PDU", "VARIABLE cfdp_cmd_item_name PDU", "", "VARIABLE cfdp_tlm_target_name CFDP2", "VARIABLE cfdp_tlm_packet_name CFDP_PDU", "VARIABLE cfdp_tlm_item_name PDU", "", "VARIABLE source_entity_id 1", "VARIABLE destination_entity_id 2", "VARIABLE root_path /DEFAULT/targets_modified/CFDP/tmp", "VARIABLE bucket config", "", "# Set to true to enable a test configuration", "VARIABLE plugin_test_mode \\"false\\"", "", "MICROSERVICE CFDP <%= cfdp_microservice_name %>", " WORK_DIR .", " ROUTE_PREFIX <%= cfdp_route_prefix %>", " ENV OPENC3_ROUTE_PREFIX <%= cfdp_route_prefix %>", " ENV SECRET_KEY_BASE 324973597349867207430793759437697498769349867349674", " PORT <%= cfdp_port %>", " CMD rails s -b 0.0.0.0 -p <%= cfdp_port %> -e production", " # MIB Options Follow -", " # You will need to modify these for your mission", " OPTION source_entity_id <%= source_entity_id %>", " OPTION tlm_info <%= cfdp_tlm_target_name %> <%= cfdp_tlm_packet_name %> <%= cfdp_tlm_item_name %>", " OPTION destination_entity_id <%= destination_entity_id %>", " OPTION cmd_info <%= cfdp_cmd_target_name %> <%= cfdp_cmd_packet_name %> <%= cfdp_cmd_item_name %>", " OPTION root_path <%= root_path %>", " <% if bucket.to_s.strip != \'\' %>", " OPTION bucket <%= bucket %>", " <% end %>", "", "<% include_test = (plugin_test_mode.to_s.strip.downcase == \\"true\\") %>", "<% if include_test %>", " TARGET CFDPTEST CFDP", " TARGET CFDPTEST CFDP2", "", " MICROSERVICE CFDP CFDP2", " WORK_DIR .", " ROUTE_PREFIX /cfdp2", " ENV OPENC3_ROUTE_PREFIX /cfdp2", " ENV SECRET_KEY_BASE 324973597349867207430793759437697498769349867349674", " PORT 2906", " CMD rails s -b 0.0.0.0 -p 2906 -e production", " OPTION source_entity_id <%= destination_entity_id %>", " OPTION tlm_info CFDP CFDP_PDU PDU", " OPTION destination_entity_id <%= source_entity_id %>", " OPTION cmd_info CFDP CFDP_PDU PDU", " OPTION root_path <%= root_path %>", " <% if bucket.to_s.strip != \'\' %>", " OPTION bucket <%= bucket %>", " <% end %>", "", " <% test_host = ENV[\'KUBERNETES_SERVICE_HOST\'] ? (scope.to_s.downcase + \\"-interface-cfdp2-int-service\\") : \\"openc3-operator\\" %>", " INTERFACE CFDP_INT tcpip_client_interface.rb <%= test_host %> 2907 2907 10.0 nil LENGTH 0 32 4 1 BIG_ENDIAN 0 nil nil true", " MAP_TARGET CFDP", "", " INTERFACE CFDP2_INT tcpip_server_interface.rb 2907 2907 10.0 nil LENGTH 0 32 4 1 BIG_ENDIAN 0 nil nil true", " PORT 2907", " MAP_TARGET CFDP2", "<% end %>"], "needs_dependencies"=>false, "updated_at"=>nil}\nUpdating local plugin files: /plugins/DEFAULT/openc3-cosmos-cfdp\n'})}),"\n",(0,i.jsxs)(n.p,{children:["You can optionally pass it the scope to install the plugin in (for Enterprise) and the path to a JSON file containing the entire ",(0,i.jsx)(n.code,{children:"plugin_hash"})," for your plugin. This lets you manually set things like the installed name, ",(0,i.jsx)(n.code,{children:"updated_at"})," timestamp, and other properties. Use this carefully."]}),"\n",(0,i.jsxs)(n.p,{children:["There is also a ",(0,i.jsx)(n.code,{children:"--variables"})," option, which allows you to pass the path to a JSON file containing your plugin variables. This is the same as the optional variables file mentioned above for ",(0,i.jsx)(n.code,{children:"cli validate"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"list-1",children:"List"}),"\n",(0,i.jsx)(n.p,{children:"List displays all the installed plugins."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"% openc3.sh cli list\nopenc3-cosmos-cfdp-1.0.0.gem__20250325160956\nopenc3-cosmos-demo-6.2.2.pre.beta0.20250325143120.gem__20250325160201\nopenc3-cosmos-enterprise-tool-admin-6.2.2.pre.beta0.20250325155648.gem__20250325160159\nopenc3-cosmos-tool-autonomic-6.2.2.pre.beta0.20250325155658.gem__20250325160225\nopenc3-cosmos-tool-bucketexplorer-6.2.2.pre.beta0.20250325143107.gem__20250325160227\nopenc3-cosmos-tool-calendar-6.2.2.pre.beta0.20250325155654.gem__20250325160224\nopenc3-cosmos-tool-cmdhistory-6.2.2.pre.beta0.20250325155651.gem__20250325160212\nopenc3-cosmos-tool-cmdsender-6.2.2.pre.beta0.20250325143111.gem__20250325160211\nopenc3-cosmos-tool-cmdtlmserver-6.2.2.pre.beta0.20250325143114.gem__20250325160208\nopenc3-cosmos-tool-dataextractor-6.2.2.pre.beta0.20250325143104.gem__20250325160219\nopenc3-cosmos-tool-dataviewer-6.2.2.pre.beta0.20250325143108.gem__20250325160220\nopenc3-cosmos-tool-docs-6.2.2.pre.beta0.20250325155535.gem__20250325160228\nopenc3-cosmos-tool-grafana-6.2.2.pre.beta0.20250325155658.gem__20250325160233\nopenc3-cosmos-tool-handbooks-6.2.2.pre.beta0.20250325143113.gem__20250325160222\nopenc3-cosmos-tool-iframe-6.2.2.pre.beta0.20250325143110.gem__20250325160158\nopenc3-cosmos-tool-limitsmonitor-6.2.2.pre.beta0.20250325155448.gem__20250325160209\nopenc3-cosmos-tool-packetviewer-6.2.2.pre.beta0.20250325143104.gem__20250325160215\nopenc3-cosmos-tool-scriptrunner-6.2.2.pre.beta0.20250325143111.gem__20250325160214\nopenc3-cosmos-tool-tablemanager-6.2.2.pre.beta0.20250325143116.gem__20250325160223\nopenc3-cosmos-tool-tlmgrapher-6.2.2.pre.beta0.20250325143105.gem__20250325160218\nopenc3-cosmos-tool-tlmviewer-6.2.2.pre.beta0.20250325143108.gem__20250325160216\nopenc3-enterprise-tool-base-6.2.2.pre.beta0.20250325155704.gem__20250325160153\n"})}),"\n",(0,i.jsx)(n.h2,{id:"generate",children:"Generate"}),"\n",(0,i.jsxs)(n.p,{children:["Generate is used to scaffold new COSMOS plugins, targets, conversions, and more! See the ",(0,i.jsx)(n.a,{href:"/docs/getting-started/generators",children:"Generators"})," page for more information."]}),"\n",(0,i.jsx)(n.h2,{id:"bridge",children:"Bridge"}),"\n",(0,i.jsxs)(n.p,{children:["A COSMOS Bridge is a small application that is run on the local computer to connect to hardware not available to Docker containers. A good example is connecting to a serial port on a non-linux system. See the\n",(0,i.jsx)(n.a,{href:"/docs/guides/bridges",children:"Bridge Guide"})," for more information."]}),"\n",(0,i.jsx)(n.h2,{id:"pkginstall-and-pkguninstall",children:"Pkginstall and pkguninstall"}),"\n",(0,i.jsx)(n.p,{children:"Allows you to install or remove Ruby gems or Python wheels into COSMOS. These are dependencies that are not packaged with the COSMOS plugin itself."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"% openc3.sh cli pkginstall rspec-3.13.0.gem\n"})}),"\n",(0,i.jsx)(n.h2,{id:"rubysloc-deprecated",children:"Rubysloc (deprecated)"}),"\n",(0,i.jsxs)(n.p,{children:["Calculates the Ruby Source Lines of Code (SLOC) from the current directory recursively. We recommend using ",(0,i.jsx)(n.a,{href:"https://github.com/boyter/scc",children:"scc"})," as it works across any programming language, calculates many more statistics, and is blazing fast."]}),"\n",(0,i.jsx)(n.h2,{id:"xtce-converter",children:"XTCE Converter"}),"\n",(0,i.jsx)(n.p,{children:"Converts from the XTCE format to the COSMOS format and also exports XTCE files given a COSMOS plugin."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"% openc3.sh cli xtce_converter\nUsage: xtce_converter [options] --import input_xtce_filename --output output_dir\n xtce_converter [options] --plugin /PATH/FILENAME.gem --output output_dir --variables variables.txt\n\n -h, --help Show this message\n -i, --import VALUE Import the specified .xtce file\n -o, --output DIRECTORY Create files in the directory\n -p, --plugin PLUGIN Export .xtce file(s) from the plugin\n -v, --variables Optional variables file to pass to the plugin\n"})}),"\n",(0,i.jsx)(n.h2,{id:"cstol-converter",children:"CSTOL Converter"}),"\n",(0,i.jsx)(n.p,{children:"Converts from the Colorado System Test and Operations Language (CSTOL) to a COSMOS Script Runner Ruby script. It currently does not support conversion to Python. Simply run it in the same directory as CSTOL files (*.prc) and it will convert them all."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"% openc3.sh cli cstol_converter\n"})})]})}function d(e={}){let{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(p,{...e})}):p(e)}},9796:function(e,n,t){t.d(n,{R:()=>o,x:()=>c});var s=t(6363);let i={},r=s.createContext(i);function o(e){let n=s.useContext(r);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([["7830"],{
|
|
1
|
+
"use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([["7830"],{3386:function(e,n,s){s.r(n),s.d(n,{metadata:()=>t,default:()=>h,frontMatter:()=>l,contentTitle:()=>r,toc:()=>a,assets:()=>c});var t=JSON.parse('{"id":"development/testing","title":"Testing COSMOS","description":"Running the Playwright integration tests and unit tests","source":"@site/docs/development/testing.md","sourceDirName":"development","slug":"/development/testing","permalink":"/tools/staticdocs/docs/development/testing","draft":false,"unlisted":false,"editUrl":"https://github.com/OpenC3/cosmos/tree/main/docs.openc3.com/docs/development/testing.md","tags":[],"version":"current","frontMatter":{"title":"Testing COSMOS","description":"Running the Playwright integration tests and unit tests","sidebar_custom_props":{"myEmoji":"\u{1F4CB}"}},"sidebar":"defaultSidebar","previous":{"title":"Streaming API","permalink":"/tools/staticdocs/docs/development/streaming-api"},"next":{"title":"Meta","permalink":"/tools/staticdocs/docs/meta"}}'),o=s(7259),i=s(9796);let l={title:"Testing COSMOS",description:"Running the Playwright integration tests and unit tests",sidebar_custom_props:{myEmoji:"\u{1F4CB}"}},r,c={},a=[{value:"Playwright",id:"playwright",level:2},{value:"Prerequesits",id:"prerequesits",level:3},{value:"Playwright Testing",id:"playwright-testing",level:3},{value:"Ruby Unit Tests",id:"ruby-unit-tests",level:2},{value:"Python Unit Tests",id:"python-unit-tests",level:2}];function d(e){let n={code:"code",em:"em",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h2,{id:"playwright",children:"Playwright"}),"\n",(0,o.jsx)(n.h3,{id:"prerequesits",children:"Prerequesits"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Install pnpm"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"npm install --global pnpm@latest-10\n"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Clone the COSMOS repo"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/OpenC3/cosmos\n"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Install Playwright and dependencies"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"cd cosmos/playwright\ncosmos/playwright % ./playwright.sh install-playwright\n"})}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"playwright-testing",children:"Playwright Testing"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Start COSMOS"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"cosmos % openc3.sh start\n"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:'Open COSMOS in your browser. At the login screen, set the password to "password".'}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Run tests (Note the --headed option visually displays tests, leave it off to run in the background)"}),"\n",(0,o.jsx)(n.p,{children:"Tests are split into a group that runs in parallel and a group that runs serially. This is done to improve overall execution time."}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"cosmos/playwright % pnpm test:parallel --headed\ncosmos/playwright % pnpm test:serial --headed\n"})}),"\n",(0,o.jsx)(n.p,{children:"You can run both groups together, but the --headed option will not apply to both groups:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"cosmos/playwright % pnpm test\n"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.em,{children:"[Optional]"})," Fix istanbul/nyc coverage source lookups (use ",(0,o.jsx)(n.code,{children:"fixwindows"})," if not on Linux)."]}),"\n",(0,o.jsx)(n.p,{children:"Tests will run successfully without this step and you will get coverage statistics, but line-by-line coverage won't work."}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"cosmos/playwright % pnpm fixlinux\n"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Generate code coverage"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"cosmos/playwright % pnpm coverage\n"})}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["Code coverage reports can be viewed at ",(0,o.jsx)(n.code,{children:"cosmos/playwright/coverage/index.html"})]}),"\n",(0,o.jsx)(n.h2,{id:"ruby-unit-tests",children:"Ruby Unit Tests"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Navigate to ",(0,o.jsx)(n.strong,{children:"cosmos/openc3"})," folder. Run the command:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"cosmos/openc3 % rake build\ncosmos/openc3 % bundle exec rspec\n"})}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["Code coverage reports can be found at ",(0,o.jsx)(n.code,{children:"cosmos/openc3/coverage/index.html"})]}),"\n",(0,o.jsx)(n.h2,{id:"python-unit-tests",children:"Python Unit Tests"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Navigate to ",(0,o.jsx)(n.strong,{children:"cosmos/openc3/python"})," folder. Run the command:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"cosmos/openc3/python % python -m pip install poetry\ncosmos/openc3/python % poetry install\ncosmos/openc3/python % poetry run coverage run -m pytest\ncosmos/openc3/python % poetry run coverage html\n"})}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["Code coverage reports can be found at ",(0,o.jsx)(n.code,{children:"cosmos/openc3/python/coverage/index.html"})]})]})}function h(e={}){let{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},9796:function(e,n,s){s.d(n,{R:()=>l,x:()=>r});var t=s(6363);let o={},i=t.createContext(o);function l(e){let n=t.useContext(i);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:l(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([["6526"],{2562:function(e,n,i){i.r(n),i.d(n,{frontMatter:()=>r,toc:()=>c,default:()=>a,metadata:()=>t,assets:()=>l,contentTitle:()=>d});var t=JSON.parse('{"id":"guides/custom-widgets","title":"Custom Widgets","description":"How to build custom widgets for use in Telemetry Viewer","source":"@site/docs/guides/custom-widgets.md","sourceDirName":"guides","slug":"/guides/custom-widgets","permalink":"/tools/staticdocs/docs/guides/custom-widgets","draft":false,"unlisted":false,"editUrl":"https://github.com/OpenC3/cosmos/tree/main/docs.openc3.com/docs/guides/custom-widgets.md","tags":[],"version":"current","frontMatter":{"title":"Custom Widgets","description":"How to build custom widgets for use in Telemetry Viewer","sidebar_custom_props":{"myEmoji":"\u{1F528}"}},"sidebar":"defaultSidebar","previous":{"title":"COSMOS and NASA cFS","permalink":"/tools/staticdocs/docs/guides/cfs"},"next":{"title":"Dynamic Packets","permalink":"/tools/staticdocs/docs/guides/dynamic-packets"}}'),s=i(7259),o=i(5511);let r={title:"Custom Widgets",description:"How to build custom widgets for use in Telemetry Viewer",sidebar_custom_props:{myEmoji:"\u{1F528}"}},d="Custom Widgets",l={},c=[{value:"Step 1: Set Up Your Plugin Structure",id:"step-1-set-up-your-plugin-structure",level:2},{value:"Step 2: Declare Your Widget in plugin.txt",id:"step-2-declare-your-widget-in-plugintxt",level:2},{value:"Step 3: Configure Your Build Process",id:"step-3-configure-your-build-process",level:2},{value:"Set Up package.json",id:"set-up-packagejson",level:3},{value:"Update Your Rakefile",id:"update-your-rakefile",level:3},{value:"Step 4: Create Your Widget Component",id:"step-4-create-your-widget-component",level:2},{value:"Step 5: Develop Your Widget",id:"step-5-develop-your-widget",level:2},{value:"Designing Your Widget Layout",id:"designing-your-widget-layout",level:3},{value:"Adding Widget Logic",id:"adding-widget-logic",level:3},{value:"Styling Your Widget",id:"styling-your-widget",level:3},{value:"Step 6: Configure Your Build Output",id:"step-6-configure-your-build-output",level:2},{value:"Step 7: Use Your Widget in a Screen Definition",id:"step-7-use-your-widget-in-a-screen-definition",level:2},{value:"Step 8: Build and Deploy Your Plugin",id:"step-8-build-and-deploy-your-plugin",level:2}];function u(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components},{TabItem:t,Tabs:r}=n;return t||g("TabItem",!0),r||g("Tabs",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"custom-widgets",children:"Custom Widgets"})}),"\n",(0,s.jsxs)(n.p,{children:["This guide will walk you through the process of building custom widgets for use in COSMOS ",(0,s.jsx)(n.a,{href:"/tools/staticdocs/docs/tools/tlm-viewer",children:"Telemetry Viewer"}),". While you can use any JavaScript framework, we'll use Vue.js since COSMOS is built with it. Before starting, you may want to check out the ",(0,s.jsx)(n.a,{href:"/docs/getting-started/generators#widget-generator",children:"Widget Generator"})," guide to create the initial scaffolding."]}),"\n",(0,s.jsx)(n.h2,{id:"step-1-set-up-your-plugin-structure",children:"Step 1: Set Up Your Plugin Structure"}),"\n",(0,s.jsxs)(n.p,{children:["If you have an existing plugin, start in the root directory for that plugin. If you do not yet have a plugin, start by using the ",(0,s.jsx)(n.a,{href:"/docs/getting-started/generators#plugin-generator",children:"Plugin Generator"})," to create one."]}),"\n",(0,s.jsx)(n.admonition,{title:"Use separate plugins for tools and widgets",type:"warning",children:(0,s.jsx)(n.p,{children:"If your existing plugin contains a custom tool, you may run into build issues. In this instance, we recommend having one plugin for your custom tool, and a second plugin for you custom custom widgets."})}),"\n",(0,s.jsxs)(n.p,{children:["In your plugin's root directory, use the ",(0,s.jsx)(n.a,{href:"/docs/getting-started/generators#widget-generator",children:"Widget Generator"})," to scaffold the widget."]}),"\n",(0,s.jsx)(n.p,{children:"Ensure your plugin has the correct directory structure:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"your-plugin/\n\u251C\u2500\u2500 LICENSE.txt\n\u251C\u2500\u2500 your-plugin.gemspec\n\u251C\u2500\u2500 package.json\n\u251C\u2500\u2500 plugin.txt\n\u251C\u2500\u2500 Rakefile\n\u251C\u2500\u2500 README.md\n\u251C\u2500\u2500 src/\n\u2502 \u2514\u2500\u2500 YourcustomWidget.vue\n\u2514\u2500\u2500 vite.config.js\n"})}),"\n",(0,s.jsx)(n.h2,{id:"step-2-declare-your-widget-in-plugintxt",children:"Step 2: Declare Your Widget in plugin.txt"}),"\n",(0,s.jsxs)(n.p,{children:["In your plugin's ",(0,s.jsx)(n.code,{children:"plugin.txt"})," file, declare each custom widget you want to create:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-ruby",children:"WIDGET YOURCUSTOM\n"})}),"\n",(0,s.jsx)(n.p,{children:"For example, in the COSMOS Demo plugin, two widgets are declared:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-ruby",children:"WIDGET BIG\nWIDGET HELLOWORLD\n"})}),"\n",(0,s.jsx)(n.h2,{id:"step-3-configure-your-build-process",children:"Step 3: Configure Your Build Process"}),"\n",(0,s.jsx)(n.h3,{id:"set-up-packagejson",children:"Set Up package.json"}),"\n",(0,s.jsxs)(n.p,{children:["Ensure your ",(0,s.jsx)(n.code,{children:"package.json"})," includes the necessary build script:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",children:'{\n "scripts": {\n "build": "vite build"\n },\n "dependencies": {\n "@openc3/vue-common": "latest"\n },\n "devDependencies": {\n "vite": "latest"\n }\n}\n'})}),"\n",(0,s.jsx)(n.h3,{id:"update-your-rakefile",children:"Update Your Rakefile"}),"\n",(0,s.jsxs)(n.p,{children:["Ensure your ",(0,s.jsx)(n.code,{children:"Rakefile"})," is configured to run the build script in its ",(0,s.jsx)(n.code,{children:":build"})," task:"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.em,{children:"(This should happen automatically if you use our code generators mentioned above.)"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-ruby",children:"task :build do\n # ...\n\n # Build the widget and gem using sh built into Rake:\n # https://rubydoc.info/gems/rake/FileUtils#sh-instance_method\n sh('pnpm', 'run', 'build')\n\n # ...\nend\n"})}),"\n",(0,s.jsx)(n.h2,{id:"step-4-create-your-widget-component",children:"Step 4: Create Your Widget Component"}),"\n",(0,s.jsxs)(n.p,{children:["If it doesn't exist already, create a Vue component file in the ",(0,s.jsx)(n.code,{children:"src"})," directory, following this naming convention: ",(0,s.jsx)(n.code,{children:"YourcustomWidget.vue"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:['For example, to create a widget called "HELLOWORLD", you would create ',(0,s.jsx)(n.code,{children:"HelloworldWidget.vue"}),":"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-html",children:'<template>\n \x3c!-- Your widget\'s HTML structure goes here --\x3e\n</template>\n\n<script>\n import { Widget } from "@openc3/vue-common/widgets";\n export default {\n mixins: [Widget],\n data() {\n return {\n // Reactive data items\n };\n },\n };\n<\/script>\n<style scoped>\n /* Widget-specific styles */\n</style>\n'})}),"\n",(0,s.jsx)(n.h2,{id:"step-5-develop-your-widget",children:"Step 5: Develop Your Widget"}),"\n",(0,s.jsx)(n.p,{children:"This is where you'll design the actual layout and functionality of your widget. Let's expand on this using the Helloworld Widget as an example:"}),"\n",(0,s.jsx)(n.h3,{id:"designing-your-widget-layout",children:"Designing Your Widget Layout"}),"\n",(0,s.jsxs)(n.p,{children:["In the ",(0,s.jsx)(n.code,{children:"<template>"})," section, you'll define your widget's visual structure. For a simple Hello World widget:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-html",children:'<template>\n <div class="hello-world-container">\n <h3>{{ greeting }}</h3>\n <p>This is a custom COSMOS widget</p>\n <v-btn @click="updateGreeting" color="primary"> Change Greeting </v-btn>\n </div>\n</template>\n'})}),"\n",(0,s.jsx)(n.admonition,{title:"Vue & Vuetify",type:"info",children:(0,s.jsxs)(n.p,{children:["For more information about how the COSMOS frontend is built (including all the Widgets) please check out ",(0,s.jsx)(n.a,{href:"https://vuejs.org",children:"Vue.js"})," and ",(0,s.jsx)(n.a,{href:"https://vuetifyjs.com",children:"Vuetify"}),"."]})}),"\n",(0,s.jsx)(n.h3,{id:"adding-widget-logic",children:"Adding Widget Logic"}),"\n",(0,s.jsxs)(n.p,{children:["In the ",(0,s.jsx)(n.code,{children:"<script>"})," section, define the behavior of your widget:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-html",children:'<script>\n import { Widget } from "@openc3/vue-common/widgets"; // Make sure you import Widget\n export default {\n mixins: [Widget], // Make sure you include Widget in the mixins here\n data() {\n return {\n greeting: "Hello, COSMOS!",\n greetings: ["Hello, COSMOS!", "Greetings, User!", "Welcome to COSMOS!"],\n };\n },\n methods: {\n updateGreeting() {\n // Cycle through different greetings\n const currentIndex = this.greetings.indexOf(this.greeting);\n const nextIndex = (currentIndex + 1) % this.greetings.length;\n this.greeting = this.greetings[nextIndex];\n },\n },\n };\n<\/script>\n'})}),"\n",(0,s.jsx)(n.h3,{id:"styling-your-widget",children:"Styling Your Widget"}),"\n",(0,s.jsxs)(n.p,{children:["Add custom styles in the ",(0,s.jsx)(n.code,{children:"<style>"})," section:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-html",children:"<style scoped>\n .hello-world-container {\n padding: 15px;\n border: 1px solid #ddd;\n border-radius: 4px;\n text-align: center;\n background-color: #f9f9f9;\n }\n</style>\n"})}),"\n",(0,s.jsx)(n.h2,{id:"step-6-configure-your-build-output",children:"Step 6: Configure Your Build Output"}),"\n",(0,s.jsxs)(n.p,{children:["Ensure your ",(0,s.jsx)(n.code,{children:"vite.config.js"})," file is configured to properly build your widgets:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-javascript",children:'import { defineConfig } from "vite";\nimport VitePluginStyleInject from "vite-plugin-style-inject";\nimport vue from "@vitejs/plugin-vue";\n\nconst DEFAULT_EXTENSIONS = [".mjs", ".js", ".ts", ".jsx", ".tsx", ".json"];\n\nexport default defineConfig({\n build: {\n outDir: "tools/widgets/YourcustomWidget",\n emptyOutDir: true,\n sourcemap: true,\n lib: {\n entry: "./src/YourcustomWidget.vue",\n name: "YourcustomWidget",\n fileName: (format, entryName) => `${entryName}.${format}.min.js`,\n formats: ["umd"],\n },\n rollupOptions: {\n external: ["vue", "vuetify"],\n },\n },\n plugins: [vue(), VitePluginStyleInject()],\n resolve: {\n extensions: [...DEFAULT_EXTENSIONS, ".vue"], // not recommended but saves us from having to change every SFC import\n },\n});\n'})}),"\n",(0,s.jsx)(n.h2,{id:"step-7-use-your-widget-in-a-screen-definition",children:"Step 7: Use Your Widget in a Screen Definition"}),"\n",(0,s.jsx)(n.p,{children:"Create a screen definition file in your target's screens directory:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-ruby",children:"SCREEN AUTO AUTO 0.5\nLABELVALUE <%= target_name %> HEALTH_STATUS CCSDSSEQCNT\nHELLOWORLD\n"})}),"\n",(0,s.jsx)(n.p,{children:"In this example, we're using the HELLOWORLD widget from the demo, which will result in a screen that looks like this:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Simple Screen",src:i(4373).A+"",width:"681",height:"210"})}),"\n",(0,s.jsxs)(n.p,{children:["The widget name follows the convention from ",(0,s.jsx)(n.code,{children:"plugin.txt"})," file. The screen definition for a screen that has only your custom widget created here, ensure your screen definition looks like this:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-ruby",children:"SCREEN AUTO AUTO 0.5\nYOURCUSTOM\n"})}),"\n",(0,s.jsx)(n.p,{children:"If your widget requires telemetry data, make sure you include the target and telemetry information:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-ruby",children:"YOURCUSTOM <%= target_name %> HEALTH_STATUS TEMP1\n"})}),"\n",(0,s.jsx)(n.h2,{id:"step-8-build-and-deploy-your-plugin",children:"Step 8: Build and Deploy Your Plugin"}),"\n",(0,s.jsxs)(n.p,{children:["In order to build a widget, a container containing ",(0,s.jsx)(n.code,{children:"node"})," and ",(0,s.jsx)(n.code,{children:"pnpm"})," is necessary."]}),"\n",(0,s.jsxs)(r,{groupId:"operating-system",children:[(0,s.jsx)(t,{value:"linux",label:"Linux / macOS",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"% docker run -it -v `pwd`:/openc3/local:z -w /openc3/local openc3inc/openc3-node sh\n/openc3/local $ pnpm install\n/openc3/local $ rake build\n"})})}),(0,s.jsx)(t,{value:"windows",label:"Windows",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"docker run -it -v %cd%:/openc3/local -w /openc3/local openc3inc/openc3-node sh\n/openc3/local $ pnpm install\n/openc3/local $ rake build\n"})})})]}),"\n",(0,s.jsx)(n.p,{children:"Notes:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["The ",(0,s.jsx)(n.code,{children:"openc3-node"})," container is currently missing the ",(0,s.jsx)(n.code,{children:"openc3"})," gem, so the gem validation will fail. This does not impact widget development."]}),"\n",(0,s.jsxs)(n.li,{children:["The ",(0,s.jsx)(n.code,{children:"openc3-node"})," container may need to be run as ",(0,s.jsx)(n.code,{children:"root"})," so that ",(0,s.jsx)(n.code,{children:"pnpm"})," has the permissions to create ",(0,s.jsx)(n.code,{children:"node_modules"})," in the host widget directory."]}),"\n",(0,s.jsxs)(n.li,{children:["If you are behind a firewall/proxy, the ",(0,s.jsx)(n.code,{children:"NODE_EXTRA_CA_CERTS"})," in the container may need to be set for ",(0,s.jsx)(n.code,{children:"pnpm"})," to work. The ",(0,s.jsx)(n.code,{children:"Error: self-signed certificate in certificate chain error"})," signifies the need for this env variable."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Now open Telemetry Viewer and select your screen to see your custom widget in action!"}),"\n",(0,s.jsx)(n.p,{children:"While this example is simple, the possibilities with custom widgets are limitless!"})]})}function a(e={}){let{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}function g(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},4373:function(e,n,i){i.d(n,{A:()=>t});let t=i.p+"assets/images/simple_screen-e3de1ad836c0661d73a0ba970f991c64df8ecc7e23f9e944b6508a9a43fbc33c.png"},5511:function(e,n,i){i.d(n,{R:()=>r,x:()=>d});var t=i(6363);let s={},o=t.createContext(s);function r(e){let n=t.useContext(o);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]);
|
|
1
|
+
"use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([["6526"],{3681:function(e,n,i){i.r(n),i.d(n,{metadata:()=>t,default:()=>a,frontMatter:()=>r,contentTitle:()=>d,toc:()=>c,assets:()=>l});var t=JSON.parse('{"id":"guides/custom-widgets","title":"Custom Widgets","description":"How to build custom widgets for use in Telemetry Viewer","source":"@site/docs/guides/custom-widgets.md","sourceDirName":"guides","slug":"/guides/custom-widgets","permalink":"/tools/staticdocs/docs/guides/custom-widgets","draft":false,"unlisted":false,"editUrl":"https://github.com/OpenC3/cosmos/tree/main/docs.openc3.com/docs/guides/custom-widgets.md","tags":[],"version":"current","frontMatter":{"title":"Custom Widgets","description":"How to build custom widgets for use in Telemetry Viewer","sidebar_custom_props":{"myEmoji":"\u{1F528}"}},"sidebar":"defaultSidebar","previous":{"title":"COSMOS and NASA cFS","permalink":"/tools/staticdocs/docs/guides/cfs"},"next":{"title":"Dynamic Packets","permalink":"/tools/staticdocs/docs/guides/dynamic-packets"}}'),s=i(7259),o=i(9796);let r={title:"Custom Widgets",description:"How to build custom widgets for use in Telemetry Viewer",sidebar_custom_props:{myEmoji:"\u{1F528}"}},d="Custom Widgets",l={},c=[{value:"Step 1: Set Up Your Plugin Structure",id:"step-1-set-up-your-plugin-structure",level:2},{value:"Step 2: Declare Your Widget in plugin.txt",id:"step-2-declare-your-widget-in-plugintxt",level:2},{value:"Step 3: Configure Your Build Process",id:"step-3-configure-your-build-process",level:2},{value:"Set Up package.json",id:"set-up-packagejson",level:3},{value:"Update Your Rakefile",id:"update-your-rakefile",level:3},{value:"Step 4: Create Your Widget Component",id:"step-4-create-your-widget-component",level:2},{value:"Step 5: Develop Your Widget",id:"step-5-develop-your-widget",level:2},{value:"Designing Your Widget Layout",id:"designing-your-widget-layout",level:3},{value:"Adding Widget Logic",id:"adding-widget-logic",level:3},{value:"Styling Your Widget",id:"styling-your-widget",level:3},{value:"Step 6: Configure Your Build Output",id:"step-6-configure-your-build-output",level:2},{value:"Step 7: Use Your Widget in a Screen Definition",id:"step-7-use-your-widget-in-a-screen-definition",level:2},{value:"Step 8: Build and Deploy Your Plugin",id:"step-8-build-and-deploy-your-plugin",level:2}];function u(e){let n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components},{TabItem:t,Tabs:r}=n;return t||g("TabItem",!0),r||g("Tabs",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"custom-widgets",children:"Custom Widgets"})}),"\n",(0,s.jsxs)(n.p,{children:["This guide will walk you through the process of building custom widgets for use in COSMOS ",(0,s.jsx)(n.a,{href:"/tools/staticdocs/docs/tools/tlm-viewer",children:"Telemetry Viewer"}),". While you can use any JavaScript framework, we'll use Vue.js since COSMOS is built with it. Before starting, you may want to check out the ",(0,s.jsx)(n.a,{href:"/docs/getting-started/generators#widget-generator",children:"Widget Generator"})," guide to create the initial scaffolding."]}),"\n",(0,s.jsx)(n.h2,{id:"step-1-set-up-your-plugin-structure",children:"Step 1: Set Up Your Plugin Structure"}),"\n",(0,s.jsxs)(n.p,{children:["If you have an existing plugin, start in the root directory for that plugin. If you do not yet have a plugin, start by using the ",(0,s.jsx)(n.a,{href:"/docs/getting-started/generators#plugin-generator",children:"Plugin Generator"})," to create one."]}),"\n",(0,s.jsx)(n.admonition,{title:"Use separate plugins for tools and widgets",type:"warning",children:(0,s.jsx)(n.p,{children:"If your existing plugin contains a custom tool, you may run into build issues. In this instance, we recommend having one plugin for your custom tool, and a second plugin for you custom custom widgets."})}),"\n",(0,s.jsxs)(n.p,{children:["In your plugin's root directory, use the ",(0,s.jsx)(n.a,{href:"/docs/getting-started/generators#widget-generator",children:"Widget Generator"})," to scaffold the widget."]}),"\n",(0,s.jsx)(n.p,{children:"Ensure your plugin has the correct directory structure:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"your-plugin/\n\u251C\u2500\u2500 LICENSE.txt\n\u251C\u2500\u2500 your-plugin.gemspec\n\u251C\u2500\u2500 package.json\n\u251C\u2500\u2500 plugin.txt\n\u251C\u2500\u2500 Rakefile\n\u251C\u2500\u2500 README.md\n\u251C\u2500\u2500 src/\n\u2502 \u2514\u2500\u2500 YourcustomWidget.vue\n\u2514\u2500\u2500 vite.config.js\n"})}),"\n",(0,s.jsx)(n.h2,{id:"step-2-declare-your-widget-in-plugintxt",children:"Step 2: Declare Your Widget in plugin.txt"}),"\n",(0,s.jsxs)(n.p,{children:["In your plugin's ",(0,s.jsx)(n.code,{children:"plugin.txt"})," file, declare each custom widget you want to create:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-ruby",children:"WIDGET YOURCUSTOM\n"})}),"\n",(0,s.jsx)(n.p,{children:"For example, in the COSMOS Demo plugin, two widgets are declared:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-ruby",children:"WIDGET BIG\nWIDGET HELLOWORLD\n"})}),"\n",(0,s.jsx)(n.h2,{id:"step-3-configure-your-build-process",children:"Step 3: Configure Your Build Process"}),"\n",(0,s.jsx)(n.h3,{id:"set-up-packagejson",children:"Set Up package.json"}),"\n",(0,s.jsxs)(n.p,{children:["Ensure your ",(0,s.jsx)(n.code,{children:"package.json"})," includes the necessary build script:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-json",children:'{\n "scripts": {\n "build": "vite build"\n },\n "dependencies": {\n "@openc3/vue-common": "latest"\n },\n "devDependencies": {\n "vite": "latest"\n }\n}\n'})}),"\n",(0,s.jsx)(n.h3,{id:"update-your-rakefile",children:"Update Your Rakefile"}),"\n",(0,s.jsxs)(n.p,{children:["Ensure your ",(0,s.jsx)(n.code,{children:"Rakefile"})," is configured to run the build script in its ",(0,s.jsx)(n.code,{children:":build"})," task:"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.em,{children:"(This should happen automatically if you use our code generators mentioned above.)"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-ruby",children:"task :build do\n # ...\n\n # Build the widget and gem using sh built into Rake:\n # https://rubydoc.info/gems/rake/FileUtils#sh-instance_method\n sh('pnpm', 'run', 'build')\n\n # ...\nend\n"})}),"\n",(0,s.jsx)(n.h2,{id:"step-4-create-your-widget-component",children:"Step 4: Create Your Widget Component"}),"\n",(0,s.jsxs)(n.p,{children:["If it doesn't exist already, create a Vue component file in the ",(0,s.jsx)(n.code,{children:"src"})," directory, following this naming convention: ",(0,s.jsx)(n.code,{children:"YourcustomWidget.vue"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:['For example, to create a widget called "HELLOWORLD", you would create ',(0,s.jsx)(n.code,{children:"HelloworldWidget.vue"}),":"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-html",children:'<template>\n \x3c!-- Your widget\'s HTML structure goes here --\x3e\n</template>\n\n<script>\n import { Widget } from "@openc3/vue-common/widgets";\n export default {\n mixins: [Widget],\n data() {\n return {\n // Reactive data items\n };\n },\n };\n<\/script>\n<style scoped>\n /* Widget-specific styles */\n</style>\n'})}),"\n",(0,s.jsx)(n.h2,{id:"step-5-develop-your-widget",children:"Step 5: Develop Your Widget"}),"\n",(0,s.jsx)(n.p,{children:"This is where you'll design the actual layout and functionality of your widget. Let's expand on this using the Helloworld Widget as an example:"}),"\n",(0,s.jsx)(n.h3,{id:"designing-your-widget-layout",children:"Designing Your Widget Layout"}),"\n",(0,s.jsxs)(n.p,{children:["In the ",(0,s.jsx)(n.code,{children:"<template>"})," section, you'll define your widget's visual structure. For a simple Hello World widget:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-html",children:'<template>\n <div class="hello-world-container">\n <h3>{{ greeting }}</h3>\n <p>This is a custom COSMOS widget</p>\n <v-btn @click="updateGreeting" color="primary"> Change Greeting </v-btn>\n </div>\n</template>\n'})}),"\n",(0,s.jsx)(n.admonition,{title:"Vue & Vuetify",type:"info",children:(0,s.jsxs)(n.p,{children:["For more information about how the COSMOS frontend is built (including all the Widgets) please check out ",(0,s.jsx)(n.a,{href:"https://vuejs.org",children:"Vue.js"})," and ",(0,s.jsx)(n.a,{href:"https://vuetifyjs.com",children:"Vuetify"}),"."]})}),"\n",(0,s.jsx)(n.h3,{id:"adding-widget-logic",children:"Adding Widget Logic"}),"\n",(0,s.jsxs)(n.p,{children:["In the ",(0,s.jsx)(n.code,{children:"<script>"})," section, define the behavior of your widget:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-html",children:'<script>\n import { Widget } from "@openc3/vue-common/widgets"; // Make sure you import Widget\n export default {\n mixins: [Widget], // Make sure you include Widget in the mixins here\n data() {\n return {\n greeting: "Hello, COSMOS!",\n greetings: ["Hello, COSMOS!", "Greetings, User!", "Welcome to COSMOS!"],\n };\n },\n methods: {\n updateGreeting() {\n // Cycle through different greetings\n const currentIndex = this.greetings.indexOf(this.greeting);\n const nextIndex = (currentIndex + 1) % this.greetings.length;\n this.greeting = this.greetings[nextIndex];\n },\n },\n };\n<\/script>\n'})}),"\n",(0,s.jsx)(n.h3,{id:"styling-your-widget",children:"Styling Your Widget"}),"\n",(0,s.jsxs)(n.p,{children:["Add custom styles in the ",(0,s.jsx)(n.code,{children:"<style>"})," section:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-html",children:"<style scoped>\n .hello-world-container {\n padding: 15px;\n border: 1px solid #ddd;\n border-radius: 4px;\n text-align: center;\n background-color: #f9f9f9;\n }\n</style>\n"})}),"\n",(0,s.jsx)(n.h2,{id:"step-6-configure-your-build-output",children:"Step 6: Configure Your Build Output"}),"\n",(0,s.jsxs)(n.p,{children:["Ensure your ",(0,s.jsx)(n.code,{children:"vite.config.js"})," file is configured to properly build your widgets:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-javascript",children:'import { defineConfig } from "vite";\nimport VitePluginStyleInject from "vite-plugin-style-inject";\nimport vue from "@vitejs/plugin-vue";\n\nconst DEFAULT_EXTENSIONS = [".mjs", ".js", ".ts", ".jsx", ".tsx", ".json"];\n\nexport default defineConfig({\n build: {\n outDir: "tools/widgets/YourcustomWidget",\n emptyOutDir: true,\n sourcemap: true,\n lib: {\n entry: "./src/YourcustomWidget.vue",\n name: "YourcustomWidget",\n fileName: (format, entryName) => `${entryName}.${format}.min.js`,\n formats: ["umd"],\n },\n rollupOptions: {\n external: ["vue", "vuetify"],\n },\n },\n plugins: [vue(), VitePluginStyleInject()],\n resolve: {\n extensions: [...DEFAULT_EXTENSIONS, ".vue"], // not recommended but saves us from having to change every SFC import\n },\n});\n'})}),"\n",(0,s.jsx)(n.h2,{id:"step-7-use-your-widget-in-a-screen-definition",children:"Step 7: Use Your Widget in a Screen Definition"}),"\n",(0,s.jsx)(n.p,{children:"Create a screen definition file in your target's screens directory:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-ruby",children:"SCREEN AUTO AUTO 0.5\nLABELVALUE <%= target_name %> HEALTH_STATUS CCSDSSEQCNT\nHELLOWORLD\n"})}),"\n",(0,s.jsx)(n.p,{children:"In this example, we're using the HELLOWORLD widget from the demo, which will result in a screen that looks like this:"}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Simple Screen",src:i(6560).A+"",width:"681",height:"210"})}),"\n",(0,s.jsxs)(n.p,{children:["The widget name follows the convention from ",(0,s.jsx)(n.code,{children:"plugin.txt"})," file. The screen definition for a screen that has only your custom widget created here, ensure your screen definition looks like this:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-ruby",children:"SCREEN AUTO AUTO 0.5\nYOURCUSTOM\n"})}),"\n",(0,s.jsx)(n.p,{children:"If your widget requires telemetry data, make sure you include the target and telemetry information:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-ruby",children:"YOURCUSTOM <%= target_name %> HEALTH_STATUS TEMP1\n"})}),"\n",(0,s.jsx)(n.h2,{id:"step-8-build-and-deploy-your-plugin",children:"Step 8: Build and Deploy Your Plugin"}),"\n",(0,s.jsxs)(n.p,{children:["In order to build a widget, a container containing ",(0,s.jsx)(n.code,{children:"node"})," and ",(0,s.jsx)(n.code,{children:"pnpm"})," is necessary."]}),"\n",(0,s.jsxs)(r,{groupId:"operating-system",children:[(0,s.jsx)(t,{value:"linux",label:"Linux / macOS",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"% docker run -it -v `pwd`:/openc3/local:z -w /openc3/local openc3inc/openc3-node sh\n/openc3/local $ pnpm install\n/openc3/local $ rake build\n"})})}),(0,s.jsx)(t,{value:"windows",label:"Windows",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"docker run -it -v %cd%:/openc3/local -w /openc3/local openc3inc/openc3-node sh\n/openc3/local $ pnpm install\n/openc3/local $ rake build\n"})})})]}),"\n",(0,s.jsx)(n.p,{children:"Notes:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["The ",(0,s.jsx)(n.code,{children:"openc3-node"})," container is currently missing the ",(0,s.jsx)(n.code,{children:"openc3"})," gem, so the gem validation will fail. This does not impact widget development."]}),"\n",(0,s.jsxs)(n.li,{children:["The ",(0,s.jsx)(n.code,{children:"openc3-node"})," container may need to be run as ",(0,s.jsx)(n.code,{children:"root"})," so that ",(0,s.jsx)(n.code,{children:"pnpm"})," has the permissions to create ",(0,s.jsx)(n.code,{children:"node_modules"})," in the host widget directory."]}),"\n",(0,s.jsxs)(n.li,{children:["If you are behind a firewall/proxy, the ",(0,s.jsx)(n.code,{children:"NODE_EXTRA_CA_CERTS"})," in the container may need to be set for ",(0,s.jsx)(n.code,{children:"pnpm"})," to work. The ",(0,s.jsx)(n.code,{children:"Error: self-signed certificate in certificate chain error"})," signifies the need for this env variable."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Now open Telemetry Viewer and select your screen to see your custom widget in action!"}),"\n",(0,s.jsx)(n.p,{children:"While this example is simple, the possibilities with custom widgets are limitless!"})]})}function a(e={}){let{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}function g(e,n){throw Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},6560:function(e,n,i){i.d(n,{A:()=>t});let t=i.p+"assets/images/simple_screen-e3de1ad836c0661d73a0ba970f991c64df8ecc7e23f9e944b6508a9a43fbc33c.png"},9796:function(e,n,i){i.d(n,{R:()=>r,x:()=>d});var t=i(6363);let s={},o=t.createContext(s);function r(e){let n=t.useContext(o);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([["5471"],{
|
|
1
|
+
"use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([["5471"],{4791:function(e,t,n){n.r(t),n.d(t,{default:()=>u});var a=n(7259);n(6363);var r=n(3526),s=n(2322),i=n(6822),c=n(8345);let o=[{title:"Easy to Configure",description:(0,a.jsx)(a.Fragment,{children:"OpenC3 COSMOS was designed from the ground up to be easy to configure. Simply define the messages needed to talk to your hardware (commands and telemetry), and you are ready to go!"})},{title:"Modern Architecture",description:(0,a.jsx)(a.Fragment,{children:"Built with a modern design, cloud native, and ready to scale. OpenC3 COSMOS has a microservice architecture built to scale, and with fully maintained and up-to-date dependencies."})},{title:"Pick Your Favorite Language",description:(0,a.jsx)(a.Fragment,{children:"OpenC3 COSMOS supports both Ruby and Python for scripting and connecting to targets. Frontend applications can be written in Vue, React, Angular, or Svelte. Whatever languages your team knows, we support."})}];function l({title:e,description:t}){return(0,a.jsx)("div",{className:(0,r.A)("col col--4"),children:(0,a.jsxs)("div",{className:"text--center padding-horiz--md",children:[(0,a.jsx)("h3",{children:e}),(0,a.jsx)("p",{children:t})]})})}function d(){return(0,a.jsx)("section",{className:"features_t9lD",children:(0,a.jsx)("div",{className:"container",children:(0,a.jsx)("div",{className:"row",children:o.map((e,t)=>(0,a.jsx)(l,{...e},t))})})})}function h(){let{siteConfig:e}=(0,i.A)();return(0,a.jsx)("header",{className:(0,r.A)("hero hero--primary","heroBanner_qdFl"),children:(0,a.jsxs)("div",{className:"container",children:[(0,a.jsx)("img",{src:`${e.baseUrl}img/black_logo.svg`,width:"400px",alt:"OpenC3"}),(0,a.jsx)("h1",{className:"hero__title",children:e.title}),(0,a.jsx)("p",{className:"hero__subtitle",children:e.tagline}),(0,a.jsx)("div",{className:"buttons_AeoN",children:(0,a.jsx)(s.A,{className:"button button--secondary button--lg",to:"/docs/getting-started",children:"Get Started"})})]})})}function u(){let{siteConfig:e}=(0,i.A)();return(0,a.jsxs)(c.A,{title:`Hello from ${e.title}`,description:"Description will go into a meta tag in <head />",children:[(0,a.jsx)(h,{}),(0,a.jsx)("main",{children:(0,a.jsx)(d,{})})]})}}}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([["9958"],{8853:function(e,o,t){t.r(o),t.d(o,{frontMatter:()=>s,toc:()=>l,default:()=>u,metadata:()=>i,assets:()=>c,contentTitle:()=>a});var i=JSON.parse('{"id":"privacy","title":"OpenC3, Inc. Privacy Policy","description":"OpenC3 Inc. is strongly committed to protecting your privacy and complying with your choices. Both personal and non-personal information collected is safeguarded according to the highest privacy and data protection standards adopted worldwide. We have always had a robust and effective data protection program in place which complies with existing law and abides by the data protection principles. However, we recognise our obligations in updating and expanding this program to meet the demands of the GDPR.","source":"@site/docs/privacy.md","sourceDirName":".","slug":"/privacy","permalink":"/tools/staticdocs/docs/privacy","draft":false,"unlisted":false,"editUrl":"https://github.com/OpenC3/cosmos/tree/main/docs.openc3.com/docs/privacy.md","tags":[],"version":"current","frontMatter":{"title":"OpenC3, Inc. Privacy Policy"},"sidebar":"defaultSidebar","previous":{"title":"XTCE Support","permalink":"/tools/staticdocs/docs/meta/xtce"}}'),n=t(7259),r=t(5511);let s={title:"OpenC3, Inc. Privacy Policy"},a,c={},l=[{value:"Our Commitment",id:"our-commitment",level:2},{value:"1. Notice",id:"1-notice",level:2},{value:"2. Usage",id:"2-usage",level:2},{value:"3. Consent",id:"3-consent",level:2},{value:"4. Access to your information",id:"4-access-to-your-information",level:2},{value:"5. Security of information",id:"5-security-of-information",level:2},{value:"6. Retention of information",id:"6-retention-of-information",level:2},{value:"7. EU and EEA Users\u2019 Rights",id:"7-eu-and-eea-users-rights",level:2},{value:"8. What we do with the Information you share",id:"8-what-we-do-with-the-information-you-share",level:2},{value:"9. How to opt-out",id:"9-how-to-opt-out",level:2},{value:"10. Does OpenC3 Inc's privacy policy apply to linked websites?",id:"10-does-openc3-incs-privacy-policy-apply-to-linked-websites",level:2},{value:"11. Changes to this policy",id:"11-changes-to-this-policy",level:2},{value:"12. Enforcement of policy",id:"12-enforcement-of-policy",level:2},{value:"13. Questions or comments",id:"13-questions-or-comments",level:2}];function d(e){let o={a:"a",h2:"h2",p:"p",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.p,{children:"OpenC3 Inc. is strongly committed to protecting your privacy and complying with your choices. Both personal and non-personal information collected is safeguarded according to the highest privacy and data protection standards adopted worldwide. We have always had a robust and effective data protection program in place which complies with existing law and abides by the data protection principles. However, we recognise our obligations in updating and expanding this program to meet the demands of the GDPR."}),"\n",(0,n.jsx)(o.h2,{id:"our-commitment",children:"Our Commitment"}),"\n",(0,n.jsx)(o.p,{children:"\u2022 Your information will not be shared, rented or sold to any third party.\n\u2022 We use state-of-the-art security measures to protect your information from unauthorized users.\n\u2022 We give you the possibility to control the information that you shared with us (opt-out)"}),"\n",(0,n.jsx)(o.p,{children:"OpenC3, Inc. is committed to processing data in accordance with its responsibilities under the GDPR.\nArticle 5 of the GDPR requires that personal data shall be:"}),"\n",(0,n.jsx)(o.p,{children:"a. processed lawfully, fairly and in a transparent manner in relation to individuals;"}),"\n",(0,n.jsx)(o.p,{children:"b. collected for specified, explicit and legitimate purposes and not further processed in a manner that is incompatible with those purposes; further processing for archiving purposes in the public interest, scientific or historical research purposes or statistical purposes shall not be considered to be incompatible with the initial purposes;"}),"\n",(0,n.jsx)(o.p,{children:"c. adequate, relevant and limited to what is necessary in relation to the purposes for which they are processed;"}),"\n",(0,n.jsx)(o.p,{children:"d. accurate and, where necessary, kept up to date; every reasonable step must be taken to ensure that personal data that are inaccurate, having regard to the purposes for which they are processed, are erased or rectified without delay;"}),"\n",(0,n.jsx)(o.p,{children:"e. kept in a form which permits identification of data subjects for no longer than is necessary for the purposes for which the personal data are processed; personal data may be stored for longer periods insofar as the personal data will be processed solely for archiving purposes in the public interest, scientific or historical research purposes or statistical purposes subject to implementation of the appropriate technical and organisational measures required by the GDPR in order to safeguard the rights and freedoms of individuals; and"}),"\n",(0,n.jsx)(o.p,{children:"f. processed in a manner that ensures appropriate security of the personal data, including protection against unauthorised or unlawful processing and against accidental loss, destruction or damage, using appropriate technical or organisational measures.\u201D"}),"\n",(0,n.jsx)(o.h2,{id:"1-notice",children:"1. Notice"}),"\n",(0,n.jsx)(o.p,{children:'We will clearly inform you when information that personally identifies you ("personal information") is asked for and you will have the choice to provide it or not. Generally, this information is requested when you subscribe to product updates, newsletters or other online services.'}),"\n",(0,n.jsx)(o.h2,{id:"2-usage",children:"2. Usage"}),"\n",(0,n.jsx)(o.p,{children:"We use your personal information for the following purposes:\n\u2022 To provide you information that will allow you to use our services\n\u2022 To automatically customize your documents with your information\n\u2022 To alert you of software upgrades, updates, discounts or other services from OpenC3, Inc."}),"\n",(0,n.jsx)(o.p,{children:"We collect your email when you subscribe to our services or newsletter in order to send you informational communications about OpenC3 Inc's products, such as their purpose and the best use you can make of them. We also collect your email to send you our promotional offers."}),"\n",(0,n.jsx)(o.p,{children:"We may also collect your name, language, currency, operating system, document searched and country information for a better experience with our products/services."}),"\n",(0,n.jsx)(o.p,{children:"When you place your order with us, we collect your email in order to communicate with you. We also collect your phone number in order to contact you in case these emails bounce back because of a typo in your email address and if we cannot figure out what the correct email address is."}),"\n",(0,n.jsx)(o.p,{children:"We also contact the phone number that is provided if we suspect that the cardholder\u2019s credit card information has been compromised, i.e used in a fraudulent way."}),"\n",(0,n.jsx)(o.p,{children:"We also use our clients\u2019 email in order to notify of the release of updated versions of the software, new services or promotional offers."}),"\n",(0,n.jsx)(o.h2,{id:"3-consent",children:"3. Consent"}),"\n",(0,n.jsx)(o.p,{children:"When you provide your personal information, you consent that it can be used for the above purposes and that OpenC3, Inc. is an authorized holder of such information. If you choose not to register or provide personal information, you can still use our website but you will not be able to receive additional services or access certain areas that require registration. When you activate your account, you are providing your consent to occasionally receive information from us. In each communication from us you will have the opportunity to unsubscribe from further communications; alternatively, you may contact us to express your choices at the address provided at the bottom of this page."}),"\n",(0,n.jsx)(o.h2,{id:"4-access-to-your-information",children:"4. Access to your information"}),"\n",(0,n.jsx)(o.p,{children:"You are entitled to review the personal information you have provided us and ensure that it is accurate and current at all times. To review or update this information simply request that we send you this information."}),"\n",(0,n.jsx)(o.h2,{id:"5-security-of-information",children:"5. Security of information"}),"\n",(0,n.jsx)(o.p,{children:"OpenC3, Inc. is strongly committed to protecting your information and ensuring that your choices are honored. We have taken strong security measures to protect your data from loss, misuse, unauthorized access, disclosure, alteration, or destruction. All sensitive data is stored behind multiple firewalls on secure servers with restricted employee access."}),"\n",(0,n.jsx)(o.p,{children:"We guarantee that all e-commerce transactions follow the latest security measures and use the best available technologies. Secure Sockets Layer (SSL) technology is employed when you place online orders or transmit sensitive information. SSL is one of the safest methods of passing information over the Internet."}),"\n",(0,n.jsx)(o.h2,{id:"6-retention-of-information",children:"6. Retention of information"}),"\n",(0,n.jsx)(o.p,{children:"We retain information as long as it is necessary to provide the services requested by you and others, subject to any legal obligations to further retain such information. Information associated with your account will generally be kept until it is no longer necessary to provide the services or until you ask us to delete it or your account is deleted whichever comes first. Additionally, we may retain information from deleted accounts to comply with the law, prevent fraud, resolve disputes, troubleshoot problems, assist with investigations, enforce the Terms of Use, and take other actions permitted by law. The information we retain will be handled in accordance with this Privacy Policy. Finally, your data could also be stored for sales statistical purposes."}),"\n",(0,n.jsx)(o.h2,{id:"7-eu-and-eea-users-rights",children:"7. EU and EEA Users\u2019 Rights"}),"\n",(0,n.jsx)(o.p,{children:"If you are habitually located in the European Union or European Economic Area, you have the right to access, rectify, download or erase your information, as well as the right to restrict and object to certain processing of your information. While some of these rights apply generally, certain rights apply only in certain limited circumstances. We describe these rights below:"}),"\n",(0,n.jsx)(o.p,{children:"You have the right to access your personal data and, if necessary, have it amended or deleted or restricted. In certain instances, you may have the right to the portability of your data. You can also ask us to not send marketing communications and not to use your personal data when we carry out profiling for direct marketing purposes. You can opt out of receiving email newsletters and other marketing communications by following the opt-out instructions provided to you in those emails. Transactional account messages will be unaffected if you opt-out from marketing communications."}),"\n",(0,n.jsx)(o.h2,{id:"8-what-we-do-with-the-information-you-share",children:"8. What we do with the Information you share"}),"\n",(0,n.jsx)(o.p,{children:"Your information is never shared outside the company without your permission. Inside the company, data is stored behind multiple firewalls on secure servers with restricted user access."}),"\n",(0,n.jsx)(o.p,{children:"When you register to our website, you are asked to provide your contact information, including a valid email address. We use this information to send you updates about order confirmations and information about our services. When you order from us, we ask for your credit card number and billing address. We use this information only to bill you for the product(s) you ordered at that time."}),"\n",(0,n.jsx)(o.p,{children:"We may on occasion require the help of other companies to provide limited services on our behalf, such as packaging, shipping and delivery, customer support and processing event registrations. We will only provide such companies with the information required for them to perform these services; these service providers are bound by strict privacy policies and are prohibited from using your information for any other purpose."}),"\n",(0,n.jsx)(o.p,{children:"In very rare instances OpenC3, Inc. may disclose your personal information, without notice, only if required to do so by law or in the good faith belief that such action is necessary to: (a) conform to the edicts of the law or comply with legal process served on OpenC3, Inc. or the site; (b) protect and defend the rights or property of OpenC3, Inc. and its family of websites and properties; and (c) act in urgent circumstances to protect the personal safety of users of OpenC3, Inc., its websites, or the public."}),"\n",(0,n.jsx)(o.h2,{id:"9-how-to-opt-out",children:"9. How to opt-out"}),"\n",(0,n.jsx)(o.p,{children:"We provide users with the opportunity to opt-out from receiving updates on our products, newsletters and other communications from us. You can opt-out by clicking on the link provided in our electronic mailings or by contacting us at the address at the bottom of this page."}),"\n",(0,n.jsx)(o.h2,{id:"10-does-openc3-incs-privacy-policy-apply-to-linked-websites",children:"10. Does OpenC3 Inc's privacy policy apply to linked websites?"}),"\n",(0,n.jsx)(o.p,{children:"Our Privacy Policy applies solely to information collected on our website or through interactions with our company.\nThe Site contains links to web sites of third parties. OpenC3, Inc. is not responsible for the actions of these third parties, including their privacy practices and any content posted on their web sites. We encourage you to review their privacy policies to learn more about what, why and how they collect and use personal information. OpenC3, Inc. adheres to industry recognized standards to secure any personal information in our possession, and to secure it from unauthorized access and tampering."}),"\n",(0,n.jsx)(o.p,{children:"However, as is true with all online actions, it is possible that third parties may unlawfully intercept transmissions of personal information, or other users of the Site may misuse or abuse your personal information that they may collect from the Site."}),"\n",(0,n.jsx)(o.h2,{id:"11-changes-to-this-policy",children:"11. Changes to this policy"}),"\n",(0,n.jsx)(o.p,{children:"If we make changes to our Privacy Policy, we will post these changes here so that you are always aware of what information we collect, how we use it and under what circumstances, if any, we disclose it. If at any point we decide to use your information in a manner different from that stated at the time it was collected, we will notify you by email."}),"\n",(0,n.jsx)(o.h2,{id:"12-enforcement-of-policy",children:"12. Enforcement of policy"}),"\n",(0,n.jsx)(o.p,{children:"If for some reason you believe OpenC3, Inc. has not adhered to these principles, please notify us and we will do our best to promptly make corrections."}),"\n",(0,n.jsx)(o.h2,{id:"13-questions-or-comments",children:"13. Questions or comments"}),"\n",(0,n.jsxs)(o.p,{children:["If you have questions or comments about this privacy policy, please email us at: ",(0,n.jsx)(o.a,{href:"mailto:support@openc3.com",children:"support@openc3.com"})]}),"\n",(0,n.jsx)(o.p,{children:"For additional information about how to contact OpenC3, Inc. please visit our help page."}),"\n",(0,n.jsx)(o.p,{children:"Dated: August 11th, 2022"})]})}function u(e={}){let{wrapper:o}={...(0,r.R)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},5511:function(e,o,t){t.d(o,{R:()=>s,x:()=>a});var i=t(6363);let n={},r=i.createContext(n);function s(e){let o=i.useContext(r);return i.useMemo(function(){return"function"==typeof e?e(o):{...o,...e}},[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:s(e.components),i.createElement(r.Provider,{value:o},e.children)}}}]);
|
|
1
|
+
"use strict";(self.webpackChunkdocs_openc3_com=self.webpackChunkdocs_openc3_com||[]).push([["9958"],{5100:function(e,o,t){t.r(o),t.d(o,{metadata:()=>i,default:()=>u,frontMatter:()=>s,contentTitle:()=>a,toc:()=>l,assets:()=>c});var i=JSON.parse('{"id":"privacy","title":"OpenC3, Inc. Privacy Policy","description":"OpenC3 Inc. is strongly committed to protecting your privacy and complying with your choices. Both personal and non-personal information collected is safeguarded according to the highest privacy and data protection standards adopted worldwide. We have always had a robust and effective data protection program in place which complies with existing law and abides by the data protection principles. However, we recognise our obligations in updating and expanding this program to meet the demands of the GDPR.","source":"@site/docs/privacy.md","sourceDirName":".","slug":"/privacy","permalink":"/tools/staticdocs/docs/privacy","draft":false,"unlisted":false,"editUrl":"https://github.com/OpenC3/cosmos/tree/main/docs.openc3.com/docs/privacy.md","tags":[],"version":"current","frontMatter":{"title":"OpenC3, Inc. Privacy Policy"},"sidebar":"defaultSidebar","previous":{"title":"XTCE Support","permalink":"/tools/staticdocs/docs/meta/xtce"}}'),n=t(7259),r=t(9796);let s={title:"OpenC3, Inc. Privacy Policy"},a,c={},l=[{value:"Our Commitment",id:"our-commitment",level:2},{value:"1. Notice",id:"1-notice",level:2},{value:"2. Usage",id:"2-usage",level:2},{value:"3. Consent",id:"3-consent",level:2},{value:"4. Access to your information",id:"4-access-to-your-information",level:2},{value:"5. Security of information",id:"5-security-of-information",level:2},{value:"6. Retention of information",id:"6-retention-of-information",level:2},{value:"7. EU and EEA Users\u2019 Rights",id:"7-eu-and-eea-users-rights",level:2},{value:"8. What we do with the Information you share",id:"8-what-we-do-with-the-information-you-share",level:2},{value:"9. How to opt-out",id:"9-how-to-opt-out",level:2},{value:"10. Does OpenC3 Inc's privacy policy apply to linked websites?",id:"10-does-openc3-incs-privacy-policy-apply-to-linked-websites",level:2},{value:"11. Changes to this policy",id:"11-changes-to-this-policy",level:2},{value:"12. Enforcement of policy",id:"12-enforcement-of-policy",level:2},{value:"13. Questions or comments",id:"13-questions-or-comments",level:2}];function d(e){let o={a:"a",h2:"h2",p:"p",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.p,{children:"OpenC3 Inc. is strongly committed to protecting your privacy and complying with your choices. Both personal and non-personal information collected is safeguarded according to the highest privacy and data protection standards adopted worldwide. We have always had a robust and effective data protection program in place which complies with existing law and abides by the data protection principles. However, we recognise our obligations in updating and expanding this program to meet the demands of the GDPR."}),"\n",(0,n.jsx)(o.h2,{id:"our-commitment",children:"Our Commitment"}),"\n",(0,n.jsx)(o.p,{children:"\u2022 Your information will not be shared, rented or sold to any third party.\n\u2022 We use state-of-the-art security measures to protect your information from unauthorized users.\n\u2022 We give you the possibility to control the information that you shared with us (opt-out)"}),"\n",(0,n.jsx)(o.p,{children:"OpenC3, Inc. is committed to processing data in accordance with its responsibilities under the GDPR.\nArticle 5 of the GDPR requires that personal data shall be:"}),"\n",(0,n.jsx)(o.p,{children:"a. processed lawfully, fairly and in a transparent manner in relation to individuals;"}),"\n",(0,n.jsx)(o.p,{children:"b. collected for specified, explicit and legitimate purposes and not further processed in a manner that is incompatible with those purposes; further processing for archiving purposes in the public interest, scientific or historical research purposes or statistical purposes shall not be considered to be incompatible with the initial purposes;"}),"\n",(0,n.jsx)(o.p,{children:"c. adequate, relevant and limited to what is necessary in relation to the purposes for which they are processed;"}),"\n",(0,n.jsx)(o.p,{children:"d. accurate and, where necessary, kept up to date; every reasonable step must be taken to ensure that personal data that are inaccurate, having regard to the purposes for which they are processed, are erased or rectified without delay;"}),"\n",(0,n.jsx)(o.p,{children:"e. kept in a form which permits identification of data subjects for no longer than is necessary for the purposes for which the personal data are processed; personal data may be stored for longer periods insofar as the personal data will be processed solely for archiving purposes in the public interest, scientific or historical research purposes or statistical purposes subject to implementation of the appropriate technical and organisational measures required by the GDPR in order to safeguard the rights and freedoms of individuals; and"}),"\n",(0,n.jsx)(o.p,{children:"f. processed in a manner that ensures appropriate security of the personal data, including protection against unauthorised or unlawful processing and against accidental loss, destruction or damage, using appropriate technical or organisational measures.\u201D"}),"\n",(0,n.jsx)(o.h2,{id:"1-notice",children:"1. Notice"}),"\n",(0,n.jsx)(o.p,{children:'We will clearly inform you when information that personally identifies you ("personal information") is asked for and you will have the choice to provide it or not. Generally, this information is requested when you subscribe to product updates, newsletters or other online services.'}),"\n",(0,n.jsx)(o.h2,{id:"2-usage",children:"2. Usage"}),"\n",(0,n.jsx)(o.p,{children:"We use your personal information for the following purposes:\n\u2022 To provide you information that will allow you to use our services\n\u2022 To automatically customize your documents with your information\n\u2022 To alert you of software upgrades, updates, discounts or other services from OpenC3, Inc."}),"\n",(0,n.jsx)(o.p,{children:"We collect your email when you subscribe to our services or newsletter in order to send you informational communications about OpenC3 Inc's products, such as their purpose and the best use you can make of them. We also collect your email to send you our promotional offers."}),"\n",(0,n.jsx)(o.p,{children:"We may also collect your name, language, currency, operating system, document searched and country information for a better experience with our products/services."}),"\n",(0,n.jsx)(o.p,{children:"When you place your order with us, we collect your email in order to communicate with you. We also collect your phone number in order to contact you in case these emails bounce back because of a typo in your email address and if we cannot figure out what the correct email address is."}),"\n",(0,n.jsx)(o.p,{children:"We also contact the phone number that is provided if we suspect that the cardholder\u2019s credit card information has been compromised, i.e used in a fraudulent way."}),"\n",(0,n.jsx)(o.p,{children:"We also use our clients\u2019 email in order to notify of the release of updated versions of the software, new services or promotional offers."}),"\n",(0,n.jsx)(o.h2,{id:"3-consent",children:"3. Consent"}),"\n",(0,n.jsx)(o.p,{children:"When you provide your personal information, you consent that it can be used for the above purposes and that OpenC3, Inc. is an authorized holder of such information. If you choose not to register or provide personal information, you can still use our website but you will not be able to receive additional services or access certain areas that require registration. When you activate your account, you are providing your consent to occasionally receive information from us. In each communication from us you will have the opportunity to unsubscribe from further communications; alternatively, you may contact us to express your choices at the address provided at the bottom of this page."}),"\n",(0,n.jsx)(o.h2,{id:"4-access-to-your-information",children:"4. Access to your information"}),"\n",(0,n.jsx)(o.p,{children:"You are entitled to review the personal information you have provided us and ensure that it is accurate and current at all times. To review or update this information simply request that we send you this information."}),"\n",(0,n.jsx)(o.h2,{id:"5-security-of-information",children:"5. Security of information"}),"\n",(0,n.jsx)(o.p,{children:"OpenC3, Inc. is strongly committed to protecting your information and ensuring that your choices are honored. We have taken strong security measures to protect your data from loss, misuse, unauthorized access, disclosure, alteration, or destruction. All sensitive data is stored behind multiple firewalls on secure servers with restricted employee access."}),"\n",(0,n.jsx)(o.p,{children:"We guarantee that all e-commerce transactions follow the latest security measures and use the best available technologies. Secure Sockets Layer (SSL) technology is employed when you place online orders or transmit sensitive information. SSL is one of the safest methods of passing information over the Internet."}),"\n",(0,n.jsx)(o.h2,{id:"6-retention-of-information",children:"6. Retention of information"}),"\n",(0,n.jsx)(o.p,{children:"We retain information as long as it is necessary to provide the services requested by you and others, subject to any legal obligations to further retain such information. Information associated with your account will generally be kept until it is no longer necessary to provide the services or until you ask us to delete it or your account is deleted whichever comes first. Additionally, we may retain information from deleted accounts to comply with the law, prevent fraud, resolve disputes, troubleshoot problems, assist with investigations, enforce the Terms of Use, and take other actions permitted by law. The information we retain will be handled in accordance with this Privacy Policy. Finally, your data could also be stored for sales statistical purposes."}),"\n",(0,n.jsx)(o.h2,{id:"7-eu-and-eea-users-rights",children:"7. EU and EEA Users\u2019 Rights"}),"\n",(0,n.jsx)(o.p,{children:"If you are habitually located in the European Union or European Economic Area, you have the right to access, rectify, download or erase your information, as well as the right to restrict and object to certain processing of your information. While some of these rights apply generally, certain rights apply only in certain limited circumstances. We describe these rights below:"}),"\n",(0,n.jsx)(o.p,{children:"You have the right to access your personal data and, if necessary, have it amended or deleted or restricted. In certain instances, you may have the right to the portability of your data. You can also ask us to not send marketing communications and not to use your personal data when we carry out profiling for direct marketing purposes. You can opt out of receiving email newsletters and other marketing communications by following the opt-out instructions provided to you in those emails. Transactional account messages will be unaffected if you opt-out from marketing communications."}),"\n",(0,n.jsx)(o.h2,{id:"8-what-we-do-with-the-information-you-share",children:"8. What we do with the Information you share"}),"\n",(0,n.jsx)(o.p,{children:"Your information is never shared outside the company without your permission. Inside the company, data is stored behind multiple firewalls on secure servers with restricted user access."}),"\n",(0,n.jsx)(o.p,{children:"When you register to our website, you are asked to provide your contact information, including a valid email address. We use this information to send you updates about order confirmations and information about our services. When you order from us, we ask for your credit card number and billing address. We use this information only to bill you for the product(s) you ordered at that time."}),"\n",(0,n.jsx)(o.p,{children:"We may on occasion require the help of other companies to provide limited services on our behalf, such as packaging, shipping and delivery, customer support and processing event registrations. We will only provide such companies with the information required for them to perform these services; these service providers are bound by strict privacy policies and are prohibited from using your information for any other purpose."}),"\n",(0,n.jsx)(o.p,{children:"In very rare instances OpenC3, Inc. may disclose your personal information, without notice, only if required to do so by law or in the good faith belief that such action is necessary to: (a) conform to the edicts of the law or comply with legal process served on OpenC3, Inc. or the site; (b) protect and defend the rights or property of OpenC3, Inc. and its family of websites and properties; and (c) act in urgent circumstances to protect the personal safety of users of OpenC3, Inc., its websites, or the public."}),"\n",(0,n.jsx)(o.h2,{id:"9-how-to-opt-out",children:"9. How to opt-out"}),"\n",(0,n.jsx)(o.p,{children:"We provide users with the opportunity to opt-out from receiving updates on our products, newsletters and other communications from us. You can opt-out by clicking on the link provided in our electronic mailings or by contacting us at the address at the bottom of this page."}),"\n",(0,n.jsx)(o.h2,{id:"10-does-openc3-incs-privacy-policy-apply-to-linked-websites",children:"10. Does OpenC3 Inc's privacy policy apply to linked websites?"}),"\n",(0,n.jsx)(o.p,{children:"Our Privacy Policy applies solely to information collected on our website or through interactions with our company.\nThe Site contains links to web sites of third parties. OpenC3, Inc. is not responsible for the actions of these third parties, including their privacy practices and any content posted on their web sites. We encourage you to review their privacy policies to learn more about what, why and how they collect and use personal information. OpenC3, Inc. adheres to industry recognized standards to secure any personal information in our possession, and to secure it from unauthorized access and tampering."}),"\n",(0,n.jsx)(o.p,{children:"However, as is true with all online actions, it is possible that third parties may unlawfully intercept transmissions of personal information, or other users of the Site may misuse or abuse your personal information that they may collect from the Site."}),"\n",(0,n.jsx)(o.h2,{id:"11-changes-to-this-policy",children:"11. Changes to this policy"}),"\n",(0,n.jsx)(o.p,{children:"If we make changes to our Privacy Policy, we will post these changes here so that you are always aware of what information we collect, how we use it and under what circumstances, if any, we disclose it. If at any point we decide to use your information in a manner different from that stated at the time it was collected, we will notify you by email."}),"\n",(0,n.jsx)(o.h2,{id:"12-enforcement-of-policy",children:"12. Enforcement of policy"}),"\n",(0,n.jsx)(o.p,{children:"If for some reason you believe OpenC3, Inc. has not adhered to these principles, please notify us and we will do our best to promptly make corrections."}),"\n",(0,n.jsx)(o.h2,{id:"13-questions-or-comments",children:"13. Questions or comments"}),"\n",(0,n.jsxs)(o.p,{children:["If you have questions or comments about this privacy policy, please email us at: ",(0,n.jsx)(o.a,{href:"mailto:support@openc3.com",children:"support@openc3.com"})]}),"\n",(0,n.jsx)(o.p,{children:"For additional information about how to contact OpenC3, Inc. please visit our help page."}),"\n",(0,n.jsx)(o.p,{children:"Dated: August 11th, 2022"})]})}function u(e={}){let{wrapper:o}={...(0,r.R)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},9796:function(e,o,t){t.d(o,{R:()=>s,x:()=>a});var i=t(6363);let n={},r=i.createContext(n);function s(e){let o=i.useContext(r);return i.useMemo(function(){return"function"==typeof e?e(o):{...o,...e}},[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:s(e.components),i.createElement(r.Provider,{value:o},e.children)}}}]);
|