2
2
import datetime
3
3
import json
4
4
import os
5
+ import re
5
6
import xlrd
6
7
import xlwt
7
8
import logging
@@ -159,7 +160,7 @@ def server_facts(request):
159
160
for data in ans .get_module_results :
160
161
if module == 'setup' :
161
162
if 'success' in data :
162
- server_info , server_model , nks = ans . handle_setup_data (data )
163
+ server_info , server_model , nks = handle_setup_data (data )
163
164
Assets .objects .filter (id = server_obj .assets_id ).update (
164
165
asset_model = server_model
165
166
)
@@ -175,7 +176,7 @@ def server_facts(request):
175
176
return JsonResponse ({'code' : 500 , 'msg' : '收集失败!{}' .format (data [data .index ('>>' ) + 1 :])})
176
177
elif module == 'get_mem' :
177
178
if 'success' in data :
178
- mem_infos = ans . handle_mem_data (data )
179
+ mem_infos = handle_mem_data (data )
179
180
180
181
asset = Assets .objects .get (id = server_obj .assets_id )
181
182
for mem_info in mem_infos :
@@ -413,3 +414,136 @@ def update_pwd(request):
413
414
return JsonResponse ({'code' : 200 , 'msg' : '更新完毕!' })
414
415
except Exception as e :
415
416
return JsonResponse ({'code' : 500 , 'msg' : '更新失败:{}' .format (e )})
417
+
418
+
419
+ @admin_auth
420
+ def monitor (request , pk ):
421
+ return render (request , 'assets/monitor.html' , {'pk' : pk })
422
+
423
+
424
+ @admin_auth
425
+ def get_top_data (request , pk ):
426
+ server_obj = ServerAssets .objects .select_related ('assets' ).get (id = pk )
427
+ resource = [{"ip" : server_obj .assets .asset_management_ip , "port" : int (server_obj .port ),
428
+ "username" : server_obj .username ,
429
+ "password" : CryptPwd ().decrypt_pwd (server_obj .password )}]
430
+
431
+ ans = ANSRunner (resource , become = 'yes' , become_method = 'sudo' , become_user = 'root' )
432
+ ans .run_module (host_list = [server_obj .assets .asset_management_ip ], module_name = 'shell' ,
433
+ module_args = 'export COLUMNS\=400 && top -bcn 1 && df -h -t ext3 -t ext4 -t xfs' )
434
+ result = ans .get_module_results [0 ]
435
+ if 'success' in result :
436
+ load , tasks , cpu , mem , swap , heads , body , disk = handle_top_data (result )
437
+ return JsonResponse ({'code' : 200 , 'data' : {'load' : load , 'tasks' : tasks , 'cpu' : cpu , 'mem' : mem , 'swap' : swap ,
438
+ 'heads' : heads , 'body' : body , 'disk' : disk }, 'msg' : '收集成功!' })
439
+ else :
440
+ return JsonResponse ({'code' : 500 , 'msg' : '收集失败!{}' .format (result [result .index ('>>' ) + 1 :])})
441
+
442
+
443
+ def handle_setup_data (data ):
444
+ """处理setup模块数据,用于收集服务器信息功能"""
445
+ server_info = {}
446
+ result = json .loads (data [data .index ('{' ): data .rindex ('}' ) + 1 ])
447
+ facts = result ['ansible_facts' ]
448
+ server_info ['hostname' ] = facts ['ansible_hostname' ]
449
+ server_info ['cpu_model' ] = facts ['ansible_processor' ][- 1 ]
450
+ server_info ['cpu_number' ] = int (facts ['ansible_processor_count' ])
451
+ server_info ['vcpu_number' ] = int (facts ['ansible_processor_vcpus' ])
452
+ server_info ['disk_total' ], disk_size = 0 , 0
453
+ for k , v in facts ['ansible_devices' ].items ():
454
+ if k [0 :2 ] in ['sd' , 'hd' , 'ss' , 'vd' ]:
455
+ if 'G' in v ['size' ]:
456
+ disk_size = float (v ['size' ][0 : v ['size' ].rindex ('G' ) - 1 ])
457
+ elif 'T' in v ['size' ]:
458
+ disk_size = float (v ['size' ][0 : v ['size' ].rindex ('T' ) - 1 ]) * 1024
459
+ server_info ['disk_total' ] += round (disk_size , 2 )
460
+ server_info ['ram_total' ] = round (int (facts ['ansible_memtotal_mb' ]) / 1024 )
461
+ server_info ['kernel' ] = facts ['ansible_kernel' ]
462
+ server_info ['system' ] = '{} {} {}' .format (facts ['ansible_distribution' ],
463
+ facts ['ansible_distribution_version' ],
464
+ facts ['ansible_userspace_bits' ])
465
+ server_model = facts ['ansible_product_name' ]
466
+
467
+ # 获取网卡信息
468
+ nks = []
469
+ for nk in facts .keys ():
470
+ networkcard_facts = {}
471
+ if re .match (r"^ansible_(eth|bind|eno|ens|em)\d+?" , nk ):
472
+ networkcard_facts ['network_card_name' ] = facts .get (nk ).get ('device' )
473
+ networkcard_facts ['network_card_mac' ] = facts .get (nk ).get ('macaddress' )
474
+ networkcard_facts ['network_card_ip' ] = facts .get (nk ).get ('ipv4' ).get ('address' ) if 'ipv4' in facts .get (
475
+ nk ) else 'unknown'
476
+ networkcard_facts ['network_card_model' ] = facts .get (nk ).get ('type' )
477
+ networkcard_facts ['network_card_mtu' ] = facts .get (nk ).get ('mtu' )
478
+ networkcard_facts ['network_card_status' ] = 1 if facts .get (nk ).get ('active' ) else 0
479
+ nks .append (networkcard_facts )
480
+ return server_info , server_model , nks
481
+
482
+
483
+ def handle_mem_data (data ):
484
+ """
485
+ 处理获取的内存信息
486
+ :param data: 通过ansible获取的内存信息
487
+ :return:
488
+ """
489
+ result = json .loads (data [data .index ('{' ): data .rindex ('}' ) + 1 ])
490
+ facts = result ['ansible_facts' ]
491
+ return facts ['mem_info' ]
492
+
493
+
494
+ def handle_top_data (data ):
495
+ """
496
+ 处理获取的top命令信息
497
+ :param data: 通过ansible获取的top命令信息
498
+ :return:
499
+ """
500
+ result = data [data .index ('top' ): data .index ('</code>' )]
501
+ r = [i for i in result .split ('\n ' ) if len (i ) > 0 ]
502
+
503
+ load = [i .strip () for i in r [0 ].split ('load average:' )[1 ].split (',' )]
504
+
505
+ t = r [1 ].split (':' )[1 ]
506
+ tasks = ((n for n in m .split ()) for m in t .split (',' ))
507
+ tasks = dict ((y , x ) for x , y in tasks )
508
+
509
+ c = r [2 ].split (':' )[1 ]
510
+ cpu = ((n for n in m .replace ('%' , ' ' ).split ()) for m in c .split (',' ))
511
+ cpu = dict ((y , x ) for x , y in cpu )
512
+
513
+ m = r [3 ].split (':' )[1 ]
514
+ mem = ((n for n in re .sub ('k' , '' , i ).split ()) for i in m .split (',' ))
515
+ mem = dict ((y , x ) for x , y in mem )
516
+
517
+ s = re .sub ('avail Mem' , 'availableMem' , r [4 ].split (':' )[1 ])
518
+ swap = ((n for n in re .sub ('k' , '' , i ).split ()) for i in re .sub (r'\.' , ',' , s ).split (',' ))
519
+ swap = dict ((y , x ) for x , y in swap )
520
+
521
+ heads = None
522
+ for i in r :
523
+ if i .lstrip ().startswith ('P' ):
524
+ heads = [h for h in i .split ()]
525
+ break
526
+
527
+ p = [d .strip () for d in r if d .lstrip ()[0 ].isdigit () and d .rstrip ()[- 1 ] != ']' ]
528
+ body = [[n for n in x .split ()[:len (heads ) - 1 ] + [' ' .join (x .split ()[len (heads ) - 1 :])]] for x in p ]
529
+
530
+ d = [i for i in r if i .lstrip ().startswith ('/' ) and 'boot' not in i ]
531
+ disk = [['disk' , '总容量' , '已用' , '可用' ]]
532
+ for i in d :
533
+ # disk = [f'{i.split()[0]}({(i.split()[-1])})'].extend(i.split()[1:-2])
534
+ temp = [format_size (n ) for n in i .split ()[1 :- 2 ]]
535
+ temp .insert (0 , f'{ i .split ()[0 ]} ({ (i .split ()[- 1 ])} )' )
536
+ disk .append (temp )
537
+
538
+ return load , tasks , cpu , mem , swap , heads , body , disk
539
+
540
+
541
+ def format_size (size ):
542
+ if size .endswith ('M' ):
543
+ size = round (int (size [:- 1 ]) / 1024 , 2 )
544
+ elif size .endswith ('T' ):
545
+ size = int (size [:- 1 ]) * 1024
546
+ else :
547
+ size = float (size [:- 1 ])
548
+
549
+ return size
0 commit comments