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'))