adding new attribute lock (#8)

This commit is contained in:
Julien Neuhart
2018-05-16 12:06:30 +02:00
committed by GitHub
parent 5100693789
commit e3366d0b62
16 changed files with 97 additions and 2 deletions

View File

@@ -14,6 +14,11 @@ logs:
# You may provide here your own implementation!
commands:
# Some libraries like unoconv cannot perform concurrent conversions. That's why the API does only one conversion at a time.
# If your current implementation uses libraries which are able to perform concurrent conversions, you may
# change this value to false.
lock: true
# Unlike others commands' templates, you have access to FilesPaths instead of FilePath: it gathers all PDF files which should be merged.
merge:
template: "pdftk {{ range $filePath := .FilesPaths }} {{ $filePath }} {{ end }} cat output {{ .ResultFilePath }}"

View File

@@ -6,6 +6,7 @@ logs:
...
}
commands:
lock: true
merge:
template: "pdftk {{ range $filePath := .FilesPaths }} {{ $filePath }} {{ end }} cat output {{ .ResultFilePath }}"
interpreter: "/bin/sh -c"

View File

@@ -3,6 +3,7 @@ logs:
level: "DEBUG"
formatter: "text"
commands:
lock: true
merge:
template: "pdftk {{ range $filePath := .FilesPaths }} {{ $filePath }} {{ end }} cat output {{ .ResultFilePath }}"
interpreter: "/bin/sh -c"

View File

@@ -3,6 +3,7 @@ logs:
level: "DEBUG"
formatter: "text"
commands:
lock: true
merge:
template: "pdftk {{ range $filePath := .FilesPaths }} {{ $filePath }} {{ end }} cat output {{ .ResultFilePath }}"
interpreter: "/bin/sh -c"

View File

@@ -3,6 +3,7 @@ logs:
level: "DEBUG"
formatter: "text"
commands:
lock: true
merge:
template: "pdftk {{ range $filePath := .FilesPaths }} {{ $filePath }} {{ end }} cat output {{ .ResultFilePath }}"
interpreter: "/bin/sh -c"

View File

@@ -0,0 +1,35 @@
port: 3000
logs:
level: "DEBUG"
formatter: "text"
commands:
lock: false
merge:
template: "pdftk {{ range $filePath := .FilesPaths }} {{ $filePath }} {{ end }} cat output {{ .ResultFilePath }}"
interpreter: "/bin/sh -c"
timeout: 30
conversions:
- template: "markdown-pdf {{ .FilePath }} -o {{ .ResultFilePath }}"
interpreter: "/bin/sh -c"
timeout: 30
extensions:
- ".md"
- template: "xvfb-run -e /dev/stdout wkhtmltopdf {{ .FilePath }} {{ .ResultFilePath }}"
interpreter: "/bin/sh -c"
timeout: 30
extensions:
- ".html"
- ".htm"
- template: "unoconv --format pdf --output \"{{ .ResultFilePath }}\" \"{{ .FilePath }}\""
interpreter: "/bin/sh -c"
timeout: 30
extensions:
- ".doc"
- ".docx"
- ".odt"
- ".xls"
- ".xlsx"
- ".ods"
- ".ppt"
- ".pptx"
- ".odp"

View File

@@ -3,6 +3,7 @@ logs:
level: "DEBUG"
formatter: "text"
commands:
lock: true
merge:
template: "pdftk {{ range $filePath := .FilesPaths }} {{ $filePath }} {{ end }} cat output {{ .ResultFilePath }}"
interpreter: "/bin/sh -c"

View File

@@ -3,6 +3,7 @@ logs:
level: "DEBUG"
formatter: "text"
commands:
lock: true
merge:
template: "pdftk {{ range $filePath := .FilesPaths }} {{ $filePath }} {{ end }} cat output {{ .ResultFilePath }}"
interpreter: "/bin/sh -c"

View File

@@ -3,6 +3,7 @@ logs:
level: "DEBUG"
formatter: "DEBUG"
commands:
lock: true
merge:
template: "pdftk {{ range $filePath := .FilesPaths }} {{ $filePath }} {{ end }} cat output {{ .ResultFilePath }}"
interpreter: "/bin/sh -c"

View File

@@ -3,6 +3,7 @@ logs:
level: "text"
formatter: "text"
commands:
lock: true
merge:
template: "pdftk {{ range $filePath := .FilesPaths }} {{ $filePath }} {{ end }} cat output {{ .ResultFilePath }}"
interpreter: "/bin/sh -c"

View File

@@ -3,6 +3,7 @@ logs:
level: "DEBUG"
formatter: "text"
commands:
lock: true
merge:
template: "pdftk {{ range $filePath := FilesPaths }} {{ $filePath }} {{ end }} cat output {{ .ResultFilePath }}"
interpreter: "/bin/sh -c"

View File

@@ -20,6 +20,7 @@ type (
port string
logsLevel logrus.Level
logsFormatter logrus.Formatter
lock bool
// commands associates a file extension with a Command instance.
// Particular case: ".pdf" extension is used for the merge command.
commands map[string]*Command
@@ -126,6 +127,16 @@ func GetLogsFormatter() logrus.Formatter {
return config.logsFormatter
}
// WithLock sets the lock strategy.
func WithLock(lock bool) {
config.lock = lock
}
// HasLock returns the current lock strategy.
func HasLock() bool {
return config.lock
}
type interpreterEmptyError struct {
command string
}

View File

@@ -99,6 +99,24 @@ func TestGetLogsFormatter(t *testing.T) {
}
}
func TestWithLock(t *testing.T) {
lock := true
WithLock(lock)
if config.lock != lock {
t.Errorf("Configuration populated with a wrong lock strategy: got '%t' want '%t'", config.lock, lock)
}
}
func TestHasLock(t *testing.T) {
lock := true
config.lock = true
if HasLock() != lock {
t.Errorf("Configuration returned a wrong port: got '%t' want '%t'", HasLock(), lock)
}
}
func TestInterpreterEmptyError(t *testing.T) {
err := &interpreterEmptyError{"echo hello world"}
expected := fmt.Sprintf(interpreterEmptyErrorMessage, err.command)

View File

@@ -23,6 +23,8 @@ func ParseFile(configurationFilePath string) error {
return err
}
WithLock(fileConfig.Commands.Lock)
// handles merge command first...
cmd, err := NewCommand(fileConfig.Commands.Merge.Template, fileConfig.Commands.Merge.Interpreter, fileConfig.Commands.Merge.Timeout)
if err != nil {
@@ -57,6 +59,7 @@ type (
Formatter string `yaml:"formatter"`
} `yaml:"logs"`
Commands struct {
Lock bool `yaml:"lock"`
Merge *mergeCommand `yaml:"merge"`
Conversions []*conversionCommand `yaml:"conversions,omitempty"`
} `yaml:"commands"`

View File

@@ -33,8 +33,12 @@ func (e *commandTimeoutError) Error() string {
// run runs the given command. If timeout is reached or
// something bad happened, returns an error.
func (r *runner) run(command string, interpreter []string, timeout int) error {
r.mu.Lock()
defer r.mu.Unlock()
if config.HasLock() {
r.mu.Lock()
defer r.mu.Unlock()
} else {
logger.Warn("lock disabled")
}
binary := interpreter[0]
parameters := append(interpreter[1:], command)

View File

@@ -41,6 +41,8 @@ func TestCommandTimeoutError(t *testing.T) {
func TestRun(t *testing.T) {
var cmd string
load("../../../_tests/configurations/gotenberg.yml")
// case 1: uses a simple command.
cmd = "echo Hello world"
if err := forest.run(cmd, strings.Fields("/bin/sh -c"), 30); err != nil {
@@ -58,6 +60,14 @@ func TestRun(t *testing.T) {
if err := forest.run(cmd, strings.Fields("/bin/sh -c"), 30); err == nil {
t.Errorf("Command '%s' should not have worked", cmd)
}
load("../../../_tests/configurations/no-lock-gotenberg.yml")
// case 4: uses a configuration with a no lock strategy.
cmd = "echo Hello world"
if err := forest.run(cmd, strings.Fields("/bin/sh -c"), 30); err != nil {
t.Errorf("Command '%s' should have worked", cmd)
}
}
func TestUnconv(t *testing.T) {