timers, counters, misc
This commit is contained in:
parent
5571b66d52
commit
e8bb5506f5
20
main.go
20
main.go
@ -3,6 +3,7 @@ package main
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/netip"
|
"net/netip"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
"github.com/thefeli73/polemos/mtdaws"
|
"github.com/thefeli73/polemos/mtdaws"
|
||||||
@ -38,6 +39,9 @@ func mtdLoop(config state.Config) {
|
|||||||
config = movingTargetDefense(config)
|
config = movingTargetDefense(config)
|
||||||
state.SaveConf(ConfigPath, config)
|
state.SaveConf(ConfigPath, config)
|
||||||
|
|
||||||
|
fmt.Println("Sleeping for 5 seconds")
|
||||||
|
time.Sleep(5*time.Second)
|
||||||
|
|
||||||
//TODO: proxy commands
|
//TODO: proxy commands
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -50,6 +54,7 @@ func movingTargetDefense(config state.Config) state.Config{
|
|||||||
|
|
||||||
func indexAllInstances(config state.Config) state.Config {
|
func indexAllInstances(config state.Config) state.Config {
|
||||||
fmt.Println("Indexing instances")
|
fmt.Println("Indexing instances")
|
||||||
|
t := time.Now()
|
||||||
|
|
||||||
for _, service := range config.MTD.Services {
|
for _, service := range config.MTD.Services {
|
||||||
service.Active = false
|
service.Active = false
|
||||||
@ -57,7 +62,7 @@ func indexAllInstances(config state.Config) state.Config {
|
|||||||
|
|
||||||
//index AWS instances
|
//index AWS instances
|
||||||
awsNewInstanceCounter := 0
|
awsNewInstanceCounter := 0
|
||||||
awsRemovedInstanceCounter := 0
|
awsInactiveInstanceCounter := len(config.MTD.Services)
|
||||||
awsInstanceCounter := 0
|
awsInstanceCounter := 0
|
||||||
awsInstances := mtdaws.GetInstances(config)
|
awsInstances := mtdaws.GetInstances(config)
|
||||||
for _, instance := range awsInstances {
|
for _, instance := range awsInstances {
|
||||||
@ -69,11 +74,16 @@ func indexAllInstances(config state.Config) state.Config {
|
|||||||
}
|
}
|
||||||
var found bool
|
var found bool
|
||||||
config, found = indexInstance(config, cloudID, ip)
|
config, found = indexInstance(config, cloudID, ip)
|
||||||
if !found {awsNewInstanceCounter++}
|
if !found {
|
||||||
|
awsNewInstanceCounter++
|
||||||
|
} else {
|
||||||
|
awsInactiveInstanceCounter--
|
||||||
|
}
|
||||||
awsInstanceCounter++
|
awsInstanceCounter++
|
||||||
}
|
}
|
||||||
// TODO: Purge instances in config that are not found in the cloud
|
// TODO: Purge instances in config that are not found in the cloud
|
||||||
fmt.Printf("Found %d AWS instances (%d newly added, %d removed)\n", awsInstanceCounter, awsNewInstanceCounter, awsRemovedInstanceCounter)
|
fmt.Printf("Found %d active AWS instances (%d newly added, %d inactive) (took %s)\n",
|
||||||
|
awsInstanceCounter, awsNewInstanceCounter, awsInactiveInstanceCounter, time.Since(t).Round(100*time.Millisecond).String())
|
||||||
|
|
||||||
|
|
||||||
return config
|
return config
|
||||||
@ -97,7 +107,9 @@ func indexInstance(config state.Config, cloudID string, serviceIP netip.Addr) (s
|
|||||||
state.SaveConf(ConfigPath, config)
|
state.SaveConf(ConfigPath, config)
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
config.MTD.Services[foundUUID] = state.Service{Active: true}
|
s := config.MTD.Services[foundUUID]
|
||||||
|
s.Active = true
|
||||||
|
config.MTD.Services[foundUUID] = s
|
||||||
state.SaveConf(ConfigPath, config)
|
state.SaveConf(ConfigPath, config)
|
||||||
}
|
}
|
||||||
return config, found
|
return config, found
|
||||||
|
@ -53,6 +53,8 @@ func AWSMoveInstance(config state.Config) (state.Config) {
|
|||||||
for key, service := range config.MTD.Services {
|
for key, service := range config.MTD.Services {
|
||||||
serviceUUID = key
|
serviceUUID = key
|
||||||
instance = service
|
instance = service
|
||||||
|
if !instance.AdminEnabled {continue}
|
||||||
|
if !instance.Active {continue}
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -67,61 +69,63 @@ func AWSMoveInstance(config state.Config) (state.Config) {
|
|||||||
fmt.Println("Error getting instance details:\t", err)
|
fmt.Println("Error getting instance details:\t", err)
|
||||||
return config
|
return config
|
||||||
}
|
}
|
||||||
|
|
||||||
if !instance.AdminEnabled {
|
|
||||||
fmt.Println("Error, Service is Disabled!")
|
|
||||||
return config
|
|
||||||
}
|
|
||||||
if !instance.Active {
|
|
||||||
fmt.Println("Error, Service is not active!")
|
|
||||||
return config
|
|
||||||
}
|
|
||||||
if !isInstanceRunning(realInstance) {
|
if !isInstanceRunning(realInstance) {
|
||||||
fmt.Println("Error, Instance is not running!")
|
fmt.Println("Error, Instance is not running!")
|
||||||
return config
|
return config
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Create image
|
||||||
|
t := time.Now()
|
||||||
imageName, err := createImage(svc, instanceID)
|
imageName, err := createImage(svc, instanceID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("Error creating image:\t", err)
|
fmt.Println("Error creating image:\t", err)
|
||||||
return config
|
return config
|
||||||
}
|
}
|
||||||
fmt.Println("Created image:\t\t", imageName)
|
fmt.Printf("Created image:\t\t%s (took %s)\n", imageName, time.Since(t).Round(100*time.Millisecond).String())
|
||||||
|
|
||||||
|
// Wait for image
|
||||||
|
t = time.Now()
|
||||||
err = waitForImageReady(svc, imageName, 5*time.Minute)
|
err = waitForImageReady(svc, imageName, 5*time.Minute)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("Error waiting for image to be ready:\t", err)
|
fmt.Println("Error waiting for image to be ready:\t", err)
|
||||||
return config
|
return config
|
||||||
}
|
}
|
||||||
fmt.Println("Image is ready:\t\t", imageName)
|
fmt.Printf("Image is ready:\t\t%s (took %s)\n", imageName, time.Since(t).Round(100*time.Millisecond).String())
|
||||||
|
|
||||||
|
// Launch new instance
|
||||||
|
t = time.Now()
|
||||||
newInstanceID, err := launchInstance(svc, realInstance, imageName, region)
|
newInstanceID, err := launchInstance(svc, realInstance, imageName, region)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("Error launching instance:\t", err)
|
fmt.Println("Error launching instance:\t", err)
|
||||||
return config
|
return config
|
||||||
}
|
}
|
||||||
fmt.Println("Launched new instance:\t", newInstanceID)
|
fmt.Printf("Launched new instance:\t%s (took %s)\n", newInstanceID, time.Since(t).Round(100*time.Millisecond).String())
|
||||||
|
|
||||||
|
// Terminate old instance
|
||||||
|
t = time.Now()
|
||||||
err = terminateInstance(svc, instanceID)
|
err = terminateInstance(svc, instanceID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("Error terminating instance:\t", err)
|
fmt.Println("Error terminating instance:\t", err)
|
||||||
return config
|
return config
|
||||||
}
|
}
|
||||||
fmt.Println("Killed old instance:\t", instanceID)
|
fmt.Printf("Killed old instance:\t%s (took %s)\n", instanceID, time.Since(t).Round(100*time.Millisecond).String())
|
||||||
|
|
||||||
|
// Deregister old image
|
||||||
|
t = time.Now()
|
||||||
image, err := describeImage(svc, imageName)
|
image, err := describeImage(svc, imageName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("Error describing image:\t", err)
|
fmt.Println("Error describing image:\t", err)
|
||||||
return config
|
return config
|
||||||
}
|
}
|
||||||
|
|
||||||
err = deregisterImage(svc, imageName)
|
err = deregisterImage(svc, imageName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("Error deregistering image:\t", err)
|
fmt.Println("Error deregistering image:\t", err)
|
||||||
return config
|
return config
|
||||||
}
|
}
|
||||||
fmt.Println("Deregistered image:\t", imageName)
|
fmt.Printf("Deregistered image:\t%s (took %s)\n", imageName, time.Since(t).Round(100*time.Millisecond).String())
|
||||||
|
|
||||||
|
// Delete old snapshot
|
||||||
|
t = time.Now()
|
||||||
if len(image.BlockDeviceMappings) > 0 {
|
if len(image.BlockDeviceMappings) > 0 {
|
||||||
snapshotID := aws.ToString(image.BlockDeviceMappings[0].Ebs.SnapshotId)
|
snapshotID := aws.ToString(image.BlockDeviceMappings[0].Ebs.SnapshotId)
|
||||||
err = deleteSnapshot(svc, snapshotID)
|
err = deleteSnapshot(svc, snapshotID)
|
||||||
@ -129,7 +133,7 @@ func AWSMoveInstance(config state.Config) (state.Config) {
|
|||||||
fmt.Println("Error deleting snapshot:\t", err)
|
fmt.Println("Error deleting snapshot:\t", err)
|
||||||
return config
|
return config
|
||||||
}
|
}
|
||||||
fmt.Println("Deleted snapshot:\t", snapshotID)
|
fmt.Printf("Deleted snapshot:\t%s (took %s)\n", snapshotID, time.Since(t).Round(100*time.Millisecond).String())
|
||||||
}
|
}
|
||||||
|
|
||||||
AWSUpdateService(config, region, serviceUUID, newInstanceID)
|
AWSUpdateService(config, region, serviceUUID, newInstanceID)
|
||||||
|
@ -224,10 +224,7 @@ func terminateInstance(svc *ec2.Client, instanceID string) error {
|
|||||||
input := &ec2.TerminateInstancesInput{
|
input := &ec2.TerminateInstancesInput{
|
||||||
InstanceIds: []string{instanceID},
|
InstanceIds: []string{instanceID},
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err := svc.TerminateInstances(context.TODO(), input)
|
_, err := svc.TerminateInstances(context.TODO(), input)
|
||||||
|
|
||||||
// TODO: remove config for old instance
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user