I discovered a bug in the no-ip dynamic dns free hostname auto renewal/confirmation script written by loblab

Subject: I discovered a bug in the no-ip dynamic dns free hostname auto renewal/confirmation script written by loblab

Good day from Singapore,

Programming code troubleshooting person: Mr. Turritopsis Dohrnii Teo En Ming (Targeted Individual)
Country: Singapore
Date: 15 to 16 August 2020 Singapore Time (Saturday and Sunday)

My IT consulting company in Singapore asked me to install a Linux virtual machine so that we can run no-ip dynamic dns free hostname auto renewal/confirmation script written by loblab. I am an IT consultant in Singapore, 42 years old as of 16 Aug 2020.

I am not a Python or Java programmer or software developer. The last time I had formal training in structured C programming (not C++ objected oriented programming) was more than 20 years ago at Singapore Polytechnic (Diploma in Mechatronics Engineering course year 1995-1998). Although I am not a programmer or software developer, I can still more or less understand the flow of programming code.

I chose Debian 10.5 64-bit Linux to install as my virtual machine/guest operating system because loblab mentioned that his scripts have been tested on Debian 9.x/10.x. But first I have to install VMware Workstation Pro 15.5.6 in my Ubuntu 18.04.3 LTS Linux desktop operating system. The iso file I downloaded is debian-10.5.0-amd64-netinst.iso.

The virtual network adapter in my Debian 10.5 Linux virtual machine was configured to use Network Address Translation (NAT). You can verify the IP address of your VM with the following Linux commands:

$ ip a

$ ip route

Give your Debian 10.5 Linux VM at least 2 GB of RAM.

After installing Debian 10.5 Linux virtual machine (minimal installation with SSH server and standard system utilities), I need to do a few more things, as follows.

# apt install sudo

# usermod -aG sudo teo-en-ming

# groups teo-en-ming

So that I can sudo as a regular Linux user.

# apt install git

Then I downloaded the no-ip ddns free hostname auto renewal/confirmation script using git clone.

Software: Script to auto renew/confirm noip.com free hosts
Download link: https://github.com/loblab/noip-renew
Programmer: loblab

I believe programmer loblab is based in China.

The version of the scripts I downloaded is 1.1 dated 18 May 2020.

The composition of the software is 58.4% Python programming language, 36% Linux shell scripts, and 5.6% Dockerfile.

I tried to run setup.sh Linux shell script and choose "Install/Repair Script". But I found out that nothing is being installed in /usr/local/bin after a few installation attempts.

I thought the scripts/installation were being blocked by AppArmor, so I went to disable AppArmor using the following Linux commands.

$ sudo mkdir -p /etc/default/grub.d
$ echo 'GRUB_CMDLINE_LINUX_DEFAULT="$GRUB_CMDLINE_LINUX_DEFAULT apparmor=0"' \
  | sudo tee /etc/default/grub.d/apparmor.cfg
$ sudo update-grub
$ sudo reboot

$ aa-enabled
$ sudo aa-status

But AppArmor is NOT the cause of the problem.

I began to examine the Python programming code and Linux shell scripts.

For the setup.sh script, when you choose "Install/Repair Script", it will call the installer() function. Inside the installer() function, it will call the following functions, in sequence:

config(), install(), deploy()

When the install() function was called, it tried to execute the following Linux command:

$SUDO apt -y install chromium-browser # Update Chromium Browser or script won't work.

Executing the above Linux command resulted in an ERROR because Debian 10.5 Linux does not have the chromium-browser software package. Instead it has the chromium package.

When the above error is encountered, the installer script ABORTED PREMATURELY and could not continue running. The installer script could not run to completion. This is the bug.

To fix the bug, I have to COMMENT OUT/DISABLE the following line in setup.sh script:

$SUDO apt -y install chromium-browser # Update Chromium Browser or script won't work.

And add the following line below the above-mentioned line:

$SUDO apt -y install chromium

It fixed the bug. I ran setup.sh script again, choose "Install/Repair Script", and the installer ran to completion. Finally the scripts are installed in /usr/local/bin.

Please DO NOT add your no-ip account password to noip-renew.sh script manually in plain text because it has to be Base64 encoded/encrypted. If you add your no-ip account password directly to noip-renew.sh script, you will get an "Incorrect Padding" Python programming base64 error code.

You need to supply the no-ip account password when you run the installer script. When the installer script calls the deploy() function, it will also call the noip() function.

The noip() function is as follows:

function noip() {
    echo "Enter your No-IP Account details..."
    read -p 'Username: ' uservar
    read -sp 'Password: ' passvar

    passvar=`echo -n $passvar | base64`
    echo

    $SUDO sed -i 's/USERNAME=".*"/USERNAME="'$uservar'"/1' $INSTEXE
    $SUDO sed -i 's/PASSWORD=".*"/PASSWORD="'$passvar'"/1' $INSTEXE
}

Observe that it will use base64 encoding to encrypt your supplied no-ip account password in /usr/local/bin/noip-renew-$USER.

When you run the noip-renew.sh script, it will call the noip-renew.py python script.

Inside the noip-renew.py python script, the code is as follows:

    def login(self):
        self.logger.log(f"Opening {Robot.LOGIN_URL}...")
        self.browser.get(Robot.LOGIN_URL)
        if self.debug > 1:
            self.browser.save_screenshot("debug1.png")

        self.logger.log("Logging in...")
        ele_usr = self.browser.find_element_by_name("username")
        ele_pwd = self.browser.find_element_by_name("password")
        ele_usr.send_keys(self.username)
        ele_pwd.send_keys(base64.b64decode(self.password).decode('utf-8'))
        self.browser.find_element_by_name("Login").click()
        if self.debug > 1:
            time.sleep(1)
            self.browser.save_screenshot("debug2.png")

The python script will use base64 decoding to decode your encrypted no-ip account password when it tries to login to noip.com portal.

When you run the setup.sh installer script, it will also install/copy the noip-renew.sh script as /usr/local/bin/noip-renew-$USER or /usr/local/bin/noip-renew-teo-en-ming in my case. The /usr/local/bin/noip-renew-$USER script is the script you should normally run.

You should then install the following crontab (scheduled task) using crontab -e:

30 0 * * * /usr/local/bin/noip-renew-$USER /var/log/noip-renew/$USER

You can verify your crontab (scheduled task) is installed by running

$ crontab -l

The scheduled task will run at 12.30 AM at midnight every day.

You should also check the logs at /var/log/noip-renew/$USER

This essay also serves as a tutorial on how to use the no-ip ddns free hostname auto renewal/confirmation script since there is a lack of detailed documentation.





REFERENCES
==========

[1] https://lists.debian.org/debian-user/2020/08/msg00556.html

[2] http://lists.linuxfromscratch.org/pipermail/lfs-chat/2020-August/029146.html

[3] https://mail.python.org/pipermail/python-list/2020-August/898248.html

[4] https://marc.info/?l=python-list&m=159759242308109&w=2










Comments

Popular posts from this blog

[24 Mar 2022 Thursday] Erectile Dysfunction and Viagra

Patching Linux Kernel 5.5.7 to Add Support for AUFS Filesystem