mirror of https://github.com/jumpserver/jumpserver
完成上传下载
parent
0e6fd89f0b
commit
77da01d1ee
|
@ -694,6 +694,10 @@ class Nav(object):
|
|||
logger.debug('Upload tmp dir: %s' % tmp_dir)
|
||||
os.chdir(tmp_dir)
|
||||
bash('rz')
|
||||
check_notempty = os.listdir(tmp_dir)
|
||||
if not check_notempty:
|
||||
print color_print("上传文件为空")
|
||||
continue
|
||||
runner = MyRunner(res)
|
||||
runner.run('copy', module_args='src=%s dest=%s directory_mode'
|
||||
% (tmp_dir, tmp_dir), pattern=pattern)
|
||||
|
@ -742,7 +746,7 @@ class Nav(object):
|
|||
ret = runner.get_result()
|
||||
os.chdir('/tmp')
|
||||
tmp_dir_name = os.path.basename(tmp_dir)
|
||||
bash('tar czf %s.tar.gz %s && sz %s.tar.gz' % (tmp_dir, tmp_dir_name, tmp_dir))
|
||||
bash('tar czf %s.tar.gz %s ' % (tmp_dir, tmp_dir_name))
|
||||
|
||||
if ret.get('failed'):
|
||||
print ret
|
||||
|
|
|
@ -293,8 +293,7 @@ def upload(request):
|
|||
asset_ids = request.POST.getlist('asset_ids', '')
|
||||
upload_files = request.FILES.getlist('file[]', None)
|
||||
date_now = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
|
||||
upload_dir = "/tmp/%s/%s" % (user.username, date_now)
|
||||
mkdir(upload_dir, mode=0777)
|
||||
upload_dir = get_tmp_dir()
|
||||
filenames = {}
|
||||
for asset_id in asset_ids:
|
||||
asset_select.append(get_object(Asset, id=asset_id))
|
||||
|
@ -328,6 +327,36 @@ def upload(request):
|
|||
|
||||
@login_required(login_url='/login')
|
||||
def download(request):
|
||||
user = request.user
|
||||
assets = get_group_user_perm(user).get('asset').keys()
|
||||
|
||||
asset_select = []
|
||||
if request.method == 'POST':
|
||||
asset_ids = request.POST.getlist('asset_ids', '')
|
||||
file_path = request.POST.get('file_path')
|
||||
date_now = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
|
||||
upload_dir = get_tmp_dir()
|
||||
for asset_id in asset_ids:
|
||||
asset_select.append(get_object(Asset, id=asset_id))
|
||||
|
||||
if not set(asset_select).issubset(set(assets)):
|
||||
illegal_asset = set(asset_select).issubset(set(assets))
|
||||
return HttpResponse('没有权限的服务器 %s' % ','.join([asset.hostname for asset in illegal_asset]))
|
||||
res = gen_resource({'user': user, 'asset': asset_select})
|
||||
runner = MyRunner(res)
|
||||
runner.run('fetch', module_args='src=%s dest=%s' % (file_path, upload_dir), pattern='*')
|
||||
logger.debug(runner.get_result())
|
||||
os.chdir('/tmp')
|
||||
tmp_dir_name = os.path.basename(upload_dir)
|
||||
tar_file = '%s.tar.gz' % upload_dir
|
||||
bash('tar czf %s %s && sz %s.tar.gz' % (tar_file, tmp_dir_name, upload_dir))
|
||||
f = open(tar_file)
|
||||
data = f.read()
|
||||
f.close()
|
||||
response = HttpResponse(data, content_type='application/octet-stream')
|
||||
response['Content-Disposition'] = 'attachment; filename=%s' % os.path.basename(tar_file)
|
||||
return response
|
||||
|
||||
return render_to_response('download.html', locals(), context_instance=RequestContext(request))
|
||||
|
||||
|
||||
|
|
|
@ -1,5 +1,10 @@
|
|||
{% extends 'base.html' %}
|
||||
{% load mytags %}
|
||||
{% block self_head_css_js %}
|
||||
<link href="/static/css/plugins/datepicker/datepicker3.css" rel="stylesheet">
|
||||
<link href="/static/css/plugins/chosen/chosen.css" rel="stylesheet">
|
||||
<script src="/static/js/plugins/chosen/chosen.jquery.js"></script>
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
{% include 'nav_cat_bar.html' %}
|
||||
|
||||
|
@ -22,18 +27,56 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="ibox-content">
|
||||
<h2>下载文件可联系管理员在服务器安装lrzsz,使用sz命令下载。 </h2>
|
||||
<div>
|
||||
{% for document in documents %}
|
||||
<a href="/download/{{ document }}">{{ document }}</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
<form id="downForm" class="form-horizontal" method="post">
|
||||
{% if error %}
|
||||
<div class="alert alert-warning text-center">{{ error }}</div>
|
||||
{% endif %}
|
||||
{% if msg %}
|
||||
<div class="alert alert-success text-center">{{ msg }}</div>
|
||||
{% endif %}
|
||||
<div class="form-group">
|
||||
<label for="file_path" class="col-sm-2 control-label">文件路径<span class="red-fonts">*</span></label>
|
||||
<div class="col-sm-8">
|
||||
<input id="file_path" name="file_path" placeholder="File Path" type="text" class="form-control">
|
||||
</div>
|
||||
</div>
|
||||
<div class="hr-line-dashed"></div>
|
||||
<div class="form-group">
|
||||
<label for="user" class="col-sm-2 control-label">选择主机<span class="red-fonts">*</span></label>
|
||||
<div class="col-sm-8">
|
||||
<select name="asset_ids" id="asset_ids" data-placeholder="请输入" class="chosen-select form-control m-b" multiple tabindex="2">
|
||||
{% for asset in assets %}
|
||||
<option value="{{ asset.id }}">{{ asset.hostname }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-sm-4 col-sm-offset-2">
|
||||
<button class="btn btn-white" type="reset">取消</button>
|
||||
<button id="submit_button" class="btn btn-primary" type="submit">下载</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
{% block self_footer_js %}
|
||||
<script>
|
||||
var config = {
|
||||
'.chosen-select' : {},
|
||||
'.chosen-select-deselect' : {allow_single_deselect:true},
|
||||
'.chosen-select-no-single' : {disable_search_threshold:10},
|
||||
'.chosen-select-no-results': {no_results_text:'Oops, nothing found!'},
|
||||
'.chosen-select-width' : {width:"95%"}
|
||||
};
|
||||
|
||||
for (var selector in config) {
|
||||
$(selector).chosen(config[selector]);
|
||||
}
|
||||
</script>
|
||||
{% endblock %}
|
Loading…
Reference in New Issue