mirror of https://github.com/jetkvm/kvm.git
				
				
				
			
		
			
				
	
	
		
			54 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			54 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
| package plugin
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"kvm/internal/storage"
 | |
| 	"os"
 | |
| 	"path"
 | |
| 
 | |
| 	"github.com/google/uuid"
 | |
| )
 | |
| 
 | |
| const pluginsFolder = "/userdata/jetkvm/plugins"
 | |
| const pluginsUploadFolder = pluginsFolder + "/_uploads"
 | |
| 
 | |
| func init() {
 | |
| 	_ = os.MkdirAll(pluginsUploadFolder, 0755)
 | |
| }
 | |
| 
 | |
| func RpcPluginStartUpload(filename string, size int64) (*storage.StorageFileUpload, error) {
 | |
| 	sanitizedFilename, err := storage.SanitizeFilename(filename)
 | |
| 	if err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 
 | |
| 	filePath := path.Join(pluginsUploadFolder, sanitizedFilename)
 | |
| 	uploadPath := filePath + ".incomplete"
 | |
| 
 | |
| 	if _, err := os.Stat(filePath); err == nil {
 | |
| 		return nil, fmt.Errorf("file already exists: %s", sanitizedFilename)
 | |
| 	}
 | |
| 
 | |
| 	var alreadyUploadedBytes int64 = 0
 | |
| 	if stat, err := os.Stat(uploadPath); err == nil {
 | |
| 		alreadyUploadedBytes = stat.Size()
 | |
| 	}
 | |
| 
 | |
| 	uploadId := "plugin_" + uuid.New().String()
 | |
| 	file, err := os.OpenFile(uploadPath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to open file for upload: %v", err)
 | |
| 	}
 | |
| 
 | |
| 	storage.AddPendingUpload(uploadId, storage.PendingUpload{
 | |
| 		File:                 file,
 | |
| 		Size:                 size,
 | |
| 		AlreadyUploadedBytes: alreadyUploadedBytes,
 | |
| 	})
 | |
| 
 | |
| 	return &storage.StorageFileUpload{
 | |
| 		AlreadyUploadedBytes: alreadyUploadedBytes,
 | |
| 		DataChannel:          uploadId,
 | |
| 	}, nil
 | |
| }
 |