This commit is contained in:
Adam Skotarczak 2025-04-25 08:56:35 +02:00
parent 411e2004e4
commit e70562cbdc
11 changed files with 166 additions and 57 deletions

7
.vscode/extensions.json vendored Normal file
View File

@ -0,0 +1,7 @@
{
"recommendations": [
"ms-python.python",
"ms-python.vscode-pylance",
"ms-toolsai.jupyter"
]
}

30
.vscode/settings.jsonc vendored Normal file
View File

@ -0,0 +1,30 @@
{ // Bitte daran denken das Kommentare eigentlich nicht von json unterstützt werden :-)
// Das funktioniert hier nur in Microsofts jsonc im VS-Code!
"python.linting.enabled": true,
"python.linting.pylintEnabled": true,
"python.linting.mypyEnabled": true,
"python.linting.pylintArgs": ["--disable=C0114,C0115,C0116"],
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.organizeImports": "explicit"
},
"python.analysis.typeCheckingMode": "basic",
// Abschliessende Leerzeichen entfernen:
"files.trimTrailingWhitespace": true,
"files.insertFinalNewline": true,
// Markdown für das Entfernen von abschliessenden Leerzeichen rausnehmen:
"[markdown]": {
"files.trimTrailingWhitespace": false,
"editor.wordWrap": "off"
},
// Für Pythonfiles Tababstand definieren und Tabs durch Leerzeichen ersetzen
"[python]": {
"editor.tabSize": 4,
"editor.insertSpaces": true
},
}

17
.vscode/tasks.json vendored Normal file
View File

@ -0,0 +1,17 @@
{
"version": "2.0.0",
"tasks": [
{
"label": "Linter (pylint)",
"type": "shell",
"command": "pylint beispiel.py",
"group": "build"
},
{
"label": "Typprüfung (mypy)",
"type": "shell",
"command": "mypy beispiel.py",
"group": "build"
}
]
}

View File

@ -2,36 +2,48 @@
## pyUpload (TKInter-Version 1.0)
- **2025-04-22 - v.1.0.2**
- **2025-04-25 - v1.1.0**
- **Geändert:**
- [x] Lizenz auf __MIT__ mit Namensnennung umgestellt, siehe [LICENSE](./LICENSE)
- Behoben
-- Wrapper-Skript `start.py` erkennt nun fehlende `.venv` und startet `main.py` beim Erststart korrekt mit System-Python, danach mit venv (`start.py`).
-- `main.py` verwendet unter Windows statt `os.execv()` nun `subprocess.Popen(..., CREATE_NEW_CONSOLE)` für einen sauberen Neustart mit sichtbarer Konsole (`main.py`).
- [x] `main.py` prüft nun zusätzlich, ob bereits mit `pythonw.exe` gestartet wurde, um doppelten Start mit neuem Fenster zu vermeiden
- [x] `main.py` ruft nach `subprocess.Popen(...)` nun zuverlässig `sys.exit(0)` auf, um „leere“ Ursprungsfenster zu beenden
- [x] `start.cmd` verwendet jetzt `python.exe` statt `pythonw.exe`, wodurch nur noch **ein** Konsolenfenster erscheint auch beim Setup
- [x] `start.sh` erkennt fehlendes `python3` und bricht mit Hinweis ab; Pfade werden sauber relativ berechnet
- Entfernt
-- Nicht mehr benötigte Funktion `activate_venv()` entfernt (`main.py`).
- **Behoben:**
- [x] Mit diesen Änderungen behoben, dass unter Windows unnötige Consolenfenster gestartet werden und der Sprung nun sauber in die Virtuelle Umbebung `./app/.venv` erfolgt.
- **2025-04-21 - v.1.0.1**
- **2025-04-22 - v1.0.2**
- Geändert
- `main.py` übernimmt nun automatisch die Erstellung der virtuellen Umgebung `.venv` und die Installation der Abhängigkeiten aus `requirements.txt`
- Entfernt: `install.cmd` und `startUpload.cmd` wurden vollständig ersetzt durch neue Startlogik
- `start.cmd` wurde vereinfacht, prüft nun auf vorhandenes `python` und startet `main.py` über absoluten Pfad
- `main.py` setzt bei Start automatisch `os.chdir()` auf das eigene Verzeichnis, um relative Pfade sicher zu behandeln
- **Behoben:**
- [x] Wrapper-Skript `start.py` erkennt nun fehlende `.venv` und startet `main.py` beim Erststart korrekt mit System-Python, danach mit venv (`start.py`).
- [x] `main.py` verwendet unter Windows statt `os.execv()` nun `subprocess.Popen(..., CREATE_NEW_CONSOLE)` für einen sauberen Neustart mit sichtbarer Konsole (`main.py`).
- Hinzugefügt
- Neue plattformunabhängige `start.sh` für Linux/macOS
- Automatischer Restart nach Installation über `os.execv()` in `main.py`
- Neue Sicherheits- und Netzwerkinformationen in der `README.md`
- Erweiterung der `README.md` um Speicherort der Uploads und Projektstruktur
- Hinweis auf Projektstatus und neue Version unter <https://github.com/realAscot/pyUpload2>
- Neue LICENSE-Datei (proprietär, nicht zur Weitergabe)
- start.py hinzugefügt wenn auf manchen Systemen die Ausführung von .cmd und .bat gesperrt sind.
- **Entfernt:**
-- [x] Nicht mehr benötigte Funktion `activate_venv()` entfernt (`main.py`).
- Fixes
- PowerShell-Inkompatibilitäten mit `set /p` entfernt
- `.cmd`-Startskripte reagieren jetzt korrekt auf STRG+C
- Mehrere Markdown-Korrekturen (Codeblöcke, Leerzeilen, Lesbarkeit)
- **2025-04-21 - v1.0.1**
- **2025-04-21 - v.1.0.0**
- release!
- **Geändert:**
- [x] `main.py` übernimmt nun automatisch die Erstellung der virtuellen Umgebung `.venv` und die Installation der Abhängigkeiten aus `requirements.txt`
- [x] Entfernt: `install.cmd` und `startUpload.cmd` wurden vollständig ersetzt durch neue Startlogik
- [x] `start.cmd` wurde vereinfacht, prüft nun auf vorhandenes `python` und startet `main.py` über absoluten Pfad
- [x] `main.py` setzt bei Start automatisch `os.chdir()` auf das eigene Verzeichnis, um relative Pfade sicher zu behandeln
- **Hinzugefügt:**
- [x] Neue plattformunabhängige `start.sh` für Linux/macOS
- [x] Automatischer Restart nach Installation über `os.execv()` in `main.py`
- [x] Neue Sicherheits- und Netzwerkinformationen in der `README.md`
- [x] Erweiterung der `README.md` um Speicherort der Uploads und Projektstruktur
- [x] Hinweis auf Projektstatus und neue Version unter <https://github.com/realAscot/pyUpload2>
- [x] Neue LICENSE-Datei (proprietär, nicht zur Weitergabe)
- [x] start.py hinzugefügt wenn auf manchen Systemen die Ausführung von .cmd und .bat gesperrt sind.
- **Fixes:**
- [x] PowerShell-Inkompatibilitäten mit `set /p` entfernt
- [x] `.cmd`-Startskripte reagieren jetzt korrekt auf STRG+C
- [x] Mehrere Markdown-Korrekturen (Codeblöcke, Leerzeilen, Lesbarkeit)
- **2025-04-21 - v1.0.0**
- [x] release!

26
LICENSE
View File

@ -1,17 +1,23 @@
# LICENSE
MIT License with Attribution Requirement
Copyright (c) 2025 Adam Skotarczak <adam@skotarczak.net>
Alle Rechte vorbehalten.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the “Software”), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, subject to the following conditions:
Diese Software ist urheberrechtlich geschützt. Die Verwendung, Vervielfältigung, Verbreitung oder Änderung
dieser Software oder von Teilen davon ist ohne vorherige schriftliche Genehmigung des Autors ausdrücklich untersagt.
1. The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
Die Software darf ausschließlich für private, interne oder zu Prüf- und Testzwecken verwendet werden.
Eine kommerzielle Nutzung oder Weitergabe an Dritte ist nicht gestattet.
2. **Attribution Requirement**: Any public use or distribution of this Software,
modified or unmodified, must include a clear and visible attribution to the original author:
Die Bereitstellung dieser Software erfolgt OHNE JEGLICHE GARANTIE,
weder ausdrücklich noch stillschweigend, einschließlich, aber nicht beschränkt auf die Garantien
der Marktgängigkeit oder Eignung für einen bestimmten Zweck.
**Adam Skotarczak <adam@skotarczak.net>**
Durch die Nutzung dieser Software erklärst du dich mit den oben genannten Bedingungen einverstanden.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View File

@ -1,18 +1,21 @@
# pyUpload (TKInter Version)
# pyUpload (TKinter-Version)
![pyUpload 1.0 Logo](./assets/logo-1.0-alpha.png)
## ⚠️ Projektstatus: Eingefroren Nur noch Bugfixes
Diese Version von **pyUpload** wird **nicht weiterentwickelt** und erhält nur noch Fehlerbehebungen.
Die neue Version mit Flask-Backend ist **BALD** verfügbar unter:
Die neue Version mit Flask-Backend wird **bald** verfügbar sein unter:
🔗 **<https://github.com/realAscot/pyUpload2>**
---
- [pyUpload (TKInter Version)](#pyupload-tkinter-version)
## 📑 Inhalt der Readme
- [pyUpload (TKinter-Version)](#pyupload-tkinter-version)
- [⚠️ Projektstatus: Eingefroren Nur noch Bugfixes](#-projektstatus-eingefroren--nur-noch-bugfixes)
- [📑 Inhalt der Readme](#-inhalt-der-readme)
- [pyUpload Sicherer Datei-Upload-Server über HTTPS (lokal \& offline)](#pyupload--sicherer-datei-upload-server-über-https-lokal--offline)
- [🛠 Features](#-features)
- [🚀 Schnellstart](#-schnellstart)
@ -24,7 +27,7 @@ Die neue Version mit Flask-Backend ist **BALD** verfügbar unter:
- [🔐 Hinweis zur SSL-Zertifikatswarnung](#-hinweis-zur-ssl-zertifikatswarnung)
- [💡 Ideen für zukünftige Entwicklungen](#-ideen-für-zukünftige-entwicklungen)
- [🐛 Bekannte Bugs](#-bekannte-bugs)
- [👨‍💻 Autor und alle beteiligte](#-autor-und-alle-beteiligte)
- [## 👨‍💻 Autor und Beteiligte](#--autor-und-beteiligte)
- [📝 Lizenz](#-lizenz)
---
@ -34,6 +37,8 @@ Die neue Version mit Flask-Backend ist **BALD** verfügbar unter:
Diese Version basiert auf **Tkinter (GUI + QR)** sowie einer optionalen **reinen CLI-Nutzung**.
Sie ist vollständig lokal lauffähig ganz ohne Installation von externen Tools oder komplexen Abhängigkeiten.
[🔝](#-inhalt-der-readme)
---
## 🛠 Features
@ -46,6 +51,8 @@ Sie ist vollständig lokal lauffähig ganz ohne Installation von externen To
- **automatische Einrichtung von `.venv` und Abhängigkeiten**
- **kein Installationsskript mehr nötig alles passiert beim Start von `main.py`**
[🔝](#-inhalt-der-readme)
---
## 🚀 Schnellstart
@ -60,7 +67,7 @@ Sie ist vollständig lokal lauffähig ganz ohne Installation von externen To
```
Alternativ einfach eine bereinigte `.zip` bei den [Releases auf GitHub](https://github.com/realAscot/pyUpload/releases/) herrunterladen.
Diese enthällt kein `.git Archiv` und enthält nur das aller nötigste zum Betrieb des Programms.
Diese enthält kein `.git`-Archiv und nur das Allernötigste für den Betrieb des Programms.
2. Starte die App mit:
@ -76,12 +83,16 @@ Sie ist vollständig lokal lauffähig ganz ohne Installation von externen To
⚠️ **Alternative 2 falls die Ausführung per Doppelklick auf .bat oder .cmd gesperrt ist:**
> Doppelklick auf -> `start.pyw`
Doppelklick auf `start.pyw` oder im Terminal mit:
Es ist möglich das beim ersten mal gefragt wird womit das Programm gestartet werden soll.
```cmd
python start.pyw`
```
Es ist möglich, dass beim ersten Mal gefragt wird, womit das Programm gestartet werden soll.
Einfach die Python-Installation suchen und `python.exe` wählen.
Ich empfehle einfach eine Verknüpfung der `start.pyw` zB auf den Desktop oder ins Startmenü zu legen.
Ich empfehle, eine Verknüpfung der `start.pyw` z.B. auf dem Desktop zu erstellen
### 🐧 Für Linux / macOS:
@ -111,6 +122,8 @@ Beim ersten Start wird automatisch:
- `requirements.txt` installiert
- das Programm danach neu aus der Umgebung gestartet
[🔝](#-inhalt-der-readme)
---
## 🧩 Kommandozeilenoptionen
@ -135,6 +148,8 @@ pythonw.exe start.pyw --port 9999 # Custom-Port verwenden
Wenn Du die Dateierweiterung `.pyw` mit `pythonw.exe` verknüpfst, klappt es auch ohne mit Doppelklick im Explorer :-)
[🔝](#-inhalt-der-readme)
---
## 🌐 Zugriff im Browser
@ -150,6 +165,8 @@ Dateien werden im `upload/<Client-IP>/` gespeichert.
Wichtig dabei ist es darauf zu achten, das tatsächlich auch https verwendet wird, falls man die Adresse händisch eingibt statt mit QR-Code! Man könnte noch zusätzlich einen http-server in der App laufen lassen, der dann automatisch umleitet, aber wir möchten das Programm so klein wie möglich halten.
[🔝](#-inhalt-der-readme)
---
## 📁 Logs & Uploads
@ -158,6 +175,8 @@ Wichtig dabei ist es darauf zu achten, das tatsächlich auch https verwendet wir
- **Zentrale Logs**: `logs/pyupload.log`
- **Pro-Client Logs**: `logs/<Client-IP>.log`
[🔝](#-inhalt-der-readme)
---
## 🔐 Hinweis zur SSL-Zertifikatswarnung
@ -172,7 +191,10 @@ Da das in lokalen oder testnahen Umgebungen in der Regel nicht der Fall ist, lä
>💡 **Wichtig zu wissen:**
Die Verbindung ist trotzdem Ende-zu-Ende verschlüsselt. Die Schlüssel werden bei jedem Start lokal neu generiert direkt auf deinem Rechner.
Technisch ist die Verbindung also sicher. Dein Browser vertraut dem Zertifikat nur nicht, weil es nicht von einer offiziellen Zertifizierungsstelle stammt sondern von dir selbst.
Technisch ist die Verbindung also sicher.
Dein Browser vertraut dem Zertifikat lediglich nicht, weil es nicht von einer offiziellen Zertifizierungsstelle stammt, sondern lokal erzeugt wurde.
[🔝](#-inhalt-der-readme)
---
@ -186,6 +208,8 @@ Beiträge willkommen!
- [ ] _____________________________________________________
- [ ] _____________________________________________________
[🔝](#-inhalt-der-readme)
---
## 🐛 Bekannte Bugs
@ -193,11 +217,14 @@ Beiträge willkommen!
- **Frontend:** wenn im Browser der Button Hochladen gewählt wird, OHNE das Dateien ausgewählt wurden,
kommt es zu einem *Error response - Error code: 400* im Browser. Lösungsansatz wäre den Button über JS zu sperren solange keine Datei ausgewählt ist. Lässt sich schnell im [template](./app/template.html) erledigen.
Wenn jemand Lust und Zeit hat sich diesem anzunehmen, nur zu. Ich Danke im Vorraus!
Wenn jemand Lust und Zeit hat sich diesem anzunehmen, nur zu.
Ich danke im Voraus!
[🔝](#-inhalt-der-readme)
---
## 👨‍💻 Autor und alle beteiligte
## ## 👨‍💻 Autor und Beteiligte
- **Adam Skotarczak**
Kontakt: [adam@skotarczak.net](mailto:adam@skotarczak.net)
@ -205,9 +232,10 @@ Wenn jemand Lust und Zeit hat sich diesem anzunehmen, nur zu. Ich Danke im Vorra
- **Du?**
[🔝](#-inhalt-der-readme)
---
## 📝 Lizenz
- Proprietär, © 2025 Adam Skotarczak
**Keine Weitergabe ohne ausdrückliche Genehmigung**
MIT [LICENSE](./LICENSE) frei verwendbar in eigenen Projekten bei Namensnennung.

View File

@ -1 +1 @@
1.0.2
1.1.0

View File

@ -19,7 +19,7 @@ VENV_PYTHON = os.path.join(VENV_DIR, "Scripts", "python.exe") if os.name == "nt"
REQUIREMENTS_FILE = os.path.join(BASE_DIR, "requirements.txt")
# Wenn wir NICHT in der venv sind
if sys.prefix == sys.base_prefix:
if sys.prefix == sys.base_prefix and sys.executable != VENV_PYTHON:
# venv erstellen falls nötig
if not os.path.exists(VENV_DIR):
print("[Setup] Virtuelle Umgebung wird erstellt...")
@ -34,6 +34,7 @@ if sys.prefix == sys.base_prefix:
if os.name == "nt":
subprocess.Popen([VENV_PYTHON] + sys.argv, creationflags=subprocess.CREATE_NEW_CONSOLE)
sys.exit(0)
else:
os.execv(VENV_PYTHON, [VENV_PYTHON] + sys.argv)
sys.exit(0)

View File

@ -15,4 +15,10 @@ if errorlevel 1 (
set SCRIPT_DIR=%~dp0
:: Starte den Python-Wrapper, der .venv erkennt
pythonw.exe "%SCRIPT_DIR%start.pyw" %*
if exist app\.venv\Scripts\python.exe (
python.exe "%SCRIPT_DIR%start.pyw" %*
) else (
echo Erste Initialisierung erforderlich.
echo Starte Setup-Konsole...
start cmd /k python.exe "%SCRIPT_DIR%start.pyw" %*
)

View File

@ -13,4 +13,5 @@ venv_python = os.path.join("app", ".venv", "Scripts", "python.exe") if os.name =
python_exec = venv_python if os.path.exists(venv_python) else sys.executable
# Starte main.py
subprocess.run([python_exec, "app/main.py"] + sys.argv[1:])
main_script = os.path.abspath(os.path.join("app", "main.py"))
subprocess.run([python_exec, main_script] + sys.argv[1:])

View File

@ -1,6 +1,7 @@
#!/bin/bash
set -e
# Verzeichnis dieser Datei bestimmen
# Absoluten Pfad zur start.pyw berechnen (falls per Symlink gestartet)
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# Python-Interpreter prüfen
@ -10,5 +11,5 @@ if ! command -v python3 &> /dev/null; then
exit 1
fi
# Starte das Hauptskript
python3 "$SCRIPT_DIR/app/main.py" "$@"
# Direkt ausführen
python3 "$SCRIPT_DIR/start.pyw" "$@"