Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
K
koko
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
koko
Commits
2881419d
Commit
2881419d
authored
May 10, 2019
by
ibuler
Browse files
Options
Browse Files
Download
Plain Diff
[Update] Merge
parents
0dcec41a
6370e59c
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
127 additions
and
133 deletions
+127
-133
Gopkg.lock
Gopkg.lock
+2
-2
banner.go
pkg/handler/banner.go
+1
-1
session.go
pkg/handler/session.go
+122
-127
sftp.go
pkg/handler/sftp.go
+1
-1
proxy.go
pkg/proxy/proxy.go
+1
-1
srvconn.go
pkg/proxy/srvconn.go
+0
-1
No files found.
Gopkg.lock
View file @
2881419d
...
...
@@ -172,7 +172,7 @@
[[projects]]
branch = "master"
digest = "1:
343efc58e056071ced09d112d201b64af4d38e31bc81a5cb77744f2c74fe9e7f
"
digest = "1:
ed3d25dee9c9d77611e5ce1bd3a5a078930e8efb31afac120ccb1fbba7ec08d1
"
name = "golang.org/x/sys"
packages = [
"cpu",
...
...
@@ -180,7 +180,7 @@
"windows",
]
pruneopts = "UT"
revision = "
2d0786266e9cd132da844109aa05016f11f3df28
"
revision = "
a5b02f93d862f065920dd6a40dddc66b60d0dec4
"
[[projects]]
digest = "1:c805e517269b0ba4c21ded5836019ed7d16953d4026cb7d00041d039c7906be9"
...
...
pkg/handler/banner.go
View file @
2881419d
...
...
@@ -73,7 +73,7 @@ func displayBanner(sess ssh.Session, user string) {
welcomeMsg
:=
prefix
+
utils
.
WrapperTitle
(
user
+
","
)
+
" "
+
title
+
suffix
_
,
err
:=
io
.
WriteString
(
sess
,
welcomeMsg
)
if
err
!=
nil
{
logger
.
Error
(
"Send to client error, %s"
,
err
)
logger
.
Error
f
(
"Send to client error, %s"
,
err
)
return
}
for
_
,
v
:=
range
menu
{
...
...
pkg/handler/session.go
View file @
2881419d
...
...
@@ -59,6 +59,7 @@ func (h *interactiveHandler) Initial() {
h
.
displayBanner
()
h
.
loadUserAssets
()
h
.
loadUserAssetNodes
()
h
.
searchResult
=
h
.
assets
}
func
(
h
*
interactiveHandler
)
displayBanner
()
{
...
...
@@ -102,7 +103,8 @@ func (h *interactiveHandler) Dispatch(ctx cctx.Context) {
case
0
,
1
:
switch
strings
.
ToLower
(
line
)
{
case
""
,
"p"
:
h
.
Proxy
(
ctx
)
h
.
displayAssets
(
h
.
assets
)
//h.Proxy(ctx)
case
"g"
:
h
.
displayNodes
(
h
.
nodes
)
case
"h"
:
...
...
@@ -140,14 +142,38 @@ func (h *interactiveHandler) Dispatch(ctx cctx.Context) {
h
.
displayAssetsOrProxy
(
assets
)
}
}
}
}
func
(
h
*
interactiveHandler
)
chooseSystemUser
(
systemUsers
[]
model
.
SystemUser
)
model
.
SystemUser
{
table
:=
tablewriter
.
NewWriter
(
h
.
sess
)
length
:=
len
(
systemUsers
)
switch
length
{
case
0
:
return
model
.
SystemUser
{}
case
1
:
return
systemUsers
[
0
]
default
:
}
displaySystemUsers
:=
make
([]
model
.
SystemUser
,
0
)
model
.
SortSystemUserByPriority
(
systemUsers
)
highestPriority
:=
systemUsers
[
length
-
1
]
.
Priority
displaySystemUsers
=
append
(
displaySystemUsers
,
systemUsers
[
length
-
1
])
for
i
:=
length
-
2
;
i
>=
0
;
i
--
{
if
highestPriority
==
systemUsers
[
i
]
.
Priority
{
displaySystemUsers
=
append
(
displaySystemUsers
,
systemUsers
[
i
])
}
}
if
len
(
displaySystemUsers
)
==
1
{
return
displaySystemUsers
[
0
]
}
table
:=
tablewriter
.
NewWriter
(
h
.
term
)
table
.
SetHeader
([]
string
{
"ID"
,
"Username"
})
for
i
:=
0
;
i
<
len
(
s
ystemUsers
);
i
++
{
table
.
Append
([]
string
{
strconv
.
Itoa
(
i
+
1
),
s
ystemUsers
[
i
]
.
Username
})
for
i
:=
0
;
i
<
len
(
displayS
ystemUsers
);
i
++
{
table
.
Append
([]
string
{
strconv
.
Itoa
(
i
+
1
),
displayS
ystemUsers
[
i
]
.
Username
})
}
table
.
SetBorder
(
false
)
count
:=
0
...
...
@@ -159,54 +185,32 @@ func (h *interactiveHandler) chooseSystemUser(systemUsers []model.SystemUser) mo
continue
}
if
num
,
err
:=
strconv
.
Atoi
(
line
);
err
==
nil
{
if
num
>
0
&&
num
<=
len
(
s
ystemUsers
)
{
return
s
ystemUsers
[
num
-
1
]
if
num
>
0
&&
num
<=
len
(
displayS
ystemUsers
)
{
return
displayS
ystemUsers
[
num
-
1
]
}
}
count
++
}
return
s
ystemUsers
[
0
]
return
displayS
ystemUsers
[
0
]
}
// 当资产的数量为1的时候,就进行代理转化
func
(
h
*
interactiveHandler
)
displayAssetsOrProxy
(
assets
[]
model
.
Asset
)
{
//if len(assets) == 1 {
// var systemUser model.SystemUser
// switch len(assets[0].SystemUsers) {
// case 0:
// // 有授权的资产,但是资产用户信息,无法登陆
// h.displayAssets(assets)
// return
// case 1:
// systemUser = assets[0].SystemUsers[0]
// default:
// systemUser = h.chooseSystemUser(assets[0].SystemUsers)
// }
//
// authInfo, err := model.GetSystemUserAssetAuthInfo(systemUser.ID, assets[0].ID)
// if err != nil {
// return
// }
// if ok := service.ValidateUserAssetPermission(h.user.ID, systemUser.ID, assets[0].ID); !ok {
// // 检查user 是否对该资产有权限
// return
// }
//
// err = h.Proxy(assets[0], authInfo)
// if err != nil {
// logger.Info(err)
// }
// return
//} else {
// h.displayAssets(assets)
//}
if
len
(
assets
)
==
1
{
systemUser
:=
h
.
chooseSystemUser
(
assets
[
0
]
.
SystemUsers
)
h
.
assetSelect
=
&
assets
[
0
]
h
.
systemUserSelect
=
&
systemUser
h
.
Proxy
(
context
.
TODO
())
}
else
{
h
.
displayAssets
(
assets
)
}
}
func
(
h
*
interactiveHandler
)
displayAssets
(
assets
model
.
AssetList
)
{
if
len
(
assets
)
==
0
{
_
,
_
=
io
.
WriteString
(
h
.
sess
,
"
\r\n
No Assets
\r\n\r
"
)
_
,
_
=
io
.
WriteString
(
h
.
term
,
"
\r\n
No Assets
\r\n\r
"
)
}
else
{
table
:=
tablewriter
.
NewWriter
(
h
.
sess
)
table
:=
tablewriter
.
NewWriter
(
h
.
term
)
table
.
SetHeader
([]
string
{
"ID"
,
"Hostname"
,
"IP"
,
"LoginAs"
,
"Comment"
})
for
index
,
assetItem
:=
range
assets
{
sysUserArray
:=
make
([]
string
,
len
(
assetItem
.
SystemUsers
))
...
...
@@ -228,9 +232,9 @@ func (h *interactiveHandler) displayNodes(nodes []model.Node) {
tipHeaderMsg
:=
"
\r\n
Node: [ ID.Name(Asset amount) ]"
tipEndMsg
:=
"Tips: Enter g+NodeID to display the host under the node, such as g1
\r\n\r
"
_
,
err
:=
io
.
WriteString
(
h
.
sess
,
tipHeaderMsg
)
_
,
err
=
io
.
WriteString
(
h
.
sess
,
tree
.
String
())
_
,
err
=
io
.
WriteString
(
h
.
sess
,
tipEndMsg
)
_
,
err
:=
io
.
WriteString
(
h
.
term
,
tipHeaderMsg
)
_
,
err
=
io
.
WriteString
(
h
.
term
,
tree
.
String
())
_
,
err
=
io
.
WriteString
(
h
.
term
,
tipEndMsg
)
if
err
!=
nil
{
logger
.
Info
(
"displayAssetNodes err:"
,
err
)
}
...
...
@@ -252,75 +256,41 @@ func (h *interactiveHandler) loadUserAssetNodes() {
h
.
nodes
=
service
.
GetUserNodes
(
h
.
user
.
ID
,
"1"
)
}
func
(
h
*
interactiveHandler
)
changeLanguage
()
{
}
func
(
h
*
interactiveHandler
)
JoinShareRoom
(
roomID
string
)
{
//sshConn := userhome.NewSSHConn(h.sess)
//ctx, cancelFuc := context.WithCancel(h.sess.Context())
//
//_, winCh, _ := h.sess.Pty()
//go func() {
// for {
// select {
// case <-ctx.Done():
// return
// case win, ok := <-winCh:
// if !ok {
// return
// }
// fmt.Println("join term change:", win)
// }
// }
//}()
//proxybak.Manager.JoinShareRoom(roomID, sshConn)
logger
.
Info
(
"exit room id:"
,
roomID
)
//cancelFuc()
}
func
(
h
*
interactiveHandler
)
searchAsset
(
key
string
)
(
assets
[]
model
.
Asset
)
{
//
if indexNum, err := strconv.Atoi(key); err == nil {
//
if indexNum > 0 && indexNum <= len(h.searchResult) {
// return
[]model.Asset{h.searchResult[indexNum-1]}
// }
//
}
//
//if assetsData, ok := h.assetData.Load(AssetsMapKey); ok
{
// for _, assetValue := range assetsData.([]model.Asset) {
// if isSubstring([]string{assetValue.Ip, assetValue.Hostname, assetValue.Comment}
, key) {
//
assets = append(assets, assetValue)
//
}
//
}
//} else {
if
indexNum
,
err
:=
strconv
.
Atoi
(
key
);
err
==
nil
{
if
indexNum
>
0
&&
indexNum
<=
len
(
h
.
searchResult
)
{
assets
=
[]
model
.
Asset
{
h
.
searchResult
[
indexNum
-
1
]}
return
}
}
for
_
,
assetValue
:=
range
h
.
searchResult
{
contents
:=
[]
string
{
assetValue
.
Ip
,
assetValue
.
Hostname
,
assetValue
.
Comment
}
if
isSubstring
(
contents
,
key
)
{
assets
=
append
(
assets
,
assetValue
)
}
}
// assetsData, _ := Cached.Load(h.user.ID)
// for _, assetValue := range assetsData.([]model.Asset) {
// if isSubstring([]string{assetValue.Ip, assetValue.Hostname, assetValue.Comment}, key) {
// assets = append(assets, assetValue)
// }
// }
//}
return
assets
}
func
(
h
*
interactiveHandler
)
searchNodeAssets
(
num
int
)
(
assets
[]
model
.
Asset
)
{
//var assetNodesData []model.Node
//if assetNodes, ok := h.assetData.Load(AssetNodesMapKey); ok {
// assetNodesData = assetNodes.([]model.Node)
// if num > len(assetNodesData) || num == 0 {
// return assets
// }
// return assetNodesData[num-1].AssetsGranted
//}
return
assets
if
num
>
len
(
h
.
nodes
)
||
num
==
0
{
return
assets
}
return
h
.
nodes
[
num
-
1
]
.
AssetsGranted
}
func
(
h
*
interactiveHandler
)
Proxy
(
ctx
context
.
Context
)
{
h
.
assetSelect
=
&
model
.
Asset
{
Hostname
:
"centos"
,
Port
:
22
,
Ip
:
"192.168.244.185"
,
Protocol
:
"ssh"
}
h
.
systemUserSelect
=
&
model
.
SystemUser
{
Id
:
"5dd8b5a0-8cdb-4857-8629-faf811c525e1"
,
Name
:
"web"
,
Username
:
"root"
,
Password
:
"redhat"
,
Protocol
:
"telnet"
}
//
h.assetSelect = &model.Asset{Hostname: "centos", Port: 22, Ip: "192.168.244.185", Protocol: "ssh"}
//
h.systemUserSelect = &model.SystemUser{Id: "5dd8b5a0-8cdb-4857-8629-faf811c525e1", Name: "web", Username: "root", Password: "redhat", Protocol: "telnet"}
userConn
:=
&
proxy
.
UserSSHConnection
{
Session
:
h
.
sess
}
p
:=
proxy
.
ProxyServer
{
...
...
@@ -332,6 +302,63 @@ func (h *interactiveHandler) Proxy(ctx context.Context) {
p
.
Proxy
()
}
func
ConstructAssetNodeTree
(
assetNodes
[]
model
.
Node
)
treeprint
.
Tree
{
model
.
SortAssetNodesByKey
(
assetNodes
)
var
treeMap
=
map
[
string
]
treeprint
.
Tree
{}
tree
:=
treeprint
.
New
()
for
i
:=
0
;
i
<
len
(
assetNodes
);
i
++
{
r
:=
strings
.
LastIndex
(
assetNodes
[
i
]
.
Key
,
":"
)
if
r
<
0
{
subtree
:=
tree
.
AddBranch
(
fmt
.
Sprintf
(
"%s.%s(%s)"
,
strconv
.
Itoa
(
i
+
1
),
assetNodes
[
i
]
.
Name
,
strconv
.
Itoa
(
assetNodes
[
i
]
.
AssetsAmount
)))
treeMap
[
assetNodes
[
i
]
.
Key
]
=
subtree
continue
}
if
subtree
,
ok
:=
treeMap
[
assetNodes
[
i
]
.
Key
[
:
r
]];
ok
{
nodeTree
:=
subtree
.
AddBranch
(
fmt
.
Sprintf
(
"%s.%s(%s)"
,
strconv
.
Itoa
(
i
+
1
),
assetNodes
[
i
]
.
Name
,
strconv
.
Itoa
(
assetNodes
[
i
]
.
AssetsAmount
)))
treeMap
[
assetNodes
[
i
]
.
Key
]
=
nodeTree
}
}
return
tree
}
func
isSubstring
(
sArray
[]
string
,
substr
string
)
bool
{
for
_
,
s
:=
range
sArray
{
if
strings
.
Contains
(
s
,
substr
)
{
return
true
}
}
return
false
}
//func (h *InteractiveHandler) JoinShareRoom(roomID string) {
//sshConn := userhome.NewSSHConn(h.sess)
//ctx, cancelFuc := context.WithCancel(h.sess.Context())
//
//_, winCh, _ := h.sess.Pty()
//go func() {
// for {
// select {
// case <-ctx.Done():
// return
// case win, ok := <-winCh:
// if !ok {
// return
// }
// fmt.Println("join term change:", win)
// }
// }
//}()
//proxybak.Manager.JoinShareRoom(roomID, sshConn)
//logger.Info("exit room id:", roomID)
//cancelFuc()
//
//}
// /*
// 1. 创建SSHConn,符合core.Conn接口
// 2. 创建一个session Home
...
...
@@ -401,35 +428,3 @@ func (h *interactiveHandler) Proxy(ctx context.Context) {
// return err
//}
//
//func isSubstring(sArray []string, substr string) bool {
// for _, s := range sArray {
// if strings.Contains(s, substr) {
// return true
// }
// }
// return false
//}
//
func
ConstructAssetNodeTree
(
assetNodes
[]
model
.
Node
)
treeprint
.
Tree
{
model
.
SortAssetNodesByKey
(
assetNodes
)
var
treeMap
=
map
[
string
]
treeprint
.
Tree
{}
tree
:=
treeprint
.
New
()
for
i
:=
0
;
i
<
len
(
assetNodes
);
i
++
{
r
:=
strings
.
LastIndex
(
assetNodes
[
i
]
.
Key
,
":"
)
if
r
<
0
{
subtree
:=
tree
.
AddBranch
(
fmt
.
Sprintf
(
"%s.%s(%s)"
,
strconv
.
Itoa
(
i
+
1
),
assetNodes
[
i
]
.
Name
,
strconv
.
Itoa
(
assetNodes
[
i
]
.
AssetsAmount
)))
treeMap
[
assetNodes
[
i
]
.
Key
]
=
subtree
continue
}
if
subtree
,
ok
:=
treeMap
[
assetNodes
[
i
]
.
Key
[
:
r
]];
ok
{
nodeTree
:=
subtree
.
AddBranch
(
fmt
.
Sprintf
(
"%s.%s(%s)"
,
strconv
.
Itoa
(
i
+
1
),
assetNodes
[
i
]
.
Name
,
strconv
.
Itoa
(
assetNodes
[
i
]
.
AssetsAmount
)))
treeMap
[
assetNodes
[
i
]
.
Key
]
=
nodeTree
}
}
return
tree
}
pkg/handler/sftp.go
View file @
2881419d
...
...
@@ -27,6 +27,6 @@ func SftpHandler(sess ssh.Session) {
server
.
Close
()
logger
.
Info
(
"sftp client exited session."
)
}
else
if
err
!=
nil
{
logger
.
Error
f
(
"sftp server completed with error:"
,
err
)
logger
.
Error
(
"sftp server completed with error:"
,
err
)
}
}
pkg/proxy/proxy.go
View file @
2881419d
...
...
@@ -126,7 +126,7 @@ func (p *ProxyServer) Proxy() {
}
srvConn
,
err
:=
p
.
getServerConn
()
if
err
!=
nil
{
msg
:=
fmt
.
Sprintf
(
"Connect asset %s error: %s
\n
"
,
p
.
Asset
.
Hostname
,
err
)
msg
:=
fmt
.
Sprintf
(
"Connect asset %s error: %s
\n
\r
"
,
p
.
Asset
.
Hostname
,
err
)
utils
.
IgnoreErrWriteString
(
p
.
UserConn
,
msg
)
logger
.
Errorf
(
msg
)
return
...
...
pkg/proxy/srvconn.go
View file @
2881419d
...
...
@@ -158,7 +158,6 @@ func (sc *ServerSSHConnection) invokeShell(h, w int, term string) (err error) {
func
(
sc
*
ServerSSHConnection
)
Connect
(
h
,
w
int
,
term
string
)
(
err
error
)
{
_
,
err
=
sc
.
connect
()
fmt
.
Println
(
"error"
)
if
err
!=
nil
{
return
}
...
...
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