Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ require (
github.com/go-openapi/validate v0.20.2
github.com/jessevdk/go-flags v1.5.0
github.com/kraken-hpc/go-fork v0.1.1
github.com/kraken-hpc/uinit v0.1.1
github.com/kraken-hpc/uinit v0.2.0
github.com/mailru/easyjson v0.7.7 // indirect
github.com/sirupsen/logrus v1.8.1
github.com/u-root/iscsinl v0.1.0
Expand Down
19 changes: 4 additions & 15 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d h1:Byv0BzEl
github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
github.com/aws/aws-sdk-go v1.34.28/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48=
github.com/beevik/ntp v0.3.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg=
github.com/bensallen/rbd v0.0.0-20201123204607-9b994a7784d0/go.mod h1:scQzzcMu4X4w0L6rELxUERr68HS2Lqu/NYdnxw72sV8=
github.com/bensallen/rbd v0.0.0-20210224155049-baf486eceefa h1:fk3cRl+COO4Ps5eiMTFD2VIve8PN3yfLztDDsuKUZjI=
github.com/bensallen/rbd v0.0.0-20210224155049-baf486eceefa/go.mod h1:2CDopFVfYqEf77T3xHJDcvuCULhkdQ4HgtstEVoPtfM=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
Expand Down Expand Up @@ -66,7 +65,6 @@ github.com/go-openapi/analysis v0.19.4/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9sn
github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU=
github.com/go-openapi/analysis v0.19.10/go.mod h1:qmhS3VNFxBlquFJ0RGoDtylO9y4pgTAUNE9AEEMdlJQ=
github.com/go-openapi/analysis v0.19.16/go.mod h1:GLInF007N83Ad3m8a/CbQ5TPzdnGT7workfHwuVjNVk=
github.com/go-openapi/analysis v0.20.0 h1:UN09o0kNhleunxW7LR+KnltD0YrJ8FF03pSqvAN3Vro=
github.com/go-openapi/analysis v0.20.0/go.mod h1:BMchjvaHDykmRMsK40iPtvyOfFdMMxlOmQr9FBZk+Og=
github.com/go-openapi/analysis v0.20.1 h1:zdVbw8yoD4SWZeq+cWdGgquaB0W4VrsJvDJHJND/Ktc=
github.com/go-openapi/analysis v0.20.1/go.mod h1:BMchjvaHDykmRMsK40iPtvyOfFdMMxlOmQr9FBZk+Og=
Expand All @@ -90,7 +88,6 @@ github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3Hfo
github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I=
github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc=
github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8=
github.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM=
github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg=
github.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs=
github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns=
Expand Down Expand Up @@ -221,11 +218,9 @@ github.com/google/goexpect v0.0.0-20200816234442-b5b77125c2c5/go.mod h1:n1ej5+Fq
github.com/google/goterm v0.0.0-20190703233501-fc88cf888a3f h1:5CjVwnuUcp5adK4gmY6i72gpVFVnZDP2h5TmPScB6u4=
github.com/google/goterm v0.0.0-20190703233501-fc88cf888a3f/go.mod h1:nOFQdrUlIlx6M6ODdSpBj1NVA+VgLC6kmw60mkw34H4=
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y=
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
github.com/hexdigest/gowrap v1.1.7/go.mod h1:Z+nBFUDLa01iaNM+/jzoOA1JJ7sm51rnYFauKFUB5fs=
github.com/hexdigest/gowrap v1.1.8/go.mod h1:H/JiFmQMp//tedlV8qt2xBdGzmne6bpbaSuiHmygnMw=
Expand All @@ -234,6 +229,8 @@ github.com/insomniacslk/dhcp v0.0.0-20200814125043-2e1bf785d039/go.mod h1:CfMdgu
github.com/intel-go/cpuid v0.0.0-20200819041909-2aa72927c3e2/go.mod h1:RmeVYf9XrPRbRc3XIx0gLYA8qOFvNoPOfaEZduRlEp4=
github.com/jessevdk/go-flags v1.5.0 h1:1jKYvbxEjfUl0fmqTCOfonvskHHXMjBySTLW4y9LFvc=
github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4=
github.com/jinzhu/copier v0.3.2 h1:QdBOCbaouLDYaIPFfi1bKv5F5tPpeTwXe4sD0jqtz5w=
github.com/jinzhu/copier v0.3.2/go.mod h1:24xnZezI2Yqac9J61UC6/dG/k76ttpq0DdJI3QmUvro=
github.com/jlowellwofford/iscsinl v0.1.1-0.20210831201708-527d3dbd2e6d h1:SU2fb/eqGE6dawxfiHVzMKM6Hb4z4iGEn3VqQP+Fuws=
github.com/jlowellwofford/iscsinl v0.1.1-0.20210831201708-527d3dbd2e6d/go.mod h1:RWIgJWqm9/0gjBZ0Hl8iR6MVGzZ+yAda2uqqLmetE2I=
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
Expand Down Expand Up @@ -264,8 +261,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/kraken-hpc/go-fork v0.1.1 h1:O3X/ynoNy/eS7UIcZYef8ndFq2RXEIOue9kZqyzF0Sk=
github.com/kraken-hpc/go-fork v0.1.1/go.mod h1:uu0e5h+V4ONH5Qk/xuVlyNXJXy/swhqGIEMK7w+9dNc=
github.com/kraken-hpc/uinit v0.1.1 h1:gdKNgb0NQDU73mZKs4qfb0N2eY7q1K6jFaNe2f/2pTo=
github.com/kraken-hpc/uinit v0.1.1/go.mod h1:S09qeh87rhAU14nENTRIggeF/tC6n+QJAYvW11UP4HI=
github.com/kraken-hpc/uinit v0.2.0 h1:9yaSoRRN1tm4SckUktvstU8L7qR0OsyL/saMCGy+nN0=
github.com/kraken-hpc/uinit v0.2.0/go.mod h1:O9SICS/svBXcKFOzee7ZjwlQX+Cr0eafUlsR0eBKWXQ=
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
Expand Down Expand Up @@ -309,7 +306,6 @@ github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUr
github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
Expand Down Expand Up @@ -343,7 +339,6 @@ github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3
github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
Expand Down Expand Up @@ -388,7 +383,6 @@ go.mongodb.org/mongo-driver v1.3.4/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS
go.mongodb.org/mongo-driver v1.4.3/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4SoGjYphSc=
go.mongodb.org/mongo-driver v1.4.4/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4SoGjYphSc=
go.mongodb.org/mongo-driver v1.4.6/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4SoGjYphSc=
go.mongodb.org/mongo-driver v1.5.1 h1:9nOVLGDfOaZ9R0tBumx/BcuqkbFpyTCU2r/Po7A2azI=
go.mongodb.org/mongo-driver v1.5.1/go.mod h1:gRXCHX4Jo7J0IJ1oDQyUxF7jfy19UfxniMS4xxMmUqw=
go.mongodb.org/mongo-driver v1.7.0 h1:hHrvOBWlWB2c7+8Gh/Xi5jj82AgidK/t7KVXBZ+IyUA=
go.mongodb.org/mongo-driver v1.7.0/go.mod h1:Q4oFMbo1+MSNqICAdYMlC/zSTrwCogR4R8NzkI+yfU8=
Expand Down Expand Up @@ -486,7 +480,6 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44 h1:Bli41pIlzTzf3KEY06n+xnzK/BESIg2ze4Pgfh/aI8c=
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
Expand All @@ -499,7 +492,6 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.5 h1:i6eZZ+zk0SOf0xgBpEpPD18qWcJda6q1sxt3S0kzyUQ=
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
Expand All @@ -519,8 +511,6 @@ golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgw
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200915201639-f4cefd1cb5ba/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU=
golang.org/x/tools v0.0.0-20201119174615-0557df368a99/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.0 h1:po9/4sTYwZU9lPhi1tOrb4hCv3qrhiQ77LZfGa2OjwY=
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA=
Expand All @@ -543,7 +533,6 @@ google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQ
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
google.golang.org/grpc v1.31.0 h1:T7P4R73V3SSDPhH7WW7ATbfViLtmamH0DKrP3f9AuDI=
google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
google.golang.org/grpc v1.38.0 h1:/9BgsAsa5nWe26HqOlvlgJnqBuktYOLCgjCPqsa56W0=
google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
Expand Down
121 changes: 114 additions & 7 deletions internal/api/container.go
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ func (c *Containers) Create(n *Container) (ret *Container, err error) {
// set up logger
if err = os.MkdirAll(API.LogDir, 0700); err != nil {
l.WithError(err).Error("could not make log directory")
return nil, fmt.Errorf("could not create log directory: %v", err)
return nil, ErrSrv
}
ctn.Logfile = path.Join(API.LogDir, fmt.Sprintf("%d-%d.log", ctn.ID, time.Now().Unix()))
f, err := os.Create(ctn.Logfile)
Expand All @@ -121,6 +121,29 @@ func (c *Containers) Create(n *Container) (ret *Container, err error) {
n.log = log.New(f, fmt.Sprintf("container(%d): ", ctn.ID), log.Ldate|log.Ltime|log.Lmsgprefix)
n.log.Printf("container created")

n.log.Printf("running script hook: create")
var hook *models.ContainerScriptHook
if ctn.Hooks != nil {
hook = ctn.Hooks.Create
}
if h, err := NewHook(hook, "", ctn.Mount.Mountpoint, n.log, map[string]string{
"logfile": ctn.Logfile,
"command": *ctn.Command,
"mountpoint": ctn.Mount.Mountpoint,
"mountkind": ctn.Mount.Kind,
"name": string(ctn.Name),
"id": fmt.Sprintf("%d", ctn.ID),
"systemd": fmt.Sprintf("%t", ctn.Systemd),
}); err != nil {
l.WithError(err).Debug("fatal error building create scripts")
return nil, ErrFail
} else {
if err = h.Run(); err != nil {
l.WithError(err).Debug("fatal error running create scripts")
return nil, ErrFail
}
}

// handle initial state
switch ctn.State {
case models.ContainerStateRunning:
Expand Down Expand Up @@ -215,6 +238,31 @@ func (c *Containers) Delete(id models.ID) (ret *Container, err error) {
l.Trace("attempt to delete stopping container")
return nil, ErrBusy
}
// run delete hook
ctn.log.Printf("running script hook: exit")
var hook *models.ContainerScriptHook
if ctn.Container.Hooks != nil {
hook = ctn.Container.Hooks.Exit
}
if h, err := NewHook(hook, "", ctn.Container.Mount.Mountpoint, ctn.log, map[string]string{
"logfile": ctn.Container.Logfile,
"command": *ctn.Container.Command,
"mountpoint": ctn.Container.Mount.Mountpoint,
"mountkind": ctn.Container.Mount.Kind,
"name": string(ctn.Container.Name),
"id": fmt.Sprintf("%d", ctn.Container.ID),
"systemd": fmt.Sprintf("%t", ctn.Container.Systemd),
"state": string(ctn.Container.State),
}); err != nil {
l.WithError(err).Debug("fatal error building exit scripts")
// but we don't actually do anything here
} else {
if err = h.Run(); err != nil {
l.WithError(err).Debug("fatal error running exit scripts")
// but we don't actually do anything here
}
}

ctn.log.Printf("container deleted")
ctn.log.Writer().(io.WriteCloser).Close()
if ctn.Container.Name != "" {
Expand Down Expand Up @@ -277,7 +325,7 @@ func (c *Containers) run(ctn *Container) (err error) {
// 2 parse command into args
args := uinit.SplitCommandLine(*ctn.Container.Command)
if len(args) < 1 {
return fmt.Errorf("command appears to be invalid: %s", *ctn.Container.Command)
return fmt.Errorf("clone: command appears to be invalid: %s", *ctn.Container.Command)
}

// 3. Is our init valid?
Expand All @@ -286,15 +334,34 @@ func (c *Containers) run(ctn *Container) (err error) {
return fmt.Errorf("clone: init validationfailed: %v", err)
}

// 3. Launch new process
// 4. Pre-build start hook
log.Print("building script hook: Init")
var hook *models.ContainerScriptHook
if ctn.Container.Hooks != nil {
hook = ctn.Container.Hooks.Init
}
h, err := NewHook(hook, "", ctn.Container.Mount.Mountpoint, ctn.log, map[string]string{
"logfile": ctn.Container.Logfile,
"command": *ctn.Container.Command,
"mountpoint": ctn.Container.Mount.Mountpoint,
"mountkind": ctn.Container.Mount.Kind,
"name": string(ctn.Container.Name),
"id": fmt.Sprintf("%d", ctn.Container.ID),
"systemd": fmt.Sprintf("%t", ctn.Container.Systemd),
})
if err != nil {
return fmt.Errorf("clone: fatal error loading init script hook: %v", err.Error())
}

// 5. Launch new process
f := fork.NewFork("containerInit", containerInit)
f.Stdout = log.Writer().(*os.File)
f.Stderr = log.Writer().(*os.File)
f.Stdin = nil
f.SysProcAttr = &syscall.SysProcAttr{
Cloneflags: syscall.CLONE_NEWNS | syscall.CLONE_NEWPID | syscall.CLONE_NEWIPC | syscall.CLONE_NEWUTS,
}
if err := f.Fork(ctn.Container.Mount.Mountpoint, ctn.Container.Systemd, args); err != nil {
if err := f.Fork(ctn.Container.Mount.Mountpoint, ctn.Container.Systemd, h, args); err != nil {
return fmt.Errorf("clone: failed to start pid_init: %v", err)
}

Expand Down Expand Up @@ -359,7 +426,7 @@ var specialLinks = []symlinkType{
}

// this is run as a separate process
func containerInit(mountpoint string, systemd bool, args []string) {
func containerInit(mountpoint string, systemd bool, hook *Hook, args []string) {
// 0. setup logging
l := log.New(os.Stdout, "init: ", log.Ldate|log.Ltime|log.Lmsgprefix)

Expand Down Expand Up @@ -404,7 +471,15 @@ func containerInit(mountpoint string, systemd bool, args []string) {
}
}

// 6. execute init
// 6. Run init script hooks
if hook != nil {
l.Printf("executing init script hooks")
if err := hook.Run(); err != nil {
l.Fatalf("fatal init script hook error: %v", err)
}
}

// 7. execute init
l.Print("executing init")
if err := unix.Exec(args[0], args, []string{}); err != nil {
l.Fatalf("containerInit: exec failed: %v", err)
Expand All @@ -424,8 +499,9 @@ func (c *Containers) watcher(ctx context.Context, ctn *Container, f *fork.Functi
end <- e
}()
state := models.ContainerStateExited
var e error
select {
case e := <-end:
case e = <-end:
if e != nil {
l.WithError(e).Debug("process ended in error state")
ctn.log.Printf("process ended in error state: %v", e)
Expand All @@ -452,6 +528,37 @@ func (c *Containers) watcher(ctx context.Context, ctn *Container, f *fork.Functi
unix.Syncfs(fd)
unix.Close(fd)
}

// run the Exit hook
ctn.log.Printf("running script hook: exit")
var hook *models.ContainerScriptHook
if ctn.Container.Hooks != nil {
hook = ctn.Container.Hooks.Exit
}
errstr := ""
if e != nil {
errstr = e.Error()
}
if h, err := NewHook(hook, "", ctn.Container.Mount.Mountpoint, ctn.log, map[string]string{
"logfile": ctn.Container.Logfile,
"command": *ctn.Container.Command,
"mountpoint": ctn.Container.Mount.Mountpoint,
"mountkind": ctn.Container.Mount.Kind,
"name": string(ctn.Container.Name),
"id": fmt.Sprintf("%d", ctn.Container.ID),
"systemd": fmt.Sprintf("%t", ctn.Container.Systemd),
"error": fmt.Sprintf("%t", e != nil),
"errorstring": errstr,
}); err != nil {
l.WithError(err).Debug("fatal error building exit scripts")
state = models.ContainerStateDead
} else {
if err = h.Run(); err != nil {
l.WithError(err).Debug("fatal error running exit scripts")
state = models.ContainerStateDead
}
}

// process is over, set the state
c.mutex.Lock()
defer c.mutex.Unlock()
Expand Down
Loading