diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..3aa8108
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+*.rpm
+*.log
+*spec-20*
+*.tgz
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..f9819bc
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,21 @@
+# Makefile for source rpm: smeserver-unifi
+# $Id: Makefile,v 1.1 2021/03/10 15:19:01 brianr Exp $
+NAME := smeserver-unifi
+SPECFILE = $(firstword $(wildcard *.spec))
+
+define find-makefile-common
+for d in common ../common ../../common ; do if [ -f $$d/Makefile.common ] ; then if [ -f $$d/CVS/Root -a -w $$/Makefile.common ] ; then cd $$d ; cvs -Q update ; fi ; echo "$$d/Makefile.common" ; break ; fi ; done
+endef
+
+MAKEFILE_COMMON := $(shell $(find-makefile-common))
+
+ifeq ($(MAKEFILE_COMMON),)
+# attept a checkout
+define checkout-makefile-common
+test -f CVS/Root && { cvs -Q -d $$(cat CVS/Root) checkout common && echo "common/Makefile.common" ; } || { echo "ERROR: I can't figure out how to checkout the 'common' module." ; exit -1 ; } >&2
+endef
+
+MAKEFILE_COMMON := $(shell $(checkout-makefile-common))
+endif
+
+include $(MAKEFILE_COMMON)
diff --git a/README.md b/README.md
index 2ac9660..3f5be51 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,16 @@
-# smeserver-unifi
+# smeserver-unifi
-SMEServer Koozali developed git repo for smeserver-unifi smecontribs
\ No newline at end of file
+SMEServer Koozali developed git repo for smeserver-unifi smecontribs
+
+## Wiki
+
https://wiki.koozali.org/Unifi
+
https://wiki.koozali.org/Unifi(howto)
+
+## Bugzilla
+Show list of outstanding bugs: [here](https://bugs.koozali.org/buglist.cgi?component=smeserver-unifi&product=SME%20Contribs&query_format=advanced&limit=0&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=CONFIRMED)
+
+## Description
+
+
*This description has been generated by an LLM AI system and cannot be relied on to be fully correct.*
+*Once it has been checked, then this comment will be deleted*
+
diff --git a/contriborbase b/contriborbase
new file mode 100644
index 0000000..9b7fd51
--- /dev/null
+++ b/contriborbase
@@ -0,0 +1 @@
+contribs10
diff --git a/createlinks b/createlinks
new file mode 100755
index 0000000..8a6521a
--- /dev/null
+++ b/createlinks
@@ -0,0 +1,44 @@
+#!/usr/bin/perl -w
+
+use esmith::Build::CreateLinks qw(:all);
+
+
+#service_link_enhanced("unifi", "S85", "7");
+
+
+foreach $event (qw(remoteaccess-update))
+{
+ safe_symlink('restart', "root/etc/e-smith/events/$event/services2adjust/unifi");
+}
+
+foreach $event (qw(smeserver-unifi-install))
+{
+ event_link("upgrade_unifi_controller.sh", $event, "20");
+}
+
+
+my $pkg= "smeserver-unifi";
+my $event = "${pkg}-update";
+
+event_actions($event, qw(
+ upgrade_unifi_controller.sh 20
+ systemd-default 88
+ systemd-reload 89
+));
+
+#event_templates($event, qw(
+#/etc/httpd/conf/httpd.conf
+#));
+
+event_services($event, qw(
+ unifi restart
+));
+
+use esmith::Build::Backup qw(:all);
+backup_includes($pkg, qw(
+/opt/Unifi
+/opt/UniFi_bak
+));
+
+
+exit 0;
diff --git a/root/etc/e-smith/db/configuration/defaults/unifi/TCPPorts b/root/etc/e-smith/db/configuration/defaults/unifi/TCPPorts
new file mode 100644
index 0000000..d221209
--- /dev/null
+++ b/root/etc/e-smith/db/configuration/defaults/unifi/TCPPorts
@@ -0,0 +1 @@
+8080,8443,8880,8843
diff --git a/root/etc/e-smith/db/configuration/defaults/unifi/UDPPorts b/root/etc/e-smith/db/configuration/defaults/unifi/UDPPorts
new file mode 100644
index 0000000..aed897d
--- /dev/null
+++ b/root/etc/e-smith/db/configuration/defaults/unifi/UDPPorts
@@ -0,0 +1 @@
+3478,10001
diff --git a/root/etc/e-smith/db/configuration/defaults/unifi/VersionToInstall b/root/etc/e-smith/db/configuration/defaults/unifi/VersionToInstall
new file mode 100644
index 0000000..ec35009
--- /dev/null
+++ b/root/etc/e-smith/db/configuration/defaults/unifi/VersionToInstall
@@ -0,0 +1 @@
+7.1.68
diff --git a/root/etc/e-smith/db/configuration/defaults/unifi/access b/root/etc/e-smith/db/configuration/defaults/unifi/access
new file mode 100644
index 0000000..3e18ebf
--- /dev/null
+++ b/root/etc/e-smith/db/configuration/defaults/unifi/access
@@ -0,0 +1 @@
+private
diff --git a/root/etc/e-smith/db/configuration/defaults/unifi/status b/root/etc/e-smith/db/configuration/defaults/unifi/status
new file mode 100644
index 0000000..86981e6
--- /dev/null
+++ b/root/etc/e-smith/db/configuration/defaults/unifi/status
@@ -0,0 +1 @@
+enabled
diff --git a/root/etc/e-smith/db/configuration/defaults/unifi/type b/root/etc/e-smith/db/configuration/defaults/unifi/type
new file mode 100644
index 0000000..24e1098
--- /dev/null
+++ b/root/etc/e-smith/db/configuration/defaults/unifi/type
@@ -0,0 +1 @@
+service
diff --git a/root/etc/e-smith/db/configuration/migrate/unifi b/root/etc/e-smith/db/configuration/migrate/unifi
new file mode 100644
index 0000000..0bb9d79
--- /dev/null
+++ b/root/etc/e-smith/db/configuration/migrate/unifi
@@ -0,0 +1,6 @@
+{
+
+ my $unifi = $DB->get('unifi') || $DB->new_record("unifi",{type=>'service'});
+ $unifi->delete_prop('TCPPort') if ( defined( $unifi->prop('TCPPort') ) and $unifi->prop('TCPPort') eq "8080,8443,8880,8843");
+
+}
diff --git a/root/etc/e-smith/events/actions/upgrade_unifi_controller.sh b/root/etc/e-smith/events/actions/upgrade_unifi_controller.sh
new file mode 100755
index 0000000..b9e175b
--- /dev/null
+++ b/root/etc/e-smith/events/actions/upgrade_unifi_controller.sh
@@ -0,0 +1,117 @@
+#!/bin/sh
+
+# upgrade_unifi_controller.sh
+# Easy UniFi Controller Upgrade Script for Unix/Linux Systems
+# by Steve Jenkins (stevejenkins.com)
+# Version 2.3
+# Last Updated January 8, 2017
+
+# REQUIREMENTS
+# 1) Assumes you already have any version of UniFi Controller installed
+# and running on your system.
+# 2) Assumes a user named "ubnt" owns the /opt/UniFi directory.
+# 3) Requires a service start/stop script to properly shut down and
+# restart the UniFi controller before and after upgrade. I've written
+# compatible startup scrips for SysV and systemd systems at
+# http://wp.me/p1iGgP-2wl
+# 4) Requires wget command to fetch the software from UBNT's download site.
+
+# USAGE
+# Modify the "UNIFI_DOWNLOAD_URL" variable below using the full URL of
+# the UniFi Controller zip file on UBNT's download site. Optionally modify
+# any of the additional variables below (defaults should work fine),
+# then run the script!
+
+# CONFIGURATION OPTIONS
+VERSION=$(/sbin/e-smith/db configuration getprop unifi VersionToInstall || echo "5.6.30")
+UNIFI_DOWNLOAD_URL=http://dl.ubnt.com/unifi/$VERSION/UniFi.unix.zip
+UNIFI_ARCHIVE_FILENAME=UniFi.unix.zip
+UNIFI_OWNER=ubnt
+UNIFI_SERVICE=unifi
+UNIFI_PARENT_DIR=/opt
+UNIFI_DIR=/opt/UniFi
+UNIFI_BACKUP_DIR=/opt/UniFi_bak
+TEMP_DIR=/tmp
+
+#### SHOULDN'T HAVE TO MODIFY PAST THIS POINT ####
+
+#today date
+TODAY=$(date +%Y-%m-%d-%H%M%S)
+
+# Create progress dots function
+show_dots() {
+ while ps $1 >/dev/null ; do
+ printf "."
+ sleep 1
+ done
+ printf "\n"
+}
+
+# Let's DO this!
+printf "Upgrading UniFi Controller...\n"
+
+# Retrieve the updated zip archive from UBNT (overwriting any previous version)
+printf "\nDownloading %s from UBNT..." "$UNIFI_DOWNLOAD_URL"
+cd $TEMP_DIR || exit
+wget -qq $UNIFI_DOWNLOAD_URL -O $UNIFI_ARCHIVE_FILENAME &
+show_dots $!
+
+# Check to make sure we have a downloaded file to work with
+
+if [ -f "$UNIFI_ARCHIVE_FILENAME" ]; then
+
+ # Archive file exists, extract and install it
+
+ # Stop the local UniFi Controller service
+ printf "\n"
+ /usr/bin/systemctl stop $UNIFI_SERVICE
+
+ # Remove previous backup directory (if it exists)
+# if [ -d "$UNIFI_BACKUP_DIR" ]; then
+# printf "\nRemoving previous backup directory...\n"
+# rm -rf $UNIFI_BACKUP_DIR
+# fi
+ # remove previous backup and leave the 3 last
+ ls -tp $UNIFI_BACKUP_DIR/ | grep -v '/$' | tail -n +3 | xargs -d '\n' -r rm --
+
+ # Move existing UniFi directory to backup location
+ printf "\nMoving existing UniFi Controller directory to backup location...\n"
+ mv $UNIFI_DIR "$UNIFI_BACKUP_DIR/UniFi_$TODAY"
+
+ # Extract new version
+ printf "\nExtracting downloaded software..."
+ unzip -qq $TEMP_DIR/$UNIFI_ARCHIVE_FILENAME -d $UNIFI_PARENT_DIR &
+ show_dots $!
+
+ # Jump into the backup directory
+ cd "$UNIFI_BACKUP_DIR/UniFi_$TODAY" || exit
+
+ # Create an archive of the existing data directory
+ printf "\nBacking up existing UniFi Controller data..."
+ tar zcf $TEMP_DIR/unifi_data_bak.tar.gz data/ &
+ show_dots $!
+
+ # Extract the data into the new directory
+ printf "\nExtracting UniFi Controller backup data to new directory..."
+ tar zxf $TEMP_DIR/unifi_data_bak.tar.gz -C $UNIFI_DIR &
+ show_dots $!
+
+ # Enforce proper ownership of UniFi directory
+ chown -R $UNIFI_OWNER:$UNIFI_OWNER $UNIFI_DIR
+
+ # Restart the local UniFi Controller service
+ printf "\n"
+ /usr/bin/systemctl start $UNIFI_SERVICE
+
+ # All done!
+ printf "\nUpgrade of UniFi Controller complete!\n"
+
+ exit 0
+
+else
+
+ # Archive file doesn't exist, warn and exit
+ printf "\nUniFi Controller software not found! Please check download link.\n"
+
+ exit 1
+fi
diff --git a/root/etc/e-smith/templates/usr/bin/hook-script.sh/30unifi b/root/etc/e-smith/templates/usr/bin/hook-script.sh/30unifi
new file mode 100644
index 0000000..a15bbe5
--- /dev/null
+++ b/root/etc/e-smith/templates/usr/bin/hook-script.sh/30unifi
@@ -0,0 +1,26 @@
+if [ $1 = "deploy_cert" ]; then
+ # and now deploy our LE cert to Unifi controller !
+{ # in case we rely on scl again
+ #. /opt/rh/rh-mongodb34/service-environment
+ #. scl_source enable \$RH_MONGODB34_SCLS_ENABLED
+}
+ # To automatically detect DOMAIN (thanks to @SprockTech):
+ DOMAIN=$(mongo --quiet --port 27117 --eval 'db.getSiblingDB("ace").setting.find(\{"key": "super_identity"\}).forEach(function(document)\{ print(document.hostname) \})')
+
+ # Backup previous keystore
+ cp /opt/UniFi/data/keystore /opt/UniFi/data/keystore.backup.$(date +%F_%R)
+
+ # Convert cert to PKCS12 format
+ # Ignore warnings
+ #openssl pkcs12 -export -inkey /etc/letsencrypt/live/${DOMAIN}/privkey.pem -in /etc/letsencrypt/live/${DOMAIN}/fullchain.pem -out /etc/letsencrypt/live/${DOMAIN}/fullchain.p12 -name unifi -password pass:unifi
+ openssl pkcs12 -export -inkey `/sbin/e-smith/config getprop modSSL key` -in `/sbin/e-smith/config getprop modSSL crt` -out /opt/UniFi/data/fullchain.p12 -name unifi -password pass:unifi 2>/dev/null
+
+ # Install certificate
+ # Ignore warnings
+ #keytool -importkeystore -deststorepass aircontrolenterprise -destkeypass aircontrolenterprise -destkeystore /var/lib/unifi/keystore -srckeystore /etc/letsencrypt/live/${DOMAIN}/fullchain.p12 -srcstoretype PKCS12 -srcstorepass unifi -alias unifi -noprompt
+ keytool -importkeystore -deststorepass aircontrolenterprise -destkeypass aircontrolenterprise -destkeystore /opt/UniFi/data/keystore -srckeystore /opt/UniFi/data/fullchain.p12 -srcstoretype PKCS12 -srcstorepass unifi -alias unifi -noprompt
+
+ #Restart UniFi controller
+ /usr/bin/systemctl restart unifi.service
+fi
+
diff --git a/root/opt/UniFi/.gitignore b/root/opt/UniFi/.gitignore
new file mode 100644
index 0000000..e69de29
diff --git a/root/opt/UniFi_bak/.gitignore b/root/opt/UniFi_bak/.gitignore
new file mode 100644
index 0000000..e69de29
diff --git a/root/sbin/e-smith/systemd/unifi b/root/sbin/e-smith/systemd/unifi
new file mode 100644
index 0000000..98b5b74
--- /dev/null
+++ b/root/sbin/e-smith/systemd/unifi
@@ -0,0 +1,28 @@
+#!/bin/bash
+
+# check if squid is using 8080, if yes, then move to 8081
+intercept=$(/usr/sbin/e-smith/config getprop squid InterceptPort||echo "8080")
+squidstatus=$(/usr/sbin/e-smith/config getprop squid status||echo "disabled")
+
+if [[ "$intercept" == "8080" && "$squidstatus" == "enabled" ]]; then
+ echo "we set squid Intercept port to 8081.. to avoid conflict with unifi "
+ /usr/sbin/e-smith/config setprop squid InterceptPort 8081
+ /usr/sbin/e-smith/expand-template /etc/squid/squid.conf
+ /usr/sbin/e-smith/expand-template /etc/rc.d/init.d/masq
+ /usr/bin/systemctl restart squid
+ /usr/bin/systemctl restart masq
+
+fi
+
+# now deal with dansguardian
+dport=$(/usr/sbin/e-smith/config getprop dansguardian port ||echo "8080")
+dstatus=$(/usr/sbin/e-smith/config getprop dansguardian status||echo "disabled")
+if [[ "$dport" == "8080" && "$dsatus" == "enabled" ]]; then
+ echo "we set dansguardian port to 8081.. to avoid conflict with unifi "
+ /usr/sbin/e-smith/config setprop dansguardian port 8081
+ /usr/sbin/e-smith/expand-template /etc/dansguardian/dansguardian.conf
+ /usr/bin/systemctl restart dansguardian
+fi
+
+# nothing to do with with squidguard
+
diff --git a/root/usr/lib/systemd/system/unifi.service b/root/usr/lib/systemd/system/unifi.service
new file mode 100644
index 0000000..f42ec02
--- /dev/null
+++ b/root/usr/lib/systemd/system/unifi.service
@@ -0,0 +1,22 @@
+# UniFi Controller systemd Service File
+# by Steve Jenkins
+# Last updated January 8, 2017
+# adapted for Koozali SME Server 10
+[Unit]
+Description=Ubiquiti UniFi Controller
+After=syslog.target network.target
+
+[Service]
+ExecStartPre=-/usr/sbin/e-smith/service-status unifi
+ExecStartPre=/usr//sbin/e-smith/systemd/unifi
+ExecStart=/usr/bin/java -Xmx1024M -jar /opt/UniFi/lib/ace.jar start
+ExecStop=/usr/bin/java -jar /opt/UniFi/lib/ace.jar stop
+Type=simple
+User=ubnt
+PermissionsStartOnly=true
+WorkingDirectory=/opt/UniFi
+SuccessExitStatus=143
+
+[Install]
+WantedBy=multi-user.target
+WantedBy=sme-server.target
diff --git a/smeserver-unifi.spec b/smeserver-unifi.spec
new file mode 100644
index 0000000..77476a7
--- /dev/null
+++ b/smeserver-unifi.spec
@@ -0,0 +1,86 @@
+# $Id: smeserver-unifi.spec,v 1.8 2022/12/26 07:27:12 jpp Exp $
+# Authority: unnilennium
+# Name: Jean-Philippe Pialasse
+%define installer 7.1.68
+Summary: smeserver-unifi
+%define name smeserver-unifi
+%define version 5.6.30
+%define release 6
+Name: %{name}
+Version: %{version}
+Release: %{installer}.%{release}%{?dist}
+License: GPL
+Group: Applications/System
+Source: %{name}-%{version}.tar.xz
+BuildRoot: /var/tmp/%{name}-%{version}-%{release}-buildroot
+BuildArch: noarch
+BuildRequires: e-smith-devtools >= 1.13.1-03
+Requires: smeserver-release >= 10.0
+Requires: mongodb-org >= 3.6
+#Requires: redhat-lsb
+#Requires: scl-utils
+#Requires: rh-mongodb34-runtime
+#Requires: rh-mongodb34-mongodb-server
+#Requires: rh-mongodb34-mongodb
+Requires: java-1.8.0-openjdk
+
+%description
+Integration package for Ubiquiti Unifi controller on Koozali SME Server.
+
+%prep
+%setup
+rm root/etc/rc.d -rf
+
+echo %{installer} > root/etc/e-smith/db/configuration/defaults/unifi/VersionToInstall
+%build
+/usr/bin/perl createlinks
+
+%install
+/bin/rm -rf $RPM_BUILD_ROOT
+(cd root ; /usr/bin/find . -depth -print | /bin/cpio -dump $RPM_BUILD_ROOT)
+/bin/rm -f %{name}-%{version}-filelist
+/sbin/e-smith/genfilelist $RPM_BUILD_ROOT \
+ --dir /opt/UniFi 'attr(660,ubnt,ubnt)' \
+ --dir /opt/UniFi_bak 'attr(660,ubnt,ubnt)' \
+ --file /sbin/e-smith/systemd/unifi 'attr(755,root,root)' \
+ > %{name}-%{version}-filelist
+
+%files -f %{name}-%{version}-filelist
+%defattr(-,root,root,-)
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%pre
+%{_sbindir}/useradd -m -d /opt/UniFi ubnt >& /dev/null || :
+
+
+%post
+
+%changelog
+* Sat Sep 07 2024 cvs2git.sh aka Brian Read 5.6.30-6.sme
+- Roll up patches and move to git repo [SME: 12338]
+
+* Sat Sep 07 2024 BogusDateBot
+- Eliminated rpmbuild "bogus date" warnings due to inconsistent weekday,
+ by assuming the date is correct and changing the weekday.
+
+* Mon Dec 26 2022 Jean-Philippe Pialasse 5.6.30-5.sme
+- fix execution bit again [SME: 12225]
+
+* Fri Nov 18 2022 Jean-Philippe Pialasse 5.6.30-4.sme
+- add execution bit [SME: 12225]
+
+* Sat Oct 22 2022 Jean-Philippe Pialasse 5.6.30-3.sme
+- fix [SME: 10534]
+
+* Wed Aug 03 2022 Jean-Philippe Pialasse 5.6.30-2.sme
+- systemd enabled [SME: 12139]
+- update event [SME: 12139]
+- update Ports [SME: 12139]
+- use LE cert if available [SME: 10534]
+- add to core backup [SME: 12027]
+
+* Fri Mar 09 2018 Jean-Philipe Pialasse 5.6.30-1.sme
+- initial release
+