mirror of
https://github.com/Neocky/pluGET.git
synced 2024-04-29 16:12:30 +00:00
Added sftp & ftp functionality back
This commit is contained in:
187
src/handlers/handle_ftp.py
Normal file
187
src/handlers/handle_ftp.py
Normal file
@@ -0,0 +1,187 @@
|
||||
import os
|
||||
import sys
|
||||
import ftplib
|
||||
import re
|
||||
|
||||
from src.utils.console_output import rich_print_error
|
||||
from src.handlers.handle_config import config_value
|
||||
|
||||
|
||||
def ftp_create_connection():
|
||||
"""
|
||||
Creates a connection to the ftp server with the given values in the config
|
||||
|
||||
:returns: ftp connection type
|
||||
"""
|
||||
config_values = config_value()
|
||||
try:
|
||||
ftp = ftplib.FTP()
|
||||
ftp.connect(config_values.server, config_values.ftp_port)
|
||||
ftp.login(config_values.username, config_values.password)
|
||||
return ftp
|
||||
except UnboundLocalError:
|
||||
rich_print_error("Error: [SFTP]: Check your config file!")
|
||||
rich_print_error("Exiting program...")
|
||||
sys.exit()
|
||||
|
||||
|
||||
def ftp_show_plugins(ftp) -> None:
|
||||
"""
|
||||
Prints all plugins in the plugin folder
|
||||
|
||||
:param ftp: ftp connection
|
||||
|
||||
:returns: None
|
||||
"""
|
||||
config_values = config_value()
|
||||
ftp.cwd(config_values.remote_plugin_folder_on_server)
|
||||
for attr in ftp.dir():
|
||||
print(attr.filename, attr)
|
||||
return None
|
||||
|
||||
|
||||
def ftp_upload_file(ftp, path_item) -> None:
|
||||
"""
|
||||
Uploads a file to the ftp server
|
||||
|
||||
:param ftp: ftp connection
|
||||
:param path_item: Name of the item which should be uploaded
|
||||
|
||||
:returns: None
|
||||
"""
|
||||
config_values = config_value()
|
||||
if config_values.remote_seperate_download_path is True:
|
||||
path_upload_folder = config_values.remote_path_to_seperate_download_path
|
||||
else:
|
||||
path_upload_folder = config_values.remote_plugin_folder_on_server
|
||||
try:
|
||||
ftp.cwd(path_upload_folder)
|
||||
path_item = os.path.relpath(path_item, 'TempSFTPFolder/')
|
||||
path_item = str(path_item)
|
||||
current_directory = os.getcwd()
|
||||
os.chdir('TempSFTPFolder')
|
||||
with open (path_item, 'rb') as plugin_file:
|
||||
ftp.storbinary('STOR '+ str(path_item), plugin_file)
|
||||
except FileNotFoundError:
|
||||
rich_print_error("Error: [FTP]: The 'plugins' folder couldn't be found on the remote host!")
|
||||
rich_print_error("Error: [FTP]: Aborting uploading.")
|
||||
os.chdir(current_directory)
|
||||
ftp.close()
|
||||
return None
|
||||
|
||||
|
||||
def ftp_upload_server_jar(ftp, path_item) -> None:
|
||||
"""
|
||||
Uploads a serverjar to the root folder of the ftp host
|
||||
|
||||
:param ftp: ftp connection
|
||||
:param path_item: Name of the file which should be uploaded
|
||||
|
||||
:returns: None
|
||||
"""
|
||||
try:
|
||||
ftp.cwd('.')
|
||||
path_item = os.path.relpath(path_item, 'TempSFTPFolder/')
|
||||
path_item = str(path_item)
|
||||
current_directory = os.getcwd()
|
||||
os.chdir('TempSFTPFolder')
|
||||
with open (path_item, 'rb') as server_jar:
|
||||
ftp.storbinary('STOR '+ str(path_item), server_jar)
|
||||
except FileNotFoundError:
|
||||
rich_print_error("Error: [FTP]: The 'root' folder couldn't be found on the remote host!")
|
||||
rich_print_error("Error: [FTP]: Aborting uploading.")
|
||||
os.chdir(current_directory)
|
||||
ftp.close()
|
||||
return None
|
||||
|
||||
|
||||
def ftp_list_all(ftp):
|
||||
"""
|
||||
Returns a list with all installed plugins in the plugin folder of the ftp host
|
||||
|
||||
:param ftp: ftp connection
|
||||
|
||||
:returns: List of all plugins in plugin folder
|
||||
"""
|
||||
config_values = config_value()
|
||||
try:
|
||||
ftp.cwd(config_values.remote_plugin_folder_on_server)
|
||||
installed_plugins = ftp.nlst()
|
||||
except FileNotFoundError:
|
||||
rich_print_error("Error: [FTP]: The 'plugins' folder couldn't be found on the remote host!")
|
||||
|
||||
try:
|
||||
return installed_plugins
|
||||
except UnboundLocalError:
|
||||
rich_print_error("Error: [FTP]: No plugins were found.")
|
||||
|
||||
|
||||
def ftp_listFilesInServerRoot(ftp):
|
||||
"""
|
||||
Returns a list with all files in the root folder of the ftp host
|
||||
|
||||
:param ftp: ftp connection
|
||||
|
||||
:returns: List of all files in root folder
|
||||
"""
|
||||
try:
|
||||
ftp.cwd('.')
|
||||
filesInServerRoot = ftp.nlst()
|
||||
except FileNotFoundError:
|
||||
rich_print_error("Error: [FTP]: The 'root' folder couldn't be found on the remote host!")
|
||||
|
||||
try:
|
||||
return filesInServerRoot
|
||||
except UnboundLocalError:
|
||||
rich_print_error("Error: [FTP]: No Serverjar was found.")
|
||||
|
||||
|
||||
def ftp_downloadFile(ftp, path_download, file) -> None:
|
||||
"""
|
||||
Download a file of the ftp server
|
||||
|
||||
:param ftp: ftp connection
|
||||
:param path_download: Path to save downloaded file to
|
||||
:param file: File to download
|
||||
|
||||
:returns None
|
||||
"""
|
||||
config_values = config_value()
|
||||
ftp.cwd(config_values.remote_plugin_folder_on_server)
|
||||
filedata = open(path_download,'wb')
|
||||
ftp.retrbinary('RETR '+file, filedata.write)
|
||||
filedata.close()
|
||||
ftp.quit()
|
||||
return None
|
||||
|
||||
|
||||
def ftp_is_file(ftp, plugin_path) -> bool:
|
||||
"""
|
||||
Check if file on ftp host is a file and not a directory
|
||||
|
||||
:param ftp: ftp connection
|
||||
:param plugin_path
|
||||
|
||||
:returns: True if file is a file and not a directory
|
||||
"""
|
||||
if ftp.nlst(plugin_path) == [plugin_path]:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
|
||||
def ftp_validate_file_attributes(ftp, plugin_path) -> bool:
|
||||
"""
|
||||
Check if a file is a legitimate plugin file
|
||||
|
||||
:param ftp: ftp connection
|
||||
:param plugin_path: Path of file to check
|
||||
|
||||
:returns: If file is a plugin file or not
|
||||
"""
|
||||
if ftp_is_file(ftp, plugin_path) is False:
|
||||
return False
|
||||
if re.search(r'.jar$', plugin_path):
|
||||
return True
|
||||
else:
|
||||
return False
|
@@ -18,7 +18,12 @@ from src.plugin.plugin_updatechecker import check_installed_plugins
|
||||
# search ???
|
||||
|
||||
|
||||
def handle_input(input_command=None, input_selected_object=None, input_parameter=None, arguments_from_console=False) -> None:
|
||||
def handle_input(
|
||||
input_command: str=None,
|
||||
input_selected_object: str=None,
|
||||
input_parameter: str=None,
|
||||
arguments_from_console: bool=False
|
||||
) -> None:
|
||||
"""
|
||||
Manages the correct function calling from the given input
|
||||
"""
|
||||
@@ -50,13 +55,11 @@ def handle_input(input_command=None, input_selected_object=None, input_parameter
|
||||
#updateInstalledPackage(inputSelectedObject)
|
||||
|
||||
case "check":
|
||||
print("check package")
|
||||
match input_selected_object:
|
||||
case "serverjar":
|
||||
print("check serverjar")
|
||||
#checkInstalledServerjar()
|
||||
case _:
|
||||
print("check plugins")
|
||||
check_installed_plugins(input_selected_object, input_parameter)
|
||||
|
||||
case "search":
|
||||
@@ -81,7 +84,7 @@ def handle_input(input_command=None, input_selected_object=None, input_parameter
|
||||
|
||||
def get_input() -> None:
|
||||
"""
|
||||
Gets command line input and calls the handle input function
|
||||
Gets command line input and calls the handle input function
|
||||
"""
|
||||
input_command = None
|
||||
print("\n'STRG + C' to exit")
|
||||
|
168
src/handlers/handle_sftp.py
Normal file
168
src/handlers/handle_sftp.py
Normal file
@@ -0,0 +1,168 @@
|
||||
import sys
|
||||
import os
|
||||
import pysftp
|
||||
import paramiko
|
||||
import stat
|
||||
import re
|
||||
|
||||
from src.utils.console_output import rich_print_error
|
||||
from src.handlers.handle_config import config_value
|
||||
|
||||
|
||||
def sftp_create_connection():
|
||||
"""
|
||||
Creates a sftp connection with the given values in the config file
|
||||
|
||||
:returns: SFTP connection type
|
||||
"""
|
||||
config_values = config_value()
|
||||
cnopts = pysftp.CnOpts()
|
||||
cnopts.hostkeys = None # TODO fix this
|
||||
try:
|
||||
sftp = pysftp.Connection(config_values.server, username=config_values.username, \
|
||||
password=config_values.password, port=config_values.sftp_port, cnopts=cnopts)
|
||||
except paramiko.ssh_exception.AuthenticationException:
|
||||
rich_print_error("Error: [SFTP]: Wrong Username/Password")
|
||||
except paramiko.ssh_exception.SSHException:
|
||||
rich_print_error("Error: [SFTP]: The SFTP server isn't available.")
|
||||
try:
|
||||
return sftp
|
||||
except UnboundLocalError:
|
||||
rich_print_error("Error: [SFTP]: Check your config file!")
|
||||
rich_print_error("Exiting program...")
|
||||
sys.exit()
|
||||
|
||||
|
||||
def sftp_show_plugins(sftp) -> None:
|
||||
"""
|
||||
Prints all plugins in the sftp folder
|
||||
|
||||
:param sftp: sftp connection
|
||||
|
||||
:returns: None
|
||||
"""
|
||||
config_values = config_value()
|
||||
sftp.cd(config_values.remote_plugin_folder_on_server)
|
||||
for attr in sftp.listdir_attr():
|
||||
print(attr.filename, attr)
|
||||
sftp.close()
|
||||
return None
|
||||
|
||||
|
||||
def sftp_upload_file(sftp, path_item) -> None:
|
||||
"""
|
||||
Uploads a file to the set folder from the config file
|
||||
|
||||
:param sftp: sftp connection
|
||||
:param path_item: The upload path with the item name
|
||||
|
||||
:returns: None
|
||||
"""
|
||||
config_values = config_value()
|
||||
if config_values.remote_seperate_download_path is True:
|
||||
path_upload_folder = config_values.remote_path_to_seperate_download_path
|
||||
else:
|
||||
path_upload_folder = config_values.remote_plugin_folder_on_server
|
||||
try:
|
||||
sftp.chdir(path_upload_folder)
|
||||
sftp.put(path_item)
|
||||
except FileNotFoundError:
|
||||
rich_print_error("Error: [SFTP]: The 'plugins' folder couldn't be found on the remote host!")
|
||||
rich_print_error("Error: [SFTP]: Aborting uploading.")
|
||||
sftp.close()
|
||||
return None
|
||||
|
||||
|
||||
def sftp_upload_server_jar(sftp, path_item) -> None:
|
||||
"""
|
||||
Uploads the server jar to the root folder
|
||||
|
||||
:param sftp: sftp connection
|
||||
:param path_item: The upload path with the item name
|
||||
|
||||
:returns: None
|
||||
"""
|
||||
try:
|
||||
sftp.chdir('.')
|
||||
sftp.put(path_item)
|
||||
except FileNotFoundError:
|
||||
rich_print_error("Error: [SFTP]: The 'root' folder couldn't be found on the remote host!")
|
||||
rich_print_error("Error: [SFTP]: Aborting uploading.")
|
||||
sftp.close()
|
||||
return None
|
||||
|
||||
|
||||
def sftp_list_all(sftp):
|
||||
"""
|
||||
List all plugins in the 'plugins' folder on the sftp host
|
||||
|
||||
:param sftp: sftp connection
|
||||
|
||||
:return: List of plugins in plugin folder
|
||||
"""
|
||||
config_values = config_value()
|
||||
try:
|
||||
sftp.chdir(config_values.remote_plugin_folder_on_server)
|
||||
installed_plugins = sftp.listdir()
|
||||
except FileNotFoundError:
|
||||
rich_print_error("Error: [SFTP]: The 'plugins' folder couldn't be found on the remote host!")
|
||||
|
||||
try:
|
||||
return installed_plugins
|
||||
except UnboundLocalError:
|
||||
rich_print_error("Error: [SFTP]: No plugins were found.")
|
||||
|
||||
|
||||
def sftp_list_files_in_server_root(sftp):
|
||||
"""
|
||||
List all files in the root folder on the sftp host
|
||||
|
||||
:param sftp: sftp connection
|
||||
|
||||
:returns: List of files in root folder
|
||||
"""
|
||||
try:
|
||||
files_in_server_root = sftp.listdir()
|
||||
except FileNotFoundError:
|
||||
rich_print_error("Error: [SFTP]: The 'root' folder couldn't be found on the remote host!")
|
||||
try:
|
||||
return files_in_server_root
|
||||
except UnboundLocalError:
|
||||
rich_print_error("Error: [SFTP]: No Serverjar was found.")
|
||||
|
||||
|
||||
def sftp_download_file(sftp, file) -> None:
|
||||
"""
|
||||
Downloads a plugin file from the sftp host to a temporary folder
|
||||
|
||||
:param sftp: sftp connection
|
||||
:param file: Filename of plugin
|
||||
|
||||
:returns: None
|
||||
"""
|
||||
config_values = config_value()
|
||||
sftp.cwd(config_values.remote_plugin_folder_on_server)
|
||||
current_directory = os.getcwd()
|
||||
os.chdir('TempSFTPFolder')
|
||||
sftp.get(file)
|
||||
sftp.close()
|
||||
os.chdir(current_directory)
|
||||
return None
|
||||
|
||||
|
||||
def sftp_validate_file_attributes(sftp, plugin_path) -> bool:
|
||||
"""
|
||||
Check if the file is a legitimate plugin file
|
||||
|
||||
:param sftp: sftp connection
|
||||
param plugin_path: Path of the single plugin file
|
||||
|
||||
:returns: If file is a plugin file or not
|
||||
"""
|
||||
plugin_sftp_attribute = sftp.lstat(plugin_path)
|
||||
if stat.S_ISDIR(plugin_sftp_attribute.st_mode):
|
||||
return False
|
||||
elif re.search(r'.jar$', plugin_path):
|
||||
return True
|
||||
else:
|
||||
return False
|
Reference in New Issue
Block a user