chrisc reported that Debian Stretch does not have ifconfig, which is used in discourse-setup to check the IP address for Let’s Encrypt. chrisc provided an alternative solution using hostname -i.
codinghorror suggested skipping the check if ifconfig is missing, but chrisc argued that the check is useful and hostname -i is a simpler solution.
kraml noted that other distros, including CentOS 7, may not have ifconfig by default and suggested using ip addr or ip -o addr from the iproute package instead.
pfaffman investigated the issue and found that Digital Ocean’s Debian installation has ifconfig, but hostname -i returns 127.0.1.1, which is not helpful. pfaffman also noted that ip -a is the recommended replacement for ifconfig.
codinghorror suggested finding a more compatible command that works across multiple distros.
These lines in discourse-setup depend on ifconfig, but Debian Stretch doesn’t have ifconfig:
local IFACE=none
local IFCONFIG=`which ifconfig`
/sbin/route |grep default > /tmp/route$PPID
if grep default /tmp/route$PPID > /dev/null
then
local IFACE=`cut -c 73-100 /tmp/route$PPID |head -1`
else
echo WARNING: Cannot check your IP number.
fi
local IP=`$IFCONFIG $IFACE|grep "inet addr:" |cut -d":" -f 2|cut -d" " -f1|head -1`
The way I check for the IP address on Debian Stretch is to use hostname -i, for example:
#!/bin/bash
local IFCONFIG=$(which ifconfig)
local HOSTNAME=$(which hostname)
# Check is ifconfig is available
if [[ ${IFCONFIG} ]]; then
# https://stackoverflow.com/a/4046101
local IP=$($IFCONFIG | fgrep 'inet addr:' | fgrep -v '127.0.0.1' | cut -d: -f2 | awk '{print $1}' | head -n1)
# If we don't have ifconfig then try to use hostname
elif [[ ${HOSTNAME} ]]; then
local IP=$(hostname -i)
else
echo "Sorry, couldn't find ifconfig or hostname so couldn't use them to work out the local IP address"
fi
A couple of other things, dig is part of dnsutils which isn’t installed by default so needs to be installed before this check will work, furthermore if the local dns server resolves an address it isn’t always the case that a public one will – you could consider if it would be safer to use a public server, for example dig @8.8.8.8.
Not only Debian, but some other distro don’t install ifconfig by default in a minimal setup, including CentOS 7. It is still available in the net-tools package for CentOS 7 as part of the base repository, and I believe Debain should have it too, just not sure whether they use the same package name.
Newer distros moved to iproute package. The new ip command from this package now does ifconfig/route and many other tasks. To get IP address, just use ip addr (multiline output) or ip -o addr (single line output for each interface).
Well, the version that Digital Ocean installs has ifconfig. hostname -i on the Digital Ocean droplet I just checked returns 127.0.1.1, so that doesn’t seem helpful.
I don’t remember any in the past 20 years. Apparently, it’s been deprecated. It seems that ip -a is the New Way.
It worked on Centos, which now appears to work with the Docker that ./discourse-setup will install (alas, that script doesn’t actually start Docker, but I can probably fix it so that it will).
It could be that Digital Ocean adds ifconfig.
One or both of Debian and Centos are missing git.
I think I can do a bit of work and make ./discourse-setup work for Ubuntu, Debian, and Centos, including installing Docker and git.