jumpserver/apps/assets/forms.py

312 lines
14 KiB
Python
Raw Normal View History

2016-08-14 14:10:10 +00:00
# coding:utf-8
from django import forms
2016-11-06 16:39:26 +00:00
from django.utils.translation import gettext_lazy as _
2016-08-14 14:10:10 +00:00
2016-09-18 16:07:52 +00:00
from .models import IDC, Asset, AssetGroup, AdminUser, SystemUser, Tag
2016-11-06 16:39:26 +00:00
from common.utils import validate_ssh_private_key, ssh_pubkey_gen
2016-08-14 14:10:10 +00:00
2016-09-17 15:43:41 +00:00
# class AssetForm(forms.ModelForm):
# class Meta:
# model = Asset
#
# fields = [
# 'ip', 'other_ip', 'remote_card_ip', 'hostname', 'port', 'groups', 'username', 'password',
# 'idc', 'mac_address', 'brand', 'cpu', 'memory', 'disk', 'os', 'cabinet_no', 'cabinet_pos',
# 'number', 'status', 'type', 'env', 'sn', 'is_active', 'comment', 'admin_user', 'system_users'
# ]
#
# widgets = {
# 'groups': forms.SelectMultiple(attrs={'class': 'select2-groups', 'data-placeholder': _('Select asset groups')}),
# 'system_user': forms.SelectMultiple(attrs={'class': 'select2-system-user', 'data-placeholder': _('Select asset system user')}),
# 'admin_user': forms.SelectMultiple(attrs={'class': 'select2-admin-user', 'data-placeholder': _('Select asset admin user')}),
# }
#
class AssetCreateForm(forms.ModelForm):
2016-09-18 16:07:52 +00:00
def __init__(self, *args, **kwargs):
2016-09-19 16:39:33 +00:00
instance = kwargs.get('instance', None)
2016-09-18 16:07:52 +00:00
if instance:
initial = kwargs.get('initial', {})
2016-10-07 15:04:37 +00:00
initial['tags'] = [t.pk for t in kwargs['instance'].tags.all()]
2016-09-18 16:07:52 +00:00
super(AssetCreateForm, self).__init__(*args, **kwargs)
def _save_m2m(self):
2016-10-07 15:04:37 +00:00
super(AssetCreateForm, self)._save_m2m()
2016-09-18 16:07:52 +00:00
tags = self.cleaned_data['tags']
2016-10-07 15:04:37 +00:00
self.instance.tags.clear()
self.instance.tags.add(*tuple(tags))
2016-09-18 16:07:52 +00:00
2016-08-14 14:10:10 +00:00
class Meta:
model = Asset
2016-10-31 11:31:56 +00:00
tags = forms.ModelMultipleChoiceField(queryset=Tag.objects.all())
2016-08-14 14:10:10 +00:00
fields = [
2016-09-19 16:39:33 +00:00
'hostname', 'ip', 'port', 'type', 'comment', 'admin_user', 'system_users', 'idc', 'groups',
'other_ip', 'remote_card_ip', 'mac_address', 'brand', 'cpu', 'memory', 'disk', 'os', 'cabinet_no',
2016-10-31 11:31:56 +00:00
'cabinet_pos', 'number', 'status', 'env', 'sn', 'tags',
2016-08-14 14:10:10 +00:00
]
2016-09-04 11:12:31 +00:00
widgets = {
2016-09-17 15:43:41 +00:00
'groups': forms.SelectMultiple(attrs={'class': 'select2',
'data-placeholder': _('Select asset groups')}),
2016-10-07 15:04:37 +00:00
'tags': forms.SelectMultiple(attrs={'class': 'select2',
2016-10-08 10:33:00 +00:00
'data-placeholder': _('Select asset tags')}),
2016-09-17 15:43:41 +00:00
'system_users': forms.SelectMultiple(attrs={'class': 'select2',
'data-placeholder': _('Select asset system users')}),
'admin_user': forms.Select(attrs={'class': 'select2', 'data-placeholder': _('Select asset admin user')}),
}
help_texts = {
'hostname': '* required',
'ip': '* required',
2016-11-02 16:09:38 +00:00
'system_users': _('System user will be granted for user to login assets (using ansible create automatic)'),
2016-10-31 11:31:56 +00:00
'admin_user': _('Admin user should be exist on asset already, And have sudo ALL permission'),
2016-10-07 15:04:37 +00:00
'tags': '最多5个标签单个标签最长8个汉字按回车确认'
2016-09-04 11:12:31 +00:00
}
2016-08-14 14:10:10 +00:00
class AssetGroupForm(forms.ModelForm):
2016-09-08 14:54:05 +00:00
# See AdminUserForm comment same it
2016-09-05 17:09:03 +00:00
assets = forms.ModelMultipleChoiceField(queryset=Asset.objects.all(),
label=_('Asset'),
required=False,
widget=forms.SelectMultiple(
attrs={'class': 'select2', 'data-placeholder': _('Select assets')})
)
2016-09-05 16:49:42 +00:00
def __init__(self, *args, **kwargs):
2016-09-19 16:39:33 +00:00
if kwargs.get('instance', None):
2016-09-05 16:49:42 +00:00
initial = kwargs.get('initial', {})
initial['assets'] = kwargs['instance'].assets.all()
super(AssetGroupForm, self).__init__(*args, **kwargs)
def _save_m2m(self):
super(AssetGroupForm, self)._save_m2m()
assets = self.cleaned_data['assets']
self.instance.assets.clear()
self.instance.assets.add(*tuple(assets))
2016-08-14 14:10:10 +00:00
class Meta:
model = AssetGroup
fields = [
2016-09-22 10:31:04 +00:00
"name", "comment","system_users",
2016-08-14 14:10:10 +00:00
]
2016-09-19 09:25:41 +00:00
widgets = {
'name' : forms.TextInput(attrs={}),
'system_users': forms.SelectMultiple(attrs={'class': 'select2-system-user', 'data-placeholder': _('Select asset system user')}),
}
2016-09-07 12:05:42 +00:00
help_texts = {
'name': '* required',
}
2016-08-14 14:10:10 +00:00
2016-09-07 12:51:33 +00:00
class IDCForm(forms.ModelForm):
2016-09-08 14:54:05 +00:00
# See AdminUserForm comment same it
2016-09-07 12:51:33 +00:00
assets = forms.ModelMultipleChoiceField(queryset=Asset.objects.all(),
label=_('Asset'),
required=False,
widget=forms.SelectMultiple(
attrs={'class': 'select2', 'data-placeholder': _('Select assets')})
)
def __init__(self, *args, **kwargs):
if kwargs.get('instance'):
initial = kwargs.get('initial', {})
initial['assets'] = kwargs['instance'].assets.all()
super(IDCForm, self).__init__(*args, **kwargs)
def _save_m2m(self):
super(IDCForm, self)._save_m2m()
assets = self.cleaned_data['assets']
self.instance.assets.clear()
self.instance.assets.add(*tuple(assets))
2016-08-14 14:10:10 +00:00
class Meta:
model = IDC
2016-09-19 09:25:41 +00:00
fields = ['name', "bandwidth", "operator", 'contact', 'phone', 'address', 'intranet', 'extranet','comment']
2016-08-14 14:10:10 +00:00
widgets = {
2016-09-07 12:51:33 +00:00
'name': forms.TextInput(attrs={'placeholder': _('Name')}),
2016-09-19 09:25:41 +00:00
'intranet': forms.Textarea(
attrs={'placeholder': 'IP段之间用逗号隔开192.168.1.0/24,192.168.1.0/24'}),
'extranet': forms.Textarea(
attrs={'placeholder': 'IP段之间用逗号隔开201.1.32.1/24,202.2.32.1/24'})
2016-08-14 14:10:10 +00:00
}
2016-09-07 16:59:00 +00:00
2016-09-08 10:12:53 +00:00
class AdminUserForm(forms.ModelForm):
2016-09-08 14:54:05 +00:00
# Admin user assets define, let user select, save it in form not in view
2016-09-07 16:59:00 +00:00
assets = forms.ModelMultipleChoiceField(queryset=Asset.objects.all(),
label=_('Asset'),
required=False,
widget=forms.SelectMultiple(
attrs={'class': 'select2', 'data-placeholder': _('Select assets')})
)
2016-09-08 14:54:05 +00:00
# Form field name can not start with `_`, so redefine it,
2016-09-08 10:12:53 +00:00
password = forms.CharField(widget=forms.PasswordInput, max_length=100, min_length=8, strip=True,
help_text=_('If also set private key, use that first'), required=False)
2016-09-08 14:54:05 +00:00
# Need use upload private key file except paste private key content
2016-09-08 10:12:53 +00:00
private_key_file = forms.FileField(required=False)
2016-09-07 16:59:00 +00:00
def __init__(self, *args, **kwargs):
2016-09-08 14:54:05 +00:00
# When update a admin user instance, initial it
2016-09-07 16:59:00 +00:00
if kwargs.get('instance'):
initial = kwargs.get('initial', {})
initial['assets'] = kwargs['instance'].assets.all()
2016-09-08 10:12:53 +00:00
super(AdminUserForm, self).__init__(*args, **kwargs)
2016-09-07 16:59:00 +00:00
def _save_m2m(self):
2016-09-08 14:54:05 +00:00
# Save assets relation with admin user
2016-09-08 10:12:53 +00:00
super(AdminUserForm, self)._save_m2m()
2016-09-07 16:59:00 +00:00
assets = self.cleaned_data['assets']
self.instance.assets.clear()
self.instance.assets.add(*tuple(assets))
2016-09-08 10:12:53 +00:00
def save(self, commit=True):
2016-09-08 14:54:05 +00:00
# Because we define custom field, so we need rewrite :method: `save`
2016-09-08 10:12:53 +00:00
admin_user = super(AdminUserForm, self).save(commit=commit)
password = self.cleaned_data['password']
2016-11-06 16:39:26 +00:00
private_key = self.cleaned_data['private_key_file']
public_key = ssh_pubkey_gen(private_key)
2016-09-08 10:12:53 +00:00
if password:
admin_user.password = password
2016-11-06 16:39:26 +00:00
if private_key:
admin_user.private_key = private_key
admin_user.public_key = public_key
2016-09-08 10:12:53 +00:00
admin_user.save()
2016-11-06 16:39:26 +00:00
return admin_user
def clean_private_key_file(self):
private_key_file = self.cleaned_data['private_key_file']
if private_key_file:
private_key = private_key_file.read()
if not validate_ssh_private_key(private_key):
raise forms.ValidationError(_('Invalid private key'))
return private_key
return private_key_file
def clean(self):
password = self.cleaned_data['password']
private_key_file = self.cleaned_data.get('private_key_file', '')
if not (password or private_key_file):
raise forms.ValidationError(_('Password and private key file must be input one'))
2016-09-08 10:12:53 +00:00
2016-09-07 16:59:00 +00:00
class Meta:
2016-09-08 10:12:53 +00:00
model = AdminUser
2016-11-06 16:39:26 +00:00
fields = ['name', 'username', 'password', 'private_key_file', 'comment']
2016-09-07 16:59:00 +00:00
widgets = {
'name': forms.TextInput(attrs={'placeholder': _('Name')}),
2016-09-08 10:12:53 +00:00
'username': forms.TextInput(attrs={'placeholder': _('Username')}),
}
help_texts = {
'name': '* required',
'username': '* required',
}
2016-09-08 16:09:49 +00:00
class SystemUserForm(forms.ModelForm):
# Admin user assets define, let user select, save it in form not in view
assets = forms.ModelMultipleChoiceField(queryset=Asset.objects.all(),
label=_('Asset'),
required=False,
widget=forms.SelectMultiple(
attrs={'class': 'select2', 'data-placeholder': _('Select assets')})
)
asset_groups = forms.ModelMultipleChoiceField(queryset=AssetGroup.objects.all(),
label=_('Asset group'),
required=False,
widget=forms.SelectMultiple(
attrs={'class': 'select2',
'data-placeholder': _('Select asset groups')})
)
2016-09-09 15:19:39 +00:00
auto_generate_key = forms.BooleanField(initial=True)
2016-09-08 16:09:49 +00:00
# Form field name can not start with `_`, so redefine it,
password = forms.CharField(widget=forms.PasswordInput, max_length=100, min_length=8, strip=True,
help_text=_('If also set private key, use that first'), required=False)
# Need use upload private key file except paste private key content
private_key_file = forms.FileField(required=False)
def __init__(self, *args, **kwargs):
# When update a admin user instance, initial it
if kwargs.get('instance'):
initial = kwargs.get('initial', {})
initial['assets'] = kwargs['instance'].assets.all()
initial['asset_groups'] = kwargs['instance'].asset_groups.all()
super(SystemUserForm, self).__init__(*args, **kwargs)
def _save_m2m(self):
# Save assets relation with admin user
super(SystemUserForm, self)._save_m2m()
assets = self.cleaned_data['assets']
asset_groups = self.cleaned_data['asset_groups']
self.instance.assets.clear()
self.instance.assets.add(*tuple(assets))
self.instance.asset_groups.clear()
self.instance.asset_groups.add(*tuple(asset_groups))
def save(self, commit=True):
# Because we define custom field, so we need rewrite :method: `save`
system_user = super(SystemUserForm, self).save(commit=commit)
password = self.cleaned_data['password']
private_key_file = self.cleaned_data['private_key_file']
if password:
system_user.password = password
print(password)
# Todo: Validate private key file, and generate public key
# Todo: Auto generate private key and public key
if private_key_file:
2016-11-02 11:44:11 +00:00
system_user.private_key = private_key_file.read().strip()
2016-09-08 16:09:49 +00:00
system_user.save()
return self.instance
class Meta:
model = SystemUser
fields = [
'name', 'username', 'protocol', 'auto_generate_key', 'password', 'private_key_file', 'as_default',
'auto_push', 'auto_update', 'sudo', 'comment', 'shell', 'home', 'uid',
]
widgets = {
'name': forms.TextInput(attrs={'placeholder': _('Name')}),
'username': forms.TextInput(attrs={'placeholder': _('Username')}),
}
help_texts = {
'name': '* required',
'username': '* required',
'auth_push': 'Auto push system user to asset',
'auth_update': 'Auto update system user ssh key',
2016-10-08 10:33:00 +00:00
}
2016-10-31 11:31:56 +00:00
2016-10-08 10:33:00 +00:00
class AssetTagForm(forms.ModelForm):
assets = forms.ModelMultipleChoiceField(queryset=Asset.objects.all(),
label=_('Asset'),
required=False,
widget=forms.SelectMultiple(
attrs={'class': 'select2', 'data-placeholder': _('Select assets')})
)
def __init__(self, *args, **kwargs):
if kwargs.get('instance', None):
initial = kwargs.get('initial', {})
initial['assets'] = kwargs['instance'].asset_set.all()
super(AssetTagForm, self).__init__(*args, **kwargs)
def _save_m2m(self):
super(AssetTagForm, self)._save_m2m()
assets = self.cleaned_data['assets']
self.instance.asset_set.clear()
self.instance.asset_set.add(*tuple(assets))
class Meta:
model = Tag
fields = [
"name",
]
widgets = {
'name' : forms.TextInput(attrs={}),
}
help_texts = {
'name': '* required',
2016-09-08 16:09:49 +00:00
}