mirror of
https://github.com/vale981/dirkules
synced 2025-03-04 17:01:40 -05:00
pool things
This commit is contained in:
parent
f0c5034d9f
commit
2d378d5d6c
6 changed files with 96 additions and 52 deletions
|
@ -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
|
||||
|
|
|
@ -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")
|
|
@ -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 %}
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue