31 октября 2014 в 17:19

Разное → UniFi Controller на Rasberry PI

Тестировалось на версиях UniFi v3.5.7 и v4.2.0.
Комплекс включает в себя Wi-Fi точки доступа UniFi и программный контроллер, который устанавливается на любой компьютер с операционной системой Windows, Mac OS или Linux. Программный контроллер является бесплатным, поэтому стоимость системы UniFi значительно ниже, чем аппаратные контроллеры других производителей. Это позволяет существенно снизить затраты на построение беспроводной сети.

Скачиваем образ RASPBIAN по ссылке downloads.raspberrypi.org/raspbian_latest
Записываем образ на SD карточку с помощью Win32DiskImager или imageUSB

Подключеаем Rasberry PI

Устанавливаем подключение SSH
Логин pi
Пароль raspberry

Далее обновляем репозитарий и систему
sudo apt-get update && sudo apt-get install raspberrypi* raspi-config
sudo raspi-config
reboot 


Добавляем пользователя
sudo adduser unifi


Устанавливаем MC коммандер
sudo apt-get install mc


Устанавливаем Oracle Java 7 JDK
sudo apt-get install oracle-java7-jdk


Устанавливаем Mongodb
sudo mkdir /opt/mongodb
cd /opt/mongodb
sudo wget https://github.com/brice-morin/ArduPi/blob/master/mongodb-rpi/mongo/bin/bsondump?raw=true -O bsondump
sudo wget https://github.com/brice-morin/ArduPi/blob/master/mongodb-rpi/mongo/bin/mongo?raw=true -O mongo
sudo wget https://github.com/brice-morin/ArduPi/blob/master/mongodb-rpi/mongo/bin/mongod?raw=true -O mongod
sudo wget https://github.com/brice-morin/ArduPi/blob/master/mongodb-rpi/mongo/bin/mongodump?raw=true -O mongodump
sudo chmod +x *


Скачиваем UniFi
cd /home/pi/ 
sudo wget http://www.ubnt.com/downloads/unifi/3.2.7/UniFi.unix.zip

или
sudo wget http://www.ubnt.com/downloads/unifi/4.2.0/UniFi.unix.zip


Устанавливаем контроллер UniFi
sudo unzip UniFi.unix.zip
sudo mv UniFi /opt/UniFi
cd /opt/UniFi/bin
sudo ln -fs /opt/mongodb/mongod mongod


Создаем файл /etc/init.d/unifi

для версии 4.2.0

#!/bin/sh
### BEGIN INIT INFO
# Provides: unifi
# Required-Start: $local_fs $remote_fs
# Required-Stop: $local_fs $remote_fs
# Should-Start: $network
# Should-Stop: $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Starts the UniFi admin interface
# Description: Starts the UniFi admin interface.
### END INIT INFO

DAEMON=/usr/bin/java
DAEMON_ARGS="-jar /opt/UniFi/lib/ace.jar start"

start() {
    echo "Starting unifi"
    start-stop-daemon -b -o -c unifi -S -u unifi -x $DAEMON -- $DAEMON_ARGS
}

stop() {
    dbpid=`pgrep -fu unifi $DAEMON`
    if [ ! -z "$dbpid" ]; then
        echo "Stopping unifi"
        start-stop-daemon -o -c unifi -K -u unifi -x $DAEMON -- $DAEMON_ARGS
    fi
}

status() {
    dbpid=`pgrep -fu unifi $DAEMON`
    if [ -z "$dbpid" ]; then
        echo "unifi: not running."
    else
        echo "unifi: running (pid $dbpid)"
    fi
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart|reload|force-reload)
        stop
        start
        ;;
    status)
        status
        ;;
    *)
        echo "Usage: /etc/init.d/unifi {start|stop|reload|force-reload|restart|status}"
        exit 1
esac

exit 0


для версии 3.5.7

#!/bin/bash
# chkconfig: 2345 95 20
# description: UniFi system
# processname: UniFi

ctrl_start()
{
sudo java -jar /opt/UniFi/lib/ace.jar start &
}

ctrl_stop()
{
sudo java -jar /opt/UniFi/lib/ace.jar stop &
}

ctrl_restart()
{
ctrl_stop
sleep 1
ctrl_start
}

case "$1" in

start)

echo -n "starting UniFi system"
ctrl_start
echo " service started"
;;

stop)

echo -n "stopping UniFi system"
ctrl_stop
echo " service stopped"
;;

restart)

echo -n "restarting UniFi system"
ctrl_restart
echo "service restarted"
;;

*)

echo "usage: service UniFi {start|stop|restart}"
;;

esac
exit 0


Копируем для автоматической загрузки
sudo cp unifi /etc/init.d
sudo chmod +x /etc/init.d/unifi


Устанавливаем права
cd /opt/UniFi
sudo mkdir work && sudo mkdir data && sudo mkdir logs 
sudo chown -R unifi work data logs


Создаем еще один файл /etc/logrotate.d/unifi

/opt/UniFi/logs/*.log {
        rotate 7
        daily
        missingok
        notifempty
        delaycompress
        compress
        copytruncate
}


Вписаваем его в систему
sudo cp unifi /etc/logrotate.d
sudo chmod +x /etc/logrotate.d/unifi


Добавляем в загрузку
sudo update-rc.d unifi defaults


Запускаем
sudo java -jar /opt/UniFi/lib/ace.jar start &
sudo java -jar /opt/UniFi/lib/ace.jar stop &


Основные комманды
sudo service unifi start
sudo service unifi stop


Смотрим как работает
top


Перезагружаем
reboot


Дополнительно

EIRP = (transmit power + antenna gain — cable loss) There isn't a cable loss in the UAP or UAP-LR as they're internal cards, same with all but the UAP-Outdoor, UAP-Outdoor5, or UAP-Outdoor+ because you can use different cables to connect to the antenna.

Examples:

UAP-LR — (27dBm + 3dBi) = 30dBm EIRP
UAP — (20dBm + 3dBi) = 23dBm EIRP

По умолчанию контроллер UniFi использует следующие порты:

unifi.shutdown.port=8081 (для управления)
unifi.http.port=8080 (порт для UAP для информирования контроллера)
unifi.https.port=8443 (порт для GUI / API контроллера, как в браузере)
portal.http.port=8880 (порт для HTTP перенаправления)
portal.https.port=8843 (порт для HTTPS перенаправления)
unifi.db.port=27117 (локальный порт для сервера БД)


Так как база бастро распухает есть решение

purgebd.js

   // keep N-day worth of data
   days=30;
   dryrun=true;

   use ace;
   collectionNames = db.getCollectionNames();
   for (i=0; i < collectionNames.length; i++) {
            name = collectionNames[i];
            query = null;
            if (name.indexOf('stat')==0 || name.indexOf('event')==0 || name.indexOf('alarm')==0) {
                query = {time: {$lt:new Date().getTime()-days*86400*1000}};
            }
            if (name.indexOf('session')==0) {
                query = {assoc_time: {$lt:new Date().getTime()/1000-days*86400}};
            }
            if (name.indexOf('user')==0) {
                query = {last_seen: {$lt:new Date().getTime()/1000-days*86400}};
            }
            if (query) {
                count = db.getCollection(name).find(query).count();
                print((dryrun ? "[dryrun] " : "") + "pruning " + count + " entries from " + name + "... ");
                if (!dryrun)
                 db.getCollection(name).remove(query);
            }
   }
   if (!dryrun) db.repairDatabase();



Убедитесь, что скрипт верный перед тем, как выполнить следующую команду:

sudo /opt/mongodb/mongo --port=27117 < purgebd.js

По умолчанию, MongoDB находится в режиме 'dryrun' и сообщит о том, что сделала.