func CopyImgLayer(srcPath, srcFile, dstPath, dstFile string, reqbody []byte) (int, error) { if !utils.IsDirExist(dstPath) { os.MkdirAll(dstPath, os.ModePerm) } if utils.IsFileExist(dstFile) { os.Remove(dstFile) } var data []byte if _, err := os.Stat(srcFile); err == nil { data, _ = ioutil.ReadFile(srcFile) if err := ioutil.WriteFile(dstFile, data, 0777); err != nil { return 0, err } os.RemoveAll(srcPath) } else { data = reqbody if err := ioutil.WriteFile(dstFile, data, 0777); err != nil { return 0, err } } return len(data), nil }
func PutImageLayerv1Handler(ctx *macaron.Context, log *logs.BeeLogger) (int, []byte) { imageId := ctx.Params(":imageId") basePath := setting.ImagePath imagePath := fmt.Sprintf("%v/images/%v", basePath, imageId) layerfile := fmt.Sprintf("%v/images/%v/layer", basePath, imageId) if !utils.IsDirExist(imagePath) { os.MkdirAll(imagePath, os.ModePerm) } if _, err := os.Stat(layerfile); err == nil { os.Remove(layerfile) } data, _ := ioutil.ReadAll(ctx.Req.Request.Body) if err := ioutil.WriteFile(layerfile, data, 0777); err != nil { log.Error("[REGISTRY API V1] Put Image Layer File Error: %v", err.Error()) result, _ := json.Marshal(map[string]string{"message": "Put Image Layer File Error"}) return http.StatusBadRequest, result } i := new(models.Image) if err := i.PutLayer(imageId, layerfile, true, int64(len(data))); err != nil { log.Error("[REGISTRY API V1] Put Image Layer File Data Error: %v", err.Error()) result, _ := json.Marshal(map[string]string{"message": "Put Image Layer File Data Error"}) return http.StatusBadRequest, result } result, _ := json.Marshal(map[string]string{}) return http.StatusOK, result }
func PatchBlobsV2Handler(ctx *macaron.Context, log *logs.BeeLogger) (int, []byte) { namespace := ctx.Params(":namespace") repository := ctx.Params(":repository") desc := ctx.Params(":uuid") uuid := strings.Split(desc, "?")[0] imagePathTmp := fmt.Sprintf("%v/%v", setting.ImagePath, uuid) layerfileTmp := fmt.Sprintf("%v/%v/layer", setting.ImagePath, uuid) //saving specific tarsum every times is in order to split the same tarsum in HEAD handler if !utils.IsDirExist(imagePathTmp) { os.MkdirAll(imagePathTmp, os.ModePerm) } if _, err := os.Stat(layerfileTmp); err == nil { os.Remove(layerfileTmp) } data, _ := ctx.Req.Body().Bytes() if err := ioutil.WriteFile(layerfileTmp, data, 0777); err != nil { log.Error("[REGISTRY API V2] Failed to save layer file %v: %v", layerfileTmp, err.Error()) result, _ := json.Marshal(map[string]string{"message": "Failed to save layer file"}) return http.StatusInternalServerError, result } state := utils.MD5(fmt.Sprintf("%s/%s/%s", namespace, repository, time.Now().UnixNano()/int64(time.Millisecond))) random := fmt.Sprintf("%s://%s/v2/%s/%s/blobs/uploads/%s?_state=%s", setting.ListenMode, setting.Domains, namespace, repository, uuid, state) ctx.Resp.Header().Set("Docker-Upload-Uuid", uuid) ctx.Resp.Header().Set("Location", random) ctx.Resp.Header().Set("Range", fmt.Sprintf("0-%v", len(data)-1)) result, _ := json.Marshal(map[string]string{}) return http.StatusAccepted, result }