Browse Source

Merge branch 'stretch' of https://github.com/bashrc/freedombone

Bob Mottram 7 years ago
parent
commit
ed9d6ace6d

+ 2
- 2
doc/EN/mesh_images.org View File

45
 wget https://freedombone.net/downloads/current/freedombone-meshclient-i386.img.xz.sig
45
 wget https://freedombone.net/downloads/current/freedombone-meshclient-i386.img.xz.sig
46
 gpg --verify freedombone-meshclient-i386.img.xz.sig
46
 gpg --verify freedombone-meshclient-i386.img.xz.sig
47
 sha256sum freedombone-meshclient-i386.img.xz
47
 sha256sum freedombone-meshclient-i386.img.xz
48
-6dcf7418d6bd7dbe79f5fcf96f83b48eb59f6c11a50b67c5e2c013195751989e
48
+376668ae375518af268d67b9ccb7ab7b2c2787b445c125f61487ff97950092e8
49
 unxz freedombone-meshclient-i386.img.xz
49
 unxz freedombone-meshclient-i386.img.xz
50
 sudo dd if=/dev/zero of=/dev/sdX bs=1M count=8
50
 sudo dd if=/dev/zero of=/dev/sdX bs=1M count=8
51
 sudo dd bs=1M if=freedombone-meshclient-i386.img of=/dev/sdX conv=fdatasync
51
 sudo dd bs=1M if=freedombone-meshclient-i386.img of=/dev/sdX conv=fdatasync
61
 wget https://freedombone.net/downloads/current/freedombone-meshclient-insecure-i386.img.xz.sig
61
 wget https://freedombone.net/downloads/current/freedombone-meshclient-insecure-i386.img.xz.sig
62
 gpg --verify freedombone-meshclient-insecure-i386.img.xz.sig
62
 gpg --verify freedombone-meshclient-insecure-i386.img.xz.sig
63
 sha256sum freedombone-meshclient-insecure-i386.img.xz
63
 sha256sum freedombone-meshclient-insecure-i386.img.xz
64
-4e9ee5fc5aa11fa58bcceae7f04f017c005a4a2595c0d64ac49de39f88b6590d
64
+81098572ac522b543f2c015dd0819d27c290b93b771efc9de6e93742e3981daf
65
 unxz freedombone-meshclient-insecure-i386.img.xz
65
 unxz freedombone-meshclient-insecure-i386.img.xz
66
 sudo dd if=/dev/zero of=/dev/sdX bs=1M count=8
66
 sudo dd if=/dev/zero of=/dev/sdX bs=1M count=8
67
 sudo dd bs=1M if=freedombone-meshclient-insecure-i386.img of=/dev/sdX conv=fdatasync
67
 sudo dd bs=1M if=freedombone-meshclient-insecure-i386.img of=/dev/sdX conv=fdatasync

BIN
image_build/mesh_apps/ssb.apk View File


+ 26
- 24
src/freedombone-image-customise View File

927
     chmod +x /home/$MY_USERNAME/Desktop/Users.desktop
927
     chmod +x /home/$MY_USERNAME/Desktop/Users.desktop
928
     chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Desktop/Users.desktop
928
     chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Desktop/Users.desktop
929
 
929
 
930
-    if [ ! -f /home/$MY_USERNAME/Desktop/cryptpad.desktop ]; then
931
-        echo '[Desktop Entry]' > /home/$MY_USERNAME/Desktop/cryptpad.desktop
932
-        echo 'Name=CryptPad' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop
933
-        echo 'Type=Application' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop
934
-        echo 'Comment=Realtime collaborative editing of documents' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop
935
-        echo 'Comment[el]=Συνεργατική επεξεργασία εγγράφων σε πραγματικό χρόνο' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop
936
-        echo 'Comment[ar]=في الوقت الحقيقي التحرير التعاوني للوثائق' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop
937
-        echo 'Comment[ca]=Edició col·laborativa en temps real de documents' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop
938
-        echo 'Comment[hi]=दस्तावेज़ों का रीयलटाइम सहयोगी संपादन' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop
939
-        echo 'Comment[fr]=Edition collaborative en temps réel de documents' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop
940
-        echo 'Comment[de]=Kollaboratives Echtzeit-Editing von Dokumenten' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop
941
-        echo 'Comment[es]=Edición colaborativa en tiempo real de documentos' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop
942
-        echo 'Comment[it]=Editing collaborativo di documenti in tempo reale' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop
943
-        echo 'Comment[ru]=Совместное редактирование документов в режиме реального времени' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop
944
-        echo 'Comment[zh]=实时协同编辑文件' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop
945
-        echo "Exec=$BROWSER http://\${HOSTNAME}.local" >> /home/$MY_USERNAME/Desktop/cryptpad.desktop
946
-        echo "Icon=/usr/share/$PROJECT_NAME/avatars/icon_cryptpad.png" >> /home/$MY_USERNAME/Desktop/cryptpad.desktop
947
-        echo 'Terminal=false' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop
948
-        echo 'Categories=Application;' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop
949
-        chmod +x /home/$MY_USERNAME/Desktop/cryptpad.desktop
950
-        chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Desktop/cryptpad.desktop
951
-    else
952
-        if ! grep -q "\${HOSTNAME}.local" /home/$MY_USERNAME/Desktop/cryptpad.desktop; then
953
-            sed -i "s|Exec=.*|Exec=$BROWSER http://\${HOSTNAME}.local|g" /home/$MY_USERNAME/Desktop/cryptpad.desktop
930
+    if [ ! -f /home/$MY_USERNAME/.cryptpad.desktop ]; then
931
+        if [ ! -f /home/$MY_USERNAME/Desktop/cryptpad.desktop ]; then
932
+            echo '[Desktop Entry]' > /home/$MY_USERNAME/Desktop/cryptpad.desktop
933
+            echo 'Name=CryptPad' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop
934
+            echo 'Type=Application' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop
935
+            echo 'Comment=Realtime collaborative editing of documents' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop
936
+            echo 'Comment[el]=Συνεργατική επεξεργασία εγγράφων σε πραγματικό χρόνο' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop
937
+            echo 'Comment[ar]=في الوقت الحقيقي التحرير التعاوني للوثائق' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop
938
+            echo 'Comment[ca]=Edició col·laborativa en temps real de documents' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop
939
+            echo 'Comment[hi]=दस्तावेज़ों का रीयलटाइम सहयोगी संपादन' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop
940
+            echo 'Comment[fr]=Edition collaborative en temps réel de documents' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop
941
+            echo 'Comment[de]=Kollaboratives Echtzeit-Editing von Dokumenten' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop
942
+            echo 'Comment[es]=Edición colaborativa en tiempo real de documentos' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop
943
+            echo 'Comment[it]=Editing collaborativo di documenti in tempo reale' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop
944
+            echo 'Comment[ru]=Совместное редактирование документов в режиме реального времени' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop
945
+            echo 'Comment[zh]=实时协同编辑文件' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop
946
+            echo "Exec=$BROWSER http://\${HOSTNAME}.local" >> /home/$MY_USERNAME/Desktop/cryptpad.desktop
947
+            echo "Icon=/usr/share/$PROJECT_NAME/avatars/icon_cryptpad.png" >> /home/$MY_USERNAME/Desktop/cryptpad.desktop
948
+            echo 'Terminal=false' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop
949
+            echo 'Categories=Application;' >> /home/$MY_USERNAME/Desktop/cryptpad.desktop
950
+            chmod +x /home/$MY_USERNAME/Desktop/cryptpad.desktop
951
+            chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Desktop/cryptpad.desktop
952
+        else
953
+            if ! grep -q "\${HOSTNAME}.local" /home/$MY_USERNAME/Desktop/cryptpad.desktop; then
954
+                sed -i "s|Exec=.*|Exec=$BROWSER http://\${HOSTNAME}.local|g" /home/$MY_USERNAME/Desktop/cryptpad.desktop
955
+            fi
954
         fi
956
         fi
955
     fi
957
     fi
956
 
958
 

+ 32
- 0
src/freedombone-mesh-batman View File

261
     if [ ! -d /var/www/html ]; then
261
     if [ ! -d /var/www/html ]; then
262
         return
262
         return
263
     fi
263
     fi
264
+    # Don't go straight to cryptpad when navigating to the peer's IP address
265
+    if [ -L /etc/nginx/sites-enabled/cryptpad ]; then
266
+        rm /etc/nginx/sites-enabled/cryptpad
267
+        ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/default
268
+        if [ -d /etc/cryptpad ]; then
269
+            systemctl stop cryptpad
270
+            systemctl disable cryptpad
271
+        fi
272
+        systemctl restart nginx
273
+    fi
274
+    # Don't show the cryptpad icon on the desktop
275
+    if [ -f /home/fbone/Desktop/cryptpad.desktop ]; then
276
+        mv /home/fbone/Desktop/cryptpad.desktop /home/fbone/.cryptpad.desktop
277
+    fi
278
+
264
     cp /root/$PROJECT_NAME/website/EN/meshindex.html /var/www/html/index.html
279
     cp /root/$PROJECT_NAME/website/EN/meshindex.html /var/www/html/index.html
265
     if [ ! -f /var/www/html/ssb.apk ]; then
280
     if [ ! -f /var/www/html/ssb.apk ]; then
266
         cp /root/$PROJECT_NAME/image_build/mesh_apps/ssb.apk /var/www/html/ssb.apk
281
         cp /root/$PROJECT_NAME/image_build/mesh_apps/ssb.apk /var/www/html/ssb.apk
361
         systemctl enable hostapd
376
         systemctl enable hostapd
362
         systemctl restart hostapd
377
         systemctl restart hostapd
363
         mesh_create_app_downloads_page
378
         mesh_create_app_downloads_page
379
+    else
380
+        # Recreate the cryptpad symlink
381
+        if [ -f /etc/nginx/sites-available/cryptpad ]; then
382
+            if [ -L /etc/nginx/sites-enabled/cryptpad ]; then
383
+                rm /etc/nginx/sites-enabled/default
384
+            fi
385
+            systemctl enable cryptpad
386
+            systemctl start cryptpad
387
+
388
+            if [ ! -L /etc/nginx/sites-enabled/cryptpad ]; then
389
+                ln -s /etc/nginx/sites-available/cryptpad /etc/nginx/sites-enabled/cryptpad
390
+                systemctl restart nginx
391
+            fi
392
+        fi
393
+        if [ -f /home/fbone/.cryptpad.desktop ]; then
394
+            mv /home/fbone/.cryptpad.desktop /home/fbone/Desktop/cryptpad.desktop
395
+        fi
364
     fi
396
     fi
365
 
397
 
366
     iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
398
     iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

+ 23
- 23
website/EN/mesh_images.html View File

3
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
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">
4
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
5
 <head>
5
 <head>
6
-<!-- 2017-10-30 Mon 12:14 -->
6
+<!-- 2017-11-10 Fri 13:13 -->
7
 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
7
 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
8
 <meta name="viewport" content="width=device-width, initial-scale=1" />
8
 <meta name="viewport" content="width=device-width, initial-scale=1" />
9
 <title>&lrm;</title>
9
 <title>&lrm;</title>
246
 
246
 
247
 <center><h1>Mesh Network: Images</h1></center>
247
 <center><h1>Mesh Network: Images</h1></center>
248
 
248
 
249
-<div id="outline-container-orgbb633ca" class="outline-2">
250
-<h2 id="orgbb633ca">Pre-built Disk Images</h2>
251
-<div class="outline-text-2" id="text-orgbb633ca">
249
+<div id="outline-container-org6d0027e" class="outline-2">
250
+<h2 id="org6d0027e">Pre-built Disk Images</h2>
251
+<div class="outline-text-2" id="text-org6d0027e">
252
 </div>
252
 </div>
253
-<div id="outline-container-org2ed661a" class="outline-3">
254
-<h3 id="org2ed661a">Writing many images quickly</h3>
255
-<div class="outline-text-3" id="text-org2ed661a">
253
+<div id="outline-container-orgaaf029b" class="outline-3">
254
+<h3 id="orgaaf029b">Writing many images quickly</h3>
255
+<div class="outline-text-3" id="text-orgaaf029b">
256
 <p>
256
 <p>
257
 There may be situations where you need to write the same disk image to multiple drives at the same time in order to maximize rate of deployment. In the instructions given below the <b>dd</b> command is used for writing to the target drive, but to write to multiple drives you can use a tool such as <a href="https://wiki.gnome.org/Apps/MultiWriter">GNOME MultiWriter</a>.
257
 There may be situations where you need to write the same disk image to multiple drives at the same time in order to maximize rate of deployment. In the instructions given below the <b>dd</b> command is used for writing to the target drive, but to write to multiple drives you can use a tool such as <a href="https://wiki.gnome.org/Apps/MultiWriter">GNOME MultiWriter</a>.
258
 </p>
258
 </p>
280
 </p>
280
 </p>
281
 </div>
281
 </div>
282
 </div>
282
 </div>
283
-<div id="outline-container-orgac03b6d" class="outline-3">
284
-<h3 id="orgac03b6d">Client images</h3>
285
-<div class="outline-text-3" id="text-orgac03b6d">
283
+<div id="outline-container-orgc0ddf07" class="outline-3">
284
+<h3 id="orgc0ddf07">Client images</h3>
285
+<div class="outline-text-3" id="text-orgc0ddf07">
286
 <div class="org-center">
286
 <div class="org-center">
287
 
287
 
288
 <div class="figure">
288
 <div class="figure">
301
 wget https://freedombone.net/downloads/current/freedombone-meshclient-i386.img.xz.sig
301
 wget https://freedombone.net/downloads/current/freedombone-meshclient-i386.img.xz.sig
302
 gpg --verify freedombone-meshclient-i386.img.xz.sig
302
 gpg --verify freedombone-meshclient-i386.img.xz.sig
303
 sha256sum freedombone-meshclient-i386.img.xz
303
 sha256sum freedombone-meshclient-i386.img.xz
304
-6dcf7418d6bd7dbe79f5fcf96f83b48eb59f6c11a50b67c5e2c013195751989e
304
+376668ae375518af268d67b9ccb7ab7b2c2787b445c125f61487ff97950092e8
305
 unxz freedombone-meshclient-i386.img.xz
305
 unxz freedombone-meshclient-i386.img.xz
306
 sudo dd <span class="org-variable-name">if</span>=/dev/zero <span class="org-variable-name">of</span>=/dev/sdX <span class="org-variable-name">bs</span>=1M <span class="org-variable-name">count</span>=8
306
 sudo dd <span class="org-variable-name">if</span>=/dev/zero <span class="org-variable-name">of</span>=/dev/sdX <span class="org-variable-name">bs</span>=1M <span class="org-variable-name">count</span>=8
307
 sudo dd <span class="org-variable-name">bs</span>=1M <span class="org-variable-name">if</span>=freedombone-meshclient-i386.img <span class="org-variable-name">of</span>=/dev/sdX <span class="org-variable-name">conv</span>=fdatasync
307
 sudo dd <span class="org-variable-name">bs</span>=1M <span class="org-variable-name">if</span>=freedombone-meshclient-i386.img <span class="org-variable-name">of</span>=/dev/sdX <span class="org-variable-name">conv</span>=fdatasync
322
 wget https://freedombone.net/downloads/current/freedombone-meshclient-insecure-i386.img.xz.sig
322
 wget https://freedombone.net/downloads/current/freedombone-meshclient-insecure-i386.img.xz.sig
323
 gpg --verify freedombone-meshclient-insecure-i386.img.xz.sig
323
 gpg --verify freedombone-meshclient-insecure-i386.img.xz.sig
324
 sha256sum freedombone-meshclient-insecure-i386.img.xz
324
 sha256sum freedombone-meshclient-insecure-i386.img.xz
325
-4e9ee5fc5aa11fa58bcceae7f04f017c005a4a2595c0d64ac49de39f88b6590d
325
+81098572ac522b543f2c015dd0819d27c290b93b771efc9de6e93742e3981daf
326
 unxz freedombone-meshclient-insecure-i386.img.xz
326
 unxz freedombone-meshclient-insecure-i386.img.xz
327
 sudo dd <span class="org-variable-name">if</span>=/dev/zero <span class="org-variable-name">of</span>=/dev/sdX <span class="org-variable-name">bs</span>=1M <span class="org-variable-name">count</span>=8
327
 sudo dd <span class="org-variable-name">if</span>=/dev/zero <span class="org-variable-name">of</span>=/dev/sdX <span class="org-variable-name">bs</span>=1M <span class="org-variable-name">count</span>=8
328
 sudo dd <span class="org-variable-name">bs</span>=1M <span class="org-variable-name">if</span>=freedombone-meshclient-insecure-i386.img <span class="org-variable-name">of</span>=/dev/sdX <span class="org-variable-name">conv</span>=fdatasync
328
 sudo dd <span class="org-variable-name">bs</span>=1M <span class="org-variable-name">if</span>=freedombone-meshclient-insecure-i386.img <span class="org-variable-name">of</span>=/dev/sdX <span class="org-variable-name">conv</span>=fdatasync
331
 </div>
331
 </div>
332
 </div>
332
 </div>
333
 
333
 
334
-<div id="outline-container-orgab65b99" class="outline-3">
335
-<h3 id="orgab65b99">Router images</h3>
336
-<div class="outline-text-3" id="text-orgab65b99">
334
+<div id="outline-container-org8eb2396" class="outline-3">
335
+<h3 id="org8eb2396">Router images</h3>
336
+<div class="outline-text-3" id="text-org8eb2396">
337
 <p>
337
 <p>
338
 Routers are intended to build network coverage for an area using small and low cost hardware. You can bolt them to walls or leave them on window ledges. They don't have any user interface and their only job is to haul network traffic across the mesh and to enable peers to find each other via running bootstrap nodes for Tox and IPFS. Copy the image to a microSD card and insert it into the router, plug in an Atheros wifi dongle and power on. That should be all you need to do.
338
 Routers are intended to build network coverage for an area using small and low cost hardware. You can bolt them to walls or leave them on window ledges. They don't have any user interface and their only job is to haul network traffic across the mesh and to enable peers to find each other via running bootstrap nodes for Tox and IPFS. Copy the image to a microSD card and insert it into the router, plug in an Atheros wifi dongle and power on. That should be all you need to do.
339
 </p>
339
 </p>
340
 </div>
340
 </div>
341
-<div id="outline-container-orgf1035dc" class="outline-4">
342
-<h4 id="orgf1035dc">Beaglebone Black</h4>
343
-<div class="outline-text-4" id="text-orgf1035dc">
341
+<div id="outline-container-orgd7fdd98" class="outline-4">
342
+<h4 id="orgd7fdd98">Beaglebone Black</h4>
343
+<div class="outline-text-4" id="text-orgd7fdd98">
344
 <div class="org-center">
344
 <div class="org-center">
345
 
345
 
346
 <div class="figure">
346
 <div class="figure">
359
 wget https://freedombone.net/downloads/current/freedombone-mesh_beaglebone-armhf.img.xz.sig
359
 wget https://freedombone.net/downloads/current/freedombone-mesh_beaglebone-armhf.img.xz.sig
360
 gpg --verify freedombone-mesh_beaglebone-armhf.img.xz.sig
360
 gpg --verify freedombone-mesh_beaglebone-armhf.img.xz.sig
361
 sha256sum freedombone-mesh_beaglebone-armhf.img.xz
361
 sha256sum freedombone-mesh_beaglebone-armhf.img.xz
362
-45f131995e2f77188e7ddaf2b42ca3d8d48d821d37c7a31a21e2e6dcceaf510d
362
+60017999340a6559d1de76f3d78d9771c11de5eeefb3d3b812747ce306251e67
363
 unxz freedombone-mesh_beaglebone-armhf.img.xz
363
 unxz freedombone-mesh_beaglebone-armhf.img.xz
364
 sudo dd <span class="org-variable-name">bs</span>=1M <span class="org-variable-name">if</span>=freedombone-mesh_beaglebone-armhf.img <span class="org-variable-name">of</span>=/dev/sdX <span class="org-variable-name">conv</span>=fdatasync
364
 sudo dd <span class="org-variable-name">bs</span>=1M <span class="org-variable-name">if</span>=freedombone-mesh_beaglebone-armhf.img <span class="org-variable-name">of</span>=/dev/sdX <span class="org-variable-name">conv</span>=fdatasync
365
 </pre>
365
 </pre>
377
 </div>
377
 </div>
378
 </div>
378
 </div>
379
 
379
 
380
-<div id="outline-container-org9976d21" class="outline-2">
381
-<h2 id="org9976d21">Building Disk Images</h2>
382
-<div class="outline-text-2" id="text-org9976d21">
380
+<div id="outline-container-org6584d9d" class="outline-2">
381
+<h2 id="org6584d9d">Building Disk Images</h2>
382
+<div class="outline-text-2" id="text-org6584d9d">
383
 <p>
383
 <p>
384
 It's better not to trust images downloaded from random places on the interwebs. Chances are that unless you are in the web of trust of the above GPG signatures then they don't mean very much to you. If you actually want something trustworthy then build the images from scratch. It will take some time. Here's how to do it.
384
 It's better not to trust images downloaded from random places on the interwebs. Chances are that unless you are in the web of trust of the above GPG signatures then they don't mean very much to you. If you actually want something trustworthy then build the images from scratch. It will take some time. Here's how to do it.
385
 </p>
385
 </p>
394
 wget https://freedombone.net/downloads/current/freedombone.tar.gz.sig
394
 wget https://freedombone.net/downloads/current/freedombone.tar.gz.sig
395
 gpg --verify freedombone.tar.gz.sig
395
 gpg --verify freedombone.tar.gz.sig
396
 sha256sum freedombone.tar.gz
396
 sha256sum freedombone.tar.gz
397
-024aedd3a264e963d791daaada347aba1295bc5caebba34ad9b19dc117a8cac9
397
+3d2a7f2bd7a3475832756b7bb63b96ba5fc4a4f4d7bffe86e685be9a3b41b958
398
 tar -xzvf freedombone.tar.gz
398
 tar -xzvf freedombone.tar.gz
399
 <span class="org-builtin">cd</span> freedombone
399
 <span class="org-builtin">cd</span> freedombone
400
 git checkout stretch
400
 git checkout stretch