Friday 9 August 2019

The second life of a laptop / Node.js on Slackware


Youtube video

You only live twice, or so it seems
One life for yourself, and one for your dreams
This dream is for you, so pay the price
Make one dream come true, you only live twice

- Nancy Sinatra, "You Only Live Twice"

My three-year old laptop, an Acer Aspire F15 was meant as a cheap, expendable laptop for rough, almost sacrificial use on-site. It just about survived the KV-MRT Phase 1 project, but only just.  Its screen failed - the entire display was compressed into a line about 5mm high.

Acer AspireF15 (with repaired screen and 2 extra monitors) running a Slackware-based Actions on Google IoT server 

It had been defenestrated and ran Slackware 14.1, and by attaching external monitors to its HDMI and VGA auxiliary displays, I re-purposed it as an Actions on Google IoT server. Google had recently included Firebase in its Smart Home code, and the Aspire F15's version of Chrome no longer displayed Firebase webpages correctly.

Even worse, the Spectre and Heartbleed exploits meant Slackware 14.1 desperately needed an upgrade if it were to stand a chance as an IoT production server on the Internet. But of course it did not get upgraded, and it chugged along until last month when Google's accumulated upgrades broke my server program.

Well, no problem. I have installed Slackware for over 20 years, and went to the Slackware mirrors page for a suitable mirror and made a site rip of the latest and greatest version:

wget -r -c --tries=100 --read-timeout=300 \
-np https://mirror.math.princeton.edu/pub/slackware/slackware64-current/

Not all mirrors like to be ripped, so do use a robot.txt friendly program like wget and try another mirror until you get a tolerant one like princeton.edu.

Next make an ISO filesystem:
$xorriso -as mkisofs   -iso-level 3   -full-iso9660-filenames   -R -J -A "Slackware Install"
 -hide-rr-moved   -v -d -N   -eltorito-boot isolinux/isolinux.bin    -no-emul-boot -boot-load-size 4
-boot-info-table   -isohybrid-mbr /usr/share/syslinux/isohdpfx.bin   -eltorito-alt-boot
 -e isolinux/efiboot.img   -no-emul-boot -isohybrid-gpt-basdat -m 'source' 
-volid "SlackDVD"   -output ../slackware64-current-20190801.iso   .

And burn it into a DVD:
$growisofs -speed=1 -dvd-compat -Z /dev/sr0=slackware64-current-20190801.iso

Now a USB thumbdrive would probably be appropriate, and is known to work, but many of the slackware64-current mirrors do not have programs for a working boot USB drive. So the DVD-ROM would probably get you further, and anyway the Aspire F15 has a DVD drive.

So into the DVD drive it goes and the laptop rebooted, and the minute it is not running Linux (it was running the BIOS), reality struck: the installation process needs the laptop's native screen. Ouch.

Luckily FixItSam's Youtube video showed that the Aspire F15's screen is easily replaced.

Acer Aspire F15's screen is easily replaced
It only took about 15 minutes to remove, and is a Taiwan Innolux N156HGE-EAL Rev.C1. I bought a replacement screen from lunarkim for RM198 (about USD47) and since product links often disappear fast, here is a screenshot as well:

Click on image for the web page
It turned out to be a China Innolux N156BGA-EB2 Rev C.1 but it fitted the screen mount, and worked quite well.

Slackware installed quite painlessly after that; and Google Smart Home code could start, but when Google Assistant attempted to link to the server, the server program failed with the message:

node: symbol lookup error: /home/xxx/smart-home-nodejs-master/node_m
odules/grpc/src/node/extension_binary/node-v57-linux-x64-glibc/grpc_node.node: undefined symbol: SSL_library_init

The server code ran on node.js, which  seems to have replaced old faithful, Apache. I had installed node.js from a SlackBuild, a decades-old way of installing Slackware code. I had run version 8.12.0 with no trouble, but the new version 8.16.0 stubbornly would not run.

Now I could regress back to 8.10.0 but after a well-known node.js exploit, an older version might not inspire confidence. After a fair bit of trying and searching, this thread seems relevant. It is not really a node.js problem but can be fixed by certain node.js versions. In particular:

Your best bet in using gRPC at the moment under Ubuntu 18.04 is to:
  • install nodejs using nvm
    or
  • install gRPC by compiling from source: npm install --build-from-source=grpc.
'npm install --build-from-source=grpc' did not work for me, but reinstalling nodejs using nvm did.

You install nvm thus:

$wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
=> Downloading nvm from git to '/home/xxx/.nvm'
=> Cloning into '/home/xxx/.nvm'...
remote: Enumerating objects: 278, done.
remote: Counting objects: 100% (278/278), done.
remote: Compressing objects: 100% (249/249), done.
remote: Total 278 (delta 33), reused 88 (delta 16), pack-reused 0
Receiving objects: 100% (278/278), 142.36 KiB | 121.00 KiB/s, done.
Resolving deltas: 100% (33/33), done.
=> Compressing and cleaning up git repository

=> Appending nvm source string to /home/xxx/.bashrc
=> Appending bash_completion source string to /home/xxx/.bashrc
=> Close and reopen your terminal to start using nvm or run the following to use
 it now:

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads
 nvm bash_completion

To install node.js:

$nvm install node
Downloading and installing node v12.8.0...
Downloading https://nodejs.org/dist/v12.8.0/node-v12.8.0-linux-x64.tar.xz...
######################################################################### 100.0%
Computing checksum with sha256sum
Checksums matched!
Now using node v12.8.0 (npm v6.10.2)
Creating default alias: default -> node (-> v12.8.0)

The SSL_library_init problem went away; the Actions on Google server program ran and the Aspire F15, and Slackware got a new lease of life.

Now it seems incongruous to run node.js from Slackware. Debian would have been much easier. But after over twenty years, the least I can do is a long goodbye for Slackware

After all, you only live twice. Happy Trails.