Files
LorenEteval_Furious/Furious/Utility/SystemRuntime.py
2025-02-03 00:53:14 +08:00

115 lines
2.8 KiB
Python

# Copyright (C) 2024 Loren Eteval <loren.eteval@proton.me>
#
# This file is part of Furious.
#
# 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 3 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, see <https://www.gnu.org/licenses/>.
from __future__ import annotations
from Furious.Utility.Constants import *
from Furious.Utility.AppSettings import AppSettings
from Furious.Utility.Utility import runExternalCommand
import os
import sys
import ctypes
import functools
import subprocess
__all__ = [
'getPythonVersion',
'getUbuntuRelease',
'isAdministrator',
'isVPNMode',
'isScriptMode',
'isPythonw',
'isWindows7',
]
@functools.lru_cache(None)
def getPythonVersion():
return '.'.join(str(info) for info in sys.version_info)
@functools.lru_cache(None)
def getUbuntuRelease() -> str:
try:
if PLATFORM != 'Linux':
return ''
result = runExternalCommand(
['cat', '/etc/lsb-release'],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
check=True,
)
values = dict(
list(line.split('='))
for line in filter(lambda x: x != '', result.stdout.decode().split('\n'))
)
if values['DISTRIB_ID'] == 'Ubuntu':
return values['DISTRIB_RELEASE']
else:
return ''
except Exception:
# Any non-exit exceptions
return ''
@functools.lru_cache(None)
def isAdministrator() -> bool:
if PLATFORM == 'Windows':
return ctypes.windll.shell32.IsUserAnAdmin() == 1
else:
return os.geteuid() == 0
def isVPNMode() -> bool:
return isAdministrator() and AppSettings.isStateON_('VPNMode')
@functools.lru_cache(None)
def isScriptMode() -> bool:
return sys.argv[0].endswith('.py')
@functools.lru_cache(None)
def isPythonw() -> bool:
def isRealFile(file):
if not hasattr(file, 'fileno'):
return False
try:
tmp = os.dup(file.fileno())
except Exception:
# Any non-exit exceptions
return False
else:
os.close(tmp)
return True
# pythonw.exe. Also applies to packed GUI application on Windows
return not isRealFile(sys.__stdout__) or not isRealFile(sys.__stderr__)
@functools.lru_cache(None)
def isWindows7() -> bool:
return PLATFORM == 'Windows' and PLATFORM_RELEASE == '7'