Browse Source

almost complete upload package

tangs 6 years ago
parent
commit
10c0afb0ac

+ 4 - 1
.gitignore

@@ -61,4 +61,7 @@ target/
 
 
 .idea
 .idea
 abc
 abc
-abc/*
+abc/*
+rubbish/*.tok
+test/official/*.tok
+temp.txt

+ 3 - 0
rubbish/README.md

@@ -0,0 +1,3 @@
+### RUBBISH
+
+A temporary folder. When the collected data files are uploaded to the server, the collected data files will not be deleted. Instead, they will be moved to the temporary folder for backup. They can also be deleted regularly to free space.

+ 11 - 8
schedule.py

@@ -1,15 +1,18 @@
 #!/usr/bin/env python
 #!/usr/bin/env python
 # -*- coding:utf-8 -*-
 # -*- coding:utf-8 -*-
 
 
+
+
 class Schedule:
 class Schedule:
-	def __init__(self):
-		pass
+    def __init__(self):
+        self.monitor_config = {}
 
 
-	def deliever():
-		pass
+    def deliver(self):
+        if self.monitor_config is None:
+            return
 
 
-	def parse_collect_config():
-		pass
+    def parse_collect_config(self):
+        pass
 
 
-	def parse_upload_config():
-		pass
+    def parse_upload_config(self):
+        pass

+ 1 - 0
test/scp_file_1.txt

@@ -0,0 +1 @@
+scp_file_1

+ 1 - 1
test/scp_file_2.txt

@@ -1 +1 @@
-scp_file_1.txt
+scp_file_2

+ 1 - 0
test/scp_folder/scp_file_3.txt

@@ -0,0 +1 @@
+scp_file_3

+ 1 - 1
test/scp_folder/scp_file_4.txt

@@ -1 +1 @@
-scp_file_1.txt
+scp_file_4

+ 1 - 0
test/scp_list/scp_file_5.txt

@@ -0,0 +1 @@
+scp_file_5

+ 1 - 0
test/scp_list/scp_file_6.txt

@@ -0,0 +1 @@
+scp_file_6

+ 35 - 4
upload.py

@@ -4,7 +4,7 @@ import json
 from threading import Lock
 from threading import Lock
 import logging
 import logging
 import datetime
 import datetime
-from os import path
+import os
 import time
 import time
 import shutil
 import shutil
 import paramiko
 import paramiko
@@ -14,11 +14,18 @@ default_max_length = 1000
 
 
 
 
 class Handle:
 class Handle:
-    def __init__(self, max_length, temp_file, official_dir, interval=5 * 60):
+    def __init__(self, max_length, temp_file, official_dir, rubbish,
+                 host, port, user, password, remote_dir, interval=5 * 60):
         """
         """
         :param max_length: Every 1000 rows of data are deposited in an official file.
         :param max_length: Every 1000 rows of data are deposited in an official file.
         :param temp_file: Temporary file path.
         :param temp_file: Temporary file path.
         :param official_dir: Official folder Path.
         :param official_dir: Official folder Path.
+        :param rubbish: A temporary file recycle bin that periodically empties the folder.
+        :param host: Remote server address for uploading files.
+        :param port: Remote server port for uploading files.
+        :param user: Remote server username for uploading files.
+        :param password: Remote server password for uploading files.
+        :param remote_dir: Remote server folder for uploading files.
         :param interval: Put temporary files into official files to upload at regular intervals.
         :param interval: Put temporary files into official files to upload at regular intervals.
         """
         """
         self.lock = Lock()
         self.lock = Lock()
@@ -31,6 +38,13 @@ class Handle:
         self.official_dir = official_dir
         self.official_dir = official_dir
         self.interval = interval
         self.interval = interval
         self.current_row = 0
         self.current_row = 0
+        self.rubbish = rubbish
+
+        self.host = host
+        self.port = port
+        self.user = user
+        self.password = password
+        self.remote_dir = remote_dir
 
 
     def add_task(self, content):
     def add_task(self, content):
         if not isinstance(content, dict):
         if not isinstance(content, dict):
@@ -69,6 +83,18 @@ class Handle:
     def to_file(self, name):
     def to_file(self, name):
         try:
         try:
             shutil.copy(self.temp_file, name)
             shutil.copy(self.temp_file, name)
+            uploader = Uploader(self.host, self.port, self.user, self.password, self.official_dir, self.remote_dir)
+            err = uploader.upload()
+            if err is not None:
+                logging.error('[HANDLE] upload file with '
+                              'host: %s, port: %d, user: %s, password: %s, local: %s, error: %s',
+                              self.host, self.port, self.user, self.password, name, err)
+                return err
+
+            for f in os.listdir(self.official_dir):
+                if os.path.isdir(f):
+                    continue
+                shutil.move(name, self.rubbish)
         except Exception as e:
         except Exception as e:
             return e
             return e
         return None
         return None
@@ -114,7 +140,7 @@ class Handle:
                 # logging.error("row: %d, max length: %d, end - beg: %d", self.current_row, self.max_item_length,end - beg)
                 # logging.error("row: %d, max length: %d, end - beg: %d", self.current_row, self.max_item_length,end - beg)
                 try:
                 try:
                     now = int(datetime.datetime.now().timestamp() * 1000)
                     now = int(datetime.datetime.now().timestamp() * 1000)
-                    official_file = path.join(self.official_dir, str(now) + '.tok')
+                    official_file = os.path.join(self.official_dir, str(now) + '.tok')
                     temp_file_ptr.close()
                     temp_file_ptr.close()
                     msg = self.to_file(official_file)
                     msg = self.to_file(official_file)
                     if msg is not None:
                     if msg is not None:
@@ -149,7 +175,7 @@ class Handle:
         time.sleep(1)
         time.sleep(1)
 
 
 
 
-defaultHandler = Handle(default_max_length, '/tmp/temp.txt', '/data/elec-monitor')
+defaultHandler = Handle(default_max_length, '/tmp/temp.txt', '/data/elec-monitor', 'rubbish', '', '', '', '', '', )
 
 
 
 
 def add_task(content):
 def add_task(content):
@@ -170,6 +196,10 @@ class Uploader:
         self.remote = remote
         self.remote = remote
 
 
     def upload(self):
     def upload(self):
+        """
+        Upload files or folders to remote servers via SCP
+        :return:
+        """
         try:
         try:
             ssh_client = paramiko.SSHClient()
             ssh_client = paramiko.SSHClient()
             ssh_client.load_system_host_keys()
             ssh_client.load_system_host_keys()
@@ -178,6 +208,7 @@ class Uploader:
 
 
             scp_client = scp.SCPClient(ssh_client.get_transport())
             scp_client = scp.SCPClient(ssh_client.get_transport())
             scp_client.put(self.local, self.remote, recursive=True)
             scp_client.put(self.local, self.remote, recursive=True)
+            ssh_client.close()
             return None
             return None
         except Exception as  e:
         except Exception as  e:
             logging.error('[UPLOAD] upload files with '
             logging.error('[UPLOAD] upload files with '

+ 19 - 2
upload_test.py

@@ -26,8 +26,15 @@ class UploadFileCheckTest(unittest.TestCase):
         }
         }
 
 
     def test_generate_file(self):
     def test_generate_file(self):
+        host = 'local.pc'
+        port = 22
+        user = 'tangs'
+        passwd = 'local12456'
+        official = 'test/official'
+
         print("-=-=-=-=")
         print("-=-=-=-=")
-        upload.defaultHandler = upload.Handle(1, 'temp.txt', './')
+        upload.defaultHandler = upload.Handle(1, 'temp.txt', official, 'rubbish', host, port, user, passwd,
+                                              'test/scp_generate')
 
 
         t = threading.Thread(target=upload.listen)
         t = threading.Thread(target=upload.listen)
         t.setDaemon(True)
         t.setDaemon(True)
@@ -47,6 +54,10 @@ class UploadFileCheckTest(unittest.TestCase):
 
 
 
 
 class UploaderTest(unittest.TestCase):
 class UploaderTest(unittest.TestCase):
+    """
+    Test uploading single file, single folder or multiple folder to remote server via SCP.
+    """
+
     def test_upload(self):
     def test_upload(self):
         host = 'local.pc'
         host = 'local.pc'
         port = 22
         port = 22
@@ -64,10 +75,16 @@ class UploaderTest(unittest.TestCase):
         self.assertIsNone(e)
         self.assertIsNone(e)
 
 
         # upload folder
         # upload folder
-        uploader3 = upload.Uploader(host, port, username, password, 'test/scp_folder', 'test/scp_folder')
+        uploader3 = upload.Uploader(host, port, username, password, 'test/scp_folder', 'test/')
         e = uploader3.upload()
         e = uploader3.upload()
         self.assertIsNone(e)
         self.assertIsNone(e)
 
 
+        # upload a list of files
+        uploader4 = upload.Uploader(host, port, username, password, ['test/scp_list', 'test/scp_folder'],
+                                    'test/scp_list')
+        e = uploader4.upload()
+        self.assertIsNone(e)
+
 
 
 if __name__ == '__main__':
 if __name__ == '__main__':
     unittest.main()
     unittest.main()