├── .github
└── workflows
│ └── tests.yml
├── .gitignore
├── README.md
├── build
└── build-all.pl
├── doc
├── BUILDING.md
├── CONFIGURATION.md
├── CONTRIBUTING.md
├── DEBUGGING.md
├── DESIGN.md
├── HOME.md
├── IGATE-HINTS.md
├── INSTALLING.md
├── LICENSE
├── MONITORING.md
├── MULTIPLE.md
├── README.md
├── TIPS.md
├── TODO
├── TRANSLATING.md
├── WINDOWS.md
├── devel
│ └── test-packets
├── web-footer.html
└── web-header.html
├── src
├── .gitignore
├── LICENSE
├── Makefile.in
├── README.sources
├── VERSION
├── ac-hdrs.h.in
├── accept.c
├── accept.h
├── acl.c
├── acl.h
├── aclocal.m4
├── apparmor.aprsc
├── aprsc-prepare-chroot.sh
├── aprsc.8.in
├── aprsc.c
├── aprsc.conf
├── aprsc_munin
├── cJSON.c
├── cJSON.h
├── cellmalloc.c
├── cellmalloc.h
├── cfgfile.c
├── cfgfile.h
├── client_heard.c
├── client_heard.h
├── clientlist.c
├── clientlist.h
├── config.c
├── config.h
├── configure
├── configure.ac
├── counterdata.c
├── counterdata.h
├── debian
│ ├── .gitignore
│ ├── aprsc-chroot.service
│ ├── aprsc.default
│ ├── aprsc.init
│ ├── aprsc.service
│ ├── aprsc@.service
│ ├── changelog.release
│ ├── compat
│ ├── conffiles
│ ├── control
│ ├── copyright
│ ├── dirs
│ ├── docs
│ ├── links
│ ├── postinst
│ ├── postrm
│ ├── preinst
│ ├── prerm
│ └── rules
├── dupecheck.c
├── dupecheck.h
├── errno_aprsc.c
├── errno_aprsc.h
├── filter.c
├── filter.h
├── gai_strerror.c
├── getnameinfo.c
├── gfx
│ ├── aprsc-joulukissa-2013.xcf
│ ├── aprsc-logo-pekka.jpg
│ ├── aprsc-logo-shadow.xcf
│ ├── aprsc-logo.xcf
│ ├── aprsc-logo1.png
│ ├── aprsc-logo2.png
│ ├── aprsc-logo2.xcf
│ ├── aprsc-logo3.xcf
│ ├── aprsc-logo4.xcf
│ ├── aprsc-minus.png
│ └── aprsc-plus.png
├── historydb.c
├── historydb.h
├── hlog.c
├── hlog.h
├── hmalloc.c
├── hmalloc.h
├── http.c
├── http.h
├── incoming.c
├── incoming.h
├── inet_ntop.c
├── inet_pton.c
├── install-sh
├── keyhash.c
├── keyhash.h
├── login.c
├── login.h
├── m4
│ └── ax_check_gnu_make.m4
├── messaging.c
├── messaging.h
├── netdb6.h
├── netlib.c
├── netlib.h
├── outgoing.c
├── outgoing.h
├── parse_aprs.c
├── parse_aprs.h
├── parse_qc.c
├── parse_qc.h
├── passcode.c
├── passcode.h
├── random.c
├── random.h
├── rpm
│ ├── .gitignore
│ ├── aprsc.init
│ └── aprsc.spec.in
├── rwlock.c
├── rwlock.h
├── sctp.c
├── sctp.h
├── status.c
├── status.h
├── tls.c
├── tls.h
├── tools
│ ├── .gitignore
│ ├── coverity-build-submit.sh
│ ├── eventload.c
│ ├── floodconnect.c
│ ├── sleeptest.c
│ └── t2acl.pl
├── uplink.c
├── uplink.h
├── version.c
├── version.h
├── version_branch.h
├── web
│ ├── angular-translate-loader-url.min.js
│ ├── angular-translate.min.js
│ ├── angular.min.js
│ ├── aprsc-graph.js
│ ├── aprsc-joulukissa.jpg
│ ├── aprsc-logo4.png
│ ├── aprsc-logo4@2x.png
│ ├── aprsc.css
│ ├── aprsc.js
│ ├── bootstrap
│ │ ├── css
│ │ │ ├── bootstrap-theme.css
│ │ │ ├── bootstrap-theme.css.map
│ │ │ ├── bootstrap-theme.min.css
│ │ │ ├── bootstrap-theme.min.css.map
│ │ │ ├── bootstrap.css
│ │ │ ├── bootstrap.css.map
│ │ │ ├── bootstrap.min.css
│ │ │ └── bootstrap.min.css.map
│ │ ├── fonts
│ │ │ ├── glyphicons-halflings-regular.eot
│ │ │ ├── glyphicons-halflings-regular.svg
│ │ │ ├── glyphicons-halflings-regular.ttf
│ │ │ ├── glyphicons-halflings-regular.woff
│ │ │ └── glyphicons-halflings-regular.woff2
│ │ └── js
│ │ │ ├── bootstrap.js
│ │ │ ├── bootstrap.min.js
│ │ │ └── npm.js
│ ├── excanvas.min.js
│ ├── favicon.ico
│ ├── index.html
│ ├── jquery.flot.min.js
│ ├── jquery.flot.resize.min.js
│ ├── jquery.flot.selection.min.js
│ ├── jquery.flot.time.min.js
│ ├── jquery.min.js
│ ├── ngDialog-theme-plain.min.css
│ ├── ngDialog.min.css
│ ├── ngDialog.min.js
│ ├── strings-en.json
│ └── strings-fi.json
├── worker.c
├── worker.h
├── xpoll.c
└── xpoll.h
├── tests
├── Makefile
├── aggregator
│ ├── 10aggr_join.t
│ └── 20socket-timeouts.t
├── ca
│ ├── cert-selfsigned.sh
│ └── openssl.conf
├── cfg-aprsc
│ ├── acl-all.acl
│ ├── aggregator
│ ├── basic
│ ├── qconstr-protocols
│ ├── sctp-hub
│ ├── sctp-leaf
│ ├── tls1
│ └── uplinks
├── cfg-javap
│ ├── basic
│ └── uplinks
├── libperl
│ ├── Ham
│ │ └── APRS
│ │ │ ├── IS.pm
│ │ │ ├── IS_Fake.pm
│ │ │ └── IS_Fake_UDP.pm
│ ├── istest.pm
│ └── runproduct.pm
├── t
│ ├── 00startstop.t
│ ├── 01login.t
│ ├── 02login-reject.t
│ ├── 10dupecheck.t
│ ├── 11misc-drops.t
│ ├── 12quirks-mode.t
│ ├── 13thirdparty.t
│ ├── 20qconstr-clientonly.t
│ ├── 20qconstr-verified.t
│ ├── 21qconstr-unver.t.disabled
│ ├── 22path-trace.t
│ ├── 22qconstr-uplink.t
│ ├── 23qconstr-long.t
│ ├── 24qconstr-protocols.t
│ ├── 27digipath-long.t
│ ├── 30filter-cmd.t
│ ├── 30parser-filter.t
│ ├── 31parser-nmea.t
│ ├── 32filter-negative.t
│ ├── 33filter-pref-buddy-obj.t
│ ├── 34filter-type-symbol.t
│ ├── 35filter-digi-entry-unproto.t
│ ├── 36filter-area-my-friend.t
│ ├── 37filter-qconstr.t
│ ├── 38filter-verylong.t
│ ├── 40messaging.t
│ ├── 50disc-blobs.t
│ ├── 51load.t
│ ├── 51uplink-reconnect.t
│ ├── 60udp-client.t
│ ├── 61udp-peer.t
│ ├── 62http-client.t
│ ├── 63udp-submit.t
│ ├── 64udp-load.t
│ ├── 65dupeclient.t
│ ├── 66http-status.t
│ ├── 69sctp.t
│ └── 70live-upgrade.t
├── testdata
│ └── status-urls.txt
└── tls-openssl.conf
└── tools
├── Markdown.license
├── Markdown.pl
├── Markdown.readme
├── aprs-is-copy
├── aprs-is-coresimurx
├── aprs-is-file-feed
├── aprs-is-multirx
├── aprs-is-rx
├── aprs-is-xmit
└── aprsis-http-post
/.github/workflows/tests.yml:
--------------------------------------------------------------------------------
1 | name: Build Tests
2 |
3 | on:
4 | push:
5 | branches: [ main ]
6 | pull_request:
7 | branches: [ main ]
8 |
9 | jobs:
10 | build:
11 | strategy:
12 | matrix:
13 | os: [ ubuntu-latest, ubuntu-22.04 ]
14 | runs-on: ${{ matrix.os }}
15 |
16 | steps:
17 | - uses: actions/checkout@v2
18 |
19 | - name: install deps
20 | run: |
21 | sudo apt-get install -y libevent-dev \
22 | perl perl-modules libio-socket-inet6-perl libjson-xs-perl \
23 | libwww-perl \
24 | libparse-recdescent-perl \
25 | libprotobuf-c-dev protobuf-c-compiler libprotoc-dev \
26 | libprotobuf-dev protobuf-compiler cmake \
27 | libsctp-dev \
28 | openssl
29 |
30 | - name: configure
31 | run: |
32 | cd src
33 | ./configure
34 |
35 | - name: make
36 | run: |
37 | cd src
38 | make -j4
39 |
40 | - name: make testinstall
41 | run: |
42 | cd src
43 | make testinstall
44 |
45 | - name: Run tests
46 | run: |
47 | cd tests
48 | make test aggrtest
49 |
50 |
51 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Backups
2 | *~
3 |
4 | # Object files
5 | *.o
6 | *.d
7 |
8 | # Libraries
9 | *.lib
10 | *.a
11 |
12 | # Shared objects (inc. Windows DLLs)
13 | *.dll
14 | *.so
15 | *.so.*
16 | *.dylib
17 |
18 | # build products for dpkg
19 | aprsc_*.changes
20 | aprsc_*.deb
21 |
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 | aprsc - an APRS-IS server in C
3 | ==============================
4 |
5 | 
6 |
7 |
8 | You're looking at the source code of aprsc, an open-source APRS-IS
9 | server.
10 |
11 | For more information, please refer to the following resources:
12 |
13 | * [Home page](http://he.fi/aprsc/)
14 | * [Installation instructions](http://he.fi/aprsc/INSTALLING.html)
15 | * [Source code downloads](http://he.fi/aprsc/down/)
16 | * [Conference paper, Digital Communications Conference 2012, Atlanta, GA](http://he.fi/aprsc/dcc-2012-aprsc.pdf)
17 | * [Contributing to the aprsc project](http://he.fi/aprsc/CONTRIBUTING.html)
18 |
19 | Have fun!
20 |
21 | - Hessu, OH7LZB
22 |
23 |
--------------------------------------------------------------------------------
/doc/DEBUGGING.md:
--------------------------------------------------------------------------------
1 |
2 | Debugging aprsc issues, tips and tricks
3 | =======================================
4 |
5 | Enabling debug logging
6 | -------------------------
7 |
8 | Change the log level to debug by changing "-e info" to "-e debug" on the
9 | aprsc command line. Insert "-e debug" if you don't have an -e parameter.
10 |
11 | On Debian and Ubuntu the parameter goes in /etc/default/aprsc, on the
12 | DAEMON_OPTS line. On CentOS it goes to /etc/sysconfig/aprsc. On other
13 | systems it typically goes in the init script.
14 |
15 | Enabling core dumps on Linux
16 | -------------------------------
17 |
18 | Allow binary doing setuid() to dump core:
19 |
20 | echo 2 > /proc/sys/fs/suid_dumpable
21 |
22 | Tune core file name pattern:
23 |
24 | echo "/var/core/core.%e.%p.%s" > /proc/sys/kernel/core_pattern
25 |
26 | Create a directory within the aprsc chroot where the core can be
27 | dumped:
28 |
29 | mkdir -p /opt/aprsc/var/core
30 | chmod a+w /opt/aprsc/var/core
31 |
32 |
--------------------------------------------------------------------------------
/doc/DESIGN.md:
--------------------------------------------------------------------------------
1 |
2 | Design
3 | ---------
4 |
5 | aprsc's basic design was drawn out in a pizza session in early 2008. The
6 | design goals were:
7 |
8 | * High throughput and small enough latency
9 | * Support for thousands of clients per server
10 | * Support for heavy bursts of new clients (CWOP hits every 5 or 10 minutes)
11 | * Scalability over multiple CPUs
12 | * Low context switch overhead
13 | * Low lock contention between threads
14 |
15 | A modern hybrid threaded / event-driven approach was selected. All recently
16 | developed high-performance Internet servers work in this mode (some with
17 | multiple event-driven processes, some with event-driven threads). There is
18 | a small, fixed number of threads, close to the number of CPU cores on the
19 | server, so that multiple CPU cores can be utilized, but the relatively
20 | expensive context switches between a high number of threads will not cause
21 | serious overhead.
22 |
23 | When the server is under heavy load, data transfers between threads happen
24 | in blocks of multiple data units, so that contention on mutexes and
25 | read-write locks will not block concurrent execution of the threads. Lock
26 | contention makes many multi-threaded servers effectively single-threaded and
27 | unable to utilize more than a single CPU core.
28 |
29 | Main work is done by 1 to N worker threads. In real-world APRS-IS today, 1
30 | worker thread is enough, but if a server was really heavily loaded with
31 | thousands of clients, 1 less than the number of CPU cores would be optimal.
32 |
33 | A worker thread's workflow goes like this:
34 |
35 | 1. Read data from connected clients
36 | 2. Do initial APRS-IS packet parsing (SRCCALL>DSTCALL,PATH:DATA)
37 | 3. Do Q-construct processing (,qAx in the PATH)
38 | 4. Parse APRS formatted information in the DATA to extract enough details
39 | to support filtering in the outgoing / filtering phase
40 | 5. Pass on received packets to the dupecheck thread for duplicate removal
41 | 6. Get packets, sorted to unique and duplicate packets, from the dupecheck
42 | thread
43 | 7. Send out packets to clients as instructed by the listening port's
44 | configuration and the client's filter settings
45 |
46 | The Dupecheck thread maintains a cache of packets heard during the past 30
47 | seconds. There is a dedicated thread for this cache, so that the worker
48 | threads do not need to compete for access to the shared resource. The thread
49 | gets packets from the worker threads, does dupe checking, and puts the
50 | unique and duplicate packets in two global ordered buffer queues. The
51 | workers then walk through those buffers and do filtering to decide which
52 | packets should be sent to which clients.
53 |
54 | An Uplink threads initiates connections to upstream servers and reconnects
55 | them as needed. After a successful connection the socket will be passed on
56 | to a Worker thread which will proceed to exchange traffic with the remote
57 | server for the duration of the connection.
58 |
59 | An Accept thread listens on the TCP ports for new incoming connections, does
60 | access list checks, and distributes allowed connections evenly across worker
61 | threads.
62 |
63 | An HTTP thread runs an event-driven HTTP server (libevent2 based) to support
64 | the status page and HTTP position uploads. Since implementing nice web user
65 | interfaces in plain C is not very convenient or effective, the status page
66 | is produced using modern Web 2.0 methods. The HTTP server can only generate
67 | a dynamic JSON-encoded status file and serve static files. An empty
68 | index.html file loads a static JavaScript file, which then periodically
69 | loads the JSON status data and formats the contents of the status page
70 | within the client's browser. This approach allowed clean separation of
71 | server code (C) and web presentation (HTML5/JavaScript/jQuery/flot).
72 |
73 | Both developers are experienced professional Unix C programmers, so the
74 | programming language was easy to select. We also had plenty of existing
75 | code that could be re-used in this project.
76 |
77 |
--------------------------------------------------------------------------------
/doc/HOME.md:
--------------------------------------------------------------------------------
1 |
2 | aprsc - an APRS-IS server in C
3 | ==============================
4 |
5 | aprsc (pronounced a-purrs-c) is a plain APRS-IS server intended to be used
6 | on the core and Tier2 APRS-IS servers. It is written in the C language, and
7 | it runs on Linux and Unix servers.
8 |
9 | If you need igate or other radio-interfacing features, aprsc is not for you.
10 |
11 |
12 | Status of the project
13 | ------------------------
14 |
15 | aprsc was released in 2012, and it has since been in continuous use on a
16 | large percentage of APRS-IS servers. It has been found to be easy to set up
17 | and stable in production use. Since it is pretty much feature complete by
18 | now, new major versions come out rarely, but smaller bugs get fixed at
19 | times.
20 |
21 |
22 | Features (and lack of)
23 | -------------------------
24 |
25 | aprsc has been designed strictly for use within the APRS-IS core, hub and
26 | Tier2 servers. It includes only the basic functionality required by those
27 | servers.
28 |
29 | It does not, and will not, have any additional functions such as igating,
30 | digipeating, interfacing to radios, D-PRS or other gateway functions, or
31 | object generation. The idea is to keep aprsc relatively simple and lean,
32 | and leave the more specialized features for more specialized software.
33 |
34 | If you need a nice, compact igate software for Linux, please take a look at
35 | either aprx or aprs4r. If you need to run an APRS-IS server on some
36 | platform not supported by aprsc, or if you need the features existing in
37 | javAPRSSrvr which are missing from aprsc, javAPRSSrvr is the right choice
38 | for you - it's got a lot of good features that many of you need, and it
39 | works on virtually all operating systems. If you need an igate for Windows,
40 | APRSIS32 should be good.
41 |
42 |
43 | Licensing, environments and requirements
44 | -------------------------------------------
45 |
46 | aprsc is open source, licensed under the BSD license. It has about 11000
47 | lines of relatively clean C code, built using the usual ./configure && make
48 | && make install method. The embedded HTTP status server is powered by the
49 | libevent2 library, no other extra libraries are needed.
50 |
51 | Linux and OS X are the main development environments and will receive
52 | premium support, but FreeBSD and Solaris 11 are known to work too. Packaged
53 | binaries for Debian, Ubuntu and CentOS are available for super-easy
54 | installations and automatic upgrades using APT and YUM.
55 |
56 |
57 | Discussion group
58 | -------------------
59 |
60 | aprsc has it's own [discussion group][aprsc-group] which also functions as
61 | a mailing list. If you run aprsc, please subscribe to the group to keep
62 | updated on new versions.
63 |
64 | [aprsc-group]: https://groups.google.com/forum/#!forum/aprsc
65 |
66 |
67 | Getting and installing aprsc
68 | -------------------------------
69 |
70 | aprsc is currently best supported on Debian and Ubuntu.
71 | Please refer to the [INSTALLING](INSTALLING.html) document
72 | for instructions.
73 |
74 | After the software is installed, please go through the
75 | [CONFIGURATION](CONFIGURATION.html) document.
76 |
77 | You may also look into translating the aprsc status page to your
78 | language. The process is described in the
79 | [TRANSLATING](TRANSLATING.html) document.
80 |
81 |
82 | Other documentation
83 | ----------------------
84 |
85 | * [README](README.html)
86 | * [Paper on aprsc for TAPR DCC 2012](dcc-2012-aprsc.pdf)
87 | * Presentation slides from TAPR DCC 2012 (will be here shortly)
88 |
89 |
90 | Contributing to aprsc
91 | ------------------------
92 |
93 | aprsc is an open source project, so you're welcome to contribute bug fixes
94 | and improvements. Please see [CONTRIBUTING](CONTRIBUTING.html) for details!
95 |
96 |
97 |
--------------------------------------------------------------------------------
/doc/MONITORING.md:
--------------------------------------------------------------------------------
1 |
2 | Monitoring aprsc
3 | ================
4 |
5 | It's a good practice to monitor the performance and utilisation of your
6 | server, and to generate alarms when it's not working as it should.
7 |
8 | aprsc comes with a munin plugin which makes it very easy to set up
9 | statistics graphs. Comparing graphs for aprsc against the graphs for the
10 | rest of the system can be very helpful in diagnosing performance issues.
11 | Seeing all those statistics also gives a nice warm fuzzy feeling from
12 | knowing how how the server is doing and what it is spending all those
13 | electrons on.
14 |
15 | For example, please take a look at my [aprsc-specific Munin graphs from
16 | T2FINLAND](http://he.fi/aprsc/munin/).
17 |
18 |
19 | Setting up munin on Debian or Ubuntu
20 | ---------------------------------------
21 |
22 | Munin consists of two pieces, an agent running on all servers (munin-node),
23 | collecting raw numbers from the operating system and the software running on
24 | it, and the master data collector (munin). If you have many servers, put
25 | the master data collector on just one of them (that server needs to have a
26 | web server to publish the statistics). If you have a single server, put a
27 | web server, the agent and the master on that.
28 |
29 | Installing the agent, the master and the standard Apache web server:
30 |
31 | sudo apt-get install munin-node munin apache2-mpm-worker
32 |
33 | It will pull up quite a few other packages as dependencies, but that's OK.
34 |
35 |
36 | Setting up munin on other Linux distributions
37 | ------------------------------------------------
38 |
39 | Instructions for each distribution can be found [on munin's home
40 | page](http://munin-monitoring.org/wiki/LinuxInstallation).
41 |
42 |
43 | Setting up the munin plugin
44 | ------------------------------
45 |
46 | If munin is installed when installing or upgrading aprsc, aprsc's
47 | post-install script will automatically configure aprsc's munin plugin.
48 |
49 | If you have aprsc running already, reconfigure it:
50 |
51 | sudo dpkg-reconfigure aprsc
52 |
53 | That'll set up the munin plugin (among a few other things, like triggering a
54 | live upgrade to the current version). Now, you'll need to give munin a kick
55 | to make it notice the new plugins:
56 |
57 | sudo /etc/init.d/munin-node restart
58 |
59 | Future versions of aprsc might do that automatically for you.
60 |
61 |
62 | Wait!
63 | --------
64 |
65 | Wait for some 10-15 minutes. Have a nice cup of coffee or tea, or some
66 | other beverage according to your personal preference. Munin updates every 5
67 | minutes, but after installation or adding new plugins, it'll take a couple
68 | of rounds before it starts generating graphs for those.
69 |
70 |
71 | See.
72 | -------
73 |
74 | Surf to http://yourserver.example.com/munin/ and browse around!
75 | Ooops, got a "403 Forbidden" error? Proceed to the next step.
76 |
77 |
78 | Edit the web server's config file
79 | ------------------------------------
80 |
81 | At least on debian, the web server is configured by default to only allow a
82 | local web browser to access the Munin subdirectory. Open up
83 | /etc/apache2/conf.d/munin in your favourite text editor, and put your own IP
84 | address, network or domain on and allow line. You can add new Allow lines
85 | next to the one that's already there, like this:
86 |
87 | Allow from 44.0.0.0/8
88 | Allow from .ampr.org
89 |
90 | After editing apache's config file, tell it to re-read configuration by
91 | doing a graceful restart:
92 |
93 | sudo apache2ctl graceful
94 |
95 | And surf to http://yourserver.example.com/munin/ again.
96 |
97 |
98 | Setting up nagios alarms
99 | ---------------------------
100 |
101 | TODO: write
102 |
--------------------------------------------------------------------------------
/doc/TIPS.md:
--------------------------------------------------------------------------------
1 | aprsc tricks and tips
2 | =====================
3 |
4 |
5 | Providing access on low TCP ports (like 23)
6 | ----------------------------------------------
7 |
8 | For security reasons aprsc drops root privileges as soon as possible after
9 | starting up (if it ever had them in the first place). Listening on
10 | privileged "low" ports below 1024 normally requires root privileges, which
11 | aprsc no longer has when it comes to the point where it would start binding
12 | those ports.
13 |
14 | You can use a NAT based method to redirect traffic from port 23 to port
15 | 14580 (or some other high unprivileged port your server is listening on).
16 | Replace *youripaddress* with your external IP address. The local listening
17 | address (to-destination) cannot be localhost, so use the same IP address.
18 | These two commands need to go somewhere in your startup scripts or firewall
19 | configurations.
20 |
21 | root@box:~# iptables -t nat -A PREROUTING -d *youripaddress*
22 | -p tcp --dport 23 -m addrtype --dst-type LOCAL -j DNAT
23 | --to-destination *youripaddress*:14580
24 |
25 | root@box:~# iptables -t nat -A OUTPUT -d *youripaddress*
26 | -p tcp --dport 29 -m addrtype --dst-type LOCAL -j DNAT
27 | --to-destination *youripaddress*:14580
28 |
29 | When you wish to view your current NAT configuration on Linux, remember to
30 | specifically ask for the nat tables:
31 |
32 | root@box:~# iptables -t nat -L
33 |
--------------------------------------------------------------------------------
/doc/TODO:
--------------------------------------------------------------------------------
1 | TODO ITEMS LIST
2 |
3 | - UDP communication
4 | - "Client" version exists -- unidirectional data flow from server to client,
5 | server discards all data sent to it
6 | - Future todo:
7 | - network performance buffering of data into UDP packets is needed
8 | - client traffic flow in UDP form ?
9 |
10 | - complete output filters
11 | - s-filter is still missing
12 |
13 | To Consider:
14 |
15 | - SCTP sockets
16 |
17 | - UDP with multiple messages in same datagram (up to about 1400 bytes
18 | in single UDP frame), AND with timestamp telling how long a message
19 | has been in transit, AND binary transparency capability...
20 | ( network byte order 32-bit value telling seconds since 2000-01-01 ? )
21 |
22 |
23 |
--------------------------------------------------------------------------------
/doc/TRANSLATING.md:
--------------------------------------------------------------------------------
1 |
2 | Translating aprsc status view to other languages
3 | ===================================================
4 |
5 | Create a new language file
6 | ----------------------------
7 |
8 | Go to /opt/aprsc/web, and make a copy of the master English strings file.
9 | Look up your two-letter language code from
10 | [the list](https://www.w3.org/International/articles/language-tags/)
11 | ('sv' is for Swedish, for example), and use it to construct the file name.
12 |
13 | cd /opt/aprsc/web
14 | cp strings-en.json strings-sv.json
15 |
16 | Edit strings-sv.json with your favourite editor, translate all
17 | the strings. Make sure you use UTF-8 encoding in your editor
18 | and terminal.
19 |
20 |
21 | Reconfigure or restart aprsc
22 | -------------------------------
23 |
24 | The aprsc process will scan for string files at startup and when
25 | reloading configuration. This step will only need to be done once
26 | after creating the new string file - after further edits of strings,
27 | simply reload the status web page.
28 |
29 | To reload configuration, execute the `reload` option of the startup script.
30 |
31 | On Ubuntu or Debian:
32 |
33 | sudo service aprsc reload
34 |
35 | On Centos (and others):
36 |
37 | sudo /etc/init.d/aprsc reload
38 |
39 |
40 | Add new language mapping
41 | ---------------------------
42 |
43 | Edit /opt/aprsc/web/aprsc.js - in the beginning you'll find two
44 | statements which need to be adjusted:
45 |
46 | // add additional language codes here, in the end of the list:
47 | var lang_list = ['en', 'fi'];
48 | // and, if necessary, add one new line in the beginning here,
49 | // for dialect mapping (en_US, en_GB to en):
50 | var lang_map = {
51 | 'en_*': 'en',
52 | 'fi_*': 'fi',
53 | '*': 'en' // DO NOT remove or change the default mapping to 'en'
54 | };
55 |
56 | For Swedish translation, the first list would become:
57 |
58 | var lang_list = ['en', 'fi', 'sv'];
59 |
60 | If Swedish would have dialects ('sv_FI' for Swedish spoken in Finland)
61 | then the mapping for the variants can be added. Otherwise, only clients
62 | requesting plain 'sv' for language will get the translation.
63 |
64 | var lang_map = {
65 | 'en_*': 'en',
66 | 'fi_*': 'fi',
67 | 'sv_*': 'sv',
68 | '*': 'en'
69 | };
70 |
71 | Pass new translation to upstream aprsc code
72 | ----------------------------------------------
73 |
74 | Give your new translation back to the aprsc project, so that it will be
75 | included in future versions automatically, and that it'll be installed
76 | on other servers too.
77 |
78 |
--------------------------------------------------------------------------------
/doc/devel/test-packets:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hessu/aprsc/a4efaa54f75e6d7f53235720001ed76a01cda4e4/doc/devel/test-packets
--------------------------------------------------------------------------------
/doc/web-footer.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
19 |
20 |