annotate pkg/misc/tmpfiles.go @ 5591:0011f50cf216 surveysperbottleneckid

Removed no longer used alternative api for surveys/ endpoint. As bottlenecks in the summary for SR imports are now identified by their id and no longer by the (not guarantied to be unique!) name, there is no longer the need to request survey data by the name+date tuple (which isn't reliable anyway). So the workaround was now reversed.
author Sascha Wilde <wilde@sha-bang.de>
date Wed, 06 Apr 2022 13:30:29 +0200
parents 5f47eeea988d
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1221
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1 // This is Free Software under GNU Affero General Public License v >= 3.0
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
2 // without warranty, see README.md and license for details.
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
3 //
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
4 // SPDX-License-Identifier: AGPL-3.0-or-later
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
5 // License-Filename: LICENSES/AGPL-3.0.txt
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
6 //
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
7 // Copyright (C) 2018 by via donau
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
8 // – Österreichische Wasserstraßen-Gesellschaft mbH
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
9 // Software engineering by Intevation GmbH
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
10 //
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
11 // Author(s):
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
12 // * Sascha L. Teichmann <sascha.teichmann@intevation.de>
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
13
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
14 package misc
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
15
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
16 import (
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
17 "encoding/hex"
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
18 "os"
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
19 "path/filepath"
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
20 "sort"
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
21 "sync"
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
22 "time"
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
23
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
24 "gemma.intevation.de/gemma/pkg/common"
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
25 "gemma.intevation.de/gemma/pkg/config"
5490
5f47eeea988d Use own logging package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1371
diff changeset
26 "gemma.intevation.de/gemma/pkg/log"
1221
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
27 )
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
28
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
29 const (
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
30 tmpFilesDir = "tmpfiles"
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
31 maxTmpFiles = 100
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
32 maxTmpFileAge = 45 * time.Minute
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
33 tmpfilesCleanUp = 15 * time.Minute
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
34 )
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
35
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
36 var tmpfilesMu sync.Mutex
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
37
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
38 func init() {
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
39 go func() {
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
40 config.WaitReady()
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
41 for {
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
42 if err := cleanupTmpFiles(); err != nil {
5490
5f47eeea988d Use own logging package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1371
diff changeset
43 log.Errorf("%v\n", err)
1221
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
44 }
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
45 time.Sleep(tmpfilesCleanUp)
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
46 }
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
47 }()
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
48 }
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
49
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
50 func tmpfilesDir() string {
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
51 dir := config.TmpDir()
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
52 if dir == "" {
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
53 dir = os.TempDir()
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
54 }
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
55 return filepath.Join(dir, tmpFilesDir)
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
56 }
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
57
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
58 func cleanupTmpFiles() error {
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
59 tmpfilesMu.Lock()
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
60 defer tmpfilesMu.Unlock()
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
61
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
62 tmp := tmpfilesDir()
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
63
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
64 _, err := os.Stat(tmp)
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
65 switch {
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
66 case os.IsNotExist(err):
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
67 return nil
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
68 case err != nil:
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
69 return err
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
70 }
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
71
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
72 f, err := os.Open(tmp)
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
73 if err != nil {
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
74 return err
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
75 }
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
76
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
77 files, err := f.Readdir(-1)
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
78 f.Close()
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
79 if err != nil {
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
80 return err
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
81 }
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
82
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
83 bestBefore := time.Now().Add(-maxTmpFileAge)
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
84
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
85 var errs []error
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
86 var deleted int
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
87
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
88 for _, fi := range files {
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
89 if fi.ModTime().Before(bestBefore) {
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
90 fname := filepath.Join(tmp, fi.Name())
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
91 if err := os.RemoveAll(fname); err != nil {
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
92 errs = append(errs, err)
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
93 } else {
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
94 deleted++
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
95 }
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
96 }
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
97 }
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
98
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
99 // If empty remove temp folder.
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
100 if deleted == len(files) {
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
101 if err := os.RemoveAll(tmp); err != nil {
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
102 errs = append(errs, err)
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
103 }
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
104 }
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
105
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
106 if len(errs) > 0 {
1224
bc4b642c8d04 Started with an upload sounding result to temp upload area.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1221
diff changeset
107 return common.ToError(errs)
1221
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
108 }
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
109
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
110 return nil
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
111 }
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
112
1371
5b9b8eabcd01 Backend: Added the API documentation of the misc package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1228
diff changeset
113 // DeleteTempFile deletes a file identified by its token
5b9b8eabcd01 Backend: Added the API documentation of the misc package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1228
diff changeset
114 // from the special folder of temporary files.
1228
17131f0f9fcb Added endpoint to explicitly delete a temp upload.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1224
diff changeset
115 func DeleteTempFile(token string) error {
17131f0f9fcb Added endpoint to explicitly delete a temp upload.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1224
diff changeset
116 tmpfilesMu.Lock()
17131f0f9fcb Added endpoint to explicitly delete a temp upload.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1224
diff changeset
117 defer tmpfilesMu.Unlock()
17131f0f9fcb Added endpoint to explicitly delete a temp upload.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1224
diff changeset
118 tmp := tmpfilesDir()
17131f0f9fcb Added endpoint to explicitly delete a temp upload.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1224
diff changeset
119 return os.RemoveAll(filepath.Join(tmp, token))
17131f0f9fcb Added endpoint to explicitly delete a temp upload.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1224
diff changeset
120 }
17131f0f9fcb Added endpoint to explicitly delete a temp upload.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1224
diff changeset
121
1371
5b9b8eabcd01 Backend: Added the API documentation of the misc package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1228
diff changeset
122 // UnmakeTempFile moves a file identified by a token
5b9b8eabcd01 Backend: Added the API documentation of the misc package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1228
diff changeset
123 // back from the special folder to a normal path.
5b9b8eabcd01 Backend: Added the API documentation of the misc package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1228
diff changeset
124 // This only will succeed if the token is not expired.
1221
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
125 func UnmakeTempFile(token, path string) error {
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
126 tmpfilesMu.Lock()
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
127 defer tmpfilesMu.Unlock()
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
128 tmp := tmpfilesDir()
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
129 return os.Rename(filepath.Join(tmp, token), path)
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
130 }
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
131
1371
5b9b8eabcd01 Backend: Added the API documentation of the misc package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1228
diff changeset
132 // MakeTempFile moves a file into a special temporary file folder
5b9b8eabcd01 Backend: Added the API documentation of the misc package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1228
diff changeset
133 // and returns a token for later accessing the file again.
5b9b8eabcd01 Backend: Added the API documentation of the misc package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1228
diff changeset
134 // Files in this special folder are only quaranteed to be
5b9b8eabcd01 Backend: Added the API documentation of the misc package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1228
diff changeset
135 // kept alive among of time. After this time expires file
5b9b8eabcd01 Backend: Added the API documentation of the misc package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1228
diff changeset
136 // will be likely to be deleted. There are only a limited
5b9b8eabcd01 Backend: Added the API documentation of the misc package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1228
diff changeset
137 // amount of temporary files allowed. If you push more
5b9b8eabcd01 Backend: Added the API documentation of the misc package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1228
diff changeset
138 // files into the special folder the oldest will be erased.
1221
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
139 func MakeTempFile(fname string) (string, error) {
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
140 tmpfilesMu.Lock()
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
141 defer tmpfilesMu.Unlock()
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
142
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
143 tmp := tmpfilesDir()
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
144
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
145 _, err := os.Stat(tmp)
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
146 switch {
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
147 case os.IsNotExist(err):
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
148 if err := os.MkdirAll(tmp, 0700); err != nil {
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
149 return "", err
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
150 }
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
151 case err != nil:
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
152 return "", err
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
153 }
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
154
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
155 f, err := os.Open(tmp)
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
156 if err != nil {
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
157 return "", err
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
158 }
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
159
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
160 files, err := f.Readdir(-1)
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
161 f.Close()
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
162 if err != nil {
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
163 return "", err
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
164 }
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
165
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
166 // If there are too many throw away old.
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
167 if len(files) >= maxTmpFiles {
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
168 sort.Slice(files, func(i, j int) bool {
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
169 return files[i].ModTime().Before(files[j].ModTime())
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
170 })
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
171
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
172 var errs []error
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
173 for len(files) >= maxTmpFiles {
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
174 fname := filepath.Join(tmp, files[0].Name())
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
175 if err := os.RemoveAll(fname); err != nil {
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
176 errs = append(errs, err)
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
177 }
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
178 files = files[1:]
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
179 }
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
180 if len(errs) > 0 {
1224
bc4b642c8d04 Started with an upload sounding result to temp upload area.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1221
diff changeset
181 return "", common.ToError(errs)
1221
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
182 }
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
183 }
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
184
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
185 var token string
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
186 again:
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
187 token = generateToken()
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
188 for _, f := range files {
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
189 if f.Name() == token {
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
190 goto again
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
191 }
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
192 }
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
193 err = os.Rename(fname, filepath.Join(tmp, token))
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
194 return token, err
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
195 }
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
196
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
197 func generateToken() string {
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
198 return hex.EncodeToString(common.GenerateRandomKey(20))
c193649d4f11 Add an area for temp uploads on the server to be addressed
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
199 }