Commit | Line | Data |
---|---|---|
3f9df02d SBS |
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-29 Mon 22:27 --> | |
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="#orgb231d05">1. Location Logging</a> | |
238 | <ul> | |
239 | <li><a href="#orga7b5d26">1.1. Narrative</a></li> | |
240 | <li><a href="#orgc6050dc">1.2. Description</a> | |
241 | <ul> | |
242 | <li><a href="#org832c363">1.2.1. Hardware</a></li> | |
243 | <li><a href="#orgbe37034">1.2.2. Software</a></li> | |
244 | <li><a href="#org578c835">1.2.3. Output</a></li> | |
245 | </ul> | |
246 | </li> | |
247 | <li><a href="#org7bb3aad">1.3. Operating Procedures</a> | |
248 | <ul> | |
249 | <li><a href="#orge393fe1">1.3.1. Initial Startup</a></li> | |
250 | <li><a href="#orgcaf0980">1.3.2. Normal Startup</a></li> | |
251 | <li><a href="#org73571fc">1.3.3. Normal Operation</a></li> | |
252 | <li><a href="#orga82b5fb">1.3.4. Normal Shutdown</a></li> | |
253 | <li><a href="#org5305842">1.3.5. Unscheduled Shutdown</a></li> | |
254 | <li><a href="#org4a5c4af">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-orgb231d05" class="outline-2"> | |
263 | <h2 id="orgb231d05"><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 | <span class="timestamp-wrapper"><span class="timestamp"><2020-06-29 Mon 12:14> </span></span> 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 <span class="timestamp-wrapper"><span class="timestamp"><2020-06-29 Mon 22:06></span></span>. | |
269 | </p> | |
270 | </div> | |
271 | <div id="outline-container-orga7b5d26" class="outline-3"> | |
272 | <h3 id="orga7b5d26"><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-orgc6050dc" class="outline-3"> | |
286 | <h3 id="orgc6050dc"><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-org832c363" class="outline-4"> | |
290 | <h4 id="org832c363"><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="orgb0e8ddc"></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="org7b37dcc"></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-orgbe37034" class="outline-4"> | |
311 | <h4 id="orgbe37034"><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="org0c488b2"></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-org578c835" class="outline-4"> | |
366 | <h4 id="org578c835"><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="org72b99a5"></a>File Formats<br /> | |
371 | <ol class="org-ol"> | |
372 | <li><a id="orgdb7241e"></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="orgeea00c8"></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="orgc8b05e7"></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="org5c2a1ad"></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="org460d569"></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="org1a5268c"></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-org7bb3aad" class="outline-3"> | |
466 | <h3 id="org7bb3aad"><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-orge393fe1" class="outline-4"> | |
470 | <h4 id="orge393fe1"><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="org5d6581b"></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="orgdf04559"></a>Software Setup<br /> | |
494 | <ol class="org-ol"> | |
495 | <li><a id="org4804e32"></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="orgcf659dd"></a>Automatic Start Configuration<br /> | |
527 | <div class="outline-text-6" id="text-1-3-1-2-2"> | |
528 | <p> | |
529 | Edit the user cron job list with <code>$ crontab -e</code> to add the following | |
530 | lines: | |
531 | </p> | |
532 | ||
533 | <pre class="example"> | |
534 | 0 * * * * /bin/bash ~/bkgpslog --output ~/dir | |
535 | ||
536 | @reboot /bin/bash ~/bkgpslog --output ~/dir | |
537 | </pre> | |
538 | ||
539 | <p> | |
540 | The first line will run <code>bkgpslog</code> at the start of every hour and save | |
541 | output files to the <code>dir</code> directory in your home folder. | |
542 | </p> | |
543 | ||
544 | <p> | |
545 | The second line will run <code>bkgpslog</code> when the system starts up. | |
546 | </p> | |
547 | ||
548 | <p> | |
549 | <code>/bin/bash</code> tells <code>cron</code> to run <code>bkgpslog</code> with Bash. | |
550 | </p> | |
551 | ||
552 | <p> | |
553 | If encryption and compression are required, then the appropriate | |
554 | options must be added. The lines that must be added via <code>$ crontab -e</code> | |
555 | may resemble: | |
556 | </p> | |
557 | ||
558 | <pre class="example"> | |
559 | 0 * * * * /bin/bash ~/bkgpslog -c -e -r age1z2...qkv6p -o ~/dir | |
560 | ||
561 | @reboot /bin/bash ~/bkgpslog -c -e -r age1z2...qkv6p -o ~/dir | |
562 | </pre> | |
563 | ||
564 | <p> | |
565 | The <code>age1z2...qkv6p</code> is an <code>age</code> public key string. Please see the | |
566 | <a href="#orgc8fd75d">Key Generation</a> section for an explanation. | |
567 | </p> | |
568 | ||
569 | <p> | |
570 | The options are: | |
571 | </p> | |
572 | ||
573 | <pre class="example"> | |
574 | -c : tells bkgpslog to compress output | |
575 | -e : tells bkgpslog log to encrypt output | |
576 | -r : tells bkgpslog to interpret the next argument as a pubkey string | |
577 | -o : tells bkgpslog to write output files to the directory represented | |
578 | by the next argument | |
579 | ||
580 | </pre> | |
581 | </div> | |
582 | </li> | |
583 | ||
584 | <li><a id="org5275559"></a>Log Transfer Configuration<br /> | |
585 | <div class="outline-text-6" id="text-1-3-1-2-3"> | |
586 | <p> | |
587 | Log files may be shared to other machines via <code>syncthing</code>. See <a href="https://docs.syncthing.net/">this</a> | |
588 | manual for how to set up a shared folder and add Ninfacyzga-01 as a | |
589 | device. Syncthing's directory synchronization capability allows a | |
590 | remote machine to delete files from Ninfacyzga-01 by deleting from the | |
591 | shared folder that they both share. | |
592 | </p> | |
593 | ||
594 | <p> | |
595 | When log files are removed from Ninfacyzga-01 is not within the scope | |
596 | of this document. | |
597 | </p> | |
598 | </div> | |
599 | </li> | |
600 | ||
601 | <li><a id="orgc8fd75d"></a>Key Generation<br /> | |
602 | <div class="outline-text-6" id="text-1-3-1-2-4"> | |
603 | <p> | |
604 | An <code>age</code> encryption key may be generated like so: | |
605 | </p> | |
606 | <pre class="example"> | |
607 | $ umask # Gets current umask | |
608 | 0022 # Note: This is the default umask for Raspbian 10 | |
609 | $ umask 066 # Sets umask so key.txt will have no permissions except for owner (you) | |
610 | $ umask # Confirm umask set to 066 | |
611 | 0066 | |
612 | $ age-keygen > key.txt | |
613 | Public key: age1pu5usxm743sx7rf22985xv2f4s0luzv6r6yx4fa7p8c2zyvp9fvqus2xr5 | |
614 | $ ls -al key.txt | |
615 | -rw------- 1 baltakatei baltakatei 184 Jun 29 18:28 key.txt | |
616 | $ umask 0022 # Return umask to default value | |
617 | $ umask | |
618 | 0022 | |
619 | </pre> | |
620 | ||
621 | <p> | |
622 | The resulting public/private keypair data looks like: | |
623 | </p> | |
624 | <pre class="example"> | |
625 | $ cat key.txt | |
626 | # created: 2020-06-29T18:01:56Z | |
627 | # public key: age1pu5usxm743sx7rf22985xv2f4s0luzv6r6yx4fa7p8c2zyvp9fvqus2xr5 | |
628 | AGE-SECRET-KEY-1NEUU5U2XGZGL9UYWNPU5DL99TGJJHFSN4F2E2WCCSDJJ6L5ZMLESNTVTU0 | |
629 | </pre> | |
630 | ||
631 | <p> | |
632 | The file <code>key.txt</code> is not password-protected by default and should be | |
633 | secured like an SSH public key should. The <code>$ umask 066</code> command run | |
634 | before the <code>$ age-keygen > key.txt</code> command ensures <code>key.txt</code> will not | |
635 | be readable, writeable, or executable to anyone except the owner | |
636 | (you). | |
637 | </p> | |
638 | </div> | |
639 | </li> | |
640 | </ol> | |
641 | </li> | |
642 | </ol> | |
643 | </div> | |
644 | ||
645 | <div id="outline-container-orgcaf0980" class="outline-4"> | |
646 | <h4 id="orgcaf0980"><span class="section-number-4">1.3.2</span> Normal Startup</h4> | |
647 | <div class="outline-text-4" id="text-1-3-2"> | |
648 | <p> | |
649 | Turn on Ninfacyzga-01 by supplying 5VDC power to the Raspberry Pi. No | |
650 | further interaction should be required. | |
651 | </p> | |
652 | </div> | |
653 | </div> | |
654 | <div id="outline-container-org73571fc" class="outline-4"> | |
655 | <h4 id="org73571fc"><span class="section-number-4">1.3.3</span> Normal Operation</h4> | |
656 | <div class="outline-text-4" id="text-1-3-3"> | |
657 | <p> | |
658 | No interaction beyond continually supplying approximately 100mA of | |
659 | 5VDC power and occasionally removing log files to conserve disk space | |
660 | is required. | |
661 | </p> | |
662 | </div> | |
663 | <ol class="org-ol"> | |
664 | <li><a id="org55738e2"></a>Log Transfer<br /> | |
665 | <div class="outline-text-5" id="text-1-3-3-1"> | |
666 | <p> | |
667 | Log files may be transferred by use of <code>syncthing</code> shared folders. | |
668 | </p> | |
669 | </div> | |
670 | </li> | |
671 | <li><a id="org16c5bdc"></a>Automatic Updates<br /> | |
672 | <div class="outline-text-5" id="text-1-3-3-2"> | |
673 | <p> | |
674 | The <code>automatic-upgrades</code> package, if installed, should automatically | |
675 | install security patches to packages installed via <code>apt</code>. | |
676 | </p> | |
677 | </div> | |
678 | </li> | |
679 | </ol> | |
680 | </div> | |
681 | <div id="outline-container-orga82b5fb" class="outline-4"> | |
682 | <h4 id="orga82b5fb"><span class="section-number-4">1.3.4</span> Normal Shutdown</h4> | |
683 | <div class="outline-text-4" id="text-1-3-4"> | |
684 | <p> | |
685 | The system may be shutdown via SSH by running: | |
686 | </p> | |
687 | ||
688 | <pre class="example"> | |
689 | $ sudo shutdown -r 0 | |
690 | ||
691 | </pre> | |
692 | </div> | |
693 | </div> | |
694 | ||
695 | <div id="outline-container-org5305842" class="outline-4"> | |
696 | <h4 id="org5305842"><span class="section-number-4">1.3.5</span> Unscheduled Shutdown</h4> | |
697 | <div class="outline-text-4" id="text-1-3-5"> | |
698 | <p> | |
699 | Ninfacyzga-01 as described and setup should tolerate unscheduled power | |
700 | loss. Log files being written every 60 seconds means, at most, 60 | |
701 | seconds worth of location data may be lost. | |
702 | </p> | |
703 | </div> | |
704 | </div> | |
705 | <div id="outline-container-org4a5c4af" class="outline-4"> | |
706 | <h4 id="org4a5c4af"><span class="section-number-4">1.3.6</span> End of Life Disposal</h4> | |
707 | <div class="outline-text-4" id="text-1-3-6"> | |
708 | <p> | |
709 | LiPo batteries used by the PiZ Uptime 2.0 module should be disposed of | |
710 | properly with their potential ignitability in mind, especially if they | |
711 | are not fully discharged. | |
712 | </p> | |
713 | ||
714 | <p> | |
715 | Consult your local municipality for its "E-Waste Disposal" (or | |
716 | equivalent) policy. Metals used in the Raspberry Pi and related | |
717 | components may be recycled. | |
718 | </p> | |
719 | ||
720 | <p> | |
721 | Take extra precuation if lead solder was used in assembling the | |
722 | electronics. Consumer electronics in early 21st century should use | |
723 | lead-free solder. | |
724 | </p> | |
725 | </div> | |
726 | </div> | |
727 | </div> | |
728 | </div> | |
729 | </div> | |
730 | <div id="postamble" class="status"> | |
731 | <p class="date">Date: 2020-06-29T22:16Z</p> | |
732 | <p class="author">Author: Steven Baltakatei Sandoval</p> | |
733 | <p class="date">Created: 2020-06-29 Mon 22:27</p> | |
734 | <p class="validation"><a href="http://validator.w3.org/check?uri=referer">Validate</a></p> | |
735 | </div> | |
736 | </body> | |
737 | </html> |