|
@@ -82,7 +82,9 @@ class SFTPGoApiRequests:
|
|
s3_key_prefix='', gcs_bucket='', gcs_key_prefix='', gcs_storage_class='', gcs_credentials_file='',
|
|
s3_key_prefix='', gcs_bucket='', gcs_key_prefix='', gcs_storage_class='', gcs_credentials_file='',
|
|
gcs_automatic_credentials='automatic', denied_login_methods=[], virtual_folders=[],
|
|
gcs_automatic_credentials='automatic', denied_login_methods=[], virtual_folders=[],
|
|
denied_extensions=[], allowed_extensions=[], s3_upload_part_size=0, s3_upload_concurrency=0,
|
|
denied_extensions=[], allowed_extensions=[], s3_upload_part_size=0, s3_upload_concurrency=0,
|
|
- max_upload_file_size=0, denied_protocols=[]):
|
|
|
|
|
|
+ max_upload_file_size=0, denied_protocols=[], az_container="", az_account_name="", az_account_key="",
|
|
|
|
+ az_sas_url="", az_endpoint="", az_upload_part_size=0, az_upload_concurrency=0, az_key_prefix="",
|
|
|
|
+ az_use_emulator=False):
|
|
user = {'id':user_id, 'username':username, 'uid':uid, 'gid':gid,
|
|
user = {'id':user_id, 'username':username, 'uid':uid, 'gid':gid,
|
|
'max_sessions':max_sessions, 'quota_size':quota_size, 'quota_files':quota_files,
|
|
'max_sessions':max_sessions, 'quota_size':quota_size, 'quota_files':quota_files,
|
|
'upload_bandwidth':upload_bandwidth, 'download_bandwidth':download_bandwidth,
|
|
'upload_bandwidth':upload_bandwidth, 'download_bandwidth':download_bandwidth,
|
|
@@ -106,7 +108,10 @@ class SFTPGoApiRequests:
|
|
user.update({'filesystem':self.buildFsConfig(fs_provider, s3_bucket, s3_region, s3_access_key, s3_access_secret,
|
|
user.update({'filesystem':self.buildFsConfig(fs_provider, s3_bucket, s3_region, s3_access_key, s3_access_secret,
|
|
s3_endpoint, s3_storage_class, s3_key_prefix, gcs_bucket,
|
|
s3_endpoint, s3_storage_class, s3_key_prefix, gcs_bucket,
|
|
gcs_key_prefix, gcs_storage_class, gcs_credentials_file,
|
|
gcs_key_prefix, gcs_storage_class, gcs_credentials_file,
|
|
- gcs_automatic_credentials, s3_upload_part_size, s3_upload_concurrency)})
|
|
|
|
|
|
+ gcs_automatic_credentials, s3_upload_part_size, s3_upload_concurrency,
|
|
|
|
+ az_container, az_account_name, az_account_key, az_sas_url,
|
|
|
|
+ az_endpoint, az_upload_part_size, az_upload_concurrency, az_key_prefix,
|
|
|
|
+ az_use_emulator)})
|
|
return user
|
|
return user
|
|
|
|
|
|
def buildVirtualFolders(self, vfolders):
|
|
def buildVirtualFolders(self, vfolders):
|
|
@@ -228,7 +233,9 @@ class SFTPGoApiRequests:
|
|
|
|
|
|
def buildFsConfig(self, fs_provider, s3_bucket, s3_region, s3_access_key, s3_access_secret, s3_endpoint,
|
|
def buildFsConfig(self, fs_provider, s3_bucket, s3_region, s3_access_key, s3_access_secret, s3_endpoint,
|
|
s3_storage_class, s3_key_prefix, gcs_bucket, gcs_key_prefix, gcs_storage_class,
|
|
s3_storage_class, s3_key_prefix, gcs_bucket, gcs_key_prefix, gcs_storage_class,
|
|
- gcs_credentials_file, gcs_automatic_credentials, s3_upload_part_size, s3_upload_concurrency):
|
|
|
|
|
|
+ gcs_credentials_file, gcs_automatic_credentials, s3_upload_part_size, s3_upload_concurrency,
|
|
|
|
+ az_container, az_account_name, az_account_key, az_sas_url, az_endpoint, az_upload_part_size,
|
|
|
|
+ az_upload_concurrency, az_key_prefix, az_use_emulator):
|
|
fs_config = {'provider':0}
|
|
fs_config = {'provider':0}
|
|
if fs_provider == 'S3':
|
|
if fs_provider == 'S3':
|
|
s3config = {'bucket':s3_bucket, 'region':s3_region, 'access_key':s3_access_key, 'access_secret':
|
|
s3config = {'bucket':s3_bucket, 'region':s3_region, 'access_key':s3_access_key, 'access_secret':
|
|
@@ -246,6 +253,12 @@ class SFTPGoApiRequests:
|
|
gcsconfig.update({'credentials':base64.b64encode(creds.read().encode('UTF-8')).decode('UTF-8'),
|
|
gcsconfig.update({'credentials':base64.b64encode(creds.read().encode('UTF-8')).decode('UTF-8'),
|
|
'automatic_credentials':0})
|
|
'automatic_credentials':0})
|
|
fs_config.update({'provider':2, 'gcsconfig':gcsconfig})
|
|
fs_config.update({'provider':2, 'gcsconfig':gcsconfig})
|
|
|
|
+ elif fs_provider == "AzureBlob":
|
|
|
|
+ azureconfig = {"container":az_container, "account_name":az_account_name, "account_key":az_account_key,
|
|
|
|
+ "sas_url":az_sas_url, "endpoint":az_endpoint, "upload_part_size":az_upload_part_size,
|
|
|
|
+ "upload_concurrency":az_upload_concurrency, "key_prefix":az_key_prefix, "use_emulator":
|
|
|
|
+ az_use_emulator}
|
|
|
|
+ fs_config.update({'provider':3, 'azblobconfig':azureconfig})
|
|
return fs_config
|
|
return fs_config
|
|
|
|
|
|
def getUsers(self, limit=100, offset=0, order='ASC', username=''):
|
|
def getUsers(self, limit=100, offset=0, order='ASC', username=''):
|
|
@@ -263,13 +276,17 @@ class SFTPGoApiRequests:
|
|
s3_access_key='', s3_access_secret='', s3_endpoint='', s3_storage_class='', s3_key_prefix='', gcs_bucket='',
|
|
s3_access_key='', s3_access_secret='', s3_endpoint='', s3_storage_class='', s3_key_prefix='', gcs_bucket='',
|
|
gcs_key_prefix='', gcs_storage_class='', gcs_credentials_file='', gcs_automatic_credentials='automatic',
|
|
gcs_key_prefix='', gcs_storage_class='', gcs_credentials_file='', gcs_automatic_credentials='automatic',
|
|
denied_login_methods=[], virtual_folders=[], denied_extensions=[], allowed_extensions=[],
|
|
denied_login_methods=[], virtual_folders=[], denied_extensions=[], allowed_extensions=[],
|
|
- s3_upload_part_size=0, s3_upload_concurrency=0, max_upload_file_size=0, denied_protocols=[]):
|
|
|
|
|
|
+ s3_upload_part_size=0, s3_upload_concurrency=0, max_upload_file_size=0, denied_protocols=[], az_container="",
|
|
|
|
+ az_account_name="", az_account_key="", az_sas_url="", az_endpoint="", az_upload_part_size=0,
|
|
|
|
+ az_upload_concurrency=0, az_key_prefix="", az_use_emulator=False):
|
|
u = self.buildUserObject(0, username, password, public_keys, home_dir, uid, gid, max_sessions,
|
|
u = self.buildUserObject(0, username, password, public_keys, home_dir, uid, gid, max_sessions,
|
|
quota_size, quota_files, self.buildPermissions(perms, subdirs_permissions), upload_bandwidth, download_bandwidth,
|
|
quota_size, quota_files, self.buildPermissions(perms, subdirs_permissions), upload_bandwidth, download_bandwidth,
|
|
status, expiration_date, allowed_ip, denied_ip, fs_provider, s3_bucket, s3_region, s3_access_key,
|
|
status, expiration_date, allowed_ip, denied_ip, fs_provider, s3_bucket, s3_region, s3_access_key,
|
|
s3_access_secret, s3_endpoint, s3_storage_class, s3_key_prefix, gcs_bucket, gcs_key_prefix, gcs_storage_class,
|
|
s3_access_secret, s3_endpoint, s3_storage_class, s3_key_prefix, gcs_bucket, gcs_key_prefix, gcs_storage_class,
|
|
gcs_credentials_file, gcs_automatic_credentials, denied_login_methods, virtual_folders, denied_extensions,
|
|
gcs_credentials_file, gcs_automatic_credentials, denied_login_methods, virtual_folders, denied_extensions,
|
|
- allowed_extensions, s3_upload_part_size, s3_upload_concurrency, max_upload_file_size, denied_protocols)
|
|
|
|
|
|
+ allowed_extensions, s3_upload_part_size, s3_upload_concurrency, max_upload_file_size, denied_protocols,
|
|
|
|
+ az_container, az_account_name, az_account_key, az_sas_url, az_endpoint, az_upload_part_size,
|
|
|
|
+ az_upload_concurrency, az_key_prefix, az_use_emulator)
|
|
r = requests.post(self.userPath, json=u, auth=self.auth, verify=self.verify)
|
|
r = requests.post(self.userPath, json=u, auth=self.auth, verify=self.verify)
|
|
self.printResponse(r)
|
|
self.printResponse(r)
|
|
|
|
|
|
@@ -280,13 +297,17 @@ class SFTPGoApiRequests:
|
|
s3_key_prefix='', gcs_bucket='', gcs_key_prefix='', gcs_storage_class='', gcs_credentials_file='',
|
|
s3_key_prefix='', gcs_bucket='', gcs_key_prefix='', gcs_storage_class='', gcs_credentials_file='',
|
|
gcs_automatic_credentials='automatic', denied_login_methods=[], virtual_folders=[], denied_extensions=[],
|
|
gcs_automatic_credentials='automatic', denied_login_methods=[], virtual_folders=[], denied_extensions=[],
|
|
allowed_extensions=[], s3_upload_part_size=0, s3_upload_concurrency=0, max_upload_file_size=0,
|
|
allowed_extensions=[], s3_upload_part_size=0, s3_upload_concurrency=0, max_upload_file_size=0,
|
|
- denied_protocols=[], disconnect=0):
|
|
|
|
|
|
+ denied_protocols=[], disconnect=0, az_container="",
|
|
|
|
+ az_account_name="", az_account_key="", az_sas_url="", az_endpoint="", az_upload_part_size=0,
|
|
|
|
+ az_upload_concurrency=0, az_key_prefix="", az_use_emulator=False):
|
|
u = self.buildUserObject(user_id, username, password, public_keys, home_dir, uid, gid, max_sessions,
|
|
u = self.buildUserObject(user_id, username, password, public_keys, home_dir, uid, gid, max_sessions,
|
|
quota_size, quota_files, self.buildPermissions(perms, subdirs_permissions), upload_bandwidth, download_bandwidth,
|
|
quota_size, quota_files, self.buildPermissions(perms, subdirs_permissions), upload_bandwidth, download_bandwidth,
|
|
status, expiration_date, allowed_ip, denied_ip, fs_provider, s3_bucket, s3_region, s3_access_key,
|
|
status, expiration_date, allowed_ip, denied_ip, fs_provider, s3_bucket, s3_region, s3_access_key,
|
|
s3_access_secret, s3_endpoint, s3_storage_class, s3_key_prefix, gcs_bucket, gcs_key_prefix, gcs_storage_class,
|
|
s3_access_secret, s3_endpoint, s3_storage_class, s3_key_prefix, gcs_bucket, gcs_key_prefix, gcs_storage_class,
|
|
gcs_credentials_file, gcs_automatic_credentials, denied_login_methods, virtual_folders, denied_extensions,
|
|
gcs_credentials_file, gcs_automatic_credentials, denied_login_methods, virtual_folders, denied_extensions,
|
|
- allowed_extensions, s3_upload_part_size, s3_upload_concurrency, max_upload_file_size, denied_protocols)
|
|
|
|
|
|
+ allowed_extensions, s3_upload_part_size, s3_upload_concurrency, max_upload_file_size, denied_protocols,
|
|
|
|
+ az_container, az_account_name, az_account_key, az_sas_url, az_endpoint, az_upload_part_size,
|
|
|
|
+ az_upload_concurrency, az_key_prefix, az_use_emulator)
|
|
r = requests.put(urlparse.urljoin(self.userPath, 'user/' + str(user_id)), params={'disconnect':disconnect},
|
|
r = requests.put(urlparse.urljoin(self.userPath, 'user/' + str(user_id)), params={'disconnect':disconnect},
|
|
json=u, auth=self.auth, verify=self.verify)
|
|
json=u, auth=self.auth, verify=self.verify)
|
|
self.printResponse(r)
|
|
self.printResponse(r)
|
|
@@ -593,7 +614,7 @@ def addCommonUserArguments(parser):
|
|
parser.add_argument('--allowed-extensions', type=str, nargs='*', default=[], help='Allowed file extensions case insensitive. '
|
|
parser.add_argument('--allowed-extensions', type=str, nargs='*', default=[], help='Allowed file extensions case insensitive. '
|
|
+'The format is /dir::ext1,ext2. For example: "/somedir::.jpg,.png" "/otherdir/subdir::.zip,.rar". ' +
|
|
+'The format is /dir::ext1,ext2. For example: "/somedir::.jpg,.png" "/otherdir/subdir::.zip,.rar". ' +
|
|
'Default: %(default)s')
|
|
'Default: %(default)s')
|
|
- parser.add_argument('--fs', type=str, default='local', choices=['local', 'S3', 'GCS'],
|
|
|
|
|
|
+ parser.add_argument('--fs', type=str, default='local', choices=['local', 'S3', 'GCS', "AzureBlob"],
|
|
help='Filesystem provider. Default: %(default)s')
|
|
help='Filesystem provider. Default: %(default)s')
|
|
parser.add_argument('--s3-bucket', type=str, default='', help='Default: %(default)s')
|
|
parser.add_argument('--s3-bucket', type=str, default='', help='Default: %(default)s')
|
|
parser.add_argument('--s3-key-prefix', type=str, default='', help='Virtual root directory. If non empty only this ' +
|
|
parser.add_argument('--s3-key-prefix', type=str, default='', help='Virtual root directory. If non empty only this ' +
|
|
@@ -616,6 +637,19 @@ def addCommonUserArguments(parser):
|
|
parser.add_argument('--gcs-credentials-file', type=str, default='', help='Default: %(default)s')
|
|
parser.add_argument('--gcs-credentials-file', type=str, default='', help='Default: %(default)s')
|
|
parser.add_argument('--gcs-automatic-credentials', type=str, default='automatic', choices=['explicit', 'automatic'],
|
|
parser.add_argument('--gcs-automatic-credentials', type=str, default='automatic', choices=['explicit', 'automatic'],
|
|
help='If you provide a credentials file this argument will be setted to "explicit". Default: %(default)s')
|
|
help='If you provide a credentials file this argument will be setted to "explicit". Default: %(default)s')
|
|
|
|
+ parser.add_argument('--az-container', type=str, default='', help='Default: %(default)s')
|
|
|
|
+ parser.add_argument('--az-account-name', type=str, default='', help='Default: %(default)s')
|
|
|
|
+ parser.add_argument('--az-account-key', type=str, default='', help='Default: %(default)s')
|
|
|
|
+ parser.add_argument('--az-sas-url', type=str, default='', help='Shared access signature URL. Default: %(default)s')
|
|
|
|
+ parser.add_argument('--az-endpoint', type=str, default='', help='Default: %(default)s')
|
|
|
|
+ parser.add_argument('--az-upload-part-size', type=int, default=0, help='The buffer size for multipart uploads (MB). ' +
|
|
|
|
+ 'Zero means the default (1 MB). Default: %(default)s')
|
|
|
|
+ parser.add_argument('--az-upload-concurrency', type=int, default=0, help='How many parts are uploaded in parallel. ' +
|
|
|
|
+ 'Zero means the default (1). Default: %(default)s')
|
|
|
|
+ parser.add_argument('--az-key-prefix', type=str, default='', help='Virtual root directory. If non empty only this ' +
|
|
|
|
+ 'directory and its contents will be available. Cannot start with "/". For example "folder/subfolder/".' +
|
|
|
|
+ ' Default: %(default)s')
|
|
|
|
+ parser.add_argument('--az-use-emulator', type=bool, default=False, help='Default: %(default)s')
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
if __name__ == '__main__':
|
|
@@ -769,7 +803,9 @@ if __name__ == '__main__':
|
|
args.s3_endpoint, args.s3_storage_class, args.s3_key_prefix, args.gcs_bucket, args.gcs_key_prefix,
|
|
args.s3_endpoint, args.s3_storage_class, args.s3_key_prefix, args.gcs_bucket, args.gcs_key_prefix,
|
|
args.gcs_storage_class, args.gcs_credentials_file, args.gcs_automatic_credentials,
|
|
args.gcs_storage_class, args.gcs_credentials_file, args.gcs_automatic_credentials,
|
|
args.denied_login_methods, args.virtual_folders, args.denied_extensions, args.allowed_extensions,
|
|
args.denied_login_methods, args.virtual_folders, args.denied_extensions, args.allowed_extensions,
|
|
- args.s3_upload_part_size, args.s3_upload_concurrency, args.max_upload_file_size, args.denied_protocols)
|
|
|
|
|
|
+ args.s3_upload_part_size, args.s3_upload_concurrency, args.max_upload_file_size, args.denied_protocols,
|
|
|
|
+ args.az_container, args.az_account_name, args.az_account_key, args.az_sas_url, args.az_endpoint,
|
|
|
|
+ args.az_upload_part_size, args.az_upload_concurrency, args.az_key_prefix, args.az_use_emulator)
|
|
elif args.command == 'update-user':
|
|
elif args.command == 'update-user':
|
|
api.updateUser(args.id, args.username, args.password, args.public_keys, args.home_dir, args.uid, args.gid,
|
|
api.updateUser(args.id, args.username, args.password, args.public_keys, args.home_dir, args.uid, args.gid,
|
|
args.max_sessions, args.quota_size, args.quota_files, args.permissions, args.upload_bandwidth,
|
|
args.max_sessions, args.quota_size, args.quota_files, args.permissions, args.upload_bandwidth,
|
|
@@ -779,7 +815,9 @@ if __name__ == '__main__':
|
|
args.s3_key_prefix, args.gcs_bucket, args.gcs_key_prefix, args.gcs_storage_class,
|
|
args.s3_key_prefix, args.gcs_bucket, args.gcs_key_prefix, args.gcs_storage_class,
|
|
args.gcs_credentials_file, args.gcs_automatic_credentials, args.denied_login_methods,
|
|
args.gcs_credentials_file, args.gcs_automatic_credentials, args.denied_login_methods,
|
|
args.virtual_folders, args.denied_extensions, args.allowed_extensions, args.s3_upload_part_size,
|
|
args.virtual_folders, args.denied_extensions, args.allowed_extensions, args.s3_upload_part_size,
|
|
- args.s3_upload_concurrency, args.max_upload_file_size, args.denied_protocols, args.disconnect)
|
|
|
|
|
|
+ args.s3_upload_concurrency, args.max_upload_file_size, args.denied_protocols, args.disconnect,
|
|
|
|
+ args.az_container, args.az_account_name, args.az_account_key, args.az_sas_url, args.az_endpoint,
|
|
|
|
+ args.az_upload_part_size, args.az_upload_concurrency, args.az_key_prefix, args.az_use_emulator)
|
|
elif args.command == 'delete-user':
|
|
elif args.command == 'delete-user':
|
|
api.deleteUser(args.id)
|
|
api.deleteUser(args.id)
|
|
elif args.command == 'get-users':
|
|
elif args.command == 'get-users':
|