mirror of https://git.48k.eu/ogclient
84 lines
2.5 KiB
Python
84 lines
2.5 KiB
Python
#
|
|
# Copyright (C) 2022 Soleta Networks <info@soleta.eu>
|
|
#
|
|
# This program is free software: you can redistribute it and/or modify it under
|
|
# the terms of the GNU Affero General Public License as published by the
|
|
# Free Software Foundation; either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
|
|
import os
|
|
import subprocess
|
|
|
|
from subprocess import PIPE
|
|
|
|
def getlinuxversion(osrelease):
|
|
"""
|
|
Parses a os-release file to fetch 'PRETTY_NAME' key.
|
|
If file or key are not found, then returns generic
|
|
'Linux' string.
|
|
"""
|
|
with open(osrelease, 'r') as f:
|
|
for line in f:
|
|
if line.find('=') == -1:
|
|
continue
|
|
key, value = line.split('=')
|
|
if key == 'PRETTY_NAME':
|
|
value = value.replace('\n', '')
|
|
value = value.strip('"')
|
|
return value
|
|
return 'Linux'
|
|
|
|
|
|
def getwindowsversion(winreghives):
|
|
"""
|
|
Tries to obtain windows version information by
|
|
querying the SOFTWARE registry hive. Registry
|
|
hives path is a required parameter.
|
|
|
|
Runs hivexget(1) to fetch ProductName and
|
|
ReleaseId. If something fails (hivexget is
|
|
not installed, or registry is not found) it
|
|
returns a generic "Microsoft Windows" string.
|
|
"""
|
|
|
|
# XXX: 3.6 friendly
|
|
try:
|
|
proc_prodname = subprocess.run(['hivexget',
|
|
f'{winreghives}/SOFTWARE',
|
|
'microsoft\windows nt\currentversion',
|
|
'ProductName'], stdout=PIPE)
|
|
proc_releaseid = subprocess.run(['hivexget',
|
|
f'{winreghives}/SOFTWARE',
|
|
'microsoft\windows nt\currentversion',
|
|
'ReleaseId'], stdout=PIPE)
|
|
|
|
proc_prodname = proc_releaseid.stdout.replace('\n', '')
|
|
releaseid = proc_releaseid.stdout.replace('\n', '')
|
|
|
|
if proc_prodname.returncode == 0 and proc_releaseid.returncode == 0:
|
|
return f'{prodname} {releaseid}'
|
|
except FileNotFoundError: # hivexget command not found
|
|
pass
|
|
return 'Microsoft Windows'
|
|
|
|
|
|
def os_probe(mountpoint):
|
|
"""
|
|
Probes mountpoint for typical OS dependant files.
|
|
|
|
Windows: Tries finding and querying the software
|
|
registry hive.
|
|
Linux: Looks for /etc/os-release file.
|
|
|
|
Returns a string depending on the OS it detects.
|
|
"""
|
|
winreghives = f'{mountpoint}Windows/System32/config'
|
|
osrelease = f'{mountpoint}/etc/os-release'
|
|
|
|
if os.path.exists(osrelease):
|
|
return getlinuxversion(osrelease)
|
|
elif os.path.exists(winreghives):
|
|
return getwindowsversion(winreghives)
|
|
else:
|
|
return ''
|