mirror of
https://github.com/Neocky/pluGET.git
synced 2024-04-29 16:12:30 +00:00
Merge pull request #9 from Neocky/dev/paper
Dev/paper to main For new release
This commit is contained in:
commit
e87729f700
44
README.md
44
README.md
@ -10,8 +10,8 @@
|
|||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://github.com/Neocky/pluGET/blob/main/LICENSE"> <img src="https://img.shields.io/github/license/Neocky/pluGET" alt="Apache-2.0" border="0"></a>
|
<a href="https://github.com/Neocky/pluGET/blob/main/LICENSE"> <img src="https://img.shields.io/github/license/Neocky/pluGET" alt="Apache-2.0" border="0"></a>
|
||||||
<a href="https://github.com/Neocky/pluGET/releases"> <img src="https://img.shields.io/github/downloads/Neocky/pluGET/total" alt="downloads" border="0"></a>
|
|
||||||
<a href="https://github.com/Neocky/pluGET/releases"> <img src="https://img.shields.io/github/v/release/Neocky/pluGET?include_prereleases" alt"latestrelease"></a>
|
<a href="https://github.com/Neocky/pluGET/releases"> <img src="https://img.shields.io/github/v/release/Neocky/pluGET?include_prereleases" alt"latestrelease"></a>
|
||||||
|
<a href="https://github.com/Neocky/pluGET/releases"> <img src="https://img.shields.io/github/downloads/Neocky/pluGET/total" alt="downloads" border="0"></a>
|
||||||
<img src="https://hitcounter.pythonanywhere.com/count/tag.svg?url=https%3A%2F%2Fgithub.com%2FNeocky%2FpluGET" alt="Hits">
|
<img src="https://hitcounter.pythonanywhere.com/count/tag.svg?url=https%3A%2F%2Fgithub.com%2FNeocky%2FpluGET" alt="Hits">
|
||||||
|
|
||||||
|
|
||||||
@ -19,7 +19,7 @@
|
|||||||
|
|
||||||
|
|
||||||
# pluGET
|
# pluGET
|
||||||
A powerfull package manager which handles [Plugins](https://www.spigotmc.org/resources/) for minecraft servers.
|
A powerfull package manager which handles [Plugins](https://www.spigotmc.org/resources/) and Server Software for minecraft servers.
|
||||||
|
|
||||||
|
|
||||||
## Issues? Found a bug?
|
## Issues? Found a bug?
|
||||||
@ -31,6 +31,7 @@ This is a package manager for minecraft [Spigot](https://www.spigotmc.org/) serv
|
|||||||
This is a standalone program written in python.
|
This is a standalone program written in python.
|
||||||
The program works with a locally installed server or with a remote host through SFTP, when configured in the config.
|
The program works with a locally installed server or with a remote host through SFTP, when configured in the config.
|
||||||
It uses the [Spiget](https://spiget.org/) API to download and compare plugin versions and can download the latest version of plugins from the [Spigot](https://www.spigotmc.org/) site.
|
It uses the [Spiget](https://spiget.org/) API to download and compare plugin versions and can download the latest version of plugins from the [Spigot](https://www.spigotmc.org/) site.
|
||||||
|
It can also compare and download the latest update of specifif server software (e.g. [PaperMC](https://papermc.io/)).
|
||||||
|
|
||||||
Plugin management was the hard part of mangaging a minecraft server. The time it took to check the [Spigot ressource](https://www.spigotmc.org/resources/) page for updates for the installed plugins and updating all plugins manually which have available updates was too long and shocking.
|
Plugin management was the hard part of mangaging a minecraft server. The time it took to check the [Spigot ressource](https://www.spigotmc.org/resources/) page for updates for the installed plugins and updating all plugins manually which have available updates was too long and shocking.
|
||||||
So I built pluGET to automate and ease the plugin handling of a minecraft server and to turn the most time consuming part of managing a minecraft server to an easy one.
|
So I built pluGET to automate and ease the plugin handling of a minecraft server and to turn the most time consuming part of managing a minecraft server to an easy one.
|
||||||
@ -45,10 +46,16 @@ If you still have questions [here](https://github.com/Neocky/pluGET#need-help) i
|
|||||||
So what can it do exactly?
|
So what can it do exactly?
|
||||||
pluGET can:
|
pluGET can:
|
||||||
- work locally or through sftp
|
- work locally or through sftp
|
||||||
- download the latest version of a plugin
|
- manage plugins:
|
||||||
- update every installed/one specific plugin
|
- download the latest version of a plugin
|
||||||
- check for an update of every installed/one specific plugin
|
- update every installed/one specific plugin
|
||||||
- remove a plugin from the plugin folder
|
- check for an update of every installed/one specific plugin
|
||||||
|
- remove a plugin from the plugin folder
|
||||||
|
- manager server software:
|
||||||
|
- download a specific server software version
|
||||||
|
- check instlalled server software for update
|
||||||
|
- update installed server software to a specific version
|
||||||
|
- supported server software: [PaperMc](https://papermc.io/)
|
||||||
|
|
||||||
There are more features in the work. Check [Projects](https://github.com/Neocky/pluGET/projects) for a complete list.
|
There are more features in the work. Check [Projects](https://github.com/Neocky/pluGET/projects) for a complete list.
|
||||||
|
|
||||||
@ -85,10 +92,13 @@ Edit the config to your needs and relaunch pluGET.
|
|||||||
|
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
> As always, if you update plugins, shut down your server!
|
||||||
|
|
||||||
Execute the `launcher.bat` in the `\pluGET` folder. This will launch pluGET correctly.
|
Execute the `launcher.bat` in the `\pluGET` folder. This will launch pluGET correctly.
|
||||||
Another way is to launch the `src\__main__.py` file.
|
Another way is to launch the `src\__main__.py` file.
|
||||||
The following are examples of input for the general usage:
|
The following are examples of input for the general usage:
|
||||||
(Hint: 'all' can always be exchanged through the plugin name or the plugin id and reverse)
|
(Hint: [thingsInBrackets] are optional & 'all' can always be exchanged through the plugin name or the plugin id and reverse)
|
||||||
|
### Manage Plugins
|
||||||
#### Download the latest update of a specific package:
|
#### Download the latest update of a specific package:
|
||||||
`get [pluginID/pluginName]`
|
`get [pluginID/pluginName]`
|
||||||
```
|
```
|
||||||
@ -140,6 +150,26 @@ exit .
|
|||||||
```
|
```
|
||||||
help .
|
help .
|
||||||
```
|
```
|
||||||
|
### Manage Server Software
|
||||||
|
#### Check installed server software for updates:
|
||||||
|
`check serverjar`
|
||||||
|
```
|
||||||
|
check serverjar
|
||||||
|
```
|
||||||
|
### Update installed server software to latest/specific version:
|
||||||
|
`update serverjar [Version]`
|
||||||
|
```
|
||||||
|
update serverjar 'PaperMCVersion'
|
||||||
|
```
|
||||||
|
### Download specific paper version:
|
||||||
|
`get-paper [paperBuild] [minecraftVersion]`
|
||||||
|
```
|
||||||
|
get-paper 550 1.16.5
|
||||||
|
```
|
||||||
|
or:
|
||||||
|
```
|
||||||
|
get-paper 321
|
||||||
|
```
|
||||||
|
|
||||||
## Known problems
|
## Known problems
|
||||||
### Can't get installed version
|
### Can't get installed version
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
import configparser
|
import configparser
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
from utils.consoleoutput import oColors
|
from utils.consoleoutput import oColors
|
||||||
|
|
||||||
|
|
||||||
def checkConfig():
|
def checkConfig():
|
||||||
currentFolder = os.getcwd()
|
currentFolder = os.getcwd()
|
||||||
os.chdir('..')
|
|
||||||
configAvailable = os.path.isfile("config.ini")
|
configAvailable = os.path.isfile("config.ini")
|
||||||
|
|
||||||
if not configAvailable:
|
if not configAvailable:
|
||||||
@ -21,9 +21,9 @@ def checkConfig():
|
|||||||
config.sections()
|
config.sections()
|
||||||
config.read("config.ini")
|
config.read("config.ini")
|
||||||
localPluginFolder = config['General']['LocalPluginFolder']
|
localPluginFolder = config['General']['LocalPluginFolder']
|
||||||
pathToPluginFolder = config['General']['PathToPluginFolder']
|
pathToPluginFolder = Path(config['General']['PathToPluginFolder'])
|
||||||
seperateDownloadPath = config['General']['SeperateDownloadPath']
|
seperateDownloadPath = config['General']['SeperateDownloadPath']
|
||||||
pathToSeperateDownloadPath = config['General']['PathToSeperateDownloadPath']
|
pathToSeperateDownloadPath = Path(config['General']['PathToSeperateDownloadPath'])
|
||||||
|
|
||||||
sftp_server = config['SFTP - Remote Server']['Server']
|
sftp_server = config['SFTP - Remote Server']['Server']
|
||||||
sftp_user = config['SFTP - Remote Server']['Username']
|
sftp_user = config['SFTP - Remote Server']['Username']
|
||||||
@ -75,5 +75,5 @@ def createConfig():
|
|||||||
config['SFTP - Remote Server']['PathToSeperateDownloadPath'] = '.\\plugins'
|
config['SFTP - Remote Server']['PathToSeperateDownloadPath'] = '.\\plugins'
|
||||||
|
|
||||||
|
|
||||||
with open('./config.ini', 'w') as configfile:
|
with open('config.ini', 'w') as configfile:
|
||||||
config.write(configfile)
|
config.write(configfile)
|
||||||
|
@ -6,6 +6,9 @@ from handlers.handle_config import checkConfig
|
|||||||
from plugin.plugin_downloader import searchPackage, getSpecificPackage
|
from plugin.plugin_downloader import searchPackage, getSpecificPackage
|
||||||
from plugin.plugin_updatechecker import updateInstalledPackage, checkInstalledPackage
|
from plugin.plugin_updatechecker import updateInstalledPackage, checkInstalledPackage
|
||||||
from plugin.plugin_remover import removePlugin
|
from plugin.plugin_remover import removePlugin
|
||||||
|
from serverjar.serverjar_checker import checkInstalledServerjar, updateServerjar
|
||||||
|
from serverjar.serverjar_paper import papermc_downloader
|
||||||
|
|
||||||
|
|
||||||
def createInputLists():
|
def createInputLists():
|
||||||
global COMMANDLIST
|
global COMMANDLIST
|
||||||
@ -16,7 +19,8 @@ def createInputLists():
|
|||||||
'search',
|
'search',
|
||||||
'exit',
|
'exit',
|
||||||
'help',
|
'help',
|
||||||
'remove'
|
'remove',
|
||||||
|
'get-paper'
|
||||||
]
|
]
|
||||||
global INPUTSELECTEDOBJECT
|
global INPUTSELECTEDOBJECT
|
||||||
INPUTSELECTEDOBJECT = [
|
INPUTSELECTEDOBJECT = [
|
||||||
@ -47,10 +51,16 @@ def handleInput(inputCommand, inputSelectedObject, inputParams):
|
|||||||
searchPackage(inputSelectedObject)
|
searchPackage(inputSelectedObject)
|
||||||
break
|
break
|
||||||
if inputCommand == 'update':
|
if inputCommand == 'update':
|
||||||
updateInstalledPackage(inputSelectedObject)
|
if inputSelectedObject == 'serverjar':
|
||||||
|
updateServerjar(inputParams)
|
||||||
|
else:
|
||||||
|
updateInstalledPackage(inputSelectedObject)
|
||||||
break
|
break
|
||||||
if inputCommand == 'check':
|
if inputCommand == 'check':
|
||||||
checkInstalledPackage(inputSelectedObject)
|
if inputSelectedObject == 'serverjar':
|
||||||
|
checkInstalledServerjar()
|
||||||
|
else:
|
||||||
|
checkInstalledPackage(inputSelectedObject)
|
||||||
break
|
break
|
||||||
if inputCommand == 'search':
|
if inputCommand == 'search':
|
||||||
searchPackage(inputSelectedObject)
|
searchPackage(inputSelectedObject)
|
||||||
@ -63,6 +73,9 @@ def handleInput(inputCommand, inputSelectedObject, inputParams):
|
|||||||
if inputCommand == 'remove':
|
if inputCommand == 'remove':
|
||||||
removePlugin(inputSelectedObject)
|
removePlugin(inputSelectedObject)
|
||||||
break
|
break
|
||||||
|
if inputCommand == 'get-paper':
|
||||||
|
papermc_downloader(inputSelectedObject, inputParams)
|
||||||
|
break
|
||||||
else:
|
else:
|
||||||
print(oColors.brightRed + "Command not found. Please try again." + oColors.standardWhite)
|
print(oColors.brightRed + "Command not found. Please try again." + oColors.standardWhite)
|
||||||
getInput()
|
getInput()
|
||||||
|
@ -45,6 +45,17 @@ def sftp_upload_file(sftp, itemPath):
|
|||||||
sftp.close()
|
sftp.close()
|
||||||
|
|
||||||
|
|
||||||
|
def sftp_upload_server_jar(sftp, itemPath):
|
||||||
|
try:
|
||||||
|
sftp.chdir('.')
|
||||||
|
sftp.put(itemPath)
|
||||||
|
|
||||||
|
except FileNotFoundError:
|
||||||
|
print(oColors.brightRed + "The 'plugins' folder couldn*t be found on the remote host!" + oColors.standardWhite)
|
||||||
|
print(oColors.brightRed + "Aborting installation." + oColors.standardWhite)
|
||||||
|
sftp.close()
|
||||||
|
|
||||||
|
|
||||||
def sftp_listAll(sftp):
|
def sftp_listAll(sftp):
|
||||||
try:
|
try:
|
||||||
sftp.chdir('plugins')
|
sftp.chdir('plugins')
|
||||||
@ -56,4 +67,18 @@ def sftp_listAll(sftp):
|
|||||||
try:
|
try:
|
||||||
return installedPlugins
|
return installedPlugins
|
||||||
except UnboundLocalError:
|
except UnboundLocalError:
|
||||||
print(oColors.brightRed + "No plugins were found." + oColors.standardWhite)
|
print(oColors.brightRed + "No plugins were found." + oColors.standardWhite)
|
||||||
|
|
||||||
|
|
||||||
|
def sftp_listFilesInServerRoot(sftp):
|
||||||
|
try:
|
||||||
|
#sftp.chdir('plugins')
|
||||||
|
filesInServerRoot = sftp.listdir()
|
||||||
|
|
||||||
|
except FileNotFoundError:
|
||||||
|
print(oColors.brightRed + "The 'root' folder couldn*t be found on the remote host!" + oColors.standardWhite)
|
||||||
|
|
||||||
|
try:
|
||||||
|
return filesInServerRoot
|
||||||
|
except UnboundLocalError:
|
||||||
|
print(oColors.brightRed + "No Serverjar was found." + oColors.standardWhite)
|
@ -1,6 +1,7 @@
|
|||||||
import re
|
import re
|
||||||
import urllib.request
|
import urllib.request
|
||||||
from urllib.error import HTTPError
|
from urllib.error import HTTPError
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
from utils.consoleoutput import oColors
|
from utils.consoleoutput import oColors
|
||||||
from utils.web_request import doAPIRequest
|
from utils.web_request import doAPIRequest
|
||||||
@ -78,9 +79,15 @@ def searchPackage(ressourceName):
|
|||||||
ressourceSelected = ressourceSelected - 1
|
ressourceSelected = ressourceSelected - 1
|
||||||
ressourceId = packageName[ressourceSelected]["id"]
|
ressourceId = packageName[ressourceSelected]["id"]
|
||||||
if not checkConfig().localPluginFolder:
|
if not checkConfig().localPluginFolder:
|
||||||
getSpecificPackage(ressourceId, checkConfig().sftp_folderPath)
|
try:
|
||||||
|
getSpecificPackage(ressourceId, checkConfig().sftp_folderPath)
|
||||||
|
except HTTPError as err:
|
||||||
|
print(oColors.brightRed + f"Error: {err.code} - {err.reason}" + oColors.standardWhite)
|
||||||
else:
|
else:
|
||||||
getSpecificPackage(ressourceId, checkConfig().pathToPluginFolder)
|
try:
|
||||||
|
getSpecificPackage(ressourceId, checkConfig().pathToPluginFolder)
|
||||||
|
except HTTPError as err:
|
||||||
|
print(oColors.brightRed + f"Error: {err.code} - {err.reason}" + oColors.standardWhite)
|
||||||
|
|
||||||
|
|
||||||
def downloadSpecificVersion(ressourceId, downloadPath, versionID='latest'):
|
def downloadSpecificVersion(ressourceId, downloadPath, versionID='latest'):
|
||||||
@ -113,7 +120,7 @@ def getSpecificPackage(ressourceId, downloadPath, inputPackageVersion='latest'):
|
|||||||
versionId = getVersionID(ressourceId, inputPackageVersion)
|
versionId = getVersionID(ressourceId, inputPackageVersion)
|
||||||
packageVersion = getVersionName(ressourceId, versionId)
|
packageVersion = getVersionName(ressourceId, versionId)
|
||||||
packageDownloadName = f"{packageNameNew}-{packageVersion}.jar"
|
packageDownloadName = f"{packageNameNew}-{packageVersion}.jar"
|
||||||
downloadPackagePath = f"{downloadPath}\\{packageDownloadName}"
|
downloadPackagePath = Path(f"{downloadPath}/{packageDownloadName}")
|
||||||
if checkConfig().localPluginFolder:
|
if checkConfig().localPluginFolder:
|
||||||
if inputPackageVersion is None or inputPackageVersion == 'latest':
|
if inputPackageVersion is None or inputPackageVersion == 'latest':
|
||||||
downloadSpecificVersion(ressourceId=ressourceId, downloadPath=downloadPackagePath)
|
downloadSpecificVersion(ressourceId=ressourceId, downloadPath=downloadPackagePath)
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
from utils.consoleoutput import oColors
|
from utils.consoleoutput import oColors
|
||||||
from handlers.handle_config import checkConfig
|
from handlers.handle_config import checkConfig
|
||||||
@ -29,7 +30,7 @@ def removePlugin(pluginToRemove):
|
|||||||
print(f"Removing: {fileName}")
|
print(f"Removing: {fileName}")
|
||||||
if not checkConfig().localPluginFolder:
|
if not checkConfig().localPluginFolder:
|
||||||
pluginPath = checkConfig().sftp_folderPath
|
pluginPath = checkConfig().sftp_folderPath
|
||||||
pluginPath = f"{pluginPath}\\{plugin}"
|
pluginPath = f"{pluginPath}/{plugin}"
|
||||||
sftp = createSFTPConnection()
|
sftp = createSFTPConnection()
|
||||||
sftp.remove(pluginPath)
|
sftp.remove(pluginPath)
|
||||||
print(f"Removed: {fileName}")
|
print(f"Removed: {fileName}")
|
||||||
@ -37,7 +38,7 @@ def removePlugin(pluginToRemove):
|
|||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
pluginPath = checkConfig().pathToPluginFolder
|
pluginPath = checkConfig().pathToPluginFolder
|
||||||
pluginPath = f"{pluginPath}\\{plugin}"
|
pluginPath = Path(f"{pluginPath}/{plugin}")
|
||||||
os.remove(pluginPath)
|
os.remove(pluginPath)
|
||||||
print(f"Removed: {fileName}")
|
print(f"Removed: {fileName}")
|
||||||
i += 1
|
i += 1
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
from urllib.error import HTTPError
|
from urllib.error import HTTPError
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
from utils.consoleoutput import oColors
|
from utils.consoleoutput import oColors
|
||||||
from utils.web_request import doAPIRequest
|
from utils.web_request import doAPIRequest
|
||||||
@ -73,6 +74,7 @@ def checkInstalledPackage(inputSelectedObject="all"):
|
|||||||
fileVersion = getFileVersion(plugin)
|
fileVersion = getFileVersion(plugin)
|
||||||
pluginId = getInstalledPlugin(fileName, fileVersion)
|
pluginId = getInstalledPlugin(fileName, fileVersion)
|
||||||
except TypeError:
|
except TypeError:
|
||||||
|
i += 1
|
||||||
continue
|
continue
|
||||||
pluginIdStr = str(pluginId)
|
pluginIdStr = str(pluginId)
|
||||||
|
|
||||||
@ -83,7 +85,7 @@ def checkInstalledPackage(inputSelectedObject="all"):
|
|||||||
pluginLatestVersion = INSTALLEDPLUGINLIST[i][2]
|
pluginLatestVersion = INSTALLEDPLUGINLIST[i][2]
|
||||||
except IndexError:
|
except IndexError:
|
||||||
pluginLatestVersion = 'N/A'
|
pluginLatestVersion = 'N/A'
|
||||||
|
|
||||||
if pluginLatestVersion == None:
|
if pluginLatestVersion == None:
|
||||||
pluginLatestVersion = 'N/A'
|
pluginLatestVersion = 'N/A'
|
||||||
|
|
||||||
@ -97,7 +99,7 @@ def checkInstalledPackage(inputSelectedObject="all"):
|
|||||||
|
|
||||||
if pluginIsOutdated == True:
|
if pluginIsOutdated == True:
|
||||||
oldPackages = oldPackages + 1
|
oldPackages = oldPackages + 1
|
||||||
|
|
||||||
if inputSelectedObject != "*" and inputSelectedObject != "all":
|
if inputSelectedObject != "*" and inputSelectedObject != "all":
|
||||||
if inputSelectedObject == pluginIdStr or re.search(inputSelectedObject, fileName, re.IGNORECASE):
|
if inputSelectedObject == pluginIdStr or re.search(inputSelectedObject, fileName, re.IGNORECASE):
|
||||||
print(f" [{1}]".ljust(8), end='')
|
print(f" [{1}]".ljust(8), end='')
|
||||||
@ -113,7 +115,7 @@ def checkInstalledPackage(inputSelectedObject="all"):
|
|||||||
print(f"{pluginLatestVersion}".ljust(12), end='')
|
print(f"{pluginLatestVersion}".ljust(12), end='')
|
||||||
print(f" {pluginIsOutdated}".ljust(5))
|
print(f" {pluginIsOutdated}".ljust(5))
|
||||||
|
|
||||||
i = i + 1
|
i += 1
|
||||||
except TypeError:
|
except TypeError:
|
||||||
print(oColors.brightRed + "Aborted checking for plugins." + oColors.standardWhite)
|
print(oColors.brightRed + "Aborted checking for plugins." + oColors.standardWhite)
|
||||||
print(oColors.brightYellow + f"Old packages: [{oldPackages}/{i}]" + oColors.standardWhite)
|
print(oColors.brightYellow + f"Old packages: [{oldPackages}/{i}]" + oColors.standardWhite)
|
||||||
@ -139,8 +141,10 @@ def updateInstalledPackage(inputSelectedObject='all'):
|
|||||||
pluginId = getInstalledPlugin(fileName, fileVersion)
|
pluginId = getInstalledPlugin(fileName, fileVersion)
|
||||||
latestVersion = getLatestPluginVersion(pluginId)
|
latestVersion = getLatestPluginVersion(pluginId)
|
||||||
except TypeError:
|
except TypeError:
|
||||||
|
i += 1
|
||||||
continue
|
continue
|
||||||
except ValueError:
|
except ValueError:
|
||||||
|
i += 1
|
||||||
continue
|
continue
|
||||||
pluginIdStr = str(pluginId)
|
pluginIdStr = str(pluginId)
|
||||||
|
|
||||||
@ -161,7 +165,7 @@ def updateInstalledPackage(inputSelectedObject='all'):
|
|||||||
pluginPath = checkConfig().sftp_pathToSeperateDownloadPath
|
pluginPath = checkConfig().sftp_pathToSeperateDownloadPath
|
||||||
else:
|
else:
|
||||||
pluginPath = checkConfig().sftp_folderPath
|
pluginPath = checkConfig().sftp_folderPath
|
||||||
pluginPath = f"{pluginPath}\\{plugin}"
|
pluginPath = Path(f"{pluginPath}/{plugin}")
|
||||||
sftp = createSFTPConnection()
|
sftp = createSFTPConnection()
|
||||||
indexNumberUpdated += 1
|
indexNumberUpdated += 1
|
||||||
pluginsUpdated += 1
|
pluginsUpdated += 1
|
||||||
@ -173,13 +177,13 @@ def updateInstalledPackage(inputSelectedObject='all'):
|
|||||||
print(oColors.brightRed + f"Error: {err.code} - {err.reason}" + oColors.standardWhite)
|
print(oColors.brightRed + f"Error: {err.code} - {err.reason}" + oColors.standardWhite)
|
||||||
pluginsUpdated -= 1
|
pluginsUpdated -= 1
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
print(oColors.brightRed + f"Error: Old plugin file coulnd't be deleted" + oColors.standardWhite)
|
print(oColors.brightRed + "Error: Old plugin file coulnd't be deleted" + oColors.standardWhite)
|
||||||
else:
|
else:
|
||||||
if checkConfig().seperateDownloadPath is True:
|
if checkConfig().seperateDownloadPath is True:
|
||||||
pluginPath = checkConfig().pathToSeperateDownloadPath
|
pluginPath = checkConfig().pathToSeperateDownloadPath
|
||||||
else:
|
else:
|
||||||
pluginPath = checkConfig().pathToPluginFolder
|
pluginPath = checkConfig().pathToPluginFolder
|
||||||
pluginPath = f"{pluginPath}\\{plugin}"
|
pluginPath = Path(f"{pluginPath}/{plugin}")
|
||||||
indexNumberUpdated += 1
|
indexNumberUpdated += 1
|
||||||
pluginsUpdated += 1
|
pluginsUpdated += 1
|
||||||
try:
|
try:
|
||||||
@ -211,7 +215,7 @@ def updateInstalledPackage(inputSelectedObject='all'):
|
|||||||
else:
|
else:
|
||||||
pluginPath = checkConfig().sftp_folderPath
|
pluginPath = checkConfig().sftp_folderPath
|
||||||
pluginPath = checkConfig().sftp_folderPath
|
pluginPath = checkConfig().sftp_folderPath
|
||||||
pluginPath = f"{pluginPath}\\{plugin}"
|
pluginPath = f"{pluginPath}/{plugin}"
|
||||||
sftp = createSFTPConnection()
|
sftp = createSFTPConnection()
|
||||||
indexNumberUpdated += 1
|
indexNumberUpdated += 1
|
||||||
pluginsUpdated += 1
|
pluginsUpdated += 1
|
||||||
@ -230,7 +234,7 @@ def updateInstalledPackage(inputSelectedObject='all'):
|
|||||||
pluginPath = checkConfig().pathToSeperateDownloadPath
|
pluginPath = checkConfig().pathToSeperateDownloadPath
|
||||||
else:
|
else:
|
||||||
pluginPath = checkConfig().pathToPluginFolder
|
pluginPath = checkConfig().pathToPluginFolder
|
||||||
pluginPath = f"{pluginPath}\\{plugin}"
|
pluginPath = Path(f"{pluginPath}/{plugin}")
|
||||||
indexNumberUpdated += 1
|
indexNumberUpdated += 1
|
||||||
pluginsUpdated += 1
|
pluginsUpdated += 1
|
||||||
try:
|
try:
|
||||||
@ -254,13 +258,11 @@ def updateInstalledPackage(inputSelectedObject='all'):
|
|||||||
def getInstalledPlugin(localFileName, localFileVersion):
|
def getInstalledPlugin(localFileName, localFileVersion):
|
||||||
url = "https://api.spiget.org/v2/search/resources/" + localFileName + "?field=name&sort=-downloads"
|
url = "https://api.spiget.org/v2/search/resources/" + localFileName + "?field=name&sort=-downloads"
|
||||||
packageName = doAPIRequest(url)
|
packageName = doAPIRequest(url)
|
||||||
i = 1
|
|
||||||
plugin_match_found = False
|
plugin_match_found = False
|
||||||
pluginID = None
|
pluginID = None
|
||||||
for ressource in packageName:
|
for ressource in packageName:
|
||||||
if plugin_match_found == True:
|
if plugin_match_found == True:
|
||||||
break
|
break
|
||||||
|
|
||||||
pID = ressource["id"]
|
pID = ressource["id"]
|
||||||
url2 = f"https://api.spiget.org/v2/resources/{pID}/versions?size=100&sort=-name"
|
url2 = f"https://api.spiget.org/v2/resources/{pID}/versions?size=100&sort=-name"
|
||||||
packageVersions = doAPIRequest(url2)
|
packageVersions = doAPIRequest(url2)
|
||||||
@ -273,9 +275,8 @@ def getInstalledPlugin(localFileName, localFileVersion):
|
|||||||
plugin_latest_version = getLatestPluginVersion(pID)
|
plugin_latest_version = getLatestPluginVersion(pID)
|
||||||
plugin_is_outdated = compareVersions(plugin_latest_version, updateVersion)
|
plugin_is_outdated = compareVersions(plugin_latest_version, updateVersion)
|
||||||
addToPluginList(pID, updateId, plugin_latest_version , plugin_is_outdated)
|
addToPluginList(pID, updateId, plugin_latest_version , plugin_is_outdated)
|
||||||
break
|
return pluginID
|
||||||
|
|
||||||
i = i + 1
|
|
||||||
else:
|
else:
|
||||||
if plugin_match_found != True:
|
if plugin_match_found != True:
|
||||||
pID = None
|
pID = None
|
||||||
@ -285,11 +286,3 @@ def getInstalledPlugin(localFileName, localFileVersion):
|
|||||||
addToPluginList(pID, updateId, plugin_latest_version , plugin_is_outdated)
|
addToPluginList(pID, updateId, plugin_latest_version , plugin_is_outdated)
|
||||||
|
|
||||||
return pluginID
|
return pluginID
|
||||||
|
|
||||||
|
|
||||||
# start query
|
|
||||||
# get id
|
|
||||||
# search with id for all version upates
|
|
||||||
# get version that matches installed version
|
|
||||||
# if match then download latest update
|
|
||||||
# else get second query
|
|
||||||
|
0
src/serverjar/__init__.py
Normal file
0
src/serverjar/__init__.py
Normal file
115
src/serverjar/serverjar_checker.py
Normal file
115
src/serverjar/serverjar_checker.py
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
import os
|
||||||
|
import sys
|
||||||
|
from urllib.error import HTTPError
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
from handlers.handle_sftp import createSFTPConnection, sftp_listFilesInServerRoot
|
||||||
|
from handlers.handle_config import checkConfig
|
||||||
|
from utils.consoleoutput import oColors
|
||||||
|
from serverjar.serverjar_paper import paperCheckForUpdate, papermc_downloader
|
||||||
|
|
||||||
|
|
||||||
|
def checkInstalledServerjar():
|
||||||
|
if not checkConfig().localPluginFolder:
|
||||||
|
sftp = createSFTPConnection()
|
||||||
|
serverRootList = sftp_listFilesInServerRoot(sftp)
|
||||||
|
else:
|
||||||
|
serverRootList = os.path.dirname(checkConfig().pathToPluginFolder)
|
||||||
|
serverRootList = os.listdir(serverRootList)
|
||||||
|
installedServerjarFullName = None
|
||||||
|
try:
|
||||||
|
for files in serverRootList:
|
||||||
|
try:
|
||||||
|
if '.jar' in files:
|
||||||
|
installedServerjarFullName = files
|
||||||
|
break
|
||||||
|
except TypeError:
|
||||||
|
continue
|
||||||
|
except TypeError:
|
||||||
|
print(oColors.brightRed + "Serverjar couldn't be found." + oColors.standardWhite)
|
||||||
|
print(oColors.brightRed + "Aborting the process." + oColors.standardWhite)
|
||||||
|
|
||||||
|
if installedServerjarFullName == None:
|
||||||
|
print(oColors.brightRed + "Serverjar couldn't be found." + oColors.standardWhite)
|
||||||
|
print(oColors.brightRed + "Aborting the process." + oColors.standardWhite)
|
||||||
|
input("Press any key + enter to exit...")
|
||||||
|
sys.exit()
|
||||||
|
|
||||||
|
if 'paper' in installedServerjarFullName:
|
||||||
|
paperCheckForUpdate(installedServerjarFullName)
|
||||||
|
|
||||||
|
else:
|
||||||
|
print(oColors.brightRed + f"{installedServerjarFullName} isn't supported.")
|
||||||
|
print(oColors.brightRed + "Aborting the process." + oColors.standardWhite)
|
||||||
|
|
||||||
|
|
||||||
|
def updateServerjar(serverJarBuild='latest'):
|
||||||
|
try:
|
||||||
|
if serverJarBuild == None:
|
||||||
|
serverJarBuild = 'latest'
|
||||||
|
if not checkConfig().localPluginFolder:
|
||||||
|
sftp = createSFTPConnection()
|
||||||
|
serverRootPath = checkConfig().sftp_folderPath
|
||||||
|
serverRootPath = Path(str(serverRootPath).replace(r'/plugins', ''))
|
||||||
|
serverRootList = sftp_listFilesInServerRoot(sftp)
|
||||||
|
|
||||||
|
else:
|
||||||
|
serverRoot = os.path.dirname(checkConfig().pathToPluginFolder)
|
||||||
|
serverRootList = os.listdir(serverRoot)
|
||||||
|
serverRootPath = checkConfig().pathToPluginFolder
|
||||||
|
helpPath = Path('/plugins')
|
||||||
|
helpPathstr = str(helpPath)
|
||||||
|
serverRootPath = Path(str(serverRootPath).replace(helpPathstr, ''))
|
||||||
|
installedServerjarFullName = None
|
||||||
|
|
||||||
|
except FileNotFoundError:
|
||||||
|
print(oColors.brightRed + "Path couldn't be found!" + oColors.standardWhite)
|
||||||
|
print(oColors.brightRed + "Check your config!" + oColors.standardWhite)
|
||||||
|
print(oColors.brightRed + "Aborting the process." + oColors.standardWhite)
|
||||||
|
input("Press any key + enter to exit...")
|
||||||
|
sys.exit()
|
||||||
|
|
||||||
|
try:
|
||||||
|
for files in serverRootList:
|
||||||
|
try:
|
||||||
|
if '.jar' in files:
|
||||||
|
installedServerjarFullName = files
|
||||||
|
break
|
||||||
|
except TypeError:
|
||||||
|
continue
|
||||||
|
except TypeError:
|
||||||
|
print(oColors.brightRed + "Serverjar couldn't be found." + oColors.standardWhite)
|
||||||
|
print(oColors.brightRed + "Aborting the process." + oColors.standardWhite)
|
||||||
|
|
||||||
|
if installedServerjarFullName == None:
|
||||||
|
print(oColors.brightRed + "Serverjar couldn't be found." + oColors.standardWhite)
|
||||||
|
print(oColors.brightRed + "Aborting the process." + oColors.standardWhite)
|
||||||
|
input("Press any key + enter to exit...")
|
||||||
|
sys.exit()
|
||||||
|
|
||||||
|
serverJarPath = Path(f"{serverRootPath}/{installedServerjarFullName}")
|
||||||
|
|
||||||
|
if 'paper' in installedServerjarFullName:
|
||||||
|
print(f"Updating Paper to build: {serverJarBuild}")
|
||||||
|
if not checkConfig().localPluginFolder:
|
||||||
|
try:
|
||||||
|
papermc_downloader(serverJarBuild, installedServerjarFullName)
|
||||||
|
sftp.remove(serverJarPath)
|
||||||
|
except HTTPError as err:
|
||||||
|
print(oColors.brightRed + f"Error: {err.code} - {err.reason}" + oColors.standardWhite)
|
||||||
|
except FileNotFoundError:
|
||||||
|
print(oColors.brightRed + "Error: Old serverjar file coulnd't be deleted" + oColors.standardWhite)
|
||||||
|
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
papermc_downloader(serverJarBuild, installedServerjarFullName)
|
||||||
|
os.remove(serverJarPath)
|
||||||
|
except HTTPError as err:
|
||||||
|
print(oColors.brightRed + f"Error: {err.code} - {err.reason}" + oColors.standardWhite)
|
||||||
|
except FileNotFoundError:
|
||||||
|
print(oColors.brightRed + "Error: Old serverjar file coulnd't be deleted" + oColors.standardWhite)
|
||||||
|
|
||||||
|
else:
|
||||||
|
print(oColors.brightRed + f"{installedServerjarFullName} isn't supported.")
|
||||||
|
print(oColors.brightRed + "Aborting the process." + oColors.standardWhite)
|
||||||
|
|
170
src/serverjar/serverjar_paper.py
Normal file
170
src/serverjar/serverjar_paper.py
Normal file
@ -0,0 +1,170 @@
|
|||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import re
|
||||||
|
import urllib.request
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
from utils.consoleoutput import oColors
|
||||||
|
from utils.web_request import doAPIRequest
|
||||||
|
from handlers.handle_sftp import sftp_upload_server_jar, sftp_cdPluginDir, createSFTPConnection
|
||||||
|
from handlers.handle_config import checkConfig
|
||||||
|
from utils.utilities import createTempPluginFolder, deleteTempPluginFolder, calculateFileSizeMb
|
||||||
|
|
||||||
|
|
||||||
|
# = 1.16.5
|
||||||
|
def getInstalledPaperMinecraftVersion(localPaperName):
|
||||||
|
mcVersionFull = re.search(r'(\d*\.*\d)+', localPaperName)
|
||||||
|
try:
|
||||||
|
mcVersion = mcVersionFull.group()
|
||||||
|
except AttributeError:
|
||||||
|
mcVersion = mcVersionFull
|
||||||
|
return mcVersion
|
||||||
|
|
||||||
|
|
||||||
|
# = 550
|
||||||
|
def getInstalledPaperVersion(localPaperName):
|
||||||
|
paperBuildFull = re.search(r'([\d]*.jar)', localPaperName)
|
||||||
|
try:
|
||||||
|
paperBuild = paperBuildFull.group()
|
||||||
|
except AttributeError:
|
||||||
|
paperBuild = paperBuildFull
|
||||||
|
paperBuild = paperBuild.replace('.jar', '')
|
||||||
|
return paperBuild
|
||||||
|
|
||||||
|
|
||||||
|
def findVersionGroup(mcVersion):
|
||||||
|
versionGroups = ['1.16', '1.15']
|
||||||
|
versionGroupFound = False
|
||||||
|
for versionGroup in versionGroups:
|
||||||
|
if versionGroupFound == True:
|
||||||
|
break
|
||||||
|
url = f"https://papermc.io/api/v2/projects/paper/version_group/{versionGroup}/builds"
|
||||||
|
papermcdetails = doAPIRequest(url)
|
||||||
|
papermcVersionForMc = papermcdetails["versions"]
|
||||||
|
for versions in papermcVersionForMc:
|
||||||
|
if versions == mcVersion:
|
||||||
|
versionGroupFound = True
|
||||||
|
paperVersionGroup = versionGroup
|
||||||
|
break
|
||||||
|
if versionGroup == mcVersion:
|
||||||
|
versionGroupFound = True
|
||||||
|
paperVersionGroup = versionGroup
|
||||||
|
break
|
||||||
|
|
||||||
|
return paperVersionGroup
|
||||||
|
|
||||||
|
|
||||||
|
def findBuildVersion(wantedPaperBuild):
|
||||||
|
versionGroups = ['1.16', '1.15']
|
||||||
|
paperBuildFound = False
|
||||||
|
for versionGroup in versionGroups:
|
||||||
|
if paperBuildFound is True:
|
||||||
|
break
|
||||||
|
url = f"https://papermc.io/api/v2/projects/paper/version_group/{versionGroup}/builds"
|
||||||
|
papermcdetails = doAPIRequest(url)
|
||||||
|
paperMcBuilds = papermcdetails["builds"]
|
||||||
|
for build in paperMcBuilds:
|
||||||
|
paperBuild = str(build["build"])
|
||||||
|
if paperBuild == wantedPaperBuild:
|
||||||
|
paperBuildFound = True
|
||||||
|
paperVersionGroup = build["version"]
|
||||||
|
break
|
||||||
|
return paperVersionGroup
|
||||||
|
|
||||||
|
|
||||||
|
def findLatestBuild(paperVersionGroup):
|
||||||
|
url = f"https://papermc.io/api/v2/projects/paper/version_group/{paperVersionGroup}/builds"
|
||||||
|
papermcbuilds = doAPIRequest(url)
|
||||||
|
latestPaperBuild = papermcbuilds["builds"][-1]["build"]
|
||||||
|
return latestPaperBuild
|
||||||
|
|
||||||
|
|
||||||
|
def findLatestBuildForVersion(mcVersion):
|
||||||
|
url = f"https://papermc.io/api/v2/projects/paper/versions/{mcVersion}"
|
||||||
|
papermcbuilds = doAPIRequest(url)
|
||||||
|
latestPaperBuild = papermcbuilds["builds"][-1]
|
||||||
|
return latestPaperBuild
|
||||||
|
|
||||||
|
|
||||||
|
def versionBehind(installedPaperBuild, latestPaperBuild):
|
||||||
|
installedPaperBuildint = int(installedPaperBuild)
|
||||||
|
latestPaperBuildint = int(latestPaperBuild)
|
||||||
|
versionsBehind = latestPaperBuildint - installedPaperBuildint
|
||||||
|
return versionsBehind
|
||||||
|
|
||||||
|
|
||||||
|
def getDownloadFileName(paperMcVersion, paperBuild):
|
||||||
|
url = f"https://papermc.io/api/v2/projects/paper/versions/{paperMcVersion}/builds/{paperBuild}"
|
||||||
|
buildDetails = doAPIRequest(url)
|
||||||
|
downloadName = buildDetails["downloads"]["application"]["name"]
|
||||||
|
return downloadName
|
||||||
|
|
||||||
|
|
||||||
|
def paperCheckForUpdate(installedServerjarFullName):
|
||||||
|
mcVersion = getInstalledPaperMinecraftVersion(installedServerjarFullName)
|
||||||
|
paperInstalledBuild = getInstalledPaperVersion(installedServerjarFullName)
|
||||||
|
versionGroup = findVersionGroup(mcVersion)
|
||||||
|
paperLatestBuild = findLatestBuild(versionGroup)
|
||||||
|
paperVersionBehind = versionBehind(paperInstalledBuild, paperLatestBuild)
|
||||||
|
|
||||||
|
print(f"Paper for {mcVersion}")
|
||||||
|
print("Index | Name | Installed V. | Latest V. | Versions behind ")
|
||||||
|
print(f" [1]".ljust(8), end='')
|
||||||
|
print(f"paper".ljust(21), end='')
|
||||||
|
print(f"{paperInstalledBuild}".ljust(8), end='')
|
||||||
|
print(" ", end='')
|
||||||
|
print(f"{paperLatestBuild}".ljust(8), end='')
|
||||||
|
print(" ", end='')
|
||||||
|
print(f"{paperVersionBehind}".ljust(8))
|
||||||
|
|
||||||
|
|
||||||
|
# https://papermc.io/api/docs/swagger-ui/index.html?configUrl=/api/openapi/swagger-config#/
|
||||||
|
def papermc_downloader(paperBuild='latest', installedServerjarName=None, mcVersion=None):
|
||||||
|
if checkConfig().localPluginFolder == False:
|
||||||
|
downloadPath = createTempPluginFolder()
|
||||||
|
else:
|
||||||
|
downloadPath = checkConfig().pathToPluginFolder
|
||||||
|
helpPath = Path('/plugins')
|
||||||
|
helpPathstr = str(helpPath)
|
||||||
|
downloadPath = Path(str(downloadPath).replace(helpPathstr, ''))
|
||||||
|
|
||||||
|
if mcVersion == None:
|
||||||
|
if paperBuild == 'latest':
|
||||||
|
mcVersion = '1.16.5'
|
||||||
|
else:
|
||||||
|
mcVersion = findBuildVersion(paperBuild)
|
||||||
|
|
||||||
|
if installedServerjarName != None:
|
||||||
|
mcVersion = getInstalledPaperMinecraftVersion(installedServerjarName)
|
||||||
|
|
||||||
|
if paperBuild == 'latest':
|
||||||
|
paperBuild = findLatestBuildForVersion(mcVersion)
|
||||||
|
try:
|
||||||
|
downloadFileName = getDownloadFileName(mcVersion, paperBuild)
|
||||||
|
except KeyError:
|
||||||
|
print(oColors.brightRed + f"This version wasn't found for {mcVersion}" + oColors.standardWhite)
|
||||||
|
print(oColors.brightRed + f"Reverting to latest version for {mcVersion}" + oColors.standardWhite)
|
||||||
|
paperBuild = findLatestBuildForVersion(mcVersion)
|
||||||
|
downloadFileName = getDownloadFileName(mcVersion, paperBuild)
|
||||||
|
|
||||||
|
downloadPackagePath = Path(f"{downloadPath}/{downloadFileName}")
|
||||||
|
|
||||||
|
if checkConfig().localPluginFolder == False:
|
||||||
|
downloadPath = createTempPluginFolder()
|
||||||
|
|
||||||
|
url = f"https://papermc.io/api/v2/projects/paper/versions/{mcVersion}/builds/{paperBuild}/downloads/{downloadFileName}"
|
||||||
|
remotefile = urllib.request.urlopen(url)
|
||||||
|
filesize = remotefile.info()['Content-Length']
|
||||||
|
print(f"Starting Paper-{paperBuild} download for {mcVersion}...")
|
||||||
|
urllib.request.urlretrieve(url, downloadPackagePath)
|
||||||
|
filesizeData = calculateFileSizeMb(filesize)
|
||||||
|
|
||||||
|
print(f"Downloadsize: {filesizeData} MB")
|
||||||
|
print(f"File downloaded here: {downloadPackagePath}")
|
||||||
|
if not checkConfig().localPluginFolder:
|
||||||
|
sftpSession = createSFTPConnection()
|
||||||
|
sftp_upload_server_jar(sftpSession, downloadPackagePath)
|
||||||
|
deleteTempPluginFolder(downloadPath)
|
||||||
|
|
||||||
|
print(oColors.brightGreen + "Downloaded successfully " + oColors.standardWhite + f"Paper-{paperBuild}" + \
|
||||||
|
oColors.brightGreen + " for " + oColors.standardWhite + f"{mcVersion}" + oColors.standardWhite)
|
@ -3,6 +3,7 @@ import os
|
|||||||
import sys
|
import sys
|
||||||
import shutil
|
import shutil
|
||||||
import requests
|
import requests
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
from utils.consoleoutput import oColors
|
from utils.consoleoutput import oColors
|
||||||
from handlers.handle_config import checkConfig
|
from handlers.handle_config import checkConfig
|
||||||
@ -59,7 +60,7 @@ def check_requirements():
|
|||||||
|
|
||||||
|
|
||||||
def createTempPluginFolder():
|
def createTempPluginFolder():
|
||||||
tempPluginFolder = ".\\plugins"
|
tempPluginFolder = Path("./TempSFTPUploadFolder")
|
||||||
if not os.path.isdir(tempPluginFolder):
|
if not os.path.isdir(tempPluginFolder):
|
||||||
try:
|
try:
|
||||||
os.mkdir(tempPluginFolder)
|
os.mkdir(tempPluginFolder)
|
||||||
@ -76,3 +77,10 @@ def deleteTempPluginFolder(tempPluginFolder):
|
|||||||
shutil.rmtree(tempPluginFolder)
|
shutil.rmtree(tempPluginFolder)
|
||||||
except OSError as e:
|
except OSError as e:
|
||||||
print ("Error: %s - %s." % (e.filename, e.strerror))
|
print ("Error: %s - %s." % (e.filename, e.strerror))
|
||||||
|
|
||||||
|
|
||||||
|
def calculateFileSizeMb(downloadFileSize):
|
||||||
|
fileSizeDownload = int(downloadFileSize)
|
||||||
|
fileSizeMb = fileSizeDownload / 1024 / 1024
|
||||||
|
roundedFileSize = round(fileSizeMb, 2)
|
||||||
|
return roundedFileSize
|
||||||
|
Loading…
Reference in New Issue
Block a user