mirror of
https://github.com/vale981/dirkules
synced 2025-03-04 17:01:40 -05:00
samba shares can be deleted, smb.conf contains now shares
This commit is contained in:
parent
be4da06338
commit
61fc5ba3c8
5 changed files with 124 additions and 22 deletions
|
@ -8,8 +8,12 @@ from dirkules.samba.models import SambaGlobal, SambaShare, SambaOption
|
||||||
|
|
||||||
|
|
||||||
def get_pools():
|
def get_pools():
|
||||||
|
"""
|
||||||
|
This function returns suitable pools for a share.
|
||||||
|
:return: List of tuples (id, label) of pools
|
||||||
|
"""
|
||||||
pools = Pool.query.all()
|
pools = Pool.query.all()
|
||||||
choices = [(pool.id, pool.label) for pool in pools]
|
choices = [(str(pool.id), pool.label) for pool in pools]
|
||||||
return choices
|
return choices
|
||||||
|
|
||||||
|
|
||||||
|
@ -85,11 +89,66 @@ def generate_smb():
|
||||||
server_string = SambaGlobal.query.get(2)
|
server_string = SambaGlobal.query.get(2)
|
||||||
f = open("smb.conf.txt", "w")
|
f = open("smb.conf.txt", "w")
|
||||||
samba_global = open(staticDir + "/conf/samba_global.conf", "r")
|
samba_global = open(staticDir + "/conf/samba_global.conf", "r")
|
||||||
f.write("# This file was generated by dirkules v{}\n".format(app_version))
|
samba_share = open(staticDir + "/conf/samba_share.conf", "r")
|
||||||
f.write("")
|
samba_recycle = open(staticDir + "/conf/samba_recycle.conf", "r")
|
||||||
f.write("# Global Config\n")
|
f.write("# This file was generated by dirkules v{}\n\n".format(app_version))
|
||||||
f.write("server string = {}\n".format(server_string))
|
f.write("server string = {}\n".format(server_string))
|
||||||
f.write("workgroup = {}\n".format(workgroup))
|
f.write("workgroup = {}\n".format(workgroup))
|
||||||
f.write(samba_global.read())
|
f.write(samba_global.read())
|
||||||
|
f.write("\n\n")
|
||||||
|
for share in SambaShare.query.all():
|
||||||
|
f.write("[{}]\n".format(share.name))
|
||||||
|
f.write("path = {}\n".format(share.path))
|
||||||
|
if share.recycle or share.btrfs:
|
||||||
|
vfs_obj = ""
|
||||||
|
if share.recycle:
|
||||||
|
vfs_obj = vfs_obj + "recycle "
|
||||||
|
if share.btrfs:
|
||||||
|
vfs_obj = vfs_obj + "btrfs"
|
||||||
|
f.write("vfs objects = {}\n".format(vfs_obj))
|
||||||
|
f.write(samba_share.read())
|
||||||
|
# reset file pointer
|
||||||
|
samba_share.seek(0)
|
||||||
|
f.write("\n")
|
||||||
|
for entry in share.options:
|
||||||
|
f.write("{} = {}\n".format(entry.option, entry.value))
|
||||||
|
if share.recycle:
|
||||||
|
f.write(samba_recycle.read())
|
||||||
|
samba_recycle.seek(0)
|
||||||
|
f.write("\n\n")
|
||||||
f.close()
|
f.close()
|
||||||
|
samba_global.close()
|
||||||
|
samba_share.close()
|
||||||
|
samba_recycle.close()
|
||||||
app.logger.info("Generated new samba config.")
|
app.logger.info("Generated new samba config.")
|
||||||
|
|
||||||
|
|
||||||
|
def get_share_by_id(share_id):
|
||||||
|
"""
|
||||||
|
Returns drive object for given id
|
||||||
|
:param share_id: id of drive (primary key)
|
||||||
|
:type share_id: int
|
||||||
|
:return: Share object
|
||||||
|
:rtype: Share
|
||||||
|
"""
|
||||||
|
share = SambaShare.query.get(share_id)
|
||||||
|
if share is not None:
|
||||||
|
return share
|
||||||
|
else:
|
||||||
|
raise LookupError
|
||||||
|
|
||||||
|
|
||||||
|
def disable_share(share):
|
||||||
|
try:
|
||||||
|
share.enabled = False
|
||||||
|
db.session.commit()
|
||||||
|
except:
|
||||||
|
db.session.rollback()
|
||||||
|
|
||||||
|
|
||||||
|
def enable_share(share):
|
||||||
|
try:
|
||||||
|
share.enabled = True
|
||||||
|
db.session.commit()
|
||||||
|
except:
|
||||||
|
db.session.rollback()
|
||||||
|
|
|
@ -17,14 +17,16 @@ class SambaShare(db.Model):
|
||||||
path = db.Column(db.String, nullable=False)
|
path = db.Column(db.String, nullable=False)
|
||||||
recycle = db.Column(db.Boolean)
|
recycle = db.Column(db.Boolean)
|
||||||
btrfs = db.Column(db.Boolean)
|
btrfs = db.Column(db.Boolean)
|
||||||
|
enabled = db.Column(db.Boolean)
|
||||||
options = db.relationship('SambaOption', order_by="SambaOption.id", backref="samba_share", lazy="select",
|
options = db.relationship('SambaOption', order_by="SambaOption.id", backref="samba_share", lazy="select",
|
||||||
cascade="all, delete-orphan")
|
cascade="all, delete-orphan")
|
||||||
|
|
||||||
def __init__(self, name, path, recycle=False, btrfs=False):
|
def __init__(self, name, path, recycle=False, btrfs=False, enabled=True):
|
||||||
self.name = name
|
self.name = name
|
||||||
self.path = path
|
self.path = path
|
||||||
self.recycle = recycle
|
self.recycle = recycle
|
||||||
self.btrfs = btrfs
|
self.btrfs = btrfs
|
||||||
|
self.enabled = enabled
|
||||||
|
|
||||||
|
|
||||||
class SambaOption(db.Model):
|
class SambaOption(db.Model):
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
<i class="plus icon"></i> Freigabe hinzufügen
|
<i class="plus icon"></i> Freigabe hinzufügen
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
<a href="{{ url_for('.generate') }}">
|
<a href="{{ url_for('.generate') }}">
|
||||||
<div class="ui primary labeled icon button">
|
<div class="ui primary labeled icon button">
|
||||||
<i class="magic icon"></i> Generieren
|
<i class="magic icon"></i> Generieren
|
||||||
</div>
|
</div>
|
||||||
|
@ -28,6 +28,7 @@
|
||||||
<th>Pfad</th>
|
<th>Pfad</th>
|
||||||
<th>Papierkorb</th>
|
<th>Papierkorb</th>
|
||||||
<th>BtrFS Optimierungen</th>
|
<th>BtrFS Optimierungen</th>
|
||||||
|
<th>Aktionen</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
|
|
||||||
|
@ -36,8 +37,21 @@
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{ share.name }}</td>
|
<td>{{ share.name }}</td>
|
||||||
<td>{{ share.path }}</td>
|
<td>{{ share.path }}</td>
|
||||||
<td>{{ share.recycle}}</td>
|
<td>{{ share.recycle }}</td>
|
||||||
<td>{{ share.btrfs }}</td>
|
<td>{{ share.btrfs }}</td>
|
||||||
|
<td>{% if share.enabled %}
|
||||||
|
<a href="{{ url_for('.index', disable=share.id) }}">
|
||||||
|
<div class="ui negative labeled icon button">
|
||||||
|
<i class="pause icon"></i> Exkludieren
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
{% else %}
|
||||||
|
<a href="{{ url_for('.index', enable=share.id) }}">
|
||||||
|
<div class="ui positive labeled icon button">
|
||||||
|
<i class="play icon"></i> Inkludieren
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
{% endif %}</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
from flask_wtf import FlaskForm
|
from flask_wtf import FlaskForm
|
||||||
from wtforms import StringField, BooleanField, SelectField, IntegerField, RadioField, validators, SubmitField
|
from wtforms import StringField, BooleanField, SelectField, validators, SubmitField
|
||||||
|
|
||||||
|
|
||||||
class SambaConfigForm(FlaskForm):
|
class SambaConfigForm(FlaskForm):
|
||||||
|
@ -16,18 +16,20 @@ class SambaConfigForm(FlaskForm):
|
||||||
|
|
||||||
|
|
||||||
class SambaAddForm(FlaskForm):
|
class SambaAddForm(FlaskForm):
|
||||||
name = StringField("Name der Freigabe", [validators.required(message="Bitte Feld ausfüllen!"),
|
name = StringField("Name der Freigabe", [validators.InputRequired(message="Bitte Feld ausfüllen!"),
|
||||||
validators.Length(max=255, message="Eingabe zu lang")],
|
validators.Length(max=255, message="Eingabe zu lang")],
|
||||||
render_kw={"placeholder": "Bilder"})
|
render_kw={"placeholder": "Bilder"})
|
||||||
writeable = BooleanField("Schreibzugriff")
|
writeable = BooleanField("Schreibzugriff")
|
||||||
recycling = BooleanField("Papierkorb")
|
recycling = BooleanField("Papierkorb")
|
||||||
btrfs = BooleanField("BtrFS Optimierungen (Vorsicht!)")
|
btrfs = BooleanField("BtrFS Optimierungen (Vorsicht!)")
|
||||||
path = SelectField("Pfad", validators=[validators.required(message="Bitte eine Auswahl treffen!")])
|
path = SelectField("Pfad", validators=[validators.InputRequired(message="Bitte eine Auswahl treffen!")])
|
||||||
user = StringField("Berechtigte Nutzer", [validators.required(message="Bitte Feld ausfüllen!"),
|
user = StringField("Berechtigte Nutzer", [validators.InputRequired(message="Bitte Feld ausfüllen!"),
|
||||||
validators.Length(max=255, message="Eingabe zu lang")],
|
validators.Length(max=255, message="Eingabe zu lang")],
|
||||||
render_kw={"placeholder": "sambadaniel"})
|
render_kw={"placeholder": "sambadaniel"})
|
||||||
create_mask = IntegerField("Dateimaske", [validators.Optional()],
|
create_mask = StringField("Dateimaske", [validators.Optional(),
|
||||||
render_kw={"placeholder": "0600"})
|
validators.Regexp('^[0-7]{4}$', message="Dies ist kein gültiger Wert!")],
|
||||||
dir_mask = IntegerField("Ordnermaske", [validators.Optional()],
|
render_kw={"placeholder": "0600"})
|
||||||
render_kw={"placeholder": "0700"})
|
dir_mask = StringField("Ordnermaske", [validators.Optional(),
|
||||||
submit = SubmitField("Freigabe hinzufügen")
|
validators.Regexp('^[0-7]{4}$', message="Dies ist kein gültiger Wert!")],
|
||||||
|
render_kw={"placeholder": "0700"})
|
||||||
|
submit = SubmitField("Freigabe hinzufügen")
|
||||||
|
|
|
@ -1,16 +1,41 @@
|
||||||
from dirkules import db
|
from dirkules import db
|
||||||
|
|
||||||
from dirkules.config import staticDir
|
from dirkules.config import staticDir
|
||||||
from flask import render_template, url_for, request, redirect
|
from flask import render_template, url_for, request, redirect, flash
|
||||||
from dirkules.samba import bp_samba
|
from dirkules.samba import bp_samba
|
||||||
from dirkules.samba.manager import set_samba_global, generate_smb, create_share, get_pools
|
from dirkules.samba import manager as smb_man
|
||||||
from dirkules.samba.models import SambaShare
|
from dirkules.samba.models import SambaShare
|
||||||
from dirkules.samba.validation import SambaConfigForm, SambaAddForm
|
from dirkules.samba.validation import SambaConfigForm, SambaAddForm
|
||||||
|
|
||||||
|
|
||||||
@bp_samba.route('/', methods=['GET'])
|
@bp_samba.route('/', methods=['GET'])
|
||||||
def index():
|
def index():
|
||||||
|
e_share = request.args.get('enable')
|
||||||
|
d_share = request.args.get('disable')
|
||||||
shares = SambaShare.query.order_by(db.asc(db.collate(SambaShare.name, 'NOCASE'))).all()
|
shares = SambaShare.query.order_by(db.asc(db.collate(SambaShare.name, 'NOCASE'))).all()
|
||||||
|
if not (e_share is not None and d_share is not None):
|
||||||
|
if e_share is not None:
|
||||||
|
try:
|
||||||
|
e_share = int(e_share)
|
||||||
|
share = smb_man.get_share_by_id(e_share)
|
||||||
|
smb_man.enable_share(share)
|
||||||
|
except ValueError:
|
||||||
|
flash("ValueError: enable")
|
||||||
|
except LookupError:
|
||||||
|
flash("LookupError: id not valid")
|
||||||
|
return redirect(url_for('.index'))
|
||||||
|
elif d_share is not None:
|
||||||
|
try:
|
||||||
|
d_share = int(d_share)
|
||||||
|
share = smb_man.get_share_by_id(d_share)
|
||||||
|
smb_man.disable_share(share)
|
||||||
|
except ValueError:
|
||||||
|
flash("ValueError: disable")
|
||||||
|
except LookupError:
|
||||||
|
flash("LookupError: id not valid")
|
||||||
|
return redirect(url_for('.index'))
|
||||||
|
else:
|
||||||
|
flash("Value Error: enable and disable set")
|
||||||
return render_template('samba/index.html', shares=shares)
|
return render_template('samba/index.html', shares=shares)
|
||||||
|
|
||||||
|
|
||||||
|
@ -18,7 +43,7 @@ def index():
|
||||||
def config():
|
def config():
|
||||||
form = SambaConfigForm(request.form)
|
form = SambaConfigForm(request.form)
|
||||||
if request.method == 'POST' and form.validate():
|
if request.method == 'POST' and form.validate():
|
||||||
set_samba_global(form.workgroup.data, form.server_string.data)
|
smb_man.set_samba_global(form.workgroup.data, form.server_string.data)
|
||||||
return redirect(url_for('.index'))
|
return redirect(url_for('.index'))
|
||||||
file = open(staticDir + "/conf/samba_global.conf", "r")
|
file = open(staticDir + "/conf/samba_global.conf", "r")
|
||||||
conf = list()
|
conf = list()
|
||||||
|
@ -34,9 +59,9 @@ def config():
|
||||||
@bp_samba.route('/add', methods=['GET', 'POST'])
|
@bp_samba.route('/add', methods=['GET', 'POST'])
|
||||||
def add():
|
def add():
|
||||||
form = SambaAddForm(request.form)
|
form = SambaAddForm(request.form)
|
||||||
form.path.choices = get_pools()
|
form.path.choices = smb_man.get_pools()
|
||||||
if request.method == 'POST' and form.validate():
|
if request.method == 'POST' and form.validate():
|
||||||
create_share(form.name.data, form.path.data, form.user.data, form.dir_mask.data, form.create_mask.data,
|
smb_man.create_share(form.name.data, form.path.data, form.user.data, form.dir_mask.data, form.create_mask.data,
|
||||||
form.writeable.data, form.btrfs.data, form.recycling.data)
|
form.writeable.data, form.btrfs.data, form.recycling.data)
|
||||||
return redirect(url_for('.index'))
|
return redirect(url_for('.index'))
|
||||||
return render_template('samba/add.html', form=form)
|
return render_template('samba/add.html', form=form)
|
||||||
|
@ -44,5 +69,5 @@ def add():
|
||||||
|
|
||||||
@bp_samba.route('/generate')
|
@bp_samba.route('/generate')
|
||||||
def generate():
|
def generate():
|
||||||
generate_smb()
|
smb_man.generate_smb()
|
||||||
return redirect(url_for('.index'))
|
return redirect(url_for('.index'))
|
||||||
|
|
Loading…
Add table
Reference in a new issue