├── .github ├── PULL_REQUEST_TEMPLATE.md └── workflows │ ├── comment_pr.yml │ └── receive_pr.yml ├── .gitignore ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── FAQ.md ├── LICENSE ├── LICENSE-SAMPLECODE ├── LICENSE-SUMMARY ├── README.md └── src ├── Dockerfile ├── README.md ├── docker_assets ├── config.go ├── convert.go └── plantuml ├── hugo ├── config.toml ├── content │ ├── en-us │ │ ├── _footer.md │ │ ├── _header.md │ │ ├── _index.md │ │ ├── about │ │ │ └── _index.md │ │ ├── best_practices │ │ │ ├── _index.md │ │ │ └── aws │ │ │ │ ├── _index.md │ │ │ │ └── data_ingest │ │ │ │ └── _index.md │ │ ├── bot.md │ │ ├── contribute │ │ │ ├── _index.md │ │ │ ├── kitchen_sink │ │ │ │ └── _index.md │ │ │ └── templates │ │ │ │ ├── _index.md │ │ │ │ ├── implementation.md │ │ │ │ └── pattern.md │ │ ├── glossary │ │ │ ├── _index.md │ │ │ ├── personae.md │ │ │ └── vocabulary.md │ │ ├── implementations │ │ │ ├── _index.md │ │ │ └── aws │ │ │ │ ├── _index.md │ │ │ │ ├── command │ │ │ │ ├── _index.md │ │ │ │ ├── command1 │ │ │ │ │ ├── _index.md │ │ │ │ │ └── architecture.svg │ │ │ │ └── command2 │ │ │ │ │ ├── _index.md │ │ │ │ │ ├── architecture1.svg │ │ │ │ │ └── architecture2.svg │ │ │ │ ├── device_bootstrap │ │ │ │ ├── _index.md │ │ │ │ ├── aws-iot-certificate-vending-machine │ │ │ │ │ ├── _index.md │ │ │ │ │ ├── aws-iot-cvm-architecture.png │ │ │ │ │ └── aws-iot-cvm-flow-diagram.png │ │ │ │ └── fleet_provisioning_trusted_user │ │ │ │ │ ├── _index.md │ │ │ │ │ ├── fp_by_trasted_user_flow.png │ │ │ │ │ ├── home-page.png │ │ │ │ │ ├── iot-cognito.svg │ │ │ │ │ └── sign-in.png │ │ │ │ ├── device_state_replica │ │ │ │ ├── _index.md │ │ │ │ └── device_state_replica1 │ │ │ │ │ ├── _index.md │ │ │ │ │ └── device_shadow.png │ │ │ │ ├── software_update │ │ │ │ ├── IoT_Jobs │ │ │ │ │ ├── IoT_Jobs_Ref_Diagram.png │ │ │ │ │ └── _index.md │ │ │ │ └── _index.md │ │ │ │ ├── telemetry │ │ │ │ ├── _index.md │ │ │ │ └── fan-in1 │ │ │ │ │ ├── _index.md │ │ │ │ │ └── architecture.svg │ │ │ │ └── telemetry_archiving │ │ │ │ ├── _index.md │ │ │ │ └── iot_analytics1 │ │ │ │ ├── .gitignore │ │ │ │ ├── _index.md │ │ │ │ ├── architecture.svg │ │ │ │ └── raw_sensor_data_analysis.png │ │ └── patterns │ │ │ ├── MVC │ │ │ ├── DeviceUML.png │ │ │ ├── MVC-UML.png │ │ │ ├── PracMVC.png │ │ │ └── _index.md │ │ │ ├── _index.md │ │ │ ├── command │ │ │ ├── _index.md │ │ │ └── command.png │ │ │ ├── device_bootstrap │ │ │ ├── _index.md │ │ │ └── bootstrap.png │ │ │ ├── device_state_replica │ │ │ ├── _index.md │ │ │ ├── c2d-state.png │ │ │ └── d2c-state.png │ │ │ ├── gateway │ │ │ ├── _index.md │ │ │ ├── algorithms.png │ │ │ └── gateway.png │ │ │ ├── iot-atlas-patterns.pptx │ │ │ ├── protocol-translation │ │ │ ├── IIoT-Extraction-Architecture.png │ │ │ ├── ProtocolTranslation.png │ │ │ └── _index.md │ │ │ ├── software_update │ │ │ ├── _index.md │ │ │ └── software-update.png │ │ │ ├── telemetry │ │ │ ├── _index.md │ │ │ └── telemetry.png │ │ │ └── telemetry_archiving │ │ │ ├── _index.md │ │ │ └── archiving.png │ ├── fr-fr │ │ ├── _footer.md │ │ ├── _header.md │ │ ├── _index.md │ │ ├── about │ │ │ └── _index.md │ │ ├── designs │ │ │ ├── _index.md │ │ │ ├── command │ │ │ │ ├── _index.md │ │ │ │ └── command.png │ │ │ ├── device_bootstrap │ │ │ │ ├── _index.md │ │ │ │ └── bootstrap.png │ │ │ ├── device_state_replica │ │ │ │ ├── _index.md │ │ │ │ ├── c2d-state.png │ │ │ │ └── d2c-state.png │ │ │ ├── gateway │ │ │ │ ├── _index.md │ │ │ │ ├── algorithms.png │ │ │ │ └── gateway.png │ │ │ ├── iot-atlas-patterns.pptx │ │ │ ├── protocol-translation │ │ │ │ ├── IIoT-Extraction-Architecture.png │ │ │ │ ├── ProtocolTranslation.png │ │ │ │ └── _index.md │ │ │ ├── software_update │ │ │ │ ├── _index.md │ │ │ │ └── software-update.png │ │ │ ├── telemetry │ │ │ │ ├── _index.md │ │ │ │ └── telemetry.png │ │ │ └── telemetry_archiving │ │ │ │ ├── _index.md │ │ │ │ └── archiving.png │ │ └── glossary │ │ │ ├── _index.md │ │ │ ├── personae.md │ │ │ └── vocabulary.md │ └── zh-cn │ │ ├── _footer.md │ │ ├── _header.md │ │ ├── _index.md │ │ ├── about │ │ └── _index.md │ │ ├── designs │ │ ├── _index.md │ │ ├── command │ │ │ └── _index.md │ │ ├── device_bootstrap │ │ │ └── _index.md │ │ ├── device_state_replica │ │ │ └── _index.md │ │ ├── gateway │ │ │ └── _index.md │ │ ├── software_update │ │ │ └── _index.md │ │ ├── telemetry │ │ │ └── _index.md │ │ └── telemetry_archiving │ │ │ └── _index.md │ │ └── glossary │ │ ├── _index.md │ │ ├── personae.md │ │ └── vocabulary.md ├── layouts │ ├── partials │ │ ├── custom-footer.html │ │ ├── custom-header.html │ │ ├── logo.html │ │ ├── menu-footer.html │ │ └── seo-schema.html │ └── shortcodes │ │ ├── atlas-logo.html │ │ ├── center.html │ │ ├── synopsis-archiving.html │ │ ├── synopsis-bootstrap.html │ │ ├── synopsis-gateway.html │ │ ├── synopsis-protocol-translation.html │ │ ├── synopsis-software-update.html │ │ └── synopsis-telemetry.html ├── static │ ├── css │ │ └── theme-atlas.css │ ├── images │ │ ├── favicon.ico │ │ ├── favicon.png │ │ ├── iot_atlas_150x.png │ │ └── iot_atlas_white_150x.png │ ├── iot-atlas-patterns.pptx │ └── iot_atlas_white_150x.png └── themes │ └── iot-atlas │ ├── .editorconfig │ ├── .gitignore │ ├── .grenrc.yml │ ├── CHANGELOG.md │ ├── LICENSE.md │ ├── README.md │ ├── archetypes │ ├── chapter.md │ └── default.md │ ├── i18n │ ├── ar.toml │ ├── de.toml │ ├── en.toml │ ├── es.toml │ ├── fr.toml │ ├── hi.toml │ ├── id.toml │ ├── ja.toml │ ├── nl.toml │ ├── pt.toml │ ├── ru.toml │ ├── tr.toml │ └── zh-cn.toml │ ├── images │ ├── screenshot.png │ └── tn.png │ ├── layouts │ ├── 404.html │ ├── _default │ │ ├── list.html │ │ └── single.html │ ├── index.html │ ├── index.json │ ├── partials │ │ ├── custom-comments.html │ │ ├── custom-footer.html │ │ ├── custom-header.html │ │ ├── favicon.html │ │ ├── footer.html │ │ ├── header.html │ │ ├── logo.html │ │ ├── menu-footer.html │ │ ├── menu.html │ │ ├── meta.html │ │ ├── search.html │ │ ├── tags.html │ │ └── toc.html │ └── shortcodes │ │ ├── attachments.html │ │ ├── button.html │ │ ├── children.html │ │ ├── expand.html │ │ ├── mermaid.html │ │ ├── notice.html │ │ ├── ref.html │ │ ├── relref.html │ │ ├── siteparam.html │ │ ├── tab.html │ │ └── tabs.html │ ├── netlify.toml │ ├── static │ ├── css │ │ ├── atom-one-dark-reasonable.css │ │ ├── auto-complete.css │ │ ├── featherlight.min.css │ │ ├── fontawesome-all.min.css │ │ ├── hugo-theme.css │ │ ├── hybrid.css │ │ ├── nucleus.css │ │ ├── perfect-scrollbar.min.css │ │ ├── tabs.css │ │ ├── tags.css │ │ ├── theme-aws.css │ │ ├── theme-blue.css │ │ ├── theme-green.css │ │ ├── theme-red.css │ │ └── theme.css │ ├── fonts │ │ ├── Inconsolata.eot │ │ ├── Inconsolata.svg │ │ ├── Inconsolata.ttf │ │ ├── Inconsolata.woff │ │ ├── Novecentosanswide-Normal-webfont.eot │ │ ├── Novecentosanswide-Normal-webfont.svg │ │ ├── Novecentosanswide-Normal-webfont.ttf │ │ ├── Novecentosanswide-Normal-webfont.woff │ │ ├── Novecentosanswide-Normal-webfont.woff2 │ │ ├── Novecentosanswide-UltraLight-webfont.eot │ │ ├── Novecentosanswide-UltraLight-webfont.svg │ │ ├── Novecentosanswide-UltraLight-webfont.ttf │ │ ├── Novecentosanswide-UltraLight-webfont.woff │ │ ├── Novecentosanswide-UltraLight-webfont.woff2 │ │ ├── Work_Sans_200.eot │ │ ├── Work_Sans_200.svg │ │ ├── Work_Sans_200.ttf │ │ ├── Work_Sans_200.woff │ │ ├── Work_Sans_200.woff2 │ │ ├── Work_Sans_300.eot │ │ ├── Work_Sans_300.svg │ │ ├── Work_Sans_300.ttf │ │ ├── Work_Sans_300.woff │ │ ├── Work_Sans_300.woff2 │ │ ├── Work_Sans_500.eot │ │ ├── Work_Sans_500.svg │ │ ├── Work_Sans_500.ttf │ │ ├── Work_Sans_500.woff │ │ └── Work_Sans_500.woff2 │ ├── images │ │ ├── clippy.svg │ │ ├── favicon.png │ │ └── gopher-404.jpg │ ├── js │ │ ├── auto-complete.js │ │ ├── clipboard.min.js │ │ ├── featherlight.min.js │ │ ├── highlight.pack.js │ │ ├── hugo-learn.js │ │ ├── jquery-3.6.0.min.js │ │ ├── jquery.sticky.js │ │ ├── learn.js │ │ ├── lunr.min.js │ │ ├── modernizr.custom-3.6.0.js │ │ ├── perfect-scrollbar.jquery.min.js │ │ ├── perfect-scrollbar.min.js │ │ └── search.js │ ├── mermaid │ │ └── mermaid.js │ └── webfonts │ │ ├── fa-brands-400.eot │ │ ├── fa-brands-400.svg │ │ ├── fa-brands-400.ttf │ │ ├── fa-brands-400.woff │ │ ├── fa-brands-400.woff2 │ │ ├── fa-regular-400.eot │ │ ├── fa-regular-400.svg │ │ ├── fa-regular-400.ttf │ │ ├── fa-regular-400.woff │ │ ├── fa-regular-400.woff2 │ │ ├── fa-solid-900.eot │ │ ├── fa-solid-900.svg │ │ ├── fa-solid-900.ttf │ │ ├── fa-solid-900.woff │ │ └── fa-solid-900.woff2 │ ├── theme.toml │ └── wercker.yml └── make_hugo.sh /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | Issue #, if available: 2 | 3 | Description of changes: 4 | 5 | By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice. 6 | -------------------------------------------------------------------------------- /.github/workflows/comment_pr.yml: -------------------------------------------------------------------------------- 1 | name: Comment on the pull request 2 | 3 | on: 4 | workflow_run: 5 | workflows: ["Receive PR"] 6 | types: 7 | - completed 8 | jobs: 9 | comment_on_success: 10 | runs-on: ubuntu-latest 11 | if: >- 12 | ${{ github.event.workflow_run.event == 'pull_request' && 13 | github.event.workflow_run.conclusion == 'success' }} 14 | steps: 15 | - name: "Download PR artifact" 16 | uses: actions/github-script@v3.1.0 17 | with: 18 | script: | 19 | var artifacts = await github.actions.listWorkflowRunArtifacts({ 20 | owner: context.repo.owner, 21 | repo: context.repo.repo, 22 | run_id: ${{github.event.workflow_run.id }}, 23 | }); 24 | var matchArtifact = artifacts.data.artifacts.filter((artifact) => { 25 | return artifact.name == "pr" 26 | })[0]; 27 | var download = await github.actions.downloadArtifact({ 28 | owner: context.repo.owner, 29 | repo: context.repo.repo, 30 | artifact_id: matchArtifact.id, 31 | archive_format: 'zip', 32 | }); 33 | var fs = require('fs'); 34 | fs.writeFileSync('${{github.workspace}}/pr.zip', Buffer.from(download.data)); 35 | - name: Unzip artifact 36 | run: unzip pr.zip 37 | - name: Content has successfully PASSED validation 38 | uses: actions/github-script@v3 39 | with: 40 | github-token: ${{ secrets.GITHUB_TOKEN }} 41 | script: | 42 | var fs = require('fs'); 43 | var issue_number = Number(fs.readFileSync('./NR')); 44 | await github.issues.createComment({ 45 | owner: context.repo.owner, 46 | repo: context.repo.repo, 47 | issue_number: issue_number, 48 | body: 'All content has passed validation tests and can be merged based upon reviewer approval.' 49 | }); 50 | 51 | comment_on_failure: 52 | runs-on: ubuntu-latest 53 | if: >- 54 | ${{ github.event.workflow_run.event == 'pull_request' && 55 | github.event.workflow_run.conclusion == 'failure' }} 56 | steps: 57 | - name: "Download PR artifact" 58 | uses: actions/github-script@v3.1.0 59 | with: 60 | script: | 61 | var artifacts = await github.actions.listWorkflowRunArtifacts({ 62 | owner: context.repo.owner, 63 | repo: context.repo.repo, 64 | run_id: ${{github.event.workflow_run.id }}, 65 | }); 66 | var matchArtifact = artifacts.data.artifacts.filter((artifact) => { 67 | return artifact.name == "pr" 68 | })[0]; 69 | var download = await github.actions.downloadArtifact({ 70 | owner: context.repo.owner, 71 | repo: context.repo.repo, 72 | artifact_id: matchArtifact.id, 73 | archive_format: 'zip', 74 | }); 75 | var fs = require('fs'); 76 | fs.writeFileSync('${{github.workspace}}/pr.zip', Buffer.from(download.data)); 77 | - name: Unzip artifact 78 | run: unzip pr.zip 79 | - name: Content has FAILED validation 80 | uses: actions/github-script@v3 81 | with: 82 | github-token: ${{ secrets.GITHUB_TOKEN }} 83 | script: | 84 | var fs = require('fs'); 85 | var issue_number = Number(fs.readFileSync('./NR')); 86 | await github.issues.createComment({ 87 | owner: context.repo.owner, 88 | repo: context.repo.repo, 89 | issue_number: issue_number, 90 | body: 'Content validation has failed. Review the details of the specific check failure. Before updating the pull request, please perform local validation. All validation check must be successfully resolved before your pull request can be reviewed for approval.' 91 | }); 92 | -------------------------------------------------------------------------------- /.github/workflows/receive_pr.yml: -------------------------------------------------------------------------------- 1 | name: Receive PR 2 | 3 | on: 4 | pull_request: 5 | types: [opened, synchronize, reopened] 6 | 7 | jobs: 8 | validate_hugo_content: 9 | runs-on: ubuntu-latest 10 | env: 11 | working-directory: ./src 12 | name: Hugo content processing 13 | steps: 14 | - name: Checkout PR code 15 | uses: actions/checkout@v2 16 | - name: Set up Docker Buildx 17 | uses: docker/setup-buildx-action@v1 18 | - name: Cache Docker layers 19 | uses: actions/cache@v2 20 | with: 21 | path: /tmp/.buildx-cache 22 | key: ${{ runner.os }}-buildx-${{ hashFiles('**/Dockerfile') }} 23 | restore-keys: | 24 | ${{ runner.os }}-buildx- 25 | - name: Build Hugo container image 26 | uses: docker/build-push-action@v2 27 | with: 28 | context: ./src 29 | file: ./src/Dockerfile 30 | # Do not push to remote registry 31 | push: false 32 | # Load as a local image 33 | load: true 34 | tags: temporary/hugo-ubuntu:latest 35 | cache-from: type=local,src=/tmp/.buildx-cache 36 | cache-to: type=local,dest=/tmp/.buildx-cache-new 37 | - # Temp fix 38 | # https://github.com/docker/build-push-action/issues/252 39 | # https://github.com/moby/buildkit/issues/1896 40 | name: Move cache to keep size low 41 | run: | 42 | rm -rf /tmp/.buildx-cache 43 | mv /tmp/.buildx-cache-new /tmp/.buildx-cache 44 | - name: Validate Hugo content, internal, and external web links 45 | run: ./make_hugo.sh -v 46 | working-directory: ${{env.working-directory}} 47 | # These steps should always run 48 | - name: Save PR number 49 | if: success() || failure() 50 | run: | 51 | mkdir -p /tmp/pr 52 | echo ${{ github.event.number }} > /tmp/pr/NR 53 | - name: Upload pr artifact 54 | if: success() || failure() 55 | uses: actions/upload-artifact@v2 56 | with: 57 | name: pr 58 | path: /tmp/pr 59 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # All the temp file 2 | tmp/** 3 | 4 | # IDE and Editor artifacts # 5 | *.bbprojectd 6 | .idea 7 | .vscode/settings.json 8 | .vscode/launch.json 9 | 10 | # Temporary Files # 11 | tmp_* 12 | cfg.tmp.json 13 | 14 | # OS generated files # 15 | .DS_Store 16 | .DS_Store? 17 | 18 | # Hugo generated content 19 | /src/hugo/public/* 20 | !/src/hugo/public/.gitkeep 21 | /src/hugo/tmp/* 22 | /src/hugo/.asciidoctor/* 23 | 24 | # Dev files 25 | Pipfile* 26 | 27 | # Microsoft temp files 28 | *.tmp 29 | # Word temporary 30 | ~$*.doc* 31 | # Word Auto Backup File 32 | Backup of *.doc* 33 | # Excel temporary 34 | ~$*.xls* 35 | # Excel Backup File 36 | *.xlk 37 | # PowerPoint temporary 38 | ~$*.ppt* 39 | # Visio autosave temporary files 40 | *.~vsd* 41 | # Misc 42 | config-template.yml -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | ## Code of Conduct 2 | 3 | This project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct). 4 | For more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact 5 | opensource-codeofconduct@amazon.com with any additional questions or comments. 6 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Guidelines for contributing 2 | 3 | Thank you for your interest in contributing to the IoT Atlas! We greatly value feedback and contributions from our community. 4 | 5 | Please read through this document before you submit any pull requests or issues. It will help us work together more effectively. 6 | 7 | ## What to expect when you contribute 8 | 9 | When you submit a pull request, our team is notified and will respond as quickly as we can. We'll do our best to work with you to ensure that your pull request adheres to our style and standards. If we merge your pull request, we might make, or request, additional edits later for style or clarity. 10 | 11 | The documentation in this repository are not published directly to the IoT Atlas website. If we merge your pull request, we'll publish your changes to the documentation website as soon as we can, but they won't appear immediately or automatically. 12 | 13 | We look forward to receiving your pull requests for: 14 | 15 | - New content you'd like to contribute (such as new patterns, considerations, or examples) 16 | - Inaccuracies in the content 17 | - Information gaps in the content that need more detail to be complete 18 | - Typos or grammatical errors 19 | - Suggested rewrites that improve clarity and reduce confusion 20 | 21 | **Note:** We all write differently, and you might not like how we've written or organized something currently. We want that feedback. But please be sure that your request for a rewrite is supported by the previous criteria. If it isn't, we might decline to merge it. 22 | 23 | ## How to contribute 24 | 25 | To contribute, send us a pull request. For small changes, such as fixing a typo or adding a link, you can use the [GitHub Edit Button](https://blog.github.com/2011-04-26-forking-with-the-edit-button/). For larger changes: 26 | 27 | 1. [Fork the repository](https://help.github.com/articles/fork-a-repo/). 28 | 2. In your fork, make your change in a branch that's based on this repository's **main** branch. 29 | 3. Test your change. Review the [contributor development process](https://github.com/aws/iot-atlas/blob/main/src/README.md) for instructions on testing local content. 30 | 4. Commit the change to your fork, using a clear and descriptive commit message. 31 | 5. [Create a pull request](https://help.github.com/articles/creating-a-pull-request-from-a-fork/), answering any questions in the pull request form. 32 | 33 | Before you send us a pull request, please be sure that: 34 | 35 | 1. You're working from the latest source on the **main** branch. 36 | 2. You check [existing open](https://github.com/aws/iot-atlas/pulls), and [recently closed](https://github.com/aws/iot-atlas/pulls?q=is%3Apr+is%3Aclosed), pull requests to be sure that someone else has not already addressed the problem. 37 | 3. You [create an issue](https://github.com/aws/iot-atlas/issues/new) before working on a contribution that will take a significant amount of your time. 38 | 39 | For contributions that will take a significant amount of time, [open a new issue](https://github.com/aws/iot-atlas/issues/new) to pitch your idea before you get started. Explain the problem and describe the content you want to see added. Let us know if you'll write it yourself or if you'd like us to help. We'll discuss your proposal with you and let you know whether we're likely to accept it. We don't want you to spend a lot of time on a contribution that might be outside the scope of the IoT Atlas or that is already in the works. 40 | 41 | ## Finding contributions to work on 42 | 43 | If you'd like to contribute, but don't have a project in mind, look at the [open issues](https://github.com/aws/iot-atlas/issues) in this repository for some ideas. Any issues with the [help wanted](https://github.com/aws/iot-atlas/labels/help%20wanted) or [enhancement](https://github.com/aws/iot-atlas/labels/enhancement) labels are a great place to start. 44 | 45 | In addition to written content, we really appreciate new examples for each design, such as examples for different platforms or environments, and code samples in additional languages. 46 | 47 | ## Code of conduct 48 | 49 | This project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct). For more information, see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact [opensource-codeofconduct@amazon.com](mailto:opensource-codeofconduct@amazon.com) with any additional questions or comments. 50 | 51 | ## Security issue notifications 52 | 53 | If you discover a potential security issue, please notify AWS Security via our [vulnerability reporting page](http://aws.amazon.com/security/vulnerability-reporting/). Please do **not** create a public issue on GitHub. 54 | 55 | ## Licensing 56 | 57 | See the [LICENSE](https://github.com/aws/iot-atlas/blob/main/LICENSE) file for this project's licensing. We will ask you to confirm the licensing of your contribution. We may ask you to sign a [Contributor License Agreement (CLA)](http://en.wikipedia.org/wiki/Contributor_License_Agreement) for larger changes. 58 | -------------------------------------------------------------------------------- /FAQ.md: -------------------------------------------------------------------------------- 1 | # Frequently Asked Questions 2 | 3 | ### How can I test content before submitting a pull request? 4 | 5 | Please review the [contributor development process](https://github.com/aws/iot-atlas/blob/main/src/README.md) for instructions on testing local content. 6 | -------------------------------------------------------------------------------- /LICENSE-SAMPLECODE: -------------------------------------------------------------------------------- 1 | Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this 4 | software and associated documentation files (the "Software"), to deal in the Software 5 | without restriction, including without limitation the rights to use, copy, modify, 6 | merge, publish, distribute, sublicense, and/or sell copies of the Software, and to 7 | permit persons to whom the Software is furnished to do so. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 10 | INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 11 | PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 12 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 13 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 14 | SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 15 | -------------------------------------------------------------------------------- /LICENSE-SUMMARY: -------------------------------------------------------------------------------- 1 | Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. 2 | 3 | The documentation is made available under the Creative Commons Attribution-ShareAlike 4.0 International License. See the LICENSE file. 4 | 5 | The sample code within this documentation is made available under a modified MIT license. See the LICENSE-SAMPLECODE file. 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## IoT Atlas 2 | 3 | This repository contains the content of the [IoT Atlas](http://iotatlas.net) 4 | 5 | The IoT Atlas supports your project by explaining the why, what, and who of commonly used, modern IoT designs. 6 | 7 | It would be great to have you join us and [contribute](https://github.com/aws/iot-atlas/blob/main/CONTRIBUTING.md) your ideas for designs, considerations, and examples. Please also read the [FAQ](https://github.com/aws/iot-atlas/blob/main/FAQ.md). 8 | 9 | ## Local Development 10 | 11 | Please review the [contributor development process](https://github.com/aws/iot-atlas/blob/main/src/README.md) for instructions on testing local content. 12 | 13 | ## License Summary 14 | 15 | The documentation is made available under the Creative Commons Attribution-ShareAlike 4.0 International License. See the LICENSE file. 16 | 17 | The sample code within this documentation is made available under a modified MIT license. See the LICENSE-SAMPLECODE file. 18 | -------------------------------------------------------------------------------- /src/Dockerfile: -------------------------------------------------------------------------------- 1 | # Version of Hugo to build. 2 | # NOTE: For now, version 0.82.0 needed until hard-coded files for PlantUML addressed 3 | ARG HUGO_VERSION=0.82.0 4 | 5 | 6 | ################################################################################ 7 | FROM public.ecr.aws/ubuntu/ubuntu:20.04_stable AS base 8 | ARG TARGETARCH 9 | ARG BUILDARCH 10 | 11 | RUN echo "TARGETARCH=${TARGETARCH}\nBUILDARCH=${BUILDARCH}" 12 | 13 | RUN [ ${TARGETARCH} = ${BUILDARCH} ] || { echo "Error: the target architecture is not the same as the build architecture"; exit 1; } 14 | 15 | RUN apt-get update && apt-get upgrade -y \ 16 | && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ 17 | curl ruby ruby-dev make cmake build-essential bison flex graphviz \ 18 | openjdk-11-jre python git \ 19 | && apt-get clean \ 20 | && rm -rf /var/lib/apt/lists/* 21 | 22 | ################################################################################ 23 | # Build hugo executable using golang 24 | FROM base AS builder 25 | 26 | # Version of golang to build. 27 | ARG GO_VERSION=1.16.3 28 | 29 | ARG HUGO_VERSION 30 | 31 | ENV PATH="${PATH}:/usr/local/go/bin" 32 | WORKDIR /tmp 33 | 34 | # Install golang 35 | RUN curl -JLO https://golang.org/dl/go${GO_VERSION}.linux-${TARGETARCH}.tar.gz \ 36 | && rm -rf /usr/local/go \ 37 | && tar -C /usr/local -xzf go${GO_VERSION}.linux-${TARGETARCH}.tar.gz 38 | 39 | # Configure GOPROXY if passed in as build argument 40 | ARG GOPROXY 41 | RUN (test -n "$GOPROXY" && go env -w GOPROXY="${GOPROXY}") || true 42 | 43 | # Download Hugo source 44 | RUN curl -JLO https://github.com/gohugoio/hugo/archive/refs/tags/v${HUGO_VERSION}.tar.gz \ 45 | && tar xzf hugo-${HUGO_VERSION}.tar.gz 46 | 47 | # Prepare source file changes 48 | # Hard-coded files for now, specific to Hugo 0.82.0 49 | COPY ./docker_assets/convert.go /tmp/hugo-${HUGO_VERSION}/markup/goldmark/convert.go 50 | COPY ./docker_assets/config.go /tmp/hugo-${HUGO_VERSION}/markup/goldmark/goldmark_config/config.go 51 | 52 | # Download dependencies (with a single retry to catch timeouts) and compile Hugo 53 | ARG GOLDMARK_PLANTUML="github.com/OhYee/goldmark-plantuml@v1.0.3" 54 | RUN cd hugo-${HUGO_VERSION} \ 55 | && (go get ${GOLDMARK_PLANTUML} || go get ${GOLDMARK_PLANTUML}) \ 56 | && go install --tags extended \ 57 | && mv $HOME/go/bin/hugo /hugo 58 | 59 | ################################################################################ 60 | # Build the operational container 61 | FROM base 62 | ENV DOCUMENT_DIR=/hugo-project 63 | COPY --from=builder /hugo /usr/local/bin 64 | 65 | # Install plantuml 66 | RUN mkdir -p /opt/plantuml && cd /opt/plantuml \ 67 | && UML=http://sourceforge.net/projects/plantuml/files/plantuml.jar/download \ 68 | && curl -JLO ${UML} 69 | COPY ./docker_assets/plantuml /usr/local/bin/plantuml 70 | RUN chmod a+x /usr/local/bin/plantuml 71 | 72 | # install ASCIIDOC support 73 | RUN gem install --no-document asciidoctor asciidoctor-revealjs asciidoctor-html5s \ 74 | rouge asciidoctor-confluence asciidoctor-diagram coderay pygments.rb 75 | 76 | RUN mkdir ${DOCUMENT_DIR} 77 | WORKDIR ${DOCUMENT_DIR} 78 | 79 | VOLUME ${DOCUMENT_DIR} 80 | ENV CLASSPATH=/opt/plantuml 81 | ENV PATH=${DOCUMENT_DIR}:$PATH 82 | CMD ["hugo", "server", "--bind", "0.0.0.0"] 83 | 84 | HEALTHCHECK --interval=2s --timeout=3s \ 85 | CMD curl -f http://localhost:1313/ || exit 1 86 | -------------------------------------------------------------------------------- /src/README.md: -------------------------------------------------------------------------------- 1 | ## IoT Atlas Local Development 2 | 3 | The IoT Atlas uses the [Hugo](https://gohugo.io/) framework for rendering the website. To ensure that all new or updated content is valid, a series of checks are performed on URL links, internal references, and spell-checking (for U.S. English at present) for common errors. 4 | 5 | All of this is automated when a GitHub pull request is accepted. Failures will result in the updates _not_ being applied and corrections required on the pull request. 6 | 7 | Following the steps below will ensure that any changes you make can be tested and validated prior to submitted a pull request. If you have any questions, please review and ask questions in the [discussions](https://github.com/aws/iot-atlas/discussions) section of the GitHub repository. 8 | 9 | ### Pre-requisites 10 | 11 | To reduce installing dependencies, the main requirement is to have Docker installed locally. Also, the `make_hugo.sh` script is Linux/macOS (well, bash) specific, so for Microsoft Windows the commands would need to reviewed and changed. 12 | 13 | ### Testing Process 14 | 15 | 1. Once you are ready to start creating content, open a terminal window and change into the `src/` directory, then start in developer mode which will run Hugo locally in fast render mode. 16 | 17 | ```bash 18 | cd src/ 19 | ./make_hugo.sh -d 20 | ``` 21 | 22 | 1. This starts a local server on port 1313 serving the rendered content. The default URL is `http://localhost:1313` and will show _most_ content with the exception of rendered images from AsciiDoc or PlantUML. To see this content, fully generate the content and view locally from a web browser opening `src/hugo/public/index.html`. 23 | 1. Every time you make and save a change, the local server will re-render and trigger your local browser to reload the page. If changes are not reflected, enter `CTRL+C` to stop the process and start `./make_hugo.sh -d` again. 24 | 25 | Once you have completed development, run `./make_hugo.sh` without any arguments to have it fully generate and validate the content. Once successful, you can commit and perform a pull requests. 26 | 27 | ### FAQ 28 | 29 | **I created content and see it in the `src/hugo/public` folder, but when I commit, this isn't being added to my forked repository, why?** 30 | 31 | This is by design by including the `/src/hugo/public/*` statement in the main `.gitignore` file. 32 | 33 | As the website is statically generated through a build process and synched to an Amazon S3 bucket, there is no need to keep the content locally in the repository. It is only used for local validation of content. 34 | 35 | **When adding or changing the weight of an article, the left-side menu is not updating even with a browser refresh. How can I see the new structure?** 36 | 37 | Certain changes to content are not reflected with the _fast render_ process. To see these, enter `CTRL+C` to stop the Hugo container process and run `./make_hugo.sh -d` again, then refresh the browser. 38 | 39 | **When I run `make_hugo.sh`, it fails to build the docker image completely due to issues with newer versions of Golang always connecting to upstream `proxy.gloang.org` to fetch modules when the `go get` command is issued. How do I work arround this issue?*** 40 | 41 | Golang after version 1.13 will always try to fetch modules via upstream proxy `proxy.golang.org`. In some organizations, this domain is not accessible due to corporate security mandates. To bypass this, you can explicitly set the environment variable `GOPROXY` to the value `direct`. Execute the following command to run the local development environment as: `GOPROXY=direct ./make_hugo.sh -d` bypassing the Golang proxy setting. 42 | -------------------------------------------------------------------------------- /src/docker_assets/config.go: -------------------------------------------------------------------------------- 1 | // Copyright 2019 The Hugo Authors. All rights reserved. 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // http://www.apache.org/licenses/LICENSE-2.0 7 | // 8 | // Unless required by applicable law or agreed to in writing, software 9 | // distributed under the License is distributed on an "AS IS" BASIS, 10 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | // See the License for the specific language governing permissions and 12 | // limitations under the License. 13 | 14 | // Package goldmark_config holds Goldmark related configuration. 15 | package goldmark_config 16 | 17 | const ( 18 | AutoHeadingIDTypeGitHub = "github" 19 | AutoHeadingIDTypeGitHubAscii = "github-ascii" 20 | AutoHeadingIDTypeBlackfriday = "blackfriday" 21 | ) 22 | 23 | // DefaultConfig holds the default Goldmark configuration. 24 | var Default = Config{ 25 | Extensions: Extensions{ 26 | Typographer: true, 27 | Footnote: true, 28 | DefinitionList: true, 29 | Table: true, 30 | Strikethrough: true, 31 | Linkify: true, 32 | TaskList: true, 33 | Plantuml: true, 34 | }, 35 | Renderer: Renderer{ 36 | Unsafe: false, 37 | }, 38 | Parser: Parser{ 39 | AutoHeadingID: true, 40 | AutoHeadingIDType: AutoHeadingIDTypeGitHub, 41 | Attribute: ParserAttribute{ 42 | Title: true, 43 | Block: false, 44 | }, 45 | }, 46 | } 47 | 48 | // Config configures Goldmark. 49 | type Config struct { 50 | Renderer Renderer 51 | Parser Parser 52 | Extensions Extensions 53 | } 54 | 55 | type Extensions struct { 56 | Typographer bool 57 | Footnote bool 58 | DefinitionList bool 59 | 60 | // GitHub flavored markdown 61 | Table bool 62 | Strikethrough bool 63 | Linkify bool 64 | TaskList bool 65 | Plantuml bool 66 | } 67 | 68 | type Renderer struct { 69 | // Whether softline breaks should be rendered as '
' 70 | HardWraps bool 71 | 72 | // XHTML instead of HTML5. 73 | XHTML bool 74 | 75 | // Allow raw HTML etc. 76 | Unsafe bool 77 | } 78 | 79 | type Parser struct { 80 | // Enables custom heading ids and 81 | // auto generated heading ids. 82 | AutoHeadingID bool 83 | 84 | // The strategy to use when generating heading IDs. 85 | // Available options are "github", "github-ascii". 86 | // Default is "github", which will create GitHub-compatible anchor names. 87 | AutoHeadingIDType string 88 | 89 | // Enables custom attributes. 90 | Attribute ParserAttribute 91 | } 92 | 93 | type ParserAttribute struct { 94 | // Enables custom attributes for titles. 95 | Title bool 96 | // Enables custom attributeds for blocks. 97 | Block bool 98 | } -------------------------------------------------------------------------------- /src/docker_assets/plantuml: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | echo "$(cat)" | java -jar /opt/plantuml/plantuml.jar "$@" -------------------------------------------------------------------------------- /src/hugo/config.toml: -------------------------------------------------------------------------------- 1 | baseURL = "https://iotatlas.net" 2 | title = "IoT Atlas" 3 | theme = "iot-atlas" 4 | pygmentsCodeFences = true 5 | # English is the default language 6 | defaultContentLanguage = "en" 7 | # Force to have /en/my-page and /fr/my-page routes, even for default language. 8 | defaultContentLanguageInSubdir = true 9 | uglyurls = false 10 | # For SEO 11 | enableRobotsTXT = true 12 | 13 | [params] 14 | ordersectionsby = "weight" 15 | editURL = "https://github.com/aws/iot-atlas/tree/main/src/hugo/content/" 16 | themeVariant = "aws" 17 | disableLandingPageButton = false 18 | disableNextPrev = true 19 | disableInlineCopyToClipBoard = true 20 | 21 | [markup] 22 | defaultMarkdownHandler = "goldmark" 23 | [markup.goldmark] 24 | [markup.goldmark.renderer] 25 | unsafe = true 26 | [markup.goldmark.extensions] 27 | plantuml = true 28 | 29 | [taxonomies] 30 | tag = "tags" 31 | category = "categories" 32 | persona = "personae" 33 | 34 | [outputs] 35 | home = ["HTML", "RSS", "JSON"] 36 | 37 | [[menu.shortcuts]] 38 | name = " Tags" 39 | url = "/tags/" 40 | weight = 30 41 | 42 | [languages] 43 | [languages.en] 44 | lang = "en" 45 | langCode = "en-us" 46 | contentDir = "content/en-us" 47 | languageName = "English" 48 | weight = 1 49 | 50 | [languages.en.params] 51 | editURL = "https://github.com/aws/iot-atlas/tree/main/src/hugo/content/en-us/" 52 | 53 | [languages.zh] 54 | lang = "zh" 55 | langCode = "zh-cn" 56 | contentDir = "content/zh-cn" 57 | languageName = "中文(简体)" 58 | weight = 2 59 | 60 | [languages.zh.params] 61 | editURL = "https://github.com/aws/iot-atlas/tree/main/src/hugo/content/zh-cn/" 62 | 63 | [languages.fr] 64 | lang = "fr" 65 | langCode = "fr-fr" 66 | contentDir = "content/fr-fr" 67 | languageName = "French" 68 | weight = 3 69 | 70 | [languages.fr.params] 71 | editURL = "https://github.com/aws/iot-atlas/tree/main/src/hugo/content/fr-fr/" 72 | -------------------------------------------------------------------------------- /src/hugo/content/en-us/_footer.md: -------------------------------------------------------------------------------- 1 | Copyright (c) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. 2 | -------------------------------------------------------------------------------- /src/hugo/content/en-us/_header.md: -------------------------------------------------------------------------------- 1 | ![](/iot_atlas_white_150x.png) [IoT Atlas](/) 2 | -------------------------------------------------------------------------------- /src/hugo/content/en-us/about/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "About" 3 | weight: 1000 4 | --- 5 | 6 | ## History 7 | First published in November 2018, this site and the [iotatlas.net](http://iotatlas.net) and [iotatlas.io](http://iotatlas.io) domains are currently maintained by AWS. The content is maintained and improved by IoT Atlas [community members](https://github.com/aws/iot-atlas/graphs/contributors), customers, partners, and AWS employees. 8 | 9 | ## About Amazon Web Services 10 | Amazon Web Services provides a highly reliable, scalable, low-cost cloud infrastructure platform that powers hundreds of thousands of businesses in 190 countries around the world. In 2015 AWS added specific Internet of Things (IoT) capabilities and has been learning how to better help customers ever since. -------------------------------------------------------------------------------- /src/hugo/content/en-us/best_practices/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Best Practices 3 | chapter: true 4 | pre:   5 | weight: 25 6 | --- 7 | 8 | ### Best Practices 9 | 10 | In this section you will find IoT best practices and how they are applied for different cloud and system environments. Best practices may encompass a combination of specific patterns or even be more general, such as device life-cycle management across different industries. 11 | -------------------------------------------------------------------------------- /src/hugo/content/en-us/best_practices/aws/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: AWS 3 | weight: 10 4 | --- 5 | 6 | Amazon Web Services, or AWS, offers a variety of IoT-specific services to run your production workloads securely in a cost-effective manner at scale. For each of the _best practices_ in this section, the approach to using AWS, both IoT and other AWS services, will be detailed. 7 | 8 | {{% notice note %}} 9 | This is a placeholder section for best practices to be developed. This note will be removed and replaced with a list of best practices similar to the [Patterns]({{< ref "/patterns" >}}) section. 10 | {{% /notice %}} 11 | -------------------------------------------------------------------------------- /src/hugo/content/en-us/bot.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "IoT Atlas Bot" 3 | hidden: true 4 | type: page 5 | --- 6 | 7 | ## IoT Atlas Bot 8 | 9 | The _IotAtlasBot_ is the name of the IoT Atlas web crawler. This bot is used periodically to check the validity all links on the IoT Atlas site. 10 | 11 | Your site was accessed for specific links present within the IoT Atlas to verify they are still valid and accessible. Access can occur in three different ways. First, content creators can run a verification set of steps on all IoT Atlas content from their local development environment. This can originate from any IP address on the Internet. You can verify this by checking the `User-Agent` field in your web server log files. 12 | 13 | Second, when content is ready for inclusion, a GitHub pull request will initiate a [GitHub Action](https://github.com/features/actions) to pre-check the content prior to publishing. The IP addresses seen will originate from GitHub allocated public IP addresses. 14 | 15 | And finally, once a content pull request has completed, the publishing pipeline will complete a final link check just prior to a new version of content being made publicly available. This is done via [AWS CodePipe](https://aws.amazon.com/codepipeline/) in the Northern Virginia region. The IP addresses will be those associated with the `us-east-1` region from the [AWS IP address ranges JSON file](https://docs.aws.amazon.com/general/latest/gr/aws-ip-ranges.html#aws-ip-download). 16 | 17 | If you are seeing excessive requests from the bot, please open an [issue](https://github.com/aws/iot-atlas/issues/new) with details on how we can contact you to remediate. 18 | -------------------------------------------------------------------------------- /src/hugo/content/en-us/contribute/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Contribute to the Atlas" 3 | --- 4 | 5 | This section provides guidance and resources on how to contribute to the IoT Atlas. It covers: 6 | 7 | - Authoring and testing new content 8 | - Guidelines for content creation using Hugo 9 | - Templates for different content types 10 | 11 | Following these guidelines helps ensure the consistency of the Atlas from page to page. 12 | 13 | ## Authoring new content 14 | 15 | When creating new content, use the follow guidance: 16 | 17 | 1. A customized Hugo [Learn Theme](https://github.com/matcornic/hugo-theme-learn) is the basis for this site. Unless extended or called out below, all Learn Theme design content and shortcodes can be used. Additional features are listed below and shown in the [templates]({{< ref "/contribute/templates" >}}) folder, or in the [kitchen sink]({{< ref "/contribute/kitchen_sink" >}}) example that demonstrates all features. 18 | 1. If creating similar content that already exists, use an existing page as the basis for headings, style, and approach. You can also review the example style templates in this section. 19 | 1. Test content changes locally and only submit a [pull request](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-requests) once the validation passes successfully. Pull requests will not be merged with broken links or invalid Hugo references/code. 20 | 21 | Following the steps below will ensure that any content or changes you make can be tested and validated prior to submitted a pull request. If you have any questions, please review and ask questions in the [discussions](https://github.com/aws/iot-atlas/discussions) section of the GitHub repository. 22 | 23 | ### Fork and Local Testing 24 | 25 | To minimize installing local dependencies on your system, the only requirement is to have Docker installed locally. Also, the `make_hugo.sh` script is Linux/macOS (well, bash) specific, so for Microsoft Windows the commands would need to reviewed and changed. Setup your local environment by following these steps: 26 | 27 | 1. [Fork](https://github.com/aws/iot-atlas/fork) the repository in your GitHub account. 28 | 1. Optionally create a branch for your changes 29 | 1. From the `iot-atlas/src` directory, run `./make_hugo.sh -d` to start in local development mode. 30 | 31 | {{% notice note %}} 32 | The first time doing this will locally build the docker container which will take 5-15 minutes. After that, the local `temporary/hugo-ubuntu` will be used to run hugo in a container 33 | {{% /notice %}} 34 | 35 | 4. Verify you can open locally from the URL [http://localhost:1313/](http://localhost:1313/) 36 | 37 | This final step starts a local server on port 1313 serving the rendered content. Every time you make and save a change, the local server will re-render and trigger your local browser to reload the page. If changes are not reflected, enter `CTRL+C` to stop the process and start `./make_hugo.sh -d` again. This can help when moving content or working with new directories 38 | 39 | ### Validate Content 40 | 41 | Once you are happy with the new content, run `./make_hugo.sh -v`, which will _validate_ all the content is properly formatted, and that if you included any hyperlinks that they are valid. If errors are returned, correct and re-run. 42 | 43 | When the message _\***\*\*\*\*\*** Validation completed successfully,_ is returned, validation is complete. 44 | 45 | ### Create a Pull Request 46 | 47 | From GitHub, use the [pull request process](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-requests) to create a pull request (PR) to the `aws/iot-atlas` repository. This will start a validation process under the [open pull requests](https://github.com/aws/iot-atlas/pulls?q=is%3Aopen+is%3Apr) again, and provide a message if the PR can be merged. If there are errors (red ❌ next to your PR), review the error, correct in _your_ forked repository, then commit the changes. 48 | 49 | Once validation has completed, an IoT Atlas maintainer will review and either merge the content, or request changes or ask clarifying questions. 50 | 51 | Once merged and content is live, you can delete the forked repository. 52 | 53 | ## Guidelines for Content Creation 54 | 55 | This section covers both style and technical approaches to creating new content. 56 | 57 | ## Hugo and Theme Details 58 | 59 | This sections covers structure and use of more complex pages and use of short codes. This site is based off of the [Hugo Learn Theme](https://github.com/matcornic/hugo-theme-learn). All content and shortcodes for that theme are available for use here. 60 | 61 | ### Bundle Resources 62 | 63 | If there are diagrams or other images related to your content, include and reference those from within the same directory as a [Page Bundle](https://gohugo.io/content-management/page-bundles/). For instance, a new _Pattern_ called _Foo_ would be structured like this: 64 | 65 | ``` 66 | Pattern/ 67 | _index.md 68 | Foo/ 69 | _index.md 70 | img1.png 71 | img2.png 72 | ``` 73 | 74 | Referencing images within `Pattern/Foo/_index.md` would look like this in markdown: 75 | 76 | ```markdown 77 | Lorem ipsum dolor sit amet, consectetur adipiscing elit... 78 | 79 | [Image One](img1.png) 80 | 81 | sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. 82 | ``` 83 | -------------------------------------------------------------------------------- /src/hugo/content/en-us/contribute/kitchen_sink/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Kitchen Sink" 3 | weight: 99 4 | --- 5 | 6 | This page contains examples of all formatting and Hugo related shortcodes that can be used in an article. 7 | 8 | ### Multi-tab Content 9 | 10 | Can be used to show the same example written in different languages, or content specific to different versions. 11 | 12 | When using more than once on a page, make sure to set the `groupId` to be unique per set of content to render the first tab selection. 13 | 14 | #### Code fence 15 | 16 | {{< tabs groupId="code-fence">}} 17 | {{% tab name="python" %}} 18 | 19 | ```python 20 | print("Hello World!") 21 | ``` 22 | 23 | {{% /tab %}} 24 | {{% tab name="java" %}} 25 | 26 | ```java 27 | > print("Hello World!") 28 | ``` 29 | 30 | {{% /tab %}} 31 | {{% tab name="bash" %}} 32 | 33 | ```Bash 34 | echo "Hello World!" 35 | ``` 36 | 37 | {{% /tab %}} 38 | {{< /tabs >}} 39 | 40 | #### Release notes 41 | 42 | {{< tabs groupId="release-notes">}} 43 | {{% tab name="1.0.0" %}} 44 | This was released in `1.0.0`: 45 | 46 | - Initial deployment 47 | {{% /tab %}} 48 | 49 | {{% tab name="1.1.0" %}} 50 | This was released in `1.1.0`: 51 | 52 | - Minor bug fix 53 | - Minor new feature 54 | {{% /tab %}} 55 | 56 | {{% tab name="2.0.0" %}} 57 | This was released in `2.0.0`: 58 | 59 | - Major update 60 | - Something else of importance 61 | 62 | {{% /tab %}} 63 | {{< /tabs >}} 64 | -------------------------------------------------------------------------------- /src/hugo/content/en-us/contribute/templates/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Templates" 3 | weight: 1 4 | --- 5 | 6 | These are example templates for different types of content. Is it recommended to use these template when creating content in the different sections. You can also review actual content for each section and use those as starting points. 7 | 8 | {{% children style="div" depth="2" description="true" showhidden="true" %}} 9 | -------------------------------------------------------------------------------- /src/hugo/content/en-us/contribute/templates/implementation.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Implementation Template File" 3 | weight: 20 4 | summary: "Template for new provider-specific implementations of a general pattern." 5 | --- 6 | 7 | Use the following text as the basis for new _implementations_ of provider-specific _patterns_. Create a new directory for the implementation under `src/hugo/content/en-us/implementations/PROVIDER` (replace `en-us` with other supported languages), then copy and paste the following content into a new file named `_index.html`. 8 | 9 | ```markdown 10 | --- 11 | # replace PATTERN with the pattern this implementation addresses 12 | title: "Pattern - Short Description" 13 | # change weight to position in list 14 | weight: 10 15 | summary: "summary of the implementation" 16 | --- 17 | 18 | Description of the implementation. 19 | 20 | ## Use Cases 21 | 22 | List the use cases and persona-based stories for this implementation. 23 | 24 | ## Reference Architecture 25 | 26 | Insert a reference architecture diagram or other representation of the implementation. 27 | 28 | Define and describe the actors: 29 | 30 | - _Actor 1_ is something 31 | - _Actor 2_ is something 32 | 33 | If there are flows or interactions, use numbers and a list to describe. 34 | 35 | 1. _Actor 1_ does something 36 | 1. _Actor 2_ responds to _Actor 1_ 37 | 38 | ### Assumptions 39 | 40 | Place any assumptions for the reader here. 41 | 42 | ## Implementation 43 | 44 | This section goes through the specific steps on how this solution is implemented. It can be through code, processes, or other methods. 45 | 46 | ### Group 1 47 | 48 | If there are multiple series or groups of steps, use the `###` or `h3` heading level to group. 49 | 50 | ### Group 2 51 | 52 | Next group of implementation steps. 53 | 54 | ## Considerations 55 | 56 | Every implementation should have one or more considerations. A consideration could be in how devices interact, error conditions that may arise, or other things a reader should consider when applying the implementation for their use. 57 | 58 | ### Consideration 1 59 | 60 | Lorem ipsum dolor sit amet, exercitation id sit eiusmod culpa consectetur nulla et excepteur labore 61 | 62 | ### Consideration 2 63 | 64 | Lorem ipsum dolor sit amet, proident mollit exercitation est commodo ea cillum magna anim adipisicing nulla proident duis aliquip tempor 65 | ``` 66 | 67 | Once saved, use the [local development and testing process]({{< ref "/contribute#validate-content" >}}) to review the following: 68 | 69 | 1. Your content appears under the _Implementations_ menu, under the provider section 70 | 1. The summary appears under the provider and pattern category, for example [_Implementations/AWS_]({{< ref "/implementations/aws" >}}) 71 | 1. Your content is fully rendered properly 72 | -------------------------------------------------------------------------------- /src/hugo/content/en-us/contribute/templates/pattern.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Pattern Template File" 3 | weight: 10 4 | summary: "Template for new general patterns." 5 | --- 6 | 7 | Use the following text as the basis for new _patterns._ Create a new directory for the pattern under `src/hugo/content/en-us/patterns` (replace `en-us` with other supported languages), then copy and paste the following content into a new file named `_index.html`. 8 | 9 | ```markdown 10 | --- 11 | title: "Name of the Pattern" 12 | # Select a weight to position in the pattern list (this comment can be removed) 13 | weight: 10 14 | summary: "A short summary that will be used to describe the pattern on the summary page." 15 | --- 16 | 17 | A short summary of the pattern, this will be used to describe the pattern on the summary page. 18 | 19 | ## Challenge 20 | 21 | Describe the challenge this pattern addresses. 22 | 23 | ## Solution 24 | 25 | Describe the solution using diagrams, process flows, or other means with numbered steps. Review the Contribute section for guidelines for approved diagrams, and place the diagram files in the same directory as this file. 26 | 27 | ### Diagram Steps 28 | 29 | 1. For each step, go into detail what occurs 30 | 1. Then for the next step(s), their detail 31 | 32 | ## Considerations 33 | 34 | Describe what an implementor should consider when using this pattern. 35 | 36 | ### Use a level 3 header for each question 37 | 38 | Then for each question or consideration, and answer or details for it. 39 | 40 | ### This is an example of a second questions 41 | 42 | ## Examples 43 | 44 | To illustrate the pattern, create a sub-section for each 45 | 46 | ### Describe the example 47 | 48 | Explain the example in greater detail 49 | 50 | ### Describe a second example 51 | 52 | And the second examples details. 53 | ``` 54 | 55 | Once saved, use the [local development and testing process]({{< ref "/contribute#validate-content" >}}) to review the following: 56 | 57 | 1. Your content appears under the _Patterns_ menu 58 | 1. The summary appears in the [_Patterns_]({{< ref "/patterns" >}}) list 59 | 1. Your content is fully rendered properly 60 | -------------------------------------------------------------------------------- /src/hugo/content/en-us/glossary/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Glossary" 3 | weight: 500 4 | --- 5 | 6 | {{% children style="card" depth="1" description="true" %}} -------------------------------------------------------------------------------- /src/hugo/content/en-us/glossary/personae.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Personae" 3 | --- 4 | Descriptions of who is commonly interested in an IoT solution. 5 | 6 | 7 | ### Business Decision Maker 8 | > the CEO, CTO, CSIO, or manager of the Big Data team who is constantly on the lookout for solutions that will solve the company's problems 9 | 10 | ### Line of Business Application Developer 11 | > a cloud-knowledgeable developer who creates, owns, and maintains an entire application or service vital for the effective operation of an enterprise's critical processes 12 | 13 | ### Data Engineer 14 | > a technically-savvy person who knows both how to setup the cloud data infrastructure for the company and who is responsible for making sure it works right 15 | 16 | ### Device Engineer 17 | > a highly specialized developer who knows how to write, test, and fix code that runs securely on physical, often resource-constrained devices 18 | 19 | ### Fleet Manager 20 | > a cloud-knowledgeable developer in operations responsible for keeping a fleet of devices updated with current firmware and operating smoothly 21 | 22 | ### Industrial Engineer 23 | > a technical specialist who builds, troubleshoots, and improves physical processes through the use of historians, SCADA systems, and PLCs to both support company operations and identify inefficiencies in those same operations 24 | 25 | ### Operations Analyst 26 | > an analyst who investigates and analyzes IoT data, and develops models so the company can make good decisions about business questions and industrial engineers can take appropriate action 27 | 28 | ### Security Architect 29 | > a technically-savvy person who thinks like a hacker in order to anticipate the moves and tactics that intruders will use to gain access to the company's systems 30 | 31 | ### Security Operations 32 | > a technically-savvy person who makes sure everything with a solutions' device security is functioning according to plan and sounding the alarm when it is not 33 | -------------------------------------------------------------------------------- /src/hugo/content/en-us/glossary/vocabulary.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Vocabulary" 3 | --- 4 | Words and definitions used across the IoT Atlas. 5 | 6 | 7 | ### Actuator 8 | > an actuator is used to move or control a mechanism in the environment 9 | 10 | ### Command Message 11 | > a [message](#message) describing an action that should be taken and that the device knows should be acknowledged on another topic once the action is complete. 12 | 13 | ### Device 14 | > an entity that has enough power and compute resources to be a part of an IoT solution. Most often devices have [sensor](#sensor)s or [actuator](#actuator)s attached. 15 | 16 | ### Device Data Density 17 | > a device's data density is: `density = sample frequency * sample size * reporting frequency` 18 | 19 | ### Endpoint 20 | > an endpoint is another name for a device, but often describing a device as an endpoint also implies the device operates on-premises with limited connectivity to the cloud 21 | 22 | ### Industry 4.0 23 | > trend in manufacturing and automation to use IoT technology for connecting production assets to backend IT infrastructure (or cloud services) with the goal to extract data, gain finer grained control to production processes, allow predictions on quality and reduce downtimes ([Wikipedia](https://en.wikipedia.org/wiki/Industry_4.0)) 24 | 25 | ### Limited Production 26 | > effort to validate customer acceptance of the project's edge and cloud software at scale, in order to meet the majority of customer use-cases with a blueprint for mass production. 27 | 28 | ### Message 29 | > a unit of communication in an IoT solution, often containing either sensed or command-related data 30 | 31 | ### Message Broker 32 | > a component of an IoT solution responsible for managing message routing between authorized publishers and subscribers of topics. 33 | 34 | ### Message Topic 35 | > a message topic, aka. *topic*, is a subject associated with a message. Topics are often used for the routing of messages from publishers to subscribers. In this context a message topic should be thought of as a direct map to the pub/sub concept of a subject and as a similar concept to the partial URLs used to describe request/response and REST endpoints. 36 | 37 | ### Ordered Store 38 | > a data store or micro-service which fulfills the role in an IoT solution of ensuring that all records stored within it are in time-series order. 39 | 40 | ### Pilot 41 | > effort performed to test a small set of customer use-cases, device configurations, and/or end-user features in order to identify a business outcome, software architecture, and/or create device blueprints. 42 | 43 | ### Production 44 | > effort to mass produce devices and roll-out the IoT product to the market. 45 | 46 | ### Programmable Logic Controller 47 | > ruggedized computing device or digital computer for industrial applications to monitor and control production/manufacturing processes ([Wikipedia](https://en.wikipedia.org/wiki/Programmable_logic_controller)). 48 | 49 | ### PLC 50 | > abbreviation for [Programmable Logic Controller](#plc). 51 | 52 | ### Prototype 53 | > effort taken for the purpose of education in order to obtain approval by a customer’s management to start the pilot phase. 54 | 55 | ### Rule 56 | > a singular collection of logic and actions executed by a rules engine 57 | 58 | ### Rule Engine 59 | > see Wikipedia ([Business rules engine](https://en.wikipedia.org/wiki/Business_rules_engine)) 60 | 61 | ### Sensor 62 | > a sensor is used to measure some aspect of the environment around it 63 | 64 | ### Trusted User 65 | > Authenticated and authorized end user or installation technician, using a mobile/web app to configure the device in its deployed location. -------------------------------------------------------------------------------- /src/hugo/content/en-us/implementations/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Implementations 3 | chapter: true 4 | pre:   5 | weight: 25 6 | --- 7 | 8 | In this section you will find guidance on how to achieve implementations of patterns for different cloud and system environments. Implementations are the actions that must be followed in order for something to actually happen. Implementations map to [Patterns]({{< ref "/patterns" >}}), but there may be one or more implementations approaches per singular pattern. 9 | -------------------------------------------------------------------------------- /src/hugo/content/en-us/implementations/aws/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: AWS 3 | weight: 10 4 | --- 5 | 6 | Amazon Web Services, or AWS, offers a variety of IoT-specific services to run your production workloads securely in a cost-effective manner at scale. For each of the implementations in this section, these AWS IoT services along with other core AWS services will be used to demonstrate approaches to achieving your workload patterns. 7 | 8 | {{% notice note %}} 9 | This page contains the complete list of implementations per-pattern. If the list grows too long, the navigation menu may be set to hide the categories, however, all implementations can be accessed directly from this page. 10 | {{% /notice %}} 11 | 12 | ## Command 13 | 14 | This is a list of AWS implementations for the _Command_ pattern. 15 | 16 | {{% children page="Command" style="div" depth="2" startdepth="1" description="true" showhidden="true" %}} 17 | 18 | ## Telemetry 19 | 20 | This is a list of AWS implementations for the _Telemetry_ pattern. 21 | 22 | {{% children page="Telemetry" style="div" depth="2" startdepth="1" description="true" showhidden="true" %}} 23 | 24 | ## Telemetry Archiving 25 | 26 | This is a list of AWS implementations for the _Telemetry Archiving_ pattern. 27 | 28 | {{% children page="Telemetry Archiving" style="div" depth="2" startdepth="1" description="true" showhidden="true" %}} 29 | 30 | ## Device Bootstrap 31 | 32 | This is a list of AWS implementations for the _Device Bootstrap_ pattern. 33 | 34 | {{% children page="Device Bootstrap" style="div" depth="2" startdepth="1" description="true" showhidden="true" %}} 35 | -------------------------------------------------------------------------------- /src/hugo/content/en-us/implementations/aws/command/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | hidden: false 3 | # Placeholder to organize patterns - will be hidden when menu navigation becomes untenable 4 | title: "Command" 5 | --- 6 | This is a list of AWS implementations for the _Command_ pattern. 7 | 8 | {{% children style="h4" depth="2" description="true" showhidden="true" %}} -------------------------------------------------------------------------------- /src/hugo/content/en-us/implementations/aws/device_bootstrap/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | hidden: false 3 | # Placeholder to organize patterns - will be hidden when menu navigation becomes untenable 4 | title: "Device Bootstrap" 5 | --- 6 | This is a list of AWS implementations for the _Device Bootstrap_ pattern. 7 | 8 | {{% children style="h4" depth="2" description="true" showhidden="true" %}} -------------------------------------------------------------------------------- /src/hugo/content/en-us/implementations/aws/device_bootstrap/aws-iot-certificate-vending-machine/aws-iot-cvm-architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/content/en-us/implementations/aws/device_bootstrap/aws-iot-certificate-vending-machine/aws-iot-cvm-architecture.png -------------------------------------------------------------------------------- /src/hugo/content/en-us/implementations/aws/device_bootstrap/aws-iot-certificate-vending-machine/aws-iot-cvm-flow-diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/content/en-us/implementations/aws/device_bootstrap/aws-iot-certificate-vending-machine/aws-iot-cvm-flow-diagram.png -------------------------------------------------------------------------------- /src/hugo/content/en-us/implementations/aws/device_bootstrap/fleet_provisioning_trusted_user/fp_by_trasted_user_flow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/content/en-us/implementations/aws/device_bootstrap/fleet_provisioning_trusted_user/fp_by_trasted_user_flow.png -------------------------------------------------------------------------------- /src/hugo/content/en-us/implementations/aws/device_bootstrap/fleet_provisioning_trusted_user/home-page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/content/en-us/implementations/aws/device_bootstrap/fleet_provisioning_trusted_user/home-page.png -------------------------------------------------------------------------------- /src/hugo/content/en-us/implementations/aws/device_bootstrap/fleet_provisioning_trusted_user/sign-in.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/content/en-us/implementations/aws/device_bootstrap/fleet_provisioning_trusted_user/sign-in.png -------------------------------------------------------------------------------- /src/hugo/content/en-us/implementations/aws/device_state_replica/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | hidden: false 3 | # Placeholder to organize patterns - will be hidden when menu navigation becomes untenable 4 | title: "Device State Replica" 5 | --- 6 | This is a list of AWS implementations for the _Device State Replica_ pattern. 7 | 8 | {{% children style="h4" depth="2" description="true" showhidden="true" %}} 9 | -------------------------------------------------------------------------------- /src/hugo/content/en-us/implementations/aws/device_state_replica/device_state_replica1/device_shadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/content/en-us/implementations/aws/device_state_replica/device_state_replica1/device_shadow.png -------------------------------------------------------------------------------- /src/hugo/content/en-us/implementations/aws/software_update/IoT_Jobs/IoT_Jobs_Ref_Diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/content/en-us/implementations/aws/software_update/IoT_Jobs/IoT_Jobs_Ref_Diagram.png -------------------------------------------------------------------------------- /src/hugo/content/en-us/implementations/aws/software_update/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | hidden: false 3 | # Placeholder to organize patterns - will be hidden when menu navigation becomes untenable 4 | title: "Software Update" 5 | --- 6 | This is a list of AWS implementations for the _Software Update_ pattern. 7 | 8 | {{% children style="h4" depth="2" description="true" showhidden="true" %}} -------------------------------------------------------------------------------- /src/hugo/content/en-us/implementations/aws/telemetry/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | hidden: false 3 | # Placeholder to organize patterns - will be hidden when menu navigation becomes untenable 4 | title: "Telemetry" 5 | --- 6 | This is a list of AWS implementations for the _Telemetry_ pattern. 7 | 8 | {{% children style="h4" depth="2" description="true" showhidden="true" %}} -------------------------------------------------------------------------------- /src/hugo/content/en-us/implementations/aws/telemetry_archiving/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | hidden: false 3 | # Placeholder to organize patterns - will be hidden when menu navigation becomes untenable 4 | title: "Telemetry Archiving" 5 | --- 6 | This is a list of AWS implementations for the _Telemetry Archiving_ pattern. 7 | 8 | {{% children style="h4" depth="2" description="true" showhidden="true" %}} -------------------------------------------------------------------------------- /src/hugo/content/en-us/implementations/aws/telemetry_archiving/iot_analytics1/.gitignore: -------------------------------------------------------------------------------- 1 | *.txt 2 | *.py 3 | *.json 4 | -------------------------------------------------------------------------------- /src/hugo/content/en-us/implementations/aws/telemetry_archiving/iot_analytics1/raw_sensor_data_analysis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/content/en-us/implementations/aws/telemetry_archiving/iot_analytics1/raw_sensor_data_analysis.png -------------------------------------------------------------------------------- /src/hugo/content/en-us/patterns/MVC/DeviceUML.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/content/en-us/patterns/MVC/DeviceUML.png -------------------------------------------------------------------------------- /src/hugo/content/en-us/patterns/MVC/MVC-UML.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/content/en-us/patterns/MVC/MVC-UML.png -------------------------------------------------------------------------------- /src/hugo/content/en-us/patterns/MVC/PracMVC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/content/en-us/patterns/MVC/PracMVC.png -------------------------------------------------------------------------------- /src/hugo/content/en-us/patterns/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Patterns" 3 | pre:   4 | weight: 1 5 | --- 6 | 7 | In this section, we cover various _IoT design patterns_. 8 | 9 | Design patterns are common approaches to performing certain operations. In IoT, these patterns cover broad operations such as the life-cycle of devices, or can be more specific such as best practices for device connectivity. 10 | 11 | {{% children style="card" depth="1" description="true" %}} 12 | -------------------------------------------------------------------------------- /src/hugo/content/en-us/patterns/command/command.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/content/en-us/patterns/command/command.png -------------------------------------------------------------------------------- /src/hugo/content/en-us/patterns/device_bootstrap/bootstrap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/content/en-us/patterns/device_bootstrap/bootstrap.png -------------------------------------------------------------------------------- /src/hugo/content/en-us/patterns/device_state_replica/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Device State Replica" 3 | weight: 20 4 | aliases: 5 | - /designs/device_state_replica/ 6 | summary: "A logical representation of a physical device’s reported state, or desired future state." 7 | --- 8 | 9 | ## Challenge 10 | 11 | IoT solutions are expected to interact with devices to perform and track device state changes. There are two ways this challenge manifests. First, even when experiencing intermittent network connectivity the solution needs the device to perform an action that changes the state of a device, and second the device needs the solution to reflect a state change which has occurred on the device. 12 | 13 | Verifying state changes is a pivotal capability necessary for all command and control scenarios. 14 | 15 | ## Solution 16 | 17 | IoT solutions that leverage the Device State Replica pattern are able to manage device-related state changes in a reliable, scalable, and straightforward fashion. 18 | 19 | The Device State Replica pattern describes how to replicate a device's current state, desired future state, and the difference between current and desired states. The Device State Replica pattern is similar to [Command]({{< ref "/patterns/command" >}}) in that both use [messages]({{< ref "/glossary/vocabulary#message" >}}) as triggers for actions and acknowledgement messages when actions are complete. However, the Device State Replica pattern goes farther than the Command pattern, by taking a prescriptive approach to both the management of device-related state and how the state and changes are communicated. Using the Device State Replica pattern allows solutions to know and verify device states and state changes. 20 | 21 | ### Component-to-device State Replica 22 | 23 | An IoT solution should leverage the following pattern when a _component_ of the IoT solution is the source of the desired state change and that change should be replicated in a device. 24 | 25 | ![Component-to-device State Replica](c2d-state.png) 26 | 27 | ### Component-to-device Diagram Steps 28 | 29 | 1. A device reports **initial device state** by publishing that state as a [message]({{< ref "/glossary/vocabulary#message" >}}) to the `state/deviceID/update` [topic]({{< ref "/glossary/vocabulary#message-topic" >}}). 30 | 2. The Device State Replica tracking this device reads the message from the `state/deviceID/update` topic and records the device state in a persistent data store. 31 | 3. A device subscribes to the delta messaging topic `state/deviceID/update/delta` upon which device-related state change messages will arrive. 32 | 4. A component of the solution publishes a desired state message to the topic `state/deviceID/update`and the Device State Replica tracking this device records the desired device state in a persistent data store. 33 | 5. The Device State Replica publishes a delta message to the topic `state/deviceID/update/delta` and the server sends the message to the device. 34 | 6. A device receives the delta message and performs the desired state changes. 35 | 7. A device publishes a message reflecting the new state to the update topic `state/deviceID/update` and the Device State Replica tracking this device records the new state in a persistent data store. 36 | 8. The Device State Replica publishes a message to the `state/deviceID/update/accepted` topic. 37 | 9. A component of the solution can now request the updated and current state form the Device State Replica. 38 | 39 | ### Device-to-component State Replica 40 | 41 | An IoT solution should leverage the following pattern when the _device_ is the source of the state change that should be communicated to components of the IoT solution. 42 | 43 | ![Device-to-component State Replication](d2c-state.png) 44 | 45 | ### Device-to-component Diagram Steps 46 | 47 | 1. A device reports **initial device state** by publishing that state as a message to the update topic `state/deviceID/update`. 48 | 2. A component subscribes to the delta messaging topic `state/deviceID/update/delta` upon which device-related state change messages will arrive. 49 | 3. A device detects that its own state has changed and reports a new state value to the update topic `state/deviceID/update`. 50 | 4. The Device State Replica tracking this device records the desired device state in a persistent data store. 51 | 5. The Device State Replica publishes a delta message to the topic `state/deviceID/update/delta` and the server sends the message to the subscribed component. 52 | 6. A component receives the delta message and uses the changed value as necessary. 53 | 54 | ## Considerations 55 | 56 | When implementing this pattern, consider the following questions: 57 | 58 | #### How can a component simply get the current state of a Device State Replica? 59 | 60 | Using a pub/sub style of interaction a component can listen to the `state/deviceID/get/accepted` and `state/deviceID/get/rejected` topics and then post a message to the `state/deviceID/get` topic. The Device State Replica would then respond with the state on the `state/deviceID/get/accepted` topic. If the Device State Replica exposes a REST API, a component can execute a GET against the `state/deviceID/get` topic and expect a direct response. 61 | 62 | #### How does a Device know what changed while offline? 63 | 64 | The first action a device should take when connecting or re-establishing a connection is to obtain the current desired state and compare that to it's last known state. Ideally the server tracking the Device State Replica can calculate the delta automatically and so a connecting Device would subscribe to `state/deviceID/update/delta` and can then act on any changes that occurred while in an offline state. 65 | 66 | ## Example 67 | 68 | 69 | -------------------------------------------------------------------------------- /src/hugo/content/en-us/patterns/device_state_replica/c2d-state.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/content/en-us/patterns/device_state_replica/c2d-state.png -------------------------------------------------------------------------------- /src/hugo/content/en-us/patterns/device_state_replica/d2c-state.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/content/en-us/patterns/device_state_replica/d2c-state.png -------------------------------------------------------------------------------- /src/hugo/content/en-us/patterns/gateway/algorithms.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/content/en-us/patterns/gateway/algorithms.png -------------------------------------------------------------------------------- /src/hugo/content/en-us/patterns/gateway/gateway.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/content/en-us/patterns/gateway/gateway.png -------------------------------------------------------------------------------- /src/hugo/content/en-us/patterns/iot-atlas-patterns.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/content/en-us/patterns/iot-atlas-patterns.pptx -------------------------------------------------------------------------------- /src/hugo/content/en-us/patterns/protocol-translation/IIoT-Extraction-Architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/content/en-us/patterns/protocol-translation/IIoT-Extraction-Architecture.png -------------------------------------------------------------------------------- /src/hugo/content/en-us/patterns/protocol-translation/ProtocolTranslation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/content/en-us/patterns/protocol-translation/ProtocolTranslation.png -------------------------------------------------------------------------------- /src/hugo/content/en-us/patterns/software_update/software-update.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/content/en-us/patterns/software_update/software-update.png -------------------------------------------------------------------------------- /src/hugo/content/en-us/patterns/telemetry/telemetry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/content/en-us/patterns/telemetry/telemetry.png -------------------------------------------------------------------------------- /src/hugo/content/en-us/patterns/telemetry_archiving/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Telemetry Archiving" 3 | weight: 85 4 | aliases: 5 | - /designs/telemetry_archiving/ 6 | summary: "A device's measurements are saved and made available for use in their original or processed form." 7 | --- 8 | 9 | ## Challenge 10 | 11 | In order to deliver insights, IoT solutions need to support real-time, batch-mode, and predictive analysis of the information generated by the solution. Since each mode of analysis is better informed when leveraging historic data _and_ future approaches to analysis might not yet be understood, IoT solutions must archive data in a manner as flexible as possible to meet future requirements. 12 | 13 | ## Solution 14 | 15 | IoT solutions ensure that the business can obtain the most current and evolving collection of insights by storing raw unprocessed sensor data in a manner supporting the in-order replay of those raw samples. The store-and-replay ability should make historic raw samples appear almost as if the samples were arriving in the normal time-ordered sequence of non-historic samples. 16 | 17 | The Telemetry Archiving design shown in the following diagram can deliver this functionality. 18 | 19 | ![Telemetry Archiving Architecture](archiving.png) 20 | 21 | ### Diagram Steps 22 | 23 | 1. The device obtains a measurement from a sensor operating in an environment remote from the IoT solution. 24 | 2. The device publishes a message to the topic `telemetry/deviceID` containing the measurement. This message is sent via a transport protocol to a protocol endpoint made available by the Server. 25 | 3. The Server may then apply one or more [rules]({{< ref "/glossary/vocabulary#rule" >}}) to messages in order to perform fine-grained routing upon some or all of the [message's]({{< ref "/glossary/vocabulary#message" >}}) measurement data. These rules fan out the messages to at least a processing path **`(4)`** and a raw storage path **`(5)`** 26 | 4. The message processing path performs fundamental calculations necessary by other components of the solution and stores the processed results. 27 | 5. The raw message storage path saves the original raw message in a manner supporting the in-order replay of the original messages. 28 | 6. At some point in the future, a component can read raw messages from a point in time and replay those messages into a `telemetry/deviceID/replay` topic. The solution processes the replayed messages as necessary. 29 | 30 | ## Considerations 31 | 32 | When implementing this design, consider the following questions: 33 | 34 | #### Is the replay of records required for downstream processing? 35 | 36 | Simply put **yes**. Most solutions should assume the answer to this question is "**yes**" since the replay of raw unprocessed sensor data enables the IoT solution to support the evolution of an IoT solutions' insights through: 37 | 38 | - updates to fundamental calculations that support well-performing analysis of historic data, 39 | - the creation of new types of processed records, 40 | - implementation of new unexpected features, and 41 | - the creation of fundamentally new customer perspectives of data. 42 | 43 | An example of this consideration is [below](#replay-data-consideration-example). 44 | 45 | #### Is it important to ensure the order of saved messages? 46 | 47 | If **yes**: `needs detail` 48 | 49 | If **no**: `needs detail` 50 | 51 | ## Examples 52 | 53 | #### Replay Data Consideration Example 54 | 55 | A physical site is being monitored for electrical energy ([kWh](https://en.wikipedia.org/wiki/Kilowatt_hour)) used. Energy sensors are sampled every 30 seconds and the samples are reported into the solution once a minute. As the raw, unprocessed messages arrive they are stored and a "15-minute average" process automatically calculates the 15-minute average of the monitored energy used. The calculated results are stored as records in the solution's processed record repository. These new processed records are then used by additional analytic processes and the IoT solution's user interface. 56 | 57 | At a later date it is clear that the solution's users also want processed records that display the maximum energy used every 5 minutes. To deliver this benefit, a new "5-minute maximum" process is implemented. This new process replays the historic raw unprocessed records and calculates the 5 minute maximum over every historic interval. Once complete, each calculated result is stored as a new type of processed record. 58 | 59 | Without the retention of the raw samples, the solution would be limited to only performing calculations on data that arrives after the "5-minute maximum" feature is implemented in the solution. Most importantly, without the original raw samples, users would be unable to analyze the physical site using the 5-minute feature, prior to the time the feature was implemented. 60 | -------------------------------------------------------------------------------- /src/hugo/content/en-us/patterns/telemetry_archiving/archiving.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/content/en-us/patterns/telemetry_archiving/archiving.png -------------------------------------------------------------------------------- /src/hugo/content/fr-fr/_footer.md: -------------------------------------------------------------------------------- 1 | Copyright (c) 2020 Amazon.com, Inc. ou ses filiales. Tous droits réservés. -------------------------------------------------------------------------------- /src/hugo/content/fr-fr/_header.md: -------------------------------------------------------------------------------- 1 | ![](/iot_atlas_white_150x.png) [IoT Atlas](/) 2 | -------------------------------------------------------------------------------- /src/hugo/content/fr-fr/about/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "A Propos" 3 | weight: 1000 4 | --- 5 | 6 | ## Historique 7 | Publié pour la première fois en novembre 2018, ce site et les domaines [iotatlas.net](http://iotatlas.net) et [iotatlas.io](http://iotatlas.io) sont actuellement gérés par AWS. Le contenu est maintenu et amélioré par les [membres de la communauté IoT Atlas](https://github.com/aws/iot-atlas/graphs/contributors), clients, partenaires et employés AWS. 8 | 9 | ## A propos Amazon Web Services 10 | Amazon Web Services fournit une plate-forme d'infrastructure cloud hautement fiable, évolutive et à faible coût qui alimente des centaines de milliers d'entreprises dans 190 pays à travers le monde. En 2015, AWS a ajouté des fonctionnalités spécifiques à l'Internet des objets (IoT) et a depuis appris à mieux aider les clients. -------------------------------------------------------------------------------- /src/hugo/content/fr-fr/designs/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Designs" 3 | weight: 1 4 | alwaysopen: true 5 | --- 6 | 7 | {{% children style="card" depth="1" description="true" %}} -------------------------------------------------------------------------------- /src/hugo/content/fr-fr/designs/command/command.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/content/fr-fr/designs/command/command.png -------------------------------------------------------------------------------- /src/hugo/content/fr-fr/designs/device_bootstrap/bootstrap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/content/fr-fr/designs/device_bootstrap/bootstrap.png -------------------------------------------------------------------------------- /src/hugo/content/fr-fr/designs/device_state_replica/c2d-state.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/content/fr-fr/designs/device_state_replica/c2d-state.png -------------------------------------------------------------------------------- /src/hugo/content/fr-fr/designs/device_state_replica/d2c-state.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/content/fr-fr/designs/device_state_replica/d2c-state.png -------------------------------------------------------------------------------- /src/hugo/content/fr-fr/designs/gateway/algorithms.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/content/fr-fr/designs/gateway/algorithms.png -------------------------------------------------------------------------------- /src/hugo/content/fr-fr/designs/gateway/gateway.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/content/fr-fr/designs/gateway/gateway.png -------------------------------------------------------------------------------- /src/hugo/content/fr-fr/designs/iot-atlas-patterns.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/content/fr-fr/designs/iot-atlas-patterns.pptx -------------------------------------------------------------------------------- /src/hugo/content/fr-fr/designs/protocol-translation/IIoT-Extraction-Architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/content/fr-fr/designs/protocol-translation/IIoT-Extraction-Architecture.png -------------------------------------------------------------------------------- /src/hugo/content/fr-fr/designs/protocol-translation/ProtocolTranslation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/content/fr-fr/designs/protocol-translation/ProtocolTranslation.png -------------------------------------------------------------------------------- /src/hugo/content/fr-fr/designs/software_update/software-update.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/content/fr-fr/designs/software_update/software-update.png -------------------------------------------------------------------------------- /src/hugo/content/fr-fr/designs/telemetry/telemetry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/content/fr-fr/designs/telemetry/telemetry.png -------------------------------------------------------------------------------- /src/hugo/content/fr-fr/designs/telemetry_archiving/archiving.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/content/fr-fr/designs/telemetry_archiving/archiving.png -------------------------------------------------------------------------------- /src/hugo/content/fr-fr/glossary/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Glossaire" 3 | weight: 500 4 | --- 5 | 6 | {{% children style="card" depth="1" description="true" %}} -------------------------------------------------------------------------------- /src/hugo/content/fr-fr/glossary/personae.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Profil" 3 | --- 4 | Description des profils intéressés dans une solution IoT. 5 | 6 | 7 | ### Le décisionnaire métier 8 | > Le PDG (CEO), Directeur informatique (CTO), Responsable sécurité (CSIO) ou manager de l'équipe Big Data qui est constamment à la recherche de solutions pour résoudre les problèmes de l'entreprise 9 | 10 | ### Développeur d'applications métier 11 | > Un développeur connaissant le cloud qui crée, possède et gère une application ou un service complet, vital pour le fonctionnement efficace des processus critiques d'une entreprise 12 | 13 | ### Ingénieur données 14 | > Une personne techniquement avertie qui sait à la fois comment configurer l'infrastructure de données cloud pour l'entreprise et qui est chargée de s'assurer qu'elle fonctionne correctement 15 | 16 | ### Ingénieur embarqué 17 | > Un développeur hautement spécialisé qui sait écrire, tester et corriger du code qui s'exécute en toute sécurité sur des appareils physiques, souvent limités en ressources 18 | 19 | ### Manager de flotte 20 | > Un développeur connaissant le cloud avec un rôle operationnel, chargé de maintenir une flotte d'appareils à jour avec le firmware actuel et de fonctionner correctement 21 |   22 | ### Ingénieur industriel 23 | > Un spécialiste technique qui construit, dépanne et améliore les processus physiques grâce à l'utilisation d'historiens, de systèmes SCADA et d'automates pour soutenir les opérations de l'entreprise et identifier les inefficacités dans ces mêmes opérations 24 | 25 | ### Analyste des opérations 26 | > Un analyste qui étudie et analyse les données IoT et développe des modèles afin que l'entreprise puisse prendre de bonnes décisions sur les questions commerciales et que les ingénieurs industriels puissent prendre les mesures appropriées 27 | 28 | ### Architecte de sécurité 29 | > Une personne techniquement avertie qui pense comme un pirate informatique afin d'anticiper les mouvements et les tactiques que les intrus utiliseront pour accéder aux systèmes de l'entreprise 30 | 31 | ### Opérations de sécurité 32 | > Une personne techniquement avertie qui s'assure que toute les solutions de sécurité bâtie autour des appareils fonctionne comme prévu et déclenche l'alarme lorsque ce n'est pas le cas 33 | -------------------------------------------------------------------------------- /src/hugo/content/fr-fr/glossary/vocabulary.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Vocabulaire" 3 | --- 4 | Mots et définitions utilisés dans l'IoT Atlas. 5 | 6 | 7 | ### Actuateur 8 | > Un actuateur est utilisé pour déplacer ou contrôler un mécanisme dans l'environnement 9 | 10 | ### Message de commande 11 | > Un [message](#message) décrivant une action qui doit être effectuée et dont l'appareil doit acquitter le statut sur un autre sujet une fois l'action terminée. 12 | 13 | ### Appareil 14 | > Une entité disposant de suffisamment de puissance et de ressources de calcul pour faire partie d'une solution IoT. Le plus souvent, les appareils sont équipés de [capteur](#capteur) ou [d'actuateur](#actuateur). 15 | 16 | ### Densité des données de l'appareil 17 | > la densité de données d'un appareil est: `densité = fréquence d'échantillonnage * taille d'échantillon * fréquence d'envoi` 18 | 19 | ### Point de terminaison 20 | > Un point de terminaison est un autre nom pour un appareil, mais souvent le fait de décrire un appareil comme un point de terminaison implique également que l'appareil fonctionne localement avec une connectivité limitée au cloud 21 | 22 | ### Industrie 4.0 23 | > Tendance dans l'industrie de fabrication et d'automatisation visant à utiliser les technologies IoT pour connecter les actifs de production à l'infrastructure informatique (ou aux services cloud) dans le but d'extraire des données, d'obtenir un contrôle plus fin des processus de production, de permettre des prévisions sur la qualité et de réduire les temps d'arrêts ([Industrie 4.0]( https://en.wikipedia.org/wiki/Industry_4.0)) 24 | 25 | ### Production limitée 26 | > Effort de validation à grande échelle de l'acceptation client des solutions Cloud et locales, afin de répondre à la majorité des cas d'utilisation clients avec un schéma directeur de production de masse. 27 | 28 | ### Message 29 | > Une unité de communication dans une solution IoT, contenant souvent des données détectées ou liées aux commandes. 30 | 31 | ### Courtier de messages 32 | > Un composant d'une solution IoT en charge de la gestion du routage des messages entre les clients autorisés et les clients abonnés à des sujets. 33 | 34 | ### Sujet du message 35 | > Un sujet de message, alias. *sujet*, est un sujet associé à un message. Les sujets sont souvent utilisés pour le routage des messages des clients vers les abonnés. Dans ce contexte, un sujet de message doit être considéré comme une correspondance directe avec le concept de publication / souscription (pub/sub) d'un sujet et comme un concept similaire aux URL partielles utilisées pour décrire le schéma demande/réponse supportant REST. 36 | 37 | ### Base de données chronologique 38 | > Une base de données ou un micro-service qui remplit le rôle dans une solution IoT de garantir que tous les enregistrements stockés dans celui-ci sont dans l'ordre chronologique. 39 | 40 | ### Pilote 41 | > Efforts déployés pour tester un ensemble limités de cas d'utilisation client, de configurations d'appareils et / ou de fonctionnalités d'utilisateur final afin d'identifier un résultat commercial, une architecture logicielle et / ou de créer des plans de fabrication d'appareils. 42 | 43 | ### Production 44 | > Effort de production à l'échelle d'appareils et de déploiement du produit IoT sur le marché. 45 | 46 | ### Automate programmable industriel 47 | > Dispositif informatique ou ordinateur numérique renforcé pour applications industrielles pour surveiller et contrôler les processus de production / fabrication ([Wikipedia](https://fr.wikipedia.org/wiki/Automate_programmable_industriel)). 48 | 49 | ### API 50 | > Abréviation de [Automate programmable industriel](#automate-programmable-industriel). 51 | 52 | ### Prototype 53 | > Efforts consentis à des fins de formation afin d'obtenir l'approbation de la direction d'un client pour démarrer la phase pilote. 54 | 55 | ### Règle 56 | > Une collection singulière de logique et d'actions exécutées par un moteur de règles. 57 | 58 | ### Moteur de règles 59 | > Voir Wikipedia ([Moteur de règles métier](https://fr.wikipedia.org/wiki/Moteur_de_r%C3%A8gles)). 60 | 61 | ### Capteur 62 | > Un capteur est utilisé pour mesurer certains aspects de l'environnement qui l'entoure. -------------------------------------------------------------------------------- /src/hugo/content/zh-cn/_footer.md: -------------------------------------------------------------------------------- 1 | ©2020, Amazon Web Services, Inc. 或其附属公司。保留所有权利。 2 | -------------------------------------------------------------------------------- /src/hugo/content/zh-cn/_header.md: -------------------------------------------------------------------------------- 1 | ![](/iot_atlas_white_150x.png) [IoT Atlas](/) 2 | -------------------------------------------------------------------------------- /src/hugo/content/zh-cn/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "主页" 3 | --- 4 | 5 | {{< atlas-logo >}} 6 | 7 | # 欢迎 8 | 9 | 欢迎来到 IoT Atlas,成功使用物联网的旅程依赖于地图。 10 | 11 | 最成功的物联网(又名 IoT)项目明确定义了业务成果。绝大多数物联网项目都经历了不同阶段,从原型,试点和有限生产 ​​ 到生产,从而实现规模化的业务成果。IoT Atlas 通过解释常用的现代物联网设计的原因,内容和人员来支持您的项目。 12 | 13 | ## 概览 14 | 15 | 目前全球范围内使用的许多物联网设计都被广泛使用并久经考验,但却并不为人熟知。这些设计通常来自成熟领域,如*传感器网络* ,_[控制系统架构](https://en.wikipedia.org/wiki/Control_system)_ ,_[机器对机器网络](https://en.wikipedia.org/wiki/Machine_to_machine)_ 和 _[嵌入式系统开发](https://en.wikipedia.org/wiki/Embedded_system)_ 。但是那些成熟设计并不为人所熟知,导致许多人不得不重新发明轮子以解决问题。对于经验丰富的从业者来说,这个问题进一步复杂化,即使是由来已久的设计,通常也需要进行修改以便考虑到云开发的概念。 16 | 17 | IoT Atlas 是面向物联网解决方案全新和经验丰富从业者提供的教育资源。它更新并扩展了广泛使用的设计,并假设在今天构建“物联网”解决方案几乎总是意味着构建每个解决方案的从业者都可以使用“超大规模的云”。解决方案的开发依赖于超大规模云并不意味着 IoT Atlas 的设计必须连接到云端才能运行。相反,这些设计试图同时利用到长时间在远程环境中本地运行的设备群的优势**和**云的大规模,遍布全球和解决方案敏捷性的优势。这些设计可用于构建高质量的解决方案,并把网络间歇性、长时间和经常中断对其设计组件的影响考虑在内。事实上,这里的设计遵循 IoT 理念:_边缘使云完整(the edge completes the cloud)_ 18 | 19 | 从这个角度出发,我们正在创建一个地图集以便支持我们去理解即使是最复杂的物联网设计的注意事项。 如果您加入我们并[贡献](https://github.com/aws/iot-atlas/blob/main/CONTRIBUTING.md)您的设计理念、注意事项和示例,这将是非常棒的事情。 20 | 21 | ## 组织 22 | 23 | 每个设计都试图涵盖一个概念并深入阐述,并在有需要时,描述当前设计如何与其他设计进行互操作。 当有需要一个新的概念来更好地理解设计时,该概念将在设计中被及时引入,并在[词汇表]({{}})中引用。 24 | 25 | 为了满足发布的要求,IoT Atlas 中一个完整的设计将提供简单的一两句话描述 26 | 、针对该设计所需要应对的物联网挑战的简明描述、简单的不针对某个厂商的架构图和流程、对设计感兴趣并受交付结果所影响的人,以及实施的关键考虑因素。设计的关键考虑因素应被记录在 IoT Atlas 中,并提供链接到相关资料,包括白皮书、博客以及互联网上其他经过审查的相关内容。 27 | 28 | ## 设计的考虑因素 29 | 30 | #### 抽象程度 31 | 32 | 每个设计都会试图在一定的抽象程度上用足够多的细节去描述相关的模式,但不会过多。当然这是一个非常难达到的平衡,并且肯定会在这项工作的整个生命周期内进行调整。 33 | 34 | 一开始时 IoT Atlas 将描述这些设计的实现细节,包括使用哪种通信协议,哪个供应商和哪种编程语言。比如说,[遥测]({{}})设计的描述包括了[CoAP](https://datatracker.ietf.org/doc/html/rfc7252), [MQTT](http://mqtt.org/)和[AMQP](https://www.amqp.org/product/architecture)的细节,熟悉这些协议的人可以理解这个设计的概念而无须或仅须少量的概念转换。这样做是因为无论工具和特定供应商的实施细节如何,设计都应使尽可能多的人受益。但是,特定于供应商的示例是可以帮助那些刚刚开始的人加速理解的。因此,IoT Atlas 将会包括针对设计的示例参考实现,这些实现会比伪代码更为具体而有针对性。 35 | 36 | 一般很难做到将方方面面的知识点都涵盖在设计里,但在这个抽象层面去描述设计的目标是与我们的初衷相符的,即我们希望能够帮助从业者去理解尽可能广的物联网解决方案的设计 37 | 38 | #### 关键概念 39 | 40 | IoT Atlas 里的设计将采用[消息主题]({{< ref "/glossary/vocabulary#消息主题message-topic" >}})的概念来表达设备之间、设备与组件之间和组件与 IoT 解决方案之间详细的消息流。在这个上下文里,消息主题可以被视为对某个[主题](#)的发布/订阅概念,并且与用于描述[请求/返回](#)和[REST](#)端点的相对 URL 的概念类似。 41 | 42 | IoT Atlas 中的设计都会假设设备始终具有针对该解决方案唯一的`deviceID`。当每个设备都具有解决方案唯一 ID 时,每个特定示例会更加清晰,一个明确的设备列表可以被用来实现一个支持多设备的设计。当设备列表对设计至关重要时,它将会被列出。 43 | 44 | #### 约定 45 | 46 | 最后,每个设计都遵循一些约定。当描述数据或代码相关概念的例子时,`monospace`字体会被使用。当一个词或概念对设计至关重要或作为即时定义时,**粗体**字体会被使用。当用代码块来描述或强化一个概念时,该块会至少被写成等宽的`伪代码`。随着时间的推移,我们希望为每个设计提供针对各种语言和技术的示例,这些示例是被贡献进来并索引的。 47 | 48 | ## 团队 49 | 50 | 目前,IoT Atlas 的核心维护者是[Brett Francis](https://github.com/brettf), 51 | [Gavin Adams](https://github.com/gadams999)和 52 | [Craig Williams](https://github.com/typemismatch).我们非常兴奋把这些设计发布出来,因此我们可以与你一起加速 IoT 的进程 53 | -------------------------------------------------------------------------------- /src/hugo/content/zh-cn/about/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "关于" 3 | weight: 1000 4 | --- 5 | 6 | ## 历史 7 | 本站点[iotatlas.net](http://iotatlas.net)和[iotatlas.io](http://iotatlas.io)首次发布于2018年11月,目前由AWS维护。网站内容由IoT Atlas[社区成员](https://github.com/aws/iot-atlas/graphs/contributors)、客户、合作伙伴和AWS员工维护和优化。 8 | 9 | ## 关于Amazon Web Services 10 | 11 | Amazon Web Services提供高度可靠,可扩展,低成本的云基础架构平台,为全球190个国家/地区的数十万家企业提供支持。2015年,AWS增加了特定的物联网(IoT)功能,并一直在学习如何更好地帮助客户。 -------------------------------------------------------------------------------- /src/hugo/content/zh-cn/designs/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "设计" 3 | weight: 1 4 | alwaysopen: true 5 | --- 6 | 7 | {{% children style="card" depth="1" description="true" %}} 8 | -------------------------------------------------------------------------------- /src/hugo/content/zh-cn/designs/command/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "命令" 3 | weight: 11 4 | --- 5 | 6 | 可靠地要求设备执行单个操作并确认状态的一个请求实体。 7 | 8 | 9 | 10 | ## 挑战 11 | 12 | IoT 解决方案应该能以这样的方式与设备进行交互:解决方案或是使用该解决方案的人,可以可靠地要求设备执行某个动作。更进一步的,这样的交互需要在会出现间隙性中断的网络环境中进行,并通常需要使用资源非常有限的设备。 13 | 14 | ## 解决方案 15 | 16 | IoT 解决方案使用"命令"设计来要求设备执行操作,并通过利用一个简单的概念确保可靠的交互:除非被确认为成功,否则任何请求的操作都不会被视为成功。 17 | 18 | 下图中显示的"命令"设计可以提供此功能: 19 | 20 | ![Command Design](command.png) ([PPTx](/iot-atlas-patterns.pptx)) 21 | 22 | ### 步骤说明 23 | 24 | 1. [设备]({{< ref"/glossary/vocabulary#设备device" >}})将自身配置为与协议端点通信,以便可以发送和接收命令消息。 25 | 2. 解决方案的一个组件发布针对一个或多个设备的[命令消息]({{}}) 26 | 3. 服务器使用协议端点将命令消息发送到每个先前配置的设备。 27 | 4. 完成命令的请求操作后,设备通过协议端点向服务器发布命令完成消息。 28 | 29 | ## 考虑点 30 | 31 | 值得注意的是,"命令"设计并不是“反向遥测”。相反,"命令"设计解决了需要在远程位置运行的设备上可靠地触发操作的解决方案所固有的挑战。 32 | 33 | 实施此设计时,请考虑以下问题: 34 | 35 | #### 您是否首先考虑了"设备状态副本"设计 36 | 37 | 由于命令的执行实际上导致设备中状态的改变,因此"[设备状态副本]({{}})"设计是在 IoT 解决方案中执行命令的首选方法。在"设备状态副本"设计不适合或超过某些实现限制的情况下,请考虑"命令"设计并定制化实现控制。 38 | 39 | #### 该解决方案如何跟踪每个设备的命令进度 40 | 41 | 每个命令都应具有解决方案唯一的类型,并且每个命令消息应包含全局唯一的消息 ID。命令消息的 ID 允许解决方案跟踪不同命令的状态,通过命令类型可以诊断不同命令类别的潜在问题。消息应该是幂等的,不允许在不知道设备*和*请求者的情况下被丢失或重复。 42 | 43 | #### 解决方案中的某些命令运行时间是否明显超过正常范围 44 | 45 | 当某些命令的运行时间超过正常范围时,简单的返回“SUCCESS”或“FAILURE”命令完成消息是不足够的。相反,解决方案应该至少利用三个命令状态:“SUCCESS”,“FAILURE”和“RUNNING”。设备应在预期的时间间隔内返回“RUNNING”,直到命令完成。通过使用在预期间隔上报告的“RUNNING”状态,解决方案可以确定长时间运行的命令在什么时候事实上已经失败了。 46 | 47 | #### 特定类型的命令是否需要人为授权 48 | 49 | 当解决方案中的命令需要人为批准才能在设备执行操作之前,应该在解决方案中添加人为工作流(human-workflow)组件。该组件将拦截特定类型的命令,并在将它们实际发送到设备之前将它们排队等待人工批准。 50 | 51 | #### 是否需要将某种类型的命令回滚到先前的状态 52 | 53 | 如果解决方案有一些可能需要回退的命令,那么大部分时候从解决方案本身来管理回滚是更容易的,而不是期望每个设备理解并记住回滚注意事项。例如,向设备发送命令以便将执行器(actuator)从当前报告的位置`0`°移动到 `45`°的位置。设备成功执行了该命令。在稍后的时刻,解决方案要求设备返回到先前的状态,先前的状态通常更容易在解决方案本身中进行跟踪,而不是期望每个设备跟踪其先前的状态。这种情况的回滚将由解决方案来执行,即向设备发送命令以将其位置改变为`0`°。 54 | 如果在没有与服务器连接的情况下也需要回滚的话,那解决方案可以利用[网关]({{}})来记录设备的先前状态并执行基于这些值的回滚。 55 | 56 | ## 示例 57 | 58 | ### 可靠传输上的简单的请求/响应 59 | 60 | 组件向设备发出启动电机的请求,并通过服务质量(Quality of Service)以保证命令传达。 61 | 62 | #### 组件向目标设备发送命令 63 | 64 | 组件将命令请求消息发送到设备订阅的`commands/deviceID`主题: 65 | 66 | ```json 67 | { 68 | "cmd": "MOTOR_1_ON", 69 | "tid": "CAFED00D", 70 | "status": "REQUEST" 71 | } 72 | ``` 73 | 74 | 该组件同时跟踪消息的事务 ID “CAFED00D”,该消息已发布但未完成。 75 | 76 | #### 设备处理消息 77 | 78 | 设备从主题`commands/deviceID`接收消息,启动`motor 1`,并对组件订阅的主题`commands/deviceID/ack`进行确认响应。该组件在一段时间后收到以下确认: 79 | 80 | ```json 81 | { 82 | "tid": "CAFED00D", 83 | "status": "SUCCESS" 84 | } 85 | ``` 86 | 87 | #### 设备与组件完成命令(事务)处理 88 | 89 | 设备不再跟踪命令请求。组件将`SUCCESS`值映射到`CAFED00D'的事务 ID,并从未完成的请求列表中删除该事务,表示该命令已完成。 “FAILURE”的结果可能表示需要调查物理设备问题。 90 | 91 | ### 与离线或不可用设备相关的事务 92 | 93 | 组件向设备发出请求以启动电机,但设备处于离线状态 94 | 95 | #### 组件向不可用设备发送命令 96 | 97 | 组件将命令请求消息发送到设备订阅的`commands/deviceID`主题: 98 | 99 | ```json 100 | { 101 | "cmd": "MOTOR_1_ON", 102 | "tid": "CAFED00D", 103 | "status": "REQUEST" 104 | } 105 | ``` 106 | 107 | 该组件还跟踪“CAFED00D”的消息事务 ID,该消息已发布且未完成。 **设备处于离线状态,但未收到消息。** 108 | 109 | #### 超时并重新发送命令 110 | 111 | 在一段设定的时间之后,组件将基于线性或退避(back-off)时间段,并使用*相同的事务 ID*重新发送命令请求消息,同时跟踪重试状态。经过一定次数的重试后,组件将确定设备没有收到命令,或者无法回复,并采取适当的措施。 112 | -------------------------------------------------------------------------------- /src/hugo/content/zh-cn/designs/device_bootstrap/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "设备引导" 3 | weight: 15 4 | --- 5 | 6 | 7 | 8 | 未注册设备变为已注册状态并在 IoT 解决方案中具有完整的功能 9 | 10 | 11 | 12 | ## 挑战 13 | 14 | IoT 解决方案需要设备执行某种特权升级,以便在该解决方案中从零特权转变为完全注册且可操作的设备。从*零*特权到*完整*特权的转变是需要有独立且有计划的步骤。用于获得特权的每个步骤本身必须遵循最小特权的方法。此外,可能有现有的身份认证与权限系统需要包含在 IoT 解决方案中。 15 | 16 | ## 解决方案 17 | 18 | 通过将这些挑战分解为一个跨越两个不同概念的流程,IoT 解决方案可以很好的应对设备引导所带来的挑战。这两个概念是:*注册机构(registration authority)*和*权限提升器(privilege escalator)* 19 | 20 | **注册机构**是一个验证从设备接收的证书,令牌或共享凭证的组件。该组件返回供设备使用的解决方案凭证。注册机构至少是一组策略,规定未注册设备可以进行订阅或发布到服务器上定义主题的能力。 21 | 22 | **权限提升器**允许具有短期低权限凭据的设备在获得解决方案中的更高权限之前,可以共享更多关于自身的属性或展示正确的行为。如果解决方案需要,权限提升流程可以增加一个单独的权限提升步骤来进行人工批准 23 | 24 | 虽然有些情况下具体实现可能会将注册与获得完全权限这两者合在一起,但如这个设计所做的将这些挑战分解,每个挑战可以使用使用新系统或遗留系统来明确解决。 25 | 26 | 下图中显示的"设备引导"设计可以提供此功能. 27 | 28 | ![Device Bootstrapping](bootstrap.png) 29 | 30 | ### 步骤说明 31 | 32 | 1. 设备使用共享凭证或令牌向注册机构注册。 33 | 2. 注册机构验证共享凭证或令牌的真实性,注册设备,并将短期凭证返回给设备。 34 | 3. 设备使用短期凭据联系权限提升器并共享有关自身的更多信息 35 | 4. 权限提升器确定设备的类型,并确定是否应在 IoT 解决方案中授权设备。如果设备已获得授权,则权限提升器将返回长期凭证,例如 IoT 解决方案中与设备用途相对应的并与权限相关联的设备证书。 36 | 5. 设备使用长期权限并通过服务器的协议端点订阅并发布到设备的[消息主题]({{}})。 37 | 38 | ## 考虑点 39 | 40 | 实施此设计时,请考虑以下问题: 41 | 42 | #### 设备的制造过程是否会在设备上创建并放置初始令牌? 43 | 44 | 如果**不是**,则设备必须具有在设备制造后接收安全令牌或[证书](https://en.wikipedia.org/wiki/Public_key_certificate)的机制。这种机制可能涉及通过移动应用程序进行蓝牙低功耗([BLE](https://zh.wikipedia.org/wiki/%E8%93%9D%E7%89%99%E4%BD%8E%E5%8A%9F%E8%80%97))连接来配置设备。这种机制具有额外的优点,即能够在设备登录到移动应用程序时立即将设备关联用户。 45 | 46 | 如果**是 - 使用令牌/共享凭证**,在这种情况下,非常重要的一点是使用初始令牌或共享凭证来获取注册到解决方案所需要的最小权限。一旦注册机构验证了初始令牌或共享凭证,此设计的其余步骤需要被遵循。 47 | 48 | 如果**是 - 使用证书**,则可以以安全的方式制造设备,注册机构也可以弱化甚至不需要了。这说起来容易做起来难,因为许多制造过程都是有意与云断开的。但无论如何,由于制造商引入密钥从而完全去掉注册机构,客户体验和整体系统的简化性都会受益。 49 | 50 | #### 用户如何绑定设备? 51 | 52 | 在几乎所有设备预配置的情况下,我们都需要将设备与用户或已有系统的设备配置文件相关联。这涉及从设备收集附加信息以完成设备注册。收集这些附加信息可以通过以下一种或多种方式完成: 53 | 54 | - 通过在制造过程中使用[证书](https://en.wikipedia.org/wiki/Public_key_certificate)可以完成设备的配置,并且可以将这些证书预先映射到设备配置文件。这对于具有大量已知设备的解决方案来说是常见的。 55 | - 设备在与注册机构通信期间报告其型号和序列号,该信息可以预先映射到设备配置文件。 56 | - 设备使用 BLE 或其他本地通信形式来接收有关其身份的信息,例如用户资料。通过移动应用程序处理是最常见的设备配置形式。本地通信可以与制造期间安装证书两者相结合,使得用户关联和注册过程能够在单个步骤中完成。 57 | 58 | #### 是否使用设备证书? 59 | 60 | 尽管在解决方案中尝试使用证书配置每个设备的想法可能令人生畏,但它是迄今为止配置设备最安全的方式。建立相互身份验证对于防止类似[中间人](https://zh.wikipedia.org/wiki/%E4%B8%AD%E9%97%B4%E4%BA%BA%E6%94%BB%E5%87%BB) 攻击这样的威胁是非常重要的。引导设备时,证书应始终是设备标识的首选。 61 | 62 | #### 注册机构是否需要支持与现有客户授权方案的进行定制化集成? 63 | 64 | 如果**是**,则可以使用应用程序编程接口([API](https://zh.wikipedia.org/wiki/%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E6%8E%A5%E5%8F%A3)) 在现有客户授权方案前面实现本设计的注册机构步骤。然后,此 API 可以在利用客户现有解决方案的同时执行注册机构的相关工作。 65 | 66 | ## 示例 67 | 68 | 69 | -------------------------------------------------------------------------------- /src/hugo/content/zh-cn/designs/device_state_replica/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "设备状态副本" 3 | weight: 20 4 | summary: "物理设备报告状态或所需未来状态的逻辑表示。" 5 | --- 6 | 7 | ## 挑战 8 | 9 | IoT 解决方案需要与设备进行交互以执行并跟踪设备状态变化。这种挑战有两种表现方式。首先,即使在经历间歇性网络中断时,IoT 解决方案也需要设备执行改变状态的动作。其次,设备需要 IoT 解决方案来反映设备上发生的状态变化。 10 | 11 | 验证状态变化是所有命令和控制场景下所必需的关键功能。 12 | 13 | ## 解决方案 14 | 15 | 利用了"设备状态副本“设计的 IoT 解决方案能够以可靠,可扩展且直接的方式管理与设备相关的状态变化。 16 | 17 | "设备状态副本"设计描述了如何复制设备的当前状态,期望的未来状态以及当前状态和期望状态之间的差异。"设备状态副本"设计类似于"[命令]({{}})"设计,因为它们都使用[消息]({{}})作为动作触发器和动作完成的确认消息。但是,设备状态副本设计比命令设计更进一步,通过规范化的方式来进行设备相关状态的管理以及状态和变化的通信。使用"设备状态副本"设计允许 IoT 解决方案了解并验证设备状态和状态变化。 18 | 19 | ### 组件到设备的状态副本 20 | 21 | 当 IoT 解决方案的某个*组件*是期望状态变化的发起者,而且变化需要被复制到设备端时,那以下的设计可以为 IoT 解决方案所用: 22 | 23 | ![Component-to-device State Replica](c2d-state.png) 24 | 25 | ### 组件到设备的步骤说明 26 | 27 | 1. 设备以[消息]({{}})的方式在`state/deviceID/update` [主题]({{< ref "/glossary/vocabulary#消息主题message-topic" >}}) 上发布状态,从而报告“初始设备状态” 28 | 29 | 2. 追踪这个设备的"设备状态副本"会从`state/deviceID/update`主题读取消息,并将设备状态保存在一个持久化的数据存储中 30 | 31 | 3. 设备订阅差异消息主题`state/deviceID/update/delta`,设备相关的状态变更消息会发送到该主题 32 | 33 | 4. IoT 解决方案中的某个组件会将期望状态消息发布到主题`state/deviceID/update`,追踪这个设备的设备状态副本会将期望设备状态记录在一个持久化的数据存储中 34 | 35 | 5. 设备状态副本会在主题`state/deviceID/update/delta`上发布一个差异消息,服务器将该消息发送给设备 36 | 37 | 6. 设备获取差异消息,并进行期望状态的变更 38 | 39 | 7. 设备发送一个反映新状态的消息到更新主题`state/deviceID/update`,同时追踪这个设备的设备状态副本会把新状态记录在持久化数据存储中 40 | 41 | 8. 设备状态副本发布消息到主题`state/deviceID/update/accepted` 42 | 43 | 9. IoT 解决方案中的组件可以从设备状态副本中请求到更新后且是当前的状态 44 | 45 | ### 设备到组件的状态副本 46 | 47 | 当*设备*是状态变更的发起者,而且状态变更需要通知到 IoT 解决方案中的组件时,以下设计可以为 IoT 解决方案所用: 48 | 49 | ![Device-to-component State Replica](d2c-state.png) 50 | 51 | ### 设备到组件的步骤说明 52 | 53 | 1. 设备以消息的方式在更新主题`state/deviceID/update`上发布状态,从而报告“初始设备状态” 54 | 55 | 2. 组件订阅差异消息主题`state/deviceID/update/delta`,与设备相关的状态变更消息会发布到该主题上 56 | 57 | 3. 设备检测到自身状态发生变化,并在更新主题`state/deviceID/update`上报告新的状态值 58 | 59 | 4. 追踪该设备的设备状态副本会将期望设备状态记录在一个持久化的数据存储中 60 | 61 | 5. 设备状态副本在主题`state/deviceID/update/delta`上发布差异消息,服务器将该消息发送给订阅该主题的组件 62 | 63 | 6. 组件接受到差异消息,根据需要使用变化后的值 64 | 65 | ## 考虑点 66 | 67 | 当实现这个设计时,需要考虑如下问题: 68 | 69 | #### 组件如何简单的获取设备状态副本的当前状态 70 | 71 | 组件可以采用发布/订阅模式,监听`state/deviceID/get/accepted`和`state/deviceID/get/rejected`两个主题,并发送消息到`state/deviceID/get`主题。设备状态副本会在`state/deviceID/get/accepted`主题上回复状态。如果设备状态副本对外暴露一个 REST 接口,那组件可以对`state/deviceID/get`主题发起一个 GET 操作并获得直接的响应。 72 | 73 | #### 设备如何知道在其离线期间发生的变化? 74 | 75 | 当设备连接或重连时,第一个应该采取的动作是获取当前期望状态并与其已最后已知状态进行对比。理想情况下监控设备状态副本的服务器应该可以自动计算出差异值,因此发起连接的设备需要订阅`state/deviceID/update/delta`主题,以便可以应对其离线状态时发生的变化。 76 | 77 | ## 示例 78 | 79 | 80 | -------------------------------------------------------------------------------- /src/hugo/content/zh-cn/designs/gateway/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "网关" 3 | weight: 50 4 | --- 5 | 6 | 7 | 8 | 充当本地设备之间,以及设备和云之间的中介的设备。 9 | 10 | 11 | 12 | ## 挑战 13 | 14 | IoT 解决方案中的[端点]({{< ref "/glossary/vocabulary#端点endpoint" >}})通常不具备直接连接互联网的能力,或者是运行在无法直接访问互联网的网络中。即使存在这些限制,从端点获取数据并与这些端点进行交互需要有相应的连通机制 15 | 16 | ## 解决方案 17 | 18 | IoT 解决方案使用"网关"设计来克服端点通常遇到的限制。通过这样的设计网关可以实现与端点的可靠及安全的通信 19 | 20 | 如下图所示的"网关"设计可以提供这样的功能。图中服务器(Server)是运行在云中。网关(Gateway)则运行在设备可以访问的网络中 21 | 22 | ![Gateway Design](gateway.png) 23 | ([PPTx](/iot-atlas-patterns.pptx)) 24 | 25 | 上图中的两个设计均提供一个网关端点,其使用与服务器相同类型的协议端点(Protocol Endpoint)。在*上行*和*下行*网关设计图中,网关是连接到服务器的 26 | 27 | ### 上行网关(即"北向") 28 | 29 | 1. "上行"网关设计是用来复制上行消息;在这个设计图中,`telemetry/deviceID`主题上的消息是来自于设备,这些消息会被复制到服务器同样的主题里 30 | 2. 设备发布包含测量值的消息,通过传输协议来到网关提供的本地协议端口 31 | 3. 网关接收到消息 32 | 4. 网关将消息发布到服务器中同样的主题 33 | 34 | - 如果网关无法成功将消息发送至服务器,则会以上行消息[方法](#应该使用什么方法来存储后续需要发送的消息)对处理该消息 35 | 36 | 5. 服务器接收到消息 37 | 38 | ### 下行网关(即"南向") 39 | 40 | 1. 下行网关是用来监听服务器并复制下行的消息; 在设计图中,来自服务器的消息在`commands/deviceID`主题并且会被复制到监听同样主题的设备 41 | 2. 服务器通过传输协议端点向网关发布消息 42 | 3. 网关接收到消息 43 | 4. 网关向监听同样主题的服务发布消息 44 | 45 | - 如果网关无法成功将消息发送到设备,则消息会以下行消息[方法](#应该使用什么方法来存储后续需要发送的消息)处理该消息 46 | 47 | 5. 设备接收消息 48 | 49 | ## 考虑点 50 | 51 | 当实现这个设计时,需要考虑如下问题: 52 | 53 | #### 为什么网关在某个方向上应该只显式的复制特定的主题? 54 | 55 | `待答` 56 | 57 | #### 在与设备间的网络不可用时,网关该如何处理数据? 58 | 59 | 简单的回答是网关需要一种*下行消息处理方法*,将数据保存在网关上直至他们可以被发送给设备。不幸的是,简单的答案掩盖了更为复杂的现实。需要确定的一个关键事情是正确的方法在网络不可用时处理下行消息 60 | 61 | #### 在与服务器的网络不可用时,网关该如何处理数据? 62 | 63 | 简单的回答是网关需要一种*上行消息处理方法*,将数据保存在网关上直至他们可以被发送给服务器。不幸的是,简单的答案掩盖了更为复杂的现实。需要确定的一个关键事情是正确的方法在网络不可用时处理上行消息 64 | 65 | #### 应该使用什么方法来存储后续需要发送的消息? 66 | 67 | 通常来说,网关上消息的本地存储和处理将遵循先进先出(即 **FIFO**)方法。话虽如此,但答案*可能*会有所不同,这具体取决于消息中实际包含的数据。在这种情况下,通过确定网关日志记录方法对实际报告数据的影响,可以帮助我们避免以后出现的问题。 68 | 69 | 如下图所示,通常考虑三种类型的方法:**先进先出(FIFO)**, **剔除(Culling)** 和 **聚合(Aggregate)**。 70 | 71 | ![Message Processing Algorithms](algorithms.png) 72 | 73 | **先进先出(FIFO)** – 这种[方法](https://zh.wikipedia.org/wiki/%E5%85%88%E9%80%B2%E5%85%88%E5%87%BA)通常实现起来比较直接,在多种场景下都很有用。在这种方法的消息处理图中可以看到,数据从左侧到达,当本地存储空间满后,数据从右侧离开。具体数据的例子包括:维护测量数据和通用的遥测数据 74 | 75 | **剔除(Culling)** - 这种方法对于在丢失曲线细节时保留绝对点值非常有用。在消息处理图中,此方法的数据从左侧到达。一旦本地存储中已存放超过*剔除点*的数据,则一些清除逻辑会移除出其他所有样本(或每`N`个样本)。具体数据的例子包括: [千瓦(kW)](https://zh.wikipedia.org/wiki/%E7%93%A6%E7%89%B9#%E5%8D%83%E7%93%A6), [安培(Amperage)](https://zh.wikipedia.org/wiki/%E7%94%B5%E6%B5%81), [伏特(Voltage)](https://zh.wikipedia.org/wiki/%E9%9B%BB%E5%A3%93), etc 76 | 77 | **聚合(Aggregate)** – 当曲线的详细形状不如一段时间内的最小值,最大值,平均值和总和值那么重要时,此方法很有用。在消息处理图中,此方法的数据从左侧到达。一旦本地存储存放超过*聚合点*数据时,一些清除逻辑就对存储的值执行聚合。数据的例子包括: [千瓦时(kWh)](https://zh.wikipedia.org/wiki/%E5%8D%83%E7%93%A6%C2%B7%E6%99%82), [日照时间](https://en.wikipedia.org/wiki/insolation), [流](https://en.wikipedia.org/wiki/Flow_measurement), [CPU 时间](https://en.wikipedia.org/wiki/CPU_time), [温度](https://zh.wikipedia.org/wiki/%E6%B8%A9%E5%BA%A6), [风速](https://zh.wikipedia.org/wiki/%E9%A2%A8%E9%80%9F)等等. 78 | 79 | ## 示例 80 | 81 | 82 | -------------------------------------------------------------------------------- /src/hugo/content/zh-cn/designs/software_update/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "软件更新" 3 | weight: 70 4 | --- 5 | 6 | 7 | 8 | 要求设备获取新软件,对自身进行更新并确认完成。 9 | 10 | 11 | 12 | ## 挑战 13 | 14 | IoT 解决方案需要为设备提供更新自己软件的机制。无需人工干预的软件更新的支持,对于将解决方案扩展到数百万台设备以及提供出色的客户体验都是至关重要。然而,以安全、可扩展和可靠的方式实现大量设备的全量更新需要可扩展以满足设备负载的解决方案、弹性的命令机制以及可以跟踪整个设备组状态的方法。 15 | 16 | ## 解决方案 17 | 18 | 利用["命令"]({{}})和["设备状态副本"]({{}})设计的 IoT 解决方案,加上一个全球可用且可扩展的存储解决方案,足以应对大量设备进行软件更新时所带来的所有挑战。 19 | 20 | 如下图所示的软件更新的模式可以提供这样的功能。 21 | 22 | ![Software Update](software-update.png) 23 | 24 | ### 步骤说明 25 | 26 | 1. 设备订阅差异[消息主题]({{< ref "/glossary/vocabulary#消息主题message-topic" >}}) `state/deviceID/update/delta` 并从设备状态副本接收到设备相关的状态变化消息。 27 | 2. 应用程序获取新的软件更新包并将其放置在一个可被生产设备访问到的存储解决方案中。 28 | 3. 应用程序确认需要接收新软件包的设备,并向设备的主题`state/deviceID/update`发布一条期望状态消息。该消息包含一个软件更新的 URL,该 URL 与设备当前软件版本的 URL 是不同的 29 | 4. 追踪该设备的设备状态副本会将期望设备状态记录在一个持久化数据存储中,并向主题`state/deviceID/update/delta`发布一条差异消息,该消息会被发送到设备。 30 | 5. 设备获取到差异消息,该消息做为“软件更新”的命令控制消息。具体而言,该消息传递了当前软件版本 URL 和新 URL 之间的变化 31 | 6. 设备从差异消息获取到新的软件更新 URL 32 | 7. 设备下载新版本软件并在本地进行软件更新 33 | 8. 设备向更新主题`state/deviceID/update`发布一条确认消息,反馈设备当前所使用的软件版本。追踪该设备的软件状态副本会将新状态记录在一个持久化数据存储中。 34 | 9. 设备状态副本向主题`state/deviceID/update/accepted`发布一条消息,确认软件更新已经完成。 35 | 36 | ## 考虑点 37 | 38 | 当实现这个设计时,请考虑如下问题: 39 | 40 | #### 目标设备如何从给定 URL 获取软件升级包, 并确保只有该设备能够获取? 41 | 42 | 通过使用**预签名 URL**或者**临时凭证**,解决方案可以确保只有需要进行软件更新的目标设备才能获取软件更新包。这两种方法有不同的考虑点。 43 | 44 | **预签名 URL** - 预签名 URL 的好处是它能够限制设备只能在一段时间内进行软件更新,或是设备需要有特定公共 IP 地址才能下载软件更新。当下载软件更新包的设备没有可公开解析的 IP 地址时,这种方法的不利之处就会显现出来。如果没有公开可解析的 IP 地址,解决方案只能在软件更新上设置时间限制。解决方案的实践者可能会或者可能不会认为这是可接受的。 45 | 46 | **临时凭证** - 设备与解决方案进行交互,以获取一个仅有存储访问权限的临时凭证以便下载软件更新。使用临时凭证的好处是只有拥有该凭证的设备才能访问软件更新,即使该设备没有可公开解析的 IP 地址也是如此。这种方法稍微不好的地方在于设备和解决方案会变得更加复杂,因为设备需要经过一个单独的流程来获取临时凭证。 47 | 48 | ## 示例 49 | 50 | ### 从设备端视角看软件更新 51 | 52 | 设备在 IoT 解决方案中通过[设备状态副本]({{}})获取并执行“更新”命令的逻辑示例如下。具体而言,设备将获得新软件,使用该软件执行更新,并确认完成。 53 | 54 | #### 设备对更新命令消息进行准备 55 | 56 | 设备通过订阅一个消息监听函数,处理来自`state/deviceID/update/delta`主题的[命令消息]({{}}) 57 | 58 | ```python 59 | def message_listener(message): 60 | # ..do something with 'message'.. 61 | 62 | def main(): 63 | # subscribe the message listener function to the topic 64 | sub = topic_subscribe('state/deviceID/update/delta', message_listener) 65 | # now wait until the program should end 66 | wait_until_exit() 67 | ``` 68 | 69 | #### 设备从消息中读取下载 URL 并下载软件更新 70 | 71 | 过了一段时间后,设备收到一个差异消息,该消息是'软件更新'命令消息 72 | 73 | ```python 74 | def message_listener(message): 75 | # parse the message from raw format into something the program can use 76 | msg = parse_message(message) 77 | # determine if the message is an update command type 78 | if msg is UPDATE_COMMAND: 79 | # get the globally unique job ID from the command message 80 | job_id = msg.get_job_id() 81 | # read the software update URL from the command message 82 | url = msg.read_value('softwareURL') 83 | # download the software from the given URL 84 | software = download_software(url) 85 | # ..and apply the software update triggered by the specific job ID 86 | apply_software(software, job_id) 87 | ``` 88 | 89 | #### 设备应用软件更新并发布确认消息 90 | 91 | 设备执行更新并将执行更新的结果发布到`state/deviceID/update`主题上以完成对命令的确认 92 | 93 | ```python 94 | def apply_software(software, job_id): 95 | # do the local, device-specific work to apply the software 96 | # and produce a result value of SUCCESS or FAILURE 97 | 98 | if result is SUCCESS: 99 | # make a success message 100 | message = 'jobID:' + job_id + " SUCCESS" 101 | else: 102 | #make a failure message 103 | message = 'jobID:' + job_id + "FAILURE" 104 | 105 | # the topic used to publish the acknowledge message 106 | topic = 'state/deviceID/update' 107 | # ...and finally, publish the acknowledge message 108 | message_publish(topic, message, quality_of_service) 109 | ``` 110 | -------------------------------------------------------------------------------- /src/hugo/content/zh-cn/designs/telemetry_archiving/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "遥测存档" 3 | weight: 85 4 | --- 5 | 6 | 7 | 8 | 保存设备的测量值,并以原始或处理过的形式使用。 9 | 10 | 11 | 12 | ## 挑战 13 | 14 | 为了提供洞察力,IoT 解决方案需要支持对其产生的信息进行实时、批处理和预测分析。在利用历史数据时,每种分析模式都能获得更好的信息。_同时_,未来还有目前未被理解的分析方法,因此 IoT 解决方案必须以尽可能灵活的方式存档数据,以满足未来的需求. 15 | 16 | ## 解决方案 17 | 18 | IoT 解决方案存储原始未处理过的传感器数据,并支持对这些原始样本进行有序的重放,从而确保业务可以获得最新且不断发展的洞察集合。存储和重放能力(store-and-replay)应使历史原始样本看起来几乎就像样本按正常时间序列到达一样。 19 | 20 | 下图中显示的"遥测存档"设计可以提供此功能。 21 | 22 | ![Telemetry Archiving Architecture](archiving.png) 23 | ([PPTx](/iot-atlas-patterns.pptx)) 24 | 25 | ### 步骤说明 26 | 27 | 1. 该设备从远离 IoT 解决方案的环境中运行的传感器获得测量值。 28 | 2. 设备向包含测量值的主题`telemetry/deviceID`发布消息。此消息通过传输协议发送到服务器提供的协议端点。 29 | 3. 服务器可以对消息应用一条或多条[规则]({{< ref "/glossary/vocabulary#规则rule" >}}),从而对部分或全部[消息]({{< ref "/glossary/vocabulary#消息message" >}})的测量值数据执行细粒度的路由。这些规则会将消息至少分发到一个处理路径**`(4)`**和一个裸存储路径**`(5)`**。 30 | 4. 消息处理路径按照解决方案中其他组件的需求进行基本的计算,并存储处理后的结果。 31 | 5. 原始消息存储路径将原始消息保存下来,并支持对原始消息的有序重放 32 | 6. 未来组件可以从某个时间点开始读取原始消息,并且将消息重放至`telemetry/deviceID/replay`主题。解决方案会对重放消息进行必要的处理。 33 | 34 | ## 考虑点 35 | 36 | 实施此设计时,请考虑以下问题: 37 | 38 | #### 重放记录是否是下游处理所必须的? 39 | 40 | 简单来说**是的**。大多数解决方案对这个问题的回答都应该是**肯定**的,因为通过如下这些方式,重放未经处理的原始传感器数据可以使得 IoT 解决方案支持 IoT 解决方案洞察力的演进: 41 | 42 | - 基础计算的更新,支持对历史数据进行良好的分析 43 | - 创建新的处理记录类型 44 | - 实现新的预期之外的特性 45 | - 从根本上创建新的客户数据视角 46 | 47 | 这种考虑的一个例子[如下](#重放数据示例) 48 | 49 | #### 确保已保存消息的时间顺序是否是重要的? 50 | 51 | 如果 **是**: `待补充` 52 | 53 | 如果 **不是**: `待补充` 54 | 55 | ## 示例 56 | 57 | #### 重放数据示例 58 | 59 | 一个物理站点正在进行电能([kWh](https://en.wikipedia.org/wiki/Kilowatt_hour))消耗的监控。每 30 秒对电能传感器进行采样,每分钟报告一次采样数据。原始未经处理的消息到达时,会被存储并且一个“15 分钟均值”过程会自动计算所消耗电能的 15 分钟平均值。计算结果会以记录的形式存储在解决方案的已处理记录库中。然后,这些新处理的记录将被其他分析流程和 IoT 解决方案的用户界面所使用。 60 | 61 | 后续解决方案的用户明确要求获得每 5 分钟电力消耗最大值的记录。为了实现这一功能,我们实施了一个新的“5 分钟最大值”过程。这个新过程会重放历史未处理记录,并在每 5 分钟历史间隔上计算最大值。一旦完成,每个计算结果将被存储为一个新的已处理记录类型。 62 | 63 | 如果不保留原始样本,解决方案将只能对实施了“5 分钟最大值”功能后到达的数据进行计算。最重要的是,如果没有原始样本,用户将无法使用"5 分钟最大值"这个功能去分析这个功能实现之前的物理站点的数据 64 | -------------------------------------------------------------------------------- /src/hugo/content/zh-cn/glossary/_index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "术语表" 3 | weight: 500 4 | --- 5 | 6 | {{% children style="card" depth="1" description="true" %}} 7 | -------------------------------------------------------------------------------- /src/hugo/content/zh-cn/glossary/personae.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "人物角色" 3 | --- 4 | 描述对物联网解决方案通常感兴趣的人。 5 | 6 | 7 | 8 | ### 商业决策者(Business Decision Maker) 9 | > 首席执行官,首席技术官,首席信息安全官或大数据团队的经理,他们一直在寻找可以解决公司问题的解决方案 10 | 11 | ### 业务线应用程序开发人员(Line of Business Application Developer) 12 | > 一个具有云计算知识的开发人员,他创建、负责并维护对于企业关键流程的有效运作至关重要的整个应用程序或服务 13 | 14 | ### 数据工程师(Data Engineer) 15 | > 技术娴熟的人员,既了解如何为公司设置云数据基础架构,又负责确保其正常工作 16 | 17 | ### 设备工程师(Device Engineer) 18 | > 一个高度专业的开发人员,他知道如何编写,测试并修复在物理上通常是资源受限的设备上安全运行的代码 19 | 20 | ### 设备管理者(Fleet Manager) 21 | > 一个具有云计算知识的运维开发人员,负责让大量设备保持微码更新并顺利运行 22 | 23 | ### 工业工程师(Industrial Engineer) 24 | > 通过使用历史数据库、SCADA系统和PLC来建立、排除故障并改进物理过程的技术专家,以支持公司运营并识别运营中低效的地方 25 | 26 | ### 运营分析师(Operations Analyst) 27 | > 负责调查、分析IoT数据和开发模型的分析师,以便公司能够对业务问题做出正确的决策,同时工业工程师也可以采取适当的行动 28 | 29 | ### 安全架构师(Security Architect) 30 | > 技术娴熟的人员,他像黑客一样思考,以预测入侵者获取访问公司系统访问权限的行动和策略 31 | 32 | ### 安全运维工程师(Security Operations) 33 | > 技术娴熟的人员,确保解决方案设备安全的方方面面按计划运行,并在异常时发起告警 34 | -------------------------------------------------------------------------------- /src/hugo/content/zh-cn/glossary/vocabulary.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "名词解释" 3 | --- 4 | 5 | IoT Atlas 中出现的名词及定义 6 | 7 | 8 | 9 | ### 执行器(Actuator) 10 | 11 | > 执行器用来对机械进行移动或控制 12 | 13 | ### 命令消息(Command Message) 14 | 15 | > 一个[消息](#消息message)描述了设备应该采取的动作,并且一旦动作完成,设备就知道应该在另一个主题上进行确认。 16 | 17 | ### 设备(Device) 18 | 19 | > 是具有足够的供电和计算资源的实体,作为 IoT 解决方案的一部分。大多数情况下设备连接[传感器](#传感器sensor)或[执行器](#执行器actuator)。 20 | 21 | ### 设备数据密度(Device Data Density) 22 | 23 | > 一个设备的数据密度是:`密度 = 采样频率 * 样本大小 * 报告频率` 24 | 25 | ### 端点(Endpoint) 26 | 27 | > 待定 28 | 29 | ### 有限生产(Limited Production) 30 | 31 | > 验证在规模化场景下用户对项目的边缘和云软件的程度,通过蓝图满足在大规模生产环境下主要的用户用例 32 | 33 | ### 消息(Message) 34 | 35 | > IoT 解决方案中的通信单元,经常包含感测或命令相关的数据 36 | 37 | ### 消息代理(Message Broker) 38 | 39 | > IoT 解决方案中负责管理授权发布者和主题订阅者之间消息路由的组件 40 | 41 | ### 消息主题(Message Topic) 42 | 43 | > 消息主题,即*主题(topic)*,是与消息相关联的主题(subject)。主题经常被用来从发布者路由消息到订阅者。在这个上下文环境中,消息主题应该直接对应到发布/订阅概念中的主题(subject),并类似于用来描述请求/响应和 REST 端点的相对 URL(partial URL)的概念。 44 | 45 | ### 有序存储(Ordered Store) 46 | 47 | > 是在 IoT 解决方案中确保所有记录都按时序进行存储的数据存储或微服务。 48 | 49 | ### 试点(Pilot) 50 | 51 | > 通过测试一小部分用户用例、设备配置和/或者最终用户功能,识别业务成果、软件架构和/或创建设备蓝图 52 | 53 | ### 生产(Production) 54 | 55 | > 大规模生产设备,并将 IoT 产品推向市场 56 | 57 | ### 原型(Prototype) 58 | 59 | > 以教学为目的,获取客户管理层批准开始试点阶段 60 | 61 | ### 规则(Rule) 62 | 63 | > 由规则引擎执行的逻辑和动作的单一集合 64 | 65 | ### 规则引擎(Rule Engine) 66 | 67 | > 详见维基百科([Business rules engine](https://en.wikipedia.org/wiki/Business_rules_engine)) 68 | 69 | ### 传感器(Sensor) 70 | 71 | > 传感器用于测量周围环境的某些指标 72 | -------------------------------------------------------------------------------- /src/hugo/layouts/partials/custom-footer.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 10 | 13 | 14 | -------------------------------------------------------------------------------- /src/hugo/layouts/partials/custom-header.html: -------------------------------------------------------------------------------- 1 | {{ partial "seo-schema" . }} 2 | -------------------------------------------------------------------------------- /src/hugo/layouts/partials/logo.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/hugo/layouts/partials/menu-footer.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | Download 4 | 5 | Star 6 | 7 | Fork 8 |
9 | 10 |
11 | Site built: {{ now.UTC.Format "2006-01-02 T15:04:05 UTC" }} 12 |
13 | -------------------------------------------------------------------------------- /src/hugo/layouts/partials/seo-schema.html: -------------------------------------------------------------------------------- 1 | 27 | -------------------------------------------------------------------------------- /src/hugo/layouts/shortcodes/atlas-logo.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/hugo/layouts/shortcodes/center.html: -------------------------------------------------------------------------------- 1 |
{{.Inner}}
2 | -------------------------------------------------------------------------------- /src/hugo/layouts/shortcodes/synopsis-archiving.html: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | A device's measurements are saved and made available for use in their original or processed form. 6 | 7 | -------------------------------------------------------------------------------- /src/hugo/layouts/shortcodes/synopsis-bootstrap.html: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | An unregistered device becomes registered and fully functional in an IoT solution. 6 | 7 | -------------------------------------------------------------------------------- /src/hugo/layouts/shortcodes/synopsis-gateway.html: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | Design pattern used on IoT edge devices to translate between different protocols. 6 | 7 | -------------------------------------------------------------------------------- /src/hugo/layouts/shortcodes/synopsis-protocol-translation.html: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | A device acts as an intermediary between local devices as well as devices and the cloud. 6 | 7 | -------------------------------------------------------------------------------- /src/hugo/layouts/shortcodes/synopsis-software-update.html: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | Ask a device to obtain new software, perform an update on itself, and confirm completion. 6 | 7 | -------------------------------------------------------------------------------- /src/hugo/layouts/shortcodes/synopsis-telemetry.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Collect data from sensors in a remote environment and make the sensed measurements available for use by other components of an IoT solution. 5 | 6 | -------------------------------------------------------------------------------- /src/hugo/static/css/theme-atlas.css: -------------------------------------------------------------------------------- 1 | h2 { 2 | border-bottom: 3px solid #f28272; 3 | /*display: inline-block;*/ 4 | /*border-bottom: 1px solid #dedede;*/ 5 | margin-bottom: 15px; 6 | padding-bottom: 0.2rem; 7 | } 8 | 9 | h3 { 10 | border-bottom: 2px solid #d5d5d5; 11 | border-bottom-style: dashed; 12 | /*display: inline-block;*/ 13 | /*border-bottom: 1px solid #dedede;*/ 14 | margin-bottom: 15px; 15 | } 16 | 17 | h4 { 18 | font-size: 22px; 19 | } 20 | 21 | html { 22 | font-size: 0.95rem; 23 | } 24 | 25 | article > aside { 26 | top: 2rem; 27 | width: 15rem; 28 | } 29 | 30 | article > aside .menu .dd-item { 31 | padding-left: 1rem; 32 | list-style: none; 33 | font-size: 14px; 34 | } 35 | 36 | article { 37 | margin-top: 2.5rem; 38 | } 39 | article section.page { 40 | padding: 2rem 1rem; 41 | } 42 | 43 | #navigation a { 44 | color: #959595; 45 | } 46 | 47 | .iotAtlasLeftSmall { 48 | float: left; 49 | height: 75px; 50 | } 51 | 52 | /* Table of contents */ 53 | .toc ul { 54 | list-style: none; 55 | margin: 0; 56 | padding: 0 5px; 57 | } 58 | .toc ul li { 59 | display: inline; 60 | } 61 | #TableOfContents > ul > li > ul > li > ul li { 62 | margin-right: 8px; 63 | } 64 | #TableOfContents > ul > li > ul > li > a, 65 | #TableOfContents > ul > li > a { 66 | font-weight: bold; 67 | background-color: #eeeeee; 68 | padding: 0 10px; 69 | margin: 0 2px; 70 | } 71 | #TableOfContents > ul > li > ul > li > a { 72 | font-style: italic; 73 | } 74 | .toc.compact ul > li > ul > li > ul { 75 | display: none; 76 | } 77 | 78 | #toc { 79 | position: fixed; 80 | background-color: rgba(0, 0, 0, 0.1); 81 | padding: 10px 50px 10px 20px; 82 | } 83 | 84 | /* Only exand menu 1 level */ 85 | #sidebar ul.topics > li.active ul { 86 | display: none; 87 | } 88 | #sidebar ul.topics > li.active > ul { 89 | display: block; 90 | } 91 | -------------------------------------------------------------------------------- /src/hugo/static/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/static/images/favicon.ico -------------------------------------------------------------------------------- /src/hugo/static/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/static/images/favicon.png -------------------------------------------------------------------------------- /src/hugo/static/images/iot_atlas_150x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/static/images/iot_atlas_150x.png -------------------------------------------------------------------------------- /src/hugo/static/images/iot_atlas_white_150x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/static/images/iot_atlas_white_150x.png -------------------------------------------------------------------------------- /src/hugo/static/iot-atlas-patterns.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/static/iot-atlas-patterns.pptx -------------------------------------------------------------------------------- /src/hugo/static/iot_atlas_white_150x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/static/iot_atlas_white_150x.png -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/.editorconfig: -------------------------------------------------------------------------------- 1 | # https://editorconfig.org 2 | 3 | root = true 4 | 5 | [*] 6 | charset = utf-8 7 | end_of_line = lf 8 | indent_size = 2 9 | indent_style = space 10 | trim_trailing_whitespace = true 11 | 12 | [*.js] 13 | insert_final_newline = true 14 | 15 | [*.md] 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | public/ 3 | exampleSite/public 4 | -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/.grenrc.yml: -------------------------------------------------------------------------------- 1 | --- 2 | dataSource: "prs" 3 | prefix: "v" 4 | onlyMilestones: false 5 | changelogFilename: "CHANGELOG.md" 6 | includeMessages: "all" 7 | ignoreIssuesWith: 8 | - "support" 9 | ignoreLabels: 10 | - "duplicate" 11 | - "invalid" 12 | - "wontfix" 13 | groupBy: 14 | New features: 15 | - "feature" 16 | Bug Fixes: 17 | - "bug" 18 | Enhancements: 19 | - "enhancement" 20 | Internationalisation: 21 | - "i18n" 22 | Theme Meta: 23 | - "meta" 24 | Uncategorised: 25 | - "closed" 26 | -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 Grav 4 | Copyright (c) 2016 MATHIEU CORNIC 5 | Copyright (c) 2017 Valere JEANTET 6 | 7 | Permission is hereby granted, free of charge, to any person obtaining a copy of 8 | this software and associated documentation files (the "Software"), to deal in 9 | the Software without restriction, including without limitation the rights to 10 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 11 | the Software, and to permit persons to whom the Software is furnished to do so, 12 | subject to the following conditions: 13 | 14 | The above copyright notice and this permission notice shall be included in all 15 | copies or substantial portions of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 19 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 20 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 21 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23 | -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/README.md: -------------------------------------------------------------------------------- 1 | # Hugo Learn Theme 2 | 3 | This repository contains a theme for [Hugo](https://gohugo.io/), based on great [Grav Learn Theme](https://learn.getgrav.org/). 4 | 5 | Visit the [theme documentation](https://learn.netlify.com/en/) to see what is going on. It is actually built with this theme. 6 | 7 | [![wercker status](https://app.wercker.com/status/233466a2be73fcea400e7dc02ef6adf9/s/master "wercker status")](https://app.wercker.com/project/byKey/233466a2be73fcea400e7dc02ef6adf9) 8 | [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fmatcornic%2Fhugo-theme-learn.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fmatcornic%2Fhugo-theme-learn?ref=badge_shield) 9 | 10 | ## Main features 11 | 12 | - Automatic Search 13 | - Multilingual mode 14 | - Unlimited menu levels 15 | - Automatic next/prev buttons to navigate through menu entries 16 | - Image resizing, shadow… 17 | - Attachments files 18 | - List child pages 19 | - Mermaid diagram (flowchart, sequence, gantt) 20 | - Customizable look and feel and themes variants 21 | - Buttons, Tip/Note/Info/Warning boxes, Expand 22 | 23 | ## Installation 24 | 25 | Navigate to your themes folder in your Hugo site and use the following commands: 26 | 27 | ```shell 28 | cd themes/ 29 | git clone https://github.com/matcornic/hugo-theme-learn.git 30 | ``` 31 | 32 | Check that your Hugo version is minimum `0.25` with `hugo version`. 33 | 34 | ![Overview](https://github.com/matcornic/hugo-theme-learn/raw/master/images/tn.png) 35 | 36 | ## Usage 37 | 38 | - [Visit the documentation](https://learn.netlify.com/en/) 39 | 40 | ## Download old versions (prior to 2.0.0) 41 | 42 | If you need old version for compatibility purpose, either download [theme source code from releases](https://github.com/matcornic/hugo-theme-learn/releases) or use the right git tag. For example, with `1.1.0` 43 | 44 | - Direct download way: https://github.com/matcornic/hugo-theme-learn/archive/1.1.0.zip 45 | - Git way: 46 | 47 | ```shell 48 | cd themes/hugo-theme-learn 49 | git checkout tags/1.1.0 50 | ``` 51 | 52 | For both solutions, the documentation is available at https://github.com/matcornic/hugo-theme-learn/releases/download/1.1.0/hugo-learn-doc-1.1.0.zip 53 | 54 | ## Credits 55 | 56 | Many thanks to [@vjeantet](https://github.com/vjeantet/) for the fork [docdock](https://github.com/vjeantet/hugo-theme-docdock). The v2 of this theme is mainly based on his work ! 57 | 58 | ## License 59 | 60 | [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fmatcornic%2Fhugo-theme-learn.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fmatcornic%2Fhugo-theme-learn?ref=badge_large) 61 | 62 | ## Releasing 63 | 64 | Somewhat work-in-progress steps to release with [gren](https://github.com/github-tools/github-release-notes) 65 | 66 | - Check all MRs assigned to the milestone are closed or pushed back to another release 67 | - Close the milestone 68 | - Check merged MRs on the milestone have a tag (Bug, Enhancement, etc.) 69 | - Tag and push the repo 70 | 71 | ```shell 72 | git tag 73 | git push origin 74 | ``` 75 | 76 | - Generate CHANGELOG.md with _gren_ 77 | 78 | ```shell 79 | gren changelog --override --generate --tags=all 80 | ``` 81 | 82 | - Fix the date for the current release in CHANGELOG.md 83 | - Add the changelog to git and update the tag 84 | 85 | ```shell 86 | git add CHANGELOG.md 87 | git commit -m "Ship tag " 88 | git push origin master 89 | git tag -f 90 | git push --force origin 91 | ``` 92 | 93 | - Generate release with _gren_ 94 | 95 | ```shell 96 | gren release -t 97 | ``` 98 | -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/archetypes/chapter.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "{{ replace .Name "-" " " | title }}" 3 | date = {{ .Date }} 4 | weight = 5 5 | chapter = true 6 | pre = "X. " 7 | +++ 8 | 9 | ### Chapter X 10 | 11 | # Some Chapter title 12 | 13 | Lorem Ipsum. -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/archetypes/default.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "{{ replace .Name "-" " " | title }}" 3 | date = {{ .Date }} 4 | weight = 5 5 | +++ 6 | 7 | Lorem Ipsum. -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/i18n/ar.toml: -------------------------------------------------------------------------------- 1 | [Search-placeholder] 2 | other = "...البحث" 3 | 4 | [Clear-History] 5 | other = "مسح السجل" 6 | 7 | [Attachments-label] 8 | other = "مرفقات" 9 | 10 | [title-404] 11 | other = "خطأ" 12 | 13 | [message-404] 14 | other = ".¯\\_(ツ)_/¯أوبس. يبدو أن هذه الصفحة غير موجودة" 15 | 16 | [Go-to-homepage] 17 | other = "الذهاب إلى الصفحة الرئيسية" 18 | 19 | [Edit-this-page] 20 | other = "تعديل هذه الصفحة" 21 | 22 | [Shortcuts-Title] 23 | other = "المزيد" 24 | 25 | [Expand-title] 26 | other = "...قم بتوسيع" 27 | 28 | [BinaryPrefix-kilobyte] 29 | other = "kb" -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/i18n/de.toml: -------------------------------------------------------------------------------- 1 | [Search-placeholder] 2 | other = "Suchen..." 3 | 4 | [Clear-History] 5 | other = "Verlauf löschen" 6 | 7 | [Attachments-label] 8 | other = "Anhänge" 9 | 10 | [title-404] 11 | other = "Fehler" 12 | 13 | [message-404] 14 | other = "Huch. Diese Seite scheint nicht zu existieren ¯\\_(ツ)_/¯." 15 | 16 | [Go-to-homepage] 17 | other = "Gehe zur Homepage" 18 | 19 | [Edit-this-page] 20 | other = "Bearbeite diese Seite" 21 | 22 | [Shortcuts-Title] 23 | other = "Mehr" 24 | 25 | [Expand-title] 26 | other = "Erweitere mich..." 27 | 28 | [BinaryPrefix-kilobyte] 29 | other = "kb" -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/i18n/en.toml: -------------------------------------------------------------------------------- 1 | [Search-placeholder] 2 | other = "Search..." 3 | 4 | [Clear-History] 5 | other = "Clear History" 6 | 7 | [Attachments-label] 8 | other = "Attachments" 9 | 10 | [title-404] 11 | other = "Error" 12 | 13 | [message-404] 14 | other = "Woops. Looks like this page doesn't exist ¯\\_(ツ)_/¯." 15 | 16 | [Go-to-homepage] 17 | other = "Go to homepage" 18 | 19 | [Edit-this-page] 20 | other = "Edit this page" 21 | 22 | [Shortcuts-Title] 23 | other = "More" 24 | 25 | [Expand-title] 26 | other = "Expand me..." 27 | 28 | [BinaryPrefix-kilobyte] 29 | other = "kb" -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/i18n/es.toml: -------------------------------------------------------------------------------- 1 | [Search-placeholder] 2 | other = "Buscar..." 3 | 4 | [Clear-History] 5 | other = "Borrar Historial" 6 | 7 | [Attachments-label] 8 | other = "Adjuntos" 9 | 10 | [title-404] 11 | other = "Error" 12 | 13 | [message-404] 14 | other = "Ups. Parece que la página no existe ¯\\_(ツ)_/¯." 15 | 16 | [Go-to-homepage] 17 | other = "Ir al inicio" 18 | 19 | [Edit-this-page] 20 | other = "Editar esta página" 21 | 22 | [Shortcuts-Title] 23 | other = "Más" 24 | 25 | [Expand-title] 26 | other = "Expandir..." 27 | 28 | [BinaryPrefix-kilobyte] 29 | other = "kb" 30 | -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/i18n/fr.toml: -------------------------------------------------------------------------------- 1 | [Search-placeholder] 2 | other = "Rechercher..." 3 | 4 | [Clear-History] 5 | other = "Supprimer l'historique" 6 | 7 | [Attachments-label] 8 | other = "Pièces jointes" 9 | 10 | [title-404] 11 | other = "Erreur" 12 | 13 | [message-404] 14 | other = "Oups. On dirait que cette page n'existe pas ¯\\_(ツ)_/¯" 15 | 16 | [Go-to-homepage] 17 | other = "Vers la page d'accueil" 18 | 19 | [Edit-this-page] 20 | other = "Modifier la page" 21 | 22 | [Shortcuts-Title] 23 | other = "Aller plus loin" 24 | 25 | [Expand-title] 26 | other = "Déroulez-moi..." 27 | 28 | [BinaryPrefix-kilobyte] 29 | other = "ko" -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/i18n/hi.toml: -------------------------------------------------------------------------------- 1 | [Search-placeholder] 2 | other = "खोजे..." 3 | 4 | [Clear-History] 5 | other = "इतिहास मिटाएँ" 6 | 7 | [Attachments-label] 8 | other = "संलग्नंक (अटैचमेंट)" 9 | 10 | [title-404] 11 | other = "त्रुटि" 12 | 13 | [message-404] 14 | other = "यह पृष्ठ अभि अनुपलब्ध है!" 15 | 16 | [Go-to-homepage] 17 | other = "मुख्य पृष्ठ पर जाऐ" 18 | 19 | [Edit-this-page] 20 | other = "यह पृष्ठ संपादित करें" 21 | 22 | [Shortcuts-Title] 23 | other = "अधिक सामग्री दिखाएं" 24 | 25 | [Expand-title] 26 | other = "विस्तार करे..." 27 | 28 | [BinaryPrefix-kilobyte] 29 | other = "kb" 30 | -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/i18n/id.toml: -------------------------------------------------------------------------------- 1 | [Search-placeholder] 2 | other = "Telusuri..." 3 | 4 | [Clear-History] 5 | other = "Bersihkan Riwayat" 6 | 7 | [Attachments-label] 8 | other = "Lampiran" 9 | 10 | [title-404] 11 | other = "Kesalahan" 12 | 13 | [message-404] 14 | other = "Oops. Sepertinya halaman ini tidak ada ¯\\_(ツ)_/¯." 15 | 16 | [Go-to-homepage] 17 | other = "Ke halaman depan" 18 | 19 | [Edit-this-page] 20 | other = "Edit halaman ini" 21 | 22 | [Shortcuts-Title] 23 | other = "Lainnya" 24 | 25 | [Expand-title] 26 | other = "Bentangkan..." 27 | 28 | [BinaryPrefix-kilobyte] 29 | other = "kb" 30 | -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/i18n/ja.toml: -------------------------------------------------------------------------------- 1 | [Search-placeholder] 2 | other = "検索..." 3 | 4 | [Clear-History] 5 | other = "履歴削除" 6 | 7 | [Attachments-label] 8 | other = "添付" 9 | 10 | [title-404] 11 | other = "エラー" 12 | 13 | [message-404] 14 | other = "おっと。ページが見当たりません。 ¯\\_(ツ)_/¯." 15 | 16 | [Go-to-homepage] 17 | other = "ホームページへ行く" 18 | 19 | [Edit-this-page] 20 | other = "このページを編集" 21 | 22 | [Shortcuts-Title] 23 | other = "更に" 24 | 25 | [Expand-title] 26 | other = "開く..." 27 | 28 | [BinaryPrefix-kilobyte] 29 | other = "kb" 30 | -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/i18n/nl.toml: -------------------------------------------------------------------------------- 1 | [Search-placeholder] 2 | other = "Zoeken..." 3 | 4 | [Clear-History] 5 | other = "Wis geschiedenis" 6 | 7 | [Attachments-label] 8 | other = "Bijlagen" 9 | 10 | [title-404] 11 | other = "Error" 12 | 13 | [message-404] 14 | other = "Blijkbaar bestaat deze pagina niet ¯\\_(ツ)_/¯." 15 | 16 | [Go-to-homepage] 17 | other = "Naar startpagina" 18 | 19 | [Edit-this-page] 20 | other = "Deze pagina bewerken" 21 | 22 | [Shortcuts-Title] 23 | other = "Snelkoppelingen" 24 | 25 | [Expand-title] 26 | other = "Lees meer..." 27 | 28 | [BinaryPrefix-kilobyte] 29 | other = "kb" 30 | -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/i18n/pt.toml: -------------------------------------------------------------------------------- 1 | [Search-placeholder] 2 | other = "Procurar..." 3 | 4 | [Clear-History] 5 | other = "Limpar Histórico" 6 | 7 | [Attachments-label] 8 | other = "Anexos" 9 | 10 | [title-404] 11 | other = "Erro" 12 | 13 | [message-404] 14 | other = "Ops. Parece que a página não existe ¯\\_(ツ)_/¯." 15 | 16 | [Go-to-homepage] 17 | other = "Ir para o início" 18 | 19 | [Edit-this-page] 20 | other = "Editar esta página" 21 | 22 | [Shortcuts-Title] 23 | other = "Mais" 24 | 25 | [Expand-title] 26 | other = "Expandir..." 27 | 28 | [BinaryPrefix-kilobyte] 29 | other = "kb" 30 | -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/i18n/ru.toml: -------------------------------------------------------------------------------- 1 | [Search-placeholder] 2 | other = "Поиск..." 3 | 4 | [Clear-History] 5 | other = "Очистить историю" 6 | 7 | [Attachments-label] 8 | other = "Присоединенные файлы" 9 | 10 | [title-404] 11 | other = "Ошибка" 12 | 13 | [message-404] 14 | other = "Упс. Выглядит будто такой страницы нет ¯\\_(ツ)_/¯." 15 | 16 | [Go-to-homepage] 17 | other = "Перейти на главную" 18 | 19 | [Edit-this-page] 20 | other = "Редактировать" 21 | 22 | [Shortcuts-Title] 23 | other = "Еще" 24 | 25 | [Expand-title] 26 | other = "Развернуть..." 27 | 28 | [BinaryPrefix-kilobyte] 29 | other = "килобайт" -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/i18n/tr.toml: -------------------------------------------------------------------------------- 1 | [Search-placeholder] 2 | other = "Ara..." 3 | 4 | [Clear-History] 5 | other = "Geçmişi Temizle" 6 | 7 | [Attachments-label] 8 | other = "Ekler" 9 | 10 | [title-404] 11 | other = "Hata" 12 | 13 | [message-404] 14 | other = "Uups. Görünüşe göre böyle bir sayfa yok ¯\\_(ツ)_/¯" 15 | 16 | [Go-to-homepage] 17 | other = "Anasayfaya dön" 18 | 19 | [Edit-this-page] 20 | other = "Sayfayı düzenle" 21 | 22 | [Shortcuts-Title] 23 | other = "Dahası Var" 24 | 25 | [Expand-title] 26 | other = "Genişlet..." 27 | 28 | [BinaryPrefix-kilobyte] 29 | other = "kb" 30 | -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/i18n/zh-cn.toml: -------------------------------------------------------------------------------- 1 | [Search-placeholder] 2 | other = "搜索..." 3 | 4 | [Clear-History] 5 | other = "清理历史记录" 6 | 7 | [Attachments-label] 8 | other = "附件" 9 | 10 | [title-404] 11 | other = "错误" 12 | 13 | [message-404] 14 | other = "哎哟。 看起来这个页面不存在 ¯\\_(ツ)_/¯。" 15 | 16 | [Go-to-homepage] 17 | other = "转到主页" 18 | 19 | [Edit-this-page] 20 | other = "编辑当前页" 21 | 22 | [Shortcuts-Title] 23 | other = "更多" 24 | 25 | [Expand-title] 26 | other = "展开" 27 | 28 | [BinaryPrefix-kilobyte] 29 | other = "kb" 30 | -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/images/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/themes/iot-atlas/images/screenshot.png -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/images/tn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/themes/iot-atlas/images/tn.png -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/layouts/404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {{ partial "meta.html" . }} {{ partial "favicon.html" . }} {{ .Scratch.Add "title" "" }}{{ if eq .Site.Data.titles .Title }}{{ .Scratch.Set "title" (index .Site.Data.titles .Title).title }}{{ else }}{{ .Scratch.Set "title" .Title}}{{end}} 6 | {{ .Scratch.Get "title" }} 7 | 8 | {{ $assetBusting := not .Site.Params.disableAssetsBusting }} 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | {{with .Site.Params.themeVariant}} 17 | 18 | {{end}} 19 | 34 | {{ partial "custom-header.html" . }} 35 | 36 | 37 | 38 | 39 |
40 |
41 |
42 |
43 |

{{T "title-404"}}

44 |

45 |

46 |

{{T "message-404"}}

47 |

48 |

{{T "Go-to-homepage"}}

49 |

Page not found!

50 |
51 |
52 | 53 |
54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/layouts/_default/list.html: -------------------------------------------------------------------------------- 1 | {{ partial "header.html" . }} 2 | 3 | {{ if eq .Kind "section" }} 4 | {{ .Content }} 5 | {{end}} 6 | 7 | {{ if or (eq .Kind "taxonomy") (eq .Kind "term") }} 8 |
    9 | {{ range .Pages }} 10 |
  • {{.Title}}
  • 11 | {{ end }} 12 |
13 | {{end}} 14 | 15 |
16 | {{with .Params.LastModifierDisplayName}} 17 | {{ . }} {{with $.Date}} {{ .Format "02/01/2006" }}{{end}} 18 | 19 | {{end}} 20 |
21 | 22 | {{ partial "footer.html" . }} -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/layouts/_default/single.html: -------------------------------------------------------------------------------- 1 | {{ partial "header.html" . }} 2 | 3 | {{ .Content }} 4 | 5 |
6 | {{with .Params.LastModifierDisplayName}} 7 | {{ . }} {{with $.Date}} {{ .Format "02/01/2006" }}{{end}} 8 | 9 | {{end}} 10 |
11 | 12 | {{ partial "footer.html" . }} 13 | -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/layouts/index.html: -------------------------------------------------------------------------------- 1 | {{ partial "header.html" . }} 2 | 3 | navigation 4 | 5 | 6 | {{if .Site.Home.Content }} 7 | {{.Site.Home.Content}} 8 | {{else}} 9 | {{if eq .Site.Language.Lang "fr"}} 10 |

Personaliser la page d'accueil

11 |

12 | Le site fonctionne. Ne pas oublier de personaliser cette page avec votre propre contenu. 3 manières de faire : 13 |

14 |
    15 |
  • 1. Créer un fichier _index.md dans le dossier content et le remplir de Markdown
  • 16 |
  • 2. Créer un fichier index.html dans le dossier static et le remplir de code HTML
  • 17 |
  • 3. Configurer le serveur http pour rediriger automatiquement la homepage vers la page de votre choix dans le site
  • 18 |
19 | {{else}} 20 |

Customize your own home page

21 |

22 | The site is working. Don't forget to customize this homepage with your own. You typically have 3 choices : 23 |

24 |
    25 |
  • 1. Create an _index.md document in content folder and fill it with Markdown content
  • 26 |
  • 2. Create an index.html file in the static folder and fill the file with HTML content
  • 27 |
  • 3. Configure your server to automatically redirect home page to one your documentation page
  • 28 |
29 | {{end}} 30 | {{ end }} 31 | {{ partial "footer.html" . }} 32 | -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/layouts/index.json: -------------------------------------------------------------------------------- 1 | [{{ range $index, $page := .Site.Pages }} 2 | {{- if ne $page.Type "json" -}} 3 | {{- if and $index (gt $index 0) -}},{{- end }} 4 | { 5 | "uri": "{{ $page.Permalink }}", 6 | "title": "{{ htmlEscape $page.Title}}", 7 | "tags": [{{ range $tindex, $tag := $page.Params.tags }}{{ if $tindex }}, {{ end }}"{{ $tag| htmlEscape }}"{{ end }}], 8 | "description": "{{ htmlEscape .Description}}", 9 | "content": {{$page.Plain | jsonify}} 10 | } 11 | {{- end -}} 12 | {{- end -}}] -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/layouts/partials/custom-comments.html: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/layouts/partials/custom-footer.html: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/layouts/partials/custom-header.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/layouts/partials/favicon.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/layouts/partials/footer.html: -------------------------------------------------------------------------------- 1 | {{ if .Params.chapter }} 2 | 3 | {{ end }} 4 | 5 | {{ partial "custom-comments.html" . }} 6 | 7 | 8 | 53 | 54 | 55 | 56 |
57 |
58 |
59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | {{ if (or (and (ne .Params.disableMermaid nil) (not .Params.disableMermaid)) (not .Site.Params.disableMermaid)) }} 70 | {{ if isset .Params "customMermaidURL" }} 71 | 72 | {{ else if isset .Site.Params "customMermaidURL" }} 73 | 74 | {{ else }} 75 | 76 | {{ end }} 77 | 80 | {{ end }} 81 | {{ partial "custom-footer.html" . }} 82 | 83 | 84 | -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/layouts/partials/menu-footer.html: -------------------------------------------------------------------------------- 1 |

Built with from Grav and Hugo

2 | -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/layouts/partials/meta.html: -------------------------------------------------------------------------------- 1 | 2 | {{ with .Site.Params.author }}{{ end }} 3 | -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/layouts/partials/search.html: -------------------------------------------------------------------------------- 1 | 6 | {{ $assetBusting := not .Site.Params.disableAssetsBusting }} 7 | 8 | 9 | 16 | 17 | -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/layouts/partials/tags.html: -------------------------------------------------------------------------------- 1 | {{ if .Params.tags }} 2 |
3 | {{range .Params.tags}} 4 | {{ . }} 5 | {{end}} 6 |
7 | {{end}} -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/layouts/partials/toc.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | {{ .TableOfContents }} 4 |
5 |
6 | -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/layouts/shortcodes/attachments.html: -------------------------------------------------------------------------------- 1 | {{ $_hugo_config := `{ "version": 1 }` }} 2 |
3 | 7 | {{if eq .Page.File.BaseFileName "index"}} 8 | {{$.Scratch.Add "filesName" "files"}} 9 | {{else}} 10 | {{$.Scratch.Add "filesName" (printf "%s.files" .Page.File.BaseFileName)}} 11 | {{end}} 12 |
13 | {{ range (readDir (printf "./content/%s%s" .Page.File.Dir ($.Scratch.Get "filesName")) ) }} 14 | {{ $fileDir := replace $.Page.File.Dir "\\" "/" }} 15 | {{if ($.Get "pattern")}} 16 | {{if (findRE ($.Get "pattern") .Name)}} 17 |
  • 18 | 19 | {{.Name}} 20 | 21 | ({{div .Size 1024 }} {{T "BinaryPrefix-kilobyte"}}) 22 |
  • 23 | {{end}} 24 | {{else}} 25 |
  • 26 | 27 | {{.Name}} 28 | 29 | ({{div .Size 1024 }} {{T "BinaryPrefix-kilobyte"}}) 30 |
  • 31 | {{end}} 32 | {{end}} 33 |
    34 | {{.Inner}} 35 |
    36 | 37 | -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/layouts/shortcodes/button.html: -------------------------------------------------------------------------------- 1 | {{ $_hugo_config := `{ "version": 1 }` }} 2 | 3 | {{ $icon := .Get "icon" }} 4 | {{ $iconposition := .Get "icon-position" }} 5 | {{ if ($icon) }} 6 | {{ if or (not ($iconposition)) (eq $iconposition "left") }} 7 | 8 | {{ end }} 9 | {{ end }} 10 | {{ .Inner }} 11 | {{ if and ($icon) (eq $iconposition "right")}} 12 | 13 | {{ end }} 14 | 15 | -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/layouts/shortcodes/expand.html: -------------------------------------------------------------------------------- 1 | {{ $_hugo_config := `{ "version": 1 }` }} 2 |
    3 |
    4 | 5 | 6 | {{$expandMessage := T "Expand-title"}} 7 | {{ if .IsNamedParams }} 8 | {{.Get "default" | default $expandMessage}} 9 | {{else}} 10 | {{.Get 0 | default $expandMessage}} 11 | {{end}} 12 | 13 |
    14 | 17 |
    -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/layouts/shortcodes/mermaid.html: -------------------------------------------------------------------------------- 1 | {{ $_hugo_config := `{ "version": 1 }` }} 2 |
    {{ safeHTML .Inner }}
    3 | -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/layouts/shortcodes/notice.html: -------------------------------------------------------------------------------- 1 | {{ $_hugo_config := `{ "version": 1 }` }} 2 |
    {{ .Inner }}
    3 | -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/layouts/shortcodes/ref.html: -------------------------------------------------------------------------------- 1 | {{- if in (.Get 0) "/_index.md" -}} 2 | {{- $paths := (split (.Get 0) "_index.md") -}} 3 | {{- $pagepath := index $paths 0 -}} 4 | {{- $anchor := index $paths 1 -}} 5 | {{- with .Site.GetPage "section" (trim $pagepath "/") -}} 6 | {{- ( printf "%s%s" $pagepath $anchor ) | relLangURL -}} 7 | {{- end -}} 8 | {{- else -}} 9 | {{- with .Site.GetPage "section" (.Get 0) }} 10 | {{- .RelPermalink -}} 11 | {{- else -}} 12 | {{- .Get 0 | relref .Page -}} 13 | {{- end -}} 14 | {{- end -}} -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/layouts/shortcodes/relref.html: -------------------------------------------------------------------------------- 1 | {{- if in (.Get 0) "/_index.md" -}} 2 | {{- $paths := (split (.Get 0) "_index.md") -}} 3 | {{- $pagepath := index $paths 0 -}} 4 | {{- $anchor := index $paths 1 -}} 5 | {{- with .Site.GetPage "section" (trim $pagepath "/") -}} 6 | {{- ( printf "%s%s" $pagepath $anchor ) | relLangURL -}} 7 | {{- end -}} 8 | {{- else -}} 9 | {{- with .Site.GetPage "section" (.Get 0) }} 10 | {{- .RelPermalink -}} 11 | {{- else -}} 12 | {{- .Get 0 | relref .Page -}} 13 | {{- end -}} 14 | {{- end -}} -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/layouts/shortcodes/siteparam.html: -------------------------------------------------------------------------------- 1 | {{- $paramName := (.Get 0) -}} 2 | {{- $siteParams := .Site.Params -}} 3 | {{- with $paramName -}} 4 | {{- with $siteParams -}} 5 | {{- index . (lower $paramName) -}} 6 | {{- end -}} 7 | {{- end -}} -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/layouts/shortcodes/tab.html: -------------------------------------------------------------------------------- 1 | {{ if .Parent }} 2 | {{ $name := trim (.Get "name") " " }} 3 | {{ if not (.Parent.Scratch.Get "tabs") }} 4 | {{ .Parent.Scratch.Set "tabs" slice }} 5 | {{ end }} 6 | {{ with .Inner }} 7 | {{ $.Parent.Scratch.Add "tabs" (dict "name" $name "content" . ) }} 8 | {{ end }} 9 | {{ else }} 10 | {{- errorf "[%s] %q: tab shortcode missing its parent" site.Language.Lang .Page.Path -}} 11 | {{ end}} 12 | 13 | -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/layouts/shortcodes/tabs.html: -------------------------------------------------------------------------------- 1 | {{ with .Inner }}{{/* don't do anything, just call it */}}{{ end }} 2 | {{ $groupId := default "default" (.Get "groupId") }} 3 |
    4 |
    5 | {{ range $idx, $tab := .Scratch.Get "tabs" }} 6 | 12 | {{ end }} 13 |
    14 |
    15 | {{ range $idx, $tab := .Scratch.Get "tabs" }} 16 |
    17 | {{ .content }} 18 |
    19 | {{ end }} 20 |
    21 |
    22 | -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/netlify.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | publish = "exampleSite/public" 3 | command = "hugo -s exampleSite" 4 | 5 | [build.environment] 6 | HUGO_THEME = "repo" 7 | HUGO_THEMESDIR = "/opt/build" 8 | HUGO_VERSION = "0.72.0" 9 | 10 | [context.production.environment] 11 | HUGO_BASEURL = "https://learn.netlify.app/" 12 | 13 | [context.deploy-preview] 14 | command = "hugo -s exampleSite -b $DEPLOY_PRIME_URL" 15 | 16 | [context.deploy-preview.environment] 17 | HUGO_ENABLEGITINFO = "true" 18 | 19 | [context.branch-deplpy] 20 | command = "hugo -s exampleSite -b $DEPLOY_PRIME_URL" 21 | 22 | [context.branch-deploy.environment] 23 | HUGO_ENABLEGITINFO = "true" 24 | -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/css/atom-one-dark-reasonable.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Atom One Dark With support for ReasonML by Gidi Morris, based off work by Daniel Gamage 4 | 5 | Original One Dark Syntax theme from https://github.com/atom/one-dark-syntax 6 | 7 | */ 8 | .hljs { 9 | display: block; 10 | overflow-x: auto; 11 | padding: 0.5em; 12 | line-height: 1.3em; 13 | color: #abb2bf; 14 | background: #282c34; 15 | border-radius: 5px; 16 | } 17 | .hljs-keyword, .hljs-operator { 18 | color: #F92672; 19 | } 20 | .hljs-pattern-match { 21 | color: #F92672; 22 | } 23 | .hljs-pattern-match .hljs-constructor { 24 | color: #61aeee; 25 | } 26 | .hljs-function { 27 | color: #61aeee; 28 | } 29 | .hljs-function .hljs-params { 30 | color: #A6E22E; 31 | } 32 | .hljs-function .hljs-params .hljs-typing { 33 | color: #FD971F; 34 | } 35 | .hljs-module-access .hljs-module { 36 | color: #7e57c2; 37 | } 38 | .hljs-constructor { 39 | color: #e2b93d; 40 | } 41 | .hljs-constructor .hljs-string { 42 | color: #9CCC65; 43 | } 44 | .hljs-comment, .hljs-quote { 45 | color: #b18eb1; 46 | font-style: italic; 47 | } 48 | .hljs-doctag, .hljs-formula { 49 | color: #c678dd; 50 | } 51 | .hljs-section, .hljs-name, .hljs-selector-tag, .hljs-deletion, .hljs-subst { 52 | color: #e06c75; 53 | } 54 | .hljs-literal { 55 | color: #56b6c2; 56 | } 57 | .hljs-string, .hljs-regexp, .hljs-addition, .hljs-attribute, .hljs-meta-string { 58 | color: #98c379; 59 | } 60 | .hljs-built_in, .hljs-class .hljs-title { 61 | color: #e6c07b; 62 | } 63 | .hljs-attr, .hljs-variable, .hljs-template-variable, .hljs-type, .hljs-selector-class, .hljs-selector-attr, .hljs-selector-pseudo, .hljs-number { 64 | color: #d19a66; 65 | } 66 | .hljs-symbol, .hljs-bullet, .hljs-link, .hljs-meta, .hljs-selector-id, .hljs-title { 67 | color: #61aeee; 68 | } 69 | .hljs-emphasis { 70 | font-style: italic; 71 | } 72 | .hljs-strong { 73 | font-weight: bold; 74 | } 75 | .hljs-link { 76 | text-decoration: underline; 77 | } 78 | -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/css/auto-complete.css: -------------------------------------------------------------------------------- 1 | .autocomplete-suggestions { 2 | text-align: left; 3 | cursor: default; 4 | border: 1px solid #ccc; 5 | border-top: 0; 6 | background: #fff; 7 | box-shadow: -1px 1px 3px rgba(0,0,0,.1); 8 | 9 | /* core styles should not be changed */ 10 | position: absolute; 11 | display: none; 12 | z-index: 9999; 13 | max-height: 254px; 14 | overflow: hidden; 15 | overflow-y: auto; 16 | box-sizing: border-box; 17 | 18 | } 19 | .autocomplete-suggestion { 20 | position: relative; 21 | cursor: pointer; 22 | padding: 7px; 23 | line-height: 23px; 24 | white-space: nowrap; 25 | overflow: hidden; 26 | text-overflow: ellipsis; 27 | color: #333; 28 | } 29 | 30 | .autocomplete-suggestion b { 31 | font-weight: normal; 32 | color: #1f8dd6; 33 | } 34 | 35 | .autocomplete-suggestion.selected { 36 | background: #333; 37 | color: #fff; 38 | } 39 | 40 | .autocomplete-suggestion:hover { 41 | background: #444; 42 | color: #fff; 43 | } 44 | 45 | .autocomplete-suggestion > .context { 46 | font-size: 12px; 47 | } 48 | -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/css/featherlight.min.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Featherlight - ultra slim jQuery lightbox 3 | * Version 1.7.13 - http://noelboss.github.io/featherlight/ 4 | * 5 | * Copyright 2018, Noël Raoul Bossart (http://www.noelboss.com) 6 | * MIT Licensed. 7 | **/ 8 | html.with-featherlight{overflow:hidden}.featherlight{display:none;position:fixed;top:0;right:0;bottom:0;left:0;z-index:2147483647;text-align:center;white-space:nowrap;cursor:pointer;background:#333;background:rgba(0,0,0,0)}.featherlight:last-of-type{background:rgba(0,0,0,.8)}.featherlight:before{content:'';display:inline-block;height:100%;vertical-align:middle}.featherlight .featherlight-content{position:relative;text-align:left;vertical-align:middle;display:inline-block;overflow:auto;padding:25px 25px 0;border-bottom:25px solid transparent;margin-left:5%;margin-right:5%;max-height:95%;background:#fff;cursor:auto;white-space:normal}.featherlight .featherlight-inner{display:block}.featherlight link.featherlight-inner,.featherlight script.featherlight-inner,.featherlight style.featherlight-inner{display:none}.featherlight .featherlight-close-icon{position:absolute;z-index:9999;top:0;right:0;line-height:25px;width:25px;cursor:pointer;text-align:center;font-family:Arial,sans-serif;background:#fff;background:rgba(255,255,255,.3);color:#000;border:0;padding:0}.featherlight .featherlight-close-icon::-moz-focus-inner{border:0;padding:0}.featherlight .featherlight-image{width:100%}.featherlight-iframe .featherlight-content{border-bottom:0;padding:0;-webkit-overflow-scrolling:touch}.featherlight iframe{border:0}.featherlight *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}@media only screen and (max-width:1024px){.featherlight .featherlight-content{margin-left:0;margin-right:0;max-height:98%;padding:10px 10px 0;border-bottom:10px solid transparent}}@media print{html.with-featherlight>*>:not(.featherlight){display:none}} -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/css/hybrid.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | vim-hybrid theme by w0ng (https://github.com/w0ng/vim-hybrid) 4 | 5 | */ 6 | 7 | /*background color*/ 8 | .hljs { 9 | display: block; 10 | overflow-x: auto; 11 | padding: 0.5em; 12 | background: #1d1f21; 13 | } 14 | 15 | /*selection color*/ 16 | .hljs::selection, 17 | .hljs span::selection { 18 | background: #373b41; 19 | } 20 | 21 | .hljs::-moz-selection, 22 | .hljs span::-moz-selection { 23 | background: #373b41; 24 | } 25 | 26 | /*foreground color*/ 27 | .hljs { 28 | color: #c5c8c6; 29 | } 30 | 31 | /*color: fg_yellow*/ 32 | .hljs-title, 33 | .hljs-name { 34 | color: #f0c674; 35 | } 36 | 37 | /*color: fg_comment*/ 38 | .hljs-comment, 39 | .hljs-meta, 40 | .hljs-meta .hljs-keyword { 41 | color: #707880; 42 | } 43 | 44 | /*color: fg_red*/ 45 | .hljs-number, 46 | .hljs-symbol, 47 | .hljs-literal, 48 | .hljs-deletion, 49 | .hljs-link { 50 | color: #cc6666 51 | } 52 | 53 | /*color: fg_green*/ 54 | .hljs-string, 55 | .hljs-doctag, 56 | .hljs-addition, 57 | .hljs-regexp, 58 | .hljs-selector-attr, 59 | .hljs-selector-pseudo { 60 | color: #b5bd68; 61 | } 62 | 63 | /*color: fg_purple*/ 64 | .hljs-attribute, 65 | .hljs-code, 66 | .hljs-selector-id { 67 | color: #b294bb; 68 | } 69 | 70 | /*color: fg_blue*/ 71 | .hljs-keyword, 72 | .hljs-selector-tag, 73 | .hljs-bullet, 74 | .hljs-tag { 75 | color: #81a2be; 76 | } 77 | 78 | /*color: fg_aqua*/ 79 | .hljs-subst, 80 | .hljs-variable, 81 | .hljs-template-tag, 82 | .hljs-template-variable { 83 | color: #8abeb7; 84 | } 85 | 86 | /*color: fg_orange*/ 87 | .hljs-type, 88 | .hljs-built_in, 89 | .hljs-builtin-name, 90 | .hljs-quote, 91 | .hljs-section, 92 | .hljs-selector-class { 93 | color: #de935f; 94 | } 95 | 96 | .hljs-emphasis { 97 | font-style: italic; 98 | } 99 | 100 | .hljs-strong { 101 | font-weight: bold; 102 | } 103 | -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/css/perfect-scrollbar.min.css: -------------------------------------------------------------------------------- 1 | /* perfect-scrollbar v0.6.13 */ 2 | .ps-container{-ms-touch-action:auto;touch-action:auto;overflow:hidden !important;-ms-overflow-style:none}@supports (-ms-overflow-style: none){.ps-container{overflow:auto !important}}@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none){.ps-container{overflow:auto !important}}.ps-container.ps-active-x>.ps-scrollbar-x-rail,.ps-container.ps-active-y>.ps-scrollbar-y-rail{display:block;background-color:transparent}.ps-container.ps-in-scrolling.ps-x>.ps-scrollbar-x-rail{background-color:#eee;opacity:.9}.ps-container.ps-in-scrolling.ps-x>.ps-scrollbar-x-rail>.ps-scrollbar-x{background-color:#999;height:11px}.ps-container.ps-in-scrolling.ps-y>.ps-scrollbar-y-rail{background-color:#eee;opacity:.9}.ps-container.ps-in-scrolling.ps-y>.ps-scrollbar-y-rail>.ps-scrollbar-y{background-color:#999;width:11px}.ps-container>.ps-scrollbar-x-rail{display:none;position:absolute;opacity:0;-webkit-transition:background-color .2s linear, opacity .2s linear;-o-transition:background-color .2s linear, opacity .2s linear;-moz-transition:background-color .2s linear, opacity .2s linear;transition:background-color .2s linear, opacity .2s linear;bottom:0px;height:15px}.ps-container>.ps-scrollbar-x-rail>.ps-scrollbar-x{position:absolute;background-color:#aaa;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-transition:background-color .2s linear, height .2s linear, width .2s ease-in-out, -webkit-border-radius .2s ease-in-out;transition:background-color .2s linear, height .2s linear, width .2s ease-in-out, -webkit-border-radius .2s ease-in-out;-o-transition:background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out;-moz-transition:background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out, -moz-border-radius .2s ease-in-out;transition:background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out;transition:background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out, -webkit-border-radius .2s ease-in-out, -moz-border-radius .2s ease-in-out;bottom:2px;height:6px}.ps-container>.ps-scrollbar-x-rail:hover>.ps-scrollbar-x,.ps-container>.ps-scrollbar-x-rail:active>.ps-scrollbar-x{height:11px}.ps-container>.ps-scrollbar-y-rail{display:none;position:absolute;opacity:0;-webkit-transition:background-color .2s linear, opacity .2s linear;-o-transition:background-color .2s linear, opacity .2s linear;-moz-transition:background-color .2s linear, opacity .2s linear;transition:background-color .2s linear, opacity .2s linear;right:0;width:15px}.ps-container>.ps-scrollbar-y-rail>.ps-scrollbar-y{position:absolute;background-color:#aaa;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-transition:background-color .2s linear, height .2s linear, width .2s ease-in-out, -webkit-border-radius .2s ease-in-out;transition:background-color .2s linear, height .2s linear, width .2s ease-in-out, -webkit-border-radius .2s ease-in-out;-o-transition:background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out;-moz-transition:background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out, -moz-border-radius .2s ease-in-out;transition:background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out;transition:background-color .2s linear, height .2s linear, width .2s ease-in-out, border-radius .2s ease-in-out, -webkit-border-radius .2s ease-in-out, -moz-border-radius .2s ease-in-out;right:2px;width:6px}.ps-container>.ps-scrollbar-y-rail:hover>.ps-scrollbar-y,.ps-container>.ps-scrollbar-y-rail:active>.ps-scrollbar-y{width:11px}.ps-container:hover.ps-in-scrolling.ps-x>.ps-scrollbar-x-rail{background-color:#eee;opacity:.9}.ps-container:hover.ps-in-scrolling.ps-x>.ps-scrollbar-x-rail>.ps-scrollbar-x{background-color:#999;height:11px}.ps-container:hover.ps-in-scrolling.ps-y>.ps-scrollbar-y-rail{background-color:#eee;opacity:.9}.ps-container:hover.ps-in-scrolling.ps-y>.ps-scrollbar-y-rail>.ps-scrollbar-y{background-color:#999;width:11px}.ps-container:hover>.ps-scrollbar-x-rail,.ps-container:hover>.ps-scrollbar-y-rail{opacity:.6}.ps-container:hover>.ps-scrollbar-x-rail:hover{background-color:#eee;opacity:.9}.ps-container:hover>.ps-scrollbar-x-rail:hover>.ps-scrollbar-x{background-color:#999}.ps-container:hover>.ps-scrollbar-y-rail:hover{background-color:#eee;opacity:.9}.ps-container:hover>.ps-scrollbar-y-rail:hover>.ps-scrollbar-y{background-color:#999} 3 | -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/css/tabs.css: -------------------------------------------------------------------------------- 1 | #body .tab-nav-button { 2 | border-width: 1px 1px 1px 1px !important; 3 | border-color: #ccc !important; 4 | border-radius: 4px 4px 0 0 !important; 5 | background-color: #ddd !important; 6 | float: left; 7 | display: block; 8 | position: relative; 9 | margin-left: 4px; 10 | bottom: -1px; 11 | } 12 | #body .tab-nav-button:first-child { 13 | margin-left: 0px; 14 | } 15 | #body .tab-nav-button.active { 16 | background-color: #fff !important; 17 | border-bottom-color: #fff !important; 18 | } 19 | 20 | #body .tab-panel { 21 | margin-top: 32px; 22 | margin-bottom: 32px; 23 | } 24 | #body .tab-content { 25 | display: block; 26 | clear: both; 27 | padding: 8px; 28 | border-width: 1px; 29 | border-style: solid; 30 | border-color: #ccc; 31 | } 32 | #body .tab-content .tab-item{ 33 | display: none; 34 | } 35 | 36 | #body .tab-content .tab-item.active{ 37 | display: block; 38 | } 39 | 40 | #body .tab-item pre{ 41 | margin-bottom: 0; 42 | margin-top: 0; 43 | } 44 | -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/css/tags.css: -------------------------------------------------------------------------------- 1 | /* Tags */ 2 | 3 | #head-tags{ 4 | margin-left:1em; 5 | margin-top:1em; 6 | } 7 | 8 | #body .tags a.tag-link { 9 | display: inline-block; 10 | line-height: 2em; 11 | font-size: 0.8em; 12 | position: relative; 13 | margin: 0 16px 8px 0; 14 | padding: 0 10px 0 12px; 15 | background: #8451a1; 16 | 17 | -webkit-border-bottom-right-radius: 3px; 18 | border-bottom-right-radius: 3px; 19 | -webkit-border-top-right-radius: 3px; 20 | border-top-right-radius: 3px; 21 | 22 | -webkit-box-shadow: 0 1px 2px rgba(0,0,0,0.2); 23 | box-shadow: 0 1px 2px rgba(0,0,0,0.2); 24 | color: #fff; 25 | } 26 | 27 | #body .tags a.tag-link:before { 28 | content: ""; 29 | position: absolute; 30 | top:0; 31 | left: -1em; 32 | width: 0; 33 | height: 0; 34 | border-color: transparent #8451a1 transparent transparent; 35 | border-style: solid; 36 | border-width: 1em 1em 1em 0; 37 | } 38 | 39 | #body .tags a.tag-link:after { 40 | content: ""; 41 | position: absolute; 42 | top: 10px; 43 | left: 1px; 44 | width: 5px; 45 | height: 5px; 46 | -webkit-border-radius: 50%; 47 | border-radius: 100%; 48 | background: #fff; 49 | } 50 | -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/css/theme-blue.css: -------------------------------------------------------------------------------- 1 | 2 | :root{ 3 | 4 | --MAIN-TEXT-color:#323232; /* Color of text by default */ 5 | --MAIN-TITLES-TEXT-color: #5e5e5e; /* Color of titles h2-h3-h4-h5 */ 6 | --MAIN-LINK-color:#1C90F3; /* Color of links */ 7 | --MAIN-LINK-HOVER-color:#167ad0; /* Color of hovered links */ 8 | --MAIN-ANCHOR-color: #1C90F3; /* color of anchors on titles */ 9 | 10 | --MENU-HOME-LINK-color: #323232; /* Color of the home button text */ 11 | --MENU-HOME-LINK-HOVER-color: #5e5e5e; /* Color of the hovered home button text */ 12 | 13 | --MENU-HEADER-BG-color:#1C90F3; /* Background color of menu header */ 14 | --MENU-HEADER-BORDER-color:#33a1ff; /*Color of menu header border */ 15 | 16 | --MENU-SEARCH-BG-color:#167ad0; /* Search field background color (by default borders + icons) */ 17 | --MENU-SEARCH-BOX-color: #33a1ff; /* Override search field border color */ 18 | --MENU-SEARCH-BOX-ICONS-color: #a1d2fd; /* Override search field icons color */ 19 | 20 | --MENU-SECTIONS-ACTIVE-BG-color:#20272b; /* Background color of the active section and its childs */ 21 | --MENU-SECTIONS-BG-color:#252c31; /* Background color of other sections */ 22 | --MENU-SECTIONS-LINK-color: #ccc; /* Color of links in menu */ 23 | --MENU-SECTIONS-LINK-HOVER-color: #e6e6e6; /* Color of links in menu, when hovered */ 24 | --MENU-SECTION-ACTIVE-CATEGORY-color: #777; /* Color of active category text */ 25 | --MENU-SECTION-ACTIVE-CATEGORY-BG-color: #fff; /* Color of background for the active category (only) */ 26 | 27 | --MENU-VISITED-color: #33a1ff; /* Color of 'page visited' icons in menu */ 28 | --MENU-SECTION-HR-color: #20272b; /* Color of
    separator in menu */ 29 | 30 | } 31 | 32 | body { 33 | color: var(--MAIN-TEXT-color) !important; 34 | } 35 | 36 | textarea:focus, input[type="email"]:focus, input[type="number"]:focus, input[type="password"]:focus, input[type="search"]:focus, input[type="tel"]:focus, input[type="text"]:focus, input[type="url"]:focus, input[type="color"]:focus, input[type="date"]:focus, input[type="datetime"]:focus, input[type="datetime-local"]:focus, input[type="month"]:focus, input[type="time"]:focus, input[type="week"]:focus, select[multiple=multiple]:focus { 37 | border-color: none; 38 | box-shadow: none; 39 | } 40 | 41 | h2, h3, h4, h5 { 42 | color: var(--MAIN-TITLES-TEXT-color) !important; 43 | } 44 | 45 | a { 46 | color: var(--MAIN-LINK-color); 47 | } 48 | 49 | .anchor { 50 | color: var(--MAIN-ANCHOR-color); 51 | } 52 | 53 | a:hover { 54 | color: var(--MAIN-LINK-HOVER-color); 55 | } 56 | 57 | #sidebar ul li.visited > a .read-icon { 58 | color: var(--MENU-VISITED-color); 59 | } 60 | 61 | #body a.highlight:after { 62 | display: block; 63 | content: ""; 64 | height: 1px; 65 | width: 0%; 66 | -webkit-transition: width 0.5s ease; 67 | -moz-transition: width 0.5s ease; 68 | -ms-transition: width 0.5s ease; 69 | transition: width 0.5s ease; 70 | background-color: var(--MAIN-LINK-HOVER-color); 71 | } 72 | #sidebar { 73 | background-color: var(--MENU-SECTIONS-BG-color); 74 | } 75 | #sidebar #header-wrapper { 76 | background: var(--MENU-HEADER-BG-color); 77 | color: var(--MENU-SEARCH-BOX-color); 78 | border-color: var(--MENU-HEADER-BORDER-color); 79 | } 80 | #sidebar .searchbox { 81 | border-color: var(--MENU-SEARCH-BOX-color); 82 | background: var(--MENU-SEARCH-BG-color); 83 | } 84 | #sidebar ul.topics > li.parent, #sidebar ul.topics > li.active { 85 | background: var(--MENU-SECTIONS-ACTIVE-BG-color); 86 | } 87 | #sidebar .searchbox * { 88 | color: var(--MENU-SEARCH-BOX-ICONS-color); 89 | } 90 | 91 | #sidebar a { 92 | color: var(--MENU-SECTIONS-LINK-color); 93 | } 94 | 95 | #sidebar a:hover { 96 | color: var(--MENU-SECTIONS-LINK-HOVER-color); 97 | } 98 | 99 | #sidebar ul li.active > a { 100 | background: var(--MENU-SECTION-ACTIVE-CATEGORY-BG-color); 101 | color: var(--MENU-SECTION-ACTIVE-CATEGORY-color) !important; 102 | } 103 | 104 | #sidebar hr { 105 | border-color: var(--MENU-SECTION-HR-color); 106 | } 107 | 108 | #body .tags a.tag-link { 109 | background-color: var(--MENU-HEADER-BG-color); 110 | } 111 | 112 | #body .tags a.tag-link:before { 113 | border-right-color: var(--MENU-HEADER-BG-color); 114 | } 115 | 116 | #homelinks { 117 | background: var(--MENU-HEADER-BG-color); 118 | background-color: var(--MENU-HEADER-BORDER-color); 119 | border-bottom-color: var(--MENU-HEADER-BORDER-color); 120 | } 121 | 122 | #homelinks a { 123 | color: var(--MENU-HOME-LINK-color); 124 | } 125 | 126 | #homelinks a:hover { 127 | color: var(--MENU-HOME-LINK-HOVERED-color); 128 | } -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/css/theme-green.css: -------------------------------------------------------------------------------- 1 | 2 | :root{ 3 | 4 | --MAIN-TEXT-color:#323232; /* Color of text by default */ 5 | --MAIN-TITLES-TEXT-color: #5e5e5e; /* Color of titles h2-h3-h4-h5 */ 6 | --MAIN-LINK-color:#599a3e; /* Color of links */ 7 | --MAIN-LINK-HOVER-color:#3f6d2c; /* Color of hovered links */ 8 | --MAIN-ANCHOR-color: #599a3e; /* color of anchors on titles */ 9 | 10 | --MENU-HOME-LINK-color: #323232; /* Color of the home button text */ 11 | --MENU-HOME-LINK-HOVER-color: #5e5e5e; /* Color of the hovered home button text */ 12 | 13 | --MENU-HEADER-BG-color:#74b559; /* Background color of menu header */ 14 | --MENU-HEADER-BORDER-color:#9cd484; /*Color of menu header border */ 15 | 16 | --MENU-SEARCH-BG-color:#599a3e; /* Search field background color (by default borders + icons) */ 17 | --MENU-SEARCH-BOX-color: #84c767; /* Override search field border color */ 18 | --MENU-SEARCH-BOX-ICONS-color: #c7f7c4; /* Override search field icons color */ 19 | 20 | --MENU-SECTIONS-ACTIVE-BG-color:#1b211c; /* Background color of the active section and its childs */ 21 | --MENU-SECTIONS-BG-color:#222723; /* Background color of other sections */ 22 | --MENU-SECTIONS-LINK-color: #ccc; /* Color of links in menu */ 23 | --MENU-SECTIONS-LINK-HOVER-color: #e6e6e6; /* Color of links in menu, when hovered */ 24 | --MENU-SECTION-ACTIVE-CATEGORY-color: #777; /* Color of active category text */ 25 | --MENU-SECTION-ACTIVE-CATEGORY-BG-color: #fff; /* Color of background for the active category (only) */ 26 | 27 | --MENU-VISITED-color: #599a3e; /* Color of 'page visited' icons in menu */ 28 | --MENU-SECTION-HR-color: #18211c; /* Color of
    separator in menu */ 29 | 30 | } 31 | 32 | body { 33 | color: var(--MAIN-TEXT-color) !important; 34 | } 35 | 36 | textarea:focus, input[type="email"]:focus, input[type="number"]:focus, input[type="password"]:focus, input[type="search"]:focus, input[type="tel"]:focus, input[type="text"]:focus, input[type="url"]:focus, input[type="color"]:focus, input[type="date"]:focus, input[type="datetime"]:focus, input[type="datetime-local"]:focus, input[type="month"]:focus, input[type="time"]:focus, input[type="week"]:focus, select[multiple=multiple]:focus { 37 | border-color: none; 38 | box-shadow: none; 39 | } 40 | 41 | h2, h3, h4, h5 { 42 | color: var(--MAIN-TITLES-TEXT-color) !important; 43 | } 44 | 45 | a { 46 | color: var(--MAIN-LINK-color); 47 | } 48 | 49 | .anchor { 50 | color: var(--MAIN-ANCHOR-color); 51 | } 52 | 53 | a:hover { 54 | color: var(--MAIN-LINK-HOVER-color); 55 | } 56 | 57 | #sidebar ul li.visited > a .read-icon { 58 | color: var(--MENU-VISITED-color); 59 | } 60 | 61 | #body a.highlight:after { 62 | display: block; 63 | content: ""; 64 | height: 1px; 65 | width: 0%; 66 | -webkit-transition: width 0.5s ease; 67 | -moz-transition: width 0.5s ease; 68 | -ms-transition: width 0.5s ease; 69 | transition: width 0.5s ease; 70 | background-color: var(--MAIN-LINK-HOVER-color); 71 | } 72 | #sidebar { 73 | background-color: var(--MENU-SECTIONS-BG-color); 74 | } 75 | #sidebar #header-wrapper { 76 | background: var(--MENU-HEADER-BG-color); 77 | color: var(--MENU-SEARCH-BOX-color); 78 | border-color: var(--MENU-HEADER-BORDER-color); 79 | } 80 | #sidebar .searchbox { 81 | border-color: var(--MENU-SEARCH-BOX-color); 82 | background: var(--MENU-SEARCH-BG-color); 83 | } 84 | #sidebar ul.topics > li.parent, #sidebar ul.topics > li.active { 85 | background: var(--MENU-SECTIONS-ACTIVE-BG-color); 86 | } 87 | #sidebar .searchbox * { 88 | color: var(--MENU-SEARCH-BOX-ICONS-color); 89 | } 90 | 91 | #sidebar a { 92 | color: var(--MENU-SECTIONS-LINK-color); 93 | } 94 | 95 | #sidebar a:hover { 96 | color: var(--MENU-SECTIONS-LINK-HOVER-color); 97 | } 98 | 99 | #sidebar ul li.active > a { 100 | background: var(--MENU-SECTION-ACTIVE-CATEGORY-BG-color); 101 | color: var(--MENU-SECTION-ACTIVE-CATEGORY-color) !important; 102 | } 103 | 104 | #sidebar hr { 105 | border-color: var(--MENU-SECTION-HR-color); 106 | } 107 | 108 | #body .tags a.tag-link { 109 | background-color: var(--MENU-HEADER-BG-color); 110 | } 111 | 112 | #body .tags a.tag-link:before { 113 | border-right-color: var(--MENU-HEADER-BG-color); 114 | } 115 | 116 | #homelinks { 117 | background: var(--MENU-HEADER-BG-color); 118 | background-color: var(--MENU-HEADER-BORDER-color); 119 | border-bottom-color: var(--MENU-HEADER-BORDER-color); 120 | } 121 | 122 | #homelinks a { 123 | color: var(--MENU-HOME-LINK-color); 124 | } 125 | 126 | #homelinks a:hover { 127 | color: var(--MENU-HOME-LINK-HOVERED-color); 128 | } -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/css/theme-red.css: -------------------------------------------------------------------------------- 1 | 2 | :root{ 3 | 4 | --MAIN-TEXT-color:#323232; /* Color of text by default */ 5 | --MAIN-TITLES-TEXT-color: #5e5e5e; /* Color of titles h2-h3-h4-h5 */ 6 | --MAIN-LINK-color:#f31c1c; /* Color of links */ 7 | --MAIN-LINK-HOVER-color:#d01616; /* Color of hovered links */ 8 | --MAIN-ANCHOR-color: #f31c1c; /* color of anchors on titles */ 9 | 10 | --MENU-HOME-LINK-color: #ccc; /* Color of the home button text */ 11 | --MENU-HOME-LINK-HOVER-color: #e6e6e6; /* Color of the hovered home button text */ 12 | 13 | --MENU-HEADER-BG-color:#dc1010; /* Background color of menu header */ 14 | --MENU-HEADER-BORDER-color:#e23131; /*Color of menu header border */ 15 | 16 | --MENU-SEARCH-BG-color:#b90000; /* Search field background color (by default borders + icons) */ 17 | --MENU-SEARCH-BOX-color: #ef2020; /* Override search field border color */ 18 | --MENU-SEARCH-BOX-ICONS-color: #fda1a1; /* Override search field icons color */ 19 | 20 | --MENU-SECTIONS-ACTIVE-BG-color:#2b2020; /* Background color of the active section and its childs */ 21 | --MENU-SECTIONS-BG-color:#312525; /* Background color of other sections */ 22 | --MENU-SECTIONS-LINK-color: #ccc; /* Color of links in menu */ 23 | --MENU-SECTIONS-LINK-HOVER-color: #e6e6e6; /* Color of links in menu, when hovered */ 24 | --MENU-SECTION-ACTIVE-CATEGORY-color: #777; /* Color of active category text */ 25 | --MENU-SECTION-ACTIVE-CATEGORY-BG-color: #fff; /* Color of background for the active category (only) */ 26 | 27 | --MENU-VISITED-color: #ff3333; /* Color of 'page visited' icons in menu */ 28 | --MENU-SECTION-HR-color: #2b2020; /* Color of
    separator in menu */ 29 | 30 | } 31 | 32 | body { 33 | color: var(--MAIN-TEXT-color) !important; 34 | } 35 | 36 | textarea:focus, input[type="email"]:focus, input[type="number"]:focus, input[type="password"]:focus, input[type="search"]:focus, input[type="tel"]:focus, input[type="text"]:focus, input[type="url"]:focus, input[type="color"]:focus, input[type="date"]:focus, input[type="datetime"]:focus, input[type="datetime-local"]:focus, input[type="month"]:focus, input[type="time"]:focus, input[type="week"]:focus, select[multiple=multiple]:focus { 37 | border-color: none; 38 | box-shadow: none; 39 | } 40 | 41 | h2, h3, h4, h5 { 42 | color: var(--MAIN-TITLES-TEXT-color) !important; 43 | } 44 | 45 | a { 46 | color: var(--MAIN-LINK-color); 47 | } 48 | 49 | .anchor { 50 | color: var(--MAIN-ANCHOR-color); 51 | } 52 | 53 | a:hover { 54 | color: var(--MAIN-LINK-HOVER-color); 55 | } 56 | 57 | #sidebar ul li.visited > a .read-icon { 58 | color: var(--MENU-VISITED-color); 59 | } 60 | 61 | #body a.highlight:after { 62 | display: block; 63 | content: ""; 64 | height: 1px; 65 | width: 0%; 66 | -webkit-transition: width 0.5s ease; 67 | -moz-transition: width 0.5s ease; 68 | -ms-transition: width 0.5s ease; 69 | transition: width 0.5s ease; 70 | background-color: var(--MAIN-LINK-HOVER-color); 71 | } 72 | #sidebar { 73 | background-color: var(--MENU-SECTIONS-BG-color); 74 | } 75 | #sidebar #header-wrapper { 76 | background: var(--MENU-HEADER-BG-color); 77 | color: var(--MENU-SEARCH-BOX-color); 78 | border-color: var(--MENU-HEADER-BORDER-color); 79 | } 80 | #sidebar .searchbox { 81 | border-color: var(--MENU-SEARCH-BOX-color); 82 | background: var(--MENU-SEARCH-BG-color); 83 | } 84 | #sidebar ul.topics > li.parent, #sidebar ul.topics > li.active { 85 | background: var(--MENU-SECTIONS-ACTIVE-BG-color); 86 | } 87 | #sidebar .searchbox * { 88 | color: var(--MENU-SEARCH-BOX-ICONS-color); 89 | } 90 | 91 | #sidebar a { 92 | color: var(--MENU-SECTIONS-LINK-color); 93 | } 94 | 95 | #sidebar a:hover { 96 | color: var(--MENU-SECTIONS-LINK-HOVER-color); 97 | } 98 | 99 | #sidebar ul li.active > a { 100 | background: var(--MENU-SECTION-ACTIVE-CATEGORY-BG-color); 101 | color: var(--MENU-SECTION-ACTIVE-CATEGORY-color) !important; 102 | } 103 | 104 | #sidebar hr { 105 | border-color: var(--MENU-SECTION-HR-color); 106 | } 107 | 108 | #body .tags a.tag-link { 109 | background-color: var(--MENU-HEADER-BG-color); 110 | } 111 | 112 | #body .tags a.tag-link:before { 113 | border-right-color: var(--MENU-HEADER-BG-color); 114 | } 115 | 116 | #homelinks { 117 | background: var(--MENU-HEADER-BG-color); 118 | background-color: var(--MENU-HEADER-BORDER-color); 119 | border-bottom-color: var(--MENU-HEADER-BORDER-color); 120 | } 121 | 122 | #homelinks a { 123 | color: var(--MENU-HOME-LINK-color); 124 | } 125 | 126 | #homelinks a:hover { 127 | color: var(--MENU-HOME-LINK-HOVERED-color); 128 | } -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/fonts/Inconsolata.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/themes/iot-atlas/static/fonts/Inconsolata.eot -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/fonts/Inconsolata.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/themes/iot-atlas/static/fonts/Inconsolata.ttf -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/fonts/Inconsolata.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/themes/iot-atlas/static/fonts/Inconsolata.woff -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/fonts/Novecentosanswide-Normal-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/themes/iot-atlas/static/fonts/Novecentosanswide-Normal-webfont.eot -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/fonts/Novecentosanswide-Normal-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/themes/iot-atlas/static/fonts/Novecentosanswide-Normal-webfont.ttf -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/fonts/Novecentosanswide-Normal-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/themes/iot-atlas/static/fonts/Novecentosanswide-Normal-webfont.woff -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/fonts/Novecentosanswide-Normal-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/themes/iot-atlas/static/fonts/Novecentosanswide-Normal-webfont.woff2 -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/fonts/Novecentosanswide-UltraLight-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/themes/iot-atlas/static/fonts/Novecentosanswide-UltraLight-webfont.eot -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/fonts/Novecentosanswide-UltraLight-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/themes/iot-atlas/static/fonts/Novecentosanswide-UltraLight-webfont.ttf -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/fonts/Novecentosanswide-UltraLight-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/themes/iot-atlas/static/fonts/Novecentosanswide-UltraLight-webfont.woff -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/fonts/Novecentosanswide-UltraLight-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/themes/iot-atlas/static/fonts/Novecentosanswide-UltraLight-webfont.woff2 -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/fonts/Work_Sans_200.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/themes/iot-atlas/static/fonts/Work_Sans_200.eot -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/fonts/Work_Sans_200.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/themes/iot-atlas/static/fonts/Work_Sans_200.ttf -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/fonts/Work_Sans_200.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/themes/iot-atlas/static/fonts/Work_Sans_200.woff -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/fonts/Work_Sans_200.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/themes/iot-atlas/static/fonts/Work_Sans_200.woff2 -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/fonts/Work_Sans_300.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/themes/iot-atlas/static/fonts/Work_Sans_300.eot -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/fonts/Work_Sans_300.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/themes/iot-atlas/static/fonts/Work_Sans_300.ttf -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/fonts/Work_Sans_300.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/themes/iot-atlas/static/fonts/Work_Sans_300.woff -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/fonts/Work_Sans_300.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/themes/iot-atlas/static/fonts/Work_Sans_300.woff2 -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/fonts/Work_Sans_500.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/themes/iot-atlas/static/fonts/Work_Sans_500.eot -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/fonts/Work_Sans_500.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/themes/iot-atlas/static/fonts/Work_Sans_500.ttf -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/fonts/Work_Sans_500.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/themes/iot-atlas/static/fonts/Work_Sans_500.woff -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/fonts/Work_Sans_500.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/themes/iot-atlas/static/fonts/Work_Sans_500.woff2 -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/images/clippy.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/themes/iot-atlas/static/images/favicon.png -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/images/gopher-404.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/themes/iot-atlas/static/images/gopher-404.jpg -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/js/auto-complete.js: -------------------------------------------------------------------------------- 1 | // JavaScript autoComplete v1.0.4 2 | // https://github.com/Pixabay/JavaScript-autoComplete 3 | var autoComplete=function(){function e(e){function t(e,t){return e.classList?e.classList.contains(t):new RegExp("\\b"+t+"\\b").test(e.className)}function o(e,t,o){e.attachEvent?e.attachEvent("on"+t,o):e.addEventListener(t,o)}function s(e,t,o){e.detachEvent?e.detachEvent("on"+t,o):e.removeEventListener(t,o)}function n(e,s,n,l){o(l||document,s,function(o){for(var s,l=o.target||o.srcElement;l&&!(s=t(l,e));)l=l.parentElement;s&&n.call(l,o)})}if(document.querySelector){var l={selector:0,source:0,minChars:3,delay:150,offsetLeft:0,offsetTop:1,cache:1,menuClass:"",renderItem:function(e,t){t=t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&");var o=new RegExp("("+t.split(" ").join("|")+")","gi");return'
    '+e.replace(o,"$1")+"
    "},onSelect:function(){}};for(var c in e)e.hasOwnProperty(c)&&(l[c]=e[c]);for(var a="object"==typeof l.selector?[l.selector]:document.querySelectorAll(l.selector),u=0;u0?i.sc.scrollTop=n+i.sc.suggestionHeight+s-i.sc.maxHeight:0>n&&(i.sc.scrollTop=n+s)}else i.sc.scrollTop=0},o(window,"resize",i.updateSC),document.body.appendChild(i.sc),n("autocomplete-suggestion","mouseleave",function(){var e=i.sc.querySelector(".autocomplete-suggestion.selected");e&&setTimeout(function(){e.className=e.className.replace("selected","")},20)},i.sc),n("autocomplete-suggestion","mouseover",function(){var e=i.sc.querySelector(".autocomplete-suggestion.selected");e&&(e.className=e.className.replace("selected","")),this.className+=" selected"},i.sc),n("autocomplete-suggestion","mousedown",function(e){if(t(this,"autocomplete-suggestion")){var o=this.getAttribute("data-val");i.value=o,l.onSelect(e,o,this),i.sc.style.display="none"}},i.sc),i.blurHandler=function(){try{var e=document.querySelector(".autocomplete-suggestions:hover")}catch(t){var e=0}e?i!==document.activeElement&&setTimeout(function(){i.focus()},20):(i.last_val=i.value,i.sc.style.display="none",setTimeout(function(){i.sc.style.display="none"},350))},o(i,"blur",i.blurHandler);var r=function(e){var t=i.value;if(i.cache[t]=e,e.length&&t.length>=l.minChars){for(var o="",s=0;st||t>40)&&13!=t&&27!=t){var o=i.value;if(o.length>=l.minChars){if(o!=i.last_val){if(i.last_val=o,clearTimeout(i.timer),l.cache){if(o in i.cache)return void r(i.cache[o]);for(var s=1;s"; 28 | } 29 | } 30 | }); 31 | 32 | // Change styles, depending on parameters set to the image 33 | images.each(function(index){ 34 | var image = $(this) 35 | var o = getUrlParameter(image[0].src); 36 | if (typeof o !== "undefined") { 37 | var h = o["height"]; 38 | var w = o["width"]; 39 | var c = o["classes"]; 40 | image.css("width", function() { 41 | if (typeof w !== "undefined") { 42 | return w; 43 | } else { 44 | return "auto"; 45 | } 46 | }); 47 | image.css("height", function() { 48 | if (typeof h !== "undefined") { 49 | return h; 50 | } else { 51 | return "auto"; 52 | } 53 | }); 54 | if (typeof c !== "undefined") { 55 | var classes = c.split(','); 56 | for (i = 0; i < classes.length; i++) { 57 | image.addClass(classes[i]); 58 | } 59 | } 60 | } 61 | }); 62 | 63 | // Stick the top to the top of the screen when scrolling 64 | $(document).ready(function(){ 65 | $("#top-bar").sticky({topSpacing:0, zIndex: 1000}); 66 | }); 67 | 68 | 69 | jQuery(document).ready(function() { 70 | // Add link button for every 71 | var text, clip = new ClipboardJS('.anchor'); 72 | $("h1~h2,h1~h3,h1~h4,h1~h5,h1~h6").append(function(index, html){ 73 | var element = $(this); 74 | var url = encodeURI(document.location.origin + document.location.pathname); 75 | var link = url + "#"+element[0].id; 76 | return " " + 77 | "" + 78 | "" 79 | ; 80 | }); 81 | 82 | $(".anchor").on('mouseleave', function(e) { 83 | $(this).attr('aria-label', null).removeClass('tooltipped tooltipped-s tooltipped-w'); 84 | }); 85 | 86 | clip.on('success', function(e) { 87 | e.clearSelection(); 88 | $(e.trigger).attr('aria-label', 'Link copied to clipboard!').addClass('tooltipped tooltipped-s'); 89 | }); 90 | $('code.language-mermaid').each(function(index, element) { 91 | var content = $(element).html().replace(/&/g, '&'); 92 | $(element).parent().replaceWith('
    ' + content + '
    '); 93 | }); 94 | }); 95 | -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/js/search.js: -------------------------------------------------------------------------------- 1 | var lunrIndex, pagesIndex; 2 | 3 | function endsWith(str, suffix) { 4 | return str.indexOf(suffix, str.length - suffix.length) !== -1; 5 | } 6 | 7 | // Initialize lunrjs using our generated index file 8 | function initLunr() { 9 | if (!endsWith(baseurl,"/")){ 10 | baseurl = baseurl+'/' 11 | }; 12 | 13 | // First retrieve the index file 14 | $.getJSON(baseurl +"index.json") 15 | .done(function(index) { 16 | pagesIndex = index; 17 | // Set up lunrjs by declaring the fields we use 18 | // Also provide their boost level for the ranking 19 | lunrIndex = lunr(function() { 20 | this.ref("uri"); 21 | this.field('title', { 22 | boost: 15 23 | }); 24 | this.field('tags', { 25 | boost: 10 26 | }); 27 | this.field("content", { 28 | boost: 5 29 | }); 30 | 31 | this.pipeline.remove(lunr.stemmer); 32 | this.searchPipeline.remove(lunr.stemmer); 33 | 34 | // Feed lunr with each file and let lunr actually index them 35 | pagesIndex.forEach(function(page) { 36 | this.add(page); 37 | }, this); 38 | }) 39 | }) 40 | .fail(function(jqxhr, textStatus, error) { 41 | var err = textStatus + ", " + error; 42 | console.error("Error getting Hugo index file:", err); 43 | }); 44 | } 45 | 46 | /** 47 | * Trigger a search in lunr and transform the result 48 | * 49 | * @param {String} query 50 | * @return {Array} results 51 | */ 52 | function search(queryTerm) { 53 | // Find the item in our index corresponding to the lunr one to have more info 54 | return lunrIndex.search(queryTerm+"^100"+" "+queryTerm+"*^10"+" "+"*"+queryTerm+"^10"+" "+queryTerm+"~2^1").map(function(result) { 55 | return pagesIndex.filter(function(page) { 56 | return page.uri === result.ref; 57 | })[0]; 58 | }); 59 | } 60 | 61 | // Let's get started 62 | initLunr(); 63 | $( document ).ready(function() { 64 | var searchList = new autoComplete({ 65 | /* selector for the search box element */ 66 | selector: $("#search-by").get(0), 67 | /* source is the callback to perform the search */ 68 | source: function(term, response) { 69 | response(search(term)); 70 | }, 71 | /* renderItem displays individual search results */ 72 | renderItem: function(item, term) { 73 | var numContextWords = 2; 74 | var text = item.content.match( 75 | "(?:\\s?(?:[\\w]+)\\s?){0,"+numContextWords+"}" + 76 | term+"(?:\\s?(?:[\\w]+)\\s?){0,"+numContextWords+"}"); 77 | item.context = text; 78 | return '
    ' + 83 | '» ' + item.title + 84 | '
    ' + 85 | (item.context || '') +'
    ' + 86 | '
    '; 87 | }, 88 | /* onSelect callback fires when a search suggestion is chosen */ 89 | onSelect: function(e, term, item) { 90 | location.href = item.getAttribute('data-uri'); 91 | } 92 | }); 93 | }); 94 | -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/webfonts/fa-brands-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/themes/iot-atlas/static/webfonts/fa-brands-400.eot -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/webfonts/fa-brands-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/themes/iot-atlas/static/webfonts/fa-brands-400.ttf -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/webfonts/fa-brands-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/themes/iot-atlas/static/webfonts/fa-brands-400.woff -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/webfonts/fa-brands-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/themes/iot-atlas/static/webfonts/fa-brands-400.woff2 -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/webfonts/fa-regular-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/themes/iot-atlas/static/webfonts/fa-regular-400.eot -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/webfonts/fa-regular-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/themes/iot-atlas/static/webfonts/fa-regular-400.ttf -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/webfonts/fa-regular-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/themes/iot-atlas/static/webfonts/fa-regular-400.woff -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/webfonts/fa-regular-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/themes/iot-atlas/static/webfonts/fa-regular-400.woff2 -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/webfonts/fa-solid-900.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/themes/iot-atlas/static/webfonts/fa-solid-900.eot -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/webfonts/fa-solid-900.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/themes/iot-atlas/static/webfonts/fa-solid-900.ttf -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/webfonts/fa-solid-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/themes/iot-atlas/static/webfonts/fa-solid-900.woff -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/static/webfonts/fa-solid-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/iot-atlas/b6d61cd521048f477b651a2a32fc6c2687d36806/src/hugo/themes/iot-atlas/static/webfonts/fa-solid-900.woff2 -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/theme.toml: -------------------------------------------------------------------------------- 1 | # theme.toml template for a Hugo theme 2 | # See https://github.com/spf13/hugoThemes#themetoml for an example 3 | 4 | name = "Learn" 5 | license = "MIT" 6 | licenselink = "https://github.com/matcornic/hugo-theme-learn/blob/master/LICENSE.md" 7 | description = "Documentation theme for Hugo, based on Grav Learn theme" 8 | homepage = "https://github.com/matcornic/hugo-theme-learn/" 9 | repo = "https://github.com/matcornic/hugo-theme-learn" 10 | tags = ["documentation", "grav", "learn", "doc", "search"] 11 | features = ["documentation", "menu", "nested sections", "search", "mermaid"] 12 | min_version = 0.25 13 | 14 | [author] 15 | name = "Mathieu Cornic" 16 | homepage = "https://matcornic.github.io/" 17 | 18 | [original] 19 | name = "Grav Learn" 20 | homepage = "https://learn.getgrav.org/" 21 | repo = "https://github.com/getgrav/grav-learn" 22 | -------------------------------------------------------------------------------- /src/hugo/themes/iot-atlas/wercker.yml: -------------------------------------------------------------------------------- 1 | box: golang 2 | build: 3 | steps: 4 | # Gets the dependencies 5 | - script: 6 | name: get hugo 7 | code: | 8 | git clone https://github.com/gohugoio/hugo.git && cd hugo && go install 9 | # Sets the go workspace and places you package 10 | # at the right place in the workspace tree 11 | - setup-go-workspace 12 | # Build the project 13 | - script: 14 | name: build site 15 | code: | 16 | cd exampleSite && hugo -------------------------------------------------------------------------------- /src/make_hugo.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # This script is used for both local testing and automated build process (CodeBuild) 3 | set -e 4 | 5 | # Local name of docker image to build and use 6 | export IMAGE_NAME=temporary/hugo-ubuntu:latest 7 | 8 | function usage { 9 | cat </dev/null 45 | 46 | # Wait until the web server is up 47 | while [ "`docker inspect -f {{.State.Health.Status}} hugo_checker`" != "healthy" ]; do sleep 0.5; done 48 | 49 | # Check all links 50 | # unset shell exit to stop the container above before exiting 51 | set +e 52 | # The validation muffet is only in Dockerhub - set credentials for CI/CD 53 | if ! [[ -z $DOCKERHUB_USERNAME || -z $DOCKERHUB_PASSWORD ]]; then 54 | echo "********** Docker credentials found, authenticating to hub.docker.com" 55 | echo $DOCKERHUB_PASSWORD | docker login -u $DOCKERHUB_USERNAME --password-stdin 56 | fi 57 | # Run for every translated language 58 | if ! uri_path_validate "en" || 59 | ! uri_path_validate "zh" || 60 | ! uri_path_validate "fr"; then 61 | echo "********** Validation errors, stopping local Hugo instance" 62 | docker stop hugo_checker 1>/dev/null 63 | echo "Link checks failed, exiting" 64 | exit 1 65 | fi 66 | set -e 67 | echo "********** Validation completed successfully, stopping local Hugo instance" 68 | docker stop hugo_checker 1>/dev/null 69 | } 70 | 71 | function uri_path_validate { 72 | # Run link checker for specific URI 73 | # Note - run the container on the host network to access Hugo running in a separate container 74 | # - Exclude on github.com/aws in case of editURL changes. Will catch during automation 75 | echo "********** Running link checks on language: $1" 76 | if ! docker run --rm --net="host" raviqqe/muffet \ 77 | --exclude="https://github.com/aws/" \ 78 | --buffer-size="8192" \ 79 | --header="User-Agent: IotAtlasBot/1.0 (+http://iotatlas.net/en/bot/)" \ 80 | --max-connections=512 --max-connections-per-host=2 --rate-limit=16 \ 81 | http://localhost:1313/$1/; then 82 | echo "********** $1: Invalid links (see above)" 83 | return 1 # 1 = failure 84 | fi 85 | echo "********** $1: All links are valid" 86 | } 87 | 88 | function sync_s3 { 89 | echo "********** Synching content to S3 bucket: $BUCKET" 90 | aws s3 rm s3://$BUCKET --recursive 91 | aws s3 sync hugo/public s3://$BUCKET 92 | } 93 | 94 | function hugo_develop { 95 | build_docker_image 96 | echo "********** Starting Hugo for local development" 97 | docker run --rm -p 1313:1313 -v "$PWD/hugo:/hugo-project" $IMAGE_NAME 98 | exit 0 99 | } 100 | 101 | # Process arguments 102 | 103 | for i in "$@" 104 | do 105 | case $i in 106 | -d|--develop) 107 | hugo_develop 108 | # Function exits - when in develop, not other tasks 109 | ;; 110 | -s=*|--sync=*) 111 | BUCKET="${i#*=}" 112 | shift # past arg=param 113 | ;; 114 | -v|--validate) 115 | VALIDATE=YES 116 | shift 117 | ;; 118 | -h|--help) 119 | usage 120 | exit 121 | ;; 122 | *) 123 | usage 124 | exit 1 125 | ;; 126 | esac 127 | done 128 | 129 | # Build and optionally validate and sync 130 | hugo_build 131 | 132 | if [[ $VALIDATE ]]; then 133 | hugo_validate 134 | fi 135 | 136 | if [[ $BUCKET ]]; then 137 | sync_s3 138 | fi 139 | --------------------------------------------------------------------------------