mirror of https://github.com/openspug/spug
U 优化主机批量导入
parent
b9ecc1b05b
commit
9a5699cf27
|
@ -13,6 +13,7 @@ from apps.account.models import Role
|
||||||
from libs.ssh import SSH, AuthenticationException
|
from libs.ssh import SSH, AuthenticationException
|
||||||
from libs import human_datetime, AttrDict
|
from libs import human_datetime, AttrDict
|
||||||
from openpyxl import load_workbook
|
from openpyxl import load_workbook
|
||||||
|
import socket
|
||||||
|
|
||||||
|
|
||||||
class HostView(View):
|
class HostView(View):
|
||||||
|
@ -96,7 +97,7 @@ def post_import(request):
|
||||||
password = request.POST.get('password')
|
password = request.POST.get('password')
|
||||||
file = request.FILES['file']
|
file = request.FILES['file']
|
||||||
ws = load_workbook(file, read_only=True)['Sheet1']
|
ws = load_workbook(file, read_only=True)['Sheet1']
|
||||||
summary = {'invalid': [], 'skip': [], 'fail': [], 'success': []}
|
summary = {'invalid': [], 'skip': [], 'fail': [], 'network': [], 'success': []}
|
||||||
for i, row in enumerate(ws.rows):
|
for i, row in enumerate(ws.rows):
|
||||||
if i == 0: # 第1行是表头 略过
|
if i == 0: # 第1行是表头 略过
|
||||||
continue
|
continue
|
||||||
|
@ -116,9 +117,16 @@ def post_import(request):
|
||||||
deleted_by_id__isnull=True).exists():
|
deleted_by_id__isnull=True).exists():
|
||||||
summary['skip'].append(i)
|
summary['skip'].append(i)
|
||||||
continue
|
continue
|
||||||
if valid_ssh(data.hostname, data.port, data.username, data.pop('password') or password) is False:
|
try:
|
||||||
|
if valid_ssh(data.hostname, data.port, data.username, data.pop('password') or password) is False:
|
||||||
|
summary['fail'].append(i)
|
||||||
|
continue
|
||||||
|
except AuthenticationException:
|
||||||
summary['fail'].append(i)
|
summary['fail'].append(i)
|
||||||
continue
|
continue
|
||||||
|
except socket.error:
|
||||||
|
summary['network'].append(i)
|
||||||
|
continue
|
||||||
host = Host.objects.create(created_by=request.user, **data)
|
host = Host.objects.create(created_by=request.user, **data)
|
||||||
if request.user.role:
|
if request.user.role:
|
||||||
request.user.role.add_host_perm(host.id)
|
request.user.role.add_host_perm(host.id)
|
||||||
|
@ -135,7 +143,7 @@ def valid_ssh(hostname, port, username, password):
|
||||||
AppSetting.set('private_key', private_key, 'ssh private key')
|
AppSetting.set('private_key', private_key, 'ssh private key')
|
||||||
AppSetting.set('public_key', public_key, 'ssh public key')
|
AppSetting.set('public_key', public_key, 'ssh public key')
|
||||||
if password:
|
if password:
|
||||||
cli = SSH(hostname, port, username, password=password)
|
cli = SSH(hostname, port, username, password=str(password))
|
||||||
code, out = cli.exec_command('mkdir -p -m 700 ~/.ssh && \
|
code, out = cli.exec_command('mkdir -p -m 700 ~/.ssh && \
|
||||||
echo %r >> ~/.ssh/authorized_keys && \
|
echo %r >> ~/.ssh/authorized_keys && \
|
||||||
chmod 600 ~/.ssh/authorized_keys' % public_key)
|
chmod 600 ~/.ssh/authorized_keys' % public_key)
|
||||||
|
|
|
@ -34,6 +34,9 @@ class ComImport extends React.Component {
|
||||||
{res['fail'].length > 0 && <Form.Item style={{margin: 0, color: '#1890ff'}} label="验证失败">
|
{res['fail'].length > 0 && <Form.Item style={{margin: 0, color: '#1890ff'}} label="验证失败">
|
||||||
<Tooltip title={`相关行:${res['fail'].join(', ')}`}>{res['fail'].length}</Tooltip>
|
<Tooltip title={`相关行:${res['fail'].join(', ')}`}>{res['fail'].length}</Tooltip>
|
||||||
</Form.Item>}
|
</Form.Item>}
|
||||||
|
{res['network'].length > 0 && <Form.Item style={{margin: 0, color: '#1890ff'}} label="网络错误">
|
||||||
|
<Tooltip title={`相关行:${res['network'].join(', ')}`}>{res['network'].length}</Tooltip>
|
||||||
|
</Form.Item>}
|
||||||
{res['skip'].length > 0 && <Form.Item style={{margin: 0, color: '#1890ff'}} label="重复数据">
|
{res['skip'].length > 0 && <Form.Item style={{margin: 0, color: '#1890ff'}} label="重复数据">
|
||||||
<Tooltip title={`相关行:${res['skip'].join(', ')}`}>{res['skip'].length}</Tooltip>
|
<Tooltip title={`相关行:${res['skip'].join(', ')}`}>{res['skip'].length}</Tooltip>
|
||||||
</Form.Item>}
|
</Form.Item>}
|
||||||
|
|
Loading…
Reference in New Issue