Function to upload site in ftp or sftp

This commit is contained in:
2026-05-21 13:02:20 +02:00
committed by kitoy
parent 50829e9f60
commit 5c17b65820
142 changed files with 288 additions and 933 deletions

View File

@@ -4,6 +4,8 @@ from werkzeug.utils import secure_filename
from app.forms import *
from PIL import Image
from pathlib import Path, PurePath, PurePosixPath
from shutil import rmtree, copytree
import subprocess
class DataSite:
user_folder = None
@@ -170,12 +172,40 @@ class DataSite:
print(f"Error removing directory (might not be empty): {e}")
def writeHTML(self, pageName :str, htmlExport :str):
public_folder = Path(PurePosixPath(self.user_folder).joinpath('public'))
pageName = pageName+'.html'
page = Path(PurePosixPath(self.user_folder).joinpath('public', pageName))
page.write_text(htmlExport)
def writeHTML(self, theme:str, pageName :str, htmlExport :str):
publicFolder = Path(PurePosixPath(self.user_folder).joinpath('public'))
themesFolder = Path(PurePosixPath('app').joinpath('templates','themes', self.datas['config']['theme'],'static'))
publicStaticFolder = Path(PurePosixPath(self.user_folder).joinpath('public', 'static'))
if pageName == '/':
pageIndex = publicFolder / 'index.html'
pageIndex.write_text(htmlExport)
else:
pageFolder = Path(PurePosixPath(self.user_folder).joinpath('public', pageName))
pageFolder.mkdir(exist_ok=True)
pageIndex = pageFolder / 'index.html'
pageIndex.write_text(htmlExport)
rmtree (publicStaticFolder, ignore_errors=True)
copytree(themesFolder, publicStaticFolder)
def publish(self, user:str, password:str, serverAddress:str, serverPort:int, folder:str):
remote_directory = "/remote/dir"
userDir = Path(PurePosixPath(self.user_folder))
command = "lftp -u \"{}\",\"{}\" -p {} {} -e ' mirror -R public {}; bye;'".format(user,
password,
serverPort,
serverAddress,
folder)
print(command)
try:
subprocess.call(command, shell=True, cwd=str(userDir))
except ChildProcessError:
return False
return True
def emptyTrash(self):
for file in self.trash:

View File

@@ -21,7 +21,7 @@ csrf = CSRFProtect(app)
app.secret_key = 'your_secret_key'
app.config.from_pyfile('config.py')
THEMES_FOLDER = './themes/'
THEMES_FOLDER = './templates/themes/'
USERS_FOLDER = app.config['USERS_FOLDER']
bcrypt = Bcrypt(app)
@@ -108,8 +108,7 @@ def editPhoto(page, image, bloc):
else:
return redirect ('/#'+bloc)
else:
return render_template(THEMES_FOLDER+theme+'/blocs/edit/_image-edit'+'.html', form=form, image=myblocs[bloc][image], bloc=myblocs[bloc])
return render_template(THEMES_FOLDER+theme+'/blocs/edit/_image-edit'+'.html', form=form, image=myblocs[bloc][image], bloc=myblocs[bloc])
@app.route('/upload-gallery/<bloc>', methods=['POST'], defaults={'page': ''})
@app.route('/<page>/upload-gallery/<bloc>', methods=['POST'])
@@ -169,7 +168,6 @@ def delImage(page, bloc, image):
return make_response(('Image removed', 200))
@app.route('/imgs_list/<blocname>', methods=['GET'], defaults={'page': ''})
@app.route('/<page>/imgs_list/<blocname>', methods=['GET'])
@login_required
@@ -186,7 +184,6 @@ def imagesList(page, blocname):
return render_template(THEMES_FOLDER+theme+'/blocs/edit/images_list.html',page=page,
bloc=bloc)
@app.route('/edit/<blocname>', methods=['GET', 'POST'], defaults={'page': ''})
@app.route('/<page>/edit/<blocname>', methods=['GET', 'POST'])
@login_required
@@ -298,7 +295,6 @@ def addBloc(page):
else:
return redirect(url_for('edit'))
@app.route('/addPage', methods=['POST'])
@login_required
def addPage():
@@ -340,10 +336,6 @@ def rmPage(pageName):
return redirect(url_for('edit'))
@app.route('/sortblocs', methods=['POST'], defaults={'page': ''})
@app.route('/<page>/sortblocs', methods=['POST'])
@@ -393,14 +385,14 @@ def editMenu():
flash (u'Le menu a bien été modifier', 'success');
return redirect(url_for('edit'))
@app.route('/public/img/<filename>')
@app.route('/img/<filename>')
@login_required
def myimgs(filename):
user = '%s' % escape(session['username'])
return send_from_directory(
os.path.join(USERS_FOLDER, user, 'public', 'img'), filename )
@app.route('/public/img/thumbnails/<filename>')
@app.route('/img/thumbnails/<filename>')
@login_required
def mythumbnails(filename):
user = '%s' % escape(session['username'])
@@ -414,7 +406,7 @@ def favicon():
@app.route('/publish', methods=['GET'])
@app.route('/publish', methods=['POST'])
@login_required
def publish():
user = '%s' % escape(session['username'])
@@ -422,6 +414,15 @@ def publish():
listPages = db.getPages()
theme = db.datas['config']['theme']
menu = db.datas['menu']
test_alphanum = "^[A-Za-z0-9/_-]*$"
serverAddress = str(request.form['serverAddress'])
serverPort = str(request.form['serverPort'])
username = str(request.form['username'])
password = str(request.form['password'])
folder = str(request.form['folder'])
for page in listPages:
myblocs = db.getBlocs(page)['blocs']
@@ -442,6 +443,23 @@ def publish():
page='/',
myblocs=myblocs)
db.writeHTML(theme, 'index', htmlExport)
db.writeHTML(theme, '/', htmlExport)
if serverPort == '' or serverPort.isdigit() == False :
serverPort = '22'
if folder == '' :
folder = '/'
elif(bool(re.match(test_alphanum, folder)) == False):
folder = '/'
if db.publish(username, password, serverAddress, serverPort, folder) == False:
return make_response(('Impossible de publier le site ', 500))
return redirect(url_for('edit'))

View File

@@ -0,0 +1,70 @@
<div class="publish" id="publish">
<form action="/publish" id="publish" method="POST" class="" >
<input id="csrf_token" name="csrf_token" type="hidden" value="{{ csrf_token() }}">
<h3>Publier mon site </h3>
<p> Rentrez ici les identifiants de connexions fourni par votre hébergeur. </p>
<br/>
<label for="ServerAddress"> Adresse du serveur : </label>
<div class="input-group">
<input type="text"
name="serverAddress"
class="form-control"
id="serverAddress"
placeholder="sftp://mon_serveur.com, ou ftp://mon_serveur.com"
required>
<dd<div class="invalid-feedback">
L'upload a rencontrer n'a pas pu se faire.
</div>
</div>
<br/>
<label for="serverPort"> port </label>
<br/>
<input type="number"
name="serverPort"
min="0"
max="65536"
class="form-control"
id="serverPort"
placeholder="Si vous ne savez pas ne mettez rien">
<br/>
<label for="serverPort"> Dossier </label>
<br/>
<input type="text"
name="folder"
class="form-control"
id="folder"
placeholder="Spécifier un dossier sinon ne mettez rien">
<br/>
<label for="User"> Nom d'utilisateur </label>
<br/>
<input type="text"
name="username"
class="form-control"
id="username"
placeholder="Nom d'utilisateur fourni par votre hébergeur"
required>
<br/>
<label for="Password"> Mot de passe </label>
<br/>
<input type="password"
name="password"
class="form-control"
id="password"
placeholder="Mot de passe fourni par votre hébergeur"
required>
<br/>
<button type="submit" class="btn btn-success"
onclick="valid_nameBloc()"> Publier le site </button>
</form>
</div>

View File

@@ -5,9 +5,9 @@
{% for image in bloc.values() %}
{% if image.file %}
<div class="col-lg-4 col-sm-6 text-center">
<a class="portfolio-box" href="/public/img/{{ image.file }}"
<a class="portfolio-box" href="/img/{{ image.file }}"
alt="{{ image.description }}">
<img class="img-fluid" src="/public/img/thumbnails/{{ image.file }}"
<img class="img-fluid" src="/img/thumbnails/{{ image.file }}"
alt="{{ image.description }}">
<div class="portfolio-box-caption">
<div class="portfolio-box-caption-content">

View File

@@ -1,4 +1,4 @@
<header class="article-img text-center text-white d-flex" style="{% include '_print_colors.css' %} background-image: url('/public/img/{{ bloc.bg_img }}');" id="{{ bloc.name }}" >
<header class="article-img text-center text-white d-flex" style="{% include '_print_colors.css' %} background-image: url('/img/{{ bloc.bg_img }}');" id="{{ bloc.name }}" >
<div class="container my-auto">
<div class="row" style="mix-blend-mode: hard-light;background-color: rgba(0,0,0,0.3);">
<div class="col-lg-10 mx-auto">

View File

@@ -1,4 +1,4 @@
<header class="masthead text-center text-white d-flex" style="{% include '_print_colors.css' %} background-image: url('/public/img/{{ bloc.bg_img }}');" id="{{ bloc.name }}" >
<header class="masthead text-center text-white d-flex" style="{% include '_print_colors.css' %} background-image: url('/img/{{ bloc.bg_img }}');" id="{{ bloc.name }}" >
<div class="container my-auto">
<div class="row" style="mix-blend-mode: hard-light;background-color: rgba(0,0,0,0.3);">
<div class="col-lg-10 mx-auto">