# Copyright (C) 2020 Open Information Security Foundation # # You can copy, redistribute or modify this Program under the terms of # the GNU General Public License version 2 as published by the Free # Software Foundation. # # 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 # version 2 along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. import re import os.path import platform def parse_os_release(filename="/etc/os-release"): os_release={} if not os.path.exists(filename): return os_release with open(filename) as fileobj: for line in fileobj: line = line.strip() m = re.match(r"^(\w+)=\"?(.*?)\"?$", line) if m: os_release[m.group(1)] = m.group(2) return os_release def dist(): os_release = parse_os_release() if "NAME" in os_release: version_fields = ["VERSION_ID", "BUILD_ID"] for vf in version_fields: if vf in os_release: return "{}/{}".format(os_release["NAME"], os_release[vf]) return os_release["NAME"] # Arch may or may not have /etc/os-release, but its easy to # detect. if os.path.exists("/etc/arch-release"): return "Arch Linux" # Uname fallback. uname = platform.uname() return "{}/{}".format(uname[0], uname[2]) normalized_arch = { "amd64": "x86_64", } def arch(): """Return the machine architecture. """ machine = platform.machine() return normalized_arch.get(machine, machine) if __name__ == "__main__": # Build a user agent string. Something like: # Suricata-Update/1.2.0dev0 (OS: Linux; \ # CPU: x86_64; \ # Python: 3.7.7; \ # Dist: Fedora/31; \ # Suricata: 4.0.0) parts = [] parts.append("OS: {}".format(platform.system())) parts.append("CPU: {}".format(arch())) parts.append("Python: {}".format(platform.python_version())) parts.append("Dist: {}".format(dist())) print("Suricata-Update/1.2.0dev0 ({})".format("; ".join(parts)))