forked from cloudreve/Cloudreve
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
12 changed files
with
229 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,133 @@ | ||
package cos | ||
|
||
import ( | ||
"archive/zip" | ||
"bytes" | ||
"encoding/base64" | ||
model "github.com/HFO4/cloudreve/models" | ||
"github.com/HFO4/cloudreve/pkg/hashid" | ||
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common" | ||
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/profile" | ||
scf "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/scf/v20180416" | ||
"io" | ||
"io/ioutil" | ||
"net/url" | ||
"strconv" | ||
"strings" | ||
"time" | ||
) | ||
|
||
const scfFunc = `# -*- coding: utf8 -*- | ||
# SCF配置COS触发,向 Cloudreve 发送回调 | ||
from qcloud_cos_v5 import CosConfig | ||
from qcloud_cos_v5 import CosS3Client | ||
from qcloud_cos_v5 import CosServiceError | ||
from qcloud_cos_v5 import CosClientError | ||
import sys | ||
import logging | ||
import requests | ||
logging.basicConfig(level=logging.INFO, stream=sys.stdout) | ||
logger = logging.getLogger() | ||
def main_handler(event, context): | ||
logger.info("start main handler") | ||
for record in event['Records']: | ||
try: | ||
if "x-cos-meta-callback" not in record['cos']['cosObject']['meta']: | ||
logger.info("Cannot find callback URL, skiped.") | ||
return 'Success' | ||
callback = record['cos']['cosObject']['meta']['x-cos-meta-callback'] | ||
key = record['cos']['cosObject']['key'] | ||
logger.info("Callback URL is " + callback) | ||
r = requests.get(callback) | ||
print(r.text) | ||
except Exception as e: | ||
print(e) | ||
print('Error getting object {} callback url. '.format(key)) | ||
raise e | ||
return "Fail" | ||
return "Success" | ||
` | ||
|
||
// CreateSCF 创建回调云函数 | ||
func CreateSCF(policy *model.Policy, region string) error { | ||
// 初始化客户端 | ||
credential := common.NewCredential( | ||
policy.AccessKey, | ||
policy.SecretKey, | ||
) | ||
cpf := profile.NewClientProfile() | ||
client, err := scf.NewClient(credential, region, cpf) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
// 创建回调代码数据 | ||
buff := &bytes.Buffer{} | ||
bs64 := base64.NewEncoder(base64.StdEncoding, buff) | ||
zipWriter := zip.NewWriter(bs64) | ||
header := zip.FileHeader{ | ||
Name: "callback.py", | ||
Method: zip.Deflate, | ||
} | ||
writer, err := zipWriter.CreateHeader(&header) | ||
if err != nil { | ||
return err | ||
} | ||
_, err = io.Copy(writer, strings.NewReader(scfFunc)) | ||
zipWriter.Close() | ||
|
||
// 创建云函数 | ||
req := scf.NewCreateFunctionRequest() | ||
funcName := "cloudreve_" + hashid.HashID(policy.ID, hashid.PolicyID) + strconv.FormatInt(time.Now().Unix(), 10) | ||
zipFileBytes, _ := ioutil.ReadAll(buff) | ||
zipFileStr := string(zipFileBytes) | ||
codeSource := "ZipFile" | ||
handler := "callback.main_handler" | ||
desc := "Cloudreve 用回调函数" | ||
timeout := int64(60) | ||
runtime := "Python3.6" | ||
req.FunctionName = &funcName | ||
req.Code = &scf.Code{ | ||
ZipFile: &zipFileStr, | ||
} | ||
req.Handler = &handler | ||
req.Description = &desc | ||
req.Timeout = &timeout | ||
req.Runtime = &runtime | ||
req.CodeSource = &codeSource | ||
|
||
_, err = client.CreateFunction(req) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
time.Sleep(time.Duration(5) * time.Second) | ||
|
||
// 创建触发器 | ||
server, _ := url.Parse(policy.Server) | ||
triggerType := "cos" | ||
triggerDesc := `{"event":"cos:ObjectCreated:Post","filter":{"Prefix":"","Suffix":""}}` | ||
enable := "OPEN" | ||
|
||
trigger := scf.NewCreateTriggerRequest() | ||
trigger.FunctionName = &funcName | ||
trigger.TriggerName = &server.Host | ||
trigger.Type = &triggerType | ||
trigger.TriggerDesc = &triggerDesc | ||
trigger.Enable = &enable | ||
|
||
_, err = client.CreateTrigger(trigger) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
return nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters