First: What is sipcalc?

sipcalc is a handy tool that makes networking a bit less painful, e.g.:

$ sipcalc 192.168.0.0/24
-[ipv4 : 192.168.0.0/24] - 0

[CIDR]
Host address        - 192.168.0.0  
Host address (decimal)    - 3232235520  
Host address (hex)    - C0A80000  
Network address        - 192.168.0.0  
Network mask        - 255.255.255.0  
Network mask (bits)    - 24  
Network mask (hex)    - FFFFFF00  
Broadcast address    - 192.168.0.255  
Cisco wildcard        - 0.0.0.255  
Addresses in network    - 256  
Network range        - 192.168.0.0 - 192.168.0.255  
Usable range        - 192.168.0.1 - 192.168.0.254

-

As it turns out, there are package installers for various distros of Linux here, and you can even run brew install sipcalc on a Mac.

But what about CentOS 7? Well it turns out that sipcalc is not in the EPEL repository for CentOS 7. (Take a look at EPEL for v6 and EPEL for v7.) Since I want to add this to our jumpbox setup script, I decided that I wanted a static binary that could be run on any Linux system.

Building the binary with the rpmbuild/centos7 Docker image

Environment: latest version of Docker Toolbox on Mac OS X.

Using the rpmbuild/centos7 Docker image for this project and grabbing the sipcalc tarball:

==[]=[ 20:21:33 ]=[  quinn@MacBook-Pro  ]=[ ~     ]=[]==
$ docker pull rpmbuild/centos7
Using default tag: latest  
latest: Pulling from rpmbuild/centos7

3d8673bd162a: Already exists  
a3ed95caeb02: Already exists  
fe6f78a62503: Already exists  
365f5e11f348: Already exists  
Digest: sha256:10a62db594c19a0fc6026cab1492d48ba611a52f5b68c07e33a0da9c6c54e039  
Status: Image is up to date for rpmbuild/centos7:latest

==[]=[ 20:21:42 ]=[  quinn@MacBook-Pro  ]=[ ~     ]=[]==
$ docker run -it rpmbuild/centos7 /bin/bash
[builder@61c8cc6d83b9 /]$ sudo wget http://www.routemeister.net/projects/sipcalc/files/sipcalc-1.1.6.tar.gz
[builder@61c8cc6d83b9 /]$ tar -xvzf sipcalc-1.1.6.tar.gz && cd sipcalc-1.1.6

The INSTALL file states that we can build and install sipcalc with ./configure && make && make install. So first I'll try to build the binary by running ./configure && make:

[builder@a025336b0eb1 sipcalc-1.1.6]$ ./configure && make
[lengthy output not included]

And now to test the binary:

[builder@a025336b0eb1 sipcalc-1.1.6]$ find . -name sipcalc
./src/sipcalc

[builder@a025336b0eb1 sipcalc-1.1.6]$ ./src/sipcalc 10.20.30.40/17
-[ipv4 : 10.20.30.40/17] - 0

[CIDR]
Host address        - 10.20.30.40  
Host address (decimal)    - 169090600  
Host address (hex)    - A141E28  
Network address        - 10.20.0.0  
Network mask        - 255.255.128.0  
Network mask (bits)    - 17  
Network mask (hex)    - FFFF8000  
Broadcast address    - 10.20.127.255  
Cisco wildcard        - 0.0.127.255  
Addresses in network    - 32768  
Network range        - 10.20.0.0 - 10.20.127.255  
Usable range        - 10.20.0.1 - 10.20.127.254

-

Right on we have a working binary! But is it a static binary?

[builder@a025336b0eb1 sipcalc-1.1.6]$ ldd src/sipcalc
    linux-vdso.so.1 =>  (0x00007ffc46768000)
    libnsl.so.1 => /lib64/libnsl.so.1 (0x00007fc6c8f5c000)
    libc.so.6 => /lib64/libc.so.6 (0x00007fc6c8b9a000)
    /lib64/ld-linux-x86-64.so.2 (0x000055777a652000)

Nope. The secret sauce:

[builder@a025336b0eb1 sipcalc-1.1.6]$ sudo yum install glibc-static
[builder@a025336b0eb1 sipcalc-1.1.6]$ CFLAGS=-static ./configure
[builder@a025336b0eb1 sipcalc-1.1.6]$ make clean && make
[builder@a025336b0eb1 sipcalc-1.1.6]$ ldd src/sipcalc
    not a dynamic executable

Static binary win!

Now to make it even easier with a BASH script! Create an executable script named pkg:

#!/bin/bash
set -e

cd /tmp  
curl -LO http://www.routemeister.net/projects/sipcalc/files/sipcalc-1.1.6.tar.gz  
tar -xzvf sipcalc-1.1.6.tar.gz  
cd sipcalc-1.1.6

sudo yum install -y glibc-static  
CFLAGS=-static ./configure  
make  
sudo cp src/sipcalc /srv/sipcalc  

Then start up the Docker container to execute the script and exit:

==[]=[ 21:56:57 ]=[  quinn@MacBook-Pro  ]=[ ~     ]=[]==
$ docker run -it -v $PWD:/srv rpmbuild/centos7
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  114k  100  114k    0     0  93450      0  0:00:01  0:00:01 --:--:-- 93503  
sipcalc-1.1.6/  
sipcalc-1.1.6/TODO  
sipcalc-1.1.6/src/  
sipcalc-1.1.6/src/sub.c  
...
make[2]: Leaving directory `/tmp/sipcalc-1.1.6/src'  
make[2]: Entering directory `/tmp/sipcalc-1.1.6'  
make[2]: Leaving directory `/tmp/sipcalc-1.1.6'  
make[1]: Leaving directory `/tmp/sipcalc-1.1.6'

==[]=[ 21:57:13 ]=[  quinn@MacBook-Pro  ]=[ ~     ]=[]==
$ ls -al | grep sipcalc
-rwxr-xr-x    1 quinn  staff     1058380 Mmm DD 21:57 sipcalc

==[]=[ 21:57:15 ]=[  quinn@MacBook-Pro  ]=[ ~     ]=[]==
$ file sipcalc
sipcalc: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.32, from 'bp', not stripped  

Now to test on an Ubuntu Docker container:

==[]=[ 22:00:31 ]=[  quinn@MacBook-Pro  ]=[ ~     ]=[]==
$ docker run -it -v $PWD:/srv debuild/precise /srv/sipcalc 10.20.30.40/17
Unable to find image 'debuild/precise:latest' locally  
latest: Pulling from debuild/precise  
765826873799: Pull complete  
e7a187926114: Pull complete  
fd01d4f3de3b: Pull complete  
c704fce22a3c: Pull complete  
a3ed95caeb02: Pull complete  
6acafd366a73: Pull complete  
8026c6cf1ae4: Pull complete  
Digest: sha256:2c14957baab89d6595cd9437f9c9d40c76c23f26ab6ab3c77e04542ca5178cff  
Status: Downloaded newer image for debuild/precise:latest  
-[ipv4 : 10.20.30.40/17] - 0

[CIDR]
Host address        - 10.20.30.40  
Host address (decimal)    - 169090600  
Host address (hex)    - A141E28  
Network address        - 10.20.0.0  
Network mask        - 255.255.128.0  
Network mask (bits)    - 17  
Network mask (hex)    - FFFF8000  
Broadcast address    - 10.20.127.255  
Cisco wildcard        - 0.0.127.255  
Addresses in network    - 32768  
Network range        - 10.20.0.0 - 10.20.127.255  
Usable range        - 10.20.0.1 - 10.20.127.254

-

BAM. Linux x86_64 compatible sipcalc static binary.