From f1199d0d422d6338ed5837e0af876521ae5f1849 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 17 Sep 2017 18:13:38 +0100 Subject: [PATCH 01/22] rootdir --- src/freedombone-image-customise | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/freedombone-image-customise b/src/freedombone-image-customise index 66c0e697..99434a07 100755 --- a/src/freedombone-image-customise +++ b/src/freedombone-image-customise @@ -595,7 +595,7 @@ EOF chmod +x $rootdir/usr/bin/start_patchwork # Copy icon to an accesible location - cp /root/$PROJECT_NAME/img/icon_patchwork.png /etc/patchwork/icon_patchwork.png + cp $rootdir/root/$PROJECT_NAME/img/icon_patchwork.png $rootdir/etc/patchwork/icon_patchwork.png } initialise_mesh() { From 0f2fb846b3015581e9964317daae1cf684639004 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 17 Sep 2017 18:16:58 +0100 Subject: [PATCH 02/22] Check that patchwork directory gets created --- src/freedombone-image-customise | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/freedombone-image-customise b/src/freedombone-image-customise index 99434a07..1983c9a5 100755 --- a/src/freedombone-image-customise +++ b/src/freedombone-image-customise @@ -568,6 +568,9 @@ install_patchwork() { get_npm_arch git clone $PATCHWORK_REPO $rootdir/etc/patchwork + if [ ! -d $rootdir/etc/patchwork ]; then + exit 7823520 + fi cd $rootdir/etc/patchwork git checkout $PATCHWORK_COMMIT -b $PATCHWORK_COMMIT @@ -581,12 +584,6 @@ npm install --arch=$NPM_ARCH git-ssb EOF chroot "$rootdir" /bin/chmod +x /usr/bin/install_patchwork chroot "$rootdir" /usr/bin/install_patchwork - if [ ! -f /usr/bin/patchwork ]; then - if [ ! -f /usr/local/bin/patchwork ]; then - echo $'Unable to install SSB Patchwork peer' - exit 783524 - fi - fi rm $rootdir/usr/bin/install_patchwork echo '#!/bin/bash' > $rootdir/usr/bin/start_patchwork From 46790f951b789904be87814950aded0fa19db170 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 17 Sep 2017 21:05:00 +0100 Subject: [PATCH 03/22] Patchwork documentation --- doc/EN/mesh.org | 18 +++++ img/patchwork_public.jpg | Bin 0 -> 71806 bytes img/patchwork_setup.jpg | Bin 0 -> 59231 bytes website/EN/mesh.html | 137 +++++++++++++++++++++++++-------------- 4 files changed, 105 insertions(+), 50 deletions(-) create mode 100644 img/patchwork_public.jpg create mode 100644 img/patchwork_setup.jpg diff --git a/doc/EN/mesh.org b/doc/EN/mesh.org index c8d6d2dc..4087ad5d 100644 --- a/doc/EN/mesh.org +++ b/doc/EN/mesh.org @@ -233,6 +233,24 @@ One important point is that by default the microphone is turned off. When doing At present video doesn't work reliably, but text and voice chat do work well. +** Social Network + +Patchwork is available as a social networking system for the mesh. Like all social network systems it has a stream of posts and you can follow or unfollow other users. You can also send private messages to other users with end-to-end encryption. + +Double click on the "Social" icon to open the app, then add your nickname and optionally a description. If you want to choose an avatar image some can be found within the directory */usr/share/freedombone/avatars*. + +#+BEGIN_CENTER +[[file:images/patchwork_setup.jpg]] +#+END_CENTER + +Other Patchwork users on the mesh will appear automatically under the *local* list and you can select and follow them if you wish. It's also possible to select the dark theme from *settings* on the drop down menu if you prefer. + +#+BEGIN_CENTER +[[file:images/patchwork_public.jpg]] +#+END_CENTER + +The Secure Scuttlebutt protocol which Patchwork is based upon is intended to be robust to intermittent network connectivity, so you can write posts when out of range and they will sync once you are back in the network. + ** Sharing Files You can make files publicly available on the network simply by dragging and dropping them into the /Public/ folder on the desktop. To view the files belonging to another user select the desktop icon called /Visit a site/ and enter the username or Tox ID of the other user. diff --git a/img/patchwork_public.jpg b/img/patchwork_public.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fd9fac014fb411c89b025306685a1c0a35ff9f7a GIT binary patch literal 71806 zcmeFZ1zc2HyD+{%P{M$rL_rXS9^goaN=Oae9WpR zA|0ZXBG$KO2IHKg=f3y5@4f%u_y4{%!`^GH{j8_g^Q^UI>(_~|F99+|Ik+5vhld9! zfFI!N6mSV3KYHxMF;emq$4^i|$SG+#>1b(aXa!i<7&tEoNlBg;5*L$EMrg?>7{kTH zb=-B0kv5J_j?$W50iJf(5%!L@7$kTQ3JO|kT0S~DK3h3)Iotnq`Pu@I6CFw>m^p+; z4&amH9U{m3+6J5g@PI=YZhsU!{6hqUhrwqj!Tvu#0x-|MJ_C*(!UOQh4v_%>-j3?E ze#d740Sb)Kcmx4Iu>8xl;}>0Wt&t7!ndJ5`M14EF@|Cee<+7Fja+G47LNd$cwSO7Y z0U%$Ltzd0d5mkW_3||2XAqgO*VnmVRKl)GNIWjN-05=qp4u;_|{umG16#z5=bzBbw zyy1Uq;JN^S3_n1G5$u-~7F)=Cd>O0-VBkP)$1`H?m`C7+68r-@8Ntgh3SNQ@06+ns zt$o+-t)wmtcr*r#h@jvA8q*}i*6}5=x4&O7NbuNnbt43N8omAM+%C!+d`Bb+!L#D4-hXt*X*@mSdr@khey1Ag(mE|I0Ln}9*0!Cdlal}rF2MA&l^0%Twj zYHI&V9Y@H|DZ%n{VquezHEYdZ;Vgj0Lu2`t2H%`iKLi_Q1deqHCB)l`+7SZK)1A$! zmcL-*w_W(e1P~&j^B3kw0Aw;F28Ps+C=h-Oml7V^rr^0y9 z!h?d(si2@Z_$QQK&HPbLX^ov^c#;ah%!Q+Cy@xv(sX0$v%V0#o|2Q8jJx``UsN9Q& z1`;zyBP0)ye81rnL8IZ)FAG?tGBp(dGD+xI9TXzTX=Pjo1&E-5c^NLwC-s3rG0Xsv zTfq5Du*U+*Bc+{KfbU3?6$$m>;3Fs-V|>K~etsU~a!&nB#BJA)8Pe@`U!Ao-ofMdn)iez4$uX8j|0@Xb?G|*5E z0Eb4P0A6SZs3Sr+=&OW(_avfk6yXR-oDKo06*{91YJh(r0Ki*c<42elwhX|ptuF(> z@*PDpamjBZ{J8E~{J0|0Cb;Fn)N^@S~#%XmXlEDF#H=>;V!ZY$T3faN=v z#I~g*vEbC4aLk>C0Cn^RV*mhvzWLjNm&x`s*1CrKtX&DjRm`qgMy!U`+%SS=G)81~ z5WykW(89-w88FuXuwe{Q;1hsJ5h}$)@rUDWB!TFonC@SdW5nWjB*#9yo;wZDT1$e# zBmjh>$TIuJFdiZU>;N6;G4v)QoFD+qG{gWkrzF_*t8&0G7*Q~KI6z0{uC#1zYQy={ zfO2T`e;5gdVjt`rQ%lFVd4fAY0x>h#^&Bj$ME7*mZI=U#@tC>W{}WCCRB6D^?O)VU z^QoN~cGtda24Or1KOpYi$G7X9s!_gle%^cM_mS)bkYfuw{AB_^kA*1wR^D%56^t7f z4rwjDkAMNlR4_Y?>c98dieFwD`OxrL^n>V&!$L&RL*9NkhRHJUDRBb{{>l0{kmGYh zf)}rQwLCg(Fhl|&T|4u_UkIItRu)58^e&Cw6la9sH8cf#ECv{(@HF9}`Q!o-%eayM z!gQklNf{Z?LnCjN*2Y#BM$>aScw<|e&Vp%w2IC2mIE2_M9yFFr;ivYms`y+u%bgn| zV}`AOVK(md%HTcC%1zgmz-Yzj1BQPZi4SMxko>9rt12(K369&Sj6-zG#D_z@?T9Kz zCJI<03U33adodpN^Drn15%+WZ7j^tis%f9Yd0?tq1{ zRsT0w#j;`z62w)tm&U+#2bjHYW9Hv43Z7Tkfm3(@Czqrp!Tf{AMGR&HUNC`W0ATG~ z!H9n;OT{W*&Lg+()y%1Z7@vYa^22rDLHd0|OF`eje!2@VQ4+}J>vBo|NrY?=f&jCw z5yr*^{XoU`RZJhQV5!^_V%abgS>~%cW;Ij@E}~I*&~MNGe8+pS@W9>eUEl$Moem*@ z50e*s)4rtnRfm9`_z4u`bk}wP(&Cz`g&o$(@s(BeJ9<{e5X2qn?Qt;-^PK#QwkbOnfZd(d%&Iw z9j+Di=*OeK*Jy5+V&_usIcz`yOqU!js;=3Y4j6l6k6#262tDNelBtcr+TguXfbLUm z2v5K_Bo8p�tYBl>OH8%X@>Y=b0M?+n>)Jg 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

Vh|{8wH(UeVT6#M7hPGE&3x@t4q6*`JNMoZB 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 BP^16= literal 0 HcmV?d00001 diff --git a/website/EN/mesh.html b/website/EN/mesh.html index 02fa117c..410aeca7 100644 --- a/website/EN/mesh.html +++ b/website/EN/mesh.html @@ -3,7 +3,7 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + @@ -274,13 +274,13 @@ for the JavaScript code in this tag. -What the system can do +What the system can do - -Disk Images +Disk Images - -Building Disk Images +Building Disk Images - -How to use it +How to use it @@ -293,9 +293,9 @@ The Freedombone Mesh is a wireless solution for autonomous communication that ca Mesh networks are useful as a quick way to make a fully decentralised communications system which is not connected to or reliant upon the internet. Think festivals, hacker conferences, onboard ships at sea, disaster/war zones, small business internal office communications, protests, remote areas of the world, temporary "digital blackouts", scientific expeditions and off-world space colonies. The down side is that you can't access any internet content. The upside is that you can securely communicate with anyone on the local mesh. No ISPs. No payments or subscriptions beyond the cost of obtaining the hardware. Systems need to be within wifi range of each other for the mesh to be created. It can be an ultra-convenient way to do purely local communications.

-
-

What the system can do

-
+
+

What the system can do

+
  • Discovery of other users on the network
  • Text based chat, one-to-one and in groups
  • @@ -316,13 +316,13 @@ This system should be quite scalable. Both qTox and IPFS are based upon distribu
-
-

Disk Images

-
+
+

Disk Images

+
-
-

Writing many images quickly

-
+
+

Writing many images quickly

+

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 dd command is used for writing to the target drive, but to write to multiple drives you can use a tool such as GNOME MultiWriter.

@@ -346,9 +346,9 @@ Or on Debian based systems:
-
-

Client images

-
+
+

Client images

+
@@ -397,16 +397,16 @@ sudo dd bs=1M -

Router images

-
+
+

Router images

+

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.

-
-

Beaglebone Black

-
+
+

Beaglebone Black

+
@@ -443,9 +443,9 @@ There is still a software freedom issue with the Beaglebone Black, but it doesn'
-
-

Building Disk Images

-
+
+

Building Disk Images

+

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.

@@ -533,9 +533,9 @@ The resulting image can be copied to a microSD card, inserted into a Beaglebone
-
-

Customisation

-
+
+

Customisation

+

If you want to make your own specially branded version, such as for a particular event, then to change the default desktop backgrounds edit the images within img/backgrounds and to change the available avatars and desktop icons edit the images within img/avatars. Re-create disk images using the instructions shown previously.

@@ -545,9 +545,9 @@ If you need particular dconf commands to alter desktop appearance or beha

-
-

How to use it

-
+
+

How to use it

+

When you first boot from the USB drive the system will create some encryption keys, assign a unique network address to the system and then reboot itself. When that's done you should see a prompt asking for a username. This username just makes it easy for others to initially find you on the mesh and will appear in the list of users.

@@ -557,9 +557,9 @@ After a minute or two if you are within wifi range and there is at least one oth

-
-

Boot trouble

-
+
+

Boot trouble

+

If the system doesn't boot and reports an error which includes /dev/mapper/loop0p1 then reboot with Ctrl-Alt-Del and when you see the grub menu press e and manually change /dev/mapper/loop0p1 to /dev/sdb1, then press Ctrl-x. If that doesn't work then reboot and try /dev/sdc1 instead.

@@ -569,9 +569,9 @@ After the system has booted successfully the problem should resolve itself on su

-
-

Set the Date

-
+
+

Set the Date

+

On the ordinary internet the date and time of your system would be set automatically via NTP. But this is not the internet and so you will need to manually ensure that your date and time settings are correct. You might need to periodically do this if your clock drifts. It's not essential that the time on your system be highly accurate, but if it drifts too far or goes back to epoch then things could become a little confusing in regard to the order of blog posts.

@@ -581,9 +581,9 @@ On the ordinary internet the date and time of your system would be set automatic

-
-

Check network status

-
+
+

Check network status

+

Unlike with ordinary wifi, on the mesh you don't get a signal strength icon and so it's not simple to see if you have a good connection.

@@ -607,9 +607,9 @@ When you are finished close the window and then select the Network Restart
-
-

Chat System

-
+
+

Chat System

+

Ensure that you're within wifi range of at least one other mesh peer (could be a router or client) and then you should see that the Chat and Other Users icons appear. Select the users icon and you should see a list of users on the mesh. Select the Chat icon and once you are connected you should see the status light turn green. If after a few minutes you don't get the green status light then try closing and re-opening the Tox chat application. Select the plus button to add a friend and then copy and paste in a Tox ID from the users list.

@@ -668,9 +668,46 @@ At present video doesn't work reliably, but text and voice chat do work well.
-
-

Sharing Files

-
+
+

Social Network

+
+

+Patchwork is available as a social networking system for the mesh. Like all social network systems it has a stream of posts and you can follow or unfollow other users. You can also send private messages to other users with end-to-end encryption. +

+ +

+Double click on the "Social" icon to open the app, then add your nickname and optionally a description. If you want to choose an avatar image some can be found within the directory /usr/share/freedombone/avatars. +

+ +
+ +
+

patchwork_setup.jpg +

+
+
+ +

+Other Patchwork users on the mesh will appear automatically under the local list and you can select and follow them if you wish. It's also possible to select the dark theme from settings on the drop down menu if you prefer. +

+ +
+ +
+

patchwork_public.jpg +

+
+
+ +

+The Secure Scuttlebutt protocol which Patchwork is based upon is intended to be robust to intermittent network connectivity, so you can write posts when out of range and they will sync once you are back in the network. +

+
+
+ +
+

Sharing Files

+

You can make files publicly available on the network simply by dragging and dropping them into the Public folder on the desktop. To view the files belonging to another user select the desktop icon called Visit a site and enter the username or Tox ID of the other user.

@@ -685,9 +722,9 @@ You can make files publicly available on the network simply by dragging and drop
-
-

Blogging

-
+
+

Blogging

+

To create a blog post select the Blog icon on the desktop and then use the up and down cursor keys, space bar and enter key to add a new entry. Edit the title of the entry and add your text. You can also include photos if you wish - just copy them to the CreateBlog/content/images directory and then link to them as shown.

From 717846ec5c084d9efc50f4193e3d59d71f42eb1d Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 17 Sep 2017 21:11:26 +0100 Subject: [PATCH 04/22] List social network as a mesh capability --- doc/EN/mesh.org | 9 ++-- website/EN/mesh.html | 115 ++++++++++++++++++++++--------------------- 2 files changed, 63 insertions(+), 61 deletions(-) diff --git a/doc/EN/mesh.org b/doc/EN/mesh.org index 4087ad5d..222ac6e4 100644 --- a/doc/EN/mesh.org +++ b/doc/EN/mesh.org @@ -33,12 +33,13 @@ Mesh networks are useful as a quick way to make a fully decentralised communicat - Voice chat (VoIP) - Private and public sharing of files - Blogging + - Social network stream. Follow/unfollow other peers - No network administration required - - No servers, internet connection or cabling is needed. - - Works from bootable USB drives or microSD drives. + - No servers, internet connection or cabling is needed + - Works from bootable USB drives or microSD drives - Data is mesh routed between systems - - Private communications is end-to-end secured and forward secret. - - Publicly shared data is /content addressable/. + - Private communications is end-to-end secured and forward secret + - Publicly shared data is /content addressable/ This system should be quite scalable. Both qTox and IPFS are based upon distributed hash tables (DHT) so that each peer does not need to store the full index of data for the entire network. Caching or pinning of IPFS data and its content addressability means that if a file or blog becomes popular then performance should improve as the number of downloads increases, which is the opposite of the client/server paradigm. diff --git a/website/EN/mesh.html b/website/EN/mesh.html index 410aeca7..f4d40fc3 100644 --- a/website/EN/mesh.html +++ b/website/EN/mesh.html @@ -3,7 +3,7 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + @@ -274,13 +274,13 @@ for the JavaScript code in this tag. -What the system can do +What the system can do - -Disk Images +Disk Images - -Building Disk Images +Building Disk Images - -How to use it +How to use it @@ -293,21 +293,22 @@ The Freedombone Mesh is a wireless solution for autonomous communication that ca Mesh networks are useful as a quick way to make a fully decentralised communications system which is not connected to or reliant upon the internet. Think festivals, hacker conferences, onboard ships at sea, disaster/war zones, small business internal office communications, protests, remote areas of the world, temporary "digital blackouts", scientific expeditions and off-world space colonies. The down side is that you can't access any internet content. The upside is that you can securely communicate with anyone on the local mesh. No ISPs. No payments or subscriptions beyond the cost of obtaining the hardware. Systems need to be within wifi range of each other for the mesh to be created. It can be an ultra-convenient way to do purely local communications.

-
-

What the system can do

-
+
+

What the system can do

+
  • Discovery of other users on the network
  • Text based chat, one-to-one and in groups
  • Voice chat (VoIP)
  • Private and public sharing of files
  • Blogging
  • +
  • Social network stream. Follow/unfollow other peers
  • No network administration required
  • -
  • No servers, internet connection or cabling is needed.
  • -
  • Works from bootable USB drives or microSD drives.
  • +
  • No servers, internet connection or cabling is needed
  • +
  • Works from bootable USB drives or microSD drives
  • Data is mesh routed between systems
  • -
  • Private communications is end-to-end secured and forward secret.
  • -
  • Publicly shared data is content addressable.
  • +
  • Private communications is end-to-end secured and forward secret
  • +
  • Publicly shared data is content addressable

@@ -316,13 +317,13 @@ This system should be quite scalable. Both qTox and IPFS are based upon distribu

-
-

Disk Images

-
+
+

Disk Images

+
-
-

Writing many images quickly

-
+
+

Writing many images quickly

+

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 dd command is used for writing to the target drive, but to write to multiple drives you can use a tool such as GNOME MultiWriter.

@@ -346,9 +347,9 @@ Or on Debian based systems:
-
-

Client images

-
+
+

Client images

+
@@ -397,16 +398,16 @@ sudo dd bs=1M -

Router images

-
+
+

Router images

+

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.

-
-

Beaglebone Black

-
+
+

Beaglebone Black

+
@@ -443,9 +444,9 @@ There is still a software freedom issue with the Beaglebone Black, but it doesn'
-
-

Building Disk Images

-
+
+

Building Disk Images

+

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.

@@ -533,9 +534,9 @@ The resulting image can be copied to a microSD card, inserted into a Beaglebone
-
-

Customisation

-
+
+

Customisation

+

If you want to make your own specially branded version, such as for a particular event, then to change the default desktop backgrounds edit the images within img/backgrounds and to change the available avatars and desktop icons edit the images within img/avatars. Re-create disk images using the instructions shown previously.

@@ -545,9 +546,9 @@ If you need particular dconf commands to alter desktop appearance or beha

-
-

How to use it

-
+
+

How to use it

+

When you first boot from the USB drive the system will create some encryption keys, assign a unique network address to the system and then reboot itself. When that's done you should see a prompt asking for a username. This username just makes it easy for others to initially find you on the mesh and will appear in the list of users.

@@ -557,9 +558,9 @@ After a minute or two if you are within wifi range and there is at least one oth

-
-

Boot trouble

-
+
+

Boot trouble

+

If the system doesn't boot and reports an error which includes /dev/mapper/loop0p1 then reboot with Ctrl-Alt-Del and when you see the grub menu press e and manually change /dev/mapper/loop0p1 to /dev/sdb1, then press Ctrl-x. If that doesn't work then reboot and try /dev/sdc1 instead.

@@ -569,9 +570,9 @@ After the system has booted successfully the problem should resolve itself on su

-
-

Set the Date

-
+
+

Set the Date

+

On the ordinary internet the date and time of your system would be set automatically via NTP. But this is not the internet and so you will need to manually ensure that your date and time settings are correct. You might need to periodically do this if your clock drifts. It's not essential that the time on your system be highly accurate, but if it drifts too far or goes back to epoch then things could become a little confusing in regard to the order of blog posts.

@@ -581,9 +582,9 @@ On the ordinary internet the date and time of your system would be set automatic

-
-

Check network status

-
+
+

Check network status

+

Unlike with ordinary wifi, on the mesh you don't get a signal strength icon and so it's not simple to see if you have a good connection.

@@ -607,9 +608,9 @@ When you are finished close the window and then select the Network Restart
-
-

Chat System

-
+
+

Chat System

+

Ensure that you're within wifi range of at least one other mesh peer (could be a router or client) and then you should see that the Chat and Other Users icons appear. Select the users icon and you should see a list of users on the mesh. Select the Chat icon and once you are connected you should see the status light turn green. If after a few minutes you don't get the green status light then try closing and re-opening the Tox chat application. Select the plus button to add a friend and then copy and paste in a Tox ID from the users list.

@@ -668,9 +669,9 @@ At present video doesn't work reliably, but text and voice chat do work well.
-
-

Social Network

-
+
+

Social Network

+

Patchwork is available as a social networking system for the mesh. Like all social network systems it has a stream of posts and you can follow or unfollow other users. You can also send private messages to other users with end-to-end encryption.

@@ -705,9 +706,9 @@ The Secure Scuttlebutt protocol which Patchwork is based upon is intended to be
-
-

Sharing Files

-
+
+

Sharing Files

+

You can make files publicly available on the network simply by dragging and dropping them into the Public folder on the desktop. To view the files belonging to another user select the desktop icon called Visit a site and enter the username or Tox ID of the other user.

@@ -722,9 +723,9 @@ You can make files publicly available on the network simply by dragging and drop
-
-

Blogging

-
+
+

Blogging

+

To create a blog post select the Blog icon on the desktop and then use the up and down cursor keys, space bar and enter key to add a new entry. Edit the title of the entry and add your text. You can also include photos if you wish - just copy them to the CreateBlog/content/images directory and then link to them as shown.

From 87948da68a9ec3898ea485675dcddbad8526abe1 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Sun, 17 Sep 2017 23:16:21 +0100 Subject: [PATCH 05/22] Update mesh image hashes --- doc/EN/mesh.org | 28 ++++----- website/EN/mesh.html | 134 +++++++++++++++++++++---------------------- 2 files changed, 81 insertions(+), 81 deletions(-) diff --git a/doc/EN/mesh.org b/doc/EN/mesh.org index 222ac6e4..8c14bfa4 100644 --- a/doc/EN/mesh.org +++ b/doc/EN/mesh.org @@ -68,14 +68,14 @@ sudo apt-get install gnome-multi-writer #+begin_src bash sudo apt-get install xz-utils wget -wget https://freedombone.net/downloads/v3/freedombone-meshclient-3_all-i386.img.xz -wget https://freedombone.net/downloads/v3/freedombone-meshclient-3_all-i386.img.xz.sig -gpg --verify freedombone-meshclient-3_all-i386.img.xz.sig -sha256sum freedombone-meshclient-3_all-i386.img.xz -74f9eaad479f84d3bf9cb002067074d35a97028145e781c5746c74577f777ee5 -unxz freedombone-meshclient-3_all-i386.img.xz +wget https://freedombone.net/downloads/current/freedombone-meshclient-i386.img.xz +wget https://freedombone.net/downloads/current/freedombone-meshclient-i386.img.xz.sig +gpg --verify freedombone-meshclient-i386.img.xz.sig +sha256sum freedombone-meshclient-i386.img.xz +f7e261d369d6f0ccf650dbbed18227bfe5ec427ae0b97f56e1f1e202afc6d0b3 +unxz freedombone-meshclient-i386.img.xz sudo dd if=/dev/zero of=/dev/sdX bs=1M count=8 -sudo dd bs=1M if=freedombone-meshclient-3_all-i386.img of=/dev/sdX conv=fdatasync +sudo dd bs=1M if=freedombone-meshclient-i386.img of=/dev/sdX conv=fdatasync #+end_src To get a number of systems onto the mesh repeat the /dd/ command to create however many bootable USB drives you need. @@ -84,14 +84,14 @@ If you're in an emergency and don't have Atheros wifi dongles then there is also #+begin_src bash sudo apt-get install xz-utils wget -wget https://freedombone.net/downloads/v3/freedombone-meshclient-insecure-3_all-i386.img.xz -wget https://freedombone.net/downloads/v3/freedombone-meshclient-insecure-3_all-i386.img.xz.sig -gpg --verify freedombone-meshclient-insecure-3_all-i386.img.xz.sig -sha256sum freedombone-meshclient-insecure-3_all-i386.img.xz -f1c5df24a4bfca47bd5c41dfd2568925e63a1abf83aecf0250480b4b8edc071d -unxz freedombone-meshclient-insecure-3_all-i386.img.xz +wget https://freedombone.net/downloads/current/freedombone-meshclient-insecure-i386.img.xz +wget https://freedombone.net/downloads/current/freedombone-meshclient-insecure-i386.img.xz.sig +gpg --verify freedombone-meshclient-insecure-i386.img.xz.sig +sha256sum freedombone-meshclient-insecure-i386.img.xz +3bfbcaedb587c5cbddec8b9fffcd48398d9e3b97486ef49aa645357f61a0f11f +unxz freedombone-meshclient-insecure-i386.img.xz sudo dd if=/dev/zero of=/dev/sdX bs=1M count=8 -sudo dd bs=1M if=freedombone-meshclient-insecure-3_all-i386.img of=/dev/sdX conv=fdatasync +sudo dd bs=1M if=freedombone-meshclient-insecure-i386.img of=/dev/sdX conv=fdatasync #+end_src ** Router images diff --git a/website/EN/mesh.html b/website/EN/mesh.html index f4d40fc3..add10e36 100644 --- a/website/EN/mesh.html +++ b/website/EN/mesh.html @@ -3,7 +3,7 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + @@ -274,13 +274,13 @@ for the JavaScript code in this tag. -What the system can do +What the system can do - -Disk Images +Disk Images - -Building Disk Images +Building Disk Images - -How to use it +How to use it @@ -293,9 +293,9 @@ The Freedombone Mesh is a wireless solution for autonomous communication that ca Mesh networks are useful as a quick way to make a fully decentralised communications system which is not connected to or reliant upon the internet. Think festivals, hacker conferences, onboard ships at sea, disaster/war zones, small business internal office communications, protests, remote areas of the world, temporary "digital blackouts", scientific expeditions and off-world space colonies. The down side is that you can't access any internet content. The upside is that you can securely communicate with anyone on the local mesh. No ISPs. No payments or subscriptions beyond the cost of obtaining the hardware. Systems need to be within wifi range of each other for the mesh to be created. It can be an ultra-convenient way to do purely local communications.

-
-

What the system can do

-
+
+

What the system can do

+
  • Discovery of other users on the network
  • Text based chat, one-to-one and in groups
  • @@ -317,13 +317,13 @@ This system should be quite scalable. Both qTox and IPFS are based upon distribu
-
-

Disk Images

-
+
+

Disk Images

+
-
-

Writing many images quickly

-
+
+

Writing many images quickly

+

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 dd command is used for writing to the target drive, but to write to multiple drives you can use a tool such as GNOME MultiWriter.

@@ -347,9 +347,9 @@ Or on Debian based systems:
-
-

Client images

-
+
+

Client images

+
@@ -364,14 +364,14 @@ Or on Debian based systems:
sudo apt-get install xz-utils wget
-wget https://freedombone.net/downloads/v3/freedombone-meshclient-3_all-i386.img.xz
-wget https://freedombone.net/downloads/v3/freedombone-meshclient-3_all-i386.img.xz.sig
-gpg --verify freedombone-meshclient-3_all-i386.img.xz.sig
-sha256sum freedombone-meshclient-3_all-i386.img.xz
-74f9eaad479f84d3bf9cb002067074d35a97028145e781c5746c74577f777ee5
-unxz freedombone-meshclient-3_all-i386.img.xz
+wget https://freedombone.net/downloads/current/freedombone-meshclient-i386.img.xz
+wget https://freedombone.net/downloads/current/freedombone-meshclient-i386.img.xz.sig
+gpg --verify freedombone-meshclient-i386.img.xz.sig
+sha256sum freedombone-meshclient-i386.img.xz
+f7e261d369d6f0ccf650dbbed18227bfe5ec427ae0b97f56e1f1e202afc6d0b3
+unxz freedombone-meshclient-i386.img.xz
 sudo dd if=/dev/zero of=/dev/sdX bs=1M count=8
-sudo dd bs=1M if=freedombone-meshclient-3_all-i386.img of=/dev/sdX conv=fdatasync
+sudo dd bs=1M if=freedombone-meshclient-i386.img of=/dev/sdX conv=fdatasync
 
@@ -385,29 +385,29 @@ If you're in an emergency and don't have Atheros wifi dongles then there is also
sudo apt-get install xz-utils wget
-wget https://freedombone.net/downloads/v3/freedombone-meshclient-insecure-3_all-i386.img.xz
-wget https://freedombone.net/downloads/v3/freedombone-meshclient-insecure-3_all-i386.img.xz.sig
-gpg --verify freedombone-meshclient-insecure-3_all-i386.img.xz.sig
-sha256sum freedombone-meshclient-insecure-3_all-i386.img.xz
-f1c5df24a4bfca47bd5c41dfd2568925e63a1abf83aecf0250480b4b8edc071d
-unxz freedombone-meshclient-insecure-3_all-i386.img.xz
+wget https://freedombone.net/downloads/current/freedombone-meshclient-insecure-i386.img.xz
+wget https://freedombone.net/downloads/current/freedombone-meshclient-insecure-i386.img.xz.sig
+gpg --verify freedombone-meshclient-insecure-i386.img.xz.sig
+sha256sum freedombone-meshclient-insecure-i386.img.xz
+3bfbcaedb587c5cbddec8b9fffcd48398d9e3b97486ef49aa645357f61a0f11f
+unxz freedombone-meshclient-insecure-i386.img.xz
 sudo dd if=/dev/zero of=/dev/sdX bs=1M count=8
-sudo dd bs=1M if=freedombone-meshclient-insecure-3_all-i386.img of=/dev/sdX conv=fdatasync
+sudo dd bs=1M if=freedombone-meshclient-insecure-i386.img of=/dev/sdX conv=fdatasync
 
-
-

Router images

-
+
+

Router images

+

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.

-
-

Beaglebone Black

-
+
+

Beaglebone Black

+
@@ -444,9 +444,9 @@ There is still a software freedom issue with the Beaglebone Black, but it doesn'
-
-

Building Disk Images

-
+
+

Building Disk Images

+

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.

@@ -534,9 +534,9 @@ The resulting image can be copied to a microSD card, inserted into a Beaglebone
-
-

Customisation

-
+
+

Customisation

+

If you want to make your own specially branded version, such as for a particular event, then to change the default desktop backgrounds edit the images within img/backgrounds and to change the available avatars and desktop icons edit the images within img/avatars. Re-create disk images using the instructions shown previously.

@@ -546,9 +546,9 @@ If you need particular dconf commands to alter desktop appearance or beha

-
-

How to use it

-
+
+

How to use it

+

When you first boot from the USB drive the system will create some encryption keys, assign a unique network address to the system and then reboot itself. When that's done you should see a prompt asking for a username. This username just makes it easy for others to initially find you on the mesh and will appear in the list of users.

@@ -558,9 +558,9 @@ After a minute or two if you are within wifi range and there is at least one oth

-
-

Boot trouble

-
+
+

Boot trouble

+

If the system doesn't boot and reports an error which includes /dev/mapper/loop0p1 then reboot with Ctrl-Alt-Del and when you see the grub menu press e and manually change /dev/mapper/loop0p1 to /dev/sdb1, then press Ctrl-x. If that doesn't work then reboot and try /dev/sdc1 instead.

@@ -570,9 +570,9 @@ After the system has booted successfully the problem should resolve itself on su

-
-

Set the Date

-
+
+

Set the Date

+

On the ordinary internet the date and time of your system would be set automatically via NTP. But this is not the internet and so you will need to manually ensure that your date and time settings are correct. You might need to periodically do this if your clock drifts. It's not essential that the time on your system be highly accurate, but if it drifts too far or goes back to epoch then things could become a little confusing in regard to the order of blog posts.

@@ -582,9 +582,9 @@ On the ordinary internet the date and time of your system would be set automatic

-
-

Check network status

-
+
+

Check network status

+

Unlike with ordinary wifi, on the mesh you don't get a signal strength icon and so it's not simple to see if you have a good connection.

@@ -608,9 +608,9 @@ When you are finished close the window and then select the Network Restart
-
-

Chat System

-
+
+

Chat System

+

Ensure that you're within wifi range of at least one other mesh peer (could be a router or client) and then you should see that the Chat and Other Users icons appear. Select the users icon and you should see a list of users on the mesh. Select the Chat icon and once you are connected you should see the status light turn green. If after a few minutes you don't get the green status light then try closing and re-opening the Tox chat application. Select the plus button to add a friend and then copy and paste in a Tox ID from the users list.

@@ -669,9 +669,9 @@ At present video doesn't work reliably, but text and voice chat do work well.
-
-

Social Network

-
+
+

Social Network

+

Patchwork is available as a social networking system for the mesh. Like all social network systems it has a stream of posts and you can follow or unfollow other users. You can also send private messages to other users with end-to-end encryption.

@@ -706,9 +706,9 @@ The Secure Scuttlebutt protocol which Patchwork is based upon is intended to be
-
-

Sharing Files

-
+
+

Sharing Files

+

You can make files publicly available on the network simply by dragging and dropping them into the Public folder on the desktop. To view the files belonging to another user select the desktop icon called Visit a site and enter the username or Tox ID of the other user.

@@ -723,9 +723,9 @@ You can make files publicly available on the network simply by dragging and drop
-
-

Blogging

-
+
+

Blogging

+

To create a blog post select the Blog icon on the desktop and then use the up and down cursor keys, space bar and enter key to add a new entry. Edit the title of the entry and add your text. You can also include photos if you wish - just copy them to the CreateBlog/content/images directory and then link to them as shown.

From bf8543e58d489f15f5032098f9910a495d6ef795 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 18 Sep 2017 11:03:03 +0100 Subject: [PATCH 06/22] Remove ssb files when reseting mesh identity --- src/freedombone-image-mesh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/freedombone-image-mesh b/src/freedombone-image-mesh index cc9297ee..6fa6e4b6 100755 --- a/src/freedombone-image-mesh +++ b/src/freedombone-image-mesh @@ -589,6 +589,11 @@ if [ -f $MESH_INSTALL_SETUP ]; then rm $INSTALL_LOG fi + # Remove SSB/Patchwork files + if [ -d /home/$MY_USERNAME/.ssb ]; then + rm -rf /home/$MY_USERNAME/.ssb + fi + echo $'Beginning mesh node setup' >> $INSTALL_LOG if [ -d /home/$MY_USERNAME/.config ]; then From 3039df100b1958967453ddd7b7adbe040b822203 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 18 Sep 2017 11:40:52 +0100 Subject: [PATCH 07/22] Note about slow opening time of Patchwork --- doc/EN/mesh.org | 2 +- website/EN/mesh.html | 108 +++++++++++++++++++++---------------------- 2 files changed, 55 insertions(+), 55 deletions(-) diff --git a/doc/EN/mesh.org b/doc/EN/mesh.org index 8c14bfa4..e563647f 100644 --- a/doc/EN/mesh.org +++ b/doc/EN/mesh.org @@ -238,7 +238,7 @@ At present video doesn't work reliably, but text and voice chat do work well. Patchwork is available as a social networking system for the mesh. Like all social network systems it has a stream of posts and you can follow or unfollow other users. You can also send private messages to other users with end-to-end encryption. -Double click on the "Social" icon to open the app, then add your nickname and optionally a description. If you want to choose an avatar image some can be found within the directory */usr/share/freedombone/avatars*. +Double click on the "Social" icon to open the app, then add your nickname and optionally a description. If you want to choose an avatar image some can be found within the directory */usr/share/freedombone/avatars*. On older systems or systems without a hardware random number generator, Patchwork sometimes takes a long time (a few minutes) to open for the first time after clicking the icon. This is most likely due to the initial generation of encryption keys, so be patient. #+BEGIN_CENTER [[file:images/patchwork_setup.jpg]] diff --git a/website/EN/mesh.html b/website/EN/mesh.html index add10e36..d42f4fa9 100644 --- a/website/EN/mesh.html +++ b/website/EN/mesh.html @@ -3,7 +3,7 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + @@ -274,13 +274,13 @@ for the JavaScript code in this tag. -What the system can do +What the system can do - -Disk Images +Disk Images - -Building Disk Images +Building Disk Images - -How to use it +How to use it @@ -293,9 +293,9 @@ The Freedombone Mesh is a wireless solution for autonomous communication that ca Mesh networks are useful as a quick way to make a fully decentralised communications system which is not connected to or reliant upon the internet. Think festivals, hacker conferences, onboard ships at sea, disaster/war zones, small business internal office communications, protests, remote areas of the world, temporary "digital blackouts", scientific expeditions and off-world space colonies. The down side is that you can't access any internet content. The upside is that you can securely communicate with anyone on the local mesh. No ISPs. No payments or subscriptions beyond the cost of obtaining the hardware. Systems need to be within wifi range of each other for the mesh to be created. It can be an ultra-convenient way to do purely local communications.

-
-

What the system can do

-
+
+

What the system can do

+
  • Discovery of other users on the network
  • Text based chat, one-to-one and in groups
  • @@ -317,13 +317,13 @@ This system should be quite scalable. Both qTox and IPFS are based upon distribu
-
-

Disk Images

-
+
+

Disk Images

+
-
-

Writing many images quickly

-
+
+

Writing many images quickly

+

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 dd command is used for writing to the target drive, but to write to multiple drives you can use a tool such as GNOME MultiWriter.

@@ -347,9 +347,9 @@ Or on Debian based systems:
-
-

Client images

-
+
+

Client images

+
@@ -398,16 +398,16 @@ sudo dd bs=1M -

Router images

-
+
+

Router images

+

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.

-
-

Beaglebone Black

-
+
+

Beaglebone Black

+
@@ -444,9 +444,9 @@ There is still a software freedom issue with the Beaglebone Black, but it doesn'
-
-

Building Disk Images

-
+
+

Building Disk Images

+

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.

@@ -534,9 +534,9 @@ The resulting image can be copied to a microSD card, inserted into a Beaglebone
-
-

Customisation

-
+
+

Customisation

+

If you want to make your own specially branded version, such as for a particular event, then to change the default desktop backgrounds edit the images within img/backgrounds and to change the available avatars and desktop icons edit the images within img/avatars. Re-create disk images using the instructions shown previously.

@@ -546,9 +546,9 @@ If you need particular dconf commands to alter desktop appearance or beha

-
-

How to use it

-
+
+

How to use it

+

When you first boot from the USB drive the system will create some encryption keys, assign a unique network address to the system and then reboot itself. When that's done you should see a prompt asking for a username. This username just makes it easy for others to initially find you on the mesh and will appear in the list of users.

@@ -558,9 +558,9 @@ After a minute or two if you are within wifi range and there is at least one oth

-
-

Boot trouble

-
+
+

Boot trouble

+

If the system doesn't boot and reports an error which includes /dev/mapper/loop0p1 then reboot with Ctrl-Alt-Del and when you see the grub menu press e and manually change /dev/mapper/loop0p1 to /dev/sdb1, then press Ctrl-x. If that doesn't work then reboot and try /dev/sdc1 instead.

@@ -570,9 +570,9 @@ After the system has booted successfully the problem should resolve itself on su

-
-

Set the Date

-
+
+

Set the Date

+

On the ordinary internet the date and time of your system would be set automatically via NTP. But this is not the internet and so you will need to manually ensure that your date and time settings are correct. You might need to periodically do this if your clock drifts. It's not essential that the time on your system be highly accurate, but if it drifts too far or goes back to epoch then things could become a little confusing in regard to the order of blog posts.

@@ -582,9 +582,9 @@ On the ordinary internet the date and time of your system would be set automatic

-
-

Check network status

-
+
+

Check network status

+

Unlike with ordinary wifi, on the mesh you don't get a signal strength icon and so it's not simple to see if you have a good connection.

@@ -608,9 +608,9 @@ When you are finished close the window and then select the Network Restart
-
-

Chat System

-
+
+

Chat System

+

Ensure that you're within wifi range of at least one other mesh peer (could be a router or client) and then you should see that the Chat and Other Users icons appear. Select the users icon and you should see a list of users on the mesh. Select the Chat icon and once you are connected you should see the status light turn green. If after a few minutes you don't get the green status light then try closing and re-opening the Tox chat application. Select the plus button to add a friend and then copy and paste in a Tox ID from the users list.

@@ -669,15 +669,15 @@ At present video doesn't work reliably, but text and voice chat do work well.
-
-

Social Network

-
+
+

Social Network

+

Patchwork is available as a social networking system for the mesh. Like all social network systems it has a stream of posts and you can follow or unfollow other users. You can also send private messages to other users with end-to-end encryption.

-Double click on the "Social" icon to open the app, then add your nickname and optionally a description. If you want to choose an avatar image some can be found within the directory /usr/share/freedombone/avatars. +Double click on the "Social" icon to open the app, then add your nickname and optionally a description. If you want to choose an avatar image some can be found within the directory /usr/share/freedombone/avatars. On older systems or systems without a hardware random number generator, Patchwork sometimes takes a long time (a few minutes) to open for the first time after clicking the icon. This is most likely due to the initial generation of encryption keys, so be patient.

@@ -706,9 +706,9 @@ The Secure Scuttlebutt protocol which Patchwork is based upon is intended to be
-
-

Sharing Files

-
+
+

Sharing Files

+

You can make files publicly available on the network simply by dragging and dropping them into the Public folder on the desktop. To view the files belonging to another user select the desktop icon called Visit a site and enter the username or Tox ID of the other user.

@@ -723,9 +723,9 @@ You can make files publicly available on the network simply by dragging and drop
-
-

Blogging

-
+
+

Blogging

+

To create a blog post select the Blog icon on the desktop and then use the up and down cursor keys, space bar and enter key to add a new entry. Edit the title of the entry and add your text. You can also include photos if you wish - just copy them to the CreateBlog/content/images directory and then link to them as shown.

From da5d4d25ba73e171dcf030f9db129a189da57e2c Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 18 Sep 2017 15:11:29 +0100 Subject: [PATCH 08/22] Check that architecture is detected when installing Go #72 --- src/freedombone-image-customise | 4 ++++ src/freedombone-utils-go | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/src/freedombone-image-customise b/src/freedombone-image-customise index 1983c9a5..7358c082 100755 --- a/src/freedombone-image-customise +++ b/src/freedombone-image-customise @@ -1167,6 +1167,10 @@ function image_setup_utils { if [[ $ARCHITECTURE == *"arm"* ]]; then GOARCH=armv6l fi + if [ ! $GOARCH ]; then + echo $'System architecture was not specified when installing Go' + exit 6734378 + fi GO_SOURCE=https://storage.googleapis.com/golang/go${GO_VERSION}.linux-${GOARCH}.tar.gz if [ ! -d ${rootdir}/root/build ]; then diff --git a/src/freedombone-utils-go b/src/freedombone-utils-go index b395fe10..df438bdd 100755 --- a/src/freedombone-utils-go +++ b/src/freedombone-utils-go @@ -163,6 +163,11 @@ function mesh_upgrade_golang { echo $"Using $GOARCH" fi fi + if [ ! $GOARCH ]; then + echo $'System architecture was not detected when installing Go' + echo "uname reports: $(uname -m)" + exit 63945284 + fi GO_SOURCE=https://storage.googleapis.com/golang/go${GO_VERSION}.linux-${GOARCH}.tar.gz if [ ! -d ${rootdir}${INSTALL_DIR} ]; then From 9117ee7118e7d6d657eebd9573466e5a87f48879 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 18 Sep 2017 15:21:27 +0100 Subject: [PATCH 09/22] Exit if architecture is not detected for IPFS install --- src/freedombone-app-ipfs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/freedombone-app-ipfs b/src/freedombone-app-ipfs index c660ae46..eb04b07b 100755 --- a/src/freedombone-app-ipfs +++ b/src/freedombone-app-ipfs @@ -427,6 +427,10 @@ function mesh_install_ipfs_go { echo $"Using $IPFS_ARCH" fi fi + if [ ! $IPFS_ARCH ]; then + echo $'Architecture not detected for IPFS install' + exit 738765235 + fi IPFS_FILE=go-ipfs_v${IPFS_GO_VERSION}_linux-${IPFS_ARCH}.tar.gz wget https://ipfs.io/ipns/dist.ipfs.io/go-ipfs/v${IPFS_GO_VERSION}/${IPFS_FILE} From 2e99116062a42b58cf533bfbd48ba966daa9acac Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 18 Sep 2017 15:27:11 +0100 Subject: [PATCH 10/22] Select arm downloads for aarch #72 --- src/freedombone-app-ipfs | 4 ++-- src/freedombone-image-customise | 2 +- src/freedombone-utils-go | 4 ++-- src/freedombone-utils-nodejs | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/freedombone-app-ipfs b/src/freedombone-app-ipfs index eb04b07b..2c0cdac2 100755 --- a/src/freedombone-app-ipfs +++ b/src/freedombone-app-ipfs @@ -408,13 +408,13 @@ function mesh_install_ipfs_go { if [[ $ARCHITECTURE == *"amd64" || $ARCHITECTURE == "x86_64" ]]; then IPFS_ARCH=amd64 fi - if [[ $ARCHITECTURE == *"arm"* ]]; then + if [[ $ARCHITECTURE == *"arm"* || $ARCHITECTURE == *"aarch"* ]]; then IPFS_ARCH=arm fi if [ ! $IPFS_ARCH ]; then echo $'No architecture specified' ARCHITECTURE=$(uname -m) - if [[ $ARCHITECTURE == "arm"* ]]; then + if [[ $ARCHITECTURE == "arm"* || $ARCHITECTURE == *"aarch"* ]]; then IPFS_ARCH=arm echo $"Using $IPFS_ARCH" fi diff --git a/src/freedombone-image-customise b/src/freedombone-image-customise index 7358c082..14d733c9 100755 --- a/src/freedombone-image-customise +++ b/src/freedombone-image-customise @@ -1164,7 +1164,7 @@ function image_setup_utils { if [[ $ARCHITECTURE == *"amd64" || $ARCHITECTURE == "x86_64" ]]; then GOARCH=amd64 fi - if [[ $ARCHITECTURE == *"arm"* ]]; then + if [[ $ARCHITECTURE == *"arm"* || $ARCHITECTURE == *"aarch"* ]]; then GOARCH=armv6l fi if [ ! $GOARCH ]; then diff --git a/src/freedombone-utils-go b/src/freedombone-utils-go index df438bdd..1e6e7e08 100755 --- a/src/freedombone-utils-go +++ b/src/freedombone-utils-go @@ -144,13 +144,13 @@ function mesh_upgrade_golang { if [[ $ARCHITECTURE == *"amd64" || $ARCHITECTURE == "x86_64" ]]; then GOARCH=amd64 fi - if [[ $ARCHITECTURE == *"arm"* ]]; then + if [[ $ARCHITECTURE == *"arm"* || $ARCHITECTURE == *"aarch"* ]]; then GOARCH=armv6l fi if [ ! $GOARCH ]; then echo $'No architecture specified' ARCHITECTURE=$(uname -m) - if [[ $ARCHITECTURE == "arm"* ]]; then + if [[ $ARCHITECTURE == "arm"* || $ARCHITECTURE == *"aarch"* ]]; then GOARCH=armv6l echo $"Using $GOARCH" fi diff --git a/src/freedombone-utils-nodejs b/src/freedombone-utils-nodejs index c40cbd05..dbd8ac62 100755 --- a/src/freedombone-utils-nodejs +++ b/src/freedombone-utils-nodejs @@ -46,7 +46,7 @@ NODEJS_INSTALLED_APPS_FILE=$HOME/.nodejs-apps function get_npm_arch { N_ARCH='x86' NPM_ARCH='ia32' - if [[ $ARCHITECTURE == 'arm'* ]]; then + if [[ $ARCHITECTURE == 'arm'* || $ARCHITECTURE == *"aarch"* ]]; then NPM_ARCH='armv7l' N_ARCH='arm' fi From 52c9c5abc7413520022d2262000fa7a0e7e03444 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 18 Sep 2017 15:38:45 +0100 Subject: [PATCH 11/22] Use arm64 golang download for aarch64 #72 --- src/freedombone-image-customise | 5 ++++- src/freedombone-utils-go | 11 +++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/freedombone-image-customise b/src/freedombone-image-customise index 14d733c9..d665c031 100755 --- a/src/freedombone-image-customise +++ b/src/freedombone-image-customise @@ -1164,9 +1164,12 @@ function image_setup_utils { if [[ $ARCHITECTURE == *"amd64" || $ARCHITECTURE == "x86_64" ]]; then GOARCH=amd64 fi - if [[ $ARCHITECTURE == *"arm"* || $ARCHITECTURE == *"aarch"* ]]; then + if [[ $ARCHITECTURE == *"arm"* ]]; then GOARCH=armv6l fi + if [[ $ARCHITECTURE == *"aarch"* ]]; then + GOARCH=arm64 + fi if [ ! $GOARCH ]; then echo $'System architecture was not specified when installing Go' exit 6734378 diff --git a/src/freedombone-utils-go b/src/freedombone-utils-go index 1e6e7e08..933c8dc7 100755 --- a/src/freedombone-utils-go +++ b/src/freedombone-utils-go @@ -144,16 +144,23 @@ function mesh_upgrade_golang { if [[ $ARCHITECTURE == *"amd64" || $ARCHITECTURE == "x86_64" ]]; then GOARCH=amd64 fi - if [[ $ARCHITECTURE == *"arm"* || $ARCHITECTURE == *"aarch"* ]]; then + if [[ $ARCHITECTURE == *"arm"* ]]; then GOARCH=armv6l fi + if [[ $ARCHITECTURE == *"aarch"* ]]; then + GOARCH=arm64 + fi if [ ! $GOARCH ]; then echo $'No architecture specified' ARCHITECTURE=$(uname -m) - if [[ $ARCHITECTURE == "arm"* || $ARCHITECTURE == *"aarch"* ]]; then + if [[ $ARCHITECTURE == "arm"* ]]; then GOARCH=armv6l echo $"Using $GOARCH" fi + if [[ $ARCHITECTURE == *"aarch"* ]]; then + GOARCH=arm64 + echo $"Using $GOARCH" + fi if [[ $ARCHITECTURE == "amd"* || $ARCHITECTURE == "x86_64" ]]; then GOARCH=amd64 echo $"Using $GOARCH" From f836b176437e5644067616aa88efdbe17c60ce83 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 18 Sep 2017 15:44:59 +0100 Subject: [PATCH 12/22] arm64 for nodejs downloads #72 --- src/freedombone-utils-nodejs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/freedombone-utils-nodejs b/src/freedombone-utils-nodejs index dbd8ac62..2b19d591 100755 --- a/src/freedombone-utils-nodejs +++ b/src/freedombone-utils-nodejs @@ -46,10 +46,14 @@ NODEJS_INSTALLED_APPS_FILE=$HOME/.nodejs-apps function get_npm_arch { N_ARCH='x86' NPM_ARCH='ia32' - if [[ $ARCHITECTURE == 'arm'* || $ARCHITECTURE == *"aarch"* ]]; then + if [[ $ARCHITECTURE == 'arm'* ]]; then NPM_ARCH='armv7l' N_ARCH='arm' fi + if [[ $ARCHITECTURE == *"aarch"* ]]; then + NPM_ARCH='arm64' + N_ARCH='arm64' + fi if [[ $ARCHITECTURE == 'x86_64' || $ARCHITECTURE == 'amd64' ]]; then NPM_ARCH='x64' N_ARCH='x64' From a6ed88fea5db21f365ca19e76c90df79c8466bf3 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 18 Sep 2017 15:50:36 +0100 Subject: [PATCH 13/22] To be on the safe side when detecting 64bit arm #72 --- src/freedombone-image-customise | 2 +- src/freedombone-utils-go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/freedombone-image-customise b/src/freedombone-image-customise index d665c031..bed15903 100755 --- a/src/freedombone-image-customise +++ b/src/freedombone-image-customise @@ -1167,7 +1167,7 @@ function image_setup_utils { if [[ $ARCHITECTURE == *"arm"* ]]; then GOARCH=armv6l fi - if [[ $ARCHITECTURE == *"aarch"* ]]; then + if [[ $ARCHITECTURE == *"aarch"* || $ARCHITECTURE == *"arm64"* ]]; then GOARCH=arm64 fi if [ ! $GOARCH ]; then diff --git a/src/freedombone-utils-go b/src/freedombone-utils-go index 933c8dc7..6739a163 100755 --- a/src/freedombone-utils-go +++ b/src/freedombone-utils-go @@ -147,7 +147,7 @@ function mesh_upgrade_golang { if [[ $ARCHITECTURE == *"arm"* ]]; then GOARCH=armv6l fi - if [[ $ARCHITECTURE == *"aarch"* ]]; then + if [[ $ARCHITECTURE == *"aarch"* || $ARCHITECTURE == *"arm64"* ]]; then GOARCH=arm64 fi if [ ! $GOARCH ]; then @@ -157,7 +157,7 @@ function mesh_upgrade_golang { GOARCH=armv6l echo $"Using $GOARCH" fi - if [[ $ARCHITECTURE == *"aarch"* ]]; then + if [[ $ARCHITECTURE == *"aarch"* || $ARCHITECTURE == *"arm64"* ]]; then GOARCH=arm64 echo $"Using $GOARCH" fi From 352126ba74ee7a00248327d68b387bdf70e40653 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 18 Sep 2017 18:49:55 +0100 Subject: [PATCH 14/22] Bump go version to support aarch64 --- src/freedombone-utils-go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/freedombone-utils-go b/src/freedombone-utils-go index 6739a163..9595f4ca 100755 --- a/src/freedombone-utils-go +++ b/src/freedombone-utils-go @@ -32,7 +32,7 @@ # before getting to the version we want GO_INTERMEDIATE_VERSION=1.4.2 -GO_VERSION=1.8 +GO_VERSION=1.9 GO_REPO="https://go.googlesource.com/go" GO_PACKAGE_MANAGER_REPO="https://github.com/gpmgo/gopm" From c01b22cda2525b5d134f5e6540d92dea6005fdf5 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 18 Sep 2017 19:01:58 +0100 Subject: [PATCH 15/22] Check for keys after creation --- src/freedombone-utils-backup | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/freedombone-utils-backup b/src/freedombone-utils-backup index c48bf4f0..1f9a7810 100755 --- a/src/freedombone-utils-backup +++ b/src/freedombone-utils-backup @@ -108,12 +108,14 @@ function configure_backup_key { echo "Backup key: $MY_BACKUP_KEY_ID" MY_BACKUP_KEY=/home/$MY_USERNAME/backup_key su -m root -c "gpg --homedir /home/$MY_USERNAME/.gnupg --output ${MY_BACKUP_KEY}_public.asc --armor --export $MY_BACKUP_KEY_ID" - $MY_USERNAME - su -m root -c "echo '$BACKUP_DUMMY_PASSWORD' | gpg --homedir /home/$MY_USERNAME/.gnupg --output ${MY_BACKUP_KEY}_private.asc --armor --batch --passphrase-fd 0 --export-secret-key $MY_BACKUP_KEY_ID" - $MY_USERNAME if [ ! -f ${MY_BACKUP_KEY}_public.asc ]; then echo 'Public backup key could not be exported' exit 36829 fi + + su -m root -c "echo '$BACKUP_DUMMY_PASSWORD' | gpg --homedir /home/$MY_USERNAME/.gnupg --output ${MY_BACKUP_KEY}_private.asc --armor --batch --passphrase-fd 0 --export-secret-key $MY_BACKUP_KEY_ID" - $MY_USERNAME + if [ ! -f ${MY_BACKUP_KEY}_private.asc ]; then echo 'Private backup key could not be exported' exit 29235 From 98adf1ec5a755b7b5c079920102fab3572a4d3c7 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 18 Sep 2017 19:48:06 +0100 Subject: [PATCH 16/22] Ensure that gpg agent is setup when creating backup key --- src/freedombone-utils-backup | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/freedombone-utils-backup b/src/freedombone-utils-backup index 1f9a7810..c6eb5e2c 100755 --- a/src/freedombone-utils-backup +++ b/src/freedombone-utils-backup @@ -77,6 +77,9 @@ function configure_backup_key { return fi + gpg_agent_setup root + gpg_agent_setup $MY_USERNAME + # Generate a GPG key for backups BACKUP_KEY_EXISTS=$(gpg_key_exists "$MY_USERNAME" "$MY_NAME (backup key)") if [[ $BACKUP_KEY_EXISTS == "no" ]]; then From 55c76ed6f61908343133490976e8ecc38728bcbf Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 18 Sep 2017 21:15:18 +0100 Subject: [PATCH 17/22] Setup gpg-agent before creating keys --- src/freedombone-base-email | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/freedombone-base-email b/src/freedombone-base-email index 4a752614..430ac5d3 100755 --- a/src/freedombone-base-email +++ b/src/freedombone-base-email @@ -1396,6 +1396,9 @@ function configure_gpg { sed -i "s|keyserver hkp://keys.gnupg.net|keyserver $GPG_KEYSERVER|g" $gpg_dir/gpg.conf + gpg_agent_setup root + gpg_agent_setup $MY_USERNAME + if ! grep -q "# default preferences" $gpg_dir/gpg.conf; then echo '' >> $gpg_dir/gpg.conf echo '# default preferences' >> $gpg_dir/gpg.conf @@ -1456,8 +1459,6 @@ function configure_gpg { chmod 700 /root/.gnupg chmod 600 /root/.gnupg/* fi - gpg_agent_setup root - gpg_agent_setup $MY_USERNAME mark_completed $FUNCNAME } From ad026343869cb79901dbcefe352bcb557ec136b5 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 18 Sep 2017 21:31:06 +0100 Subject: [PATCH 18/22] Create a gpg key is the ID isn't found --- src/freedombone-base-email | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/freedombone-base-email b/src/freedombone-base-email index 430ac5d3..2bde27d7 100755 --- a/src/freedombone-base-email +++ b/src/freedombone-base-email @@ -1380,12 +1380,13 @@ function configure_gpg { MY_GPG_PUBLIC_KEY_ID=$(gpg_pubkey_from_email "$MY_USERNAME" "$MY_EMAIL_ADDRESS") if [ ${#MY_GPG_PUBLIC_KEY_ID} -lt 4 ]; then echo $'GPG public key ID could not be obtained' + else + chown -R $MY_USERNAME:$MY_USERNAME $gpg_dir + chmod 700 $gpg_dir + chmod 600 $gpg_dir/* + mark_completed $FUNCNAME + return fi - chown -R $MY_USERNAME:$MY_USERNAME $gpg_dir - chmod 700 $gpg_dir - chmod 600 $gpg_dir/* - mark_completed $FUNCNAME - return fi if [ ! -d $gpg_dir ]; then From 9804c49a2c254610015249d59060f156019c3888 Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 18 Sep 2017 21:36:00 +0100 Subject: [PATCH 19/22] Check if an error is returned when getting public key ID --- src/freedombone-base-email | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/freedombone-base-email b/src/freedombone-base-email index 2bde27d7..5bdea62a 100755 --- a/src/freedombone-base-email +++ b/src/freedombone-base-email @@ -1381,11 +1381,15 @@ function configure_gpg { if [ ${#MY_GPG_PUBLIC_KEY_ID} -lt 4 ]; then echo $'GPG public key ID could not be obtained' else - chown -R $MY_USERNAME:$MY_USERNAME $gpg_dir - chmod 700 $gpg_dir - chmod 600 $gpg_dir/* - mark_completed $FUNCNAME - return + if [[ "$MY_GPG_PUBLIC_KEY_ID" == *'error'* ]]; then + echo $"Can't locate gpg key" + else + chown -R $MY_USERNAME:$MY_USERNAME $gpg_dir + chmod 700 $gpg_dir + chmod 600 $gpg_dir/* + mark_completed $FUNCNAME + return + fi fi fi From 26a132b5c4af880518eb268426fabe1b6a0dc7af Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 18 Sep 2017 22:51:22 +0100 Subject: [PATCH 20/22] Check the correct email address when generating a gpg key --- src/freedombone-utils-gpg | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/freedombone-utils-gpg b/src/freedombone-utils-gpg index a1862ca0..a35c68dc 100755 --- a/src/freedombone-utils-gpg +++ b/src/freedombone-utils-gpg @@ -102,15 +102,15 @@ function gpg_create_key { echo $'Generating a new GPG key' su -m root -c "gpg --homedir /home/$key_username/.gnupg --batch --full-gen-key /home/$key_username/gpg-genkey.conf" - $key_username chown -R $key_username:$key_username /home/$key_username/.gnupg - KEY_EXISTS=$(gpg_key_exists "$key_username" "${key_username}@${HOSTNAME}") + KEY_EXISTS=$(gpg_key_exists "$key_username" "$MY_EMAIL_ADDRESS") if [[ $KEY_EXISTS == "no" ]]; then - echo $"A GPG key for ${key_username}@${HOSTNAME} could not be created" + echo $"A GPG key for $MY_EMAIL_ADDRESS could not be created" exit 63621 fi shred -zu /home/$key_username/gpg-genkey.conf - CURR_GPG_PUBLIC_KEY_ID=$(gpg_pubkey_from_email "$key_username" "${key_username}@${HOSTNAME}") + CURR_GPG_PUBLIC_KEY_ID=$(gpg_pubkey_from_email "$key_username" "$MY_EMAIL_ADDRESS") if [ ${#CURR_GPG_PUBLIC_KEY_ID} -lt 4 ]; then - echo $"GPG public key ID could not be obtained for ${key_username}@${HOSTNAME}" + echo $"GPG public key ID could not be obtained for $MY_EMAIL_ADDRESS" exit 825292 fi gpg_set_permissions $key_username From 14f8abf5969c5e089181ae55e0dd3d956636abaa Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 18 Sep 2017 23:13:07 +0100 Subject: [PATCH 21/22] torsocks now needed for torify --- src/freedombone-utils-onion | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/freedombone-utils-onion b/src/freedombone-utils-onion index b0746970..409820ba 100755 --- a/src/freedombone-utils-onion +++ b/src/freedombone-utils-onion @@ -275,6 +275,9 @@ function install_tor { exit 38259 fi + # For torify + apt-get -yq install torsocks + # turn off logging sed -i 's|#Log notice file.*|Log notice file /dev/null|g' /etc/tor/torrc sed -i 's|Log notice file.*|Log notice file /dev/null|g' /etc/tor/torrc From 0871350f214eced1f2d0077a5b26828a67cf7d9a Mon Sep 17 00:00:00 2001 From: Bob Mottram Date: Mon, 18 Sep 2017 23:44:12 +0100 Subject: [PATCH 22/22] Different way of installing nodejs --- src/freedombone-utils-nodejs | 87 ++++++++++++++++++++---------------- 1 file changed, 48 insertions(+), 39 deletions(-) diff --git a/src/freedombone-utils-nodejs b/src/freedombone-utils-nodejs index 2b19d591..545e9269 100755 --- a/src/freedombone-utils-nodejs +++ b/src/freedombone-utils-nodejs @@ -169,49 +169,58 @@ function install_nodejs { return fi - if [ ! -f /usr/bin/nodejs ]; then - # Note: this has to be jessie for now - wget -qO- https://deb.nodesource.com/gpgkey/nodesource.gpg.key > /root/node.gpg.key - apt-key add /root/node.gpg.key - echo "deb https://deb.nodesource.com/node_6.x jessie main" > /etc/apt/sources.list.d/nodesource.list - echo "deb-src https://deb.nodesource.com/node_6.x jessie main" >> /etc/apt/sources.list.d/nodesource.list - - apt-get update - - apt-get -yq remove --purge nodejs - - if [ -d /usr/local/lib/node_modules ]; then - rm -rf /usr/local/lib/node_modules - fi - if [ -f /usr/local/bin/node ]; then - rm /usr/local/bin/node - fi - if [ -f /usr/bin/node ]; then - rm /usr/bin/node - fi - if [ -f /usr/bin/nodejs ]; then - rm /usr/bin/nodejs - fi - - apt-get -yq install nodejs - apt-get -yq install curl - - if [ ! -f /usr/bin/nodejs ]; then - echo $'nodejs was not installed' - exit 63962 - fi + if [ ! $ARCHITECTURE ]; then + ARCHITECTURE=$(uname -m) fi + rootdir= + mesh_install_nodejs - npm install -g npm@${NPM_VERSION} --save - npm install -g n@${NODEJS_N_VERSION} --save - n ${NODEJS_VERSION} - npm install -g pug@2.0.0-beta6 --save - npm install -g graceful-fs@4.1.10 --save - npm install -g minimatch@3.0.3 --save + + #if [ ! -f /usr/bin/nodejs ]; then + # Note: this has to be jessie for now + # wget -qO- https://deb.nodesource.com/gpgkey/nodesource.gpg.key > /root/node.gpg.key + # apt-key add /root/node.gpg.key + # echo "deb https://deb.nodesource.com/node_6.x stretch main" > /etc/apt/sources.list.d/nodesource.list + # echo "deb-src https://deb.nodesource.com/node_6.x stretch main" >> /etc/apt/sources.list.d/nodesource.list + + # apt-get update + + # apt-get -yq remove --purge nodejs + + # if [ -d /usr/local/lib/node_modules ]; then + # rm -rf /usr/local/lib/node_modules + # fi + # if [ -f /usr/local/bin/node ]; then + # rm /usr/local/bin/node + # fi + # if [ -f /usr/bin/node ]; then + # rm /usr/bin/node + # fi + # if [ -f /usr/bin/nodejs ]; then + # rm /usr/bin/nodejs + # fi + + # apt-get -yq install nodejs + # apt-get -yq install curl + + # if [ ! -f /usr/bin/nodejs ]; then + # echo $'nodejs was not installed' + # exit 63962 + # fi + #fi + + #npm install -g npm@${NPM_VERSION} --save + #npm install -g n@${NODEJS_N_VERSION} --save + #n ${NODEJS_VERSION} + #npm install -g pug@2.0.0-beta6 --save + #npm install -g graceful-fs@4.1.10 --save + #npm install -g minimatch@3.0.3 --save npm install -g npm@${NPM_VERSION} --save - cp /usr/local/bin/node /usr/bin/nodejs - cp /usr/local/bin/npm /usr/bin/npm + #cp /usr/local/bin/node /usr/bin/nodejs + if [ -f /usr/local/bin/npm ]; then + cp /usr/local/bin/npm /usr/bin/npm + fi # node seems tricky so here we're going to double check # that the versions we expect did get installed