This change allows users to specify a custom nginx.conf.sigil that can expose non-web process types to the outside world in addition to the web process type. Closes #3258
261 lines
7.5 KiB
Go
261 lines
7.5 KiB
Go
package network
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
"unicode/utf8"
|
|
|
|
"github.com/dokku/dokku/plugins/common"
|
|
"github.com/dokku/dokku/plugins/config"
|
|
)
|
|
|
|
// TriggerInstall runs the install step for the network plugin
|
|
func TriggerInstall() {
|
|
if err := common.PropertySetup("network"); err != nil {
|
|
common.LogFail(fmt.Sprintf("Unable to install the network plugin: %s", err.Error()))
|
|
}
|
|
|
|
apps, err := common.DokkuApps()
|
|
if err != nil {
|
|
return
|
|
}
|
|
for _, appName := range apps {
|
|
if common.PropertyExists("network", appName, "bind-all-interfaces") {
|
|
continue
|
|
}
|
|
if err := common.PlugnTrigger("proxy-is-enabled", []string{appName}...); err != nil {
|
|
common.LogVerboseQuiet("Setting network property 'bind-all-interfaces' to false")
|
|
if err := common.PropertyWrite("network", appName, "bind-all-interfaces", "false"); err != nil {
|
|
common.LogWarn(err.Error())
|
|
}
|
|
} else {
|
|
common.LogVerboseQuiet("Setting network property 'bind-all-interfaces' to true")
|
|
if err := common.PropertyWrite("network", appName, "bind-all-interfaces", "true"); err != nil {
|
|
common.LogWarn(err.Error())
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// TriggerNetworkComputePorts computes the ports for a given app container
|
|
func TriggerNetworkComputePorts(appName string, processType string, isHerokuishContainer bool) {
|
|
var dockerfilePorts []string
|
|
if !isHerokuishContainer {
|
|
dokkuDockerfilePorts := strings.Trim(config.GetWithDefault(appName, "DOKKU_DOCKERFILE_PORTS", ""), " ")
|
|
if utf8.RuneCountInString(dokkuDockerfilePorts) > 0 {
|
|
dockerfilePorts = strings.Split(dokkuDockerfilePorts, " ")
|
|
}
|
|
}
|
|
|
|
var ports []string
|
|
if len(dockerfilePorts) == 0 {
|
|
ports = append(ports, "5000")
|
|
} else {
|
|
for _, port := range dockerfilePorts {
|
|
port = strings.TrimSuffix(strings.TrimSpace(port), "/tcp")
|
|
if port == "" || strings.HasSuffix(port, "/udp") {
|
|
continue
|
|
}
|
|
ports = append(ports, port)
|
|
}
|
|
}
|
|
fmt.Println(strings.Join(ports, " "))
|
|
}
|
|
|
|
// TriggerNetworkConfigExists writes true or false to stdout whether a given app has network config
|
|
func TriggerNetworkConfigExists(appName string) {
|
|
if HasNetworkConfig(appName) {
|
|
fmt.Println("true")
|
|
return
|
|
}
|
|
|
|
fmt.Println("false")
|
|
}
|
|
|
|
// TriggerNetworkGetIppaddr writes the ipaddress to stdout for a given app container
|
|
func TriggerNetworkGetIppaddr(appName string, processType string, containerID string) {
|
|
ipAddress := GetContainerIpaddress(appName, processType, containerID)
|
|
fmt.Println(ipAddress)
|
|
}
|
|
|
|
// TriggerNetworkGetListeners returns the listeners (host:port combinations) for a given app container
|
|
func TriggerNetworkGetListeners(appName string, processType string) {
|
|
if processType == "" {
|
|
common.LogWarn("Deprecated: Please specify a processType argument for the network-get-listeners plugin trigger")
|
|
processType = "web"
|
|
}
|
|
listeners := GetListeners(appName, processType)
|
|
fmt.Println(strings.Join(listeners, " "))
|
|
}
|
|
|
|
// TriggerNetworkGetPort writes the port to stdout for a given app container
|
|
func TriggerNetworkGetPort(appName string, processType string, containerID string, isHerokuishContainer bool) {
|
|
port := GetContainerPort(appName, processType, containerID, isHerokuishContainer)
|
|
fmt.Println(port)
|
|
}
|
|
|
|
// TriggerNetworkGetProperty writes the network property to stdout for a given app container
|
|
func TriggerNetworkGetProperty(appName string, property string) {
|
|
defaultValue := GetDefaultValue(property)
|
|
value := common.PropertyGetDefault("network", appName, property, defaultValue)
|
|
fmt.Println(value)
|
|
}
|
|
|
|
// TriggerNetworkWriteIpaddr writes the ip to disk
|
|
func TriggerNetworkWriteIpaddr(appName string, processType string, containerIndex string, ip string) {
|
|
if appName == "" {
|
|
common.LogFail("Please specify an app to run the command on")
|
|
}
|
|
err := common.VerifyAppName(appName)
|
|
if err != nil {
|
|
common.LogFail(err.Error())
|
|
}
|
|
|
|
appRoot := common.AppRoot(appName)
|
|
filename := fmt.Sprintf("%v/IP.%v.%v", appRoot, processType, containerIndex)
|
|
f, err := os.Create(filename)
|
|
if err != nil {
|
|
common.LogFail(err.Error())
|
|
}
|
|
defer f.Close()
|
|
|
|
ipBytes := []byte(ip)
|
|
_, err = f.Write(ipBytes)
|
|
if err != nil {
|
|
common.LogFail(err.Error())
|
|
}
|
|
}
|
|
|
|
// TriggerNetworkWritePort writes the port to disk
|
|
func TriggerNetworkWritePort(appName string, processType string, containerIndex string, port string) {
|
|
if appName == "" {
|
|
common.LogFail("Please specify an app to run the command on")
|
|
}
|
|
err := common.VerifyAppName(appName)
|
|
if err != nil {
|
|
common.LogFail(err.Error())
|
|
}
|
|
|
|
appRoot := common.AppRoot(appName)
|
|
filename := fmt.Sprintf("%v/PORT.%v.%v", appRoot, processType, containerIndex)
|
|
f, err := os.Create(filename)
|
|
if err != nil {
|
|
common.LogFail(err.Error())
|
|
}
|
|
defer f.Close()
|
|
|
|
portBytes := []byte(port)
|
|
_, err = f.Write(portBytes)
|
|
if err != nil {
|
|
common.LogFail(err.Error())
|
|
}
|
|
}
|
|
|
|
// TriggerPostAppCloneSetup creates new network files
|
|
func TriggerPostAppCloneSetup(oldAppName string, newAppName string) error {
|
|
success := ClearNetworkConfig(newAppName)
|
|
if !success {
|
|
os.Exit(1)
|
|
}
|
|
|
|
err := common.PropertyClone("network", oldAppName, newAppName)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// TriggerPostAppRenameSetup renames network files
|
|
func TriggerPostAppRenameSetup(oldAppName string, newAppName string) error {
|
|
success := ClearNetworkConfig(newAppName)
|
|
if !success {
|
|
os.Exit(1)
|
|
}
|
|
|
|
if err := common.PropertyClone("network", oldAppName, newAppName); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := common.PropertyDestroy("network", oldAppName); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// TriggerPostContainerCreate associates the container with a specified network
|
|
func TriggerPostContainerCreate(containerType string, containerID string, appName string, phase string, processType string) {
|
|
if containerType != "app" {
|
|
return
|
|
}
|
|
|
|
property := "attach-post-create"
|
|
defaultValue := GetDefaultValue(property)
|
|
networkName := common.PropertyGetDefault("network", appName, property, defaultValue)
|
|
if networkName == "" {
|
|
return
|
|
}
|
|
|
|
exists, err := networkExists(networkName)
|
|
if err != nil {
|
|
common.LogFail(err.Error())
|
|
}
|
|
|
|
if !exists {
|
|
common.LogFail(fmt.Sprintf("Network %v does not exist", networkName))
|
|
}
|
|
|
|
attachAppToNetwork(containerID, networkName, appName, phase, processType)
|
|
}
|
|
|
|
// TriggerPostCreate sets bind-all-interfaces to false by default
|
|
func TriggerPostCreate(appName string) {
|
|
err := common.PropertyWrite("network", appName, "bind-all-interfaces", "false")
|
|
if err != nil {
|
|
common.LogWarn(err.Error())
|
|
}
|
|
}
|
|
|
|
// TriggerPostDelete destroys the network property for a given app container
|
|
func TriggerPostDelete(appName string) {
|
|
err := common.PropertyDestroy("network", appName)
|
|
if err != nil {
|
|
common.LogFail(err.Error())
|
|
}
|
|
}
|
|
|
|
// TriggerCorePostDeploy associates the container with a specified network
|
|
func TriggerCorePostDeploy(appName string) {
|
|
property := "attach-post-deploy"
|
|
defaultValue := GetDefaultValue(property)
|
|
networkName := common.PropertyGetDefault("network", appName, property, defaultValue)
|
|
if networkName == "" {
|
|
return
|
|
}
|
|
|
|
common.LogInfo1Quiet(fmt.Sprintf("Associating app with network %s", networkName))
|
|
containerIDs, err := common.GetAppRunningContainerIDs(appName, "")
|
|
if err != nil {
|
|
common.LogFail(err.Error())
|
|
}
|
|
|
|
exists, err := networkExists(networkName)
|
|
if err != nil {
|
|
common.LogFail(err.Error())
|
|
}
|
|
|
|
if !exists {
|
|
common.LogFail(fmt.Sprintf("Network %v does not exist", networkName))
|
|
}
|
|
|
|
for _, containerID := range containerIDs {
|
|
processType, err := common.DockerInspect(containerID, "{{ index .Config.Labels \"com.dokku.process-type\"}}")
|
|
if err != nil {
|
|
common.LogFail(err.Error())
|
|
}
|
|
attachAppToNetwork(containerID, networkName, appName, "deploy", processType)
|
|
}
|
|
}
|