Categories
Hardware Software

Updating a Legacy MacBook Air to Manjaro Linux

I’ve got a 2015 MacBook Air version 7,2 which had been sitting on the counter for a few months untouched. My daughter was the last one to use this laptop and that was primarily for YouTube videos. Since she got her iPad for her birthday there hasn’t been much of a need of the MacBook. Never to let a perfectly good laptop go to waste. I had one the latest MacOS’s on it, but it wasn’t the latest. It was also a bit slow if you ask me. It’s a Core i5 2.5 Ghz with 8 GB of mem and a 128 GB SSD. So not a powerhouse, but a nice little laptop.

I run Manjaro Linux on my desktop PC so I am familiar with Arch and I had an installer USB ready. First thing I did was boot from the USB (you need to hold down the alt key while booting) to see if Manjaro would run. The “Live CD” version on the installer seemed to work great but no Wifi or networking. Of course, the installer needs wifi to update. I figured out that I could plugin my mobile phone via USB and it would provide networking support via the tether. I installed Manjaro and updated with all basic setting. Full wipe and install. I rebooted and happily it started without issue.

After a big smile an relief, I went about checking all the hardware to make sure everything was working. Arch Linux has a great webpage on installing and configuring Arch on MacBooks. The only bit of hardware that didn’t work was the web-camera. I followed this article to download, compile and install the required kernel module to use the web-cam. Remember that you must have kernel headers for your kernel loaded for the compilation to work! The first few times I’ve installed kernel modules in Manjaro/Arch, I’ve forgotten to install the proper kernel headers so it didn’t work properly. Anyways, I tested with the Cheese app after a quick reboot to ensure that everything was working fine.

Next, came the keyboard. I chose typical default US keyboard layout. Most of the function keys worked fine, volume, start/stop, mute, screen brightness and keyboard backlight brightness. Two function keys didn’t work out of the box. Those were for Expose and Mac Applications list. I went into Keyboard shortcuts and remapped the Expose key to Screenshot capture interactive since I don’t have a print key on this keyboard. I remapped the Applications function key to show all desktops in Gnome. Oh, by the way, I forgot to mention that I’m running Gnome 42 on Manjaro. You can choose different window managers/desktop environments for Manjaro and I’m most comfortable in Gnome from my days in Pop _OS and before.

Lastly, the trackpad, oh the trackpad. It was just frustrating to me that I was randomly doing right mouse clicks based on the location I clicked on the trackpad. My work laptop does this as well and it really bothers me. I like to click with my thumb on my right hand and it’s not always comfortable to go on the left side of the trackpad. I found the following Gnome setting that you must run in the terminal to change from “areas” clicking to “fingers”. Fingers means two fingers on the trackpad to right click which is way more natural for me.

gsettings set org.gnome.desktop.peripherals.touchpad click-method 'fingers'

Update 21-Aug-22: I’ve also added the mbpfan service to autostart on my MacBook Air running Manjaro Linux. More details on mbpfan here. This service uses the coretemp and applesmc kernel modules to read the system temp and ramp up the internal (puny) fan. I have also installed a few of Luke Smith’s voidrice utility scripts to monitor the weather forecast and system temperature from the menu bar. More details at https://lukesmith.xyz

Categories
Hardware Software

Debugging Poor Internet Service at Home

From March 2020 to the present I have worked from home; I am fortunate that my company allows me such freedom. I am interested in returning to the office next year but I enjoy knowing that I can work from home fairly efficiently and that my company invested in their infrastructure to facilitate a mass migration from the office to almost entire WFH overnight. My home Internet access, powered by Comcast Xfinity, and my personal computer needed upgrades though to reach the level of performance I required to do my job (more on my desktop computer in a future post). Prior to Covid-19, my home network was not slouch, but I honestly didn’t use it except nights and weekends. Middling performance was sort-of ok — I mean it wasn’t but I’m not going to call Comcast to complain if my Internet drops occasionally. Raw network speed is important but stability is the most important factor. If I’m on a call with my supervisor (or a team meeting), I don’t want the Zoom call to hang or drop. This adds a level of stress on me as my home Internet connection is now a requirement for not only me working from home but also my daughter completing her school-work.

Let me first define what a poor Internet connection looks and feels like. As I mentioned, I have a Comcast Xfinity Cable Internet connection; specifically I have the Performance Plus package which is 600 Mb down and 20 Mb up (notice the little b in that statement). Megabits stands for a million bits (a one or a zero) and it’s a common trick that network service providers play. A byte is 8 bits, bytes are what file sizes are measured in. The large Megabit number feels impressive but btyes are a better measure of file transfer speed and usage. Honestly though, it doesn’t matter as long as you know what you need and most importantly you don’t overpay for bandwidth you don’t know or vice versa. Comcast offers a Gigabit internet connection for a bit more money each month; I’m not going to bite at that until I can prove that my issues/limitations are caused by the bandwidth cap and not some other weak link in the chain (you are only as fast as the slowest link in the proverbial network chain).

Remember that scene in “The Matrix” where Neo swallows the blue pill? You may ask, which Matrix movie which I would respond “There is only one Matrix movie”, but I digress…. You know that sound that is made when Neo swallows the pill, it is a very distinct sound of stuttering audio. That is the sound that Zoom (or other video conferencing apps) make audio or video lags. This sound kills a meeting and impacts your ability to WFH. A more nefarious version of this issue is when the Audio/Video of a Zoom call is coming in fine for you since the download speed is typically much higher bandwidth but your meeting recipients see a stuttering mess when it comes to your audio/video feed. That stuttering audio sound should be familiar to many as it’s the result of poor Internet connection. There can be many reasons for this sound and we’ll go through them one by one to triage the problem.

Step 1: Call Comcast and Complain

If you are a technical person and you know a bit about computers and networking, this is going to be the hardest step. Calling the 800 number can be a frustrating experience for technical-minded individuals. Please remember to be courteous and kind to those who answer the phone. They must run thru their approved script of troubleshooting activities and mostly they speak to non-technically minded individuals — so cut them some slack! Your conversation will always start with, “Let’s reboot your cable modem to see if that fixes the issue”. I’m sure in many cases that would do the trick, but we (my cultured friends) are technically minded and we’ve already done that step. They will send a signal to your cable modem to assess connectivity and reboot as needed. I have not seen this script but it seems a required step before they move on to other steps. Every call or conversation starts with, “can we reboot your cable modem Mr./Mrs <insert your name>?” or the familiar question of “Is your computer directly connected to the cable modem?”. If you own your own WiFi router, Comcast doesn’t want to spend tech time debugging issues with your hardware. They will suggest you connect directly to the cable modem to cut out the middle-man. You should humor them as ultimately you want to show the problem of poor internet performance is repeatable when you are directly connected to the cable modem and therefore the root cause of the problem isn’t your WiFi router. As you progress through the scripted questions, where you want to end up is “We will schedule a technician to visit your residence.”

Step 1a: Repeat calls or Power issues

Don’t laugh. I literally had to have repeat calls with Comcast to investigate the issue. They would attempt to “flash” my modem or “send a signal” to my modem to correct the problem. I have no idea what they did in these situations but it generally meant you had to end the call and monitor performance for a few days and call back if there was a repeat. On one call I got a tech who asked me if I had a UPS (uninterruptable power supply) connected to my Cable Modem and my WiFi router. I replied no which was the honest truth; I’d always had been thinking of getting one but I hadn’t yet. The tech explained that power fluctuations can result in cable modem issues and recommend I install a UPS. I did as was told and purchased an APC Back-UPS NS 1250 (used) from Goodwill for like $30 USD. The batteries were of course spent on the unit I received so I purchased new batteries online for approx $45 USD. The unit has a nice LCD display and it “cleans” the power signal to your sensitive electronics as well as providing a short term battery backup in case of power issues. This did not resolve my issue and I had to call back after the UPS was installed and the issue reoccurred. Keep pushing for a tech to visit your house…

Step 2: Tech Visit – Part 1

Comcast techs are in a separate division from the customer support team and therefore can only see details that are documented in problem tickets or cases. It’s important to have the customer support representative and/or the Comcast technician to document the issue thoroughly in the ticket for improved hand off between teams. The first Comcast tech arrived in the early Summer and after some quick checks in my backyard, he diagnosed that my cable line from my access point on my house to the demarcation point in my back yard had to be redone. I suppose my dogs had dug a portion of the cable up and compromised the copper wire and shielding. He reran the cable in less than an hour but the cable was laying on top of the grass in the backyard. He explained that another person would contact me in a few days to come and dig a trench for the cable and shield it in protective PVC. This was hot, sweaty work in the middle of Summer and I’m thankful for their service. Now that the wire was safely in the ground, I was sure this would resolve my poor Internet performance issues. It did not… I mean I’m sure it resolved some issues but it didn’t resolve “the” issue.

Categories
Hardware Software

Create a WiFi-Repeater using DD-WRT and an old Asus Router

Asus WiFi routers are great! … says the guy who owns two and just bought a third on Amazon yesterday. I’m not one to waste old hardware and I was thinking that I’d like to flash my old Asus routers with the DD-WRT firmware so I can transform them into WiFi-Repeaters!

Savvy readers will say, “But Rich, Asus already has AiMesh technology to do that. Why do you need DD-WRT?

My response. “AiMesh only works on recent Asus models, it doesn’t work on my N66R for instance. DD-WRT works perfectly fine and breaths new life into that obsolete model”.

So now that we have established why we’d want to do this, let’s roll up our sleeves and get to flashing….

dd-wrt router database

Step 1: Do Your Research

Flashing the firmware of a WiFi router is not trivial; first and foremost you need to visit dd-wrt.com and see if your router is supported. Search the router database for your manufacturer model (e.g. asus). Some WiFi routers have multiple (confusing) retail names for the same hardware and some retail names have multiple different hardware revisions! Check the serial number and the hardware revision indication on the label of your WiFi routers, my RT-N66U is hardware revision B1. Checking the router database, my hardware revision from 2011 is supported and a fresh firmware file as of 2019!

Save the .trx firmware file to your Computer

Step 2: Download the firmware file to your desktop or laptop

You need to prepare by saving a copy of the .trx firmware file to your local computer (desktop or laptop) that you will use to flash the WiFi router. The file is not very large; about 22 Mb in this example. Please note there are various build numbers in the pulldown combo box. I chose the latest file. You can download multiple .trx files from different builds, but make sure to take notes of which file is which so you aren’t confused later.

Step 3: Read the flashing instructions at least twice

Remember the old Carpenters saying, “Measure twice, cut once”. Flashing the firmware of a router is a bit like baking a cake; you need to follow a list of instructions precisely or the end product will not be good (edible?). In my instance, the first line of the instructions says “Note that the two existing hardware revisions, “A1” and “B1”, of this router are significantly different. This page is about revision “A1”, typically referred to as RT-AC66U, without the revision. For information about the “B1” revision, see Asus_RT-AC66U_B1.” Now, I follow the new link to updated instructions and I see hardware revision A1 and B1 instructions are radically different. I notice the next block of bolded text, “it is recommended that you flash an RT-AC68U build. RT-AC66U builds are optimized for revision A1 and will not work with this router.” Wow, I was really lucky there. I could have ruined this router by flashing the wrong firmware that I downloaded in the previous step. I follow the updated instructions to download the AC68U firmware file.

Step 4: Connect your computer to the Wifi router to flash the firmware

You will most likely do this step several times before you get it right. Follow the linked instructions, steps 1-14. Make sure you are not rushed and I always like to have a bit of music playing to help keep stress levels down. Steps 1-4 are simple, please remember to disconnect from any other WiFi routers and connect a cat6 cable from your computer to the router you want to flash. Make sure you connect to the LAN port, not the WAN port. Steps 5-9 explain how to put your Asus router in “rescue mode” to enable the flashing of firmware. While there is a firmware flash mode in the typical Asus menu, it will not allow you to flash a 3rd party firmware like dd-wrt. If you followed the steps correctly, your power LED will be flashing slowly and 192.168.1.1 will show a simple webpage entitled ASUSTek – CFE miniWeb Server. Step 10 tells you to “Restoredefault NVRAM values” and step 11 prompts you to browse for the .trx firmware file on your computer and click upload. It will take maybe a minute or two to transfer the file at which point the webpage will say flashing the firmware, please wait a few moments. I asked how long are a few moments? It says the router will reboot when complete. Be patient, wait at least 15-20 min to let the firmware file flash and you’ll know when it’s done when the router reboots and the power light goes solid (no blink). Now, I used the AC68U firmware file like the instructions warned me to do but that didn’t work (I tried 3 times). On a lark I used the n66u firmware .trx file I originally downloaded and it worked like a champ! go figure….

Configure your new router

Step 5: Configure your newly flashed DD-WRT router

After the router reboots from the flash, connect via your PC which is still connected via the CAT6 cable to http://192.168.1.1 which is the default IP address for your WiFi router. You might also see a WiFi SSID of dd-wrt on your network. When you first connect you will be prompted to choose a login name and password for your router. Make sure you don’t forget these as they are the admin credentials. For me, this router is a second router on the network (i.e. it’s not my primary router). If I was try and connect it to my main network, I would get an IP address conflict for 192.168.1.1 which is the actual IP address of my primary router. In the setup tab in the Network Setup section I changed the routers IP address to 192.168.1.2 and set the subnet mask to 255.255.255.0. I set the gateway to 192.168.1.1 and I set my DNS to 192.168.1.133 (which is my pihole server << more on that in another blog post). I disabled the WAN connection type and gave my router the name lung (you see my primary router is always named heart). I hit save and apply settings and I believe the router restarted. I can now plug this router via CAT6 cable into my primary router to check that they happily co-exist.

Step 6: Setup the WiFi repeater

AiMesh and DD-WRT WiFi repeater mode essentially allow you to extend your WiFi coverage and you can leverage one band (2.4 GHz for example) to do the bridge and rebroadcast on another band. There are so many combinations here I’m not entirely sure which one is best. I stumbled upon a great Youtube channel called Behfor that walks you thru the what’s and the why’s of your WiFi router and setting up the repeater. Look for the video entitled Dual Band DD-WRT Repeater Bridge. I’m still playing around with this part 😉 Let me know if this was helpful or if you are using WiFi Repeater.

Categories
Hardware Software

Use a TiVo as a Video Capture Card + Archive to Plex, FreeNAS / TrueNAS

I’ve been a loyal TiVo customer for more than 16 years which feels awkward to type. TiVo never really cracked into the mainstream, it has always been a premium product and it has since gone thru many acquisitions and CEOs in recent years. I currently own a TiVo Bolt and several TivoHDs. The TiVo is a DVR (Digital Video Recorder) which is a market they practically invented along with a competitor named ReplayTV. I’m not a heavy television watcher but I do watch sports and particularly NHL Hockey. The TiVo can setup a “season pass” on a particular sports team and record all games (i.e. Dallas Stars). My TiVo Bolt has a 500 GB internal HD which is capable of holding many dozens of shows; the Dallas Stars are on a historic Stanley Cup run and I wanted to archive some games for watching later / posterity. The TiVo has native Plex App support so I wondered if I could pull the recorded MPEG shows off the TiVo and archive them in a Sports Plex Library on my FreeNAS server (which has many TBs of storage and ZFS!).

Update 25-Oct-20: The Dallas Stars lost the cup to the Tampa Bay Lightning in 6 games. It was exciting hockey and I’m sure glad I have the series on my Plex. I’m excited for next season, looks like we’ve signed most the team back with the exception of Corey Perry and Matthias Janmark.

Step 1: The Fair Use Doctrine

Am I legally allowed to record and save a show from my TiVo to the Plex? Accord to the Fair Use Doctrine the answer is yes.

I can legally record a broadcast TV program (from a Cable TV feed I pay a monthly fee for) on a recording device such as a Video Cassette Recorder, Digital Video Recorder or computer for my personal use. Recording programming for later viewing is called “Time Shifting” and is a legally supported act. I can view the recorded content as many times as I want, I can make additional copies of the recorded content and I can distribute copies of the content to other people in person. Educational uses of recorded TV content receive additional protection. It is legal to record a TV program and play it for a class. I can also edit and parody the recorded content as long as the new version adds new value (insight, understanding, aesthetics) to the original. 

I can’t hold public exhibitions, rebroadcast, distribute on peer-to-peer networks or sell a TV broadcast recording. Fair use does not protect mass distribution of recorded content or the ability for a person to make a financial profit from a copyrighted recording.

The TV recording copyright laws for the U.S. are rooted in the Sony Corporation V. Universal City Studios court case–commonly known as the beta max case. The Supreme Court determined that “video tape recorders” did not infringe on the TV programming copyrights and the potential financial loss to copyright holders from TV recording would be negligible. The case made it legal to produce and sell TV recording devices and for people in the U.S. to record TV programming.

Step 2: How Do I get my Shows off the TiVo?

Let me introduce you to a wonderful little piece of software called pyTivo. This open source software which is not affiliated in any way with TiVo, Inc provides similar functionality to the TiVo Desktop software for Micro$oft Windows and Apple Macintosh. Namely this software allowed you to push and pull MPEG video files from my TiVo and I have been a happy user for over 10 years. The software runs on a host (or a NAS or wifi-router) on your local area network and listens via multi-cast IP for connected TiVo devices. The software is very simple to install and very light requiring only Python, ffmpeg (to transcode) and the tivodecode utility to decrypt TiVo video files. I setup a Jail on my FreeNAS 11.3 server where I wanted to install pyTivo. I had previously setup a share called sports on my medialibrary directory on my NAS pool. I kept the sports folder seperate from Movies or Television on the Plex and in the medialibrary since Plex expects a certain naming structure for Television shows or Movies. I installed the required software:

rich@kidney$ pkg add ffmpeg git tivodecode
rich@kidney$ cd ~/
rich@kidney$ git clone git://repo.or.cz/pyTivo/wmcbrine.git
rich@kidney$ mv wmcbrine pyTivo
rich@kidney$ cd pyTivo
rich@kidney$ cp pyTivo.conf.dist pyTivo.conf
rich@kidney$ vi pyTivo.conf
rich@kidney$ ./pyTivo.py

Step 3: Configuration of pyTivo and First Download

Jot down the IP address of the Jail you configured in Step 2. Fire up your favorite web browser and head over to that address and port 9032 (which is the default, you can change this). The pyTivo user interface is very simplistic. It will initially only show you a Settings link which you must configure for first use.

I’ve circled the most important settings and how I’ve configured them. The paths to ffmpeg and tivodecode and tdcat binaries must resolve. You can test the fully qualified path names to those binaries on the FreeNAS ssh command line. Please note that I compiled a fresh version of tdcat and tivodecode from wcmcbrines git repo as the stock FreeBSD tivodecode binary seg faulted for me. I set my beacon address to the multi-cast for my local subnet and I ensured that my FreeNAS box was on the same local subnet as my TiVos. The togo_path is important. This is where all shows downloaded from the TiVo will be saved local to the pyTivo installation. As previously mentioned I created a sports mount point to my medialibrary share on my ZFS pool. Lastly, I filled in the TiVo MAK (Media Access Key) for my particular account. This is a secret key used to decrypt shows recorded on my personal TiVo — Do not share this key! You can find your MAK on tivo.com when you login to your account. Save changes and restart your pyTivo to ensure changes take affect. Make sure on the command line that pyTivo.conf has been updated with the information you input in the Settings menu. When you restart pyTivo you should see a listing of your TiVo’s and if you input a correct MAK key then you should be able to connect and browse a listing of shows on the Tivo.

If you click on a folder you should see a listing of shows with a description of each one along with the runtime, the file size and the date it was recorded. The exclamation point next to each show means these shows will be deleted shortly as needed for space. Remember: I only have a 500 GB model…

So, each Dallas Stars hockey game is 3.5 to 4 hours and it’s about 7 GB of 720p video recorded at 4 Mbs. I can of course play around with how this is recorded on the TiVo Bolt itself but this seems to be a good compromise of space/size vs. quality. Honestly I want to avoid any transcoding and just focus on decrypting and downloading to the NAS.

Click the check next to each show you want to download and check the bottom boxes to decrypt, save meta data and transfer as mpeg-ts. As far as I understand the mpeg-ts doesn’t transcode and just copies the raw file from the TiVo.

Rename each file and add .mpg extension; the text file will contain meta data for the video.

Quick Update 23-Sep-20: You don’t need to rename the file extension to .mpg for the Plex file scanner to “see” the video files. Just make sure the file permissions allow Plex at minimum to read the file. A simple check of chmod 777 could help spot if that is the issue. The file will come into Plex with the default filename as the Title. You can “enrich” this information manually in the Plex UI if you wish. Plex seem to take 3 or so stills from the video file to use as the poster in Plex. These seem to be fine for me in most cases.

Step 4: Add Tivo function user to run PyTivo Jail

In the FreeNAS web console, select Accounts and Users and click on the Add button. Fill in the new user details, in my case I created the user tivo and most important set the UID (user id) to a unique number higher than 1000. In my case I chose uid 1010. Next set the group for the tivo function user to something that you use with your media, in my case the media group. You can setup a home directory if you wish (it’s not necessary). Click save to create that user.

Ssh into your tivo FreeNAS Jail using the following command

root@kidney$ jls tivo
root@kidney$ sudo jexec 8 /bin/tcsh  <<whereas 8 is your tivo jail id>>

root@tivo$ whoami

Now that you are in your Tivo jail as a the root user which you can see from the command line. Users and groups created within a FreeNAS jail are only visible in that jail. Meaning you can create users here but they are unique to that jail and are not in your overall FreeNAS system. But, you can create a new user in the jail and use the same UID and GID as the users and groups you setup in the overall FreeNAS system. That way any file saved will show tivo and group media in both the Jail and in FreeNAS and via shares. To do this run the following commands within the Tivo jail:

root@tivo:/mnt/sports # pw groupadd media -g 8675309
root@tivo:/mnt/sports # pw groupshow media
media:*:8675309:


root@tivo:/mnt/sports # adduser
Username: tivo
Full name: TiVo Functional User
Uid (Leave empty for default): 1010
Login group [tivo]: media
Login group is media. Invite tivo into other groups? []: 
Login class [default]: 
Shell (sh csh tcsh git-shell nologin) [sh]: 
Home directory [/home/tivo]: 
Home directory permissions (Leave empty for default): 
Use password-based authentication? [yes]: 
Use an empty password? (yes/no) [no]: 
Use a random password? (yes/no) [no]: 
Enter password: 
Enter password again: 
Lock out the account after creation? [no]: 
Username   : tivo
Password   : *****
Full Name  : TiVo Functional User
Uid        : 1010
Class      : 
Groups     : media 
Home       : /home/tivo
Home Mode  : 
Shell      : /bin/sh
Locked     : no
OK? (yes/no): yes
adduser: INFO: Successfully added (tivo) to the user database.
Add another user? (yes/no): no
Goodbye!

In the above instance I had already created a media group in FreeNAS with 8675309 as the group id (I guess I was in a comical mood that day! Jenny Jenny … lol ).

Step 5: Setting pyTivo process to Autostart as tivo user

Update: 25-Oct-20: This one took me a bit of time to figure out. I followed this guide which was written for another python program called octoprint. In the guide they talk about writing an rc script to start the program and in particular to run it as a daemon. I did a bit of tinkering and I got it to work with pyTivo. Please note that pyTivo currently still needs python 2.7.

!/bin/sh
 PROVIDE: pytivod
 REQUIRE: DAEMON LOGIN NETWORKING
 KEYWORD: shutdown
 . "/etc/rc.subr"
 base_path="/usr/local/bin"
 name="pyTivo"
 desc="pytivo daemon"
 rcvar="pytivod_enable"
 pidfile="/var/run/${name}.pid"
 command="$location/$name/$name.py"
 command="/usr/sbin/daemon"
 command_args="-p ${pidfile} -u tivo -f -c ${base_path}/${name}/${name}.py"
 command_interpreter="/usr/local/bin/python2.7"
 load_rc_config $name
 run_rc_command "$1"

The rc script with the above content was saved in /usr/local/etc/rc.d as pytivod and I made sure to set the script as executable. I also made sure that pytivod_enable=”YES” is in the /etc/rc.conf file within the Jail. Restart the Jail and check that the process has auto-started and that the process is running as the tivo user. This is really, really important for me as I want all files to be owned by tivo:media on the TrueNAS and I can set the plex user and the tivo user to be in the media group so they have read/write access to those files.

Step 6: Add Plex Library for Other Videos

In your Plex web user interface add a new Video Library, make sure you choose other videos. I named the library sports for NHL and MLB games. In the Plex user interface you can scan for new media files and update the title and other details from the meta data text file. In the Other Videos category it’s really very simple and it doesn’t scan and enrich the filenames. I will need to add a renamer function to add series name and episode number to the filename of the files if I want a more seamless “Television Shows” experience on Plex. I’m still working on that part and I’ll update this posting when I get somewhere with that.

Categories
Hardware

Naming Standards / Permanance

To some folks, naming things like hosts or peripherals on the network is something done trivially. Should the printer be called printer or Epson (if that is indeed the make of your printer). This works when you only have one printer, but what do you name the second printer? printer2!?! Oh gawd, that would bother me. What happens if you get an HP printer to replace your Epson? should you rename the printer or keep the Epson name but point to the new HP printer? Loads of questions that I’m sure only bother folks like myself would crave a bit of order. I’ve implemented order at work and at home in various ways. In the early days of my career at the lab, my group had a “policy” to name hosts after mountains. Shasta, Krakatoa, etc were all used and volcanic mountains were used to specify a group within a group. This speaks to me like a beautiful painting or poetry speaks to other folks. You can do many things at once: a) provide order out of chaos, b) encode information, c) offer little bits of history or science.

I’ve settled on a naming scheme for my house. My router has been named heart for as long as I can remember. My NAS is named kidney. I’ve decided to name my printer colon. Why you say? Well, the belts inside it (it’s a Dell Color Laser 3130cn) are somewhat serpentine and it spits out stuff so I think that name is appropriate. My Cisco IP phone is named cochlea. Essentially my Linux PC should be brain. I’m a bit reserved on that word. I’m still thinking about what name I should choose for my Linux PC; any suggestions?

Categories
Hardware Software

Floppy Disks on Linux in 2020

I setup a USB floppy disk drive on my Ubuntu Linux computer in the summer of 2020 because “Hey, Why Not?”. I have one box of diskettes, they are 2HD unformatted. When I plugged it in, I knew that it was /dev/sdc because the Disks utility showed it as that. I needed to format the diskettes as VFAT (i.e. DOS compatible) and 1.44Mb capacity. I then wanted to mount the disk in my filesystem. In Unix there is a consistent filesystem starting with the root (“/”) directory. I wanted this in /media/floppy, so I did the following:

% sudo apt install ufiformat
% sudo ufiformat -i /dev/sdc
vendor:  Y-E DATA
product: USB-FDU
write protect: off
media type: 2HD
status      block size   kb
formatted    2880  512 1440
formattable  2880  512 1440
formattable  1232 1024 1232
formattable  2400  512 1200

% sudo ufiformat -f 1440 /dev/sdc
geometry: track=80, head=2, sector=18, block=512
done  

% sudo mkdir /media/floppy
% sudo mount /dev/sdc /media/floppy




Categories
Hardware Software

Ubuntu Apple Magic Mouse Woes

I’ve been running System 76’s Pop OS as my desktop OS for a few weeks now. I switched from MacOS to Linux full time this year; previously i had at least one MacOS iMac and then one or two Linux boxes. Now, since my sad mac woes where my hard disk failed (or was failing SMART checks) and I tried to fix which left the iMac running sub-par — I built a Linux box and switched full time. If felt like an awakening of sorts as I’d been praising the beauty and small form factor of the iMacs when the hardware was dreadfully underwhelming. More detail on my Linux box later, this post is about Apple HID or Human Interface Devices. I just like my Apple keyboards, trackpads and mice. I’m still using them on my Linux box happily but there is one thing that has been grating me — emulation of a 3 button mouse which by default pastes clipboard content.

So, modern Linux by default support Apple’s Magic Mouse and it provides all the touch features you’ve been used to on MacOS. Unfortunately, it also emulates a 3 button Unix mouse where the middle button pastes from the clipboard. This is so frustrating as the middle click area is awkwardly close to the left click area. I googled and “fixed” this by executing the following command line:

% sudo rmmod hid_magicmouse
% sudo modprobe hid_magicmouse emulate_3button=0

This is quick and it seems to have survived a reboot so I hope it sticks. It essentially turns off the middle button click but leaving left and right and the other various touch features.

I read this on a forum recently and I though it was very appropriate

Honestly, I won’t say the transition has been entirely painless – it does take time to adjust to a new operating system, but I have to say, my biggest regret is that I didn’t ditch Apple’s computers sooner. I love my iPhone but honestly it does feel like Apple just isn’t all that interested in their desktop / laptop computers recently.

Categories
Hardware Software

FreeNAS 11.3 + Asterisk VOIP, Cisco IP Phone 7942

Create your own PBX for VOIP and run it all from within your FreeNAS 11.3 server in a Jail — no WebGUI needed for Asterisk as long as you are comfortable with the command line. I see a lot of folks talking about using FreePBX which looks amazing but honestly I just want to run this in a FreeNAS jail and Asterisk is really all you need. I purchased 11 Cisco 7942 IP Phones for $40 (including FedEXshipping) from Goodwill which is such a deal considering these phones were on sale new until February 2016 for $455.00 USD! Now this phone is a trip to configure for SIP especially if you are going to handcraft the XML which is how we are going to do it (there is plenty of documentation on line to help you). I will draw heavily on an blog article I read from whizzy.org and I will add bits that worked for since I had a slightly different setup. Many thanks to Will Cooke who wrote the article, I’ve literally read it a dozen times and I get a bit more each time I read it. No joke this took me a solid 10 days during Covid-19 lockdown to figure out (obviously not 10 days straight — I set small goals and would keep at it until I got a bit farther…). OK, on to the steps…

Step 1 — Setup FreeNAS Jail

Let’s get a FreeNAS Jail setup and download Asterisk. We won’t configure Asterisk yet, just download and install. We’ll focus on the latest Asterisk version 16. Also, we will want to use SIP for VOIP, Asterisk can do much more but everything is SIP now-a-days.

Step 2 — Setup your Wifi Router for TFTP and NTP

I don’t want to install any specialty software (like a TFTP server or Cisco Call Manager). I have a very capable ASUS router that is flashed with the ever popular Merlin firmware, so I figured I’d enable NTP and TFTP on it. Why does this matter? Well, you see, when a Cisco IP Phone boots it first tries to get an IP4 address via DHCP and next it looks for a local TFTP server to load it’s config. You can specify in the phone the IP address of the TFTP server but by default it’ll look at the same gateway server that it got it’s DHCP address from. ASUS Merlin uses DNSMasq binary for various DNS services and you can enable TFTP within DNSMasq with a few quick steps.

  • Flash your router with the latest supported Merlin firmware.
  • Login to your routers web GUI, mine is at 192.168.1.1, default login is admin
  • In Administration >> System >> Change router password, set the new login name and password. Make sure it’s a strong password.
  • In Administration >> System >> Persistent JFFS2 Partition, click Yes on BOTH Format and Enable persistent JFFS
  • Before we leave this page, On Basic Config, select Yes to Enable Local NTP Server and Intercept NTP queries. You must then set you Timezone and Daylight Savings parameters.
  • Continuing on this page, Find Service and set Enable SSH to “LAN Only”
  • Click Apply
  • Next, install a FAT32 formatted USB thumb-drive in one of the routers USB slots.
  • REBOOT your router. When it comes back up ensure that all the setting you set were applied. NOTE, in Administration >> System >> Persistent JFFS2 Partition >> Format will now be set to “No” and that is correct.
  • In an SSH Terminal on your Mac, Windoze or Linux box, connect to your router with ssh <login>@192.168.1.1 use the login and password from the earlier step. You will be prompted to save the server key for your first login, type y or yes.
  • In your SSH session, do the following:
cd /jffs/configs
vi dnsmasq.conf.add
<hit the i key to insert and type>
enable-tftp
tftp-root=/tmp/mnt/<some directory on that USB thumbdrive>/tftproot
<hit esc key to break out of insert mode>
<hit SHIFT and ZZ to save>
  • While you are still in your SSH session cd to /tmp/mnt and find your USB drive. I set mine to mount as data so I cd’ed to /tmp/mnt/data
  • Create the tftproot directory by typing mkdir tftproot
  • Set the permissions on that directory to 777 and set the owner to nobody via the chmod and chown commands
  • Restart your router again via the web GUI which will end your SSH session.
  • When your router is back up check that TFTP service is listening (it’s running on port 69 😉 ) You should see something like this
<user>@<router>:/jffs/configs# netstat -an | grep 69
...
udp        0      0 127.0.0.1:69            0.0.0.0:*                           
udp        0      0 192.168.1.1:69          0.0.0.0:* 

Remember this tftproot directory on the USB thumbdrive because you are going to be referencing it a lot. I basically have a terminal window opened and ssh’ed to that directory which I used to create all the XML files to configure the Cisco IP Phones. Remember that every file and subdirectory needs to be chmod’d to 777 and chown’d to nobody so the Cisco phone can read them.

Step 3 — Download the SIP Firmware from Cisco

Remember that I said everything is SIP now-a-days? Well, Cisco used another protocol called Cisco Skinny and I bet 9 times out of 10 any Cisco IP phone that you find used will have the Skinny protocol on it rather than SIP. It’s fairly easy to update the phones. Let’s get the latest software. You do will need to register an account to download the files, it’s free.  At the time of writing the latest version is of SIP firmware for the Cisco IP Phone model 7942 is 9.4.2 SR 3 dated 15th February 2017, even though these phones are end-of-life.  Bizarre, but good for us.  Thanks Cisco! <<< this last comment is from Will Cooke which I thought was funny so I copied it here. You should get the software package labeled “7942 and 7962 SIP IP Phone Firmware Files Only” which is about a 6 Meg zip file. Download it and copy the zip to the tftproot folder and uncompress it. Please remember to set permission on all extracted files to 777 and owner to nobody. BTW, the 7942 and the 7962 are the same phones but the 42 has 2 “lines” and the 62 has 6 “lines”.

Step 4 — Flash the phone with SIP Firmware via the TFTP server

Take your Cisco phone and turn it over. On the back side there is a port labeled 10/100 SW which stands for Switch or the connection to the network switch to be more exact. If you network switch supports PoE (Power over Ethernet) than all you need to do is plug a CAT5 or CAT6 patch cable from the switch to the 10/100 SW labeled port. I have a Cisco Meraki Gb PoE Ethernet switch so I’m all set! If you don’t have a PoE capable switch then you need a power adapter which you can get on Amazon. When you plug in the phone it will attempt to boot and connect to whichever service it was configured for — this won’t work and the phone will spin on registering or it’ll say “Unprovisioned”. What you want to do is flash the firmware that you just downloaded.

  • Unplug and then plug the network or power back in and hold down the # key (only takes a few seconds on 7942 model)
  • Eventually you will see the “line” lights start to flash orange.  When the line lights are flashing type 123456789*0#  This will start firmware download mode.
  • The screen will go black for a moment and then go through the process of getting an IP address and connecting to the TFTP server Once connected to the TFTP server the software download will start. You can check the server logs on your router to see the connection, the DHCP and finally the TFTP file requests. Note: that it’ll ask for some files that you won’t have and that’s ok for now since we’re focusing on the firmware.
  • The upgrade takes 5-10 min normally. The phone will reboot once download is complete and present you with an “Unprovisioned” message on the screen.  This is good news!  The phone firmware has now been updated — go to the next step, else continue to the next bullet item here.
  • If the phone sticks at the “Upgrading screen with the Cisco logo” for more than 10 min with no visible activity then you are in whats called the “Boot Loop”. I had this on about 5 of my phones; I don’t know what causes it but I’ll tell you how to fix it.
  • Unplug the phone and replug it again and hold # as it boots (like before) and instead of 1234567890*# do 3491672850*# (notice the pattern of your fingers with each sequence so you can repeat it without even thinking in the future). The “lines” will flash RED this time.
  • Do not do anything to the phone until it completely resets and comes back up functional. This essentially formats the flash and only keeps the Cisco Native Unix (CNU). It takes 10+ minutes and for a while it looks like the phone isn’t doing anything (but it is). Be Patient. Your phone will automatically reboot and hopefully this time it’ll connect to the TFTP server and begine the Firmware install.
  • You can repeat this process if you ever need to, I did it on my first phone a dozen or more times without any apparent impact to the phone.

Step 5 — Configure the SIP extension in Asterisk

Will Cooke mentioned an important piece of information in mind: The Cisco 7941 can only deal with 8 character passwords, so keep your SIP authentication secret to 8 characters. I haven’t checked if 7942 improves this, YMMV. Ssh to your FreeNAS server and use jexec to ssh into the Asterisk jail. When you are at the command line, do the following:

cd /usr/local/etc/asterisk
vi sip.conf

<add these lines at the bottom>

[1001]
deny=0.0.0.0/0.0.0.0
secret=password
context=from-internal
host=dynamic
type=friend
nat=no

<hit shift ZZ to save it>
<then run this command>

asterisk -r

<at the Asterisk CLI Command Line Interface, type>

reload

Step 6 — Create Phone XML Config and Upload to the TFTP Server

As Will Cooke states: Please take the time to read this section fully, this is the part that is most troublesome. The Cisco 7942 is very picky about it’s config file and even a small mistake will stop the phone from working. I spent many days on this step; it will not be uncommon for you to spend many days as well on this. These settings are specific to the 79×[1,2] series of phones running v9.x.x of the SIP firmware. If you are not using this type or hardware or software then these settings are not for you.

Once the phone has loaded it’s firmware and booted, it will go looking for a file called SEP<PHONE MAC ADDRESS>.cnf.xml.  So if the MAC address of your phone is 11:22:33:44:55:66 then the config file needs to be named SEP112233445566.cnf.xml.  This file needs to be in the root of your TFTP server. The file is CASE SENSITIVE; go back and read that part again. A small typo that thinking a B is an 8 or vice versa will cause hours of “fun” so please check carefully.

Here is my file:

<?xml version="1.0" encodng="iso-8859-1"?>
<device>
  <fullConfig>true</fullConfig>
  <deviceProtocol>SIP</deviceProtocol>
  <sshUserId>admin</sshUserId>
  <sshPassword>cisco</sshPassword>
  <devicePool>
    <dateTimeSetting>
      <dateTemplate>M/D/YA</dateTemplate>
      <timeZone>Central Standard/Daylight Time</timeZone>
      <ntps>
        <ntp>
          <name>IPADDRESSOFROUTER</name>
          <ntpMode>Unicast</ntpMode>
        </ntp>
      </ntps>
    </dateTimeSetting>
    <callManagerGroup>
      <members>
        <member priority="0">
          <callManager>
            <ports>
              <sipPort>5060</sipPort>
            </ports>
            <processNodeName>IPADDRESSOFASTERISK</processNodeName>
          </callManager>
        </member>
      </members>
    </callManagerGroup>
  </devicePool>
  <commonProfile>
    <phonePassword></phonePassword>
    <backgroundImageAccess>true</backgroundImageAccess>
    <callLogBlfEnabled>2</callLogBlfEnabled>
  </commonProfile>
  <loadInformation>SIP42.9-4-2SR3-1S</loadInformation>
  <vendorConfig>
    <settingsAccess>1</settingsAccess>                                            
    <sshAccess>0</sshAccess>  
    <disableSpeaker>false</disableSpeaker>
<disableSpeakerAndHeadset>false</disableSpeakerAndHeadset>
    <pcPort>0</pcPort>      
    <garp>0</garp>          
    <voiceVlanAccess>0</voiceVlanAccess>
    <videoCapability>0</videoCapability>
    <autoSelectLineEnable>0</autoSelectLineEnable>
    <webAccess>0</webAccess>
    <daysDisplayNotActive>1,7</daysDisplayNotActive>
    <displayOnTime>08:00</displayOnTime>
    <displayOnDuration>10:30</displayOnDuration>
    <displayIdleTimeout>01:00</displayIdleTimeout>
    <spanToPCPort>1</spanToPCPort>
    <loggingDisplay>1</loggingDisplay>
    <loadServer></loadServer>
  </vendorConfig>           
  <userLocale>              
    <name>English_United_States</name>
    <uid>1</uid>            
    <langCode>en_US</langCode>
    <version>1.0.0.0-1</version>
    <winCharSet>utf-8</winCharSet>
  </userLocale>             
  <networkLocale>United_Kingdom</networkLocale>
  <networkLocaleInfo>       
    <name>United_Kingdom</name>
    <version>10.5.3.0</version>
  </networkLocaleInfo>      
  <deviceSecurityMode>1</deviceSecurityMode>
  <idleTimeout>10</idleTimeout>
  <authenticationURL></authenticationURL>
  <directoryURL></directoryURL>
  <idleURL></idleURL>       
  <informationURL></informationURL>
  <messagesURL></messagesURL>
  <proxyServerURL></proxyServerURL>
  <servicesURL></servicesURL>
  <transportLayerProtocol>2</transportLayerProtocol>
  <phonePersonalization>1</phonePersonalization>
  <autoCallPickupEnable>true</autoCallPickupEnable>
  <dndCallAlert>1</dndCallAlert>
  <advertiseG722Codec>2</advertiseG722Codec>
<rollover>0</rollover>    
  <joinAcrossLines>0</joinAcrossLines>
  <capfAuthMode>0</capfAuthMode>
  <capfList></capfList>     
  <certHash></certHash>     
  <encrConfig>false</encrConfig>
  <sipProfile>              
    <sipProxies>            
      <backupProxy>IPADDRESSOFASTERISK</backupProxy>
      <backupProxyPort></backupProxyPort>
      <emergencyProxy></emergencyProxy>
      <emergencyProxyPort></emergencyProxyPort>
      <outboundProxy></outboundProxy>
      <outboundProxyPort></outboundProxyPort>
      <registerWithProxy>true</registerWithProxy>
    </sipProxies>           
    <sipCallFeatures>       
      <cnfJoinEnabled>true</cnfJoinEnabled>
      <callForwardURI>x--serviceuri-cfwdall</callForwardURI>
      <callPickupURI>x-cisco-serviceuri-pickup</callPickupURI>
      <callPickupListURI>x-cisco-serviceuri-opickup</callPickupListURI>
      <callPickupGroupURI>x-cisco-serviceuri-gpickup</callPickupGroupURI>
      <meetMeServiceURI>x-cisco-serviceuri-meetme</meetMeServiceURI>
      <abbreviatedDialURI>x-cisco-serviceuri-abbrdial</abbreviatedDialURI>
      <rfc2543Hold>true</rfc2543Hold>
      <callHoldRingback>1</callHoldRingback>
      <localCfwdEnable>true</localCfwdEnable>
      <semiAttendedTransfer>true</semiAttendedTransfer>
      <anonymousCallBlock>0</anonymousCallBlock>
      <callerIdBlocking>0</callerIdBlocking>
      <dndControl>0</dndControl>
      <remoteCcEnable>true</remoteCcEnable>
    </sipCallFeatures>      
    <sipStack>              
      <sipInviteRetx>6</sipInviteRetx>
      <sipRetx>10</sipRetx> 
      <timerInviteExpires>180</timerInviteExpires>
      <timerRegisterExpires>3600</timerRegisterExpires>
      <timerRegisterDelta>5</timerRegisterDelta>
      <timerKeepAliveExpires>120</timerKeepAliveExpires>
      <timerSubscribeExpires>120</timerSubscribeExpires>
     <timerSubscribeDelta>5</timerSubscribeDelta>
      <timerT1>500</timerT1>
      <timerT2>4000</timerT2>
      <maxRedirects>70</maxRedirects>
      <remotePartyID>true</remotePartyID>
      <userInfo>Phone</userInfo>
    </sipStack>             
    <autoAnswerTimer>1</autoAnswerTimer>
    <autoAnswerAltBehavior>false</autoAnswerAltBehavior>
    <autoAnswerOverride>true</autoAnswerOverride>
    <transferOnhookEnabled>true</transferOnhookEnabled>
    <enableVad>false</enableVad>
    <preferredCodec>none</preferredCodec>
    <dtmfAvtPayload>101</dtmfAvtPayload>
    <dtmfDbLevel>3</dtmfDbLevel>
    <dtmfOutofBand>avt</dtmfOutofBand>
    <alwaysUsePrimeLine>false</alwaysUsePrimeLine>
    <alwaysUsePrimeLineVoiceMail>false</alwaysUsePrimeLineVoiceMail>
    <kpml>0</kpml>          
    <stutterMsgWaiting>0</stutterMsgWaiting>
    <callStats>true</callStats>
    <offhookToFirstDigitTimer>15000</offhookToFirstDigitTimer>
    <silentPeriodBetweenCallWaitingBursts>10</silentPeriodBetweenCallWaitingBursts>                         
    <startMediaPort>35900</startMediaPort>
    <stopMediaPort>65564</stopMediaPort>
    <phoneLabel>NewPhone</phoneLabel>
    <natEnabled>false</natEnabled>
    <natAddress></natAddress>
    <sipLines>              
      <line button="1" lineIndex="1">
        <featureID>9</featureID>
        <featureLabel>1008</featureLabel>
        <name>C0255C42118C</name>
        <displayName>1008</displayName>
        <contact>1008</contact>
        <proxy>USECALLMANAGER</proxy>
        <port>5060</port>   
        <autoAnswer>        
          <autoAnswerEnabled>0</autoAnswerEnabled>
          <autoAnswerMode>Auto Answer with Headset</autoAnswerMode>
       </autoAnswer>       
        <callWaiting>1</callWaiting>
        <authName>SIPNAME</authName>
        <authPassword>PASSWORD</authPassword>
        <sharedLine>false</sharedLine>
        <messageWaitingLampPolicy>3</messageWaitingLampPolicy>
        <messagesNumber>*97</messagesNumber>
        <ringSettingIdle>4</ringSettingIdle>
        <ringSettingActive>5</ringSettingActive>
        <forwardCallInfoDisplay>
          <callerName>true</callerName>
          <callerNumber>false</callerNumber>
          <redirectedNumber>false</redirectedNumber>
          <dialedNumber>true</dialedNumber>
        </forwardCallInfoDisplay>
      </line>               
      <line button="2">     
        <featureID>3</featureID>
        <featureLabel>Hold</featureLabel>
      </line>               
    </sipLines>             
    <externalNumberMask></externalNumberMask>
    <voipControlPort>5060</voipControlPort>
    <dscpForAudio>184</dscpForAudio>
    <ringSettingBusyStationPolicy>0</ringSettingBusyStationPolicy>
    <dialTemplate>dialplan.xml</dialTemplate>
    <softKeyFile>softkeys.xml</softKeyFile>
  </sipProfile>              
</device>                    

Copy this XML file to the root of your TFTP server. You phone will automatically try and load the config; if you are impatient you can hit the settings button on the phone and then hit asterisk key twice then the hash key and finally asterisk key twice ( **#**). This will cause the phone to soft boot and try and load the config. It will probably load the firmware again to finish loading the SIP firmware which is completely natural. If successful after all the reboots, the phone will not show “unprovisioned” and the phone icon next to the “line” button on the right side will NOT have an x in it. Go ahead and make a call!

Troubleshooting

Need to fill this out.

Categories
Hardware Life in lockdown

Bose Wave Radio vs Amazon Alexa

I recently purchased a Bose Wave Radio from Goodwill for $76 + shipping. It had no remote so add on $10 for a new remote (no battery included grumble, grumble). I’ve always wanted a Bose Wave Radio, but the price always kept me from them ($499 USD retail). Here is a legitimate review from cnet, so many reviews seem so fake or paid for.

https://www.cnet.com/reviews/bose-wave-music-system-review/2/

My review is simple — the Alexa doesn’t hold a candle to Bose in terms of sound quality. The base and drums are deep and rich on the Bose compared to my Mono Alexa. I did three experiments playing the same song Alexa and the Wave Radio. Two of the experiment use Plexamp connecting to my NAS to play an Apple Lossless (ALAC) rip of the physical CD — One via Alexa connected by Bluetooth, the Second the Wave Radio connected via AUX port and cable. The third experiment is using the physical CD as control. I wasn’t expecting Alexa to win, it’s Mono for gosh sake. I can configure an Alexa pair with both a left and right channel but it’s honestly a pain to setup and use so why bother.

Amazon Alexa Mono ALAC Rip Plexamp over Bluetooth

Conclusion is go out and buy yourself a good quality Bose Wave Radio at Goodwill and pickup some physical CD’s while you are there. Audio quality is much better than streaming IMHO but YMMV!

Categories
Hardware

Sad iMac

Do you remember the old Sad Mac icon on old system 7 (that was hip for us 70’s kids)? Well, imagine my iMac 27″ right now is a sad, sad Mac. The hard drive is failing. I was suspecting this so I ran an diagnostic utility called DriveDX and the disk failed it’s SMART healthcheck. The drive itself has 34K hours on it so it’s no spring chicking