2018-06-19 17:03:08 -04:00
|
|
|
###############################################################################
|
|
|
|
# Copyright (C) 2018 Cortney T. Buffington, N0MJS <n0mjs@me.com>
|
|
|
|
#
|
|
|
|
# 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, write to the Free Software Foundation,
|
|
|
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
|
###############################################################################
|
|
|
|
|
2018-02-13 19:59:44 -05:00
|
|
|
from dmr_utils.utils import int_id
|
|
|
|
|
|
|
|
# Lowest possible Subscirber and/or talkgroup IDs allowed by ETSI standard
|
|
|
|
ID_MIN = 1
|
|
|
|
ID_MAX = 16776415
|
|
|
|
|
|
|
|
|
|
|
|
# Checks the supplied ID against the ID given, and the ACL list, and the action
|
|
|
|
# Returns True if the ID should be allowed, False if it should not be
|
|
|
|
def acl_check(_id, _acl):
|
|
|
|
id = int_id(_id)
|
|
|
|
for entry in _acl[1]:
|
|
|
|
if entry[0] <= id <= entry[1]:
|
|
|
|
return _acl[0]
|
|
|
|
return not _acl[0]
|
|
|
|
|
|
|
|
|
|
|
|
def acl_build(_acl):
|
|
|
|
if not _acl:
|
|
|
|
return(True, set((ID_MIN, ID_MAX)))
|
|
|
|
|
|
|
|
acl = set()
|
|
|
|
sections = _acl.split(':')
|
|
|
|
|
|
|
|
if sections[0] == 'PERMIT':
|
|
|
|
action = True
|
|
|
|
else:
|
|
|
|
action = False
|
|
|
|
|
|
|
|
for entry in sections[1].split(','):
|
|
|
|
if entry == 'ALL':
|
|
|
|
acl.add((ID_MIN, ID_MAX))
|
|
|
|
break
|
|
|
|
|
|
|
|
elif '-' in entry:
|
|
|
|
start,end = entry.split('-')
|
|
|
|
start,end = int(start), int(end)
|
|
|
|
if (ID_MIN <= start <= ID_MAX) or (ID_MIN <= end <= ID_MAX):
|
|
|
|
acl.add((start, end))
|
|
|
|
else:
|
|
|
|
pass #logger message here
|
|
|
|
else:
|
|
|
|
id = int(entry)
|
2018-07-11 19:55:35 -04:00
|
|
|
if (ID_MIN <= id <= ID_MAX):
|
2018-02-13 19:59:44 -05:00
|
|
|
acl.add((id, id))
|
|
|
|
else:
|
|
|
|
pass #logger message here
|
|
|
|
|
|
|
|
return (action, acl)
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
from time import time
|
|
|
|
from pprint import pprint
|
|
|
|
|
|
|
|
ACL = {
|
|
|
|
'SUB': {
|
2018-06-19 17:03:08 -04:00
|
|
|
'K0USY': {
|
|
|
|
1: 'PERMIT:1-5,3120101,3120124',
|
|
|
|
2: 'DENY:1-5,3120101,3120124'
|
|
|
|
}
|
2018-02-13 19:59:44 -05:00
|
|
|
},
|
|
|
|
'TGID': {
|
2018-06-19 17:03:08 -04:00
|
|
|
'GLOBAL': {
|
|
|
|
1: 'PERMIT:ALL',
|
|
|
|
2: 'DENY:ALL'
|
|
|
|
},
|
|
|
|
'K0USY': {
|
|
|
|
1: 'PERMIT:1-5,3120,31201',
|
|
|
|
2: 'DENY:1-5,3120,31201'
|
|
|
|
}
|
2018-02-13 19:59:44 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for acl in ACL:
|
|
|
|
if 'GLOBAL' not in ACL[acl]:
|
2018-06-19 17:03:08 -04:00
|
|
|
ACL[acl].update({'GLOBAL': {1:'PERMIT:ALL',2:'PERMIT:ALL'}})
|
2018-02-13 19:59:44 -05:00
|
|
|
for acltype in ACL[acl]:
|
2018-06-19 17:03:08 -04:00
|
|
|
for slot in ACL[acl][acltype]:
|
|
|
|
ACL[acl][acltype][slot] = acl_build(ACL[acl][acltype][slot])
|
2018-02-13 19:59:44 -05:00
|
|
|
|
|
|
|
pprint(ACL)
|
|
|
|
print
|
|
|
|
|
2018-06-19 17:03:08 -04:00
|
|
|
print(acl_check('\x00\x00\x01', ACL['TGID']['GLOBAL'][1]))
|
|
|
|
print(acl_check('\x00\x00\x01', ACL['TGID']['K0USY'][2]))
|