]> git.mxchange.org Git - flightgear.git/blobdiff - utils/TerraSync/terrasync.py
Move terrasync.py to /scripts/python
[flightgear.git] / utils / TerraSync / terrasync.py
diff --git a/utils/TerraSync/terrasync.py b/utils/TerraSync/terrasync.py
deleted file mode 100755 (executable)
index a26d67e..0000000
+++ /dev/null
@@ -1,168 +0,0 @@
-#!/usr/bin/env python3
-# -*- coding: utf-8 -*-
-#
-# Copyright (C) 2016  Torsten Dreyer
-#
-# 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 2 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.
-#
-# terrasync.py - synchronize terrascenery data to your local disk
-# needs dnspython (pip install dnspython)
-#
-# this is a terrible stub, please improve
-
-import os 
-import hashlib
-import urllib.request
-
-dirindex = ".dirindex"
-DIRINDEXVERSION = 1
-
-URL="automatic"
-TARGET="."
-
-########################################################################
-
-def fn_hash_of_file(fname):
-    hash = hashlib.sha1()
-    try:
-        with open(fname, "rb") as f:
-            for chunk in iter(lambda: f.read(4096), b""):
-                hash.update(chunk)
-    except:
-        pass
-
-    return hash.hexdigest()
-
-########################################################################
-def do_download_file( _url, _path, _localfile, _hash ):
-  if os.path.exists( _localfile ):
-    h = fn_hash_of_file(_localfile)
-    if h == _hash:
-      print("hash match for ", _localfile)
-      return
-
-  r = urllib.request.urlopen( _url + _path )
-  f = open(_localfile, 'wb')
-  f.write( r.read() )
-  f.close()
-  print("downloaded ", _localfile, " from ", _url + _path )
-
-########################################################################
-def do_terrasync( _url, _path, _localdir ):
-  url = _url + _path
-  print("syncing ",url, " to ", _localdir )
-
-  if not os.path.exists( _localdir ):
-    os.makedirs( _localdir )
-
-  try:
-    for line in urllib.request.urlopen(url + "/.dirindex").readlines():
-      tokens = line.decode("utf-8").rstrip().split(':')
-      if( len(tokens) == 0 ):
-        continue
-
-      # TODO: check version number, should be equal to DIRINDEXVERSION
-      #       otherwise complain and terminate
-      if( tokens[0] == "version" ):
-        continue
-
-      if( tokens[0] == "path" ):
-        continue
-
-      if( tokens[0] == "d" ):
-        do_terrasync( url,  "/" + tokens[1], os.path.join(_localdir,tokens[1] ) )
-
-      if( tokens[0] == "f" ):
-        do_download_file( url, "/" + tokens[1], os.path.join(_localdir,tokens[1]), tokens[2] )
-
-  except urllib.error.HTTPError as err:
-    if err.code == 404 and _path == "":
-      # HACK: only the master on SF provides .dirindex for root, fake it if it's missing
-      print("Using static root hack.")
-      if not _url.startswith("http://flightgear.sourceforge.net/scenery") and _path == "":
-        for _sub in ("Models", "Terrain", "Objects", "Airports" ):
-          do_terrasync( _url, "/" + _sub, os.path.join(_localdir,_sub) )
-        return
-
-    else:
-      raise
-  #TODO: cleanup orphan files
-
-########################################################################
-
-import getopt, sys, random, re
-
-try:
-  opts, args = getopt.getopt(sys.argv[1:], "u:t:", [ "url=", "target=" ])
-
-except getopt.GetoptError:
-  print("terrasync.py [--url=http://some.server.org/scenery] [--target=/some/path]")
-  sys.exit(2)
-
-for opt, arg in opts:
-  if opt in( "-u", "--url"):
-    URL = arg
-
-  elif opt in ( "-t", "--target"):
-    TARGET= arg
-
-# automatic URL lookup from DNS NAPTR
-# - lookup terrasync.flightgear.org, type=NAPTR, service="ws20", flags="U"
-# - sort by order,preference ascending
-# - pick entries with lowest order and preference
-# - randomly pick one of those
-# - use regexp fields URL
-if URL == "automatic":
-  import dns.resolver
-  dnsResolver = dns.resolver.Resolver()
-
-  order = -1
-  preference = -1
-
-  # find lowes preference/order for service 'ws20' and flags 'U'
-  dnsAnswer = dnsResolver.query("terrasync.flightgear.org", "NAPTR" )
-  for naptr in dnsAnswer:
-    if naptr.service != b'ws20' or naptr.flags != b'U':
-      continue
-
-    if order == -1 or naptr.order < order:
-      order = naptr.order
-      preference = naptr.preference
-
-    if order == naptr.order:
-      if naptr.preference < preference:
-        preference = naptr.preference
-
-
-  # grab candidats
-  candidates = []
-  for naptr in dnsAnswer:
-    if naptr.service != b'ws20' or naptr.flags != b'U' or naptr.preference != preference or naptr.order != order:
-      continue
-
-    candidates.append( naptr.regexp.decode('utf-8') )
-
-  if not candidates:
-    print("sorry, no terrascenery URLs found. You may specify one with --url=http://some.url.org/foo")
-    sys.exit(3)
-
-  _url  = random.choice(candidates)
-  _subst = _url.split(_url[0]) # split string, first character is separator <sep>regex<sep>replacement<sep>
-  URL = re.sub(_subst[1], _subst[2], "" ) # apply regex substitude on empty string
-
-print( "terrasyncing from ", URL, "to ", TARGET )
-do_terrasync( URL, "", TARGET )
-
-########################################################################