feat: Added basic git

This commit is contained in:
Nathan Woodburn 2024-02-23 17:07:34 +11:00
parent a4d79ef773
commit 2c97d4c169
Signed by: nathanwoodburn
GPG Key ID: 203B000478AD0EF1
8 changed files with 86 additions and 4 deletions

View File

@ -17,4 +17,21 @@ sudo -i
cd /root/site-manager cd /root/site-manager
python3 account.py python3 account.py
exit exit
``` ```
Updating
--------
```bash
sudo -i
cd /root/site-manager
git pull
exit
```
## Screenshots
![Dashboard](assets/dash.png)
![Management page](assets/mg1.png)
![Plain Content](assets/plain.png)
![Git Content](assets/git.png)

BIN
assets/dash.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

BIN
assets/git.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

BIN
assets/mg1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

BIN
assets/plain.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

25
main.py
View File

@ -85,9 +85,16 @@ def manage_site(name):
dns_info = sites_module.get_dns_info(name) dns_info = sites_module.get_dns_info(name)
dns_info = render.dns_info(dns_info) dns_info = render.dns_info(dns_info)
git = f'<form action="/manage/{site["name"]}/clone" method="post"><input class="form-control form-control-user" type="text" name="url" placeholder="https://github.com/..." /><input class="btn btn-primary" type="submit" value="Clone Git via HTTPS" /></form>'
if "git" in site:
if site["git"]:
git = f'<p>Git repository <a href="{site["git"]}" target="_blank">{site["git"]}</a> added</p><a href="/manage/{site["name"]}/pull" class="btn btn-primary">Pull</a>'
return render_template('manage.html', user=user, year=datetime.datetime.now().year, return render_template('manage.html', user=user, year=datetime.datetime.now().year,
site=site['name'], domain=site['domain'], enabled=site['active'], site=site['name'], domain=site['domain'], enabled=site['active'],
alt_domains=alt_domains, checked=checked, files=files, dns_info=dns_info) alt_domains=alt_domains, checked=checked,
files=files, dns_info=dns_info, git=git)
@app.route('/manage/<name>/alt', methods=['POST']) @app.route('/manage/<name>/alt', methods=['POST'])
@ -166,9 +173,25 @@ def delete_site(name, file):
return redirect('/manage/' + name) return redirect('/manage/' + name)
@app.route('/manage/<name>/clone', methods=['POST'])
def clone_git(name):
site = sites_module.get_site(name)
if not site:
return "Error: Site not found."
data = request.form
url = data['url']
sites_module.clone_git(name, url)
return redirect('/manage/' + name)
@app.route('/manage/<name>/pull')
def pull_git(name):
site = sites_module.get_site(name)
if not site:
return "Error: Site not found."
sites_module.pull_git(name)
return redirect('/manage/' + name)

View File

@ -284,4 +284,46 @@ def is_icann(domain):
tlds = [tld for tld in tlds if not tld.startswith('#')] tlds = [tld for tld in tlds if not tld.startswith('#')]
if domain.split('.')[-1].upper() in tlds: if domain.split('.')[-1].upper() in tlds:
return True return True
return False return False
def clone_git(name, url):
site = get_site(name)
id = site['id']
path = f'/var/www/{id}'
if not os.path.isdir(path):
os.mkdir(path)
os.system(f'git clone {url} {path}')
with open('sites.json', 'r') as file:
sites = json.loads(file.read())
for site in sites:
if site['name'] == name:
site['git'] = url
with open('sites.json', 'w') as file:
file.write(json.dumps(sites))
return True
return True
def pull_git(name):
site = get_site(name)
id = site['id']
path = f'/var/www/{id}'
if not os.path.isdir(path):
return False
# Check if it's a git repo
if not os.path.isdir(f'{path}/.git'):
# Remove git from sites.json
with open('sites.json', 'r') as file:
sites = json.loads(file.read())
for site in sites:
if site['name'] == name:
del site['git']
with open('sites.json', 'w') as file:
file.write(json.dumps(sites))
return False
os.system(f'cd {path} && git pull')
return True

View File

@ -116,7 +116,7 @@
<p>Click or drop files here. Drop a zip to include folders</p><input type="file" id="fileInput" multiple=""> <p>Click or drop files here. Drop a zip to include folders</p><input type="file" id="fileInput" multiple="">
</div><ul class="list-group"> </div><ul class="list-group">
{{files|safe}} {{files|safe}}
</ul> </ul>{{git|safe}}
</div> </div>
</div> </div>
<div class="row"> <div class="row">