pool things

This commit is contained in:
Daniel 2019-09-14 17:53:28 +02:00
parent f0c5034d9f
commit 2d378d5d6c
6 changed files with 96 additions and 52 deletions

View file

@ -60,3 +60,7 @@ def get_raid(label):
values[2] = newLine[3]
raid_map = (dict(zip(keys, values)))
return raid_map
def create_pool():
pass

View file

@ -24,3 +24,45 @@ def get_pool_health(drive_list):
if db_drive.smart is not True:
return False
return True
def get_empty_drives():
drives = Drive.query.all()
choices = list()
for drive in drives:
if not drive.missing and not is_system_drive(drive):
label = drive.name + ": " + drive.model + " (" + sizeof_fmt(drive.size) + ")"
choices.append((drive.name, label))
return choices
def sizeof_fmt(num, suffix='B'):
for unit in ['', 'Ki', 'Mi', 'Gi', 'Ti', 'Pi', 'Ei', 'Zi']:
if abs(num) < 1024.0:
return "%3.1f%s%s" % (num, unit, suffix)
num /= 1024.0
return "%.1f%s%s" % (num, 'Yi', suffix)
def is_system_drive(drive):
for p in drive.partitions:
if "/" == p.mountpoint or "/home" == p.mountpoint:
return True
return False
def create_btrfs_pool(form):
label = form.name.data
if int(form.raid_config.data) == 1:
raid = "single"
elif int(form.raid_config.data) == 2:
raid = "raid0"
elif int(form.raid_config.data) == 3:
raid = "raid1"
drives = form.drives.data.split(",")
mount_options = ["defaults"]
if bool(form.inode_cache.data):
mount_options.append("inode_cache")
if int(form.space_cache.data) == 2:
mount_options.append("space_cache=v1")
elif int(form.space_cache.data) == 3:
mount_options.append("space_cache=v2")

View file

@ -40,40 +40,44 @@
</div>
</div>
</div>
{% elif field.type == 'BooleanField' %}
{% elif field.type == 'BooleanField' or field.type == 'ToggleBooleanField' %}
{% if field.errors %}
<div class="field error">
{% else %}
<div class="field">
{% endif %}
{% if field.errors %}
{% for error in field.errors %}
<div class="ui pointing below red basic label">
{{ error }}
</div>
{% endfor %}
{% endif %}
<div class="ui checkbox">
{{ field(**kwargs)|safe }}
{{ field.label }}
{% if field.errors %}
{% for error in field.errors %}
<div class="ui pointing below red basic label">
{{ error }}
</div>
{% endfor %}
{% endif %}
{% if field.type == 'BooleanField' %}
<div class="ui checkbox">
{% else %}
<div class="ui toggle checkbox">
{% endif %}
{{ field(**kwargs)|safe }}
{{ field.label }}
</div>
</div>
{% elif field.type == 'RadioField' %}
{% if field.label.text is defined and field.label.text|length %}
<label>{{ field.label.text }}</label>
{% endif %}
{% for value, label in field.choices %}
<div class="field">
<div class="ui radio checkbox">
{% if value == 1 %}
<input type="radio" name="{{ field.id }}" value="{{ value }}" checked="">
{% else %}
<input type="radio" name="{{ field.id }}" value="{{ value }}">
{% endif %}
<label>{{ label }}</label>
</div>
{% if field.label.text is defined and field.label.text|length %}
<label>{{ field.label.text }}</label>
{% endif %}
{% for value, label in field.choices %}
<div class="field">
<div class="ui radio checkbox">
{% if value == 1 %}
<input type="radio" name="{{ field.id }}" value="{{ value }}" checked="">
{% else %}
<input type="radio" name="{{ field.id }}" value="{{ value }}">
{% endif %}
<label>{{ label }}</label>
</div>
{% endfor %}
</div>
{% endfor %}
{% elif field.type == 'SubmitField' %}
<a onclick="history.back(-1)">
<div class="ui button">
@ -81,7 +85,7 @@
</div>
</a>
<button class="ui primary button" type="submit">{{ field.label }}</button>
{% elif field.type == 'SelectMultipleField' or field.type == 'CustomMultipleField' %}
{% elif field.type == 'SemanticMultiSelectField' %}
<div class="inline field">
{% if field.errors %}
{% for error in field.errors %}

View file

@ -50,6 +50,9 @@
<div class="inline fields">
{{ render_field(form.compression) }}
</div>
<div class="ui segment">
{{ render_field(form.okay) }}
</div>
{{ render_field(form.submit) }}
</form>
<div class="Box" style="display:none">HALLO</div>

View file

@ -1,6 +1,5 @@
from flask_wtf import FlaskForm
from wtforms import StringField, BooleanField, SelectField, IntegerField, RadioField, validators, SubmitField, \
SelectMultipleField
from wtforms import StringField, BooleanField, SelectField, IntegerField, RadioField, validators, SubmitField
from dirkules.models import Drive
@ -52,32 +51,20 @@ class SambaAddForm(FlaskForm):
render_kw={"placeholder": "0700"})
def get_empty_drives():
drives = Drive.query.all()
choices = list()
for drive in drives:
label = drive.name + ": " + drive.model + " (" + sizeof_fmt(drive.size) + ")"
choices.append((drive.name, label))
return choices
def sizeof_fmt(num, suffix='B'):
for unit in ['', 'Ki', 'Mi', 'Gi', 'Ti', 'Pi', 'Ei', 'Zi']:
if abs(num) < 1024.0:
return "%3.1f%s%s" % (num, unit, suffix)
num /= 1024.0
return "%.1f%s%s" % (num, 'Yi', suffix)
class CustomMultipleField(SelectMultipleField):
class SemanticMultiSelectField(SelectField):
def pre_validate(self, form):
if self.data:
values = list(c[0] for c in self.choices)
# values_in_data is a list containing all values which are a part of self.data
# for example: 'sda' is in ['sda,sdb','sdc']
values_in_data = [value for value in values for d in self.data if value in d]
if self.choices is not None:
values_in_data = [value for value, _ in self.choices if value in self.data]
if not values_in_data:
raise ValueError(self.gettext("'%(value)s' is not a valid choice for this field") % dict(value=self.data))
raise ValueError(self.gettext('{} is not a valid choice'.format(self.data)))
else:
raise ValueError(self.gettext('There are no elements available but this field is required.'))
class ToggleBooleanField(BooleanField):
pass
class PoolAddForm(FlaskForm):
@ -86,8 +73,8 @@ class PoolAddForm(FlaskForm):
render_kw={"placeholder": "whirlpool"})
raid_config = RadioField("RAID Konfiguration", choices=[(1, "Single"), (2, "RAID0"), (3, "RAID1")],
coerce=int)
drives = CustomMultipleField("Festplatte", choices=get_empty_drives(),
validators=[validators.required(message="Bitte eine Auswahl treffen!")])
drives = SemanticMultiSelectField("Festplatte",
validators=[validators.required(message="Bitte eine Auswahl treffen!")])
inode_cache = BooleanField("inode_cache")
space_cache = RadioField("", choices=[(1, "Deaktiviert"), (2, "v1"), (3, "v2")],
coerce=int)
@ -95,4 +82,6 @@ class PoolAddForm(FlaskForm):
autodefrag = BooleanField("autodefrag")
compression = RadioField("", choices=[(1, "Keine"), (2, "zlib"), (3, "lzo")],
coerce=int)
okay = ToggleBooleanField("Ich kenne das Risiko und formatiere oben angegebene Laufwerke.",
validators=[validators.required(message="Bitte das Risiko akzeptieren.")])
submit = SubmitField("Pool erstellen")

View file

@ -42,7 +42,9 @@ def pool(pool):
@app.route('/pools/add', methods=['GET', 'POST'])
def add_pool():
form = PoolAddForm(request.form)
form.drives.choices = viewManager.get_empty_drives()
if request.method == 'POST' and form.validate():
viewManager.create_btrfs_pool(form)
return redirect(url_for('pools'))
return render_template('pool_add.html', form=form)