Multimon-ng pager message parser and viewer
PagerMon is an API driven client/server framework for parsing and displaying pager messages from multimon-ng.
It is built around POCSAG messages, but should easily support other message types as required.
The UI is built around a Node/Express/Angular/Bootstrap stack, while the client scripts are Node scripts that receive piped input.
These instructions will get you a copy of the project up and running on your local machine for development and testing purposes.
$ sudo apt-get install npm sqlite3
$ npm install npm@latest -g
$ npm install pm2 -g
$ cd server
$ npm install
$ export NODE_ENV=production
$ pm2 start process.json
$ sudo pm2 startup
$ pm2 save
$ pm2 install pm2-logrotate
$ sudo pm2 logrotate -u user
Alternatively a production ready setup guide is available here https://github.com/pagermon/pagermon/wiki/Tutorial---Production-Ready-Ubuntu,-PM2,-Nginx-Reverse-Proxy,-Let's-Encrypt-SSL,-Pagermon-server
You can use image already built for you or you can build it yourself:
# For PC
docker build -t pagermon/pagermon .
# For Raspberry Pi
docker build -t pagermon/pagermon:latest-armhf -f Dockerfile.armhf .
docker create \
--name=pagermon \
-e APP_NAME=pagermon \
-p 3000:3000 \
-e TZ=Europe/London \
-v </path/to/config-mount>:/config \
--restart unless-stopped \
pagermon/pagermon:<VERSION>
docker start pagermon
version: "2"
services:
pagermon:
#build: ./server # To build localy
image: pagermon/pagermon:<VERSION>
container_name: pagermon
environment:
- APP_NAME=pagermon
- PUID=1000 # Not required since node user inside docker has UID 1000
- PGID=1000 # Not required since node user inside docker has GID 1000
- TZ=Europe/London
ports:
- "3000:3000"
volumes:
- </path/to/config-mount>:/config
restart: unless-stopped
Then run:
# Building with compose file
docker-compose build
# Running from compose file in foreground
docker-compose up
# Running from compose file in background
docker-compose up -d
Parameter | Function |
---|---|
-e APP_NAME=<name> |
Application name |
-e HOSTNAME=<hostname> |
Hostname |
-e USE_COOKIE_HOST=true |
Use cookie host. |
-e NO_CHOWN=true |
Disable fixing permissions. |
-e PUID=1000 |
for UserID |
-e PGID=1000 |
for GroupID |
-e SKIP_APP=true |
Don't start app, useful for development. |
-e TZ=Europe/London |
Specify a timezone to use eg. Europe/London. |
-v <path>:/config |
Mount config diretory, so config persist during container restarts (option 1) |
-v <volumename>:/config |
Create named volume for config diretory, so config persist during container restarts (option 2) |
-v /config |
Create unnamed volume for config diretory, so config persist during container restarts (option 3) |
-p 3000:3000 |
Expose container port |
Note:
/config
inside container and it is owned by node user with UID/GID 1000. To fix config directory ownership use -e PUID=<UID>
and -e PGID=<GID>
. (Here are database and config file stored)3000
will be forwarded to the docker container to port 3000
(by -p 3000:3000
)docker logs -f pagermon
(by --name pagermon
)docker-compose down
docker-compose down && docker-compose up --build
-armhf
at the end of version), but be aware that OracleDB does not work there.Tip: You probably want to setup docker log rotation before, more can be found here.
These programs/libraries are required for Pagermon Client to work
To install the Prerequisites run
sudo apt install nodejs npm git rtl-sdr
Run the following commands from Terminal:
git clone https://github.com/pagermon/pagermon.git
cd pagermon/client
npm install
edit reader.sh
and edit frequency and rtl_device number, Edit Multimon-ng command
rtl_fm -d 0 -E dc -F 0 -A fast -f 148.5875M -s22050 - |
multimon-ng -q -b1 -c -a POCSAG512 -f alpha -t raw /dev/stdin |
node reader.js
-d 0
- change this to your rtl_device number using rtl_test
-f 148.5875M
- change this to the frequency you are decoding
multimon-ng -q -b1 -c -a POCSAG512 -f alpha -t raw /dev/stdin
multimon-ng -a FLEX -t raw /dev/stdin
multimon-ng -a EAS -t raw /dev/stdin
Before running Pagermon Client you have to configure it to send the decoded info to the pagermon server.
copy default.json to config.json
cp config/default.json config/config.json
Edit config.json with your favorite editor
{
"apikey": "changeme",
"hostname": "http://127.0.0.1:3000",
"identifier": "TEST",
"sendFunctionCode": false,
"useTimestamp": true,
"EAS": {
"excludeEvents": [],
"includeFIPS": [],
"addressAddType": true
}
}
apikey: This is the API key generate on the Pagermon Server http://serverip/admin/settings
hostname: The host name or IP of the Pagermon server (If you run Pagermon Server and Client on same PC then you can put this as http://127.0.0.1:3000
identifier: This will show up in the source column on the server web page good for when you have multiple sources and want to know which one the pager message is coming from
sendFunctionCode: This will appand the function code to the address of the message true or false
useTimestamp: This will use the time in the message true or false
excludeEvents: Allows a list of Events to exclude ie ["RWT","RMT","SVA"]
includeFIPS: Allows you to filter on a list of FIPS to alert on ie ["031109", "031000"]
addressAddType: Will append the event code to the address so KOAX-WXR
would become KOAX-WXR-W for ZCZC-WXR-TOR-031109+0015-3650000-KOAX/NWS -
true or false
Check out our Raspberry Pi Image for Pi3 & Pi4 which has Pagermon pre-loaded on it.
Check out the following links:
Releases for the latest version Wiki for PagermonPi support
General PagerMon support can be requested in the #support channel of the PagerMon discord server.
Click Here to join
Bugs and Feature requests can be logged via the GitHub issues page.
All are welcome to contribute. Contributors should submit a pull request with the requested changes.
CHANGELOG.md is to be updated on each pull request.
If a pull request is the first pull request since a release, then the version number should be bumped in CHANGELOG.md
, server/app.js
, and server/package.json
.
If a database schema change is required, this must be done using KnexJS Migration files. Insert Instructions for this here
We use SemVer for versioning. For the versions available, see the tags on this repository.
See the list of contributors who participated in this project.
This project is licensed under The Unlicense - because fuck licenses. Do what you want with it. :>