Skip to content

Commit 01331b0

Browse files
authored
Merge pull request #25 from arthurbarr/master
Latest updates
2 parents 1b35054 + b240a84 commit 01331b0

File tree

24 files changed

+696
-38
lines changed

24 files changed

+696
-38
lines changed

Makefile

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ MQ_VERSION ?= 9.0.4.0
2424
# be installed. The default value is derived from MQ_VERSION, BASE_IMAGE and architecture
2525
# Does not apply to MQ Advanced for Developers.
2626
MQ_ARCHIVE ?= IBM_MQ_$(MQ_VERSION)_$(MQ_ARCHIVE_TYPE)_$(MQ_ARCHIVE_ARCH).tar.gz
27+
# MQ_ARCHIVE_DEV is the name of the file, under the downloads directory, from which MQ Advanced
28+
# for Developers can be installed
29+
MQ_ARCHIVE_DEV ?= $(MQ_ARCHIVE_DEV_$(MQ_VERSION))
2730
# Options to `go test` for the Docker tests
2831
TEST_OPTS_DOCKER ?=
2932
# Options to `go test` for the Kubernetes tests
@@ -68,9 +71,6 @@ endif
6871
# Archive names for IBM MQ Advanced for Developers for Ubuntu
6972
MQ_ARCHIVE_DEV_9.0.3.0=mqadv_dev903_ubuntu_x86-64.tar.gz
7073
MQ_ARCHIVE_DEV_9.0.4.0=mqadv_dev904_ubuntu_x86-64.tar.gz
71-
# MQ_ARCHIVE_DEV is the name of the file, under the downloads directory, from which MQ Advanced
72-
# for Developers can be installed
73-
MQ_ARCHIVE_DEV=$(MQ_ARCHIVE_DEV_$(MQ_VERSION))
7474

7575
###############################################################################
7676
# Build targets
@@ -134,13 +134,13 @@ test-unit:
134134

135135
.PHONY: test-advancedserver
136136
test-advancedserver: test/docker/vendor
137-
$(info $(SPACER)$(shell printf $(TITLE)"Test $(DOCKER_FULL_ADVANCEDSERVER) on Docker"$(END)))
137+
$(info $(SPACER)$(shell printf $(TITLE)"Test $(MQ_IMAGE_ADVANCEDSERVER) on Docker"$(END)))
138138
cd test/docker && TEST_IMAGE=$(MQ_IMAGE_ADVANCEDSERVER) go test -parallel $(NUM_CPU) $(TEST_OPTS_DOCKER)
139139

140140
.PHONY: test-devserver
141141
test-devserver: test/docker/vendor
142-
$(info $(SPACER)$(shell printf $(TITLE)"Test $(DOCKER_FULL_DEVSERVER) on Docker"$(END)))
143-
cd test/docker && TEST_IMAGE=$(MQ_IMAGE_DEVSERVER) go test -parallel $(NUM_CPU) $(TEST_OPTS_DOCKER)
142+
$(info $(SPACER)$(shell printf $(TITLE)"Test $(MQ_IMAGE_DEVSERVER) on Docker"$(END)))
143+
cd test/docker && TEST_IMAGE=$(MQ_IMAGE_DEVSERVER) go test -parallel $(NUM_CPU) -tags mqdev $(TEST_OPTS_DOCKER)
144144

145145
.PHONY: test-advancedserver-cover
146146
test-advancedserver-cover: test/docker/vendor
@@ -218,11 +218,13 @@ build-advancedserver: downloads/$(MQ_ARCHIVE) docker-version
218218
$(call docker-build-mq,$(MQ_IMAGE_ADVANCEDSERVER),Dockerfile-server,$(MQ_ARCHIVE),"4486e8c4cc9146fd9b3ce1f14a2dfc5b","IBM MQ Advanced",$(MQ_VERSION))
219219

220220
.PHONY: build-devserver
221+
# Target-specific variable to add web server into devserver image
222+
build-devserver: MQ_PACKAGES=ibmmq-server ibmmq-java ibmmq-jre ibmmq-gskit ibmmq-msg-.* ibmmq-samples ibmmq-ams ibmmq-web
221223
build-devserver: downloads/$(MQ_ARCHIVE_DEV) docker-version
222224
@test "$(shell uname -m)" = "x86_64" || (echo "Error: MQ Advanced for Developers is only available for x86_64 architecture" && exit 1)
223225
$(info $(shell printf $(TITLE)"Build $(MQ_IMAGE_DEVSERVER_BASE)"$(END)))
224226
$(call docker-build-mq,$(MQ_IMAGE_DEVSERVER_BASE),Dockerfile-server,$(MQ_ARCHIVE_DEV),"98102d16795c4263ad9ca075190a2d4d","IBM MQ Advanced for Developers (Non-Warranted)",$(MQ_VERSION))
225-
docker build --tag $(MQ_IMAGE_DEVSERVER) incubating/mqadvanced-server-dev
227+
docker build --tag $(MQ_IMAGE_DEVSERVER) --file incubating/mqadvanced-server-dev/Dockerfile .
226228

227229
.PHONY: build-advancedserver-cover
228230
build-advancedserver-cover: docker-version

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ In order to use the image, it is necessary to accept the terms of the IBM MQ lic
1919
* **LICENSE** - Set this to `accept` to agree to the MQ Advanced for Developers license. If you wish to see the license you can set this to `view`.
2020
* **LANG** - Set this to the language you would like the license to be printed in.
2121
* **MQ_QMGR_NAME** - Set this to the name you want your Queue Manager to be created with.
22-
* **LOG_FORMAT** - Set this to change the format of the logs which are printed on the container's stdout. Set to "json" to use JSON format (JSON object per line); set to "basic" to use a simple human-readable. Defaults to "basic".
22+
* **LOG_FORMAT** - Set this to change the format of the logs which are printed on the container's stdout. Set to "json" to use JSON format (JSON object per line); set to "basic" to use a simple human-readable format. Defaults to "basic".
2323

2424

2525
# Issues and contributions

cmd/runmqdevserver/main.go

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
/*
2+
© Copyright IBM Corporation 2018
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
package main
17+
18+
import (
19+
"fmt"
20+
"io/ioutil"
21+
"os"
22+
"os/exec"
23+
"syscall"
24+
25+
"github.com/ibm-messaging/mq-container/internal/command"
26+
"github.com/ibm-messaging/mq-container/internal/logger"
27+
"github.com/ibm-messaging/mq-container/internal/name"
28+
)
29+
30+
var log *logger.Logger
31+
32+
func setPassword(user string, password string) error {
33+
cmd := exec.Command("chpasswd")
34+
stdin, err := cmd.StdinPipe()
35+
if err != nil {
36+
return err
37+
}
38+
fmt.Fprintf(stdin, "%s:%s", user, password)
39+
stdin.Close()
40+
_, _, err = command.RunCmd(cmd)
41+
if err != nil {
42+
return err
43+
}
44+
log.Printf("Set password for \"%v\" user", user)
45+
return nil
46+
}
47+
48+
func getLogFormat() string {
49+
return os.Getenv("LOG_FORMAT")
50+
}
51+
52+
func getDebug() bool {
53+
debug := os.Getenv("DEBUG")
54+
if debug == "true" || debug == "1" {
55+
return true
56+
}
57+
return false
58+
}
59+
60+
func configureLogger() error {
61+
var err error
62+
f := getLogFormat()
63+
d := getDebug()
64+
n, err := name.GetQueueManagerName()
65+
if err != nil {
66+
return err
67+
}
68+
switch f {
69+
case "json":
70+
log, err = logger.NewLogger(os.Stderr, d, true, n)
71+
if err != nil {
72+
return err
73+
}
74+
case "basic":
75+
log, err = logger.NewLogger(os.Stderr, d, false, n)
76+
if err != nil {
77+
return err
78+
}
79+
default:
80+
log, err = logger.NewLogger(os.Stdout, d, false, n)
81+
return fmt.Errorf("invalid value for LOG_FORMAT: %v", f)
82+
}
83+
return nil
84+
}
85+
86+
func logTerminationf(format string, args ...interface{}) {
87+
logTermination(fmt.Sprintf(format, args))
88+
}
89+
90+
// TODO: Duplicated code
91+
func logTermination(args ...interface{}) {
92+
msg := fmt.Sprint(args)
93+
// Write the message to the termination log. This is the default place
94+
// that Kubernetes will look for termination information.
95+
log.Debugf("Writing termination message: %v", msg)
96+
err := ioutil.WriteFile("/dev/termination-log", []byte(msg), 0660)
97+
if err != nil {
98+
log.Debug(err)
99+
}
100+
log.Error(msg)
101+
}
102+
103+
func doMain() error {
104+
err := configureLogger()
105+
if err != nil {
106+
logTermination(err)
107+
return err
108+
}
109+
adminPassword, set := os.LookupEnv("MQ_ADMIN_PASSWORD")
110+
if set {
111+
err = setPassword("admin", adminPassword)
112+
if err != nil {
113+
logTerminationf("Error setting admin password: %v", err)
114+
return err
115+
}
116+
}
117+
appPassword, set := os.LookupEnv("MQ_APP_PASSWORD")
118+
if set {
119+
err = setPassword("app", appPassword)
120+
if err != nil {
121+
logTerminationf("Error setting app password: %v", err)
122+
return err
123+
}
124+
}
125+
126+
err = updateMQSC(set)
127+
if err != nil {
128+
logTerminationf("Error updating MQSC: %v", err)
129+
return err
130+
}
131+
132+
return nil
133+
}
134+
135+
var osExit = os.Exit
136+
137+
func main() {
138+
err := doMain()
139+
if err != nil {
140+
osExit(1)
141+
} else {
142+
// Replace this process with runmqserver
143+
syscall.Exec("/usr/local/bin/runmqserver", []string{"runmqserver"}, os.Environ())
144+
}
145+
}

cmd/runmqdevserver/mqsc.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/*
2+
© Copyright IBM Corporation 2018
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
package main
17+
18+
import (
19+
"html/template"
20+
"os"
21+
)
22+
23+
func updateMQSC(appPasswordRequired bool) error {
24+
var checkClient string
25+
if appPasswordRequired {
26+
checkClient = "REQUIRED"
27+
} else {
28+
checkClient = "ASQMGR"
29+
}
30+
const mqsc string = "/etc/mqm/dev.mqsc"
31+
if os.Getenv("MQ_DEV") == "true" {
32+
const mqscTemplate string = mqsc + ".tpl"
33+
// Re-configure channel if app password not set
34+
t, err := template.ParseFiles(mqscTemplate)
35+
if err != nil {
36+
log.Error(err)
37+
return err
38+
}
39+
f, err := os.OpenFile(mqsc, os.O_CREATE|os.O_WRONLY, 0660)
40+
defer f.Close()
41+
err = t.Execute(f, map[string]string{"ChckClnt": checkClient})
42+
if err != nil {
43+
log.Error(err)
44+
return err
45+
}
46+
// TODO: Lookup value for MQM user here?
47+
err = os.Chown(mqsc, 999, 999)
48+
if err != nil {
49+
log.Error(err)
50+
return err
51+
}
52+
// os.Remove(mqscTemplate)
53+
} else {
54+
os.Remove(mqsc)
55+
}
56+
return nil
57+
}

cmd/runmqserver/logging.go

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -89,23 +89,33 @@ func getDebug() bool {
8989
return false
9090
}
9191

92-
func configureLogger() (mirrorFunc, error) {
92+
func configureLogger(name string) (mirrorFunc, error) {
93+
var err error
9394
f := getLogFormat()
9495
d := getDebug()
9596
switch f {
9697
case "json":
97-
log = logger.NewLogger(os.Stderr, d, true)
98+
log, err = logger.NewLogger(os.Stderr, d, true, name)
99+
if err != nil {
100+
return nil, err
101+
}
98102
return log.LogDirect, nil
99103
case "basic":
100-
log = logger.NewLogger(os.Stderr, d, false)
104+
log, err = logger.NewLogger(os.Stderr, d, false, name)
105+
if err != nil {
106+
return nil, err
107+
}
101108
return func(msg string) {
102109
// Parse the JSON message, and print a simplified version
103110
var obj map[string]interface{}
104111
json.Unmarshal([]byte(msg), &obj)
105112
fmt.Printf(formatSimple(obj["ibm_datetime"].(string), obj["message"].(string)))
106113
}, nil
107114
default:
108-
log = logger.NewLogger(os.Stdout, d, false)
115+
log, err = logger.NewLogger(os.Stdout, d, false, name)
116+
if err != nil {
117+
return nil, err
118+
}
109119
return nil, fmt.Errorf("invalid value for LOG_FORMAT: %v", f)
110120
}
111121
}

cmd/runmqserver/main.go

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,17 +28,17 @@ import (
2828
)
2929

3030
func doMain() error {
31-
mf, err := configureLogger()
31+
name, nameErr := name.GetQueueManagerName()
32+
mf, err := configureLogger(name)
3233
if err != nil {
3334
logTermination(err)
3435
return err
3536
}
36-
err = ready.Clear()
37-
if err != nil {
37+
if nameErr != nil {
3838
logTermination(err)
3939
return err
4040
}
41-
name, err := name.GetQueueManagerName()
41+
err = ready.Clear()
4242
if err != nil {
4343
logTermination(err)
4444
return err
@@ -68,6 +68,12 @@ func doMain() error {
6868
if err != nil {
6969
return err
7070
}
71+
72+
err = postInit(name)
73+
if err != nil {
74+
return err
75+
}
76+
7177
newQM, err := createQueueManager(name)
7278
if err != nil {
7379
logTermination(err)

cmd/runmqserver/main_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ const filename = "/var/coverage/exitCode"
3131

3232
func init() {
3333
test = flag.Bool("test", false, "Set to true when running tests for coverage")
34-
log = logger.NewLogger(os.Stdout, true, false)
34+
log, _ = logger.NewLogger(os.Stdout, true, false, "test")
3535
}
3636

3737
// Test started when the test binary is started. Only calls main.

cmd/runmqserver/mirror.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,9 @@ func mirrorAvailableMessages(f *os.File, mf mirrorFunc) {
6161
mf(t)
6262
count++
6363
}
64-
log.Debugf("Mirrored %v log entries from %v", count, f.Name())
64+
if count > 0 {
65+
log.Debugf("Mirrored %v log entries from %v", count, f.Name())
66+
}
6567
err := scanner.Err()
6668
if err != nil {
6769
log.Errorf("Error reading file %v: %v", f.Name(), err)

cmd/runmqserver/post_init_dev.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// +build mqdev
2+
3+
/*
4+
© Copyright IBM Corporation 2018
5+
6+
Licensed under the Apache License, Version 2.0 (the "License");
7+
you may not use this file except in compliance with the License.
8+
You may obtain a copy of the License at
9+
10+
http://www.apache.org/licenses/LICENSE-2.0
11+
12+
Unless required by applicable law or agreed to in writing, software
13+
distributed under the License is distributed on an "AS IS" BASIS,
14+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
See the License for the specific language governing permissions and
16+
limitations under the License.
17+
*/
18+
package main
19+
20+
import "os"
21+
22+
// postInit is run after /var/mqm is set up
23+
// This version of postInit is only included as part of the MQ Advanced for Developers build
24+
func postInit(name string) error {
25+
disable := os.Getenv("MQ_DISABLE_WEB_CONSOLE")
26+
if disable != "true" && disable != "1" {
27+
// Configure and start the web server, in the background (if installed)
28+
// WARNING: No error handling or health checking available for the web server,
29+
// which is why it's limited to use with MQ Advanced for Developers only
30+
go func() {
31+
configureWebServer()
32+
startWebServer()
33+
}()
34+
}
35+
return nil
36+
}

0 commit comments

Comments
 (0)