From 4b8410bb64dfd0980994a4172612a818761cae5f Mon Sep 17 00:00:00 2001
From: "philipp.goymann" <philipp.goymann@mpi-bn.mpg.de>
Date: Wed, 26 Oct 2022 23:41:15 +0200
Subject: [PATCH] add cmd interface

---
 loosolab_s3/Utils.py        | 69 +++++++++++++++++++++++++++++++++++++
 loosolab_s3/cmd.py          | 68 ++++++++++++++++++++++++++++++++++++
 loosolab_s3/s3_functions.py |  4 +--
 setup.py                    |  8 +++--
 4 files changed, 144 insertions(+), 5 deletions(-)
 create mode 100644 loosolab_s3/Utils.py
 create mode 100644 loosolab_s3/cmd.py

diff --git a/loosolab_s3/Utils.py b/loosolab_s3/Utils.py
new file mode 100644
index 0000000..50e70a4
--- /dev/null
+++ b/loosolab_s3/Utils.py
@@ -0,0 +1,69 @@
+#!/usr/bin/env python3
+import os
+import sys
+import time
+import logging
+
+class Utils:
+    logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO)
+    def is_valid_file(self, parser, arg):
+        if not os.path.exists(arg):
+            parser.error("The file %s does not exist!" % arg)
+        else:
+            return open(arg, 'r')  # return an open file handle
+
+#--------------------------------------------------------------------------------------------------------#
+
+    def check_if_file_exists(self, files):
+        if len(files) == 0:
+            logging.error( "Their are no Files given!")
+            sys.exit(1)
+        for i in files:
+            if os.path.exists(i):
+                pass
+            else:
+                logging.error('File ' + i + ' didn\'t exist!')
+                sys.exit(1)
+
+#--------------------------------------------------------------------------------------------------------#
+
+    def query_yes_no(self, question, default="yes"):
+        valid = {"yes": True, "y": True, "ye": True,
+                 "no": False, "n": False}
+        if default is None:
+            prompt = " [y/n] "
+        elif default == "yes":
+            prompt = " [Y/n] "
+        elif default == "no":
+            prompt = " [y/N] "
+        else:
+            raise ValueError("invalid default answer: '%s'" % default)
+        while True:
+            sys.stdout.write(question + prompt)
+            choice = input().lower()
+            if default is not None and choice == '':
+                return valid[default]
+            elif choice in valid:
+                return valid[choice]
+            else:
+                sys.stdout.write("Please respond with 'yes' or 'no' "
+                                 "(or 'y' or 'n').\n")
+
+#--------------------------------------------------------------------------------------------------------#
+
+    def waiting_points(self, message):
+        time.sleep(0.25)
+        print(message + ' {0}'.format('.   '), end='\r')
+        time.sleep(0.25)
+        print(message + ' {0}'.format('..  '), end='\r')
+        time.sleep(0.25)
+        print(message + ' {0}'.format('... '), end='\r')
+        time.sleep(0.25)
+        print(message + ' {0}'.format('....'), end='\r')
+
+#--------------------------------------------------------------------------------------------------------#
+
+    def check_argparser(self,args, required):
+        for arg in required:
+            if getattr(args, arg) == None:
+                sys.exit("ERROR: Missing argument --{0}".format(arg))
\ No newline at end of file
diff --git a/loosolab_s3/cmd.py b/loosolab_s3/cmd.py
new file mode 100644
index 0000000..edd9d7d
--- /dev/null
+++ b/loosolab_s3/cmd.py
@@ -0,0 +1,68 @@
+#!/usr/bin/env python
+""" CMD function for loosolab s3 """
+
+import argparse
+import sys
+
+#own functions
+from loosolab_s3.Utils import Utils
+from loosolab_s3.s3_functions import Loosolab_s3
+
+
+#--------------------------------------------------------------------------------------------------------#
+#- MAIN -------------------------------------------------------------------------------------------------#
+def run_s3_functions():
+    utils = Utils()
+    args = argparsefunc()
+
+    #start s3 session
+    credentials = {
+        "endpoint":args.endpoint,
+        "key":args.key,
+        "secret": args.secret,
+        "signature":args.signature
+        }
+    if args.no_log:
+        s3 = Loosolab_s3(credentials, logger=False)
+    else:
+        s3 = Loosolab_s3(credentials)
+
+    #------------------------------------------------actions--------------------------------------------#
+
+    #check if bucket exists
+    if args.bucket_exists:
+        utils.check_argparser(args, ['secret', "key", 'bucketname'])
+        if s3.check_s3_bucket_ex(args.bucketname):
+            print('Bucket ' +  args.bucketname + ' exists!')
+        else:
+            print('Bucket ' +  args.bucketname + ' dont exists!')
+
+#--------------------------------------------------------------------------------------------------------#
+# parse command line arguments:
+def argparsefunc():
+    parser = argparse.ArgumentParser(
+        description="", add_help=False)
+    parser.add_argument('--key', help="user name")	
+    parser.add_argument("--secret", help="s3 secret")	
+    parser.add_argument("--signature", help="s3  signature",default='s3v4')
+    parser.add_argument("--endpoint", help="URL S3",default='https://s3.mpi-bn.mpg.de')
+
+    #actions
+    parser.add_argument("--bucket_exists", action='store_true', help="check if bucket exists")
+
+    #values
+    parser.add_argument("--bucketname")
+    parser.add_argument("--no_log", action='store_true', help='disable logging')
+
+    parser.add_argument('-h', '--help', action='store_true', dest='show_help')
+    args = parser.parse_args()
+
+    if args.show_help:
+        parser.print_help(sys.stderr)
+    if len(sys.argv)==1:
+        parser.print_help(sys.stderr)
+        sys.exit(1)    
+    return args
+
+if __name__ == "__main__":
+   run_s3_functions()
\ No newline at end of file
diff --git a/loosolab_s3/s3_functions.py b/loosolab_s3/s3_functions.py
index c47d552..e74c0aa 100644
--- a/loosolab_s3/s3_functions.py
+++ b/loosolab_s3/s3_functions.py
@@ -29,7 +29,7 @@ class Loosolab_s3:
 			level = logging.INFO
 		else:
 			level = logging.CRITICAL
-		
+
 		self.logger = logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=level)
 		self.logger = logging.getLogger('Loosolab_s3_logger')
 		
@@ -443,7 +443,7 @@ class Loosolab_s3:
 					else:
 						self.transfer.upload_file(local_file_name, bucket_name, file_name)
 						#self.session.Bucket(bucket_name).upload_file(local_file_name, file_name, Config=self.transfer)
-					self.logger.info("All files are uploaded!" + str(file_list))
+					self.logger.info("File " + str(local_file_name) + ' gets uploaded!')
 			except Exception as e:
 				self.__exception_log__("S3: Uploading files failed!" ,e)
 				return
diff --git a/setup.py b/setup.py
index 38929e4..a26f754 100644
--- a/setup.py
+++ b/setup.py
@@ -7,10 +7,12 @@ setup(name='loosolab_s3',
       author_email='marina.kiweler@mpi-bn.mpg.de',
       license='MIT',
       packages=['loosolab_s3'],
+      entry_points = {
+        'console_scripts': ['S3 = loosolab_s3.cmd:run_s3_functions']
+      },
       install_requires=[
-        'boto3',
-        'botocore>=1.24.26'
-      ],
+        'boto3', # ==1.21.25',
+      'botocore'],
       classifiers = [
         'Programming Language :: Python :: 3'
       ],
-- 
GitLab