mirror of
https://github.com/Neocky/pluGET.git
synced 2024-04-29 16:12:30 +00:00
Added experimental update checker
This commit is contained in:
parent
84fcfc8922
commit
8620dfbe74
23
pluGET.py
23
pluGET.py
@ -8,21 +8,16 @@ import argparse
|
||||
# check if folder 'src' is accessible with all modules needed and if not exit
|
||||
try:
|
||||
from src.handlers.handle_config import check_config, validate_config
|
||||
from src.utils.console_output import rename_console_title, clear_console, print_logo
|
||||
from src.utils.utilities import check_requirements, api_test_spiget
|
||||
from src.utils.console_output import rename_console_title, clear_console, print_logo, print_console_logo
|
||||
from src.utils.utilities import check_requirements, api_test_spiget, check_for_pluGET_update
|
||||
from src.handlers.handle_input import handle_input
|
||||
except:
|
||||
except TypeError:
|
||||
print("Folder 'src' not found in the directory or missing files or broken functions detected! \
|
||||
\nPlease redownload the files from here: https://www.github.com/Neocky/pluGET")
|
||||
sys.exit()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
rename_console_title()
|
||||
check_config()
|
||||
validate_config()
|
||||
api_test_spiget()
|
||||
check_requirements()
|
||||
parser = argparse.ArgumentParser(description="Arguments for pluGET",
|
||||
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
|
||||
#parser.add_argument("-a", "--archive", action="store_true", help="archive mode")
|
||||
@ -31,11 +26,21 @@ if __name__ == "__main__":
|
||||
parser.add_argument("object", help="Object/Plugin Name", nargs='?', default=None)
|
||||
parser.add_argument("version", help="Version", nargs='?', default=None)
|
||||
args = vars(parser.parse_args())
|
||||
|
||||
rename_console_title()
|
||||
check_config()
|
||||
validate_config()
|
||||
api_test_spiget()
|
||||
check_requirements()
|
||||
|
||||
if args["mode"] is not None and args["object"] is not None:
|
||||
# arguments were used so call the handle_input function to get the right function call
|
||||
print_console_logo()
|
||||
check_for_pluGET_update()
|
||||
handle_input(args["mode"], args["object"], args["version"], arguments_from_console=True)
|
||||
else:
|
||||
# no arguments were used so start pluGET console
|
||||
clear_console()
|
||||
#clear_console()
|
||||
print_logo()
|
||||
check_for_pluGET_update()
|
||||
handle_input()
|
||||
|
@ -4,6 +4,7 @@ Handles the input through the pluGET command line
|
||||
|
||||
from src.utils.console_output import rich_print_error
|
||||
from src.plugin.plugin_downloader import get_specific_plugin, search_specific_plugin
|
||||
from src.plugin.plugin_updatechecker import check_installed_plugins
|
||||
|
||||
|
||||
# check
|
||||
@ -36,8 +37,7 @@ def handle_input(input_command=None, input_selected_object=None, input_parameter
|
||||
case True:
|
||||
get_specific_plugin(input_selected_object, input_parameter)
|
||||
case _:
|
||||
print("get search specific package")
|
||||
#searchPackage(inputSelectedObject)
|
||||
search_specific_plugin(input_selected_object)
|
||||
|
||||
case "update":
|
||||
print("update package")
|
||||
@ -57,7 +57,7 @@ def handle_input(input_command=None, input_selected_object=None, input_parameter
|
||||
#checkInstalledServerjar()
|
||||
case _:
|
||||
print("check plugins")
|
||||
#checkInstalledPackage(inputSelectedObject, inputParams)
|
||||
check_installed_plugins(input_selected_object, input_parameter)
|
||||
|
||||
case "search":
|
||||
search_specific_plugin(input_selected_object)
|
||||
|
@ -111,7 +111,7 @@ def download_specific_plugin_version_spiget(plugin_id, download_path, version_id
|
||||
try:
|
||||
file_size = int(r.headers.get('content-length'))
|
||||
# create progress bar
|
||||
download_task = progress.add_task(" [bright_red]Downloading...", total=file_size)
|
||||
download_task = progress.add_task(" [cyan]Downloading...", total=file_size)
|
||||
except TypeError:
|
||||
# Content-lenght returned nothing
|
||||
file_size = 0
|
||||
|
251
src/plugin/plugin_updatechecker.py
Normal file
251
src/plugin/plugin_updatechecker.py
Normal file
@ -0,0 +1,251 @@
|
||||
"""
|
||||
Handles the plugin checking and updating
|
||||
"""
|
||||
|
||||
import os
|
||||
import re
|
||||
from pathlib import Path
|
||||
from rich.progress import track
|
||||
|
||||
|
||||
from src.handlers.handle_config import config_value
|
||||
from src.utils.utilities import api_do_request
|
||||
|
||||
class plugin():
|
||||
"""
|
||||
Create plugin class to store installed plugins inside it
|
||||
"""
|
||||
def __init__(self, plugin_name, plugin_file_version) -> None:
|
||||
self.plugin_name = plugin_name
|
||||
self.plugin_file_version = plugin_file_version
|
||||
|
||||
|
||||
@staticmethod
|
||||
def create_plugin_list() -> list:
|
||||
"""
|
||||
Creates a global array list to store plugins
|
||||
"""
|
||||
global INSTALLEDPLUGINLIST
|
||||
INSTALLEDPLUGINLIST = []
|
||||
return INSTALLEDPLUGINLIST
|
||||
|
||||
|
||||
@staticmethod
|
||||
def add_to_plugin_list(plugin_name, plugin_file_version) -> None:
|
||||
"""
|
||||
Adds a plugin to global installed plugin lists
|
||||
"""
|
||||
INSTALLEDPLUGINLIST.append(plugin(plugin_name, plugin_file_version))
|
||||
return None
|
||||
|
||||
@staticmethod
|
||||
def get_plugin_list_length() -> int:
|
||||
"""
|
||||
Returns the lenght of the plugin list
|
||||
"""
|
||||
return len(INSTALLEDPLUGINLIST)
|
||||
|
||||
|
||||
|
||||
|
||||
#plugin.create_plugin_list()
|
||||
#plugin.add_to_plugin_list("test2", 12345)
|
||||
#for i in INSTALLEDPLUGINLIST: print(i.plugin_name)
|
||||
#print(plugin.get_plugin_list_length())
|
||||
|
||||
def get_plugin_file_name(plugin_full_name) -> str:
|
||||
"""
|
||||
Finds the full plugin name of the given string
|
||||
Example LuckPerms-5.4.30.jar -> Luckperms
|
||||
|
||||
:param plugin_full_name: Full filename of plugin
|
||||
|
||||
:returns: Full plugin name
|
||||
"""
|
||||
plugin_full_name2 = plugin_full_name
|
||||
# find number.jar
|
||||
plugin_file_version = re.search(r'([\d.]+[.jar]+)', plugin_full_name2)
|
||||
try:
|
||||
plugin_file_version_full = plugin_file_version.group()
|
||||
except AttributeError:
|
||||
plugin_file_version_full = plugin_file_version
|
||||
# remove number from plugin name
|
||||
plugin_name_only = plugin_full_name2.replace(plugin_file_version_full, '')
|
||||
# remove - from plugin name
|
||||
plugin_name_only = re.sub(r'(\-$)', '', plugin_name_only)
|
||||
# remove -v from plugin name
|
||||
plugin_name_only = re.sub(r'(\-v$)', '', plugin_name_only)
|
||||
return plugin_name_only
|
||||
|
||||
|
||||
def get_plugin_file_version(plugin_full_name) -> str:
|
||||
"""
|
||||
Gets the version of the plugin
|
||||
|
||||
:param plugin_full_name: Full filename of plugin
|
||||
|
||||
:returns: Version of plugin as string
|
||||
"""
|
||||
plugin_file_version = re.search(r'([\d.]+[.jar]+)', plugin_full_name)
|
||||
plugin_file_version = plugin_file_version.group()
|
||||
plugin_file_version = plugin_file_version.replace('.jar', '')
|
||||
if plugin_file_version.endswith('.'):
|
||||
print("get_plugin_file_version endswith .")
|
||||
#plugin_file_version = eggCrackingJar(plugin_full_name, 'version')
|
||||
return plugin_file_version
|
||||
|
||||
|
||||
def get_latest_spigot_plugin_version(plugin_id) -> str:
|
||||
"""
|
||||
Gets the latest spigot plugin version
|
||||
|
||||
:param plugin_id: Plugin Spigot ID
|
||||
|
||||
:returns: Name of the latest update
|
||||
"""
|
||||
url = f"https://api.spiget.org/v2/resources/{plugin_id}/versions/latest"
|
||||
latest_update_search = api_do_request(url)
|
||||
return str(latest_update_search["name"])
|
||||
|
||||
|
||||
def create_plugin_version_tuple(plugin_version_string) -> tuple:
|
||||
"""
|
||||
Create a tuple of all version numbers
|
||||
|
||||
:param plugin_version_string: Plugin Version
|
||||
|
||||
:returns: Tuple of all version numbers
|
||||
"""
|
||||
return tuple(map(int, (plugin_version_string.split("."))))
|
||||
|
||||
|
||||
def get_plugin_version_without_letters(plugin_version_string) -> str:
|
||||
"""
|
||||
Returns the version without letters from the plugin version
|
||||
|
||||
:param plugin_version_string: Plugin Version
|
||||
|
||||
:returns: Plugin versioon without letters
|
||||
"""
|
||||
return re.sub(r'([A-Za-z]*)', '', plugin_version_string)
|
||||
|
||||
|
||||
def compare_plugin_version(plugin_latest_version, plugin_file_version) -> bool:
|
||||
"""
|
||||
Check if plugin version is outdated
|
||||
|
||||
:param plugin_latest_version: Latest available plugin version
|
||||
:param plugin_file_version: Installed plugin version
|
||||
|
||||
:returns: Bool if plugin version is outdated
|
||||
"""
|
||||
try:
|
||||
plugin_version_tuple = create_plugin_version_tuple(
|
||||
get_plugin_version_without_letters(plugin_file_version))
|
||||
plugin_latest_version_tuple = create_plugin_version_tuple(
|
||||
get_plugin_version_without_letters(plugin_latest_version))
|
||||
except ValueError:
|
||||
return False
|
||||
if plugin_version_tuple < plugin_latest_version_tuple:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
|
||||
def check_installed_plugins(input_selected_object="all", input_parameter=None) -> None:
|
||||
"""
|
||||
Gets installed plugins and checks it against the apis if there are updates for the plugins available
|
||||
"""
|
||||
config_values = config_value()
|
||||
plugin.create_plugin_list()
|
||||
match config_values.connection:
|
||||
case "sftp":
|
||||
# TODO add sftp adn ftp support
|
||||
#connection = createSFTPConnection()
|
||||
#pluginList = sftp_listAll(connection)
|
||||
print("sftp list all")
|
||||
case "ftp":
|
||||
print("ftp list all")
|
||||
case _:
|
||||
plugin_folder_path = config_values.path_to_plugin_folder
|
||||
plugin_list = os.listdir(plugin_folder_path)
|
||||
|
||||
# create simple progress bar from rich
|
||||
for plugin_file in track(plugin_list, description="Checking...", transient=True, style="bright_yellow"):
|
||||
plugin_no_attributes = False
|
||||
match config_values.connection:
|
||||
case "sftp":
|
||||
#plugin_attributes = sftp_validateFileAttributes(connection, f"config_values.remote_plugin_folder_on_server}/{plugin}")
|
||||
print("sftp check_installed_plugins")
|
||||
|
||||
case "ftp":
|
||||
#plugin_attributes = ftp_validateFileAttributes(connection, f"config_values.remote_plugin_folder_on_server}/{plugin}")
|
||||
print("ftp check_installed_plugins")
|
||||
case _:
|
||||
if not os.path.isfile(Path(f"{plugin_folder_path}/{plugin_file}")):
|
||||
plugin_no_attributes = True
|
||||
if not re.search(r'.jar$', plugin_file):
|
||||
plugin_no_attributes = True
|
||||
# skip plugin if no attributes were found
|
||||
if plugin_no_attributes == True:
|
||||
continue
|
||||
|
||||
plugin_file_name = get_plugin_file_name(plugin_file)
|
||||
plugin_file_version = get_plugin_file_version(plugin_file)
|
||||
# check repository of plugin
|
||||
plugin_spigot_id = search_plugin_spigot(plugin_file, plugin_file_name, plugin_file_version)
|
||||
# TODO add more plugin repositories here
|
||||
print(plugin_file_name)
|
||||
print(plugin_file_version)
|
||||
print(plugin_spigot_id)
|
||||
|
||||
|
||||
|
||||
|
||||
def search_plugin_spigot(plugin_file, plugin_file_name, plugin_file_version) -> int:
|
||||
"""
|
||||
Search the spigot api for the installed plugin and add it to the installed plugin list
|
||||
|
||||
:param plugin_file: Full file name of plugin
|
||||
:param plugin_file_name: Name of plugin file
|
||||
:param plugin_file_version: Version of plugin file
|
||||
|
||||
:returns: Plugin ID of Spigot Plugin
|
||||
"""
|
||||
url = f"https://api.spiget.org/v2/search/resources/{plugin_file_name}?field=name&sort=-downloads"
|
||||
plugin_list = api_do_request(url)
|
||||
plugin_file_version2 = plugin_file_version
|
||||
for i in range(3):
|
||||
if i == 1:
|
||||
plugin_file_version2 = re.sub(r'(\-\w*)', '', plugin_file_version)
|
||||
if i == 2:
|
||||
"""
|
||||
pluginNameinYML = eggCrackingJar(plugin_file, 'name')
|
||||
url = "https://api.spiget.org/v2/search/resources/" + pluginNameinYML + "?field=name&sort=-downloads"
|
||||
try:
|
||||
plugin_list = api_do_request(url)
|
||||
except ValueError:
|
||||
continue
|
||||
"""
|
||||
|
||||
#plugin_file_version = plugin_file_version2 # ?
|
||||
|
||||
for plugin in plugin_list:
|
||||
plugin_id = plugin["id"]
|
||||
url2 = f"https://api.spiget.org/v2/resources/{plugin_id}/versions?size=100&sort=-name"
|
||||
try:
|
||||
plugin_versions = api_do_request(url2)
|
||||
except ValueError:
|
||||
continue
|
||||
for updates in plugin_versions:
|
||||
update_version_name = updates["name"]
|
||||
if plugin_file_version2 in update_version_name:
|
||||
spigot_update_id = updates["id"]
|
||||
plugin_latest_version = get_latest_spigot_plugin_version(plugin_id)
|
||||
plugin_is_outdated = compare_plugin_version(plugin_latest_version, update_version_name)
|
||||
#addToPluginList(plugin_file, plugin_id, spigot_update_id, plugin_latest_version , plugin_is_outdated)
|
||||
return plugin_id, plugin_is_outdated
|
||||
|
||||
#plugin_id = spigot_update_id = plugin_latest_version = plugin_is_outdated = None
|
||||
#addToPluginList(plugin_file, plugin_id, spigot_update_id, plugin_latest_version , plugin_is_outdated)
|
||||
return None
|
8
src/settings.py
Normal file
8
src/settings.py
Normal file
@ -0,0 +1,8 @@
|
||||
"""
|
||||
Constant values
|
||||
|
||||
PLUGETVERSION = current version of pluGET
|
||||
"""
|
||||
|
||||
# constant values
|
||||
PLUGETVERSION = "1.6.8"
|
@ -5,6 +5,8 @@
|
||||
import os
|
||||
from rich.console import Console
|
||||
|
||||
from src.settings import PLUGETVERSION
|
||||
|
||||
|
||||
def rich_print_error(error_message) -> None:
|
||||
"""
|
||||
@ -17,7 +19,7 @@ def rich_print_error(error_message) -> None:
|
||||
|
||||
def rename_console_title() -> None:
|
||||
"""
|
||||
Renames the console title on first startup
|
||||
Renames the console title on first startup
|
||||
"""
|
||||
os.system("title " + "pluGET │ By Neocky")
|
||||
return None
|
||||
@ -25,7 +27,7 @@ def rename_console_title() -> None:
|
||||
|
||||
def clear_console() -> None:
|
||||
"""
|
||||
Clears the console on first startup
|
||||
Clears the console on first startup
|
||||
"""
|
||||
os.system('cls' if os.name=='nt' else 'clear')
|
||||
return None
|
||||
@ -33,7 +35,7 @@ def clear_console() -> None:
|
||||
|
||||
def print_logo() -> None:
|
||||
"""
|
||||
Prints the logo of pluGET and the link to the github repo
|
||||
Prints the logo of pluGET and the link to the github repo
|
||||
"""
|
||||
# use rich console
|
||||
console = Console()
|
||||
@ -136,3 +138,14 @@ def print_logo() -> None:
|
||||
console.print(" └────────────────────────────────────┘", style="bright_black")
|
||||
console.print(" ───────────────────────────────────────────────────")
|
||||
return None
|
||||
|
||||
|
||||
def print_console_logo() -> None:
|
||||
"""
|
||||
Prints the logo of pluGET if it is called from console
|
||||
"""
|
||||
console = Console()
|
||||
console.print(f"[not bold][bright_magenta]pluGET [bright_green]{PLUGETVERSION} ", end='')
|
||||
console.print("created by Neocky → ", end='')
|
||||
console.print("https://github.com/Neocky/pluGET", style="link https://github.com/Neocky/pluGET")
|
||||
return None
|
||||
|
@ -6,10 +6,37 @@ import os
|
||||
import sys
|
||||
import requests
|
||||
import shutil
|
||||
import re
|
||||
from pathlib import Path
|
||||
from rich.console import Console
|
||||
|
||||
from src.utils.console_output import rich_print_error
|
||||
from src.handlers.handle_config import config_value
|
||||
from src.settings import PLUGETVERSION
|
||||
|
||||
|
||||
def check_for_pluGET_update() -> None:
|
||||
"""
|
||||
Check with the github api if there is a new version for pluGET available and print download message if this is
|
||||
the case
|
||||
"""
|
||||
response = api_do_request("https://api.github.com/repos/Neocky/pluGET/releases/latest")
|
||||
# get '.1.6.10' as output
|
||||
full_version_string = re.search(r"[\.?\d]*$", response["name"])
|
||||
# remove '.' to get '1.6.10' as output
|
||||
version = re.sub(r"^\.*", "", full_version_string.group())
|
||||
console = Console()
|
||||
try:
|
||||
pluget_installed_version_tuple = tuple(map(int, (PLUGETVERSION.split("."))))
|
||||
plugin_latest_version_tuple = tuple(map(int, (version.split("."))))
|
||||
except ValueError:
|
||||
console.print("Couldn't check if new version of pluGET is available")
|
||||
return None
|
||||
if pluget_installed_version_tuple < plugin_latest_version_tuple:
|
||||
print(f"A new version for pluGET is available: {version}")
|
||||
console.print("Download it here: ", end='')
|
||||
console.print("https://github.com/Neocky/pluGET", style="link https://github.com/Neocky/pluGET")
|
||||
return None
|
||||
|
||||
|
||||
def api_do_request(url) -> list:
|
||||
|
Loading…
Reference in New Issue
Block a user