func (idler *Idler) idleContainer(id containers.Identifier) bool { portPairs, err := containers.GetExistingPorts(id) if err != nil { fmt.Printf("idler.idleContainer: Error retrieving ports for container: %v\n", id) return false } iptablePorts, err := iptables.GetIdlerRules(id, false) if err != nil { fmt.Printf("idler.idleContainer: Error retrieving ports from iptables: %v\n", id) return false } shouldRecreateRules := false for _, portPair := range portPairs { extPort := strconv.Itoa(int(portPair.External)) shouldRecreateRules = shouldRecreateRules || !iptablePorts[extPort] } if !shouldRecreateRules { return false } //TODO: Ask geard to idle container f, err := os.Create(id.IdleUnitPathFor()) if err != nil { fmt.Printf("idler.idleContainer: Could not create idle marker for %s: %v", id.UnitNameFor(), err) return false } f.Close() if err := systemd.Connection().StopUnitJob(id.UnitNameFor(), "fail"); err != nil { fmt.Printf("idler.idleContainer: Could not stop container %s: %v", id.UnitNameFor(), err) return false } iptables.IdleContainer(id, idler.hostIp) return true }
func (idler *Idler) unidleContainer(id containers.Identifier, p netfilter.NFPacket) { newChanId, wasAlreadyAssigned := idler.getAvailableWaiter(id) if newChanId == 0 { fmt.Println("unidle: Error while finding wait channel") return } if !wasAlreadyAssigned { //TODO: Ask geard to unidle container if err := os.Remove(id.IdleUnitPathFor()); err != nil { fmt.Printf("unidle: Could not remove idle marker for %s: %v", id.UnitNameFor(), err) p.SetVerdict(netfilter.NF_ACCEPT) return } if err := systemd.Connection().StartUnitJob(id.UnitNameFor(), "fail"); err != nil { fmt.Printf("unidle: Could not start container %s: %v", id.UnitNameFor(), err) p.SetVerdict(netfilter.NF_ACCEPT) return } } p.SetRequeueVerdict(newChanId) }