diff --git a/dirkules/samba/manager.py b/dirkules/samba/manager.py
index fea232d..2185483 100644
--- a/dirkules/samba/manager.py
+++ b/dirkules/samba/manager.py
@@ -8,8 +8,12 @@ from dirkules.samba.models import SambaGlobal, SambaShare, SambaOption
def get_pools():
+ """
+ This function returns suitable pools for a share.
+ :return: List of tuples (id, label) of pools
+ """
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
@@ -85,11 +89,66 @@ def generate_smb():
server_string = SambaGlobal.query.get(2)
f = open("smb.conf.txt", "w")
samba_global = open(staticDir + "/conf/samba_global.conf", "r")
- f.write("# This file was generated by dirkules v{}\n".format(app_version))
- f.write("")
- f.write("# Global Config\n")
+ samba_share = open(staticDir + "/conf/samba_share.conf", "r")
+ samba_recycle = open(staticDir + "/conf/samba_recycle.conf", "r")
+ f.write("# This file was generated by dirkules v{}\n\n".format(app_version))
f.write("server string = {}\n".format(server_string))
f.write("workgroup = {}\n".format(workgroup))
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()
+ samba_global.close()
+ samba_share.close()
+ samba_recycle.close()
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()
diff --git a/dirkules/samba/models.py b/dirkules/samba/models.py
index e4ce192..4510928 100644
--- a/dirkules/samba/models.py
+++ b/dirkules/samba/models.py
@@ -17,14 +17,16 @@ class SambaShare(db.Model):
path = db.Column(db.String, nullable=False)
recycle = 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",
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.path = path
self.recycle = recycle
self.btrfs = btrfs
+ self.enabled = enabled
class SambaOption(db.Model):
diff --git a/dirkules/samba/templates/samba/index.html b/dirkules/samba/templates/samba/index.html
index be52569..3077db0 100644
--- a/dirkules/samba/templates/samba/index.html
+++ b/dirkules/samba/templates/samba/index.html
@@ -16,7 +16,7 @@
Freigabe hinzufügen
-
+
Generieren
@@ -28,6 +28,7 @@
Pfad |
Papierkorb |
BtrFS Optimierungen |
+ Aktionen |
@@ -36,8 +37,21 @@
{{ share.name }} |
{{ share.path }} |
- {{ share.recycle}} |
+ {{ share.recycle }} |
{{ share.btrfs }} |
+ {% if share.enabled %}
+
+
+ Exkludieren
+
+
+ {% else %}
+
+
+ Inkludieren
+
+
+ {% endif %} |
{% endfor %}
diff --git a/dirkules/samba/validation.py b/dirkules/samba/validation.py
index 1e40e04..eac09bf 100644
--- a/dirkules/samba/validation.py
+++ b/dirkules/samba/validation.py
@@ -1,5 +1,5 @@
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):
@@ -16,18 +16,20 @@ class SambaConfigForm(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")],
render_kw={"placeholder": "Bilder"})
writeable = BooleanField("Schreibzugriff")
recycling = BooleanField("Papierkorb")
btrfs = BooleanField("BtrFS Optimierungen (Vorsicht!)")
- path = SelectField("Pfad", validators=[validators.required(message="Bitte eine Auswahl treffen!")])
- user = StringField("Berechtigte Nutzer", [validators.required(message="Bitte Feld ausfüllen!"),
+ path = SelectField("Pfad", validators=[validators.InputRequired(message="Bitte eine Auswahl treffen!")])
+ user = StringField("Berechtigte Nutzer", [validators.InputRequired(message="Bitte Feld ausfüllen!"),
validators.Length(max=255, message="Eingabe zu lang")],
render_kw={"placeholder": "sambadaniel"})
- create_mask = IntegerField("Dateimaske", [validators.Optional()],
- render_kw={"placeholder": "0600"})
- dir_mask = IntegerField("Ordnermaske", [validators.Optional()],
- render_kw={"placeholder": "0700"})
- submit = SubmitField("Freigabe hinzufügen")
\ No newline at end of file
+ create_mask = StringField("Dateimaske", [validators.Optional(),
+ validators.Regexp('^[0-7]{4}$', message="Dies ist kein gültiger Wert!")],
+ render_kw={"placeholder": "0600"})
+ dir_mask = StringField("Ordnermaske", [validators.Optional(),
+ validators.Regexp('^[0-7]{4}$', message="Dies ist kein gültiger Wert!")],
+ render_kw={"placeholder": "0700"})
+ submit = SubmitField("Freigabe hinzufügen")
diff --git a/dirkules/samba/views.py b/dirkules/samba/views.py
index 8764be0..67e2fff 100644
--- a/dirkules/samba/views.py
+++ b/dirkules/samba/views.py
@@ -1,16 +1,41 @@
from dirkules import db
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.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.validation import SambaConfigForm, SambaAddForm
@bp_samba.route('/', methods=['GET'])
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()
+ 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)
@@ -18,7 +43,7 @@ def index():
def config():
form = SambaConfigForm(request.form)
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'))
file = open(staticDir + "/conf/samba_global.conf", "r")
conf = list()
@@ -34,9 +59,9 @@ def config():
@bp_samba.route('/add', methods=['GET', 'POST'])
def add():
form = SambaAddForm(request.form)
- form.path.choices = get_pools()
+ form.path.choices = smb_man.get_pools()
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)
return redirect(url_for('.index'))
return render_template('samba/add.html', form=form)
@@ -44,5 +69,5 @@ def add():
@bp_samba.route('/generate')
def generate():
- generate_smb()
+ smb_man.generate_smb()
return redirect(url_for('.index'))