Preparing for v1 release
This commit is contained in:
parent
2d34b683a5
commit
7c65ec74c5
256
FreeDMR-SAMPLE.cfg
Executable file
256
FreeDMR-SAMPLE.cfg
Executable file
@ -0,0 +1,256 @@
|
||||
# PROGRAM-WIDE PARAMETERS GO HERE
|
||||
# PATH - working path for files, leave it alone unless you NEED to change it
|
||||
# PING_TIME - the interval that peers will ping the master, and re-try registraion
|
||||
# - how often the Master maintenance loop runs
|
||||
# MAX_MISSED - how many pings are missed before we give up and re-register
|
||||
# - number of times the master maintenance loop runs before de-registering a peer
|
||||
#
|
||||
# ACLs:
|
||||
#
|
||||
# Access Control Lists are a very powerful tool for administering your system.
|
||||
# But they consume packet processing time. Disable them if you are not using them.
|
||||
# But be aware that, as of now, the configuration stanzas still need the ACL
|
||||
# sections configured even if you're not using them.
|
||||
#
|
||||
# REGISTRATION ACLS ARE ALWAYS USED, ONLY SUBSCRIBER AND TGID MAY BE DISABLED!!!
|
||||
#
|
||||
# The 'action' May be PERMIT|DENY
|
||||
# Each entry may be a single radio id, or a hypenated range (e.g. 1-2999)
|
||||
# Format:
|
||||
# ACL = 'action:id|start-end|,id|start-end,....'
|
||||
# --for example--
|
||||
# SUB_ACL: DENY:1,1000-2000,4500-60000,17
|
||||
#
|
||||
# ACL Types:
|
||||
# REG_ACL: peer radio IDs for registration (only used on HBP master systems)
|
||||
# SUB_ACL: subscriber IDs for end-users
|
||||
# TGID_TS1_ACL: destination talkgroup IDs on Timeslot 1
|
||||
# TGID_TS2_ACL: destination talkgroup IDs on Timeslot 2
|
||||
#
|
||||
# ACLs may be repeated for individual systems if needed for granularity
|
||||
# Global ACLs will be processed BEFORE the system level ACLs
|
||||
# Packets will be matched against all ACLs, GLOBAL first. If a packet 'passes'
|
||||
# All elements, processing continues. Packets are discarded at the first
|
||||
# negative match, or 'reject' from an ACL element.
|
||||
#
|
||||
# If you do not wish to use ACLs, set them to 'PERMIT:ALL'
|
||||
# TGID_TS1_ACL in the global stanza is used for OPENBRIDGE systems, since all
|
||||
# traffic is passed as TS 1 between OpenBridges
|
||||
[GLOBAL]
|
||||
PATH: ./
|
||||
PING_TIME: 10
|
||||
MAX_MISSED: 3
|
||||
USE_ACL: True
|
||||
REG_ACL: PERMIT:ALL
|
||||
SUB_ACL: DENY:1
|
||||
TGID_TS1_ACL: PERMIT:ALL
|
||||
TGID_TS2_ACL: PERMIT:ALL
|
||||
|
||||
|
||||
# NOT YET WORKING: NETWORK REPORTING CONFIGURATION
|
||||
# Enabling "REPORT" will configure a socket-based reporting
|
||||
# system that will send the configuration and other items
|
||||
# to a another process (local or remote) that may process
|
||||
# the information for some useful purpose, like a web dashboard.
|
||||
#
|
||||
# REPORT - True to enable, False to disable
|
||||
# REPORT_INTERVAL - Seconds between reports
|
||||
# REPORT_PORT - TCP port to listen on if "REPORT_NETWORKS" = NETWORK
|
||||
# REPORT_CLIENTS - comma separated list of IPs you will allow clients
|
||||
# to connect on. Entering a * will allow all.
|
||||
#
|
||||
# ****FOR NOW MUST BE TRUE - USE THE LOOPBACK IF YOU DON'T USE THIS!!!****
|
||||
[REPORTS]
|
||||
REPORT: True
|
||||
REPORT_INTERVAL: 60
|
||||
REPORT_PORT: 4321
|
||||
REPORT_CLIENTS: 127.0.0.1
|
||||
|
||||
|
||||
# SYSTEM LOGGER CONFIGURAITON
|
||||
# This allows the logger to be configured without chaning the individual
|
||||
# python logger stuff. LOG_FILE should be a complete path/filename for *your*
|
||||
# system -- use /dev/null for non-file handlers.
|
||||
# LOG_HANDLERS may be any of the following, please, no spaces in the
|
||||
# list if you use several:
|
||||
# null
|
||||
# console
|
||||
# console-timed
|
||||
# file
|
||||
# file-timed
|
||||
# syslog
|
||||
# LOG_LEVEL may be any of the standard syslog logging levels, though
|
||||
# as of now, DEBUG, INFO, WARNING and CRITICAL are the only ones
|
||||
# used.
|
||||
#
|
||||
[LOGGER]
|
||||
LOG_FILE: /tmp/hblink.log
|
||||
LOG_HANDLERS: console-timed
|
||||
LOG_LEVEL: DEBUG
|
||||
LOG_NAME: HBlink
|
||||
|
||||
# DOWNLOAD AND IMPORT SUBSCRIBER, PEER and TGID ALIASES
|
||||
# Ok, not the TGID, there's no master list I know of to download
|
||||
# This is intended as a facility for other applcations built on top of
|
||||
# HBlink to use, and will NOT be used in HBlink directly.
|
||||
# STALE_DAYS is the number of days since the last download before we
|
||||
# download again. Don't be an ass and change this to less than a few days.
|
||||
[ALIASES]
|
||||
TRY_DOWNLOAD: True
|
||||
PATH: ./
|
||||
PEER_FILE: peer_ids.json
|
||||
SUBSCRIBER_FILE: subscriber_ids.json
|
||||
TGID_FILE: talkgroup_ids.json
|
||||
PEER_URL: https://www.radioid.net/static/rptrs.json
|
||||
SUBSCRIBER_URL: https://www.radioid.net/static/users.json
|
||||
STALE_DAYS: 7
|
||||
|
||||
#Read further repeater configs from MySQL
|
||||
[MYSQL]
|
||||
USE_MYSQL: False
|
||||
USER: hblink
|
||||
PASS: mypassword
|
||||
DB: hblink
|
||||
SERVER: 127.0.0.1
|
||||
PORT: 3306
|
||||
|
||||
# OPENBRIDGE INSTANCES - DUPLICATE SECTION FOR MULTIPLE CONNECTIONS
|
||||
# OpenBridge is a protocol originall created by DMR+ for connection between an
|
||||
# IPSC2 server and Brandmeister. It has been implemented here at the suggestion
|
||||
# of the Brandmeister team as a way to legitimately connect HBlink to the
|
||||
# Brandemiester network.
|
||||
# It is recommended to name the system the ID of the Brandmeister server that
|
||||
# it connects to, but is not necessary. TARGET_IP and TARGET_PORT are of the
|
||||
# Brandmeister or IPSC2 server you are connecting to. PASSPHRASE is the password
|
||||
# that must be agreed upon between you and the operator of the server you are
|
||||
# connecting to. NETWORK_ID is a number in the format of a DMR Radio ID that
|
||||
# will be sent to the other server to identify this connection.
|
||||
# other parameters follow the other system types.
|
||||
#
|
||||
# ACLs:
|
||||
# OpenBridge does not 'register', so registration ACL is meaningless.
|
||||
# OpenBridge passes all traffic on TS1, so there is only 1 TGID ACL.
|
||||
# Otherwise ACLs work as described in the global stanza
|
||||
[OBP-TEST]
|
||||
MODE: OPENBRIDGE
|
||||
ENABLED: False
|
||||
IP:
|
||||
PORT: 62044
|
||||
NETWORK_ID: 1
|
||||
PASSPHRASE: mypass
|
||||
TARGET_IP:
|
||||
TARGET_PORT: 62044
|
||||
USE_ACL: True
|
||||
SUB_ACL: DENY:1
|
||||
TGID_ACL: PERMIT:ALL
|
||||
|
||||
# MASTER INSTANCES - DUPLICATE SECTION FOR MULTIPLE MASTERS
|
||||
# HomeBrew Protocol Master instances go here.
|
||||
# IP may be left blank if there's one interface on your system.
|
||||
# Port should be the port you want this master to listen on. It must be unique
|
||||
# and unused by anything else.
|
||||
# Repeat - if True, the master repeats traffic to peers, False, it does nothing.
|
||||
#
|
||||
# MAX_PEERS -- maximun number of peers that may be connect to this master
|
||||
# at any given time. This is very handy if you're allowing hotspots to
|
||||
# connect, or using a limited computer like a Raspberry Pi.
|
||||
#
|
||||
# ACLs:
|
||||
# See comments in the GLOBAL stanza
|
||||
[G9XYZ]
|
||||
MODE: MASTER
|
||||
ENABLED: False
|
||||
REPEAT: True
|
||||
MAX_PEERS: 1
|
||||
EXPORT_AMBE: False
|
||||
IP:
|
||||
PORT: 54001
|
||||
PASSPHRASE: passw0rd
|
||||
GROUP_HANGTIME: 5
|
||||
USE_ACL: True
|
||||
REG_ACL: DENY:1
|
||||
SUB_ACL: DENY:1
|
||||
TGID_TS1_ACL: PERMIT:ALL
|
||||
TGID_TS2_ACL: PERMIT:ALL
|
||||
DEFAULT_UA_TIMER: 10
|
||||
SINGLE_MODE: True
|
||||
VOICE_IDENT: True
|
||||
TS1_STATIC:
|
||||
TS2_STATIC:
|
||||
DEFAULT_REFLECTOR: 0
|
||||
|
||||
# PEER INSTANCES - DUPLICATE SECTION FOR MULTIPLE PEERS
|
||||
# There are a LOT of errors in the HB Protocol specifications on this one!
|
||||
# MOST of these items are just strings and will be properly dealt with by the program
|
||||
# The TX & RX Frequencies are 9-digit numbers, and are the frequency in Hz.
|
||||
# Latitude is an 8-digit unsigned floating point number.
|
||||
# Longitude is a 9-digit signed floating point number.
|
||||
# Height is in meters
|
||||
# Setting Loose to True relaxes the validation on packets received from the master.
|
||||
# This will allow HBlink to connect to a non-compliant system such as XLXD, DMR+ etc.
|
||||
#
|
||||
# ACLs:
|
||||
# See comments in the GLOBAL stanza
|
||||
[REPEATER-1]
|
||||
MODE: PEER
|
||||
ENABLED: False
|
||||
LOOSE: False
|
||||
EXPORT_AMBE: False
|
||||
IP:
|
||||
PORT: 54001
|
||||
MASTER_IP: 172.16.1.1
|
||||
MASTER_PORT: 54000
|
||||
PASSPHRASE: homebrew
|
||||
CALLSIGN: W1ABC
|
||||
RADIO_ID: 312000
|
||||
RX_FREQ: 449000000
|
||||
TX_FREQ: 444000000
|
||||
TX_POWER: 25
|
||||
COLORCODE: 1
|
||||
SLOTS: 1
|
||||
LATITUDE: 38.0000
|
||||
LONGITUDE: -095.0000
|
||||
HEIGHT: 75
|
||||
LOCATION: Anywhere, USA
|
||||
DESCRIPTION: This is a cool repeater
|
||||
URL: www.w1abc.org
|
||||
SOFTWARE_ID: 20170620
|
||||
PACKAGE_ID: MMDVM_HBlink
|
||||
GROUP_HANGTIME: 5
|
||||
OPTIONS:
|
||||
USE_ACL: True
|
||||
SUB_ACL: DENY:1
|
||||
TGID_TS1_ACL: PERMIT:ALL
|
||||
TGID_TS2_ACL: PERMIT:ALL
|
||||
|
||||
[XLX-1]
|
||||
MODE: XLXPEER
|
||||
ENABLED: False
|
||||
LOOSE: True
|
||||
EXPORT_AMBE: False
|
||||
IP:
|
||||
PORT: 54002
|
||||
MASTER_IP: 172.16.1.1
|
||||
MASTER_PORT: 62030
|
||||
PASSPHRASE: passw0rd
|
||||
CALLSIGN: W1ABC
|
||||
RADIO_ID: 312000
|
||||
RX_FREQ: 449000000
|
||||
TX_FREQ: 444000000
|
||||
TX_POWER: 25
|
||||
COLORCODE: 1
|
||||
SLOTS: 1
|
||||
LATITUDE: 38.0000
|
||||
LONGITUDE: -095.0000
|
||||
HEIGHT: 75
|
||||
LOCATION: Anywhere, USA
|
||||
DESCRIPTION: This is a cool repeater
|
||||
URL: www.w1abc.org
|
||||
SOFTWARE_ID: 20170620
|
||||
PACKAGE_ID: MMDVM_HBlink
|
||||
GROUP_HANGTIME: 5
|
||||
XLXMODULE: 4004
|
||||
USE_ACL: True
|
||||
SUB_ACL: DENY:1
|
||||
TGID_TS1_ACL: PERMIT:ALL
|
||||
TGID_TS2_ACL: PERMIT:ALL
|
BIN
HBlink.png
BIN
HBlink.png
Binary file not shown.
Before Width: | Height: | Size: 42 KiB |
245
HBlink.svg
245
HBlink.svg
@ -1,245 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
inkscape:version="1.0beta1 (d565813, 2019-09-28)"
|
||||
sodipodi:docname="HBlink.svg"
|
||||
id="svg877"
|
||||
height="411.17413"
|
||||
width="1042.9242"
|
||||
viewBox="49.656 217.125 1042.9242 411.17414"
|
||||
version="1.1">
|
||||
<sodipodi:namedview
|
||||
inkscape:current-layer="svg877"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:window-y="23"
|
||||
inkscape:window-x="583"
|
||||
inkscape:cy="48.366866"
|
||||
inkscape:cx="574.39926"
|
||||
inkscape:zoom="1"
|
||||
fit-margin-left="5"
|
||||
fit-margin-bottom="5"
|
||||
fit-margin-right="5"
|
||||
fit-margin-top="5"
|
||||
units="px"
|
||||
inkscape:pagecheckerboard="true"
|
||||
showgrid="false"
|
||||
id="namedview879"
|
||||
inkscape:window-height="1348"
|
||||
inkscape:window-width="1943"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0"
|
||||
guidetolerance="10"
|
||||
gridtolerance="10"
|
||||
objecttolerance="10"
|
||||
borderopacity="1"
|
||||
inkscape:document-rotation="0"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff" />
|
||||
<defs
|
||||
id="defs837">
|
||||
<font-face
|
||||
overline-thickness="0"
|
||||
overline-position="0"
|
||||
strikethrough-thickness="0"
|
||||
strikethrough-position="0"
|
||||
v-hanging="0"
|
||||
v-mathematical="0"
|
||||
v-alphabetic="0"
|
||||
v-ideographic="0"
|
||||
hanging="0"
|
||||
mathematical="0"
|
||||
alphabetic="0"
|
||||
ideographic="0"
|
||||
accent-height="0"
|
||||
stemh="0"
|
||||
stemv="0"
|
||||
id="font-face833"
|
||||
font-weight="400"
|
||||
descent="-255.00488"
|
||||
ascent="945.0073"
|
||||
cap-height="669"
|
||||
x-height="669"
|
||||
slope="0"
|
||||
underline-thickness="20"
|
||||
underline-position="-133"
|
||||
units-per-em="1000"
|
||||
panose-1="2 0 6 0 0 0 0 0 0 0"
|
||||
font-size="96"
|
||||
font-family="Ethnocentric">
|
||||
<font-face-src>
|
||||
<font-face-name
|
||||
name="EthnocentricRg-Regular" />
|
||||
</font-face-src>
|
||||
</font-face>
|
||||
<font-face
|
||||
overline-thickness="0"
|
||||
overline-position="0"
|
||||
strikethrough-thickness="0"
|
||||
strikethrough-position="0"
|
||||
v-hanging="0"
|
||||
v-mathematical="0"
|
||||
v-alphabetic="0"
|
||||
v-ideographic="0"
|
||||
hanging="0"
|
||||
mathematical="0"
|
||||
alphabetic="0"
|
||||
ideographic="0"
|
||||
accent-height="0"
|
||||
stemh="0"
|
||||
stemv="0"
|
||||
id="font-face835"
|
||||
font-weight="400"
|
||||
descent="-255.00488"
|
||||
ascent="945.0073"
|
||||
cap-height="669"
|
||||
x-height="669"
|
||||
slope="0"
|
||||
underline-thickness="20"
|
||||
underline-position="-133"
|
||||
units-per-em="1000"
|
||||
panose-1="2 0 6 0 0 0 0 0 0 0"
|
||||
font-size="48"
|
||||
font-family="Ethnocentric">
|
||||
<font-face-src>
|
||||
<font-face-name
|
||||
name="EthnocentricRg-Regular" />
|
||||
</font-face-src>
|
||||
</font-face>
|
||||
</defs>
|
||||
<metadata
|
||||
id="metadata839"> Produced by OmniGraffle 7.12.1
|
||||
<dc:date>2018-03-14 13:37:44 +0000</dc:date>
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
transform="matrix(3.5262508,0,0,3.5262508,-159.40153,-655.56235)"
|
||||
stroke-opacity="1"
|
||||
stroke="none"
|
||||
stroke-dasharray="none"
|
||||
fill-opacity="1"
|
||||
fill="none"
|
||||
id="Canvas_2">
|
||||
<title
|
||||
id="title841">Canvas 2</title>
|
||||
<g
|
||||
id="Canvas_2: Layer 1">
|
||||
<title
|
||||
id="title843">Layer 1</title>
|
||||
<g
|
||||
id="Group_40">
|
||||
<g
|
||||
id="Graphic_39">
|
||||
<title
|
||||
id="title845">path6007</title>
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path847"
|
||||
stroke-width="3"
|
||||
stroke-linejoin="round"
|
||||
stroke-linecap="round"
|
||||
stroke="#009051"
|
||||
d="m 72.52062,328.5 h 225.5218 c 6.17355,0 11.1782,5.00465 11.1782,11.1782 v 0 c 0,6.17355 -5.00465,11.1782 -11.1782,11.1782 H 72.52062 c -6.17355,0 -11.1782,-5.00465 -11.1782,-11.1782 v 0 c 0,-6.17355 5.00465,-11.1782 11.1782,-11.1782 z" />
|
||||
</g>
|
||||
<g
|
||||
id="Graphic_38">
|
||||
<g
|
||||
style="fill:#009051"
|
||||
id="text852"
|
||||
transform="translate(54.656,222.125)"
|
||||
aria-label="HB">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path881"
|
||||
style="font-weight:400;font-size:96px;font-family:Ethnocentric;fill:#009051"
|
||||
d="M 84,91 H 64.224 V 66.232 H 26.016 V 91 H 6.048 V 26.776 H 26.016 V 49.528 H 64.224 V 26.776 H 84 Z" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path883"
|
||||
style="font-weight:400;font-size:96px;font-family:Ethnocentric;fill:#009051"
|
||||
d="m 168.7155,57.976 q 4.224,1.248 7.104,4.896 2.976,3.648 2.976,9.408 0,4.032 -1.248,7.488 -1.248,3.36 -4.224,5.856 -2.976,2.496 -8.064,3.936 -4.992,1.44 -12.576,1.44 H 96.2355 V 51.928 h 56.832 q 2.208,0 3.84,-0.864 1.728,-0.96 1.728,-3.456 0,-2.4 -1.728,-3.264 -1.728,-0.864 -3.84,-0.864 h -56.832 l 13.44,-16.704 h 42.528 q 5.76,0 10.368,1.152 4.704,1.056 7.968,3.36 3.36,2.208 5.088,5.568 1.824,3.264 1.824,7.68 0,2.88 -0.768,5.088 -0.768,2.208 -2.016,3.936 -1.152,1.632 -2.784,2.784 -1.536,1.056 -3.168,1.632 z m -52.512,7.68 v 8.832 h 36.576 q 3.264,0 4.704,-1.152 1.44,-1.152 1.44,-3.36 0,-2.112 -1.44,-3.168 -1.44,-1.152 -4.704,-1.152 z" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="Graphic_37">
|
||||
<g
|
||||
style="fill:#ff9300"
|
||||
id="text857"
|
||||
transform="translate(209.109,275)"
|
||||
aria-label="link">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path886"
|
||||
style="font-weight:400;font-size:48px;font-family:Ethnocentric;fill:#ff9300"
|
||||
d="M 3.024,45 Z M 37.824,36.744 31.392,45 H 3.024 V 12.888 h 9.936 v 23.856 z" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path888"
|
||||
style="font-weight:400;font-size:48px;font-family:Ethnocentric;fill:#ff9300"
|
||||
d="m 41.32425,45 z m 9.936,0 h -9.936 V 12.888 h 9.936 z" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path890"
|
||||
style="font-weight:400;font-size:48px;font-family:Ethnocentric;fill:#ff9300"
|
||||
d="m 57.34875,45 z m 32.688,0.528 q -0.96,0 -1.92,-0.336 -0.912,-0.288 -2.064,-1.392 l -19.68,-17.664 V 45 h -9.024 V 18.36 q 0,-1.584 0.432,-2.736 0.48,-1.152 1.2,-1.872 0.768,-0.72 1.728,-1.056 1.008,-0.336 2.064,-0.336 0.912,0 1.824,0.336 0.96,0.288 2.16,1.392 l 19.68,17.664 V 12.888 h 9.072 V 39.48 q 0,1.584 -0.48,2.736 -0.432,1.152 -1.2,1.92 -0.72,0.72 -1.728,1.056 -1.008,0.336 -2.064,0.336 z" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path892"
|
||||
style="font-weight:400;font-size:48px;font-family:Ethnocentric;fill:#ff9300"
|
||||
d="m 101.36775,45 z m 40.512,0 h -15.024 l -9.696,-8.448 q -2.496,-2.16 -3.84,-3.36 -1.296,-1.2 -2.112,-2.016 0.048,1.104 0.096,2.304 0.048,1.152 0.048,2.304 V 45 h -9.984 V 12.888 h 9.984 v 7.44 q 0,1.488 -0.048,2.928 -0.048,1.44 -0.144,2.688 0.96,-0.864 2.304,-2.112 1.392,-1.296 3.6,-3.12 l 9.264,-7.824 h 14.4 l -12.288,9.216 q -1.584,1.2 -2.832,2.112 -1.2,0.912 -2.16,1.584 -0.96,0.672 -1.776,1.2 -0.768,0.528 -1.536,1.008 1.392,0.96 3.36,2.4 1.968,1.44 5.088,3.984 z" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="Graphic_36">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 302.0625,336.9375 h 14.5771 v 6.1875 h -14.5771 z"
|
||||
style="fill:#ffffff"
|
||||
id="rect860" />
|
||||
</g>
|
||||
<g
|
||||
id="Graphic_35">
|
||||
<title
|
||||
id="title863">path6381</title>
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path865"
|
||||
stroke-width="3"
|
||||
stroke-linejoin="round"
|
||||
stroke-linecap="round"
|
||||
stroke="#ff9300"
|
||||
d="M 116.9282,340.3125 H 342.45 c 6.17355,0 11.1782,5.00465 11.1782,11.1782 v 0 c 0,6.17355 -5.00465,11.1782 -11.1782,11.1782 H 116.9282 c -6.17355,0 -11.1782,-5.00465 -11.1782,-11.1782 v 0 c 0,-6.17355 5.00465,-11.1782 11.1782,-11.1782 z" />
|
||||
</g>
|
||||
<g
|
||||
id="Graphic_34">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 99,347.625 h 14.5771 v 6.1875 H 99 Z"
|
||||
style="fill:#ffffff"
|
||||
id="rect868" />
|
||||
</g>
|
||||
<g
|
||||
id="Line_33">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M 93.9375,350.85641 H 120.375"
|
||||
style="stroke:#009051;stroke-width:3;stroke-linecap:round;stroke-linejoin:round"
|
||||
id="line871" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 9.1 KiB |
@ -551,7 +551,7 @@ class HBSYSTEM(DatagramProtocol):
|
||||
logger.warning('(%s) Ping from Radio ID that is not logged in: %s', self._system, int_id(_peer_id))
|
||||
|
||||
else:
|
||||
logger.error('(%s) Unrecognized command. Raw HBP PDU: %s', self._system, ahex(_data))
|
||||
logger.error('(%s) Unrecognized command. Raw HBP PDU: %s', self._system, _data)
|
||||
|
||||
# Aliased in __init__ to datagramReceived if system is a peer
|
||||
def peer_datagramReceived(self, _data, _sockaddr):
|
||||
|
106
hotspot_proxy.py
106
hotspot_proxy.py
@ -1,106 +0,0 @@
|
||||
from twisted.internet.protocol import DatagramProtocol
|
||||
from twisted.internet import reactor, task
|
||||
from time import time
|
||||
|
||||
|
||||
class Proxy(DatagramProtocol):
|
||||
|
||||
def __init__(self,ListenPort,connTrack,Timeout,Debug):
|
||||
self.connTrack = connTrack
|
||||
self.sourceTrack = {}
|
||||
self.timeout = Timeout
|
||||
self.debug = Debug
|
||||
|
||||
def datagramReceived(self, data, addr):
|
||||
host,port = addr
|
||||
|
||||
nowtime = time()
|
||||
|
||||
Debug = self.debug
|
||||
|
||||
#If the packet comes from the master
|
||||
if host == '127.0.0.1' and port in self.connTrack:
|
||||
if int(self.connTrack[port]['time'])+self.timeout >nowtime:
|
||||
self.transport.write(data,(self.connTrack[port]['host'],self.connTrack[port]['sport']))
|
||||
if Debug:
|
||||
print("return path match")
|
||||
print(data)
|
||||
elif self.sourceTrack[str(self.connTrack[port]['host'])+":"+str(self.connTrack[port]['sport']) in self.sourceTrack:
|
||||
del self.sourceTrack[str(self.connTrack[port]['host'])+":"+str(self.connTrack[port]['sport'])]
|
||||
return
|
||||
|
||||
#If we have a sourcetrack for this connect and thenowtimeout has not expired, forward to tracked port
|
||||
if host+":"+str(port) in self.sourceTrack and (int(self.sourceTrack[host+":"+str(port)]['time'])+self.timeout >nowtime):
|
||||
self.transport.write(data, ('127.0.0.1',self.sourceTrack[host+":"+str(port)]['dport']))
|
||||
self.connTrack[self.sourceTrack[host+":"+str(port)]['dport']]['time'] =nowtime
|
||||
self.sourceTrack[host+":"+str(port)]['time'] =nowtime
|
||||
if Debug:
|
||||
print("Tracked inbound match")
|
||||
print(data)
|
||||
return
|
||||
elif host+":"+str(port) in self.sourceTrack:
|
||||
del self.sourceTrack[host+":"+str(port)]
|
||||
|
||||
#Find free port to map for new connection
|
||||
for dport in self.connTrack:
|
||||
if (self.connTrack[dport]['time'] == False or (int(self.connTrack[dport]['time'])+self.timeout < nowtime)):
|
||||
self.connTrack[dport]['sport'] = port
|
||||
self.connTrack[dport]['host'] = host
|
||||
self.connTrack[dport]['time'] =nowtime
|
||||
self.sourceTrack[host+":"+str(port)] = {}
|
||||
self.sourceTrack[host+":"+str(port)]['dport'] = dport
|
||||
self.sourceTrack[host+":"+str(port)]['time'] = nowtime
|
||||
self.transport.write(data, ('127.0.0.1',dport))
|
||||
if Debug:
|
||||
print("New connection")
|
||||
print(data)
|
||||
return
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
#*** CONFIG HERE ***
|
||||
|
||||
ListenPort = 62031
|
||||
DestportStart = 54001
|
||||
DestPortEnd = 54002
|
||||
Timeout = 35
|
||||
Stats = True
|
||||
Debug = True
|
||||
|
||||
#*******************
|
||||
|
||||
|
||||
CONNTRACK = {}
|
||||
|
||||
for port in range(DestportStart,DestPortEnd,1):
|
||||
CONNTRACK[port] = {'host': False,'time': False,'sport':False, 'nacktime': False}
|
||||
|
||||
reactor.listenUDP(ListenPort,Proxy(ListenPort,CONNTRACK,Timeout,Debug))
|
||||
|
||||
def loopingErrHandle(failure):
|
||||
print('(GLOBAL) STOPPING REACTOR TO AVOID MEMORY LEAK: Unhandled error innowtimed loop.\n {}'.format(failure))
|
||||
reactor.stop()
|
||||
|
||||
def stats():
|
||||
count = 0
|
||||
nowtime = time()
|
||||
for port in CONNTRACK:
|
||||
if int(CONNTRACK[port]['time'])+Timeout > nowtime:
|
||||
count = count+1
|
||||
|
||||
totalPorts = DestPortEnd - DestportStart
|
||||
freePorts = totalPorts - count
|
||||
|
||||
print("{} ports out of {} in use ({} free)".format(count,totalPorts,freePorts))
|
||||
|
||||
|
||||
|
||||
if Stats == True:
|
||||
stats_task = task.LoopingCall(stats)
|
||||
statsa = stats_task.start(30)
|
||||
statsa.addErrback(loopingErrHandle)
|
||||
|
||||
reactor.run()
|
||||
|
@ -1,6 +1,9 @@
|
||||
'''
|
||||
THIS EXAMPLE WILL NOT WORK AS IT IS - YOU MUST SPECIFY YOUR OWN VALUES!!!
|
||||
|
||||
In FreeDMR, the rules file should be *empty* unless you have static routing required. Please see the
|
||||
documentation for more details.
|
||||
|
||||
This file is organized around the "Conference Bridges" that you wish to use. If you're a c-Bridge
|
||||
person, think of these as "bridge groups". You might also liken them to a "reflector". If a particular
|
||||
system is "ACTIVE" on a particular conference bridge, any traffid from that system will be sent
|
||||
@ -33,18 +36,7 @@ configuration file.
|
||||
'''
|
||||
|
||||
BRIDGES = {
|
||||
'WORLDWIDE': [
|
||||
{'SYSTEM': 'MASTER-1', 'TS': 1, 'TGID': 1, 'ACTIVE': True, 'TIMEOUT': 2, 'TO_TYPE': 'ON', 'ON': [2,], 'OFF': [9,10], 'RESET': []},
|
||||
{'SYSTEM': 'CLIENT-1', 'TS': 1, 'TGID': 3100, 'ACTIVE': True, 'TIMEOUT': 2, 'TO_TYPE': 'ON', 'ON': [2,], 'OFF': [9,10], 'RESET': []},
|
||||
],
|
||||
'ENGLISH': [
|
||||
{'SYSTEM': 'MASTER-1', 'TS': 1, 'TGID': 13, 'ACTIVE': True, 'TIMEOUT': 2, 'TO_TYPE': 'NONE', 'ON': [3,], 'OFF': [8,10], 'RESET': []},
|
||||
{'SYSTEM': 'CLIENT-2', 'TS': 1, 'TGID': 13, 'ACTIVE': True, 'TIMEOUT': 2, 'TO_TYPE': 'NONE', 'ON': [3,], 'OFF': [8,10], 'RESET': []},
|
||||
],
|
||||
'STATEWIDE': [
|
||||
{'SYSTEM': 'MASTER-1', 'TS': 2, 'TGID': 3129, 'ACTIVE': True, 'TIMEOUT': 2, 'TO_TYPE': 'NONE', 'ON': [4,], 'OFF': [7,10], 'RESET': []},
|
||||
{'SYSTEM': 'CLIENT-2', 'TS': 2, 'TGID': 3129, 'ACTIVE': True, 'TIMEOUT': 2, 'TO_TYPE': 'NONE', 'ON': [4,], 'OFF': [7,10], 'RESET': []},
|
||||
]
|
||||
|
||||
}
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
Loading…
Reference in New Issue
Block a user