| 1 | <?xml version="1.0" encoding="utf-8"?> |
| 2 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" |
| 3 | "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> |
| 4 | <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> |
| 5 | <head> |
| 6 | <!-- 2020-06-30 Tue 19:45 --> |
| 7 | <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> |
| 8 | <meta name="viewport" content="width=device-width, initial-scale=1" /> |
| 9 | <title>Ninfacyzga-01 Manual</title> |
| 10 | <meta name="generator" content="Org mode" /> |
| 11 | <meta name="author" content="Steven Baltakatei Sandoval" /> |
| 12 | <style type="text/css"> |
| 13 | <!--/*--><![CDATA[/*><!--*/ |
| 14 | .title { text-align: center; |
| 15 | margin-bottom: .2em; } |
| 16 | .subtitle { text-align: center; |
| 17 | font-size: medium; |
| 18 | font-weight: bold; |
| 19 | margin-top:0; } |
| 20 | .todo { font-family: monospace; color: red; } |
| 21 | .done { font-family: monospace; color: green; } |
| 22 | .priority { font-family: monospace; color: orange; } |
| 23 | .tag { background-color: #eee; font-family: monospace; |
| 24 | padding: 2px; font-size: 80%; font-weight: normal; } |
| 25 | .timestamp { color: #bebebe; } |
| 26 | .timestamp-kwd { color: #5f9ea0; } |
| 27 | .org-right { margin-left: auto; margin-right: 0px; text-align: right; } |
| 28 | .org-left { margin-left: 0px; margin-right: auto; text-align: left; } |
| 29 | .org-center { margin-left: auto; margin-right: auto; text-align: center; } |
| 30 | .underline { text-decoration: underline; } |
| 31 | #postamble p, #preamble p { font-size: 90%; margin: .2em; } |
| 32 | p.verse { margin-left: 3%; } |
| 33 | pre { |
| 34 | border: 1px solid #ccc; |
| 35 | box-shadow: 3px 3px 3px #eee; |
| 36 | padding: 8pt; |
| 37 | font-family: monospace; |
| 38 | overflow: auto; |
| 39 | margin: 1.2em; |
| 40 | } |
| 41 | pre.src { |
| 42 | position: relative; |
| 43 | overflow: visible; |
| 44 | padding-top: 1.2em; |
| 45 | } |
| 46 | pre.src:before { |
| 47 | display: none; |
| 48 | position: absolute; |
| 49 | background-color: white; |
| 50 | top: -10px; |
| 51 | right: 10px; |
| 52 | padding: 3px; |
| 53 | border: 1px solid black; |
| 54 | } |
| 55 | pre.src:hover:before { display: inline;} |
| 56 | /* Languages per Org manual */ |
| 57 | pre.src-asymptote:before { content: 'Asymptote'; } |
| 58 | pre.src-awk:before { content: 'Awk'; } |
| 59 | pre.src-C:before { content: 'C'; } |
| 60 | /* pre.src-C++ doesn't work in CSS */ |
| 61 | pre.src-clojure:before { content: 'Clojure'; } |
| 62 | pre.src-css:before { content: 'CSS'; } |
| 63 | pre.src-D:before { content: 'D'; } |
| 64 | pre.src-ditaa:before { content: 'ditaa'; } |
| 65 | pre.src-dot:before { content: 'Graphviz'; } |
| 66 | pre.src-calc:before { content: 'Emacs Calc'; } |
| 67 | pre.src-emacs-lisp:before { content: 'Emacs Lisp'; } |
| 68 | pre.src-fortran:before { content: 'Fortran'; } |
| 69 | pre.src-gnuplot:before { content: 'gnuplot'; } |
| 70 | pre.src-haskell:before { content: 'Haskell'; } |
| 71 | pre.src-hledger:before { content: 'hledger'; } |
| 72 | pre.src-java:before { content: 'Java'; } |
| 73 | pre.src-js:before { content: 'Javascript'; } |
| 74 | pre.src-latex:before { content: 'LaTeX'; } |
| 75 | pre.src-ledger:before { content: 'Ledger'; } |
| 76 | pre.src-lisp:before { content: 'Lisp'; } |
| 77 | pre.src-lilypond:before { content: 'Lilypond'; } |
| 78 | pre.src-lua:before { content: 'Lua'; } |
| 79 | pre.src-matlab:before { content: 'MATLAB'; } |
| 80 | pre.src-mscgen:before { content: 'Mscgen'; } |
| 81 | pre.src-ocaml:before { content: 'Objective Caml'; } |
| 82 | pre.src-octave:before { content: 'Octave'; } |
| 83 | pre.src-org:before { content: 'Org mode'; } |
| 84 | pre.src-oz:before { content: 'OZ'; } |
| 85 | pre.src-plantuml:before { content: 'Plantuml'; } |
| 86 | pre.src-processing:before { content: 'Processing.js'; } |
| 87 | pre.src-python:before { content: 'Python'; } |
| 88 | pre.src-R:before { content: 'R'; } |
| 89 | pre.src-ruby:before { content: 'Ruby'; } |
| 90 | pre.src-sass:before { content: 'Sass'; } |
| 91 | pre.src-scheme:before { content: 'Scheme'; } |
| 92 | pre.src-screen:before { content: 'Gnu Screen'; } |
| 93 | pre.src-sed:before { content: 'Sed'; } |
| 94 | pre.src-sh:before { content: 'shell'; } |
| 95 | pre.src-sql:before { content: 'SQL'; } |
| 96 | pre.src-sqlite:before { content: 'SQLite'; } |
| 97 | /* additional languages in org.el's org-babel-load-languages alist */ |
| 98 | pre.src-forth:before { content: 'Forth'; } |
| 99 | pre.src-io:before { content: 'IO'; } |
| 100 | pre.src-J:before { content: 'J'; } |
| 101 | pre.src-makefile:before { content: 'Makefile'; } |
| 102 | pre.src-maxima:before { content: 'Maxima'; } |
| 103 | pre.src-perl:before { content: 'Perl'; } |
| 104 | pre.src-picolisp:before { content: 'Pico Lisp'; } |
| 105 | pre.src-scala:before { content: 'Scala'; } |
| 106 | pre.src-shell:before { content: 'Shell Script'; } |
| 107 | pre.src-ebnf2ps:before { content: 'ebfn2ps'; } |
| 108 | /* additional language identifiers per "defun org-babel-execute" |
| 109 | in ob-*.el */ |
| 110 | pre.src-cpp:before { content: 'C++'; } |
| 111 | pre.src-abc:before { content: 'ABC'; } |
| 112 | pre.src-coq:before { content: 'Coq'; } |
| 113 | pre.src-groovy:before { content: 'Groovy'; } |
| 114 | /* additional language identifiers from org-babel-shell-names in |
| 115 | ob-shell.el: ob-shell is the only babel language using a lambda to put |
| 116 | the execution function name together. */ |
| 117 | pre.src-bash:before { content: 'bash'; } |
| 118 | pre.src-csh:before { content: 'csh'; } |
| 119 | pre.src-ash:before { content: 'ash'; } |
| 120 | pre.src-dash:before { content: 'dash'; } |
| 121 | pre.src-ksh:before { content: 'ksh'; } |
| 122 | pre.src-mksh:before { content: 'mksh'; } |
| 123 | pre.src-posh:before { content: 'posh'; } |
| 124 | /* Additional Emacs modes also supported by the LaTeX listings package */ |
| 125 | pre.src-ada:before { content: 'Ada'; } |
| 126 | pre.src-asm:before { content: 'Assembler'; } |
| 127 | pre.src-caml:before { content: 'Caml'; } |
| 128 | pre.src-delphi:before { content: 'Delphi'; } |
| 129 | pre.src-html:before { content: 'HTML'; } |
| 130 | pre.src-idl:before { content: 'IDL'; } |
| 131 | pre.src-mercury:before { content: 'Mercury'; } |
| 132 | pre.src-metapost:before { content: 'MetaPost'; } |
| 133 | pre.src-modula-2:before { content: 'Modula-2'; } |
| 134 | pre.src-pascal:before { content: 'Pascal'; } |
| 135 | pre.src-ps:before { content: 'PostScript'; } |
| 136 | pre.src-prolog:before { content: 'Prolog'; } |
| 137 | pre.src-simula:before { content: 'Simula'; } |
| 138 | pre.src-tcl:before { content: 'tcl'; } |
| 139 | pre.src-tex:before { content: 'TeX'; } |
| 140 | pre.src-plain-tex:before { content: 'Plain TeX'; } |
| 141 | pre.src-verilog:before { content: 'Verilog'; } |
| 142 | pre.src-vhdl:before { content: 'VHDL'; } |
| 143 | pre.src-xml:before { content: 'XML'; } |
| 144 | pre.src-nxml:before { content: 'XML'; } |
| 145 | /* add a generic configuration mode; LaTeX export needs an additional |
| 146 | (add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */ |
| 147 | pre.src-conf:before { content: 'Configuration File'; } |
| 148 | |
| 149 | table { border-collapse:collapse; } |
| 150 | caption.t-above { caption-side: top; } |
| 151 | caption.t-bottom { caption-side: bottom; } |
| 152 | td, th { vertical-align:top; } |
| 153 | th.org-right { text-align: center; } |
| 154 | th.org-left { text-align: center; } |
| 155 | th.org-center { text-align: center; } |
| 156 | td.org-right { text-align: right; } |
| 157 | td.org-left { text-align: left; } |
| 158 | td.org-center { text-align: center; } |
| 159 | dt { font-weight: bold; } |
| 160 | .footpara { display: inline; } |
| 161 | .footdef { margin-bottom: 1em; } |
| 162 | .figure { padding: 1em; } |
| 163 | .figure p { text-align: center; } |
| 164 | .inlinetask { |
| 165 | padding: 10px; |
| 166 | border: 2px solid gray; |
| 167 | margin: 10px; |
| 168 | background: #ffffcc; |
| 169 | } |
| 170 | #org-div-home-and-up |
| 171 | { text-align: right; font-size: 70%; white-space: nowrap; } |
| 172 | textarea { overflow-x: auto; } |
| 173 | .linenr { font-size: smaller } |
| 174 | .code-highlighted { background-color: #ffff00; } |
| 175 | .org-info-js_info-navigation { border-style: none; } |
| 176 | #org-info-js_console-label |
| 177 | { font-size: 10px; font-weight: bold; white-space: nowrap; } |
| 178 | .org-info-js_search-highlight |
| 179 | { background-color: #ffff00; color: #000000; font-weight: bold; } |
| 180 | .org-svg { width: 90%; } |
| 181 | /*]]>*/--> |
| 182 | </style> |
| 183 | <script type="text/javascript"> |
| 184 | /* |
| 185 | @licstart The following is the entire license notice for the |
| 186 | JavaScript code in this tag. |
| 187 | |
| 188 | Copyright (C) 2012-2018 Free Software Foundation, Inc. |
| 189 | |
| 190 | The JavaScript code in this tag is free software: you can |
| 191 | redistribute it and/or modify it under the terms of the GNU |
| 192 | General Public License (GNU GPL) as published by the Free Software |
| 193 | Foundation, either version 3 of the License, or (at your option) |
| 194 | any later version. The code is distributed WITHOUT ANY WARRANTY; |
| 195 | without even the implied warranty of MERCHANTABILITY or FITNESS |
| 196 | FOR A PARTICULAR PURPOSE. See the GNU GPL for more details. |
| 197 | |
| 198 | As additional permission under GNU GPL version 3 section 7, you |
| 199 | may distribute non-source (e.g., minimized or compacted) forms of |
| 200 | that code without the copy of the GNU GPL normally required by |
| 201 | section 4, provided you include this license notice and a URL |
| 202 | through which recipients can access the Corresponding Source. |
| 203 | |
| 204 | |
| 205 | @licend The above is the entire license notice |
| 206 | for the JavaScript code in this tag. |
| 207 | */ |
| 208 | <!--/*--><![CDATA[/*><!--*/ |
| 209 | function CodeHighlightOn(elem, id) |
| 210 | { |
| 211 | var target = document.getElementById(id); |
| 212 | if(null != target) { |
| 213 | elem.cacheClassElem = elem.className; |
| 214 | elem.cacheClassTarget = target.className; |
| 215 | target.className = "code-highlighted"; |
| 216 | elem.className = "code-highlighted"; |
| 217 | } |
| 218 | } |
| 219 | function CodeHighlightOff(elem, id) |
| 220 | { |
| 221 | var target = document.getElementById(id); |
| 222 | if(elem.cacheClassElem) |
| 223 | elem.className = elem.cacheClassElem; |
| 224 | if(elem.cacheClassTarget) |
| 225 | target.className = elem.cacheClassTarget; |
| 226 | } |
| 227 | /*]]>*///--> |
| 228 | </script> |
| 229 | </head> |
| 230 | <body> |
| 231 | <div id="content"> |
| 232 | <h1 class="title">Ninfacyzga-01 Manual</h1> |
| 233 | <div id="table-of-contents"> |
| 234 | <h2>Table of Contents</h2> |
| 235 | <div id="text-table-of-contents"> |
| 236 | <ul> |
| 237 | <li><a href="#org4ab28d5">1. Location Logging</a> |
| 238 | <ul> |
| 239 | <li><a href="#org3a44301">1.1. Narrative</a></li> |
| 240 | <li><a href="#orgeb3a61f">1.2. Description</a> |
| 241 | <ul> |
| 242 | <li><a href="#org68434d8">1.2.1. Hardware</a></li> |
| 243 | <li><a href="#org6bf1f28">1.2.2. Software</a></li> |
| 244 | <li><a href="#orga640ec2">1.2.3. Output</a></li> |
| 245 | </ul> |
| 246 | </li> |
| 247 | <li><a href="#org78712e3">1.3. Operating Procedures</a> |
| 248 | <ul> |
| 249 | <li><a href="#orgcc76a4c">1.3.1. Initial Startup</a></li> |
| 250 | <li><a href="#org8fbf566">1.3.2. Normal Startup</a></li> |
| 251 | <li><a href="#orgbc8af37">1.3.3. Normal Operation</a></li> |
| 252 | <li><a href="#org46c0af5">1.3.4. Normal Shutdown</a></li> |
| 253 | <li><a href="#org662e1e8">1.3.5. Unscheduled Shutdown</a></li> |
| 254 | <li><a href="#org70e088c">1.3.6. End of Life Disposal</a></li> |
| 255 | </ul> |
| 256 | </li> |
| 257 | </ul> |
| 258 | </li> |
| 259 | </ul> |
| 260 | </div> |
| 261 | </div> |
| 262 | <div id="outline-container-org4ab28d5" class="outline-2"> |
| 263 | <h2 id="org4ab28d5"><span class="section-number-2">1</span> Location Logging</h2> |
| 264 | <div class="outline-text-2" id="text-1"> |
| 265 | <p> |
| 266 | This document was created by Steven Baltakatei Sandoval on |
| 267 | <code>2020-06-29T12:14Z</code> under a <a href="https://creativecommons.org/licenses/by-sa/4.0/">Creative Commons BY-SA 4.0 license</a>. It |
| 268 | was updated by Steven Baltakatei Sandoval on <code>2020-06-30T19:44Z</code> |
| 269 | </p> |
| 270 | </div> |
| 271 | <div id="outline-container-org3a44301" class="outline-3"> |
| 272 | <h3 id="org3a44301"><span class="section-number-3">1.1</span> Narrative</h3> |
| 273 | <div class="outline-text-3" id="text-1-1"> |
| 274 | <p> |
| 275 | Ninfacyzga-01 records (logs) its position in time and space using a |
| 276 | <a href="https://en.wikipedia.org/wiki/Satellite_navigation_device">GPS receiver</a>. The NMEA location data produced by the receiver is |
| 277 | converted into the more commonly used GPS data storage formats of GPX |
| 278 | and KML. All three types of data are then compressed and encrypted |
| 279 | against a set of public keys. The encrypted data is then written to |
| 280 | disk. Data produced by the receiver is segmented into 60-second chunks |
| 281 | before being processed and written to disk. |
| 282 | </p> |
| 283 | </div> |
| 284 | </div> |
| 285 | <div id="outline-container-orgeb3a61f" class="outline-3"> |
| 286 | <h3 id="orgeb3a61f"><span class="section-number-3">1.2</span> Description</h3> |
| 287 | <div class="outline-text-3" id="text-1-2"> |
| 288 | </div> |
| 289 | <div id="outline-container-org68434d8" class="outline-4"> |
| 290 | <h4 id="org68434d8"><span class="section-number-4">1.2.1</span> Hardware</h4> |
| 291 | <div class="outline-text-4" id="text-1-2-1"> |
| 292 | </div> |
| 293 | <ol class="org-ol"> |
| 294 | <li><a id="org3fcab7d"></a>Raspberry Pi Zero W<br /> |
| 295 | <div class="outline-text-5" id="text-1-2-1-1"> |
| 296 | <p> |
| 297 | See the <a href="https://www.raspberrypi.org/pi-zero-w/">OEM</a> webpage for this product. |
| 298 | </p> |
| 299 | </div> |
| 300 | </li> |
| 301 | <li><a id="org4a38c06"></a>PiZ UpTime 2.0<br /> |
| 302 | <div class="outline-text-5" id="text-1-2-1-2"> |
| 303 | <p> |
| 304 | See the <a href="https://alchemy-power.com/piz-uptime-2-0/">OEM</a> webpage for this product. |
| 305 | </p> |
| 306 | </div> |
| 307 | </li> |
| 308 | </ol> |
| 309 | </div> |
| 310 | <div id="outline-container-org6bf1f28" class="outline-4"> |
| 311 | <h4 id="org6bf1f28"><span class="section-number-4">1.2.2</span> Software</h4> |
| 312 | <div class="outline-text-4" id="text-1-2-2"> |
| 313 | <p> |
| 314 | <code>bkgpslog</code> : The bash script that performs the location data |
| 315 | collection and processing. Is an executable file contained within this |
| 316 | repository at <code>exec/bkgpslog</code>. It should be copied to |
| 317 | <code>$HOME/.local/bin</code>. |
| 318 | </p> |
| 319 | |
| 320 | <p> |
| 321 | <code>gpsd</code> : A background daemon app capable of interfacing with the |
| 322 | Ozzmaker BerryGPS-IMU's GPS submodule. Installed and initialized by |
| 323 | <code>apt</code>. |
| 324 | </p> |
| 325 | |
| 326 | <p> |
| 327 | <code>gpspipe</code> : A command line app that polls <code>gpsd</code> and produces a stream |
| 328 | stdout consisting of GPS data lines in NMEA format. Installed via |
| 329 | <code>apt</code>. |
| 330 | </p> |
| 331 | |
| 332 | <p> |
| 333 | <code>gpsbabel</code> : A command line app that converts GPS data from one format |
| 334 | into another. <code>bkgpslog</code> uses it to convert NMEA data into GPX and |
| 335 | KML. Installed via <code>apt</code>. |
| 336 | </p> |
| 337 | |
| 338 | <p> |
| 339 | <code>gzip</code> : A simple command line app that compresses stdin into a |
| 340 | smaller stdout stream. |
| 341 | </p> |
| 342 | |
| 343 | <p> |
| 344 | <code>age</code> : A simple command line app that encrypts stdin against public |
| 345 | keys specified in its options. Produces encrypted stdout. Is an |
| 346 | executable file contained within this repository at <code>exec/age</code>. It |
| 347 | should be copied to <code>$HOME/.local/bin</code>. |
| 348 | </p> |
| 349 | </div> |
| 350 | |
| 351 | <ol class="org-ol"> |
| 352 | <li><a id="org33a99e7"></a>Narrative<br /> |
| 353 | <div class="outline-text-5" id="text-1-2-2-1"> |
| 354 | <p> |
| 355 | <code>bkgpslog</code> populates a 60-second buffer with NMEA data from <code>gpsd</code> via |
| 356 | <code>gpspipe</code>. This buffer is used by <code>gpsbabel</code> to produce GPX and KML |
| 357 | versions of the buffer. All 3 buffers are then comprssed with <code>gzip</code>, |
| 358 | encrypted with <code>age</code>, and then written to disk. |
| 359 | </p> |
| 360 | </div> |
| 361 | </li> |
| 362 | </ol> |
| 363 | </div> |
| 364 | |
| 365 | <div id="outline-container-orga640ec2" class="outline-4"> |
| 366 | <h4 id="orga640ec2"><span class="section-number-4">1.2.3</span> Output</h4> |
| 367 | <div class="outline-text-4" id="text-1-2-3"> |
| 368 | </div> |
| 369 | <ol class="org-ol"> |
| 370 | <li><a id="orgbe90ee3"></a>File Formats<br /> |
| 371 | <ol class="org-ol"> |
| 372 | <li><a id="orga69e180"></a>NMEA<br /> |
| 373 | <div class="outline-text-6" id="text-1-2-3-1-1"> |
| 374 | <p> |
| 375 | See the <a href="https://en.wikipedia.org/wiki/NMEA_0183">Wikipedia page</a> for this. |
| 376 | </p> |
| 377 | </div> |
| 378 | </li> |
| 379 | <li><a id="org03fca13"></a>GPX<br /> |
| 380 | <div class="outline-text-6" id="text-1-2-3-1-2"> |
| 381 | <p> |
| 382 | See the <a href="https://en.wikipedia.org/wiki/GPS_Exchange_Format">Wikipedia page</a> for this. <a href="http://wiki.gis.com/wiki/index.php/WGS84">WGS84</a> is the datum used. |
| 383 | </p> |
| 384 | </div> |
| 385 | </li> |
| 386 | <li><a id="org9469dda"></a>KML<br /> |
| 387 | <div class="outline-text-6" id="text-1-2-3-1-3"> |
| 388 | <p> |
| 389 | See the <a href="https://en.wikipedia.org/wiki/Keyhole_Markup_Language">Wikipedia page</a> for this. <a href="http://wiki.gis.com/wiki/index.php/WGS84">WGS84</a> is the datum used. |
| 390 | </p> |
| 391 | </div> |
| 392 | </li> |
| 393 | </ol> |
| 394 | </li> |
| 395 | <li><a id="org4923cfc"></a>Encryption Method<br /> |
| 396 | <div class="outline-text-5" id="text-1-2-3-2"> |
| 397 | <p> |
| 398 | Files produced by the bkgpslog script are encrypted against a set of |
| 399 | public keys using <a href="https://github.com/FiloSottile/age"><code>age</code></a>, a simple command line encryption tool |
| 400 | selected over <code>gpg</code> because of <code>age</code>'s deliberate lack of |
| 401 | configurability. |
| 402 | </p> |
| 403 | |
| 404 | <p> |
| 405 | The public keys are bech32 strings supplied as options to bkgpslog |
| 406 | when called. The secret key should <b>NOT</b> be stored in Ninfacyzga-01. |
| 407 | </p> |
| 408 | |
| 409 | <p> |
| 410 | If a key pair was generated using <code>age-keygen</code>, then it is an <a href="https://en.wikipedia.org/wiki/Curve25519"><code>X25519</code></a> |
| 411 | key pair. See the <a href="https://age-encryption.org/v1"><code>age</code> Version 1 specification</a>. |
| 412 | </p> |
| 413 | |
| 414 | <p> |
| 415 | An <code>ssh-rsa</code> or <code>ssh-ed25519</code> SSH public key string may be used instead of |
| 416 | the bech32 public key string produced by <code>age-keygen</code> for convenience. |
| 417 | </p> |
| 418 | |
| 419 | <p> |
| 420 | Help information for <code>age</code> is available by running <code>$ age --help</code>. |
| 421 | </p> |
| 422 | </div> |
| 423 | <ol class="org-ol"> |
| 424 | <li><a id="org5f006f6"></a>Encryption Commands<br /> |
| 425 | <div class="outline-text-6" id="text-1-2-3-2-1"> |
| 426 | <p> |
| 427 | Files may be encrypted to several recipients using a command similar to: |
| 428 | </p> |
| 429 | <pre class="example"> |
| 430 | timeout "60s" gpspipe -r | gpsbabel -i nmea -f - -o gpx -F | age \ |
| 431 | -r age1kza7pfshy7xwygf9349zgmk7x53mquvedgw9r98qwyyqhssh830qqjzlsw \ |
| 432 | -r age1ce3pvzrqfcn2pc6zqzglc8ac8yjk3fzukpy08cesqjjwns53xywqmaq7xw \ |
| 433 | -r age1pu5usxm743sx7rf22985xv2f4s0luzv6r6yx4fa7p8c2zyvp9fvqus2xr5 \ |
| 434 | > location.gpx.age |
| 435 | </pre> |
| 436 | |
| 437 | <p> |
| 438 | In this example, the strings beginning with <code>age1...</code> are |
| 439 | bech32-formatted public key strings. |
| 440 | </p> |
| 441 | </div> |
| 442 | </li> |
| 443 | |
| 444 | |
| 445 | <li><a id="orgd0d1b14"></a>Decryption Commands<br /> |
| 446 | <div class="outline-text-6" id="text-1-2-3-2-2"> |
| 447 | <p> |
| 448 | Files may be decrypted using a command similar to: |
| 449 | </p> |
| 450 | |
| 451 | <pre class="example"> |
| 452 | cat location.gpx.age | age -d -i key.txt > location.gpx |
| 453 | </pre> |
| 454 | |
| 455 | <p> |
| 456 | The version of <code>age</code> used to perform the encryption |
| 457 | </p> |
| 458 | </div> |
| 459 | </li> |
| 460 | </ol> |
| 461 | </li> |
| 462 | </ol> |
| 463 | </div> |
| 464 | </div> |
| 465 | <div id="outline-container-org78712e3" class="outline-3"> |
| 466 | <h3 id="org78712e3"><span class="section-number-3">1.3</span> Operating Procedures</h3> |
| 467 | <div class="outline-text-3" id="text-1-3"> |
| 468 | </div> |
| 469 | <div id="outline-container-orgcc76a4c" class="outline-4"> |
| 470 | <h4 id="orgcc76a4c"><span class="section-number-4">1.3.1</span> Initial Startup</h4> |
| 471 | <div class="outline-text-4" id="text-1-3-1"> |
| 472 | <p> |
| 473 | See OEM (Ozzmaker) <a href="https://ozzmaker.com/berrygps-berrygps-imu-quick-start-guide/">quickstart guide for the BerryGPS-IMU</a>. |
| 474 | </p> |
| 475 | </div> |
| 476 | |
| 477 | <ol class="org-ol"> |
| 478 | <li><a id="orgae43b4b"></a>Physical Setup<br /> |
| 479 | <div class="outline-text-5" id="text-1-3-1-1"> |
| 480 | <p> |
| 481 | BerryGPS-IMU must be electrically connected to the correct pins on the |
| 482 | GPIO header of a Raspberry Pi Zero W. |
| 483 | </p> |
| 484 | |
| 485 | <p> |
| 486 | <b>Optional</b>: stack together with PiZ Uptime 2.0 module. No GPIO pins |
| 487 | conflict so a simple stacking and soldering with long header pins is |
| 488 | possible. |
| 489 | </p> |
| 490 | </div> |
| 491 | </li> |
| 492 | |
| 493 | <li><a id="orgb3c2fc2"></a>Software Setup<br /> |
| 494 | <ol class="org-ol"> |
| 495 | <li><a id="org651214a"></a>Install Executables<br /> |
| 496 | <div class="outline-text-6" id="text-1-3-1-2-1"> |
| 497 | <p> |
| 498 | Install Raspbian 10 Buster onto an SD card image. See the Raspberry Pi |
| 499 | Foundation <a href="https://www.raspberrypi.org/documentation/installation/installing-images/README.md">installation instructions</a>. Configure WiFi to permit log |
| 500 | file transfer. Configure SSH to permit remote administration via the |
| 501 | command line interface. |
| 502 | </p> |
| 503 | |
| 504 | <p> |
| 505 | Make sure to install the <code>unattended-upgrades</code> package to make sure |
| 506 | the latest security patches for packages are installed. See <a href="https://linux-audit.com/using-unattended-upgrades-on-debian-and-ubuntu/">this page</a> |
| 507 | for a description of how <code>unattended-upgrades</code> works. |
| 508 | </p> |
| 509 | |
| 510 | <p> |
| 511 | Install <code>gpsd</code>, <code>gpspipe</code>, <code>git</code>, and this repository for location |
| 512 | logging capability. |
| 513 | </p> |
| 514 | |
| 515 | <p> |
| 516 | Install <code>syncthing</code> for log file transfer capability. |
| 517 | </p> |
| 518 | |
| 519 | <p> |
| 520 | Place <code>age</code> binary (the one compiled for ARM CPU architecture for |
| 521 | Linux) in <code>$HOME/.local/bin</code>. |
| 522 | </p> |
| 523 | </div> |
| 524 | </li> |
| 525 | |
| 526 | <li><a id="org1cc0c53"></a>Disable Swap File<br /> |
| 527 | <div class="outline-text-6" id="text-1-3-1-2-2"> |
| 528 | <p> |
| 529 | Since standard Raspbian 10 (Buster) install involves copying |
| 530 | unencrypted file system image to SD card which is mounted by the |
| 531 | Raspberry Pi, system memory may be written to disk in the form of a |
| 532 | Swap file as described <a href="https://ideaheap.com/2013/07/stopping-sd-card-corruption-on-a-raspberry-pi/">here</a>. In order to reduce the chance that |
| 533 | location log data is ever written to disk, swap file functionality |
| 534 | must be disabled<sup><a id="fnr.1" class="footref" href="#fn.1">1</a></sup>. |
| 535 | </p> |
| 536 | |
| 537 | <p> |
| 538 | Raspbian 10 uses dphys-swapfile to manage a swap file. It may be |
| 539 | disabled persistently<sup><a id="fnr.2" class="footref" href="#fn.2">2</a></sup> by running |
| 540 | the following command: |
| 541 | </p> |
| 542 | |
| 543 | <pre class="example"> |
| 544 | sudo systemctl disable dphys-swapfile.service |
| 545 | |
| 546 | </pre> |
| 547 | |
| 548 | <p> |
| 549 | To view the status of the swap file in Raspbian 10, run <code>free -m</code>: |
| 550 | </p> |
| 551 | |
| 552 | <pre class="example"> |
| 553 | pi@ninfacyzga-01:~$ free -m |
| 554 | total used free shared buff/cache available |
| 555 | Mem: 432 86 36 21 309 268 |
| 556 | Swap: 99 0 99 |
| 557 | </pre> |
| 558 | |
| 559 | <p> |
| 560 | After disabling the swap file and rebooting: |
| 561 | </p> |
| 562 | |
| 563 | <pre class="example"> |
| 564 | pi@ninfacyzga-01:~$ free -m |
| 565 | total used free shared buff/cache available |
| 566 | Mem: 432 89 214 3 128 289 |
| 567 | Swap: 0 0 0 |
| 568 | </pre> |
| 569 | </div> |
| 570 | </li> |
| 571 | |
| 572 | <li><a id="orgfdbf7d1"></a>Automatic Start Configuration<br /> |
| 573 | <div class="outline-text-6" id="text-1-3-1-2-3"> |
| 574 | <p> |
| 575 | Edit the user cron job list with <code>$ crontab -e</code> to add the following |
| 576 | lines: |
| 577 | </p> |
| 578 | |
| 579 | <pre class="example"> |
| 580 | 0 * * * * /bin/bash ~/bkgpslog --output ~/dir |
| 581 | |
| 582 | @reboot /bin/bash ~/bkgpslog --output ~/dir |
| 583 | </pre> |
| 584 | |
| 585 | <p> |
| 586 | The first line will run <code>bkgpslog</code> at the start of every hour and save |
| 587 | output files to the <code>dir</code> directory in your home folder. |
| 588 | </p> |
| 589 | |
| 590 | <p> |
| 591 | The second line will run <code>bkgpslog</code> when the system starts up. |
| 592 | </p> |
| 593 | |
| 594 | <p> |
| 595 | <code>/bin/bash</code> tells <code>cron</code> to run <code>bkgpslog</code> with Bash. |
| 596 | </p> |
| 597 | |
| 598 | <p> |
| 599 | If encryption and compression are required, then the appropriate |
| 600 | options must be added. The lines that must be added via <code>$ crontab -e</code> |
| 601 | may resemble: |
| 602 | </p> |
| 603 | |
| 604 | <pre class="example"> |
| 605 | 0 * * * * /bin/bash ~/bkgpslog -c -e -r age1z2...qkv6p -o ~/dir |
| 606 | |
| 607 | @reboot /bin/bash ~/bkgpslog -c -e -r age1z2...qkv6p -o ~/dir |
| 608 | </pre> |
| 609 | |
| 610 | <p> |
| 611 | The <code>age1z2...qkv6p</code> is an <code>age</code> public key string. Please see the |
| 612 | <a href="#org4647532">Key Generation</a> section for an explanation. |
| 613 | </p> |
| 614 | |
| 615 | <p> |
| 616 | The options are: |
| 617 | </p> |
| 618 | |
| 619 | <pre class="example"> |
| 620 | -c : tells bkgpslog to compress output |
| 621 | -e : tells bkgpslog log to encrypt output |
| 622 | -r : tells bkgpslog to interpret the next argument as a pubkey string |
| 623 | -o : tells bkgpslog to write output files to the directory represented |
| 624 | by the next argument |
| 625 | |
| 626 | </pre> |
| 627 | </div> |
| 628 | </li> |
| 629 | |
| 630 | <li><a id="org2de2dd5"></a>Log Transfer Configuration<br /> |
| 631 | <div class="outline-text-6" id="text-1-3-1-2-4"> |
| 632 | <p> |
| 633 | Log files may be shared to other machines via <code>syncthing</code>. See <a href="https://docs.syncthing.net/">this</a> |
| 634 | manual for how to set up a shared folder and add Ninfacyzga-01 as a |
| 635 | device. Syncthing's directory synchronization capability allows a |
| 636 | remote machine to delete files from Ninfacyzga-01 by deleting from the |
| 637 | shared folder that they both share. |
| 638 | </p> |
| 639 | |
| 640 | <p> |
| 641 | When log files are removed from Ninfacyzga-01 is not within the scope |
| 642 | of this document. |
| 643 | </p> |
| 644 | </div> |
| 645 | </li> |
| 646 | |
| 647 | <li><a id="org4647532"></a>Key Generation<br /> |
| 648 | <div class="outline-text-6" id="text-1-3-1-2-5"> |
| 649 | <p> |
| 650 | An <code>age</code> encryption key may be generated like so: |
| 651 | </p> |
| 652 | <pre class="example"> |
| 653 | $ umask # Gets current umask |
| 654 | 0022 # Note: This is the default umask for Raspbian 10 |
| 655 | $ umask 066 # So key.txt will have no perms except for owner (you) |
| 656 | $ umask # Confirm umask set to 066 |
| 657 | 0066 |
| 658 | $ age-keygen > key.txt |
| 659 | Public key: age1pu5usxm743sx7rf22985xv2f4s0luzv6r6yx4fa7p8c2zyvp9fvqus2xr5 |
| 660 | $ ls -al key.txt |
| 661 | -rw------- 1 baltakatei baltakatei 184 Jun 29 18:28 key.txt |
| 662 | $ umask 0022 # Return umask to default value |
| 663 | $ umask |
| 664 | 0022 |
| 665 | </pre> |
| 666 | |
| 667 | <p> |
| 668 | The resulting public/private keypair data looks like: |
| 669 | </p> |
| 670 | <pre class="example"> |
| 671 | $ cat key.txt |
| 672 | # created: 2020-06-29T18:01:56Z |
| 673 | # public key: age1pu5usxm743sx7rf22985xv2f4s0luzv6r6yx4fa7p8c2zyvp9fvqus2xr5 |
| 674 | AGE-SECRET-KEY-1NEUU5U2XGZGL9UYWNPU5DL99TGJJHFSN4F2E2WCCSDJJ6L5ZMLESNTVTU0 |
| 675 | </pre> |
| 676 | |
| 677 | <p> |
| 678 | The file <code>key.txt</code> is not password-protected by default and should be |
| 679 | secured like an SSH public key should. The <code>$ umask 066</code> command run |
| 680 | before the <code>$ age-keygen > key.txt</code> command ensures <code>key.txt</code> will not |
| 681 | be readable, writeable, or executable to anyone except the owner |
| 682 | (you). |
| 683 | </p> |
| 684 | </div> |
| 685 | </li> |
| 686 | </ol> |
| 687 | </li> |
| 688 | </ol> |
| 689 | </div> |
| 690 | |
| 691 | <div id="outline-container-org8fbf566" class="outline-4"> |
| 692 | <h4 id="org8fbf566"><span class="section-number-4">1.3.2</span> Normal Startup</h4> |
| 693 | <div class="outline-text-4" id="text-1-3-2"> |
| 694 | <p> |
| 695 | Turn on Ninfacyzga-01 by supplying 5VDC power to the Raspberry Pi. No |
| 696 | further interaction should be required. |
| 697 | </p> |
| 698 | </div> |
| 699 | </div> |
| 700 | <div id="outline-container-orgbc8af37" class="outline-4"> |
| 701 | <h4 id="orgbc8af37"><span class="section-number-4">1.3.3</span> Normal Operation</h4> |
| 702 | <div class="outline-text-4" id="text-1-3-3"> |
| 703 | <p> |
| 704 | No interaction beyond continually supplying approximately 100mA of |
| 705 | 5VDC power and occasionally removing log files to conserve disk space |
| 706 | is required. |
| 707 | </p> |
| 708 | </div> |
| 709 | <ol class="org-ol"> |
| 710 | <li><a id="orgeaa5887"></a>Log Transfer<br /> |
| 711 | <div class="outline-text-5" id="text-1-3-3-1"> |
| 712 | <p> |
| 713 | Log files may be transferred by use of <code>syncthing</code> shared folders. |
| 714 | </p> |
| 715 | </div> |
| 716 | </li> |
| 717 | <li><a id="org51a37e4"></a>Automatic Updates<br /> |
| 718 | <div class="outline-text-5" id="text-1-3-3-2"> |
| 719 | <p> |
| 720 | The <code>automatic-upgrades</code> package, if installed, should automatically |
| 721 | install security patches to packages installed via <code>apt</code>. |
| 722 | </p> |
| 723 | </div> |
| 724 | </li> |
| 725 | </ol> |
| 726 | </div> |
| 727 | <div id="outline-container-org46c0af5" class="outline-4"> |
| 728 | <h4 id="org46c0af5"><span class="section-number-4">1.3.4</span> Normal Shutdown</h4> |
| 729 | <div class="outline-text-4" id="text-1-3-4"> |
| 730 | <p> |
| 731 | The system may be shutdown via SSH by running: |
| 732 | </p> |
| 733 | |
| 734 | <pre class="example"> |
| 735 | $ sudo shutdown -r 0 |
| 736 | |
| 737 | </pre> |
| 738 | </div> |
| 739 | </div> |
| 740 | |
| 741 | <div id="outline-container-org662e1e8" class="outline-4"> |
| 742 | <h4 id="org662e1e8"><span class="section-number-4">1.3.5</span> Unscheduled Shutdown</h4> |
| 743 | <div class="outline-text-4" id="text-1-3-5"> |
| 744 | <p> |
| 745 | Ninfacyzga-01 as described and setup should tolerate unscheduled power |
| 746 | loss. Log files being written every 60 seconds means, at most, 60 |
| 747 | seconds worth of location data may be lost. |
| 748 | </p> |
| 749 | </div> |
| 750 | </div> |
| 751 | <div id="outline-container-org70e088c" class="outline-4"> |
| 752 | <h4 id="org70e088c"><span class="section-number-4">1.3.6</span> End of Life Disposal</h4> |
| 753 | <div class="outline-text-4" id="text-1-3-6"> |
| 754 | <p> |
| 755 | LiPo batteries used by the PiZ Uptime 2.0 module should be disposed of |
| 756 | properly with their potential ignitability in mind, especially if they |
| 757 | are not fully discharged. |
| 758 | </p> |
| 759 | |
| 760 | <p> |
| 761 | Consult your local municipality for its "E-Waste Disposal" (or |
| 762 | equivalent) policy. Metals used in the Raspberry Pi and related |
| 763 | components may be recycled. |
| 764 | </p> |
| 765 | |
| 766 | <p> |
| 767 | Take extra precuation if lead solder was used in assembling the |
| 768 | electronics. Consumer electronics in early 21st century should use |
| 769 | lead-free solder. |
| 770 | </p> |
| 771 | </div> |
| 772 | </div> |
| 773 | </div> |
| 774 | </div> |
| 775 | <div id="footnotes"> |
| 776 | <h2 class="footnotes">Footnotes: </h2> |
| 777 | <div id="text-footnotes"> |
| 778 | |
| 779 | <div class="footdef"><sup><a id="fn.1" class="footnum" href="#fnr.1">1</a></sup> <div class="footpara"><p class="footpara"> |
| 780 | Explanation: |
| 781 | <a href="https://ideaheap.com/2013/07/stopping-sd-card-corruption-on-a-raspberry-pi/">https://ideaheap.com/2013/07/stopping-sd-card-corruption-on-a-raspberry-pi/</a> |
| 782 | </p></div></div> |
| 783 | |
| 784 | <div class="footdef"><sup><a id="fn.2" class="footnum" href="#fnr.2">2</a></sup> <div class="footpara"><p class="footpara"> |
| 785 | Persistant disabling of swap in |
| 786 | Raspbian 10 Buster: |
| 787 | <a href="https://www.raspberrypi.org/forums/viewtopic.php?p=1490692&sid=5c596a124b7805d6b10dab8d3d7caf16#p1490692">https://www.raspberrypi.org/forums/viewtopic.php?p=1490692&sid=5c596a124b7805d6b10dab8d3d7caf16#p1490692</a> |
| 788 | </p></div></div> |
| 789 | |
| 790 | |
| 791 | </div> |
| 792 | </div></div> |
| 793 | <div id="postamble" class="status"> |
| 794 | <p class="author">Author: Steven Baltakatei Sandoval</p> |
| 795 | <p class="date">Created: 2020-06-30 Tue 19:45</p> |
| 796 | <p class="validation"><a href="http://validator.w3.org/check?uri=referer">Validate</a></p> |
| 797 | </div> |
| 798 | </body> |
| 799 | </html> |