diff --git a/model/file.go b/model/file.go index e13e5e756..d30405650 100644 --- a/model/file.go +++ b/model/file.go @@ -13,11 +13,11 @@ type FileStore interface { // File represents a pipeline artifact. type File struct { ID int64 `json:"id" meddler:"file_id,pk"` - BuildID int64 `json:"build_id" meddler:"file_build_id"` + BuildID int64 `json:"-" meddler:"file_build_id"` ProcID int64 `json:"proc_id" meddler:"file_proc_id"` + PID int `json:"pid" meddler:"file_pid"` Name string `json:"name" meddler:"file_name"` Size int `json:"size" meddler:"file_size"` Mime string `json:"mime" meddler:"file_mime"` Time int64 `json:"time" meddler:"file_time"` - // Data []byte `json:"data" meddler:"file_data"` } diff --git a/router/router.go b/router/router.go index 17dd0e384..fed80de03 100644 --- a/router/router.go +++ b/router/router.go @@ -73,6 +73,9 @@ func Load(middleware ...gin.HandlerFunc) http.Handler { repo.GET("/builds/:number", server.GetBuild) repo.GET("/logs/:number/:ppid/:proc", server.GetBuildLogs) + repo.GET("/files/:number", server.FileList) + repo.GET("/files/:number/:proc/*file", server.FileGet) + // requires push permissions repo.GET("/secrets", session.MustPush, server.GetSecretList) repo.POST("/secrets", session.MustPush, server.PostSecret) diff --git a/server/file.go b/server/file.go new file mode 100644 index 000000000..f360c82d4 --- /dev/null +++ b/server/file.go @@ -0,0 +1,96 @@ +package server + +import ( + "io" + "net/http" + "strconv" + "strings" + + "github.com/drone/drone/router/middleware/session" + "github.com/drone/drone/store" + "github.com/gin-gonic/gin" +) + +// FileList gets a list file by build. +func FileList(c *gin.Context) { + num, err := strconv.Atoi(c.Param("number")) + if err != nil { + c.AbortWithError(http.StatusBadRequest, err) + return + } + + repo := session.Repo(c) + build, err := store.FromContext(c).GetBuildNumber(repo, num) + if err != nil { + c.AbortWithError(http.StatusInternalServerError, err) + return + } + + files, err := store.FromContext(c).FileList(build) + if err != nil { + c.AbortWithError(http.StatusInternalServerError, err) + return + } + + c.JSON(200, files) +} + +// FileGet gets a file by process and name +func FileGet(c *gin.Context) { + var ( + repo = session.Repo(c) + name = strings.TrimPrefix(c.Param("file"), "/") + raw = func() bool { + return c.DefaultQuery("raw", "false") == "true" + }() + ) + + num, err := strconv.Atoi(c.Param("number")) + if err != nil { + c.AbortWithError(http.StatusBadRequest, err) + return + } + + pid, err := strconv.Atoi(c.Param("proc")) + if err != nil { + c.AbortWithError(http.StatusBadRequest, err) + return + } + + build, err := store.FromContext(c).GetBuildNumber(repo, num) + if err != nil { + c.AbortWithError(http.StatusInternalServerError, err) + return + } + + proc, err := store.FromContext(c).ProcFind(build, pid) + if err != nil { + c.AbortWithError(http.StatusInternalServerError, err) + return + } + + file, err := store.FromContext(c).FileFind(proc, name) + if err != nil { + c.String(404, "Error getting file %q. %s", name, err) + return + } + + if !raw { + c.JSON(200, file) + return + } + + rc, err := store.FromContext(c).FileRead(proc, file.Name) + if err != nil { + c.String(404, "Error getting file stream %q. %s", name, err) + return + } + defer rc.Close() + + switch file.Mime { + case "application/vnd.drone.test+json": + c.Header("Content-Type", "application/json") + } + + io.Copy(c.Writer, rc) +} diff --git a/server/rpc.go b/server/rpc.go index 57637d9fa..3c8650df5 100644 --- a/server/rpc.go +++ b/server/rpc.go @@ -235,6 +235,7 @@ func (s *RPC) Upload(c context.Context, id string, file *rpc.File) error { return Config.Storage.Files.FileCreate(&model.File{ BuildID: proc.BuildID, ProcID: proc.ID, + PID: proc.PID, Mime: file.Mime, Name: file.Name, Size: file.Size, diff --git a/server/sync.go b/server/sync.go index adac83a7a..899c9e0a1 100644 --- a/server/sync.go +++ b/server/sync.go @@ -20,7 +20,7 @@ type syncer struct { } func (s *syncer) Sync(user *model.User) error { - unix := time.Now().Unix() - 1 // force immediate expiration + unix := time.Now().Unix() - (3601) // force immediate expiration. note 1 hour expiration is hard coded at the moment repos, err := s.remote.Repos(user) if err != nil { return err diff --git a/store/datastore/ddl/mysql/ddl_gen.go b/store/datastore/ddl/mysql/ddl_gen.go index ac12494a3..49eac7355 100644 --- a/store/datastore/ddl/mysql/ddl_gen.go +++ b/store/datastore/ddl/mysql/ddl_gen.go @@ -136,6 +136,10 @@ var migrations = []struct { name: "create-index-perms-user", stmt: createIndexPermsUser, }, + { + name: "alter-table-add-file-pid", + stmt: alterTableAddFilePid, + }, } // Migrate performs the database migration. If the migration fails @@ -575,3 +579,11 @@ CREATE INDEX ix_perms_repo ON perms (perm_repo_id); var createIndexPermsUser = ` CREATE INDEX ix_perms_user ON perms (perm_user_id); ` + +// +// 018_add_column_file_pid.sql +// + +var alterTableAddFilePid = ` +ALTER TABLE files ADD COLUMN file_pid INTEGER +` diff --git a/store/datastore/ddl/mysql/files/018_add_column_file_pid.sql b/store/datastore/ddl/mysql/files/018_add_column_file_pid.sql new file mode 100644 index 000000000..f12f18b3d --- /dev/null +++ b/store/datastore/ddl/mysql/files/018_add_column_file_pid.sql @@ -0,0 +1,3 @@ +-- name: alter-table-add-file-pid + +ALTER TABLE files ADD COLUMN file_pid INTEGER diff --git a/store/datastore/ddl/postgres/ddl_gen.go b/store/datastore/ddl/postgres/ddl_gen.go index d3416b31e..47fbd2b3c 100644 --- a/store/datastore/ddl/postgres/ddl_gen.go +++ b/store/datastore/ddl/postgres/ddl_gen.go @@ -136,6 +136,10 @@ var migrations = []struct { name: "create-index-perms-user", stmt: createIndexPermsUser, }, + { + name: "alter-table-add-file-pid", + stmt: alterTableAddFilePid, + }, } // Migrate performs the database migration. If the migration fails @@ -575,3 +579,11 @@ CREATE INDEX IF NOT EXISTS ix_perms_repo ON perms (perm_repo_id); var createIndexPermsUser = ` CREATE INDEX IF NOT EXISTS ix_perms_user ON perms (perm_user_id); ` + +// +// 018_add_column_file_pid.sql +// + +var alterTableAddFilePid = ` +ALTER TABLE files ADD COLUMN file_pid INTEGER +` diff --git a/store/datastore/ddl/postgres/files/018_add_column_file_pid.sql b/store/datastore/ddl/postgres/files/018_add_column_file_pid.sql new file mode 100644 index 000000000..f12f18b3d --- /dev/null +++ b/store/datastore/ddl/postgres/files/018_add_column_file_pid.sql @@ -0,0 +1,3 @@ +-- name: alter-table-add-file-pid + +ALTER TABLE files ADD COLUMN file_pid INTEGER diff --git a/store/datastore/ddl/sqlite/ddl_gen.go b/store/datastore/ddl/sqlite/ddl_gen.go index 5a0db2657..82e1ec941 100644 --- a/store/datastore/ddl/sqlite/ddl_gen.go +++ b/store/datastore/ddl/sqlite/ddl_gen.go @@ -140,6 +140,10 @@ var migrations = []struct { name: "create-index-perms-user", stmt: createIndexPermsUser, }, + { + name: "alter-table-add-file-pid", + stmt: alterTableAddFilePid, + }, } // Migrate performs the database migration. If the migration fails @@ -576,3 +580,11 @@ CREATE INDEX IF NOT EXISTS ix_perms_repo ON perms (perm_repo_id); var createIndexPermsUser = ` CREATE INDEX IF NOT EXISTS ix_perms_user ON perms (perm_user_id); ` + +// +// 018_add_column_file_pid.sql +// + +var alterTableAddFilePid = ` +ALTER TABLE files ADD COLUMN file_pid INTEGER +` diff --git a/store/datastore/ddl/sqlite/files/018_add_column_file_pid.sql b/store/datastore/ddl/sqlite/files/018_add_column_file_pid.sql new file mode 100644 index 000000000..f12f18b3d --- /dev/null +++ b/store/datastore/ddl/sqlite/files/018_add_column_file_pid.sql @@ -0,0 +1,3 @@ +-- name: alter-table-add-file-pid + +ALTER TABLE files ADD COLUMN file_pid INTEGER diff --git a/store/datastore/files.go b/store/datastore/files.go index 108ebcfa3..042c5824e 100644 --- a/store/datastore/files.go +++ b/store/datastore/files.go @@ -42,6 +42,7 @@ func (db *datastore) FileCreate(file *model.File, r io.Reader) error { ID: file.ID, BuildID: file.BuildID, ProcID: file.ProcID, + PID: file.PID, Name: file.Name, Size: file.Size, Mime: file.Mime, @@ -55,6 +56,7 @@ type fileData struct { ID int64 `meddler:"file_id,pk"` BuildID int64 `meddler:"file_build_id"` ProcID int64 `meddler:"file_proc_id"` + PID int `meddler:"file_pid"` Name string `meddler:"file_name"` Size int `meddler:"file_size"` Mime string `meddler:"file_mime"` diff --git a/store/datastore/sql/mysql/files/files.sql b/store/datastore/sql/mysql/files/files.sql index 0088a218f..a934647f0 100644 --- a/store/datastore/sql/mysql/files/files.sql +++ b/store/datastore/sql/mysql/files/files.sql @@ -4,6 +4,7 @@ SELECT file_id ,file_build_id ,file_proc_id +,file_pid ,file_name ,file_mime ,file_size @@ -17,6 +18,7 @@ SELECT file_id ,file_build_id ,file_proc_id +,file_pid ,file_name ,file_mime ,file_size @@ -31,6 +33,7 @@ SELECT file_id ,file_build_id ,file_proc_id +,file_pid ,file_name ,file_mime ,file_size diff --git a/store/datastore/sql/mysql/sql_gen.go b/store/datastore/sql/mysql/sql_gen.go index 1e649ec26..74797efc9 100644 --- a/store/datastore/sql/mysql/sql_gen.go +++ b/store/datastore/sql/mysql/sql_gen.go @@ -165,6 +165,7 @@ SELECT file_id ,file_build_id ,file_proc_id +,file_pid ,file_name ,file_mime ,file_size @@ -178,6 +179,7 @@ SELECT file_id ,file_build_id ,file_proc_id +,file_pid ,file_name ,file_mime ,file_size @@ -192,6 +194,7 @@ SELECT file_id ,file_build_id ,file_proc_id +,file_pid ,file_name ,file_mime ,file_size diff --git a/store/datastore/sql/postgres/files/files.sql b/store/datastore/sql/postgres/files/files.sql index 31817f766..c2d71a33d 100644 --- a/store/datastore/sql/postgres/files/files.sql +++ b/store/datastore/sql/postgres/files/files.sql @@ -4,6 +4,7 @@ SELECT file_id ,file_build_id ,file_proc_id +,file_pid ,file_name ,file_mime ,file_size @@ -17,6 +18,7 @@ SELECT file_id ,file_build_id ,file_proc_id +,file_pid ,file_name ,file_mime ,file_size @@ -31,6 +33,7 @@ SELECT file_id ,file_build_id ,file_proc_id +,file_pid ,file_name ,file_mime ,file_size diff --git a/store/datastore/sql/postgres/sql_gen.go b/store/datastore/sql/postgres/sql_gen.go index 8298055fc..504bf3545 100644 --- a/store/datastore/sql/postgres/sql_gen.go +++ b/store/datastore/sql/postgres/sql_gen.go @@ -165,6 +165,7 @@ SELECT file_id ,file_build_id ,file_proc_id +,file_pid ,file_name ,file_mime ,file_size @@ -178,6 +179,7 @@ SELECT file_id ,file_build_id ,file_proc_id +,file_pid ,file_name ,file_mime ,file_size @@ -192,6 +194,7 @@ SELECT file_id ,file_build_id ,file_proc_id +,file_pid ,file_name ,file_mime ,file_size diff --git a/store/datastore/sql/sqlite/files/files.sql b/store/datastore/sql/sqlite/files/files.sql index 0088a218f..a934647f0 100644 --- a/store/datastore/sql/sqlite/files/files.sql +++ b/store/datastore/sql/sqlite/files/files.sql @@ -4,6 +4,7 @@ SELECT file_id ,file_build_id ,file_proc_id +,file_pid ,file_name ,file_mime ,file_size @@ -17,6 +18,7 @@ SELECT file_id ,file_build_id ,file_proc_id +,file_pid ,file_name ,file_mime ,file_size @@ -31,6 +33,7 @@ SELECT file_id ,file_build_id ,file_proc_id +,file_pid ,file_name ,file_mime ,file_size diff --git a/store/datastore/sql/sqlite/sql_gen.go b/store/datastore/sql/sqlite/sql_gen.go index 173479190..7e5bf08e0 100644 --- a/store/datastore/sql/sqlite/sql_gen.go +++ b/store/datastore/sql/sqlite/sql_gen.go @@ -165,6 +165,7 @@ SELECT file_id ,file_build_id ,file_proc_id +,file_pid ,file_name ,file_mime ,file_size @@ -178,6 +179,7 @@ SELECT file_id ,file_build_id ,file_proc_id +,file_pid ,file_name ,file_mime ,file_size @@ -192,6 +194,7 @@ SELECT file_id ,file_build_id ,file_proc_id +,file_pid ,file_name ,file_mime ,file_size