Function bodies 796 total
ListCWAlarms method · go · L49-L69 (21 LOC)internal/aws/alarms.go
func (c *Client) ListCWAlarms(ctx context.Context, stateFilter string) ([]CWAlarm, error) {
input := &cloudwatch.DescribeAlarmsInput{
AlarmTypes: []cwtypes.AlarmType{cwtypes.AlarmTypeMetricAlarm},
}
if stateFilter != "" {
input.StateValue = cwtypes.StateValue(stateFilter)
}
var alarms []CWAlarm
paginator := cloudwatch.NewDescribeAlarmsPaginator(c.CW, input)
for paginator.HasMorePages() {
page, err := paginator.NextPage(ctx)
if err != nil {
return nil, err
}
for _, a := range page.MetricAlarms {
alarms = append(alarms, cwAlarmFromMetric(a))
}
}
return alarms, nil
}DescribeCWAlarm method · go · L72-L125 (54 LOC)internal/aws/alarms.go
func (c *Client) DescribeCWAlarm(ctx context.Context, alarmName string) (*CWAlarmDetail, error) {
out, err := c.CW.DescribeAlarms(ctx, &cloudwatch.DescribeAlarmsInput{
AlarmNames: []string{alarmName},
AlarmTypes: []cwtypes.AlarmType{cwtypes.AlarmTypeMetricAlarm},
})
if err != nil {
return nil, err
}
if len(out.MetricAlarms) == 0 {
return nil, nil
}
a := out.MetricAlarms[0]
detail := &CWAlarmDetail{
CWAlarm: cwAlarmFromMetric(a),
Description: derefStrAws(a.AlarmDescription),
Threshold: derefFloat64(a.Threshold),
EvalPeriods: int(derefInt32(a.EvaluationPeriods)),
Period: int(derefInt32(a.Period)),
TreatMissing: derefStrAws(a.TreatMissingData),
}
if a.ComparisonOperator != "" {
detail.ComparisonOp = string(a.ComparisonOperator)
}
if a.Statistic != "" {
detail.Statistic = string(a.Statistic)
}
detail.Dimensions = make(map[string]string)
for _, d := range a.Dimensions {
if d.Name != nil && d.Value != nil {
detail.Dimensions[*d.Name] = EnableAlarmActions method · go · L128-L133 (6 LOC)internal/aws/alarms.go
func (c *Client) EnableAlarmActions(ctx context.Context, alarmName string) error {
_, err := c.CW.EnableAlarmActions(ctx, &cloudwatch.EnableAlarmActionsInput{
AlarmNames: []string{alarmName},
})
return err
}DisableAlarmActions method · go · L136-L141 (6 LOC)internal/aws/alarms.go
func (c *Client) DisableAlarmActions(ctx context.Context, alarmName string) error {
_, err := c.CW.DisableAlarmActions(ctx, &cloudwatch.DisableAlarmActionsInput{
AlarmNames: []string{alarmName},
})
return err
}SetAlarmState method · go · L144-L151 (8 LOC)internal/aws/alarms.go
func (c *Client) SetAlarmState(ctx context.Context, alarmName, state, reason string) error {
_, err := c.CW.SetAlarmState(ctx, &cloudwatch.SetAlarmStateInput{
AlarmName: &alarmName,
StateValue: cwtypes.StateValue(state),
StateReason: &reason,
})
return err
}cwAlarmFromMetric function · go · L153-L164 (12 LOC)internal/aws/alarms.go
func cwAlarmFromMetric(a cwtypes.MetricAlarm) CWAlarm {
return CWAlarm{
Name: derefStrAws(a.AlarmName),
State: string(a.StateValue),
StateReason: derefStrAws(a.StateReason),
StateUpdatedAt: derefTimeAws(a.StateUpdatedTimestamp),
MetricName: derefStrAws(a.MetricName),
Namespace: derefStrAws(a.Namespace),
ActionsEnabled: a.ActionsEnabled != nil && *a.ActionsEnabled,
AlarmARN: derefStrAws(a.AlarmArn),
}
}derefFloat64 function · go · L166-L171 (6 LOC)internal/aws/alarms.go
func derefFloat64(p *float64) float64 {
if p != nil {
return *p
}
return 0
}Repobility (the analyzer behind this table) · https://repobility.com
derefInt32 function · go · L173-L178 (6 LOC)internal/aws/alarms.go
func derefInt32(p *int32) int32 {
if p != nil {
return *p
}
return 0
}NewClient function · go · L42-L74 (33 LOC)internal/aws/client.go
func NewClient(ctx context.Context, region, profile string) (*Client, error) {
var opts []func(*config.LoadOptions) error
if region != "" {
opts = append(opts, config.WithRegion(region))
}
if profile != "" {
opts = append(opts, config.WithSharedConfigProfile(profile))
}
cfg, err := config.LoadDefaultConfig(ctx, opts...)
if err != nil {
return nil, err
}
return &Client{
ECS: ecs.NewFromConfig(cfg),
Logs: cloudwatchlogs.NewFromConfig(cfg),
CW: cloudwatch.NewFromConfig(cfg),
SSM: ssm.NewFromConfig(cfg),
SM: secretsmanager.NewFromConfig(cfg),
S3: s3.NewFromConfig(cfg),
Lambda: lambda.NewFromConfig(cfg),
DynamoDB: dynamodb.NewFromConfig(cfg),
SQS: sqs.NewFromConfig(cfg),
CodeBuild: codebuild.NewFromConfig(cfg),
EC2: ec2.NewFromConfig(cfg),
ECR: ecr.NewFromConfig(cfg),
Route53: route53.NewFromConfig(cfg),
cfg: cfg,
region: cfg.Region,
}, nil
}Region method · go · L76-L78 (3 LOC)internal/aws/client.go
func (c *Client) Region() string {
return c.region
}SwitchRegion method · go · L81-L103 (23 LOC)internal/aws/client.go
func (c *Client) SwitchRegion(ctx context.Context, region string) error {
cfg, err := config.LoadDefaultConfig(ctx, config.WithRegion(region))
if err != nil {
return err
}
c.ECS = ecs.NewFromConfig(cfg)
c.Logs = cloudwatchlogs.NewFromConfig(cfg)
c.CW = cloudwatch.NewFromConfig(cfg)
c.SSM = ssm.NewFromConfig(cfg)
c.SM = secretsmanager.NewFromConfig(cfg)
c.S3 = s3.NewFromConfig(cfg)
c.Lambda = lambda.NewFromConfig(cfg)
c.DynamoDB = dynamodb.NewFromConfig(cfg)
c.SQS = sqs.NewFromConfig(cfg)
c.CodeBuild = codebuild.NewFromConfig(cfg)
c.EC2 = ec2.NewFromConfig(cfg)
c.ECR = ecr.NewFromConfig(cfg)
c.Route53 = route53.NewFromConfig(cfg)
c.cfg = cfg
c.region = region
return nil
}ListCBProjects method · go · L68-L112 (45 LOC)internal/aws/codebuild.go
func (c *Client) ListCBProjects(ctx context.Context) ([]CBProject, error) {
var projectNames []string
paginator := codebuild.NewListProjectsPaginator(c.CodeBuild, &codebuild.ListProjectsInput{
SortBy: cbtypes.ProjectSortByTypeLastModifiedTime,
SortOrder: cbtypes.SortOrderTypeDescending,
})
for paginator.HasMorePages() {
page, err := paginator.NextPage(ctx)
if err != nil {
return nil, err
}
projectNames = append(projectNames, page.Projects...)
}
if len(projectNames) == 0 {
return nil, nil
}
// Fetch project details in batches of 100
var projects []CBProject
for i := 0; i < len(projectNames); i += 100 {
end := min(i+100, len(projectNames))
batch, err := c.CodeBuild.BatchGetProjects(ctx, &codebuild.BatchGetProjectsInput{
Names: projectNames[i:end],
})
if err != nil {
return nil, err
}
for _, p := range batch.Projects {
proj := CBProject{
Name: derefStrAws(p.Name),
Description: derefStrAws(p.Description),
}
if p.SourListCBBuilds method · go · L115-L138 (24 LOC)internal/aws/codebuild.go
func (c *Client) ListCBBuilds(ctx context.Context, projectName string, maxBuilds int) ([]CBBuild, error) {
var buildIDs []string
input := &codebuild.ListBuildsForProjectInput{
ProjectName: &projectName,
SortOrder: cbtypes.SortOrderTypeDescending,
}
// Collect up to maxBuilds IDs
paginator := codebuild.NewListBuildsForProjectPaginator(c.CodeBuild, input)
for paginator.HasMorePages() && len(buildIDs) < maxBuilds {
page, err := paginator.NextPage(ctx)
if err != nil {
return nil, err
}
buildIDs = append(buildIDs, page.Ids...)
}
if len(buildIDs) > maxBuilds {
buildIDs = buildIDs[:maxBuilds]
}
if len(buildIDs) == 0 {
return nil, nil
}
return c.batchGetBuilds(ctx, buildIDs)
}GetCBBuildDetail method · go · L141-L201 (61 LOC)internal/aws/codebuild.go
func (c *Client) GetCBBuildDetail(ctx context.Context, buildID string) (*CBBuildDetail, error) {
out, err := c.CodeBuild.BatchGetBuilds(ctx, &codebuild.BatchGetBuildsInput{
Ids: []string{buildID},
})
if err != nil {
return nil, err
}
if len(out.Builds) == 0 {
return nil, nil
}
b := out.Builds[0]
detail := &CBBuildDetail{
CBBuild: buildFromSDK(b),
ProjectName: derefStrAws(b.ProjectName),
Arn: derefStrAws(b.Arn),
}
if b.Source != nil {
detail.Source = CBSource{
Type: string(b.Source.Type),
Location: derefStrAws(b.Source.Location),
}
}
if b.SourceVersion != nil {
detail.Source.Version = *b.SourceVersion
}
if b.Logs != nil {
detail.LogGroupName = derefStrAws(b.Logs.GroupName)
detail.LogStreamName = derefStrAws(b.Logs.StreamName)
}
for _, p := range b.Phases {
phase := CBBuildPhase{
Name: string(p.PhaseType),
Status: string(p.PhaseStatus),
}
if p.DurationInSeconds != nil {
phase.Duration = time.Duration(*p.DuraStartCBBuild method · go · L204-L220 (17 LOC)internal/aws/codebuild.go
func (c *Client) StartCBBuild(ctx context.Context, projectName string, sourceVersion string) (*CBBuild, error) {
input := &codebuild.StartBuildInput{
ProjectName: &projectName,
}
if sourceVersion != "" {
input.SourceVersion = &sourceVersion
}
out, err := c.CodeBuild.StartBuild(ctx, input)
if err != nil {
return nil, err
}
if out.Build == nil {
return nil, nil
}
build := buildFromSDK(*out.Build)
return &build, nil
}Repobility's GitHub App fixes findings like these · https://github.com/apps/repobility-bot
StopCBBuild method · go · L223-L228 (6 LOC)internal/aws/codebuild.go
func (c *Client) StopCBBuild(ctx context.Context, buildID string) error {
_, err := c.CodeBuild.StopBuild(ctx, &codebuild.StopBuildInput{
Id: &buildID,
})
return err
}batchGetBuilds method · go · L230-L248 (19 LOC)internal/aws/codebuild.go
func (c *Client) batchGetBuilds(ctx context.Context, ids []string) ([]CBBuild, error) {
var builds []CBBuild
for i := 0; i < len(ids); i += 100 {
end := min(i+100, len(ids))
out, err := c.CodeBuild.BatchGetBuilds(ctx, &codebuild.BatchGetBuildsInput{
Ids: ids[i:end],
})
if err != nil {
return nil, err
}
for _, b := range out.Builds {
builds = append(builds, buildFromSDK(b))
}
}
sort.Slice(builds, func(i, j int) bool {
return builds[i].StartTime.After(builds[j].StartTime)
})
return builds, nil
}buildFromSDK function · go · L250-L269 (20 LOC)internal/aws/codebuild.go
func buildFromSDK(b cbtypes.Build) CBBuild {
build := CBBuild{
ID: derefStrAws(b.Id),
Status: string(b.BuildStatus),
Initiator: derefStrAws(b.Initiator),
SourceVersion: derefStrAws(b.SourceVersion),
CurrentPhase: derefStrAws(b.CurrentPhase),
}
if b.BuildNumber != nil {
build.BuildNumber = *b.BuildNumber
}
if b.StartTime != nil {
build.StartTime = *b.StartTime
}
if b.EndTime != nil {
build.EndTime = *b.EndTime
build.Duration = build.EndTime.Sub(build.StartTime)
}
return build
}ListDynamoTables method · go · L40-L63 (24 LOC)internal/aws/dynamodb.go
func (c *Client) ListDynamoTables(ctx context.Context, filter string) ([]string, error) {
var tables []string
var lastTable *string
for {
input := &dynamodb.ListTablesInput{
ExclusiveStartTableName: lastTable,
}
out, err := c.DynamoDB.ListTables(ctx, input)
if err != nil {
return nil, err
}
for _, t := range out.TableNames {
if filter == "" || strings.Contains(strings.ToLower(t), strings.ToLower(filter)) {
tables = append(tables, t)
}
}
if out.LastEvaluatedTableName == nil {
break
}
lastTable = out.LastEvaluatedTableName
}
return tables, nil
}DescribeDynamoTable method · go · L66-L113 (48 LOC)internal/aws/dynamodb.go
func (c *Client) DescribeDynamoTable(ctx context.Context, tableName string) (*DynamoTable, error) {
out, err := c.DynamoDB.DescribeTable(ctx, &dynamodb.DescribeTableInput{
TableName: &tableName,
})
if err != nil {
return nil, err
}
td := out.Table
table := &DynamoTable{
Name: derefStrAws(td.TableName),
Status: string(td.TableStatus),
}
if td.ItemCount != nil {
table.ItemCount = *td.ItemCount
}
if td.TableSizeBytes != nil {
table.SizeBytes = *td.TableSizeBytes
}
if td.BillingModeSummary != nil {
table.BillingMode = string(td.BillingModeSummary.BillingMode)
}
// Key schema
attrTypes := map[string]string{}
for _, ad := range td.AttributeDefinitions {
if ad.AttributeName != nil {
attrTypes[*ad.AttributeName] = string(ad.AttributeType)
}
}
for _, ks := range td.KeySchema {
if ks.AttributeName != nil {
table.KeySchema = append(table.KeySchema, DynamoKeyElement{
Name: *ks.AttributeName,
Type: string(ks.KeyType),
AttrType: attScanDynamoTable method · go · L116-L148 (33 LOC)internal/aws/dynamodb.go
func (c *Client) ScanDynamoTable(ctx context.Context, tableName string, limit int, startKey map[string]dbtypes.AttributeValue) (*DynamoScanResult, error) {
input := &dynamodb.ScanInput{
TableName: &tableName,
}
if limit > 0 {
l := int32(limit)
input.Limit = &l
}
if len(startKey) > 0 {
input.ExclusiveStartKey = startKey
}
out, err := c.DynamoDB.Scan(ctx, input)
if err != nil {
return nil, err
}
items := make([]DynamoItem, 0, len(out.Items))
for _, item := range out.Items {
var m DynamoItem
if err := attributevalue.UnmarshalMap(item, &m); err != nil {
continue
}
items = append(items, m)
}
return &DynamoScanResult{
Items: items,
Count: int(out.Count),
ScannedCount: int(out.ScannedCount),
LastEvaluatedKey: out.LastEvaluatedKey,
}, nil
}ScanDynamoTableWithFilter method · go · L151-L191 (41 LOC)internal/aws/dynamodb.go
func (c *Client) ScanDynamoTableWithFilter(ctx context.Context, tableName, attrName, operator, value string, limit int, startKey map[string]dbtypes.AttributeValue) (*DynamoScanResult, error) {
filterExpr := fmt.Sprintf("#attr %s :val", operator)
input := &dynamodb.ScanInput{
TableName: &tableName,
FilterExpression: &filterExpr,
ExpressionAttributeNames: map[string]string{
"#attr": attrName,
},
ExpressionAttributeValues: map[string]dbtypes.AttributeValue{
":val": &dbtypes.AttributeValueMemberS{Value: value},
},
}
if limit > 0 {
l := int32(limit)
input.Limit = &l
}
if len(startKey) > 0 {
input.ExclusiveStartKey = startKey
}
out, err := c.DynamoDB.Scan(ctx, input)
if err != nil {
return nil, err
}
items := make([]DynamoItem, 0, len(out.Items))
for _, item := range out.Items {
var m DynamoItem
if err := attributevalue.UnmarshalMap(item, &m); err != nil {
continue
}
items = append(items, m)
}
return &DynamoScanResult{
Items: ScanDynamoTableWithFuncFilter method · go · L194-L234 (41 LOC)internal/aws/dynamodb.go
func (c *Client) ScanDynamoTableWithFuncFilter(ctx context.Context, tableName, attrName, funcName, value string, limit int, startKey map[string]dbtypes.AttributeValue) (*DynamoScanResult, error) {
filterExpr := fmt.Sprintf("%s(#attr, :val)", funcName)
input := &dynamodb.ScanInput{
TableName: &tableName,
FilterExpression: &filterExpr,
ExpressionAttributeNames: map[string]string{
"#attr": attrName,
},
ExpressionAttributeValues: map[string]dbtypes.AttributeValue{
":val": &dbtypes.AttributeValueMemberS{Value: value},
},
}
if limit > 0 {
l := int32(limit)
input.Limit = &l
}
if len(startKey) > 0 {
input.ExclusiveStartKey = startKey
}
out, err := c.DynamoDB.Scan(ctx, input)
if err != nil {
return nil, err
}
items := make([]DynamoItem, 0, len(out.Items))
for _, item := range out.Items {
var m DynamoItem
if err := attributevalue.UnmarshalMap(item, &m); err != nil {
continue
}
items = append(items, m)
}
return &DynamoScanResult{
ItemRepobility · code-quality intelligence · https://repobility.com
ExecutePartiQL method · go · L237-L254 (18 LOC)internal/aws/dynamodb.go
func (c *Client) ExecutePartiQL(ctx context.Context, statement string) ([]DynamoItem, error) {
out, err := c.DynamoDB.ExecuteStatement(ctx, &dynamodb.ExecuteStatementInput{
Statement: &statement,
})
if err != nil {
return nil, err
}
items := make([]DynamoItem, 0, len(out.Items))
for _, item := range out.Items {
var m DynamoItem
if err := attributevalue.UnmarshalMap(item, &m); err != nil {
continue
}
items = append(items, m)
}
return items, nil
}GetDynamoItem method · go · L257-L273 (17 LOC)internal/aws/dynamodb.go
func (c *Client) GetDynamoItem(ctx context.Context, tableName string, keyAV map[string]dbtypes.AttributeValue) (*DynamoItem, error) {
out, err := c.DynamoDB.GetItem(ctx, &dynamodb.GetItemInput{
TableName: &tableName,
Key: keyAV,
})
if err != nil {
return nil, err
}
if out.Item == nil {
return nil, nil
}
var item DynamoItem
if err := attributevalue.UnmarshalMap(out.Item, &item); err != nil {
return nil, err
}
return &item, nil
}UpdateDynamoField method · go · L276-L295 (20 LOC)internal/aws/dynamodb.go
func (c *Client) UpdateDynamoField(ctx context.Context, tableName string, keyItem map[string]dbtypes.AttributeValue, attrName, newValue string) error {
// Try to detect the value type and build the appropriate AttributeValue
av := inferAttributeValue(newValue)
expr := "SET #attr = :val"
input := &dynamodb.UpdateItemInput{
TableName: &tableName,
Key: keyItem,
UpdateExpression: &expr,
ExpressionAttributeNames: map[string]string{
"#attr": attrName,
},
ExpressionAttributeValues: map[string]dbtypes.AttributeValue{
":val": av,
},
}
_, err := c.DynamoDB.UpdateItem(ctx, input)
return err
}PutDynamoItem method · go · L298-L308 (11 LOC)internal/aws/dynamodb.go
func (c *Client) PutDynamoItem(ctx context.Context, tableName string, item DynamoItem) error {
av, err := attributevalue.MarshalMap(item)
if err != nil {
return fmt.Errorf("marshal item: %w", err)
}
_, err = c.DynamoDB.PutItem(ctx, &dynamodb.PutItemInput{
TableName: &tableName,
Item: av,
})
return err
}BuildKeyFromItem function · go · L311-L321 (11 LOC)internal/aws/dynamodb.go
func BuildKeyFromItem(item DynamoItem, keyNames []string) (map[string]dbtypes.AttributeValue, error) {
keyItem := DynamoItem{}
for _, k := range keyNames {
v, ok := item[k]
if !ok {
return nil, fmt.Errorf("key attribute %q not found in item", k)
}
keyItem[k] = v
}
return attributevalue.MarshalMap(keyItem)
}ParseDynamoItemFromJSON function · go · L324-L330 (7 LOC)internal/aws/dynamodb.go
func ParseDynamoItemFromJSON(jsonStr string) (DynamoItem, error) {
var item DynamoItem
if err := json.Unmarshal([]byte(jsonStr), &item); err != nil {
return nil, fmt.Errorf("invalid JSON: %w", err)
}
return item, nil
}inferAttributeValue function · go · L334-L377 (44 LOC)internal/aws/dynamodb.go
func inferAttributeValue(s string) dbtypes.AttributeValue {
// Try JSON object/array
s = strings.TrimSpace(s)
if (strings.HasPrefix(s, "{") && strings.HasSuffix(s, "}")) ||
(strings.HasPrefix(s, "[") && strings.HasSuffix(s, "]")) {
var m any
if err := json.Unmarshal([]byte(s), &m); err == nil {
if av, err := attributevalue.Marshal(m); err == nil {
return av
}
}
}
// Try boolean
if s == "true" {
return &dbtypes.AttributeValueMemberBOOL{Value: true}
}
if s == "false" {
return &dbtypes.AttributeValueMemberBOOL{Value: false}
}
// Try number (integer or float)
isNum := true
hasDot := false
for i, c := range s {
if c == '-' && i == 0 {
continue
}
if c == '.' && !hasDot {
hasDot = true
continue
}
if c < '0' || c > '9' {
isNum = false
break
}
}
if isNum && len(s) > 0 && s != "-" {
return &dbtypes.AttributeValueMemberN{Value: s}
}
// Default to string
return &dbtypes.AttributeValueMemberS{Value: s}
}DynamoItemToJSON function · go · L380-L386 (7 LOC)internal/aws/dynamodb.go
func DynamoItemToJSON(item DynamoItem) string {
b, err := json.MarshalIndent(item, "", " ")
if err != nil {
return fmt.Sprintf("%v", item)
}
return string(b)
}Repobility — the code-quality scanner for AI-generated software · https://repobility.com
ListEC2Instances method · go · L73-L106 (34 LOC)internal/aws/ec2.go
func (c *Client) ListEC2Instances(ctx context.Context, filter string) ([]EC2Instance, error) {
input := &ec2.DescribeInstancesInput{}
var instances []EC2Instance
lf := strings.ToLower(filter)
paginator := ec2.NewDescribeInstancesPaginator(c.EC2, input)
for paginator.HasMorePages() {
page, err := paginator.NextPage(ctx)
if err != nil {
return nil, err
}
for _, res := range page.Reservations {
for _, inst := range res.Instances {
i := instanceFromSDK(inst)
if lf != "" && !strings.Contains(strings.ToLower(i.Name), lf) &&
!strings.Contains(strings.ToLower(i.InstanceID), lf) {
continue
}
instances = append(instances, i)
}
}
}
// Sort: running first, then by name
sort.Slice(instances, func(i, j int) bool {
if instances[i].State != instances[j].State {
return stateOrder(instances[i].State) < stateOrder(instances[j].State)
}
return instances[i].Name < instances[j].Name
})
return instances, nil
}DescribeEC2Instance method · go · L109-L199 (91 LOC)internal/aws/ec2.go
func (c *Client) DescribeEC2Instance(ctx context.Context, instanceID string) (*EC2InstanceDetail, error) {
out, err := c.EC2.DescribeInstances(ctx, &ec2.DescribeInstancesInput{
InstanceIds: []string{instanceID},
})
if err != nil {
return nil, err
}
if len(out.Reservations) == 0 || len(out.Reservations[0].Instances) == 0 {
return nil, fmt.Errorf("instance %s not found", instanceID)
}
inst := out.Reservations[0].Instances[0]
detail := &EC2InstanceDetail{
EC2Instance: instanceFromSDK(inst),
}
detail.Architecture = string(inst.Architecture)
detail.RootDeviceType = string(inst.RootDeviceType)
detail.RootDeviceName = derefStrAws(inst.RootDeviceName)
if inst.EbsOptimized != nil {
detail.EBSOptimized = *inst.EbsOptimized
}
if inst.Monitoring != nil {
detail.Monitoring = string(inst.Monitoring.State)
}
// Fetch volumes
for _, bdm := range inst.BlockDeviceMappings {
vol := EC2Volume{
DeviceName: derefStrAws(bdm.DeviceName),
}
if bdm.Ebs != nil {
vol.VoGetConsoleOutput method · go · L202-L213 (12 LOC)internal/aws/ec2.go
func (c *Client) GetConsoleOutput(ctx context.Context, instanceID string) (string, error) {
out, err := c.EC2.GetConsoleOutput(ctx, &ec2.GetConsoleOutputInput{
InstanceId: &instanceID,
})
if err != nil {
return "", err
}
if out.Output == nil {
return "(no console output available)", nil
}
return *out.Output, nil
}StartEC2Instance method · go · L216-L221 (6 LOC)internal/aws/ec2.go
func (c *Client) StartEC2Instance(ctx context.Context, instanceID string) error {
_, err := c.EC2.StartInstances(ctx, &ec2.StartInstancesInput{
InstanceIds: []string{instanceID},
})
return err
}StopEC2Instance method · go · L224-L229 (6 LOC)internal/aws/ec2.go
func (c *Client) StopEC2Instance(ctx context.Context, instanceID string) error {
_, err := c.EC2.StopInstances(ctx, &ec2.StopInstancesInput{
InstanceIds: []string{instanceID},
})
return err
}RebootEC2Instance method · go · L232-L237 (6 LOC)internal/aws/ec2.go
func (c *Client) RebootEC2Instance(ctx context.Context, instanceID string) error {
_, err := c.EC2.RebootInstances(ctx, &ec2.RebootInstancesInput{
InstanceIds: []string{instanceID},
})
return err
}TerminateEC2Instance method · go · L240-L245 (6 LOC)internal/aws/ec2.go
func (c *Client) TerminateEC2Instance(ctx context.Context, instanceID string) error {
_, err := c.EC2.TerminateInstances(ctx, &ec2.TerminateInstancesInput{
InstanceIds: []string{instanceID},
})
return err
}StartSSMSession method · go · L249-L264 (16 LOC)internal/aws/ec2.go
func (c *Client) StartSSMSession(ctx context.Context, instanceID string) (*ExecSession, error) {
out, err := c.SSM.StartSession(ctx, &ssm.StartSessionInput{
Target: &instanceID,
})
if err != nil {
return nil, fmt.Errorf("start-session failed: %w", err)
}
return &ExecSession{
SessionID: derefStrAws(out.SessionId),
StreamURL: derefStrAws(out.StreamUrl),
TokenValue: derefStrAws(out.TokenValue),
Region: c.Region(),
Target: instanceID,
}, nil
}Repobility (the analyzer behind this table) · https://repobility.com
instanceFromSDK function · go · L282-L328 (47 LOC)internal/aws/ec2.go
func instanceFromSDK(inst ec2types.Instance) EC2Instance {
i := EC2Instance{
InstanceID: derefStrAws(inst.InstanceId),
Type: string(inst.InstanceType),
PrivateIP: derefStrAws(inst.PrivateIpAddress),
PublicIP: derefStrAws(inst.PublicIpAddress),
VpcID: derefStrAws(inst.VpcId),
SubnetID: derefStrAws(inst.SubnetId),
KeyName: derefStrAws(inst.KeyName),
AMI: derefStrAws(inst.ImageId),
Platform: derefStrAws(inst.PlatformDetails),
Tags: make(map[string]string),
}
if inst.State != nil {
i.State = string(inst.State.Name)
}
if inst.Placement != nil {
i.AZ = derefStrAws(inst.Placement.AvailabilityZone)
}
if inst.LaunchTime != nil {
i.LaunchTime = *inst.LaunchTime
}
if inst.IamInstanceProfile != nil {
arn := derefStrAws(inst.IamInstanceProfile.Arn)
// Extract role name from ARN
if parts := strings.Split(arn, "/"); len(parts) > 1 {
i.IAMRole = parts[len(parts)-1]
} else {
i.IAMRole = arn
}
}
for _, t := range inststateOrder function · go · L330-L343 (14 LOC)internal/aws/ec2.go
func stateOrder(state string) int {
order := map[string]int{
"running": 0,
"pending": 1,
"stopping": 2,
"stopped": 3,
"shutting-down": 4,
"terminated": 5,
}
if o, ok := order[state]; ok {
return o
}
return 9
}sgRulesFromPerm function · go · L345-L397 (53 LOC)internal/aws/ec2.go
func sgRulesFromPerm(direction string, perm ec2types.IpPermission) []EC2SGRule {
proto := derefStrAws(perm.IpProtocol)
if proto == "-1" {
proto = "All"
}
portRange := "All"
if perm.FromPort != nil && perm.ToPort != nil {
if *perm.FromPort == *perm.ToPort {
portRange = fmt.Sprintf("%d", *perm.FromPort)
} else {
portRange = fmt.Sprintf("%d-%d", *perm.FromPort, *perm.ToPort)
}
if *perm.FromPort == 0 && *perm.ToPort == 0 && proto != "All" {
portRange = "All"
}
}
var rules []EC2SGRule
for _, cidr := range perm.IpRanges {
rules = append(rules, EC2SGRule{
Direction: direction,
Protocol: proto,
PortRange: portRange,
Source: derefStrAws(cidr.CidrIp),
})
}
for _, cidr := range perm.Ipv6Ranges {
rules = append(rules, EC2SGRule{
Direction: direction,
Protocol: proto,
PortRange: portRange,
Source: derefStrAws(cidr.CidrIpv6),
})
}
for _, sg := range perm.UserIdGroupPairs {
rules = append(rules, EC2SGRule{
Direction: direListECRRepos method · go · L46-L65 (20 LOC)internal/aws/ecr.go
func (c *Client) ListECRRepos(ctx context.Context, filter string) ([]ECRRepo, error) {
var repos []ECRRepo
lf := strings.ToLower(filter)
paginator := ecr.NewDescribeRepositoriesPaginator(c.ECR, &ecr.DescribeRepositoriesInput{})
for paginator.HasMorePages() {
page, err := paginator.NextPage(ctx)
if err != nil {
return nil, err
}
for _, r := range page.Repositories {
repo := repoFromSDK(r)
if lf != "" && !strings.Contains(strings.ToLower(repo.Name), lf) {
continue
}
repos = append(repos, repo)
}
}
return repos, nil
}ListECRImages method · go · L68-L95 (28 LOC)internal/aws/ecr.go
func (c *Client) ListECRImages(ctx context.Context, repoName string) ([]ECRImage, error) {
var images []ECRImage
paginator := ecr.NewDescribeImagesPaginator(c.ECR, &ecr.DescribeImagesInput{
RepositoryName: &repoName,
})
for paginator.HasMorePages() {
page, err := paginator.NextPage(ctx)
if err != nil {
return nil, err
}
for _, d := range page.ImageDetails {
images = append(images, imageFromSDK(d))
}
}
// Sort newest first
for i, j := 0, len(images)-1; i < j; i, j = i+1, j-1 {
// Check if already sorted
if images[i].PushedAt.Before(images[j].PushedAt) {
images[i], images[j] = images[j], images[i]
}
}
// Proper sort
sortImagesByPushDate(images)
return images, nil
}GetECRScanFindings method · go · L98-L136 (39 LOC)internal/aws/ecr.go
func (c *Client) GetECRScanFindings(ctx context.Context, repoName, imageDigest string) ([]ECRFinding, error) {
var findings []ECRFinding
paginator := ecr.NewDescribeImageScanFindingsPaginator(c.ECR, &ecr.DescribeImageScanFindingsInput{
RepositoryName: &repoName,
ImageId: &ecrtypes.ImageIdentifier{ImageDigest: &imageDigest},
})
for paginator.HasMorePages() {
page, err := paginator.NextPage(ctx)
if err != nil {
return nil, err
}
if page.ImageScanFindings != nil {
for _, f := range page.ImageScanFindings.Findings {
finding := ECRFinding{
Name: derefStrAws(f.Name),
Severity: string(f.Severity),
Description: derefStrAws(f.Description),
URI: derefStrAws(f.Uri),
}
for _, attr := range f.Attributes {
if attr.Key != nil {
switch *attr.Key {
case "package_name":
finding.Package = derefStrAws(attr.Value)
case "package_version":
finding.Version = derefStrAws(attr.Value)
}
StartECRScan method · go · L139-L149 (11 LOC)internal/aws/ecr.go
func (c *Client) StartECRScan(ctx context.Context, repoName, imageDigest string, tags []string) error {
imageID := &ecrtypes.ImageIdentifier{ImageDigest: &imageDigest}
if len(tags) > 0 {
imageID.ImageTag = &tags[0]
}
_, err := c.ECR.StartImageScan(ctx, &ecr.StartImageScanInput{
RepositoryName: &repoName,
ImageId: imageID,
})
return err
}DeleteECRImage method · go · L152-L158 (7 LOC)internal/aws/ecr.go
func (c *Client) DeleteECRImage(ctx context.Context, repoName, imageDigest string) error {
_, err := c.ECR.BatchDeleteImage(ctx, &ecr.BatchDeleteImageInput{
RepositoryName: &repoName,
ImageIds: []ecrtypes.ImageIdentifier{{ImageDigest: &imageDigest}},
})
return err
}Repobility's GitHub App fixes findings like these · https://github.com/apps/repobility-bot
ECRImageURI function · go · L161-L166 (6 LOC)internal/aws/ecr.go
func ECRImageURI(repoURI, tag string) string {
if tag != "" {
return fmt.Sprintf("%s:%s", repoURI, tag)
}
return repoURI
}repoFromSDK function · go · L168-L185 (18 LOC)internal/aws/ecr.go
func repoFromSDK(r ecrtypes.Repository) ECRRepo {
repo := ECRRepo{
Name: derefStrAws(r.RepositoryName),
URI: derefStrAws(r.RepositoryUri),
ARN: derefStrAws(r.RepositoryArn),
}
if r.ImageScanningConfiguration != nil {
repo.ScanOnPush = r.ImageScanningConfiguration.ScanOnPush
}
repo.TagMutability = string(r.ImageTagMutability)
if r.EncryptionConfiguration != nil {
repo.EncryptionType = string(r.EncryptionConfiguration.EncryptionType)
}
if r.CreatedAt != nil {
repo.CreatedAt = *r.CreatedAt
}
return repo
}imageFromSDK function · go · L187-L208 (22 LOC)internal/aws/ecr.go
func imageFromSDK(d ecrtypes.ImageDetail) ECRImage {
img := ECRImage{
Digest: derefStrAws(d.ImageDigest),
Tags: d.ImageTags,
}
if d.ImagePushedAt != nil {
img.PushedAt = *d.ImagePushedAt
}
if d.ImageSizeInBytes != nil {
img.SizeBytes = *d.ImageSizeInBytes
}
if d.ArtifactMediaType != nil {
img.MediaType = *d.ArtifactMediaType
}
if d.ImageScanStatus != nil {
img.ScanStatus = string(d.ImageScanStatus.Status)
}
if d.ImageScanFindingsSummary != nil {
img.ScanSeverity = d.ImageScanFindingsSummary.FindingSeverityCounts
}
return img
}page 1 / 16next ›