diff --git a/rconfig b/rconfig
new file mode 100755
index 0000000..3b8a446
--- /dev/null
+++ b/rconfig
@@ -0,0 +1,406 @@
+#!/bin/bash
+#
+# Copyright (c) 2021 by Thomas A. Early N7TAE
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+
+SetBooleanValue ()
+{
+ local dvname
+ local cv
+ if [ -z $2 ]; then
+ if [ -z ${!1+x} ]; then
+ if [[ "$1" == module_[abc]_* ]]; then
+ echo matches
+ dvname=${1//_[abc]_/_x_}
+ else
+ echo does not match
+ dvname=${1}_d
+ fi
+ cv=${!dvname}
+ else
+ cv=${!1}
+ fi
+ if [[ $cv == [tT]* ]]; then
+ eval ${1}=false
+ else
+ eval ${1}=true
+ fi
+ elif [[ "$2" == [tT]* ]]; then
+ eval ${1}=true
+ else
+ eval ${1}=false
+ fi
+}
+
+EvaluateVar ()
+{
+ if [ -z ${!1+x} ]; then
+ if [ -z "${!2}" ]; then
+ echo "'' "
+ else
+ echo "${!2} "
+ fi
+ else
+ if [ -z "${!1}" ]; then
+ echo "''"
+ else
+ echo "${!1}"
+ fi
+ fi
+}
+
+WriteMemFile ()
+{
+ local file
+ file="$rcfg"
+ echo "# created on `date`" > $file
+ [ -z ${callsign+x} ] || echo "callsign='$callsign'" >> $file
+ [ -z ${modules+x} ] || echo "modules='$modules'" >> $file
+ [ -z ${ip4addr+x} ] || echo "ip4addr='$ip4addr'" >> $file
+ [ -z ${ip6addr+x} ] || echo "ip6addr='$ip6addr'" >> $file
+ [ -z ${tcaddress+x} ] || echo "tcaddress='$tcaddress'" >> $file
+ [ -z ${tcmodules+x} ] || echo "tcmodules='$tcmodules'" >> $file
+ [ -z ${ysfautolink+x} ] || echo "ysfautolink=$ysfautolink" >> $file
+ [ -z ${ysfmodule+x} ] || echo "ysfmodule='$ysfmodule'" >> $file
+ [ -z ${ysflocaldb+x} ] || echo "ysflocaldb=$ysflocaldb" >> $file
+ [ -z ${ysfdbname+x} ] || echo "ysfdbname='$ysfdbname'" >> $file
+ [ -z ${ysfdbuser+x} ] || echo "ysfdbuser='$ysfdbuser'" >> $file
+ [ -z ${ysfdbpw+x} ] || echo "ysfdbpw='$ysfdbpw'" >> $file
+ [ -z ${g3support+x} ] || echo "g3support=$g3support" >> $file
+ [ -z ${dbsupport+x} ] || echo "dbsupport=$dbsupport" >> $file
+}
+
+WriteSRCHFile ()
+{
+ local file m
+ file="$srch"
+ echo "// Created on `date`" > $file
+ echo "#define CALLSIGN \"${callsign}\"" >> $file
+ if [[ "$callsign" == XRF* ]]; then
+ echo "#define NO_XLX" >> $file
+ fi
+ if [ -z ${modules+x} ]; then
+ echo "#define ACTIVE_MODULES \"${modules_d}\"" >> $file
+ else
+ echo "#define ACTIVE_MODULES \"${modules}\"" >> $file
+ fi
+ if [ ! -z ${ip4addr+x} ]; then
+ echo "#define LISTEN_IPV4 \"${ip4addr}\"" >> $file
+ fi
+ if [ ! -z ${ip6addr+x} ]; then
+ echo "#define LISTEN_IPV6 \"${ip6addr}\"" >> $file
+ fi
+ if [ -z ${ysfautolink+x} ]; then
+ echo "#define YSF_AUTOLINK_ENABLE ${ysfautolink_d}" >> $file
+ else
+ echo "#define YSF_AUTOLINK_ENABLE ${ysfautolink}" >> $file
+ fi
+ if [ -z ${ysfmodule+x} ]; then
+ echo "#define YSF_AUTOLINK_MODULE '${ysfmodule_d}'" >> $file
+ else
+ echo "#define YSF_AUTOLINK_MODULE '${ysfmodule}'" >> $file
+ fi
+ if [[ "$ysflocaldb" == true ]]; then
+ echo '#define YSF_DB_SUPPORT true' >> $file
+ echo "#define YSF_DB_NAME \"$ysfdbname\"" >> $file
+ echo "#define YSF_DB_USER \"$ysfdbuser\"" >> $file
+ echo "#define YSF_DB_PASSWORD \"$ysfdbpw\"" >> $file
+ else
+ echo '#define YSF_DB_SUPPORT false' >> $file
+ fi
+ if [ ! -z ${tcaddress+x} ]; then
+ echo "#define TRANSCODER_IP \"${tcaddress}\"" >> $file
+ if [ -z ${tcmodules+x} ]; then
+ echo "#define TRANSCODED_MODULES \"${tcmodules_d}\"" >> $file
+ else
+ echo "#define TRANSCODED_MODULES \"${tcmodules}\"" >> $file
+ fi
+ fi
+ if [ -z ${g3support+x} ]; then
+ m=${g3support_d}
+ else
+ m=${g3support}
+ fi
+ if [[ "$m" != true ]]; then
+ echo "#define NO_G3" >> $file
+ fi
+}
+
+WriteSRCMKFile ()
+{
+ local file
+ file="$srcm"
+ echo "# Created on `date`" > $file
+ if [[ "$callsign" == XLX* ]]; then
+ echo "is_xlx = true" >> $file
+ else
+ echo "is_xlx = false" >> $file
+ fi
+ [ -z ${ip4addr+x} ] || echo "ipv4 = $ip4addr" >> $file
+ [ -z ${ip6addr+x} ] || echo "ipv6 = $ip6addr" >> $file
+ [ -z ${tcaddress+x} ] || echo "tc_ip = $tcaddress" >> $file
+ if [ -z ${g3support+x} ]; then
+ echo "use_g3 = $g3support_d" >> $file
+ else
+ echo "use_g3 = $g3support" >> $file
+ fi
+ if [ -z ${dbsupport+x} ]; then
+ echo "debug = $dbsupport_d" >> $file
+ else
+ echo "debug = $dbsupport" >> $file
+ fi
+ if [ -z ${ysflocaldb+x} ]; then
+ echo "ysf_db = $ysflocaldb_d" >> $file
+ else
+ echo "ysf_db = $ysflocaldb" >> $file
+ fi
+}
+
+WriteTranscoderHFile ()
+{
+ local file
+ file="$tcdh"
+ echo "// Created on `date`" > $file
+ echo "#define TRANSCODER_IP \"${tcaddress}\"" >> $file
+}
+
+WriteTranscoderMKFile ()
+{
+ local file
+ file="$tcdm"
+ echo "# created on `date`" > $file
+ if [ -z ${dbsupport+x} ]; then
+ echo "debug = $dbsupport_d" >> $file
+ else
+ echo "debug = $dbsupport" >> $file
+ fi
+}
+
+WriteCfgPhpFile ()
+{
+ cat << EOF > $ysfs
+
+EOF
+}
+
+WriteDBCreateFile ()
+{
+ cat << EOF > $dbcr
+CREATE DATABASE IF NOT EXISTS ${ysfdbname};
+USE ${ysfdbname};
+CREATE TABLE IF NOT EXISTS ysfnodes (
+ callsign VARCHAR(7) PRIMARY KEY,
+ password VARCHAR(255) NOT NULL,
+ txfreq INT NOT NULL DEFAULT 445500000,
+ rxfreq INT NOT NULL DEFAULT 445500000,
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP
+);
+CREATE USER IF NOT EXISTS '${ysfdbuser}'@'localhost' IDENTIFIED BY '${ysfdbpw}';
+GRANT ALL PRIVILEGES ON $ysfdbname . ysfnodes TO '${ysfdbuser}'@'localhost';
+FLUSH PRIVILEGES;
+EOF
+}
+
+WriteCFGFiles ()
+{
+ WriteMemFile
+ WriteSRCHFile
+ WriteSRCMKFile
+ if [ -z ${tcaddress+x} ]; then
+ rm -f $tcdh $tcdm
+ else
+ WriteTranscoderHFile
+ WriteTranscoderMKFile
+ fi
+ if [[ "$ysflocaldb" == true ]]; then
+ WriteCfgPhpFile
+ WriteDBCreateFile
+ else
+ rm -f $ysfs $dbcr
+ fi
+}
+
+ListCFGFiles ()
+{
+ echo "===========${rcfg}============="
+ cat $rcfg
+ echo "===========${srch}============="
+ cat $srch
+ echo "===========${srcm}============="
+ cat $srcm
+ if [ ! -z ${tcaddress+x} ]; then
+ echo "===========${tcdh}============="
+ cat $tcdh
+ echo "===========${tcdm}============="
+ cat $tcdm
+ fi
+ if [[ "$ysflocaldb" == true ]]; then
+ echo "===========${ysfs}============="
+ cat $ysfs
+ echo "===========${dbcr}============="
+ cat $dbcr
+ fi
+}
+
+# Execution starts here!
+# file locations
+rcfg='reflector.cfg'
+srch='reflector/configure.h'
+srcm='reflector/configure.mk'
+tcdh='../tcd/configure.h'
+tcdm='../tcd/configure.mk'
+ysfs='wiresx/configure.php'
+dbcr='configure.sql'
+xlxserv='/etc/systemd/system/xlxd.service'
+xrfserv='/etc/systemd/system/xrfd.service'
+# default values
+callsign_d='CHNGME'
+modules_d='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+ip4addr_d='none'
+ip6addr_d='none'
+tcaddress_d='none'
+tcmodules_d='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+ysfautolink_d=false
+ysfmodule_d='D'
+g3support_d=false
+dbsupport_d=false
+ysflocaldb_d=false
+ysfdbname_d=''
+ysfdbuser_d=''
+ysfdbpw_d=''
+
+# expert mode
+if [[ "$1" == ex* ]]; then
+ expertmode="expertMode"
+fi
+
+if [ -e reflector.cfg ]; then
+ source reflector.cfg
+else
+ echo 'No configuration file found...'
+ sleep 1
+fi
+
+if [ -z ${expertmode+x} ]; then
+ if [ -e $xlxserv ] || [ -e $xrfserv ]; then
+ echo -n "You cannot change the configuration right now beacuse there is an "
+ if [ -e $xlxserv ]; then
+ echo "XLX server running."
+ else
+ echo "XRF server running."
+ fi;
+ echo "===========${rcfg}============="
+ cat $rcfg
+ echo
+ echo "Please use radmin to uninstall the running server before attempting to modify the configuration."
+ exit 1
+ fi
+fi
+
+key='x'
+# main loop
+while [[ "$key" != q* ]]
+do
+ clear
+ echo
+ echo " Reflector Configuration, Version #211204"
+ echo
+ echo " ******* REFLECTOR ********"
+ echo -n "cs : Reflector Callsign = "; EvaluateVar callsign{,_d}
+ echo -n "am : Active Modules = "; EvaluateVar modules{,_d}
+ echo -n "g3 : Icom G3 Support = "; EvaluateVar g3support{,_d}
+ echo " ******* ADDRESSES ********"
+ echo -n "i4 : IPv4 Listen Address = "; EvaluateVar ip4addr{,_d}
+ echo -n "i6 : IPv6 Listen Address = "; EvaluateVar ip6addr{,_d}
+ echo " ******* TRANSCODER ********"
+ echo -n "tc : Transcoder Address = "; EvaluateVar tcaddress{,_d}
+ if [ ! -z ${tcaddress+x} ]; then
+ echo -n "tm : Transcoder Modules = "; EvaluateVar tcmodules{,_d}
+ fi
+ echo " ******* SYSTEM FUSION ********"
+ echo -n "ye : YSF Autolink Enable = "; EvaluateVar ysfautolink{,_d}
+ if [ ! -z ${ysfautolink+x} ]; then
+ if [[ "$ysfautolink" == true ]]; then
+ echo -n "ym : YSF Autolink Module = "; EvaluateVar ysfmodule{,_d}
+ fi
+ fi
+ echo -n "yl : YSF Local Database = "; EvaluateVar ysflocaldb{,_d}
+ if [[ "$ysflocaldb" == true ]]; then
+ echo -n "yd : YSF Database Name = "; EvaluateVar ysfdbname{,_d}
+ echo -n "yu : YSF Database User = "; EvaluateVar ysfdbuser{,_d}
+ echo -n "yp : YSF Database Password = "; EvaluateVar ysfdbpw{,_d}
+ fi
+ echo " ******* DEBUGGING ********"
+ echo -n "db : Debugging Support = "; EvaluateVar dbsupport{,_d}
+ echo
+ if [[ "$callsign" == URF* ]]; then
+ echo "w : Write configuration files (overwrites any existing files) and quit"
+ fi
+ echo "q : Quit without saving"
+ echo "u : Unset the value of (revert to the default value)."
+ echo
+ read -p "Please input - omit value to toggle a true/false : " key value garbage
+
+ if [[ "$key" == cs* && ${value^^} == URF* ]]; then
+ callsign="${value^^}"
+ callsign="${callsign:0:6}"
+ unset tcaddress tcmodules ysf{autolink,module,localdb,dbname,dbuser,dbpw}
+ elif [[ "$key" == am* ]]; then modules="${value^^}"
+ elif [[ "$key" == i4* ]]; then ip4addr="$value"
+ elif [[ "$key" == i6* ]]; then ip6addr="$value"
+ elif [[ "$key" == tc* ]]; then tcaddress="$value"
+ elif [[ "$key" == tm* ]]; then tcmodules="${value^^}"
+ elif [[ "$key" == ye* ]]; then SetBooleanValue ysfautolink "$value"
+ elif [[ "$key" == ym* ]]; then
+ ysfmodule="${value^^}"
+ ysfmodule="${ysfmodule:0:1}"
+ elif [[ "$key" == g3* ]]; then SetBooleanValue g3support "$value"
+ elif [[ "$key" == db* ]]; then SetBooleanValue dbsupport "$value"
+ elif [[ "$key" == yl* ]]; then SetBooleanValue ysflocaldb "$value"
+ elif [[ "$key" == yd* ]]; then ysfdbname="$value"
+ elif [[ "$key" == yu* ]]; then ysfdbuser="$value"
+ elif [[ "$key" == yp* ]]; then ysfdbpw="$value"
+ elif [[ "$key" == w* ]]; then
+ WriteCFGFiles
+ ListCFGFiles
+ exit 0
+ elif [[ "$key" == u* ]]; then
+ if [[ "$value" == cs* ]]; then unset callsign
+ elif [[ "$value" == am* ]]; then unset modules
+ elif [[ "$value" == i4* ]]; then unset ip4addr
+ elif [[ "$value" == i6* ]]; then unset ip6addr
+ elif [[ "$value" == tc* ]]; then unset tcaddress
+ elif [[ "$value" == tm* ]]; then unset tcmodules
+ elif [[ "$value" == ye* ]]; then unset ysfautolink ysfmodule
+ elif [[ "$value" == ym* ]]; then unset ysfmodule
+ elif [[ "$value" == g3* ]]; then unset g3support
+ elif [[ "$value" == db* ]]; then unset dbsupport
+ elif [[ "$value" == yl* ]]; then unset ysflocaldb ysfdbname ysfdbuser ysfdbpw
+ elif [[ "$value" == yd* ]]; then unset ysfdbname
+ elif [[ "$value" == yu* ]]; then unset ysfdbuser
+ elif [[ "$value" == yp* ]]; then unset ysfdbpw
+ fi
+ fi
+done
+exit 0