Several updates:
- Implemented option to translate sitecode to domainname. - Added filter: Skip nodes if they are already in the target domain. - Several minor changes.
This commit is contained in:
parent
0632593675
commit
8d4021f122
|
@ -45,10 +45,19 @@ class NodeHierarchy(object):
|
|||
for nodeID, nodeValue in self.__hopglass.nodes.items():
|
||||
if nodeValue['nodeinfo']['node_id']:
|
||||
print('Create Node object #',len(nodes), '\r',end = '')
|
||||
nodes[nodeID] = Node(nodeValue)
|
||||
nodes[nodeID] = Node(self.__prepareNodeData__(nodeValue))
|
||||
print('')
|
||||
return nodes
|
||||
|
||||
def __prepareNodeData__(self, nodeValue):
|
||||
if self.__args__.site_to_target_prefix:
|
||||
pref = self.__args__.site_to_target_prefix.split(',')
|
||||
try:
|
||||
nodeValue['nodeinfo']['system']['site_code'] = nodeValue['nodeinfo']['system']['site_code'].replace(pref[0],pref[1])
|
||||
except:
|
||||
pass
|
||||
return nodeValue
|
||||
|
||||
def __createLinkObjects__(self):
|
||||
links = []
|
||||
for linkParID, linkPar in self.__hopglass.links.items():
|
||||
|
@ -67,9 +76,10 @@ class NodeHierarchy(object):
|
|||
parser.add_argument('-r', '--raw-json', required=False, default='https://karte.freifunk-muensterland.de/data/raw.json', help='Location of raw.json file (can be local folder or remote URL).')
|
||||
parser.add_argument('-s', '--shapes-path', required=False, default='https://freifunk-muensterland.de/md-fw-dl/shapes/', help='Path of shapefiles (can be local folder or remote URL).')
|
||||
parser.add_argument('-t', '--targets', nargs='+', required=True, help='List of targets which should be proceeded. Example: -t citya cityb ...')
|
||||
parser.add_argument('-sttp', '--site-to-target-prefix', required=False, help='Used to match site and target also when prefixes are different. Example: -sttp "ffmsd,domaene"')
|
||||
parser.add_argument('-o', '--out-file', default='./webserver-configuration', required=False, help='Filename where the generated Output should stored.')
|
||||
parser.add_argument('-v', '--debug', required=False, action='store_true', help='Enable debugging output.')
|
||||
parser.add_argument('-f', '--filters', nargs='*', required=False, choices=('exclude_clouds_with_lan_links', 'no_lan'), help='Filter out nodes and local clouds based on filter rules.')
|
||||
parser.add_argument('-f', '--filters', nargs='*', required=False, choices=('exclude_clouds_with_lan_links', 'no_lan', 'domain_transitions_only'), help='Filter out nodes and local clouds based on filter rules.')
|
||||
parser.add_argument('-i', '--info', nargs='*', required=False, choices=('get_offline_nodes','offline'), help='Get infos about the graph, links and nodes.')
|
||||
parser.add_argument('-if', '--info-filters', nargs='*', required=False, help='Filter info results. Currently supported: min_age:TIME_RANGE, max_age:TIME_RANGE. Examples: -if min_age:1d max_age:2w')
|
||||
parser.add_argument('-iop', '--info-out-path', required=False, default='./', help='Folder where info files should be written. Default: ./')
|
||||
|
|
16
README.md
16
README.md
|
@ -29,8 +29,9 @@ Die Hilfe liefert folgendes:
|
|||
```
|
||||
$ ./NodeHierarchy.py --help
|
||||
usage: NodeHierarchy.py [-h] [-r RAW_JSON] [-s SHAPES_PATH] -t TARGETS
|
||||
[TARGETS ...] [-o OUT_FILE] [-v]
|
||||
[-f [{exclude_clouds_with_lan_links,no_lan} [{exclude_clouds_with_lan_links,no_lan} ...]]]
|
||||
[TARGETS ...] [-sttp SITE_TO_TARGET_PREFIX]
|
||||
[-o OUT_FILE] [-v]
|
||||
[-f [{exclude_clouds_with_lan_links,no_lan,domain_transitions_only} [{exclude_clouds_with_lan_links,no_lan,domain_transitions_only} ...]]]
|
||||
[-i [{get_offline_nodes,offline} [{get_offline_nodes,offline} ...]]]
|
||||
[-if [INFO_FILTERS [INFO_FILTERS ...]]]
|
||||
[-iop INFO_OUT_PATH]
|
||||
|
@ -43,18 +44,20 @@ optional arguments:
|
|||
-h, --help show this help message and exit
|
||||
-r RAW_JSON, --raw-json RAW_JSON
|
||||
Location of raw.json file (can be local folder or
|
||||
remote URL). Default: https://karte.freifunk-
|
||||
muensterland.de/data/raw.json
|
||||
remote URL).
|
||||
-s SHAPES_PATH, --shapes-path SHAPES_PATH
|
||||
Path of shapefiles (can be local folder or remote
|
||||
URL).
|
||||
-t TARGETS [TARGETS ...], --targets TARGETS [TARGETS ...]
|
||||
List of targets which should be proceeded. Example: -t
|
||||
citya cityb ...
|
||||
-sttp SITE_TO_TARGET_PREFIX, --site-to-target-prefix SITE_TO_TARGET_PREFIX
|
||||
Used to match site and target also when prefixes are
|
||||
different. Example: -sttp "ffmsd,domaene"
|
||||
-o OUT_FILE, --out-file OUT_FILE
|
||||
Filename where the generated Output should stored.
|
||||
-v, --debug Enable debugging output.
|
||||
-f [{exclude_clouds_with_lan_links,no_lan} [{exclude_clouds_with_lan_links,no_lan} ...]], --filters [{exclude_clouds_with_lan_links,no_lan} [{exclude_clouds_with_lan_links,no_lan} ...]]
|
||||
-f [{exclude_clouds_with_lan_links,no_lan,domain_transitions_only} [{exclude_clouds_with_lan_links,no_lan,domain_transitions_only} ...]], --filters [{exclude_clouds_with_lan_links,no_lan,domain_transitions_only} [{exclude_clouds_with_lan_links,no_lan,domain_transitions_only} ...]]
|
||||
Filter out nodes and local clouds based on filter
|
||||
rules.
|
||||
-i [{get_offline_nodes,offline} [{get_offline_nodes,offline} ...]], --info [{get_offline_nodes,offline} [{get_offline_nodes,offline} ...]]
|
||||
|
@ -90,7 +93,8 @@ Weitere Filterungen lassen sich über das ``--filters`` Attribut aktivieren.
|
|||
|
||||
Folgende Filter sind derzeit implementiert (zukünftig folgen noch weitere):
|
||||
|
||||
- ``exclude_clouds_with_lan_links`` bzw. ``no_lan`` Filtert alle lokalen Wolken aus, in denen sich mindestens ein Mesh-on-LAN Link befindet
|
||||
- ``exclude_clouds_with_lan_links`` bzw. ``no_lan`` filtert alle lokalen Wolken aus, in denen sich mindestens ein Mesh-on-LAN Link befindet
|
||||
- ``domain_transitions_only`` filtert alle Knoten aus, die sich bereits in der richtigen Domäne befinden / die Firmware der richtigen Domäne besitzen
|
||||
|
||||
|
||||
## Nginx Konfiguration
|
||||
|
|
|
@ -10,7 +10,7 @@ class NodeInit(object):
|
|||
self.autoupdaterBranch = self.__getBranch__()
|
||||
self.isOnline = self.__jsonObject__['nodeinfo']['isOnline']
|
||||
self.publicIPv6Addresses = self.__getPublicAddresses__()
|
||||
self.domID = self.__getSiteCode__()
|
||||
self.domName = self.__getSiteCode__()
|
||||
|
||||
def __getInterfaces__(self):
|
||||
try:
|
||||
|
@ -31,19 +31,22 @@ class NodeInit(object):
|
|||
return None
|
||||
|
||||
def __getGeo__(self):
|
||||
geo = {}
|
||||
if 'location' in self.__jsonObject__['nodeinfo'] and 'latitude' in self.__jsonObject__['nodeinfo']['location'] and 'longitude' in self.__jsonObject__['nodeinfo']['location']:
|
||||
geo['lat'] = self.__jsonObject__['nodeinfo']['location']['latitude']
|
||||
geo['lon'] = self.__jsonObject__['nodeinfo']['location']['longitude']
|
||||
return geo
|
||||
try:
|
||||
return {
|
||||
'lat' : self.__jsonObject__['nodeinfo']['location']['latitude'],
|
||||
'lon' : self.__jsonObject__['nodeinfo']['location']['longitude']
|
||||
}
|
||||
except:
|
||||
return None
|
||||
|
||||
def __getPublicAddresses__(self):
|
||||
addresses = []
|
||||
if 'addresses' in self.__jsonObject__['nodeinfo']['network']:
|
||||
try:
|
||||
for address in self.__jsonObject__['nodeinfo']['network']['addresses']:
|
||||
if not address.startswith('fe80'):
|
||||
addresses.append(address)
|
||||
except:
|
||||
pass
|
||||
return addresses
|
||||
|
||||
def __getSiteCode__(self):
|
||||
|
|
|
@ -3,7 +3,7 @@ class Filter(object):
|
|||
self.__args__ = args
|
||||
self.__filters__ = self.__getFilters()
|
||||
|
||||
def filterLocalGraphs(self, localGraphs):
|
||||
def filterLocalGraphs(self, domain, localGraphs):
|
||||
filteredGraphs = []
|
||||
for localGraph in localGraphs:
|
||||
if localGraph.isAutoupdaterEnabledOnAllNodes() == False:
|
||||
|
@ -21,8 +21,14 @@ class Filter(object):
|
|||
def __getFilters(self):
|
||||
return [] if self.__args__.filters == None else self.__args__.filters
|
||||
|
||||
def filterNodes(self, nodes):
|
||||
def filterNodes(self, domain, nodes):
|
||||
filteredNodes = []
|
||||
for node in nodes:
|
||||
if 'domain_transitions_only' in self.__filters__:
|
||||
try:
|
||||
if domain.name == node.domName:
|
||||
continue
|
||||
except:
|
||||
pass
|
||||
filteredNodes.append(node)
|
||||
return filteredNodes
|
||||
|
|
|
@ -17,9 +17,9 @@ class NginxConfGen(object):
|
|||
|
||||
def __genDomain__(self, domain):
|
||||
nodes = {}
|
||||
for localGraph in self.__filter__.filterLocalGraphs(domain.localGraphs):
|
||||
for localGraph in self.__filter__.filterLocalGraphs(domain, domain.localGraphs):
|
||||
try:
|
||||
for node in self.__filter__.filterNodes(localGraph.getNodesWithNoDependencies()):
|
||||
for node in self.__filter__.filterNodes(domain, localGraph.getNodesWithNoDependencies()):
|
||||
nodes[node.nodeID] = {
|
||||
'hostname' : node.hostname,
|
||||
'ipv6_addresses' : node.publicIPv6Addresses
|
||||
|
|
Loading…
Reference in a new issue