# This file is part of Scapy # See http://www.secdev.org/projects/scapy for more information # Copyright (C) Philippe Biondi # This program is published under a GPLv2 license """ Scapy: create, send, sniff, dissect and manipulate network packets. Usable either from an interactive console or as a Python library. https://scapy.net """ import os import re import subprocess from scapy.compat import AnyStr _SCAPY_PKG_DIR = os.path.dirname(__file__) def _version_from_git_describe(): # type: () -> AnyStr """ Read the version from ``git describe``. It returns the latest tag with an optional suffix if the current directory is not exactly on the tag. Example:: $ git describe --always v2.3.2-346-g164a52c075c8 The tag prefix (``v``) and the git commit sha1 (``-g164a52c075c8``) are removed if present. If the current directory is not exactly on the tag, a ``.devN`` suffix is appended where N is the number of commits made after the last tag. Example:: >>> _version_from_git_describe() '2.3.2.dev346' :raises CalledProcessError: if git is unavailable :return: Scapy's latest tag """ if not os.path.isdir(os.path.join(os.path.dirname(_SCAPY_PKG_DIR), '.git')): # noqa: E501 raise ValueError('not in scapy git repo') def _git(cmd): process = subprocess.Popen( cmd.split(), cwd=_SCAPY_PKG_DIR, stdout=subprocess.PIPE, stderr=subprocess.PIPE ) out, err = process.communicate() if process.returncode == 0: return out.decode().strip() else: raise subprocess.CalledProcessError(process.returncode, err) tag = _git("git describe --always") if not tag.startswith("v"): # Upstream was not fetched commit = _git("git rev-list --tags --max-count=1") tag = _git("git describe --tags --always --long %s" % commit) match = re.match('^v?(.+?)-(\\d+)-g[a-f0-9]+$', tag) if match: # remove the 'v' prefix and add a '.devN' suffix return '%s.dev%s' % (match.group(1), match.group(2)) else: # just remove the 'v' prefix return re.sub('^v', '', tag) def _version(): # type: () -> str """Returns the Scapy version from multiple methods :return: the Scapy version """ version_file = os.path.join(_SCAPY_PKG_DIR, 'VERSION') try: tag = _version_from_git_describe() # successfully read the tag from git, write it in VERSION for # installation and/or archive generation. with open(version_file, 'w') as fdesc: fdesc.write(tag) return tag except Exception: # failed to read the tag from git, try to read it from a VERSION file try: with open(version_file, 'r') as fdsec: tag = fdsec.read() return tag except Exception: # Rely on git archive "export-subst" git attribute. # See 'man gitattributes' for more details. git_archive_id = '$Format:%h %d$' sha1 = git_archive_id.strip().split()[0] match = re.search('tag:(\\S+)', git_archive_id) if match: return "git-archive.dev" + match.group(1) elif sha1: return "git-archive.dev" + sha1 else: return 'unknown.version' VERSION = __version__ = _version() _tmp = re.search(r"[0-9.]+", VERSION) VERSION_MAIN = _tmp.group() if _tmp is not None else VERSION if __name__ == "__main__": from scapy.main import interact interact()