Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
J
jumpserver
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
ops
jumpserver
Commits
913f93b9
Commit
913f93b9
authored
Aug 26, 2015
by
ibuler
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
删除部门前
parent
c1facb93
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
100 additions
and
114 deletions
+100
-114
connect.py
connect.py
+18
-7
api.py
jumpserver/api.py
+0
-0
context_processors.py
jumpserver/context_processors.py
+2
-0
settings.py
jumpserver/settings.py
+3
-3
urls.py
jumpserver/urls.py
+3
-3
views.py
jumpserver/views.py
+65
-61
views.py
juser/views.py
+0
-0
base.html
templates/base.html
+2
-0
dept_add.html
templates/juser/dept_add.html
+7
-40
No files found.
connect.py
View file @
913f93b9
...
...
@@ -17,8 +17,8 @@ from multiprocessing import Pool
os
.
environ
[
'DJANGO_SETTINGS_MODULE'
]
=
'jumpserver.settings'
if
django
.
get_version
()
!=
'1.6'
:
django
.
setup
()
from
jumpserver.api
import
BASE_DIR
,
ServerError
,
User
,
UserGroup
,
Asset
,
Jtty
,
get_object
from
jumpserver.api
import
CRYPTOR
,
logger
,
is_di
r
from
jumpserver.api
import
ServerError
,
User
,
Asset
,
Jtty
,
get_object
from
jumpserver.api
import
logge
r
from
jumpserver.api
import
BisGroup
as
AssetGroup
login_user
=
get_object
(
User
,
username
=
getpass
.
getuser
())
...
...
@@ -27,7 +27,7 @@ login_user = get_object(User, username=getpass.getuser())
def
color_print
(
msg
,
color
=
'red'
,
exits
=
False
):
"""
Print colorful string.
颜色打印
颜色打印
字符或者退出
"""
color_msg
=
{
'blue'
:
'
\033
[1;36m
%
s
\033
[0m'
,
'green'
:
'
\033
[1;32m
%
s
\033
[0m'
,
...
...
@@ -40,7 +40,10 @@ def color_print(msg, color='red', exits=False):
def
verify_connect
(
user
,
option
):
"""鉴定用户是否有该主机权限 或 匹配到的ip是否唯一"""
"""
Check user was permed or not . Check ip is unique or not.
鉴定用户是否有该主机权限 或 匹配到的ip是否唯一
"""
ip_matched
=
[]
try
:
assets_info
=
login_user
.
get_asset_info
()
...
...
@@ -60,7 +63,7 @@ def verify_connect(user, option):
logger
.
debug
(
'
%
s matched input
%
s:
%
s'
%
(
login_user
.
username
,
option
,
ip_matched
))
ip_matched
=
list
(
set
(
ip_matched
))
if
len
(
ip_matched
)
>
1
:
if
len
(
ip_matched
)
>
1
:
# 如果匹配ip不唯一
ip_comment
=
{}
for
ip
in
ip_matched
:
ip_comment
[
ip
]
=
assets_info
[
ip
][
2
]
...
...
@@ -71,15 +74,19 @@ def verify_connect(user, option):
else
:
print
'
%-15
s'
%
ip
print
''
elif
len
(
ip_matched
)
<
1
:
elif
len
(
ip_matched
)
<
1
:
# 如果没匹配到
color_print
(
'没有该主机,或者您没有该主机的权限 No Permission or No host.'
,
'red'
)
else
:
else
:
# 恰好是1个
asset
=
get_object
(
Asset
,
ip
=
ip_matched
[
0
])
jtty
=
Jtty
(
user
,
asset
)
jtty
.
connect
()
def
print_prompt
():
"""
Print prompt
打印提示导航
"""
msg
=
"""
\033
[1;32m### Welcome Use JumpServer To Login. ###
\033
[0m
1) Type
\033
[32mIP or Part IP, Host Alias or Comments
\033
[0m To Login.
2) Type
\033
[32mP/p
\033
[0m To Print The Servers You Available.
...
...
@@ -162,6 +169,10 @@ def print_prompt():
def
main
():
"""
he he
主程序
"""
if
not
login_user
:
# 判断用户是否存在
color_print
(
u'没有该用户,或许你是以root运行的 No that user.'
,
exits
=
True
)
...
...
jumpserver/api.py
View file @
913f93b9
This diff is collapsed.
Click to expand it.
jumpserver/context_processors.py
View file @
913f93b9
...
...
@@ -14,10 +14,12 @@ def name_proc(request):
host_active_num
=
Asset
.
objects
.
filter
(
is_active
=
True
)
.
count
()
else
:
user
,
dept
=
get_session_user_dept
(
request
)
print
user
,
dept
user_total_num
=
dept
.
user_set
.
all
()
.
count
()
user_active_num
=
dept
.
user_set
.
filter
(
is_active
=
True
)
.
count
()
host_total_num
=
dept
.
asset_set
.
all
()
.
count
()
host_active_num
=
dept
.
asset_set
.
all
()
.
filter
(
is_active
=
True
)
.
count
()
pass
username
=
User
.
objects
.
get
(
id
=
user_id
)
.
name
apply_info
=
Apply
.
objects
.
filter
(
admin
=
username
,
status
=
0
,
read
=
0
)
...
...
jumpserver/settings.py
View file @
913f93b9
...
...
@@ -56,9 +56,9 @@ INSTALLED_APPS = (
'django.contrib.humanize'
,
'jumpserver'
,
'juser'
,
'jasset'
,
'jperm'
,
'jlog'
,
#
'jasset',
#
'jperm',
#
'jlog',
)
MIDDLEWARE_CLASSES
=
(
...
...
jumpserver/urls.py
View file @
913f93b9
...
...
@@ -14,9 +14,9 @@ urlpatterns = patterns('',
(
r'^file/download/$'
,
'jumpserver.views.download'
),
(
r'^error/$'
,
'jumpserver.views.httperror'
),
(
r'^juser/'
,
include
(
'juser.urls'
)),
(
r'^jasset/'
,
include
(
'jasset.urls'
)),
(
r'^jlog/'
,
include
(
'jlog.urls'
)),
(
r'^jperm/'
,
include
(
'jperm.urls'
)),
#
(r'^jasset/', include('jasset.urls')),
#
(r'^jlog/', include('jlog.urls')),
#
(r'^jperm/', include('jperm.urls')),
(
r'^node_auth/'
,
'jumpserver.views.node_auth'
),
)
jumpserver/views.py
View file @
913f93b9
# coding: utf-8
from
__future__
import
division
import
uuid
import
urllib
from
django.db.models
import
Count
from
django.shortcuts
import
render_to_response
from
django.template
import
RequestContext
from
django.http
import
HttpResponseNotFound
from
django.http
import
HttpResponse
from
jperm.models
import
Apply
import
paramiko
from
jumpserver.api
import
*
import
uuid
import
urllib
def
getDaysByNum
(
num
):
...
...
@@ -44,7 +47,7 @@ def get_data(data, items, option):
return
dic
@require_
login
@require_
role
(
role
=
'user'
)
def
index_cu
(
request
):
user_id
=
request
.
session
.
get
(
'user_id'
)
user
=
User
.
objects
.
filter
(
id
=
user_id
)
...
...
@@ -53,7 +56,7 @@ def index_cu(request):
login_types
=
{
'L'
:
'LDAP'
,
'M'
:
'MAP'
}
user_id
=
request
.
session
.
get
(
'user_id'
)
username
=
User
.
objects
.
get
(
id
=
user_id
)
.
username
posts
=
user
_perm_asset_api
(
username
)
posts
=
user
.
get_asset
(
)
host_count
=
len
(
posts
)
new_posts
=
[]
post_five
=
[]
...
...
@@ -68,16 +71,16 @@ def index_cu(request):
return
render_to_response
(
'index_cu.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
@require_
login
@require_
role
(
role
=
'user'
)
def
index
(
request
):
li_date
,
li_str
=
getDaysByNum
(
7
)
today
=
datetime
.
datetime
.
now
()
.
day
from_week
=
datetime
.
datetime
.
now
()
-
datetime
.
timedelta
(
days
=
7
)
if
is_
common_user
(
request
):
if
is_
role_request
(
request
,
'user'
):
return
index_cu
(
request
)
elif
is_
super_user
(
request
):
elif
is_
role_request
(
request
,
'super'
):
users
=
User
.
objects
.
all
()
hosts
=
Asset
.
objects
.
all
()
online
=
Log
.
objects
.
filter
(
is_finished
=
0
)
...
...
@@ -87,7 +90,7 @@ def index(request):
active_hosts
=
Asset
.
objects
.
filter
(
is_active
=
1
)
week_data
=
Log
.
objects
.
filter
(
start_time__range
=
[
from_week
,
datetime
.
datetime
.
now
()])
elif
is_
group_admin
(
request
):
elif
is_
role_request
(
request
,
'admin'
):
user
=
get_session_user_info
(
request
)[
2
]
dept_name
,
dept
=
get_session_user_info
(
request
)[
4
:]
users
=
User
.
objects
.
filter
(
dept
=
dept
)
...
...
@@ -205,7 +208,7 @@ def login(request):
user_filter
=
User
.
objects
.
filter
(
username
=
username
)
if
user_filter
:
user
=
user_filter
[
0
]
if
md5_crypt
(
password
)
==
user
.
password
:
if
PyCrypt
.
md5_crypt
(
password
)
==
user
.
password
:
request
.
session
[
'user_id'
]
=
user
.
id
user_filter
.
update
(
last_login
=
datetime
.
datetime
.
now
())
if
user
.
role
==
'SU'
:
...
...
@@ -216,7 +219,7 @@ def login(request):
request
.
session
[
'role_id'
]
=
0
response
=
HttpResponseRedirect
(
'/'
,
)
response
.
set_cookie
(
'username'
,
username
,
expires
=
604800
)
response
.
set_cookie
(
'seed'
,
md5_crypt
(
password
),
expires
=
604800
)
response
.
set_cookie
(
'seed'
,
PyCrypt
.
md5_crypt
(
password
),
expires
=
604800
)
return
response
else
:
error
=
'密码错误,请重新输入。'
...
...
@@ -248,7 +251,7 @@ def filter_ajax_api(request):
def
install
(
request
):
from
juser.models
import
DEPT
,
User
if
User
.
objects
.
filter
(
id
=
5000
):
return
httperror
(
request
,
'Jumpserver已初始化,不能重复安装!'
)
return
http
_
error
(
request
,
'Jumpserver已初始化,不能重复安装!'
)
dept
=
DEPT
(
id
=
1
,
name
=
"超管部"
,
comment
=
"超级管理部门"
)
dept
.
save
()
...
...
@@ -257,7 +260,7 @@ def install(request):
IDC
(
id
=
1
,
name
=
"默认"
,
comment
=
"默认IDC"
)
.
save
()
BisGroup
(
id
=
1
,
name
=
"ALL"
,
dept
=
dept
,
comment
=
"所有主机组"
)
.
save
()
User
(
id
=
5000
,
username
=
"admin"
,
password
=
md5_crypt
(
'admin'
),
User
(
id
=
5000
,
username
=
"admin"
,
password
=
PyCrypt
.
md5_crypt
(
'admin'
),
name
=
'admin'
,
email
=
'admin@jumpserver.org'
,
role
=
'SU'
,
is_active
=
True
,
dept
=
dept
)
.
save
()
return
http_success
(
request
,
u'Jumpserver初始化成功'
)
...
...
@@ -278,55 +281,56 @@ def transfer(sftp, filenames):
def
upload
(
request
):
user
,
dept
=
get_session_user_dept
(
request
)
if
request
.
method
==
'POST'
:
hosts
=
request
.
POST
.
get
(
'hosts'
)
upload_files
=
request
.
FILES
.
getlist
(
'file[]'
,
None
)
upload_dir
=
"/tmp/
%
s"
%
user
.
username
is_dir
(
upload_dir
)
date_now
=
datetime
.
datetime
.
now
()
.
strftime
(
"
%
Y
%
m
%
d
%
H
%
M
%
S"
)
hosts_list
=
hosts
.
split
(
','
)
user_hosts
=
get_user_host
(
user
.
username
)
.
keys
()
unperm_hosts
=
[]
filenames
=
{}
for
ip
in
hosts_list
:
if
ip
not
in
user_hosts
:
unperm_hosts
.
append
(
ip
)
if
not
hosts
:
return
HttpResponseNotFound
(
u'地址不能为空'
)
if
unperm_hosts
:
print
hosts_list
return
HttpResponseNotFound
(
u'
%
s 没有权限.'
%
', '
.
join
(
unperm_hosts
))
for
upload_file
in
upload_files
:
file_path
=
'
%
s/
%
s.
%
s'
%
(
upload_dir
,
upload_file
.
name
,
date_now
)
filenames
[
upload_file
.
name
]
=
file_path
f
=
open
(
file_path
,
'w'
)
for
chunk
in
upload_file
.
chunks
():
f
.
write
(
chunk
)
f
.
close
()
sftps
=
[]
for
host
in
hosts_list
:
username
,
password
,
host
,
port
=
get_connect_item
(
user
.
username
,
host
)
try
:
t
=
paramiko
.
Transport
((
host
,
port
))
t
.
connect
(
username
=
username
,
password
=
password
)
sftp
=
paramiko
.
SFTPClient
.
from_transport
(
t
)
sftps
.
append
(
sftp
)
except
paramiko
.
AuthenticationException
:
return
HttpResponseNotFound
(
u'
%
s 连接失败.'
%
host
)
# pool = Pool(processes=5)
for
sftp
in
sftps
:
transfer
(
sftp
,
filenames
)
# pool.close()
# pool.join()
return
HttpResponse
(
'传送成功'
)
return
render_to_response
(
'upload.html'
,
locals
(),
context_instance
=
RequestContext
(
request
))
pass
# user, dept = get_session_user_dept(request)
# if request.method == 'POST':
# hosts = request.POST.get('hosts')
# upload_files = request.FILES.getlist('file[]', None)
# upload_dir = "/tmp/%s" % user.username
# is_dir(upload_dir)
# date_now = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
# hosts_list = hosts.split(',')
# user_hosts = [asset.ip for asset in user.get_asset()]
# unperm_hosts = []
# filenames = {}
# for ip in hosts_list:
# if ip not in user_hosts:
# unperm_hosts.append(ip)
#
# if not hosts:
# return HttpResponseNotFound(u'地址不能为空')
#
# if unperm_hosts:
# print hosts_list
# return HttpResponseNotFound(u'%s 没有权限.' % ', '.join(unperm_hosts))
#
# for upload_file in upload_files:
# file_path = '%s/%s.%s' % (upload_dir, upload_file.name, date_now)
# filenames[upload_file.name] = file_path
# f = open(file_path, 'w')
# for chunk in upload_file.chunks():
# f.write(chunk)
# f.close()
#
# sftps = []
# for host in hosts_list:
# username, password, host, port = get_connect_item(user.username, host)
# try:
# t = paramiko.Transport((host, port))
# t.connect(username=username, password=password)
# sftp = paramiko.SFTPClient.from_transport(t)
# sftps.append(sftp)
# except paramiko.AuthenticationException:
# return HttpResponseNotFound(u'%s 连接失败.' % host)
#
# # pool = Pool(processes=5)
# for sftp in sftps:
# transfer(sftp, filenames)
# # pool.close()
# # pool.join()
# return HttpResponse('传送成功')
#
# return render_to_response('upload.html', locals(), context_instance=RequestContext(request))
def
node_auth
(
request
):
...
...
juser/views.py
View file @
913f93b9
This diff is collapsed.
Click to expand it.
templates/base.html
View file @
913f93b9
...
...
@@ -11,6 +11,7 @@
<link
rel=
"shortcut icon"
href=
"/static/img/facio.ico"
type=
"image/x-icon"
>
{% include 'link_css.html' %}
{% include 'head_script.html' %}
{% block self_head_css_js %} {% endblock %}
</head>
...
...
@@ -30,4 +31,5 @@
</body>
{% include 'foot_script.html' %}
{% block self_footer_js %} {% endblock %}
</html>
templates/juser/dept_add.html
View file @
913f93b9
...
...
@@ -15,12 +15,7 @@
<a
class=
"dropdown-toggle"
data-toggle=
"dropdown"
href=
"#"
>
<i
class=
"fa fa-wrench"
></i>
</a>
<ul
class=
"dropdown-menu dropdown-user"
>
<li><a
href=
"#"
>
未启用 1
</a>
</li>
<li><a
href=
"#"
>
未启用 2
</a>
</li>
</ul>
<a
class=
"close-link"
>
<i
class=
"fa fa-times"
></i>
</a>
...
...
@@ -38,37 +33,13 @@
<label
for=
"name"
class=
"col-sm-2 control-label"
>
部门名称
<span
class=
"red-fonts"
>
*
</span></label>
<div
class=
"col-sm-8"
>
{% if error %}
<input
id=
"name"
name=
"name"
placeholder=
"Dept name"
type=
"text"
class=
"form-control"
value=
"{{ name }}"
>
<input
id=
"name"
name=
"name"
placeholder=
"Dep
artmen
t name"
type=
"text"
class=
"form-control"
value=
"{{ name }}"
>
{% else %}
<input
id=
"name"
name=
"name"
placeholder=
"Dept name"
type=
"text"
class=
"form-control"
>
<input
id=
"name"
name=
"name"
placeholder=
"Dep
artmen
t name"
type=
"text"
class=
"form-control"
>
{% endif %}
</div>
</div>
{#
<div
class=
"hr-line-dashed"
></div>
#}
{#
<div
class=
"form-group"
>
#}
{#
<label
for=
"users"
class=
"col-lg-2 control-label"
>
管理员
</label>
#}
{#
<div
class=
"col-sm-3"
>
#}
{#
<select
id=
"users"
name=
"users"
size=
"12"
class=
"form-control m-b"
multiple
>
#}
{# {% for user in users %}#}
{#
<option
value=
"{{ user.id }}"
>
{{ user.name }}
</option>
#}
{# {% endfor %}#}
{#
</select>
#}
{#
</div>
#}
{#
<div
class=
"col-sm-1"
>
#}
{#
<div
class=
"btn-group"
style=
"margin-top: 50px;"
>
#}
{#
<button
type=
"button"
class=
"btn btn-white"
onclick=
"move('users', 'users_selected')"
><i
class=
"fa fa-chevron-right"
></i></button>
#}
{#
<button
type=
"button"
class=
"btn btn-white"
onclick=
"move('users_selected', 'users')"
><i
class=
"fa fa-chevron-left"
></i>
</button>
#}
{#
</div>
#}
{#
</div>
#}
{#
<div
class=
"col-sm-3"
>
#}
{#
<div>
#}
{#
<select
id=
"users_selected"
name=
"users_selected"
class=
"form-control m-b"
size=
"12"
multiple
>
#}
{#
</select>
#}
{#
</div>
#}
{#
</div>
#}
{#
</div>
#}
<div
class=
"hr-line-dashed"
></div>
<div
class=
"form-group"
>
<label
for=
"comment"
class=
"col-sm-2 control-label"
>
备注
</label>
...
...
@@ -95,6 +66,9 @@
</div>
</div>
{% endblock %}
{% block self_footer_js %}
<script>
$
(
'#deptForm'
).
validator
({
timely
:
2
,
...
...
@@ -104,7 +78,7 @@ $('#deptForm').validator({
rule
:
"required"
,
tip
:
"输入部门名称"
,
ok
:
""
,
msg
:
{
required
:
"必须填写!"
}
msg
:
{
required
:
"必须填写!
!
"
}
}
},
valid
:
function
(
form
)
{
...
...
@@ -112,13 +86,6 @@ $('#deptForm').validator({
}
});
function
change_type
(
type
){
$
.
post
(
'/juser/group_add_ajax/'
,
{
'type'
:
type
},
function
(
data
){
$
(
'#users'
).
html
(
data
)
})
}
$
(
document
).
ready
(
function
(){
$
(
"#submit_button"
).
click
(
function
(){
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment