#!/usr/bin/env python # --------------------------------------------------------------------------------------------- # http://doc01.interdubs.com/wikanual/index.php/Python_API for Documentation # Version from 091017 # 091017 added dictionary_to_credits # 091106 added create_login_wfolder (as create_login) # 091107 added list_logins # 091107 added login_delete_ak # 091111 added get_node_credit # 091111 added add_node_credit # 091111 updated uploadfile_into_path to accept credits as dictionary # 091111 added credits as dictionary to chkmkpath # 091111 added create_login # 091111 added assign_folder_to_login # 091219 added get_node_ak_for_id old func get_node_info is aliased # 091219 added get_node_id_for_ak # 091219 added ability to upload into uploadfile_into_ak # 100209 added expiration date for uploads into uploadfile_into_node # 100612 added get_segment_name via 2nd return value of get_quota_avail # 101030 added add_node_note to allow setting of a node # 111003 added delete_expired get_mb_expired get_mb_used # 111018 added assign_note_to_login # 111024 added delete_emptyfolders # 120608 fixed data center in upload # 120704 added get_login_info # 131105 added create_login2 which will return login_id and ak - published 150429 # 151107 added function assign_look_to_login # 160624 added function create_job # 160712 added function assign_login_to_job # 160712 added function assign_login_to_job_id # 180208 added function add_client_comment # 180221 added function add_client_comment2 # 180226 added function test_login_creds # 190717 added use of _idx_done_ flag in uploads - avoid 60 second age wait on ingest # --------------------------------------------------------------------------------------------- __version__ = "101030" # --------------------------------------------------------------------------------------------- # Imports # --------------------------------------------------------------------------------------------- import sys import os import tempfile import ftplib import urllib import time import types from urlparse import urlparse from pprint import pformat # --------------------------------------------------------------------------------------------- # INTERDUBS Object - first section are functions that implement API calls 1 to 1 # --------------------------------------------------------------------------------------------- class Interdubs: # Initialize Interdubs. def __init__(self, IDX_URL, IDX_APIKEY): self.IDX_APIKEY = IDX_APIKEY self.IDX_URL = IDX_URL # gets the number of uses we have left, uses same API call then get_segment def get_quota_avail( self ): func = "get_quota_avail" url = self.IDX_URL url += "?" url += "idxapi_key=" + urllib.quote(self.IDX_APIKEY) url += "&" url += "idxapi_function=" + func f = urllib.urlopen(url) ret = f.readlines() f.close if (len(ret) < 1): print func + " => fatal API error nothing got returned" sys.exit() if (ret[0] != "IDXAPI_OK: " + func + "\n"): print func + " => unexpected API return for IDXAPI_OK:" + ret[0] sys.exit() idkey = "IDXAPI_QUOTA_AVAIL_NUM: " if (ret[1].find(idkey) == 0): id = ret[1].replace(idkey, "") id = id.replace ("\n", "") return (id) else: print func + " => unexpected API return for " + idkey + " " + ret[1] sys.exit() #we ignore 2nd return value here def get_segment_name( self ): func = "get_quota_avail" url = self.IDX_URL url += "?" url += "idxapi_key=" + urllib.quote(self.IDX_APIKEY) url += "&" url += "idxapi_function=" + func f = urllib.urlopen(url) ret = f.readlines() f.close if (len(ret) < 1): print func + " => fatal API error nothing got returned" sys.exit() if (ret[0] != "IDXAPI_OK: " + func + "\n"): print func + " => unexpected API return for IDXAPI_OK:" + ret[0] sys.exit() idkey = "IDXAPI_QUOTA_AVAIL_NUM: " if (ret[1].find(idkey) != 0): print func + " => unexpected API return for " + idkey + " " + ret[1] sys.exit() idkey = "IDXAPI_SEGMENT_NAME: " if (ret[2].find(idkey) == 0): id = ret[2].replace(idkey, "") id = id.replace ("\n", "") return (id) else: print func + " => unexpected API return for " + idkey + " " + ret[2] sys.exit() # deletes a node indified by ID def node_delete_id( self, folderid): func = "delete_node" url = self.IDX_URL url += "?" url += "idxapi_key=" + self.IDX_APIKEY url += "&" url += "idxapi_function=" + func url += "&" url += "idxapi_par1=" + str(folderid) f = urllib.urlopen(url) ret = f.readlines() f.close if (len(ret) < 1): print func + " => fatal API error nothing got returned" sys.exit() if (ret[0] != "IDXAPI_OK: " + func + "\n"): print func + " => unexpected API return for IDXAPI_OK:" + ret[0] sys.exit() # deletes a login indified by AK def login_delete_ak( self, ak): func = "login_delete_ak" url = self.IDX_URL url += "?" url += "idxapi_key=" + self.IDX_APIKEY url += "&" url += "idxapi_function=" + func url += "&" url += "idxapi_par1=" + str(ak) f = urllib.urlopen(url) ret = f.readlines() f.close if (len(ret) < 1): print func + " => fatal API error nothing got returned" sys.exit() if (ret[0] != "IDXAPI_OK: " + func + "\n"): print func + " => unexpected API return for IDXAPI_OK:" + ret[0] sys.exit() # lists all logins def list_logins( self): func = "list_logins" url = self.IDX_URL url += "?" url += "idxapi_key=" + self.IDX_APIKEY url += "&" url += "idxapi_function=" + func f = urllib.urlopen(url) ret = f.readlines() f.close if (len(ret) < 1): print func + " => fatal API error nothing got returned" sys.exit() if (ret[0] != "IDXAPI_OK: " + func + "\n"): print func + " => unexpected API return for IDXAPI_OK:" + ret[0] sys.exit() numfo = self.getpar(ret[1] , "IDXAPI_LOGINS_NUM: ") #print numfo numfo = int(numfo) i = 2 rv = list() while (numfo > 0): n = self.getpar(ret[i] , "IDXAPI_LOGINS_NAME_STR: ") #print "n: " + n i = i + 1 f = self.getpar(ret[i] , "IDXAPI_LOGINS_FOLDER_ID: ") #print "f: " + f i = i + 1 a = self.getpar(ret[i] , "IDXAPI_LOGINS_AK: ") #print "a: " + a i = i + 1 numfo = numfo - 1 rv.append( { 'name': n , 'folder' : f , 'ak' : a }) #print ret return (rv) def getpar( self, line , parname ): if (line.find( parname) == 0): ret = line.replace(parname, "") ret = ret.replace ("\n", "") else: print func + " => unexpected API return for " + parname + " in " + line sys.exit() return (ret) # checks if a file exists in a given folder, and returns its ID if so def node_exists( self, filename , folderid): func = "list_node_ids" url = self.IDX_URL url += "?" url += "idxapi_key=" + self.IDX_APIKEY url += "&" url += "idxapi_function=" + func url += "&" url += "idxapi_par1=" + urllib.quote(filename) url += "&" url += "idxapi_par2=" + str(folderid) f = urllib.urlopen(url) ret = f.readlines() f.close if (len(ret) < 1): print func + " => fatal API error nothing got returned" sys.exit() if (ret[0] != "IDXAPI_OK: " + func + "\n"): print func + " => unexpected API return for IDXAPI_OK:" + ret[0] sys.exit() if (ret[1] == "IDXAPI_NODE_IDS_NUM: 0\n"): return 0 idkey = "IDXAPI_NODE_IDS_ID: " if (ret[2].find(idkey) == 0): id = ret[2].replace(idkey, "") id = id.replace ("\n", "") return (id) else: print func + " => unexpected API return for " + idkey + " " + ret[2] sys.exit() #retrieves the upload_handle for giving node def get_folder_upload_handle( self, node_id): func = "get_folder_upload_handle" url = self.IDX_URL url += "?" url += "idxapi_key=" + self.IDX_APIKEY url += "&" url += "idxapi_function=" + func url += "&" url += "idxapi_par1=" + str(node_id) f = urllib.urlopen(url) ret = f.readlines() f.close if (len(ret) < 1): print func + " => fatal API error nothing got returned" sys.exit() if (ret[0] != "IDXAPI_OK: " + func + "\n"): print func + " => unexpected API return for IDXAPI_OK:" + ret[0] sys.exit() idkey = "IDXAPI_FOLDER_ULH: " if (ret[1].find(idkey) == 0): ak = ret[1].replace(idkey, "") ak = ak.replace ("\n", "") return (ak) else: print func + " => unexpected API return for " + idkey + " " + ret[1] sys.exit() #sets note node def add_node_note( self, node_id, note): func = "add_node_note" url = self.IDX_URL url += "?" url += "idxapi_key=" + self.IDX_APIKEY url += "&" url += "idxapi_function=" + func url += "&" url += "idxapi_par1=" + str(node_id) url += "&" url += "idxapi_par2=" + urllib.quote(note) f = urllib.urlopen(url) ret = f.readlines() f.close if (len(ret) < 1): print func + " => fatal API error nothing got returned" sys.exit() if (ret[0] != "IDXAPI_OK: " + func + "\n"): print func + " => unexpected API return for IDXAPI_OK:" + ret[0] sys.exit() #ads one credit to a node def add_node_credit( self, node_id, credit_role, credit_person): func = "add_node_credit" url = self.IDX_URL url += "?" url += "idxapi_key=" + self.IDX_APIKEY url += "&" url += "idxapi_function=" + func url += "&" url += "idxapi_par1=" + str(node_id) url += "&" url += "idxapi_par2=" + urllib.quote(credit_role) url += "&" url += "idxapi_par3=" + urllib.quote(credit_person) f = urllib.urlopen(url) ret = f.readlines() f.close if (len(ret) < 1): print func + " => fatal API error nothing got returned" sys.exit() if (ret[0] != "IDXAPI_OK: " + func + "\n"): print func + " => unexpected API return for IDXAPI_OK:" + ret[0] sys.exit() #gets the credit for a node def get_node_credit( self, node_id): func = "get_node_credit" url = self.IDX_URL url += "?" url += "idxapi_key=" + self.IDX_APIKEY url += "&" url += "idxapi_function=" + func url += "&" url += "idxapi_par1=" + str(node_id) f = urllib.urlopen(url) ret = f.readlines() f.close if (len(ret) < 1): print func + " => fatal API error nothing got returned" sys.exit() if (ret[0] != "IDXAPI_OK: " + func + "\n"): print func + " => unexpected API return for IDXAPI_OK:" + ret[0] sys.exit() #todo parse the credits here to be more meaningful return ret #so that old calls still work def get_node_info (self , node_id): return self.get_node_ak_for_id(node_id) #retrieves the 6 character IDX access code IdxCode for a given node def get_node_ak_for_id( self, node_id): func = "get_node_ak_for_id" url = self.IDX_URL url += "?" url += "idxapi_key=" + self.IDX_APIKEY url += "&" url += "idxapi_function=" + func url += "&" url += "idxapi_par1=" + str(node_id) f = urllib.urlopen(url) ret = f.readlines() f.close if (len(ret) < 1): print func + " => fatal API error nothing got returned" sys.exit() if (ret[0] != "IDXAPI_OK: " + func + "\n"): print func + " => unexpected API return for IDXAPI_OK:" + ret[0] sys.exit() idkey = "IDXAPI_NODE_AK: " if (ret[1].find(idkey) == 0): ak = ret[1].replace(idkey, "") ak = ak.replace ("\n", "") return (ak) else: print func + " => unexpected API return for " + idkey + " " + ret[1] sys.exit() #retrieves the node_id for a given 6 character IDX access code IdxCode def get_node_id_for_ak( self, ak): func = "get_node_id_for_ak" url = self.IDX_URL url += "?" url += "idxapi_key=" + self.IDX_APIKEY url += "&" url += "idxapi_function=" + func url += "&" url += "idxapi_par1=" + ak f = urllib.urlopen(url) ret = f.readlines() f.close if (len(ret) < 1): print func + " => fatal API error nothing got returned" sys.exit() if (ret[0] != "IDXAPI_OK: " + func + "\n"): print func + " => unexpected API return for IDXAPI_OK:" + ret[0] sys.exit() idkey = "IDXAPI_NODE_ID: " if (ret[1].find(idkey) == 0): ak = ret[1].replace(idkey, "") ak = ak.replace ("\n", "") return (ak) else: print func + " => unexpected API return for " + idkey + " " + ret[1] sys.exit() # creates a folder with name inside of folder ID , returns the ID of the newly created folder def create_dir ( self, name , folderid): func = "create_folder" url = self.IDX_URL url += "?" url += "idxapi_key=" + self.IDX_APIKEY url += "&" url += "idxapi_function=" + func url += "&" url += "idxapi_par1=" + urllib.quote(name) url += "&" url += "idxapi_par2=" + str(folderid) f = urllib.urlopen(url) ret = f.readlines() f.close if (len(ret) < 1): print func + " => fatal API error nothing got returned" sys.exit() if (ret[0] != "IDXAPI_OK: " + func + "\n"): print func + " => unexpected API return for IDXAPI_OK:" + ret[0] sys.exit() idkey = "IDXAPI_FOLDER_ID: " if (ret[1].find(idkey) == 0): id = ret[1].replace(idkey, "") id = id.replace ("\n", "") return (id) else: print func + " =>unexpected API return for " + idkey + " " + ret[1] sys.exit() def assign_folder_to_login(self , login_id, folder_id ): #print "login_name: [%s] password: [%s]" % (login_name , password) func = "assign_folder_to_login" url = self.IDX_URL url += "?" url += "idxapi_key=" + self.IDX_APIKEY url += "&" url += "idxapi_function=" + func url += "&" url += "idxapi_par1=" + str(login_id) url += "&" url += "idxapi_par2=" + str(folder_id) f = urllib.urlopen(url) ret = f.readlines() f.close if (len(ret) < 1): print func + " => fatal API error nothing got returned" sys.exit() if (ret[0] != "IDXAPI_OK: " + func + "\n"): print func + " => unexpected API return for IDXAPI_OK:" + ret[0] sys.exit() def create_login(self , login_name, password ): #print "login_name: [%s] password: [%s]" % (login_name , password) func = "create_login" url = self.IDX_URL url += "?" url += "idxapi_key=" + self.IDX_APIKEY url += "&" url += "idxapi_function=" + func url += "&" url += "idxapi_par1=" + urllib.quote(login_name) url += "&" url += "idxapi_par2=" + urllib.quote(password) f = urllib.urlopen(url) ret = f.readlines() f.close if (len(ret) < 1): print func + " => fatal API error nothing got returned" sys.exit() if (ret[0] != "IDXAPI_OK: " + func + "\n"): print func + " => unexpected API return for IDXAPI_OK:" + ret[0] sys.exit() login_id = self.getpar(ret[1] , "IDXAPI_LOGIN_ID: ") login_ak = self.getpar(ret[2] , "IDXAPI_LOGIN_AK: ") return (login_id) def create_login2(self , login_name, password ): #print "login_name: [%s] password: [%s]" % (login_name , password) func = "create_login" url = self.IDX_URL url += "?" url += "idxapi_key=" + self.IDX_APIKEY url += "&" url += "idxapi_function=" + func url += "&" url += "idxapi_par1=" + urllib.quote(login_name) url += "&" url += "idxapi_par2=" + urllib.quote(password) f = urllib.urlopen(url) ret = f.readlines() f.close if (len(ret) < 1): print func + " => fatal API error nothing got returned" sys.exit() if (ret[0] != "IDXAPI_OK: " + func + "\n"): print func + " => unexpected API return for IDXAPI_OK:" + ret[0] sys.exit() login_id = self.getpar(ret[1] , "IDXAPI_LOGIN_ID: ") login_ak = self.getpar(ret[2] , "IDXAPI_LOGIN_AK: ") return (login_id, login_ak) def create_job(self , job_name): #print "job_name: [%s] " % (login_name) func = "create_job" url = self.IDX_URL url += "?" url += "idxapi_key=" + self.IDX_APIKEY url += "&" url += "idxapi_function=" + func url += "&" url += "idxapi_par1=" + urllib.quote(job_name) f = urllib.urlopen(url) ret = f.readlines() f.close if (len(ret) < 1): print func + " => fatal API error nothing got returned" sys.exit() if (ret[0] != "IDXAPI_OK: " + func + "\n"): print func + " => unexpected API return for IDXAPI_OK:" + ret[0] sys.exit() job_id = self.getpar(ret[1] , "IDXAPI_JOB_ID: ") return (job_id) def create_login_wfolder(self , login_name, password ): #print "login_name: [%s] password: [%s]" % (login_name , password) func = "create_login_wfolder" url = self.IDX_URL url += "?" url += "idxapi_key=" + self.IDX_APIKEY url += "&" url += "idxapi_function=" + func url += "&" url += "idxapi_par1=" + urllib.quote(login_name) url += "&" url += "idxapi_par2=" + urllib.quote(password) f = urllib.urlopen(url) ret = f.readlines() f.close if (len(ret) < 1): print func + " => fatal API error nothing got returned" sys.exit() if (ret[0] != "IDXAPI_OK: " + func + "\n"): print func + " => unexpected API return for IDXAPI_OK:" + ret[0] sys.exit() login_id = self.getpar(ret[1] , "IDXAPI_LOGIN_ID: ") login_ak = self.getpar(ret[2] , "IDXAPI_LOGIN_AK: ") folder_id = self.getpar(ret[3] , "IDXAPI_FOLDER_ID: ") fodler_ak = self.getpar(ret[4] , "IDXAPI_FOLDER_AK: ") return (login_id) # functions that do not call the API directly but that group functionalities to meaningful entities # # returns the ID for a folder or file specified by path def get_nodeid_forpath( self, path ): idxfolder = 1 for pathcomp in path.split('/'): if (pathcomp != '' ): #leading slashes id = self.node_exists (pathcomp, idxfolder) if (id == 0): return 0 idxfolder = id return idxfolder # # below are functions that use the API calls above to implement functions that are probably nice to use # # checks if we can connect to the API, the key is right and there are uses left on the quota def check_api ( self ): quota_avail = self.get_quota_avail() if (quota_avail == "-1"): print "The IDX_APIKEY \"%s\" could not be found." % self.IDX_APIKEY sys.exit() if (quota_avail == "-2"): print "The IDX_APIKEY \"%s\" has been deactivated." % self.IDX_APIKEY sys.exit() if (quota_avail == "0"): print "The quota for IDX_APIKEY \"%s\" has been exhausted." % self.IDX_APIKEY return (quota_avail) # checks if a path exists and if not creates it, does for all components in a path def chkmkpath ( self, path , credits="" ): idxfolder = 1 for pathcomp in path.split('/'): if (pathcomp != '' ): #leading slashes id = self.node_exists (pathcomp, idxfolder) if (id == 0): id = self.create_dir (pathcomp, idxfolder) idxfolder = id if (credits != ""): for k in credits.keys(): self.add_node_credit(idxfolder, k ,self.formatcreditv (credits[k])) return (idxfolder) # delete a file or folder specified by path def node_delete_path ( self, path ): node_id =self.get_nodeid_forpath(path) if (node_id == 0): print "path " + path + " did not result in valid node" return 0 self.node_delete_id(node_id) def formatcreditv (seft, inv): if type(inv) == types.ListType: ret = pformat(inv) return (ret) if type(inv) == types.DictType: ret = pformat(inv) return (ret) ret = str(inv) return (ret) # converts a python dictionary into a string that can be passed to the credits field of uploadfile_into_path() def dictionary_to_credits (self , indict): retcred = "" for k in indict.keys(): #todo insert pformat array dictionary retcred += k + ': ' + self.formatcreditv(indict[k]) + '\n' return retcred # upload a file from sourcefile into a folder, specified by the IDX path 'path' # optional parameters are: # title the visible title of the file (can contain all imaginable characters) # note a note for the file # tags associated to the file, as a python dictionary # credits associated to the file, as a python dictionary # please see http://www.interdubs.com/wikanual/index.php/Ftp#meta_data for details #there are three ways of calling this: def uploadfile_into_path (self, sourcefile, path, replace="1", title="", note="", tags="", credits="", expiration=""): node_id = self.get_nodeid_forpath(path) if (node_id == 0): print "path " + path + " did not result in valid node" return 0 if (replace): (head, tail) = os.path.split(sourcefile) pathtoreplace = path + '/' + tail existing_id = self.get_nodeid_forpath(pathtoreplace) if (existing_id): self.node_delete_id(existing_id) self.uploadfile_into_node (sourcefile, node_id, replace, title, note, tags, credits, expiration) def uploadfile_into_ak (self, sourcefile, ak, replace="1", title="", note="", tags="", credits="", expiration=""): node_id = self.get_node_id_for_ak(ak) if (node_id == 0): print "ak " + ak + " did not result in valid node" return 0 self.uploadfile_into_node (sourcefile, node_id, replace, title, note, tags, credits, expiration) def uploadfile_into_node (self, sourcefile, node_id, replace="1", title="", note="", tags="", credits="", expiration=""): fd = open (sourcefile) fd.close() ecount = 0 tempfilelist = list() ulh = self.get_folder_upload_handle(node_id) o = urlparse(self.IDX_URL) ftp = ftplib.FTP(o.netloc) ftp.login ('idxftpin', 'p8812wjje9') try: ftp.mkd(ulh) except ftplib.error_perm, e: ecount += 1 try: ftp.cwd(ulh) except ftplib.error_perm, e: ecount += 1 (head, tail) = os.path.split(sourcefile) if (title != ""): tmp_fd, tfn = tempfile.mkstemp() tfh = os.fdopen (tmp_fd, 'w+b') tfh.write (title) tfh.close() fd = open (tfn) ftpfile = "_idx_title_" + tail ftp.storbinary ("STOR "+ ftpfile , fd) fd.close tempfilelist.append(tfn) if (note != ""): tmp_fd, tfn = tempfile.mkstemp() tfh = os.fdopen (tmp_fd, 'w+b') tfh.write (note) tfh.close() fd = open (tfn) ftpfile = "_idx_note_" + tail ftp.storbinary ("STOR "+ ftpfile , fd) fd.close tempfilelist.append(tfn) if (tags != ""): tags = self.dictionary_to_credits(tags) tmp_fd, tfn = tempfile.mkstemp() tfh = os.fdopen (tmp_fd, 'w+b') tfh.write (tags) tfh.close() fd = open (tfn) ftpfile = "_idx_tags_" + tail ftp.storbinary ("STOR "+ ftpfile , fd) fd.close tempfilelist.append(tfn) if (credits != ""): credits = self.dictionary_to_credits(credits) tmp_fd, tfn = tempfile.mkstemp() tfh = os.fdopen (tmp_fd, 'w+b') tfh.write (credits) tfh.close() fd = open (tfn) ftpfile = "_idx_credits_" + tail ftp.storbinary ("STOR "+ ftpfile , fd) fd.close tempfilelist.append(tfn) if (expiration != ""): tmp_fd, tfn = tempfile.mkstemp() tfh = os.fdopen (tmp_fd, 'w+b') if type (expiration): out = str (expiration) else: out = expiration tfh.write (out) tfh.close() fd = open (tfn) ftpfile = "_idx_expiration_" + tail ftp.storbinary ("STOR "+ ftpfile , fd) fd.close tempfilelist.append(tfn) fd = open (sourcefile, "rb") ftp.storbinary ("STOR "+ tail , fd) fd.close #190717 adding _idx_done_ after upload tmp_fd, tfn = tempfile.mkstemp() tfh = os.fdopen (tmp_fd, 'w+b') tfh.write ('content does not matter') tfh.close() fd = open (tfn) ftpfile = "_idx_done_" + tail ftp.storbinary ("STOR "+ ftpfile , fd) fd.close tempfilelist.append(tfn) ftp.quit() for tfn in tempfilelist: try: os.remove (tfn) except OSError: time.sleep(0.3) try: os.remove (tfn) except OSError: print "Tried twice to remove temp file. Giving up" #please note that finished uploads take 1 minute to appear in INTERDUBS # added on 111003 - request the number of MB in use def get_mb_used( self ): func = "get_mb_used" url = self.IDX_URL url += "?" url += "idxapi_key=" + urllib.quote(self.IDX_APIKEY) url += "&" url += "idxapi_function=" + func f = urllib.urlopen(url) ret = f.readlines() f.close if (len(ret) < 1): print func + " => fatal API error nothing got returned" sys.exit() if (ret[0] != "IDXAPI_OK: " + func + "\n"): print func + " => unexpected API return for IDXAPI_OK:" + ret[0] sys.exit() idkey = "IDXAPI_MB_USED_FLOAT: " if (ret[1].find(idkey) == 0): id = ret[1].replace(idkey, "") id = id.replace ("\n", "") return (id) else: print func + " => unexpected API return for " + idkey + " " + ret[1] sys.exit() # added on 111003 - request the number of MB that are in files expired longer than def get_mb_expired( self, days ): func = "get_mb_expired" url = self.IDX_URL url += "?" url += "idxapi_key=" + urllib.quote(self.IDX_APIKEY) url += "&" url += "idxapi_function=" + func url += "&" url += "idxapi_par1=" + str(days) f = urllib.urlopen(url) ret = f.readlines() f.close if (len(ret) < 1): print func + " => fatal API error nothing got returned" sys.exit() if (ret[0] != "IDXAPI_OK: " + func + "\n"): print func + " => unexpected API return for IDXAPI_OK:" + ret[0] sys.exit() idkey = "IDXAPI_MB_EXPIRED_FLOAT: " if (ret[1].find(idkey) == 0): id = ret[1].replace(idkey, "") id = id.replace ("\n", "") return (id) else: print func + " => unexpected API return for " + idkey + " " + ret[1] sys.exit() # added on 111003 - delete files expired longer than days def delete_expired( self, days ): func = "delete_expired" url = self.IDX_URL url += "?" url += "idxapi_key=" + urllib.quote(self.IDX_APIKEY) url += "&" url += "idxapi_function=" + func url += "&" url += "idxapi_par1=" + str(days) f = urllib.urlopen(url) ret = f.readlines() f.close if (len(ret) < 1): print func + " => fatal API error nothing got returned" sys.exit() if (ret[0] != "IDXAPI_OK: " + func + "\n"): print func + " => unexpected API return for IDXAPI_OK:" + ret[0] sys.exit() def assign_look_to_login(self , login_id, lookcfg_id ): #print "login_name: [%s] password: [%s]" % (login_name , password) func = "assign_look_to_login" url = self.IDX_URL url += "?" url += "idxapi_key=" + urllib.quote(self.IDX_APIKEY) url += "&" url += "idxapi_function=" + func url += "&" url += "idxapi_par1=" + str(login_id) url += "&" url += "idxapi_par2=" + str(lookcfg_id) f = urllib.urlopen(url) ret = f.readlines() f.close if (len(ret) < 1): print func + " => fatal API error nothing got returned" sys.exit() if (ret[0] != "IDXAPI_OK: " + func + "\n"): print func + " => unexpected API return for IDXAPI_OK:" + ret[0] sys.exit() def assign_login_to_job(self , login_id, job_name ): #print "login_name: [%s] password: [%s]" % (login_name , password) func = "assign_login_to_job" url = self.IDX_URL url += "?" url += "idxapi_key=" + urllib.quote(self.IDX_APIKEY) url += "&" url += "idxapi_function=" + func url += "&" url += "idxapi_par1=" + str(login_id) url += "&" url += "idxapi_par2=" + str(job_name) f = urllib.urlopen(url) ret = f.readlines() f.close if (len(ret) < 1): print func + " => fatal API error nothing got returned" sys.exit() if (ret[0] != "IDXAPI_OK: " + func + "\n"): print func + " => unexpected API return for IDXAPI_OK:" + ret[0] sys.exit() def assign_login_to_job_id(self , login_id, job_id ): #print "login_name: [%s] password: [%s]" % (login_name , password) func = "assign_login_to_job_id" url = self.IDX_URL url += "?" url += "idxapi_key=" + urllib.quote(self.IDX_APIKEY) url += "&" url += "idxapi_function=" + func url += "&" url += "idxapi_par1=" + str(login_id) url += "&" url += "idxapi_par2=" + str(job_id) f = urllib.urlopen(url) ret = f.readlines() f.close if (len(ret) < 1): print func + " => fatal API error nothing got returned" sys.exit() if (ret[0] != "IDXAPI_OK: " + func + "\n"): print func + " => unexpected API return for IDXAPI_OK:" + ret[0] sys.exit() def assign_note_to_login(self , login_id, note ): #print "login_name: [%s] password: [%s]" % (login_name , password) func = "assign_note_to_login" url = self.IDX_URL url += "?" url += "idxapi_key=" + urllib.quote(self.IDX_APIKEY) url += "&" url += "idxapi_function=" + func url += "&" url += "idxapi_par1=" + str(login_id) url += "&" url += "idxapi_par2=" + urllib.quote(note) f = urllib.urlopen(url) ret = f.readlines() f.close if (len(ret) < 1): print func + " => fatal API error nothing got returned" sys.exit() if (ret[0] != "IDXAPI_OK: " + func + "\n"): print func + " => unexpected API return for IDXAPI_OK:" + ret[0] sys.exit() # added on 111024 - delete emptyfolders older than days def delete_emptyfolders( self, days ): func = "delete_emptyfolders" url = self.IDX_URL url += "?" url += "idxapi_key=" + urllib.quote(self.IDX_APIKEY) url += "&" url += "idxapi_function=" + func url += "&" url += "idxapi_par1=" + str(days) f = urllib.urlopen(url) ret = f.readlines() f.close if (len(ret) < 1): print func + " => fatal API error nothing got returned" sys.exit() if (ret[0] != "IDXAPI_OK: " + func + "\n"): print func + " => unexpected API return for IDXAPI_OK:" + ret[0] sys.exit() #added 120704 - get information for one login, returns tuple with name, password, folder_id, created_time, expiry_time def get_login_info( self, login_ak): func = "get_login_info" url = self.IDX_URL url += "?" url += "idxapi_key=" + self.IDX_APIKEY url += "&" url += "idxapi_function=" + func url += "&" url += "idxapi_par1=" + str(login_ak) f = urllib.urlopen(url) ret = f.readlines() f.close if (len(ret) < 1): print func + " => fatal API error nothing got returned" sys.exit() if (ret[0] != "IDXAPI_OK: " + func + "\n"): print func + " => unexpected API return for IDXAPI_OK:" + ret[0] sys.exit() idkey = "IDXAPI_LOGIN_NAME_STR: " curkey = 1; if (ret[curkey].find(idkey) == 0): login_name = ret[curkey].replace(idkey, "") login_name = login_name.replace ("\n", "") else: print func + " => unexpected API return for " + idkey + " " + ret[curkey] sys.exit() idkey = "IDXAPI_LOGIN_PASSWORD_STR: " curkey = 2; if (ret[curkey].find(idkey) == 0): password = ret[curkey].replace(idkey, "") password = password.replace ("\n", "") else: print func + " => unexpected API return for " + idkey + " " + ret[curkey] sys.exit() idkey = "IDXAPI_LOGIN_FOLDER_ID: " curkey = 3; if (ret[curkey].find(idkey) == 0): folder_id = ret[curkey].replace(idkey, "") folder_id = folder_id.replace ("\n", "") else: print func + " => unexpected API return for " + idkey + " " + ret[curkey] sys.exit() idkey = "IDXAPI_LOGIN_CREATED_TIME: " curkey = 4; if (ret[curkey].find(idkey) == 0): created = ret[curkey].replace(idkey, "") created = created.replace ("\n", "") else: print func + " => unexpected API return for " + idkey + " " + ret[curkey] sys.exit() idkey = "IDXAPI_LOGIN_EXPIRATION_TIME: " curkey = 5; if (ret[curkey].find(idkey) == 0): expiration = ret[curkey].replace(idkey, "") expiration = expiration.replace ("\n", "") else: print func + " => unexpected API return for " + idkey + " " + ret[curkey] sys.exit() return (login_name, password, folder_id, created, expiration) #added 180208 - add client comment to a file def add_client_comment( self, node_id, comment): func = "add_client_comment" url = self.IDX_URL url += "?" url += "idxapi_key=" + self.IDX_APIKEY url += "&" url += "idxapi_function=" + func url += "&" url += "idxapi_par1=" + str(node_id) url += "&" url += "idxapi_par2=" + urllib.quote(comment) f = urllib.urlopen(url) ret = f.readlines() f.close if (len(ret) < 1): print func + " => fatal API error nothing got returned" sys.exit() if (ret[0] != "IDXAPI_OK: " + func + "\n"): print func + " => unexpected API return for IDXAPI_OK:" + ret[0] sys.exit() #added 180221 - add client comment to a file - via AK and with author def add_client_comment2( self, ak_id, comment, author): func = "add_client_comment2" url = self.IDX_URL url += "?" url += "idxapi_key=" + self.IDX_APIKEY url += "&" url += "idxapi_function=" + func url += "&" url += "idxapi_par1=" + urllib.quote(ak_id) url += "&" url += "idxapi_par2=" + urllib.quote(comment) url += "&" url += "idxapi_par3=" + urllib.quote(author) f = urllib.urlopen(url) ret = f.readlines() f.close if (len(ret) < 1): print func + " => fatal API error nothing got returned" sys.exit() if (ret[0] != "IDXAPI_OK: " + func + "\n"): print func + " => unexpected API return for IDXAPI_OK:" + ret[0] sys.exit() #added 180226 - check if login credentials are valid #returns 1 if credentials are correct - returns 0 if not #ret[2] contains AK on success but is ignored here #ret[2...] contain reasons but are equally ignored def test_login_creds( self, login_name, passw): func = "test_login_creds" url = self.IDX_URL url += "?" url += "idxapi_key=" + self.IDX_APIKEY url += "&" url += "idxapi_function=" + func url += "&" url += "idxapi_par1=" + str(login_name) url += "&" url += "idxapi_par2=" + str(passw) f = urllib.urlopen(url) ret = f.readlines() f.close if (len(ret) < 1): print func + " => fatal API error nothing got returned" sys.exit() if (ret[0] != "IDXAPI_OK: " + func + "\n"): print func + " => unexpected API return for IDXAPI_OK:" + ret[0] sys.exit() if (ret[1] == "IDXAPI_LOGIN_STATUS: OK\n"): return (1) return(0)