Skip to content

Commit

Permalink
work on iam users
Browse files Browse the repository at this point in the history
  • Loading branch information
aanamshaikh committed Feb 8, 2023
1 parent cede8ea commit 7501108
Show file tree
Hide file tree
Showing 8 changed files with 131 additions and 2 deletions.
18 changes: 16 additions & 2 deletions internal/aws/iam.go
Expand Up @@ -2,19 +2,33 @@ package aws

import (
"fmt"
"time"

"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/iam"
)

func GetUsers(sess session.Session) []*iam.User {
func GetUsers(sess session.Session) []IAMUSerResp {
iamSrv := iam.New(&sess)
result, err := iamSrv.ListUsers(&iam.ListUsersInput{})
if err != nil {
fmt.Println("Error in fetching Iam Users: ", " err: ", err)
return nil
}
return result.Users
var users []IAMUSerResp
for _, u := range result.Users {
launchTime := u.CreateDate
loc, _ := time.LoadLocation("Asia/Kolkata")
IST := launchTime.In(loc)
user := &IAMUSerResp{
UserId: *u.UserId,
UserName: *u.UserName,
ARN: *u.Arn,
CreationTime: IST.Format("Mon Jan _2 15:04:05 2006"),
}
users = append(users, *user)
}
return users
}

func GetUserGroups(sess session.Session) []*iam.Group {
Expand Down
7 changes: 7 additions & 0 deletions internal/aws/types.go
Expand Up @@ -25,3 +25,10 @@ type BucketInfo struct {
EncryptionConfiguration *s3.ServerSideEncryptionConfiguration
LifeCycleRules []*s3.LifecycleRule
}

type IAMUSerResp struct {
UserId string
UserName string
ARN string
CreationTime string
}
1 change: 1 addition & 0 deletions internal/config/alias.go
Expand Up @@ -131,6 +131,7 @@ func (a *Aliases) loadDefaultAliases() {
a.declare("ec2", "Ec2", "EC2")
a.declare("s3", "S3")
a.declare("sg", "SG")
a.declare("iam:u","IAM:U")

a.declare("help", "h", "?")
a.declare("quit", "q", "q!", "Q")
Expand Down
37 changes: 37 additions & 0 deletions internal/dao/iamu.go
@@ -0,0 +1,37 @@
package dao

import (
"context"
"fmt"

"github.com/aws/aws-sdk-go/aws/session"
"github.com/one2nc/cloud-lens/internal"
"github.com/one2nc/cloud-lens/internal/aws"
"github.com/rs/zerolog/log"
)

type IAMU struct {
Accessor
ctx context.Context
}

func (iamu *IAMU) Init(ctx context.Context) {
iamu.ctx = ctx
}

func (iamu *IAMU) List(ctx context.Context) ([]Object, error) {
sess, ok := ctx.Value(internal.KeySession).(*session.Session)
if !ok {
log.Err(fmt.Errorf("conversion err: Expected session.session but got %v", sess))
}
usr := aws.GetUsers(*sess)
objs := make([]Object, len(usr))
for i, obj := range usr {
objs[i] = obj
}
return objs, nil
}

func (iamu *IAMU) Get(ctx context.Context, path string) (Object, error) {
return nil, nil
}
4 changes: 4 additions & 0 deletions internal/model/registry.go
Expand Up @@ -22,4 +22,8 @@ var Registry = map[string]ResourceMeta{
DAO: &dao.BObj{},
Renderer: &render.BObj{},
},
"iam:u": {
DAO: &dao.IAMU{},
Renderer: &render.IAMU{},
},
}
36 changes: 36 additions & 0 deletions internal/render/iamu.go
@@ -0,0 +1,36 @@
package render

import (
"fmt"

"github.com/derailed/tview"
"github.com/one2nc/cloud-lens/internal/aws"
)

type IAMU struct {
}

func (iamu IAMU) Header() Header {
return Header{
HeaderColumn{Name: "User-Id", SortIndicatorIdx: 6, Align: tview.AlignLeft, Hide: false, Wide: false, MX: false, Time: false},
HeaderColumn{Name: "User-Name", SortIndicatorIdx: 6, Align: tview.AlignLeft, Hide: false, Wide: false, MX: false, Time: false},
HeaderColumn{Name: "ARN", SortIndicatorIdx: -1, Align: tview.AlignLeft, Hide: false, Wide: false, MX: false, Time: false},
HeaderColumn{Name: "Created-date", SortIndicatorIdx: -1, Align: tview.AlignLeft, Hide: false, Wide: false, MX: false, Time: true},
}
}

func (iamu IAMU) Render(o interface{}, ns string, row *Row) error {
iamuResp, ok := o.(aws.IAMUSerResp)
if !ok {
return fmt.Errorf("Expected S3Resp, but got %T", o)
}

row.ID = ns
row.Fields = Fields{
iamuResp.UserId,
iamuResp.UserName,
iamuResp.ARN,
iamuResp.CreationTime,
}
return nil
}
27 changes: 27 additions & 0 deletions internal/view/iamu.go
@@ -0,0 +1,27 @@
package view

import (
"github.com/gdamore/tcell/v2"
"github.com/one2nc/cloud-lens/internal/ui"
)

type IAMU struct {
ResourceViewer
}

// NewSG returns a new viewer.
func NewIAMU(resource string) ResourceViewer {
var iamu IAMU
iamu.ResourceViewer = NewBrowser(resource)
iamu.AddBindKeysFn(iamu.bindKeys)
return &iamu
}

func (iamu IAMU) bindKeys(aa ui.KeyActions) {
aa.Add(ui.KeyActions{
// ui.KeyShiftI: ui.NewKeyAction("Sort ", iamu.GetTable().SortColCmd("Group-Id", true), true),
// ui.KeyShiftN: ui.NewKeyAction("Sort Group-Name", iamu.GetTable().SortColCmd("Group-Name", true), true),
tcell.KeyEscape: ui.NewKeyAction("Back", iamu.App().PrevCmd, true),
})
}

3 changes: 3 additions & 0 deletions internal/view/registrar.go
Expand Up @@ -16,4 +16,7 @@ func coreViewers(vv MetaViewers) {
vv["sg"] = MetaViewer{
viewerFn: NewSG,
}
vv["iam:u"] = MetaViewer{
viewerFn: NewIAMU,
}
}

0 comments on commit 7501108

Please sign in to comment.