Skip to content

Commit 76df1de

Browse files
committed
[Bugfix] 修复一些明显的bug
1 parent 5a92972 commit 76df1de

36 files changed

Lines changed: 302 additions & 389 deletions

apps/assets/api.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,11 @@ def get_queryset(self):
4444
else:
4545
assets_granted = get_user_granted_assets(self.request.user)
4646
queryset = self.queryset.filter(id__in=[asset.id for asset in assets_granted])
47+
4748
cluster_id = self.request.query_params.get('cluster_id')
4849
asset_group_id = self.request.query_params.get('asset_group_id')
4950
admin_user_id = self.request.query_params.get('admin_user_id')
51+
5052
if cluster_id:
5153
queryset = queryset.filter(cluster__id=cluster_id)
5254
if asset_group_id:

apps/assets/forms.py

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
# coding:utf-8
2-
import uuid
32
from django import forms
43
from django.utils.translation import gettext_lazy as _
54

@@ -9,7 +8,6 @@
98

109
logger = get_logger(__file__)
1110

12-
from rest_framework import serializers
1311

1412
class AssetCreateForm(forms.ModelForm):
1513

@@ -57,11 +55,11 @@ class Meta:
5755

5856

5957
class AssetBulkUpdateForm(forms.ModelForm):
60-
assets = forms.MultipleChoiceField(
58+
assets = forms.ModelMultipleChoiceField(
6159
required=True,
6260
help_text='* required',
6361
label=_('Select assets'),
64-
choices=[(asset.id, asset.hostname) for asset in Asset.objects.all()],
62+
queryset=Asset.objects.all(),
6563
widget=forms.SelectMultiple(
6664
attrs={
6765
'class': 'select2',
@@ -94,10 +92,9 @@ def save(self, commit=True):
9492

9593
cleaned_data = {k: v for k, v in self.cleaned_data.items()
9694
if k in changed_fields}
97-
print(cleaned_data)
98-
assets_id = cleaned_data.pop('assets')
95+
assets = cleaned_data.pop('assets')
9996
groups = cleaned_data.pop('groups', [])
100-
assets = Asset.objects.filter(id__in=assets_id)
97+
assets = Asset.objects.filter(id__in=[asset.id for asset in assets])
10198
assets.update(**cleaned_data)
10299
if groups:
103100
for asset in assets:
@@ -175,16 +172,18 @@ def save(self, commit=True):
175172
password = None
176173

177174
if private_key:
178-
public_key = ssh_pubkey_gen(private_key)
175+
public_key = ssh_pubkey_gen(private_key, password=password)
179176

180177
admin_user.set_auth(password=password, public_key=public_key, private_key=private_key)
181178
return admin_user
182179

183180
def clean_private_key_file(self):
184181
private_key_file = self.cleaned_data['private_key_file']
182+
password = self.cleaned_data['password']
183+
185184
if private_key_file:
186185
private_key = private_key_file.read()
187-
if not validate_ssh_private_key(private_key):
186+
if not validate_ssh_private_key(private_key, password):
188187
raise forms.ValidationError(_('Invalid private key'))
189188
return private_key
190189
return private_key_file

apps/assets/models/asset.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,6 @@
1818
logger = logging.getLogger(__name__)
1919

2020

21-
def get_default_cluster():
22-
return Cluster.initial()
23-
24-
2521
class Asset(models.Model):
2622
# Todo: Move them to settings
2723
STATUS_CHOICES = (
@@ -48,7 +44,7 @@ class Asset(models.Model):
4844
hostname = models.CharField(max_length=128, unique=True, verbose_name=_('Hostname'))
4945
port = models.IntegerField(default=22, verbose_name=_('Port'))
5046
groups = models.ManyToManyField(AssetGroup, blank=True, related_name='assets', verbose_name=_('Asset groups'))
51-
cluster = models.ForeignKey(Cluster, blank=True, null=True, related_name='assets', on_delete=models.SET_NULL, verbose_name=_('Cluster'),)
47+
cluster = models.ForeignKey(Cluster, blank=True, null=True, related_name='assets', on_delete=models.SET_NULL, verbose_name=_('Cluster'))
5248
is_active = models.BooleanField(default=True, verbose_name=_('Is active'))
5349
type = models.CharField(choices=TYPE_CHOICES, max_length=16, blank=True, null=True, default='Server', verbose_name=_('Asset type'),)
5450
env = models.CharField(choices=ENV_CHOICES, max_length=8, blank=True, null=True, default='Prod', verbose_name=_('Asset environment'),)

apps/assets/models/group.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import logging
1111
from django.utils.translation import ugettext_lazy as _
1212

13-
from .user import SystemUser
1413

1514
__all__ = ['AssetGroup']
1615
logger = logging.getLogger(__name__)

apps/assets/models/user.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -66,16 +66,15 @@ def private_key_obj(self):
6666

6767
@property
6868
def private_key_file(self):
69-
if not self.private_key:
69+
if not self.private_key_obj:
7070
return None
7171
project_dir = settings.PROJECT_DIR
7272
tmp_dir = os.path.join(project_dir, 'tmp')
7373
key_str = signer.unsign(self._private_key)
74-
key_name = md5(key_str.encode('utf-8')).hexdigest()
74+
key_name = '.' + md5(key_str.encode('utf-8')).hexdigest()
7575
key_path = os.path.join(tmp_dir, key_name)
7676
if not os.path.exists(key_path):
77-
with open(key_path, 'w') as f:
78-
f.write(key_str)
77+
self.private_key_obj.write_private_key_file(key_path)
7978
os.chmod(key_path, 0o400)
8079
return key_path
8180

@@ -105,7 +104,6 @@ def set_auth(self, password=None, private_key=None, public_key=None):
105104
update_fields.append('_public_key')
106105

107106
if update_fields:
108-
print(update_fields)
109107
self.save(update_fields=update_fields)
110108

111109
def auto_gen_auth(self):
@@ -149,7 +147,11 @@ def __str__(self):
149147

150148
@property
151149
def become_pass(self):
152-
return signer.unsign(self._become_pass)
150+
password = signer.unsign(self._become_pass)
151+
if password:
152+
return password
153+
else:
154+
return ""
153155

154156
@become_pass.setter
155157
def become_pass(self, password):
@@ -199,7 +201,7 @@ class SystemUser(AssetUser):
199201
('K', 'Public key'),
200202
)
201203
cluster = models.ManyToManyField('assets.Cluster', blank=True, verbose_name=_("Cluster"))
202-
priority = models.IntegerField(default=10, verbose_name=_("Priority")) # Todo: If user granted more priority user, default will be login as the hign
204+
priority = models.IntegerField(default=10, verbose_name=_("Priority"))
203205
protocol = models.CharField(max_length=16, choices=PROTOCOL_CHOICES, default='ssh', verbose_name=_('Protocol'))
204206
auto_push = models.BooleanField(default=True, verbose_name=_('Auto push'))
205207
sudo = models.TextField(default='/sbin/ifconfig', verbose_name=_('Sudo'))

apps/assets/tasks.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -402,12 +402,6 @@ def push_system_user_on_auth_change(sender, instance=None, update_fields=None, *
402402
push_system_user_to_cluster_assets.delay(instance, task_name)
403403

404404

405-
@receiver(on_app_ready, dispatch_uid="my_unique_identifier")
406-
def test_admin_user_on_app_ready(sender, **kwargs):
407-
logger.debug("Receive app ready signal, test admin connectability")
408-
test_admin_user_connectability_period.delay()
409-
410-
411405
celery_app.conf['CELERYBEAT_SCHEDULE'].update(
412406
{
413407
'update_assets_hardware_period': {

apps/assets/templates/assets/asset_detail.html

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@
6363
</tr>
6464
<tr>
6565
<td>{% trans 'Public IP' %}:</td>
66-
<td><b>{{ asset.public_ip }}</b></td>
66+
<td><b>{{ asset.public_ip|default:"" }}</b></td>
6767
</tr>
6868
<tr>
6969
<td>{% trans 'Port' %}:</td>
@@ -74,60 +74,60 @@
7474
{% if asset.admin_user_avail %}
7575
<td><b>{{ asset.admin_user_avail.name }}</b></td>
7676
{% else %}
77-
<td><b>None</b></td>
77+
<td></td>
7878
{% endif %}
7979
</tr>
8080
<tr>
8181
<td>{% trans 'Remote card IP' %}:</td>
82-
<td><b>{{ asset.remote_card_ip }}</b></td>
82+
<td><b>{{ asset.remote_card_ip|default:"" }}</b></td>
8383
</tr>
8484
<tr>
8585
<td>{% trans 'Cluster' %}:</td>
8686
<td><b>{{ asset.cluster.name }}</b></td>
8787
</tr>
8888
<tr>
8989
<td>{% trans 'Cabinet number' %}:</td>
90-
<td><b>{{ asset.cabinet_no }}</b></td>
90+
<td><b>{{ asset.cabinet_no|default:"" }}</b></td>
9191
</tr>
9292
<tr>
9393
<td>{% trans 'Cabinet position' %}:</td>
94-
<td><b>{{ asset.cabinet_pos }}</b></td>
94+
<td><b>{{ asset.cabinet_pos|default:"" }}</b></td>
9595
</tr>
9696
<tr>
9797
<td>{% trans 'Vendor' %}:</td>
98-
<td><b>{{ asset.vendor }}</b></td>
98+
<td><b>{{ asset.vendor|default:"" }}</b></td>
9999
</tr>
100100
<tr>
101101
<td>{% trans 'Model' %}:</td>
102-
<td><b>{{ asset.model }}</b></td>
102+
<td><b>{{ asset.model|default:"" }}</b></td>
103103
</tr>
104104
<tr>
105105
<td>{% trans 'CPU' %}:</td>
106-
<td><b>{{ asset.cpu_model }} {{ asset.cpu_count }}*{{ asset.cpu_cores }}</b></td>
106+
<td><b>{{ asset.cpu_model|default:"" }} {{ asset.cpu_count|default:"" }}*{{ asset.cpu_cores|default:"" }}</b></td>
107107
</tr>
108108
<tr>
109109
<td>{% trans 'Memory' %}:</td>
110-
<td><b>{{ asset.memory }}</b></td>
110+
<td><b>{{ asset.memory|default:"" }}</b></td>
111111
</tr>
112112
<tr>
113113
<td>{% trans 'Disk' %}:</td>
114-
<td><b>{{ asset.disk_total }}</b></td>
114+
<td><b>{{ asset.disk_total|default:"" }}</b></td>
115115
</tr>
116116
<tr>
117117
<td>{% trans 'Platform' %}:</td>
118-
<td><b>{{ asset.platform }}</b></td>
118+
<td><b>{{ asset.platform|default:"" }}</b></td>
119119
</tr>
120120
<tr>
121121
<td>{% trans 'OS' %}:</td>
122-
<td><b>{{ asset.os }} {{ asset.os_version }} {{ asset.os_arch }}</b></td>
122+
<td><b>{{ asset.os|default:"" }} {{ asset.os_version|default:"" }} {{ asset.os_arch|default:"" }}</b></td>
123123
</tr>
124124
<tr>
125125
<td>{% trans 'Asset status' %}:</td>
126126
<td><b>{{ asset.status }}</b></td>
127127
</tr>
128128
<tr>
129129
<td>{% trans 'Is active' %}:</td>
130-
<td><b>{{ asset.is_active }}</b></td>
130+
<td><b>{{ asset.is_active|yesno:"Yes,No" }}</b></td>
131131
</tr>
132132
<tr>
133133
<td>{% trans 'Asset type' %}:</td>
@@ -139,11 +139,11 @@
139139
</tr>
140140
<tr>
141141
<td>{% trans 'Serial number' %}:</td>
142-
<td><b>{{ asset.sn }}</b></td>
142+
<td><b>{{ asset.sn|default:"" }}</b></td>
143143
</tr>
144144
<tr>
145145
<td>{% trans 'Asset number' %}:</td>
146-
<td><b>{{ asset.number }}</b></td>
146+
<td><b>{{ asset.number|default:"" }}</b></td>
147147
</tr>
148148
<tr>
149149
<td>{% trans 'Created by' %}:</td>

apps/assets/templates/assets/asset_list.html

Lines changed: 41 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,7 @@
6464
<script src="{% static 'js/jquery.form.min.js' %}"></script>
6565
<script type="text/javascript">
6666

67-
68-
$(document).ready(function(){
67+
function initTable() {
6968
var options = {
7069
ele: $('#asset_list_table'),
7170
columnDefs: [
@@ -103,48 +102,51 @@
103102
{data: "is_active" }, {data: "is_connective"}, {data: "id" }],
104103
op_html: $('#actions').html()
105104
};
106-
var table = jumpserver.initDataTable(options);
105+
return jumpserver.initDataTable(options);
106+
}
107107

108-
$('.btn_export').click(function () {
109-
var assets = [];
110-
var rows = table.rows('.selected').data();
111-
$.each(rows, function (index, obj) {
112-
assets.push(obj.id)
113-
});
114-
console.log(assets);
115-
$.ajax({
116-
url: "{% url "assets:asset-export" %}",
117-
method: 'POST',
118-
data: JSON.stringify({assets_id: assets}),
119-
dataType: "json",
120-
success: function (data, textStatus) {
121-
window.open(data.redirect)
122-
},
123-
error: function () {
124-
toastr.error('Export failed');
125-
}
126-
})
108+
$(document).ready(function(){
109+
initTable();
110+
})
111+
.on('click', '#btn_export', function () {
112+
var $data_table = $('#asset_list_table').DataTable();
113+
var rows = $data_table.rows('.selected').data();
114+
var assets = [];
115+
$.each(rows, function (index, obj) {
116+
assets.push(obj.id)
127117
});
128-
$('#btn_asset_import').click(function() {
129-
var $form = $('#fm_asset_import');
130-
$form.find('.help-block').remove();
131-
function success (data) {
132-
if (data.valid === false) {
133-
$('<span />', {class: 'help-block text-danger'}).html(data.msg).insertAfter($('#id_assets'));
134-
} else {
135-
$('#id_created').html(data.created_info);
136-
$('#id_created_detail').html(data.created.join(', '));
137-
$('#id_updated').html(data.updated_info);
138-
$('#id_updated_detail').html(data.updated.join(', '));
139-
$('#id_failed').html(data.failed_info);
140-
$('#id_failed_detail').html(data.failed.join(', '));
141-
var $data_table = $('#asset_list_table').DataTable();
142-
$data_table.ajax.reload();
143-
}
118+
$.ajax({
119+
url: "{% url "assets:asset-export" %}",
120+
method: 'POST',
121+
data: JSON.stringify({assets_id: assets}),
122+
dataType: "json",
123+
success: function (data, textStatus) {
124+
window.open(data.redirect)
125+
},
126+
error: function () {
127+
toastr.error('Export failed');
144128
}
145-
$form.ajaxSubmit({success: success});
146129
})
147130
})
131+
.on('click', '#btn_import', function () {
132+
var $form = $('#fm_asset_import');
133+
$form.find('.help-block').remove();
134+
function success (data) {
135+
if (data.valid === false) {
136+
$('<span />', {class: 'help-block text-danger'}).html(data.msg).insertAfter($('#id_assets'));
137+
} else {
138+
$('#id_created').html(data.created_info);
139+
$('#id_created_detail').html(data.created.join(', '));
140+
$('#id_updated').html(data.updated_info);
141+
$('#id_updated_detail').html(data.updated.join(', '));
142+
$('#id_failed').html(data.failed_info);
143+
$('#id_failed_detail').html(data.failed.join(', '));
144+
var $data_table = $('#asset_list_table').DataTable();
145+
$data_table.ajax.reload();
146+
}
147+
}
148+
$form.ajaxSubmit({success: success});
149+
})
148150

149151
.on('click', '.btn_asset_delete', function () {
150152
var $this = $(this);

apps/assets/templates/assets/cluster_list.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
<link href="{% static 'css/plugins/select2/select2.min.css' %}" rel="stylesheet">
55
<script src="{% static 'js/plugins/select2/select2.full.min.js' %}"></script>
66
{% endblock %}
7+
78
{% block table_search %}{% endblock %}
89
{% block table_container %}
910
<div class="uc pull-left m-r-5">

apps/assets/templates/assets/system_user_list.html

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
{% extends '_base_list.html' %}
22
{% load i18n %}
33

4+
{% block help_message %}
5+
<div class="alert alert-info help-message">
6+
系统用户是 用户登录资产(服务器)时使用的用户,如 web, sa, dba等具有特殊功能的用户。系统用户创建时,如果选择了自动推送
7+
Jumpserver会使用ansible自动推送到系统用户所在集群的资产中,如果资产(交换机)不支持ansible, 请手动填写账号密码。
8+
</div>
9+
{% endblock %}
10+
411
{% block table_search %}
512
{% endblock %}
613

0 commit comments

Comments
 (0)