doc(location):Add html version of location README
authorSteven Baltakatei Sandoval <baltakatei@gmail.com>
Mon, 29 Jun 2020 22:28:33 +0000 (22:28 +0000)
committerSteven Baltakatei Sandoval <baltakatei@gmail.com>
Mon, 29 Jun 2020 22:28:33 +0000 (22:28 +0000)
doc/location/README.html [new file with mode: 0644]

diff --git a/doc/location/README.html b/doc/location/README.html
new file mode 100644 (file)
index 0000000..0fb1b6a
--- /dev/null
@@ -0,0 +1,737 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
+<head>
+<!-- 2020-06-29 Mon 22:27 -->
+<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
+<meta name="viewport" content="width=device-width, initial-scale=1" />
+<title>Ninfacyzga-01 Manual</title>
+<meta name="generator" content="Org mode" />
+<meta name="author" content="Steven Baltakatei Sandoval" />
+<style type="text/css">
+ <!--/*--><![CDATA[/*><!--*/
+  .title  { text-align: center;
+             margin-bottom: .2em; }
+  .subtitle { text-align: center;
+              font-size: medium;
+              font-weight: bold;
+              margin-top:0; }
+  .todo   { font-family: monospace; color: red; }
+  .done   { font-family: monospace; color: green; }
+  .priority { font-family: monospace; color: orange; }
+  .tag    { background-color: #eee; font-family: monospace;
+            padding: 2px; font-size: 80%; font-weight: normal; }
+  .timestamp { color: #bebebe; }
+  .timestamp-kwd { color: #5f9ea0; }
+  .org-right  { margin-left: auto; margin-right: 0px;  text-align: right; }
+  .org-left   { margin-left: 0px;  margin-right: auto; text-align: left; }
+  .org-center { margin-left: auto; margin-right: auto; text-align: center; }
+  .underline { text-decoration: underline; }
+  #postamble p, #preamble p { font-size: 90%; margin: .2em; }
+  p.verse { margin-left: 3%; }
+  pre {
+    border: 1px solid #ccc;
+    box-shadow: 3px 3px 3px #eee;
+    padding: 8pt;
+    font-family: monospace;
+    overflow: auto;
+    margin: 1.2em;
+  }
+  pre.src {
+    position: relative;
+    overflow: visible;
+    padding-top: 1.2em;
+  }
+  pre.src:before {
+    display: none;
+    position: absolute;
+    background-color: white;
+    top: -10px;
+    right: 10px;
+    padding: 3px;
+    border: 1px solid black;
+  }
+  pre.src:hover:before { display: inline;}
+  /* Languages per Org manual */
+  pre.src-asymptote:before { content: 'Asymptote'; }
+  pre.src-awk:before { content: 'Awk'; }
+  pre.src-C:before { content: 'C'; }
+  /* pre.src-C++ doesn't work in CSS */
+  pre.src-clojure:before { content: 'Clojure'; }
+  pre.src-css:before { content: 'CSS'; }
+  pre.src-D:before { content: 'D'; }
+  pre.src-ditaa:before { content: 'ditaa'; }
+  pre.src-dot:before { content: 'Graphviz'; }
+  pre.src-calc:before { content: 'Emacs Calc'; }
+  pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
+  pre.src-fortran:before { content: 'Fortran'; }
+  pre.src-gnuplot:before { content: 'gnuplot'; }
+  pre.src-haskell:before { content: 'Haskell'; }
+  pre.src-hledger:before { content: 'hledger'; }
+  pre.src-java:before { content: 'Java'; }
+  pre.src-js:before { content: 'Javascript'; }
+  pre.src-latex:before { content: 'LaTeX'; }
+  pre.src-ledger:before { content: 'Ledger'; }
+  pre.src-lisp:before { content: 'Lisp'; }
+  pre.src-lilypond:before { content: 'Lilypond'; }
+  pre.src-lua:before { content: 'Lua'; }
+  pre.src-matlab:before { content: 'MATLAB'; }
+  pre.src-mscgen:before { content: 'Mscgen'; }
+  pre.src-ocaml:before { content: 'Objective Caml'; }
+  pre.src-octave:before { content: 'Octave'; }
+  pre.src-org:before { content: 'Org mode'; }
+  pre.src-oz:before { content: 'OZ'; }
+  pre.src-plantuml:before { content: 'Plantuml'; }
+  pre.src-processing:before { content: 'Processing.js'; }
+  pre.src-python:before { content: 'Python'; }
+  pre.src-R:before { content: 'R'; }
+  pre.src-ruby:before { content: 'Ruby'; }
+  pre.src-sass:before { content: 'Sass'; }
+  pre.src-scheme:before { content: 'Scheme'; }
+  pre.src-screen:before { content: 'Gnu Screen'; }
+  pre.src-sed:before { content: 'Sed'; }
+  pre.src-sh:before { content: 'shell'; }
+  pre.src-sql:before { content: 'SQL'; }
+  pre.src-sqlite:before { content: 'SQLite'; }
+  /* additional languages in org.el's org-babel-load-languages alist */
+  pre.src-forth:before { content: 'Forth'; }
+  pre.src-io:before { content: 'IO'; }
+  pre.src-J:before { content: 'J'; }
+  pre.src-makefile:before { content: 'Makefile'; }
+  pre.src-maxima:before { content: 'Maxima'; }
+  pre.src-perl:before { content: 'Perl'; }
+  pre.src-picolisp:before { content: 'Pico Lisp'; }
+  pre.src-scala:before { content: 'Scala'; }
+  pre.src-shell:before { content: 'Shell Script'; }
+  pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
+  /* additional language identifiers per "defun org-babel-execute"
+       in ob-*.el */
+  pre.src-cpp:before  { content: 'C++'; }
+  pre.src-abc:before  { content: 'ABC'; }
+  pre.src-coq:before  { content: 'Coq'; }
+  pre.src-groovy:before  { content: 'Groovy'; }
+  /* additional language identifiers from org-babel-shell-names in
+     ob-shell.el: ob-shell is the only babel language using a lambda to put
+     the execution function name together. */
+  pre.src-bash:before  { content: 'bash'; }
+  pre.src-csh:before  { content: 'csh'; }
+  pre.src-ash:before  { content: 'ash'; }
+  pre.src-dash:before  { content: 'dash'; }
+  pre.src-ksh:before  { content: 'ksh'; }
+  pre.src-mksh:before  { content: 'mksh'; }
+  pre.src-posh:before  { content: 'posh'; }
+  /* Additional Emacs modes also supported by the LaTeX listings package */
+  pre.src-ada:before { content: 'Ada'; }
+  pre.src-asm:before { content: 'Assembler'; }
+  pre.src-caml:before { content: 'Caml'; }
+  pre.src-delphi:before { content: 'Delphi'; }
+  pre.src-html:before { content: 'HTML'; }
+  pre.src-idl:before { content: 'IDL'; }
+  pre.src-mercury:before { content: 'Mercury'; }
+  pre.src-metapost:before { content: 'MetaPost'; }
+  pre.src-modula-2:before { content: 'Modula-2'; }
+  pre.src-pascal:before { content: 'Pascal'; }
+  pre.src-ps:before { content: 'PostScript'; }
+  pre.src-prolog:before { content: 'Prolog'; }
+  pre.src-simula:before { content: 'Simula'; }
+  pre.src-tcl:before { content: 'tcl'; }
+  pre.src-tex:before { content: 'TeX'; }
+  pre.src-plain-tex:before { content: 'Plain TeX'; }
+  pre.src-verilog:before { content: 'Verilog'; }
+  pre.src-vhdl:before { content: 'VHDL'; }
+  pre.src-xml:before { content: 'XML'; }
+  pre.src-nxml:before { content: 'XML'; }
+  /* add a generic configuration mode; LaTeX export needs an additional
+     (add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
+  pre.src-conf:before { content: 'Configuration File'; }
+
+  table { border-collapse:collapse; }
+  caption.t-above { caption-side: top; }
+  caption.t-bottom { caption-side: bottom; }
+  td, th { vertical-align:top;  }
+  th.org-right  { text-align: center;  }
+  th.org-left   { text-align: center;   }
+  th.org-center { text-align: center; }
+  td.org-right  { text-align: right;  }
+  td.org-left   { text-align: left;   }
+  td.org-center { text-align: center; }
+  dt { font-weight: bold; }
+  .footpara { display: inline; }
+  .footdef  { margin-bottom: 1em; }
+  .figure { padding: 1em; }
+  .figure p { text-align: center; }
+  .inlinetask {
+    padding: 10px;
+    border: 2px solid gray;
+    margin: 10px;
+    background: #ffffcc;
+  }
+  #org-div-home-and-up
+   { text-align: right; font-size: 70%; white-space: nowrap; }
+  textarea { overflow-x: auto; }
+  .linenr { font-size: smaller }
+  .code-highlighted { background-color: #ffff00; }
+  .org-info-js_info-navigation { border-style: none; }
+  #org-info-js_console-label
+    { font-size: 10px; font-weight: bold; white-space: nowrap; }
+  .org-info-js_search-highlight
+    { background-color: #ffff00; color: #000000; font-weight: bold; }
+  .org-svg { width: 90%; }
+  /*]]>*/-->
+</style>
+<script type="text/javascript">
+/*
+@licstart  The following is the entire license notice for the
+JavaScript code in this tag.
+
+Copyright (C) 2012-2018 Free Software Foundation, Inc.
+
+The JavaScript code in this tag is free software: you can
+redistribute it and/or modify it under the terms of the GNU
+General Public License (GNU GPL) as published by the Free Software
+Foundation, either version 3 of the License, or (at your option)
+any later version.  The code is distributed WITHOUT ANY WARRANTY;
+without even the implied warranty of MERCHANTABILITY or FITNESS
+FOR A PARTICULAR PURPOSE.  See the GNU GPL for more details.
+
+As additional permission under GNU GPL version 3 section 7, you
+may distribute non-source (e.g., minimized or compacted) forms of
+that code without the copy of the GNU GPL normally required by
+section 4, provided you include this license notice and a URL
+through which recipients can access the Corresponding Source.
+
+
+@licend  The above is the entire license notice
+for the JavaScript code in this tag.
+*/
+<!--/*--><![CDATA[/*><!--*/
+ function CodeHighlightOn(elem, id)
+ {
+   var target = document.getElementById(id);
+   if(null != target) {
+     elem.cacheClassElem = elem.className;
+     elem.cacheClassTarget = target.className;
+     target.className = "code-highlighted";
+     elem.className   = "code-highlighted";
+   }
+ }
+ function CodeHighlightOff(elem, id)
+ {
+   var target = document.getElementById(id);
+   if(elem.cacheClassElem)
+     elem.className = elem.cacheClassElem;
+   if(elem.cacheClassTarget)
+     target.className = elem.cacheClassTarget;
+ }
+/*]]>*///-->
+</script>
+</head>
+<body>
+<div id="content">
+<h1 class="title">Ninfacyzga-01 Manual</h1>
+<div id="table-of-contents">
+<h2>Table of Contents</h2>
+<div id="text-table-of-contents">
+<ul>
+<li><a href="#orgb231d05">1. Location Logging</a>
+<ul>
+<li><a href="#orga7b5d26">1.1. Narrative</a></li>
+<li><a href="#orgc6050dc">1.2. Description</a>
+<ul>
+<li><a href="#org832c363">1.2.1. Hardware</a></li>
+<li><a href="#orgbe37034">1.2.2. Software</a></li>
+<li><a href="#org578c835">1.2.3. Output</a></li>
+</ul>
+</li>
+<li><a href="#org7bb3aad">1.3. Operating Procedures</a>
+<ul>
+<li><a href="#orge393fe1">1.3.1. Initial Startup</a></li>
+<li><a href="#orgcaf0980">1.3.2. Normal Startup</a></li>
+<li><a href="#org73571fc">1.3.3. Normal Operation</a></li>
+<li><a href="#orga82b5fb">1.3.4. Normal Shutdown</a></li>
+<li><a href="#org5305842">1.3.5. Unscheduled Shutdown</a></li>
+<li><a href="#org4a5c4af">1.3.6. End of Life Disposal</a></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+</div>
+<div id="outline-container-orgb231d05" class="outline-2">
+<h2 id="orgb231d05"><span class="section-number-2">1</span> Location Logging</h2>
+<div class="outline-text-2" id="text-1">
+<p>
+This document was created by Steven Baltakatei Sandoval on
+<span class="timestamp-wrapper"><span class="timestamp">&lt;2020-06-29 Mon 12:14&gt; </span></span> under a <a href="https://creativecommons.org/licenses/by-sa/4.0/">Creative Commons BY-SA 4.0 license</a>. It
+was updated by Steven Baltakatei Sandoval on <span class="timestamp-wrapper"><span class="timestamp">&lt;2020-06-29 Mon 22:06&gt;</span></span>.
+</p>
+</div>
+<div id="outline-container-orga7b5d26" class="outline-3">
+<h3 id="orga7b5d26"><span class="section-number-3">1.1</span> Narrative</h3>
+<div class="outline-text-3" id="text-1-1">
+<p>
+Ninfacyzga-01 records (logs) its position in time and space using a
+<a href="https://en.wikipedia.org/wiki/Satellite_navigation_device">GPS receiver</a>. The NMEA location data produced by the receiver is
+converted into the more commonly used GPS data storage formats of GPX
+and KML. All three types of data are then compressed and encrypted
+against a set of public keys. The encrypted data is then written to
+disk. Data produced by the receiver is segmented into 60-second chunks
+before being processed and written to disk.
+</p>
+</div>
+</div>
+<div id="outline-container-orgc6050dc" class="outline-3">
+<h3 id="orgc6050dc"><span class="section-number-3">1.2</span> Description</h3>
+<div class="outline-text-3" id="text-1-2">
+</div>
+<div id="outline-container-org832c363" class="outline-4">
+<h4 id="org832c363"><span class="section-number-4">1.2.1</span> Hardware</h4>
+<div class="outline-text-4" id="text-1-2-1">
+</div>
+<ol class="org-ol">
+<li><a id="orgb0e8ddc"></a>Raspberry Pi Zero W<br />
+<div class="outline-text-5" id="text-1-2-1-1">
+<p>
+See the <a href="https://www.raspberrypi.org/pi-zero-w/">OEM</a> webpage for this product.
+</p>
+</div>
+</li>
+<li><a id="org7b37dcc"></a>PiZ UpTime 2.0<br />
+<div class="outline-text-5" id="text-1-2-1-2">
+<p>
+See the <a href="https://alchemy-power.com/piz-uptime-2-0/">OEM</a> webpage for this product.
+</p>
+</div>
+</li>
+</ol>
+</div>
+<div id="outline-container-orgbe37034" class="outline-4">
+<h4 id="orgbe37034"><span class="section-number-4">1.2.2</span> Software</h4>
+<div class="outline-text-4" id="text-1-2-2">
+<p>
+<code>bkgpslog</code> : The bash script that performs the location data
+collection and processing. Is an executable file contained within this
+repository at <code>exec/bkgpslog</code>. It should be copied to
+<code>$HOME/.local/bin</code>.
+</p>
+
+<p>
+<code>gpsd</code> : A background daemon app capable of interfacing with the
+Ozzmaker BerryGPS-IMU's GPS submodule. Installed and initialized by
+<code>apt</code>.
+</p>
+
+<p>
+<code>gpspipe</code> : A command line app that polls <code>gpsd</code> and produces a stream
+stdout consisting of GPS data lines in NMEA format. Installed via
+<code>apt</code>.
+</p>
+
+<p>
+<code>gpsbabel</code> : A command line app that converts GPS data from one format
+into another. <code>bkgpslog</code> uses it to convert NMEA data into GPX and
+KML. Installed via <code>apt</code>.
+</p>
+
+<p>
+<code>gzip</code> : A simple command line app that compresses stdin into a
+smaller stdout stream.
+</p>
+
+<p>
+<code>age</code> : A simple command line app that encrypts stdin against public
+keys specified in its options. Produces encrypted stdout. Is an
+executable file contained within this repository at <code>exec/age</code>. It
+should be copied to <code>$HOME/.local/bin</code>.
+</p>
+</div>
+
+<ol class="org-ol">
+<li><a id="org0c488b2"></a>Narrative<br />
+<div class="outline-text-5" id="text-1-2-2-1">
+<p>
+<code>bkgpslog</code> populates a 60-second buffer with NMEA data from <code>gpsd</code> via
+<code>gpspipe</code>. This buffer is used by <code>gpsbabel</code> to produce GPX and KML
+versions of the buffer. All 3 buffers are then comprssed with <code>gzip</code>,
+encrypted with <code>age</code>, and then written to disk.
+</p>
+</div>
+</li>
+</ol>
+</div>
+
+<div id="outline-container-org578c835" class="outline-4">
+<h4 id="org578c835"><span class="section-number-4">1.2.3</span> Output</h4>
+<div class="outline-text-4" id="text-1-2-3">
+</div>
+<ol class="org-ol">
+<li><a id="org72b99a5"></a>File Formats<br />
+<ol class="org-ol">
+<li><a id="orgdb7241e"></a>NMEA<br />
+<div class="outline-text-6" id="text-1-2-3-1-1">
+<p>
+See the <a href="https://en.wikipedia.org/wiki/NMEA_0183">Wikipedia page</a> for this.
+</p>
+</div>
+</li>
+<li><a id="orgeea00c8"></a>GPX<br />
+<div class="outline-text-6" id="text-1-2-3-1-2">
+<p>
+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.
+</p>
+</div>
+</li>
+<li><a id="orgc8b05e7"></a>KML<br />
+<div class="outline-text-6" id="text-1-2-3-1-3">
+<p>
+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.
+</p>
+</div>
+</li>
+</ol>
+</li>
+<li><a id="org5c2a1ad"></a>Encryption Method<br />
+<div class="outline-text-5" id="text-1-2-3-2">
+<p>
+Files produced by the bkgpslog script are encrypted against a set of
+public keys using <a href="https://github.com/FiloSottile/age"><code>age</code></a>, a simple command line encryption tool
+selected over <code>gpg</code> because of <code>age</code>'s deliberate lack of
+configurability.
+</p>
+
+<p>
+The public keys are bech32 strings supplied as options to bkgpslog
+when called. The secret key should <b>NOT</b> be stored in Ninfacyzga-01.
+</p>
+
+<p>
+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>
+key pair. See the <a href="https://age-encryption.org/v1"><code>age</code> Version 1 specification</a>.
+</p>
+
+<p>
+An <code>ssh-rsa</code> or <code>ssh-ed25519</code> SSH public key string may be used instead of
+the bech32 public key string produced by <code>age-keygen</code> for convenience.
+</p>
+
+<p>
+Help information for <code>age</code> is available by running <code>$ age --help</code>.
+</p>
+</div>
+<ol class="org-ol">
+<li><a id="org460d569"></a>Encryption Commands<br />
+<div class="outline-text-6" id="text-1-2-3-2-1">
+<p>
+Files may be encrypted to several recipients using a command similar to:
+</p>
+<pre class="example">
+timeout "60s" gpspipe -r | gpsbabel -i nmea -f - -o gpx -F | age \
+-r age1kza7pfshy7xwygf9349zgmk7x53mquvedgw9r98qwyyqhssh830qqjzlsw \
+-r age1ce3pvzrqfcn2pc6zqzglc8ac8yjk3fzukpy08cesqjjwns53xywqmaq7xw \
+-r age1pu5usxm743sx7rf22985xv2f4s0luzv6r6yx4fa7p8c2zyvp9fvqus2xr5 \
+&gt; location.gpx.age
+</pre>
+
+<p>
+In this example, the strings beginning with <code>age1...</code> are
+bech32-formatted public key strings. 
+</p>
+</div>
+</li>
+
+
+<li><a id="org1a5268c"></a>Decryption Commands<br />
+<div class="outline-text-6" id="text-1-2-3-2-2">
+<p>
+Files may be decrypted using a command similar to:
+</p>
+
+<pre class="example">
+cat location.gpx.age | age -d -i key.txt &gt; location.gpx
+</pre>
+
+<p>
+The version of <code>age</code> used to perform the encryption 
+</p>
+</div>
+</li>
+</ol>
+</li>
+</ol>
+</div>
+</div>
+<div id="outline-container-org7bb3aad" class="outline-3">
+<h3 id="org7bb3aad"><span class="section-number-3">1.3</span> Operating Procedures</h3>
+<div class="outline-text-3" id="text-1-3">
+</div>
+<div id="outline-container-orge393fe1" class="outline-4">
+<h4 id="orge393fe1"><span class="section-number-4">1.3.1</span> Initial Startup</h4>
+<div class="outline-text-4" id="text-1-3-1">
+<p>
+See OEM (Ozzmaker) <a href="https://ozzmaker.com/berrygps-berrygps-imu-quick-start-guide/">quickstart guide for the BerryGPS-IMU</a>.
+</p>
+</div>
+
+<ol class="org-ol">
+<li><a id="org5d6581b"></a>Physical Setup<br />
+<div class="outline-text-5" id="text-1-3-1-1">
+<p>
+BerryGPS-IMU must be electrically connected to the correct pins on the
+GPIO header of a Raspberry Pi Zero W.
+</p>
+
+<p>
+<b>Optional</b>: stack together with PiZ Uptime 2.0 module. No GPIO pins
+conflict so a simple stacking and soldering with long header pins is
+possible.
+</p>
+</div>
+</li>
+
+<li><a id="orgdf04559"></a>Software Setup<br />
+<ol class="org-ol">
+<li><a id="org4804e32"></a>Install Executables<br />
+<div class="outline-text-6" id="text-1-3-1-2-1">
+<p>
+Install Raspbian 10 Buster onto an SD card image. See the Raspberry Pi
+Foundation <a href="https://www.raspberrypi.org/documentation/installation/installing-images/README.md">installation instructions</a>. Configure WiFi to permit log
+file transfer. Configure SSH to permit remote administration via the
+command line interface.
+</p>
+
+<p>
+Make sure to install the <code>unattended-upgrades</code> package to make sure
+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>
+for a description of how <code>unattended-upgrades</code> works.
+</p>
+
+<p>
+Install <code>gpsd</code>, <code>gpspipe</code>, <code>git</code>, and this repository for location
+logging capability.
+</p>
+
+<p>
+Install <code>syncthing</code> for log file transfer capability.
+</p>
+
+<p>
+Place <code>age</code> binary (the one compiled for ARM CPU architecture for
+Linux) in <code>$HOME/.local/bin</code>.
+</p>
+</div>
+</li>
+
+<li><a id="orgcf659dd"></a>Automatic Start Configuration<br />
+<div class="outline-text-6" id="text-1-3-1-2-2">
+<p>
+Edit the user cron job list with <code>$ crontab -e</code> to add the following
+lines:
+</p>
+
+<pre class="example">
+0 * * * * /bin/bash ~/bkgpslog --output ~/dir
+
+@reboot /bin/bash ~/bkgpslog --output ~/dir
+</pre>
+
+<p>
+The first line will run <code>bkgpslog</code> at the start of every hour and save
+output files to the <code>dir</code> directory in your home folder.
+</p>
+
+<p>
+The second line will run <code>bkgpslog</code> when the system starts up.
+</p>
+
+<p>
+<code>/bin/bash</code> tells <code>cron</code> to run <code>bkgpslog</code> with Bash.
+</p>
+
+<p>
+If encryption and compression are required, then the appropriate
+options must be added. The lines that must be added via <code>$ crontab -e</code>
+may resemble:
+</p>
+
+<pre class="example">
+0 * * * * /bin/bash ~/bkgpslog -c -e -r age1z2...qkv6p -o ~/dir
+
+@reboot /bin/bash ~/bkgpslog -c -e -r age1z2...qkv6p -o ~/dir
+</pre>
+
+<p>
+The <code>age1z2...qkv6p</code> is an <code>age</code> public key string. Please see the
+<a href="#orgc8fd75d">Key Generation</a> section for an explanation.
+</p>
+
+<p>
+The options are:
+</p>
+
+<pre class="example">
+-c : tells bkgpslog to compress output
+-e : tells bkgpslog log to encrypt output
+-r : tells bkgpslog to interpret the next argument as a pubkey string
+-o : tells bkgpslog to write output files to the directory represented
+       by the next argument
+
+</pre>
+</div>
+</li>
+
+<li><a id="org5275559"></a>Log Transfer Configuration<br />
+<div class="outline-text-6" id="text-1-3-1-2-3">
+<p>
+Log files may be shared to other machines via <code>syncthing</code>. See <a href="https://docs.syncthing.net/">this</a>
+manual for how to set up a shared folder and add Ninfacyzga-01 as a
+device. Syncthing's directory synchronization capability allows a
+remote machine to delete files from Ninfacyzga-01 by deleting from the
+shared folder that they both share.
+</p>
+
+<p>
+When log files are removed from Ninfacyzga-01 is not within the scope
+of this document.
+</p>
+</div>
+</li>
+
+<li><a id="orgc8fd75d"></a>Key Generation<br />
+<div class="outline-text-6" id="text-1-3-1-2-4">
+<p>
+An <code>age</code> encryption key may be generated like so:
+</p>
+<pre class="example">
+$ umask          # Gets current umask
+0022             # Note: This is the default umask for Raspbian 10
+$ umask 066      # Sets umask so key.txt will have no permissions except for owner (you)
+$ umask          # Confirm umask set to 066
+0066
+$ age-keygen &gt; key.txt
+Public key: age1pu5usxm743sx7rf22985xv2f4s0luzv6r6yx4fa7p8c2zyvp9fvqus2xr5
+$ ls -al key.txt
+-rw------- 1 baltakatei baltakatei 184 Jun 29 18:28 key.txt
+$ umask 0022     # Return umask to default value
+$ umask          
+0022
+</pre>
+
+<p>
+The resulting public/private keypair data looks like:
+</p>
+<pre class="example">
+$ cat key.txt
+# created: 2020-06-29T18:01:56Z
+# public key: age1pu5usxm743sx7rf22985xv2f4s0luzv6r6yx4fa7p8c2zyvp9fvqus2xr5
+AGE-SECRET-KEY-1NEUU5U2XGZGL9UYWNPU5DL99TGJJHFSN4F2E2WCCSDJJ6L5ZMLESNTVTU0
+</pre>
+
+<p>
+The file <code>key.txt</code> is not password-protected by default and should be
+secured like an SSH public key should. The <code>$ umask 066</code> command run
+before the <code>$ age-keygen &gt; key.txt</code> command ensures <code>key.txt</code> will not
+be readable, writeable, or executable to anyone except the owner
+(you).
+</p>
+</div>
+</li>
+</ol>
+</li>
+</ol>
+</div>
+
+<div id="outline-container-orgcaf0980" class="outline-4">
+<h4 id="orgcaf0980"><span class="section-number-4">1.3.2</span> Normal Startup</h4>
+<div class="outline-text-4" id="text-1-3-2">
+<p>
+Turn on Ninfacyzga-01 by supplying 5VDC power to the Raspberry Pi. No
+further interaction should be required.
+</p>
+</div>
+</div>
+<div id="outline-container-org73571fc" class="outline-4">
+<h4 id="org73571fc"><span class="section-number-4">1.3.3</span> Normal Operation</h4>
+<div class="outline-text-4" id="text-1-3-3">
+<p>
+No interaction beyond continually supplying approximately 100mA of
+5VDC power and occasionally removing log files to conserve disk space
+is required.
+</p>
+</div>
+<ol class="org-ol">
+<li><a id="org55738e2"></a>Log Transfer<br />
+<div class="outline-text-5" id="text-1-3-3-1">
+<p>
+Log files may be transferred by use of <code>syncthing</code> shared folders.
+</p>
+</div>
+</li>
+<li><a id="org16c5bdc"></a>Automatic Updates<br />
+<div class="outline-text-5" id="text-1-3-3-2">
+<p>
+The <code>automatic-upgrades</code> package, if installed, should automatically
+install security patches to packages installed via <code>apt</code>.
+</p>
+</div>
+</li>
+</ol>
+</div>
+<div id="outline-container-orga82b5fb" class="outline-4">
+<h4 id="orga82b5fb"><span class="section-number-4">1.3.4</span> Normal Shutdown</h4>
+<div class="outline-text-4" id="text-1-3-4">
+<p>
+The system may be shutdown via SSH by running:
+</p>
+
+<pre class="example">
+$ sudo shutdown -r 0
+
+</pre>
+</div>
+</div>
+
+<div id="outline-container-org5305842" class="outline-4">
+<h4 id="org5305842"><span class="section-number-4">1.3.5</span> Unscheduled Shutdown</h4>
+<div class="outline-text-4" id="text-1-3-5">
+<p>
+Ninfacyzga-01 as described and setup should tolerate unscheduled power
+loss. Log files being written every 60 seconds means, at most, 60
+seconds worth of location data may be lost.
+</p>
+</div>
+</div>
+<div id="outline-container-org4a5c4af" class="outline-4">
+<h4 id="org4a5c4af"><span class="section-number-4">1.3.6</span> End of Life Disposal</h4>
+<div class="outline-text-4" id="text-1-3-6">
+<p>
+LiPo batteries used by the PiZ Uptime 2.0 module should be disposed of
+properly with their potential ignitability in mind, especially if they
+are not fully discharged.
+</p>
+
+<p>
+Consult your local municipality for its "E-Waste Disposal" (or
+equivalent) policy. Metals used in the Raspberry Pi and related
+components may be recycled.
+</p>
+
+<p>
+Take extra precuation if lead solder was used in assembling the
+electronics. Consumer electronics in early 21st century should use
+lead-free solder.
+</p>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div id="postamble" class="status">
+<p class="date">Date: 2020-06-29T22:16Z</p>
+<p class="author">Author: Steven Baltakatei Sandoval</p>
+<p class="date">Created: 2020-06-29 Mon 22:27</p>
+<p class="validation"><a href="http://validator.w3.org/check?uri=referer">Validate</a></p>
+</div>
+</body>
+</html>