UniFi on FreeBSD

Tired of consumer level wifi? Don’t want to afford Ruckus or Aerohive ?

UniFi isn’t a bad compromise. Features like multiple SSID, VLANs.

UniFi doesn’t offer a package or installer for FreeBSD. They do have a zip file. There are certain dependencies that should be installed before firing it up.

FreeBSD install

Standard install . Nothing fancy.

Packages to install

Things you need to have installed

 1archivers/snappy
 2archivers/snappy-java
 3audio/alsa-lib
 4databases/mongodb
 5devel/libpthread-stubs
 6devel/pcre
 7graphics/giflib
 8java/java-zoneinfo
 9java/javavmwrapper
10java/openjdk8
11java/openjdk8-jre
12lang/python2
13lang/python27
14lang/v8
15print/freetype2
16x11-fonts/dejavu
17x11-fonts/fontconfig
18x11-fonts/libfontenc
19x11-fonts/mkfontdir
20x11-fonts/mkfontscale
21x11-toolkits/libXt
22x11/dmxproto
23x11/fixesproto
24x11/inputproto
25x11/kbproto
26x11/libICE
27x11/libSM
28x11/libX11
29x11/libXau
30x11/libXdmcp
31x11/libXext
32x11/libXfixes
33x11/libXi
34x11/libXinerama
35x11/libXrender
36x11/libXtst
37x11/libxcb
38x11/recordproto
39x11/renderproto
40x11/xextproto
41x11/xproto

pkg install ${pkg}

Don’t forget to read the readme.txt in case things have changed.

UniFi install script

 1#!/bin/sh
 2
 3# pkg found at https://www.ubnt.com/downloads/unifi/5.2.9/UniFi.unix.zip
 4set -e
 5
 6PATH="/bin:/usr/bin:/usr/local/bin"
 7
 8while getopts "v:t" COMMAND_LINE_ARGUMENT ; do
 9        case "${COMMAND_LINE_ARGUMENT}" in
10                v) version=${OPTARG}
11                        ;;
12                t) test_mode="YES"
13                        ;;
14                \?) echo "-v <version> is required, -t is optional"
15                        exit 1
16                        ;;
17        esac
18done
19
20cmd_pfx=""
21if [ "${test_mode}" = "YES" ]; then
22        echo "Test Mode"
23        cmd_pfx="echo Would issue"
24fi
25rm=`which rm`
26mv=`which mv`
27ln=`which ln`
28tar=`which tar`
29fetch=`which fetch`
30unzip=`which unzip`
31mongod=`which mongod`
32
33base_dir=`/usr/local`
34
35echo "creating data tarball"
36cd ${base_dir}/UniFi
37${cmd_pfx} ${tar} -cf ../data.tgz data
38cd ${base_dir}
39echo "deleting snappy"
40${cmd_pfx} ${rm} -f UniFi/lib/snappy-java-1.0.5.jar
41echo "deleting unifi"
42${cmd_pfx} ${rm} -rf UniFi
43echo "fetching new unifi"
44${cmd_pfx} ${fetch} https://www.ubnt.com/downloads/unifi/${version}/UniFi.unix.zip
45echo "renaming unifi to include version"
46${cmd_pfx} ${mv} UniFi.unix.zip UniFi-${version}.unix.zip
47echo "unzipping"
48${cmd_pfx} ${unzip} UniFi-${version}.unix.zip
49echo "deleting any pre-existing directory of the same name"
50${cmd_pfx} ${rm} -rf UniFi-${version}
51echo "moving unifi to unifi-${version}"
52${cmd_pfx} ${mv} UniFi UniFi-${version}
53echo "linking to unifi"
54${cmd_pfx} ${ln} -s UniFi-${version} UniFi
55echo "linking mongod"
56cd ${base_dir}/UniFi/bin
57${cmd_pfx} ${ln} -sf ${mongod} mongod
58echo "linking snappy"
59cd ${base_dir}/UniFi/lib
60snappy=`ls snappy-java*.jar`
61echo ${snappy}
62${cmd_pfx} ${ln} -sf /usr/local/share/java/classes/snappy-java.jar ${snappy}
63echo "extracting data tarball"
64cd ${base_dir}/UniFi
65tar -xf ../data.tgz
66echo "done"
67# EoF

UniFi rc script

Enable unifi in rc.conf

1sysrc unifi_enable=YES

Copy this to /usr/local/etc/rc.d/ and make it executable

 1#!/bin/sh
 2
 3# REQUIRE: FILESYSTEMS
 4# REQUIRE: NETWORKING
 5# PROVIDE: unifi
 6
 7. /etc/rc.subr
 8
 9name="unifi"
10rcvar="unifi_enable"
11start_cmd="unifi_start"
12stop_cmd="unifi_stop"
13
14pidfile="/var/run/${name}.pid"
15
16load_rc_config ${name}
17
18unifi_start() {
19  if checkyesno ${rcvar}; then
20    echo "Starting UniFi controller. "
21
22    # Open up netcat to listen on port 8080, and then close the connection immediately, then quit.
23    # This works around the long startup delay. Thanks to gcohen55.
24    echo "" | nc -l 127.0.0.1 8080 >/dev/null &
25
26    # The process will run until it is terminated and does not fork on its own.
27    # So we start it in the background and stash the pid:
28    /usr/local/bin/java -jar /usr/local/UniFi/lib/ace.jar start &
29    echo $! > $pidfile
30
31  fi
32}
33
34unifi_stop() {
35
36  if [ -f $pidfile ]; then
37    echo -n "Signaling the UniFi controller to stop..."
38
39    # This process does take a while, but the stop command finishes before
40    # the service is actually stopped. So we start it in the background:
41    /usr/local/bin/java -jar /usr/local/UniFi/lib/ace.jar stop &
42
43    # Get the pid of the stopper:
44    stopper=$!
45
46    # Wait until the stopper finishes:
47    while [ `pgrep $stopper` ]; do
48      echo -n "."
49      sleep 5
50    done
51
52    echo " acknowledged."
53    echo -n "Waiting for the UniFi controller to stop (this can take a long time)..."
54
55    # ...then we wait until the service identified by the pid file goes away:
56    while [ `pgrep -F $pidfile` ]; do
57      echo -n "."
58      sleep 5
59    done
60
61    # Remove the pid file:
62    rm $pidfile
63
64    echo " stopped.";
65  else
66    echo "There is no pid file. The controller may not be running."
67  fi
68}
69
70run_rc_command "$1"

Results

Copyright

Comments