#!/bin/bash

echo "Please enter the following:"
read -p 'First and Last name: ' name
read -p 'Callsign: ' callsign
read -p "APRS ssid: $callsign-" ssid
echo
echo "If you need your APRS Passcode you can get it here: https://willamettevalleymesh.net/aprs-passcode/"
read -p 'Please enter callsign APRS Passcode: ' aprspasscode
read -p 'Your Email Address: ' email

apt update -y
apt upgrade -y

apt install -y sudo build-essential htop nginx libevent* debhelper libssl-dev libcap-dev libz-dev libwww-perl
apt --fix-broken install

adduser --system --no-create-home --home /var/run/aprsc --shell /usr/sbin/nologin --group aprsc

cd wget http://he.fi/aprsc/down/aprsc-latest.tar.gz
tar xvfz aprsc-latest.tar.gz
rm -rf aprsc-latest.tar.gz
cd aprsc-*
cd src
./configure
make make-deb
sudo dpkg -i ../aprsc-*.deb


sudo systemctl enable aprsc


tee /etc/default/aprsc <<EOF

#
# STARTAPRSC: start aprsc on boot. Should be set to "yes" once you have
#            configured aprsc.
#
STARTAPRSC="yes"

#
# Additional options that are passed to the Daemon.
# Description of used options (don't change these unless
# you're sure what you're doing):
# -u aprsc: switch to user 'aprsc' as soon as possible
# -t /opt/aprsc: chroot to the given directory
# -f: fork to a daemon
# -e info: log at level info
# -o file: log to file
# -r logs: log files are placed in /opt/aprsc/logs
# -c etc/aprsc.conf: configuration file location
#
# Since the daemon chroots to /opt/aprsc, all paths are relative to
# that directory and the daemon cannot access any files outside
# the chroot.
#
# aprsc can log to syslog too, but that'd require bringing the
# syslog socket within the chroot.
#

DAEMON_OPTS="-u aprsc -t /opt/aprsc -f -e info -o file -r logs -c etc/aprsc.conf"

EOF

echo "ServerId   $callsign-$ssid" > /opt/aprsc/etc/aprsc.conf
echo "PassCode   $aprspasscode" >> /opt/aprsc/etc/aprsc.conf
echo "MyAdmin    \"$name, $callsign\"" >> /opt/aprsc/etc/aprsc.conf
echo "MyEmail   $email" >> /opt/aprsc/etc/aprsc.conf


tee -a /opt/aprsc/etc/aprsc.conf <<EOF

### Directories #########
# Data directory (for persistent state files - currently none)
RunDir data

# If logging to a file (-o file), enable built-in log rotation.
# LogRotate <megabytes> <filecount>
# "LogRotate 10 5" keeps 5 old files of 10 megabytes each.
LogRotate 10 5

### Intervals and timers #########
# Interval specification format examples:
# 600 (600 seconds), or 600s, 5m, 2h, 1h30m, 1d3h15m24s, etc...

# When no data is received from an upstream server in N seconds, switch to
# another server.
UpstreamTimeout         15s

# When no data is received from a downstream server in N seconds, disconnect
ClientTimeout           48h

### TCP listener ##########
# Listen <socketname> <porttype> tcp <address to bind> <port> <options...>
#       socketname: any name you wish to show up in logs and statistics
#       porttype: one of:
#               fullfeed - everything, after dupe filtering
#               igate - igate / client port with user-specified filters
#               udpsubmit - UDP packet submission port (8080)
#               dupefeed - duplicate packets dropped by the server
#       options:
#               filter "m/500" - force a filter for users connected here
#               maxclients 100 - limit clients connected on this port
#               acl etc/client.acl - match client addresses against ACL
#               hidden - don't show the port in the status page
#
#              If you wish to provide UDP service for clients, set up a
#              second listener on the same address, port and protocol.
#
#              The  "::"  is IPv6 "IN6ADDR_ANY", whereas "0.0.0.0" is same
#              with IPv4.
#
#              On FreeBSD you need to have separate listeners for IPv4 and
#              IPv6. On Linux, just use :: alone - the IPv6 listener will
#              catch the IPv4 connections just as well.
#
# Example of normal server ports for Linux, supporting both TCP and UDP,
# IPv4 and IPv6:
#
Listen "Full feed"                                fullfeed tcp ::  10152 hidden
Listen ""                                         fullfeed udp ::  10152 hidden

Listen "Client-Defined Filters"                   igate tcp ::  14580
Listen ""                                         igate udp ::  14580

Listen "350 km from my position"                 igate tcp ::  20350 filter "m/350"
Listen ""                                        igate udp ::  20350 filter "m/350"

Listen "UDP submit"                               udpsubmit udp :: 8080

### Uplink configuration ########
# Uplink <name> <type> tcp <address> <port>
#       name: a name of the server or service you're connecting to
#       type: one of:
#               full - full feed
#               ro   - read-only, do not transmit anything upstream
#
# If you wish to specify multiple alternative servers, use multiple
# Uplink lines, one for each server.
#
# Normally a single line for the 'rotate' address is fine - it will connect
# to one of the servers in a random fashion and go for another one should
# the first one become unavailable.
#
Uplink "Core rotate" full  tcp  rotate.aprs.net 10152
#Uplink "Core rotate" ro    tcp  rotate.aprs.net 10152

# OPTIONAL: Bind source address before connecting to an uplink
# You can enter two addresses, one for IPv4 and one for IPv6 connections.
# Needed if you have multiple IP addresses on your server and only one
# of them is allowed to connect by the remote server.
#UplinkBind 127.0.0.1
#UplinkBind ::1

### HTTP server ##########
# HTTPStatus port provides a status view to web browsers.
# IPv6+IPv4 support works slightly differently than in Listen:
# :: is "all addresses" for IPv6, 0.0.0.0 for IPv4, but
# :: only works if you actually have a global IPv6 address
# configured on the system.
# The example is for IPv4, change the address to :: if you have
# IPv6. For FreeBSD, or if you wish to support multiple specific
# ports/addresses, use multiple HTTPStatus directives for each.
HTTPStatus 0.0.0.0 14501
# HTTPUpload port allows position uploads over HTTP
HTTPUpload 0.0.0.0 8080

### Environment ############
# When running this server as super-user, the server can (in many systems)
# increase several resource limits, and do other things that less privileged
# server can not do.
#
# The FileLimit is resource limit on how many simultaneous connections and
# some other internal resources the system can use at the same time.
# If the server is not being run as super-user, this setting has no effect
# in case it is above what normal user can set.
#
FileLimit        10000

### Operator attention span qualification run ###########
# After configuring the rest of the settings, remove this bad command
# from the configuration file. It's here only to avoid starting the
# server up accidentally with an invalid configuration.
#MagicBadness    42.7
EOF

reboot