def write_xml_modules(name, tree = None): fo = open(name, 'w') version = grass.version()['version'].split('.')[0] fo.write('<?xml version="1.0" encoding="UTF-8"?>\n') fo.write('<!DOCTYPE task SYSTEM "grass-addons.dtd">\n') fo.write('<addons version="%s">\n' % version) if tree is not None: for tnode in tree.findall('task'): indent = 4 fo.write('%s<task name="%s">\n' % (' ' * indent, tnode.get('name'))) indent += 4 fo.write('%s<description>%s</description>\n' % \ (' ' * indent, tnode.find('description').text)) fo.write('%s<keywords>%s</keywords>\n' % \ (' ' * indent, tnode.find('keywords').text)) bnode = tnode.find('binary') if bnode is not None: fo.write('%s<binary>\n' % (' ' * indent)) indent += 4 for fnode in bnode.findall('file'): fpath = fnode.text.split(os.path.sep) if fpath[0] == 'man' and sys.platform == 'win32': # no manual pages on MS Windows continue if not flags['s']: # tidy citizen hacks if fpath[0] in ('bin', 'scripts'): del fpath[0] if fpath[0] == 'man': fpath.insert(0, 'docs') fo.write('%s<file>%s</file>\n' % \ (' ' * indent, os.path.join(options['prefix'], os.path.sep.join(fpath)))) if sys.platform == 'win32' and os.path.splitext(fpath[-1])[1] == '.bat': spath = fpath[:-1] + [os.path.splitext(fpath[-1])[0]] fo.write('%s<file>%s</file>\n' % \ (' ' * indent, os.path.join(options['prefix'], os.path.sep.join(spath)))) indent -= 4 fo.write('%s</binary>\n' % (' ' * indent)) libgisRev = grass.version()['libgis_revision'] fo.write('%s<libgis revision="%s" />\n' % \ (' ' * indent, libgisRev)) indent -= 4 fo.write('%s</task>\n' % (' ' * indent)) fo.write('</addons>\n') fo.close()
def install_extension_win(): ### TODO: do not use hardcoded url - http://wingrass.fsv.cvut.cz/grassXX/addonsX.X.X version = grass.version()['version'].split('.') grass.message(_("Downloading precompiled GRASS Addons <%s>...") % options['extension']) url = "http://wingrass.fsv.cvut.cz/grass%s%s/addons" % (version[0], version[1]) if version[0] == '6' and version[1] == '4': url += '/grass-%s.%s.%s' % (version[0], version[1], version[2]) grass.debug("url=%s" % url, 1) try: f = urlopen(url + '/' + options['extension'] + '.zip') # create addons dir if not exists if not os.path.exists(options['prefix']): os.mkdir(options['prefix']) # download data fo = tempfile.TemporaryFile() fo.write(f.read()) zfobj = zipfile.ZipFile(fo) for name in zfobj.namelist(): if name.endswith('/'): d = os.path.join(options['prefix'], name) if not os.path.exists(d): os.mkdir(d) else: outfile = open(os.path.join(options['prefix'], name), 'wb') outfile.write(zfobj.read(name)) outfile.close() fo.close() except HTTPError: grass.fatal(_("GRASS Addons <%s> not found") % options['extension']) return 0
def start_browser(entry): if browser and \ browser not in ('xdg-open', 'start') and \ not grass.find_program(browser): grass.fatal(_("Browser '%s' not found") % browser) if flags['o']: major,minor,patch = grass.version()['version'].split('.') url_path = 'http://grass.osgeo.org/grass%s%s/manuals/%s.html' % (major,minor,entry) if urllib.urlopen(url_path).getcode() != 200: url_path = 'http://grass.osgeo.org/grass%s%s/manuals/addons/%s.html' % (major,minor,entry) else: path = os.path.join(gisbase, 'docs', 'html', entry + '.html') if not os.path.exists(path) and os.getenv('GRASS_ADDON_BASE'): path = os.path.join(os.getenv('GRASS_ADDON_BASE'), 'docs', 'html', entry + '.html') if not os.path.exists(path): grass.fatal(_("No HTML manual page entry for '%s'") % entry) url_path = 'file://' + path if browser and browser not in ('xdg-open', 'start'): webbrowser.register(browser_name, None) grass.verbose(_("Starting browser '%(browser)s' for manual" " entry '%(entry)s'...") % \ dict(browser=browser_name, entry=entry)) try: webbrowser.open(url_path) except: grass.fatal(_("Error starting browser '%(browser)s' for HTML file" " '%(path)s'") % dict(browser=browser, path=path))
def list_available_extensions(): mlist = list() # try to download XML metadata file first url = "http://grass.osgeo.org/addons/grass%s/modules.xml" % grass.version()['version'].split('.')[0] grass.debug("url=%s" % url, 1) try: f = urlopen(url) try: tree = etree.fromstring(f.read()) except: grass.warning(_("Unable to parse '%s'. Trying to scan SVN (may take some time)...") % url) list_available_extensions_svn() return for mnode in tree.findall('task'): name = mnode.get('name') if flags['c'] or flags['g']: desc, keyw = get_optional_params(mnode) if flags['g']: print 'name=' + name print 'description=' + desc print 'keywords=' + keyw elif flags['c']: print name + ' - ' + desc else: print name except HTTPError: return list_available_extensions_svn() return mlist
def write_xml_modules(name, tree = None): fo = open(name, 'w') fo.write('<?xml version="1.0" encoding="UTF-8"?>\n') fo.write('<!DOCTYPE task SYSTEM "grass-addons.dtd">\n') fo.write('<addons version="%s">\n' % version[0]) libgisRev = grass.version()['libgis_revision'] if tree is not None: for tnode in tree.findall('task'): indent = 4 fo.write('%s<task name="%s">\n' % (' ' * indent, tnode.get('name'))) indent += 4 fo.write('%s<description>%s</description>\n' % \ (' ' * indent, tnode.find('description').text)) fo.write('%s<keywords>%s</keywords>\n' % \ (' ' * indent, tnode.find('keywords').text)) bnode = tnode.find('binary') if bnode is not None: fo.write('%s<binary>\n' % (' ' * indent)) indent += 4 for fnode in bnode.findall('file'): fo.write('%s<file>%s</file>\n' % \ (' ' * indent, os.path.join(options['prefix'], fnode.text))) indent -= 4 fo.write('%s</binary>\n' % (' ' * indent)) fo.write('%s<libgis revision="%s" />\n' % \ (' ' * indent, libgisRev)) indent -= 4 fo.write('%s</task>\n' % (' ' * indent)) fo.write('</addons>\n') fo.close()
def main(): # check dependecies if sys.platform != "win32": check_progs() # define path if flags['s']: options['prefix'] = os.environ['GISBASE'] if options['prefix'] == '$GRASS_ADDON_PATH': if not os.environ.has_key('GRASS_ADDON_PATH') or \ not os.environ['GRASS_ADDON_PATH']: major_version = int(grass.version()['version'].split('.', 1)[0]) grass.warning(_("GRASS_ADDON_PATH is not defined, " "installing to ~/.grass%d/addons/") % major_version) options['prefix'] = os.path.join(os.environ['HOME'], '.grass%d' % major_version, 'addons') else: path_list = os.environ['GRASS_ADDON_PATH'].split(os.pathsep) if len(path_list) < 1: grass.fatal(_("Invalid GRASS_ADDON_PATH value - '%s'") % os.environ['GRASS_ADDON_PATH']) if len(path_list) > 1: grass.warning(_("GRASS_ADDON_PATH has more items, using first defined - '%s'") % path_list[0]) options['prefix'] = path_list[0] # list available modules if flags['l'] or flags['c'] or flags['g']: list_available_extensions() return 0 elif flags['a']: elist = get_installed_extensions() if elist: grass.message(_("List of installed extensions:")) sys.stdout.write('\n'.join(elist)) sys.stdout.write('\n') else: grass.info(_("No extension installed")) return 0 else: if not options['extension']: grass.fatal(_('You need to define an extension name or use -l')) if flags['d']: if options['operation'] != 'add': grass.warning(_("Flag 'd' is relevant only to 'operation=add'. Ignoring this flag.")) else: global remove_tmpdir remove_tmpdir = False if options['operation'] == 'add': check_dirs() install_extension() else: # remove remove_extension(flags['f']) return 0
def SetAddOnPath(addonPath = None): """!Set default AddOn path @addonPath path to addons (None for default) """ gVersion = grass.version()['version'].split('.', 1)[0] # update env file if not addonPath: if sys.platform != 'win32': addonPath = os.path.join(os.path.join(os.getenv('HOME'), '.grass%s' % gVersion, 'addons')) else: addonPath = os.path.join(os.path.join(os.getenv('APPDATA'), 'GRASS%s' % gVersion, 'addons')) StoreEnvVariable('GRASS_ADDON_PATH', addonPath) os.environ['GRASS_ADDON_PATH'] = addonPath
def StoreEnvVariable(key, value = None, envFile = None): """!Store environmental variable If value is not given (is None) then environmental variable is unset. @param key env key @param value env value @param envFile path to the environmental file (None for default location) """ windows = sys.platform == 'win32' if not envFile: if not windows: envFile = os.path.join(os.getenv('HOME'), '.grass.bashrc') else: gVersion = grass.version()['version'].split('.', 1)[0] envFile = os.path.join(os.getenv('APPDATA'), 'GRASS%s' % gVersion, 'env.bat') # read env file environ = dict() lineSkipped = list() if os.path.exists(envFile): try: fd = open(envFile) except IOError, e: sys.stderr.write(_("Unable to open file '%s'\n") % envFile) return for line in fd.readlines(): line = line.rstrip(os.linesep) try: k, v = map(lambda x: x.strip(), line.split(' ', 1)[1].split('=', 1)) except StandardError, e: sys.stderr.write(_("%(env)s: line skipped - unable to parse " "Reason: %(e)s\n") % {'env': envFile, 'line': line, 'e': e}) lineSkipped.append(line) continue if k in environ: sys.stderr.write(_("Duplicated key: %s\n") % k) environ[k] = v
def SetAddOnPath(addonPath=None, key='PATH'): """Set default AddOn path :param addonPath: path to addons (None for default) :param key: env key - 'PATH' or 'BASE' """ gVersion = grass.version()['version'].split('.', 1)[0] # update env file if not addonPath: if sys.platform != 'win32': addonPath = os.path.join(os.path.join(os.getenv('HOME'), '.grass%s' % gVersion, 'addons')) else: addonPath = os.path.join(os.path.join(os.getenv('APPDATA'), 'GRASS%s' % gVersion, 'addons')) StoreEnvVariable(key='GRASS_ADDON_' + key, value=addonPath) os.environ['GRASS_ADDON_' + key] = addonPath # update path if addonPath not in os.environ['PATH']: os.environ['PATH'] = addonPath + os.pathsep + os.environ['PATH']
def install_extension_xml(): # read metadata from remote server url = "http://grass.osgeo.org/addons/grass%s/modules.xml" % grass.version()['version'].split('.')[0] data = None try: f = urlopen(url) try: tree = etree.fromstring(f.read()) except: grass.warning(_("Unable to parse '%s'. Metadata file not updated.") % url) return for mnode in tree.findall('task'): name = mnode.get('name') if name != options['extension']: continue fList = list() bnode = mnode.find('binary') windows = sys.platform == 'win32' if bnode is not None: for fnode in bnode.findall('file'): path = fnode.text.split('/') if windows: if path[0] == 'bin': path[-1] += '.exe' if path[0] == 'scripts': path[-1] += '.bat' fList.append(os.path.sep.join(path)) desc, keyw = get_optional_params(mnode) data = { 'name' : name, 'desc' : desc, 'keyw' : keyw, 'files' : fList, } except HTTPError: grass.error(_("Unable to read metadata file from the remote server")) if not data: grass.warning(_("No metadata available")) return fXML = os.path.join(options['prefix'], 'modules.xml') # create an empty file if not exists if not os.path.exists(fXML): write_xml_modules(fXML) # read XML file fo = open(fXML, 'r') tree = etree.fromstring(fo.read()) fo.close() # update tree tnode = None for node in tree.findall('task'): if node.get('name') == options['extension']: tnode = node break if tnode is not None: # update existing node dnode = tnode.find('description') if dnode is not None: dnode.text = data['desc'] knode = tnode.find('keywords') if knode is not None: knode.text = data['keyw'] bnode = tnode.find('binary') if bnode is not None: tnode.remove(bnode) bnode = etree.Element('binary') for f in data['files']: fnode = etree.Element('file') fnode.text = f bnode.append(fnode) tnode.append(bnode) else: # create new node for task tnode = etree.Element('task', attrib = { 'name' : data['name'] }) dnode = etree.Element('description') dnode.text = data['desc'] tnode.append(dnode) knode = etree.Element('keywords') knode.text = data['keyw'] tnode.append(knode) bnode = etree.Element('binary') for f in data['files']: fnode = etree.Element('file') fnode.text = f bnode.append(fnode) tnode.append(bnode) tree.append(tnode) write_xml_modules(fXML, tree)
def StoreEnvVariable(key, value=None, envFile=None): """Store environmental variable If value is not given (is None) then environmental variable is unset. :param key: env key :param value: env value :param envFile: path to the environmental file (None for default location) """ windows = sys.platform == 'win32' if not envFile: gVersion = grass.version()['version'].split('.', 1)[0] if not windows: envFile = os.path.join( os.getenv('HOME'), '.grass%s' % gVersion, 'bashrc') else: envFile = os.path.join( os.getenv('APPDATA'), 'GRASS%s' % gVersion, 'env.bat') # read env file environ = dict() lineSkipped = list() if os.path.exists(envFile): try: fd = open(envFile) except IOError as e: sys.stderr.write(_("Unable to open file '%s'\n") % envFile) return for line in fd.readlines(): line = line.rstrip(os.linesep) try: k, v = map( lambda x: x.strip(), line.split( ' ', 1)[1].split( '=', 1)) except Exception as e: sys.stderr.write(_("%s: line skipped - unable to parse '%s'\n" "Reason: %s\n") % (envFile, line, e)) lineSkipped.append(line) continue if k in environ: sys.stderr.write(_("Duplicated key: %s\n") % k) environ[k] = v fd.close() # update environmental variables if value is None: if key in environ: del environ[key] else: environ[key] = value # write update env file try: fd = open(envFile, 'w') except IOError as e: sys.stderr.write(_("Unable to create file '%s'\n") % envFile) return if windows: expCmd = 'set' else: expCmd = 'export' for key, value in environ.iteritems(): fd.write('%s %s=%s\n' % (expCmd, key, value)) # write also skipped lines for line in lineSkipped: fd.write(line + os.linesep) fd.close()
def StoreEnvVariable(key, value=None, envFile=None): """Store environmental variable If value is not given (is None) then environmental variable is unset. :param key: env key :param value: env value :param envFile: path to the environmental file (None for default location) """ windows = sys.platform == 'win32' if not envFile: gVersion = grass.version()['version'].split('.', 1)[0] if not windows: envFile = os.path.join( os.getenv('HOME'), '.grass%s' % gVersion, 'bashrc') else: envFile = os.path.join( os.getenv('APPDATA'), 'GRASS%s' % gVersion, 'env.bat') # read env file environ = dict() lineSkipped = list() if os.path.exists(envFile): try: fd = open(envFile) except IOError as e: sys.stderr.write(_("Unable to open file '%s'\n") % envFile) return for line in fd.readlines(): line = line.rstrip(os.linesep) try: k, v = map( lambda x: x.strip(), line.split( ' ', 1)[1].split( '=', 1)) except Exception as e: sys.stderr.write(_("%s: line skipped - unable to parse '%s'\n" "Reason: %s\n") % (envFile, line, e)) lineSkipped.append(line) continue if k in environ: sys.stderr.write(_("Duplicated key: %s\n") % k) environ[k] = v fd.close() # update environmental variables if value is None: if key in environ: del environ[key] else: environ[key] = value # write update env file try: fd = open(envFile, 'w') except IOError as e: sys.stderr.write(_("Unable to create file '%s'\n") % envFile) return if windows: expCmd = 'set' else: expCmd = 'export' for key, value in six.iteritems(environ): fd.write('%s %s=%s\n' % (expCmd, key, value)) # write also skipped lines for line in lineSkipped: fd.write(line + os.linesep) fd.close()
grass.info(_("No extension (toolbox) installed")) else: grass.info(_("No extension (module) installed")) return 0 else: if not options['extension']: grass.fatal(_('You need to define an extension name or use -l/c/g/a')) if flags['d']: if options['operation'] != 'add': grass.warning(_("Flag 'd' is relevant only to 'operation=add'. Ignoring this flag.")) else: global REMOVE_TMPDIR REMOVE_TMPDIR = False if options['operation'] == 'add': check_dirs() install_extension(xmlurl) else: # remove remove_extension(flags['f']) return 0 if __name__ == "__main__": options, flags = grass.parser() global TMPDIR TMPDIR = tempfile.mkdtemp() atexit.register(cleanup) version = grass.version()['version'].split('.') sys.exit(main())
def is_grass_7(): if core.version()['version'].split('.')[0] == '7': return True return False
sys.path.insert(0, os.path.abspath(os.path.join(os.environ["GISBASE"], "etc", "python", "grass", "pygrass"))) sys.path.insert(0, os.path.abspath(os.path.join(os.environ["GISBASE"], "etc", "python", "grass", "script"))) sys.path.insert(0, os.path.abspath(os.path.join(os.environ["GISBASE"], "etc", "python", "grass", "temporal"))) from grass.script import core footer_tmpl = string.Template( r""" {% block footer %}<hr class="header"> <p><a href="../index.html">Help Index</a> | <a href="../topics.html">Topics Index</a> | <a href="../keywords.html">Keywords Index</a> | <a href="../full_index.html">Full Index</a></p> <p>© 2003-${year} <a href="http://grass.osgeo.org">GRASS Development Team</a>, GRASS GIS ${grass_version} Reference Manual</p> {% endblock %} """ ) grass_version = core.version()["version"] today = date.today() copy("_templates/layout.html.template", "_templates/layout.html") with open("_templates/layout.html", "a+b") as f: f.write(footer_tmpl.substitute(grass_version=grass_version, year=today.year)) f.close() # -- General configuration ----------------------------------------------------- # If your documentation needs a minimal Sphinx version, state it here. # needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones.
# documentation root, use os.path.abspath to make it absolute, like shown here. if not os.getenv('GISBASE'): sys.exit("GISBASE not defined") sys.path.insert(0, os.path.abspath(os.path.join(os.environ['GISBASE'], 'etc', 'python', 'grass'))) from grass.script import core footer_tmpl = string.Template(\ r""" {% block footer %}<hr class="header"> <p><a href="../index.html">Help Index</a> | <a href="../topics.html">Topics Index</a> | <a href="../keywords.html">Keywords Index</a> | <a href="../full_index.html">Full Index</a></p> <p>© 2003-${year} <a href="http://grass.osgeo.org">GRASS Development Team</a>, GRASS GIS ${grass_version} Reference Manual</p> {% endblock %} """) grass_version = core.version()['version'] today = date.today() copy("_templates/layout.html.template", "_templates/layout.html") with open("_templates/layout.html", "a+b") as f: f.write(footer_tmpl.substitute(grass_version=grass_version, year=today.year)) f.close() # -- General configuration ----------------------------------------------------- # If your documentation needs a minimal Sphinx version, state it here. #needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones.
def is_grass_7(): if core.version()["version"].split(".")[0] == "7": return True return False