From 3143d80939e0ca4a4f52e3ae671b4530079d5955 Mon Sep 17 00:00:00 2001 From: njl <1012408214@qq.com> Date: Sat, 19 Oct 2024 11:46:41 +0800 Subject: [PATCH] =?UTF-8?q?=09=E6=96=B0=E6=96=87=E4=BB=B6=EF=BC=9A=20=20?= =?UTF-8?q?=20function=5Fmodules/noop/image=5Ffrom=5Fsftp.c=20=09=E6=96=B0?= =?UTF-8?q?=E6=96=87=E4=BB=B6=EF=BC=9A=20=20=20function=5Fmodules/noop/ima?= =?UTF-8?q?ge=5Ffrom=5Fsftp.h?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- function_modules/noop/image_from_sftp.c | 318 ++++++++++++++++++++++++ function_modules/noop/image_from_sftp.h | 27 ++ 2 files changed, 345 insertions(+) create mode 100644 function_modules/noop/image_from_sftp.c create mode 100644 function_modules/noop/image_from_sftp.h diff --git a/function_modules/noop/image_from_sftp.c b/function_modules/noop/image_from_sftp.c new file mode 100644 index 0000000..4502762 --- /dev/null +++ b/function_modules/noop/image_from_sftp.c @@ -0,0 +1,318 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "image_from_sftp.h" + + + +void print_error(const char *message) { + fprintf(stderr, "%s: %d\n", message, libssh2_session_last_error(NULL, NULL, NULL, 0)); +} + +int create_socket(const char *hostname, int port) { + int sock; + struct sockaddr_in sin; + + sock = socket(AF_INET, SOCK_STREAM, 0); + if (sock < 0) { + print_error("Failed to create socket"); + return -1; + } + + sin.sin_family = AF_INET; + sin.sin_port = htons(port); + inet_pton(AF_INET, hostname, &sin.sin_addr); + + if (connect(sock, (struct sockaddr *)(&sin), sizeof(struct sockaddr_in)) != 0) { + close(sock); + print_error("Failed to connect to server"); + return -1; + } + + return sock; +} + +char *filepathname (char*filepath,char*filename){ + size_t fullPathLength = strlen(filepath) + strlen(filename) + 1; + // 动态分配内存 + char *fullPath = (char *)malloc(fullPathLength); + if (fullPath == NULL) { + perror("Failed to allocate memory"); + return NULL; + } + strcpy(fullPath, filepath); + strcat(fullPath, filename); + return fullPath; +} + +int upload_file(char *localfilename,char *remotefilename) { + int rc; + LIBSSH2_SESSION *session; + LIBSSH2_SFTP *sftp; + LIBSSH2_SFTP_HANDLE *sftp_handle; + char *mem; + size_t nread; + size_t total = 0; + struct stat fileinfo; + FILE *local; + const char *hostname = Hostname; + const int port= Port; + const char *username = Username; + const char *password = Password; + const char *localfile = NULL; + const char *remotefile = NULL; + char *localfilePath = LocalfilePath; + char *remotefilePath = RemotefilePath; + localfile = filepathname (localfilePath , localfilename); + remotefile = filepathname (remotefilePath , remotefilename); + // Initialize libssh2 + if (libssh2_init(0) != 0) { + print_error("Failed to initialize libssh2"); + return -1; + } + + // Create a session instance + session = libssh2_session_init(); + if (session == NULL) { + print_error("Failed to create SSH session"); + return -1; + } + + + // Start the session + int sock = create_socket(hostname,port); + if (libssh2_session_handshake(session, sock) != 0) { + print_error("Failed to establish SSH session"); + libssh2_session_free(session); + return -1; + } + + // Authenticate + if (libssh2_userauth_password(session, username, password) != 0) { + print_error("Failed to authenticate"); + libssh2_session_free(session); + return -1; + } + + // Initialize SFTP session + sftp = libssh2_sftp_init(session); + if (!sftp) { + print_error("Failed to initialize SFTP session"); + libssh2_session_free(session); + return -1; + } + + // Open the remote file for writing + sftp_handle = libssh2_sftp_open(sftp, remotefile, LIBSSH2_FXF_WRITE | LIBSSH2_FXF_CREAT | LIBSSH2_FXF_TRUNC, 0644); + if (!sftp_handle) { + print_error("Failed to open remote file"); + libssh2_sftp_shutdown(sftp); + libssh2_session_free(session); + return -1; + } + + // Open the local file for reading + local = fopen(localfile, "rb"); + if (!local) { + print_error("Failed to open local file"); + libssh2_sftp_close(sftp_handle); + libssh2_sftp_shutdown(sftp); + libssh2_session_free(session); + return -1; + } + + // Get the file size + if (fstat(fileno(local), &fileinfo) != 0) { + print_error("Failed to get file size"); + fclose(local); + libssh2_sftp_close(sftp_handle); + libssh2_sftp_shutdown(sftp); + libssh2_session_free(session); + return -1; + } + size_t filesize = fileinfo.st_size; + + // Read from local and write to remote + while (total < filesize) { + char buffer[1024]; + nread = fread(buffer, 1, sizeof(buffer), local); + if (nread < 0) { + print_error("Error reading from local file"); + break; + } + if (nread > 0) { + libssh2_sftp_write(sftp_handle, buffer, nread); + total += nread; + } + } + + // Cleanup + fclose(local); + libssh2_sftp_close(sftp_handle); + libssh2_sftp_shutdown(sftp); + libssh2_session_disconnect(session, "Normal Shutdown"); + libssh2_session_free(session); + libssh2_exit(); + + return 0; +} + +int download_file(char *argv , char *file_format) { + char *str = argv; + char *value = NULL ; + char *key = "\"action_name\": \"/guest/"; + char *perior_action[Perior_action_count]; + int perior_action_count=0; + char *start = strstr(str, key); + int length_file_format = strlen (file_format); + while (start) + { + start =start+ strlen(key) /*+ 4*/; // 跳过键部分,指向值的开始 + char *end = strstr(start, "\""); + //end +=2 ; // 查找值的结束引号 + int length = end - start ; + value = (char *)malloc(length + 1 + length_file_format); // +1 用于存储字符串结束符 + if (value == NULL) printf("Memory allocation failed\n"); + if (end) { + // 复制值到 value 中 + strncpy(value, start, length); + value[length] = '\0'; // 添加字符串结束符 + strcat(value , file_format); + } + perior_action[perior_action_count]=value; + perior_action_count++; + start = strstr(end, key); + + } + //printf ("argv1:%s\n",argv[1]); + char *localfilepath[perior_action_count]; + if (perior_action_count != 0){ + for (int i = 0; i < perior_action_count; i++){ + printf("perior action:%s\n",perior_action[i]); + localfilepath[i] = filepathname(LocalfilePath,perior_action[i]); + perior_action[i] = filepathname(RemotefilePath , perior_action[i]); + } + } + //const char *actvation_id = getenv("__OW_ACTIVATION_ID"); + //const char *action = getenv("__OW_ACTION_NAME"); + //printf("{\"action_name\" : \"%s\", \"activation_id\":\"%s\",\"message\": \" hello world!\" }\n",action,actvation_id); + int sock; + LIBSSH2_SESSION *session; + LIBSSH2_SFTP *sftp; + LIBSSH2_SFTP_HANDLE *sftp_handle; + ssize_t nread; + char *hostname = Hostname; + int port= Port; + char *username = Username; + char *password = Password; + char *localfilePath = LocalfilePath ; + char *localfile = NULL; + char *remotefilePath = RemotefilePath ; + char *remotefile = NULL; + //remotefile = filepathname(remotefilePath,filename); + //localfile = filepathname (localfilePath,filename); + + // Initialize libssh2 + if (libssh2_init(0) != 0) { + print_error("Failed to initialize libssh2"); + return -1; + } + + // Create a socket and connect + sock = create_socket(hostname, port); + if (sock < 0) { + return -1; + } + + // Create a session instance + session = libssh2_session_init(); + if (session == NULL) { + close(sock); + print_error("Failed to create SSH session"); + return -1; + } + + // Start the session + if (libssh2_session_handshake(session, sock) != 0) { + print_error("Failed to establish SSH session"); + libssh2_session_free(session); + close(sock); + return -1; + } + + // Authenticate + if (libssh2_userauth_password(session, username, password) != 0) { + print_error("Failed to authenticate"); + libssh2_session_free(session); + close(sock); + return -1; + } + + // Initialize SFTP session + sftp = libssh2_sftp_init(session); + if (!sftp) { + print_error("Failed to initialize SFTP session"); + libssh2_session_free(session); + close(sock); + return -1; + } + + for (int i = 0; i < perior_action_count; i++) { + // Open the remote file for reading + char buffer[1024]; + sftp_handle = libssh2_sftp_open(sftp, perior_action[i], LIBSSH2_FXF_READ, 0); + if (!sftp_handle) { + print_error("Failed to open remote file"); + libssh2_sftp_shutdown(sftp); + libssh2_session_free(session); + close(sock); + return -1; + } + + // Open the local file for writing + FILE *local = fopen(localfilepath[i], "wb"); + if (!local) { + print_error("Failed to open local file"); + libssh2_sftp_close(sftp_handle); + libssh2_sftp_shutdown(sftp); + libssh2_session_free(session); + close(sock); + return -1; + } + + // Read from remote and write to local + while ((nread = libssh2_sftp_read(sftp_handle, buffer, sizeof(buffer))) > 0) { + fwrite(buffer, 1, nread, local); + } + + if (nread < 0) { + print_error("Error reading from remote file"); + } + fclose(local); + libssh2_sftp_close(sftp_handle); + } + + // Cleanup + libssh2_sftp_shutdown(sftp); + libssh2_session_disconnect(session, "Normal Shutdown"); + libssh2_session_free(session); + close(sock); + libssh2_exit(); + + return 0; +} + +int main (){ + upload_file("test.jpg","noop2.jpg"); + upload_file("test.jpg","noop3.jpg"); + download_file(" {\"__ow_body\": [{\"action_name\": \"/guest/noop2\", \"activation_id\": \"05a456e67d1247d7a456e67d12e7d7e4\", \"message\": \" hello world!\"}, {\"action_name\": \"/guest/noop3\", \"activation_id\": \"760ab5cf657d4a078ab5cf657d6a0798\", \"message\": \" hello world!\"}], \"__ow_headers\": {\"accept\": \"*/*\", \"accept-encoding\": \"gzip, deflate\", \"content-type\": \"application/json\", \"host\": \"controllers\", \"user-agent\": \"python-requests/2.18.4\", \"x-forwarded-for\": \"172.17.0.1\", \"x-forwarded-host\": \"172.17.0.1\", \"x-forwarded-port\": \"8080\", \"x-forwarded-proto\": \"http\", \"x-forwarded-url\": \"http://172.17.0.1/api/23bc46b1-71f6-4ed5-8c54-816aa4f8c502/noop4-api/noop4-path\", \"x-real-ip\": \"172.17.0.1\", \"x-request-id\": \"7b11d572a3f0ed4ff57394717b3ac473\"}, \"__ow_method\": \"post\", \"__ow_path\": \"\"} ",".jpg"); + return 0; +} + diff --git a/function_modules/noop/image_from_sftp.h b/function_modules/noop/image_from_sftp.h new file mode 100644 index 0000000..8006bc9 --- /dev/null +++ b/function_modules/noop/image_from_sftp.h @@ -0,0 +1,27 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define Hostname "127.0.0.1" +#define Port 22 +#define Username "sftpuser" +#define Password "12580" +#define LocalfilePath "./" +#define RemotefilePath "/uploads/" +#define Perior_action_count 5 + +#ifndef IMAGE_FROM_SFTP_H +#define IMAGE_FROM_SFTP_H +void print_error(const char *message); +int create_socket(const char *hostname, int port); +char *filepathname (char*filepath,char*filename); +int upload_file(char *localfilename,char *remotefilename); +int download_file(char *argv , char *file_format); +#endif \ No newline at end of file