class fgShellRepo(Cmd): ############################################################ # ############################################################ def __init__(self): print "Init Repo" verbose = True printLogStdout = False self._service = IRServiceProxy(verbose, printLogStdout) ############################################################ # test ############################################################ """ @options([make_option('-q', '--quick', help='Make things fast'), make_option('-s', '--slow', type=int, help='Make things slow')]) def do_repotest(self, args, opts): arg = ''.join(args) print opts.quick print opts.slow self._log.error("SHElll test in fgshell repo") """ ############################################################ # hist img ############################################################ def do_repohistimg(self, args): args = self.getArgs(args) #connect with the server if not self._service.connection(): print "ERROR: Connection with the server failed" return if(len(args) == 1): imgsList = self._service.histImg(self.user, self.passwd, self.user, args[0]) else: imgsList = self._service.histImg(self.user, self.passwd, self.user, "None") if imgsList == None: print "ERROR: Not image record found" else: try: imgs = eval(imgsList) for key in imgs.keys(): print imgs[key] except: print "Server replied: " + str(imgsList) print "histimg: Error:" + str(sys.exc_info()) + "\n" self._log.error("do_repohistimg: Error interpreting the list of images from Image Repository" + str(sys.exc_info()[0])) def help_repohistimg(self): msg = "Image Repository histimg command: Return information about the " + \ " image historical usage. \n" self.print_man("histimg [imgId]", msg) def do_repohistuser(self, args): args = self.getArgs(args) #connect with the server if not self._service.connection(): print "ERROR: Connection with the server failed" return if(len(args) == 1): userList = self._service.histUser(self.user, self.passwd, self.user, args[0]) else: userList = self._service.histUser(self.user, self.passwd, self.user, "None") if userList == None: print "ERROR: Not user found" else: try: users = eval(userList) for key in users.keys(): print users[key] except: print "Server replied: " + str(userList) + "\n" print "histuser: Error:" + str(sys.exc_info()) + "\n" self._log.error("do_repohistuser: Error interpreting the list of users from Image Repository" + str(sys.exc_info())) def help_repohistuser(self): msg = "Image Repository histuser command: Return information about the " + \ "user historical usage." self.print_man("histuser [userId]", msg) ################### #user ################### def do_repouser(self, args): argslist = args.split("-")[1:] prefix = '' sys.argv=[''] for i in range(len(argslist)): if argslist[i] == "": prefix = '-' else: newlist = argslist[i].split(" ") sys.argv += [prefix+'-'+newlist[0]] newlist = newlist [1:] if len(newlist) > 0: sys.argv += newlist #sys.argv += [prefix+'-'+argslist[i]] prefix = '' #TODO: GVL: maybe do some reformating to smaller line length parser = argparse.ArgumentParser(prog="repouser", formatter_class=argparse.RawDescriptionHelpFormatter, description="User command ") group1 = parser.add_mutually_exclusive_group() group1.add_argument('-a', '--add', dest='usertoAdd', metavar='userId', help='Add new user to the Image Repository') group1.add_argument('-d', '--del', dest='usertoDel', metavar='userId', help='Delete an user to the Image Repository') group1.add_argument('-l', '--list', dest='list', action="store_true", help='List users from Image Repository') group1.add_argument('-m', '--modify', dest='modify', nargs=3, metavar=('userId', 'quota/role/status', 'value'), help='Modify quota, role or status of an user') args = parser.parse_args() used_args = sys.argv[1:] if len(used_args) == 0: parser.print_help() return if ('-a' in used_args or '--add' in used_args): self.repouseradd(args.usertoAdd) if ('-d' in used_args or '--del' in used_args): self.repouserdel(args.usertoDel) if ('-l' in used_args or '--list' in used_args): self.repouserlist("") if ('-m' in used_args or '--modify' in used_args): if args.modify[1].strip() == "quota": print args.modify[0] print args.modify[2] self.reposetuserquota(args.modify[0],args.modify[2]) elif args.modify[1].strip() == "role": if not args.modify[2] in IRTypes.IRUser.Role: print "ERROR: third positional parameter must be one of these: " + str(IRTypes.IRUser.Role) else: self.reposetuserrole(args.modify[0],args.modify[2]) elif args.modify[1].strip() == "status": if not args.modify[2] in IRTypes.IRUser.Status: print "ERROR: third positional parameter must be one of these: " + str(IRTypes.IRUser.Status) else: self.reposetuserstatus(args.modify[0],args.modify[2]) else: print "ERROR: second positional parameter must be quota, role or status" def help_repouser(self): msg = "Repo user command: Manage Image Repository Users " self.print_man("user ", msg) eval("self.do_repouser(\"-h\")") ############################################################ # user add ############################################################ def repouseradd(self, args): '''Image Repository useradd command: Add new user (only Admin user can execut it).''' args = self.getArgs(args) if (len(args) == 1): #connect with the server if not self._service.connection(): print "ERROR: Connection with the server failed" return status = self._service.userAdd(self.user, self.passwd, self.user, args[0]) if(status == "True"): print "User created successfully." print "Remember that you still need to activate this user (see user -m command)\n" else: print "The user has not been created. \n" + \ "Please verify that you are admin and that the username does not exist \n" else: self.help_repouseradd() ############################################################ # user del ############################################################ def repouserdel(self, args): '''Image Repository userdel command: Remove a user (only Admin user can execut it).''' args = self.getArgs(args) if (len(args) == 1): #connect with the server if not self._service.connection(): print "ERROR: Connection with the server failed" return status = self._service.userDel(self.user, self.passwd, self.user, args[0]) if(status == "True"): print "User deleted successfully." else: print "The user has not been deleted. \n" + \ "Please verify that you are admin and that the username exists \n" else: self.help_repouserdel() ############################################################ # userlist ############################################################ def repouserlist(self, args): '''Image Repository userlist command: Get list of users''' #connect with the server if not self._service.connection(): print "ERROR: Connection with the server failed" return userList = self._service.userList(self.user, self.passwd, self.user) if(userList.strip() != None): try: imgs = eval(userList) print str(len(imgs)) + " users found" for key in imgs.keys(): print imgs[key] except: print "Server replied: " + str(userList) print "do_repouserlist: Error:" + str(sys.exc_info()[0]) + "\n" self._log.error("user -l: Error interpreting the list of users from Image Repository" + str(sys.exc_info()[0])) else: print "No list of user returned. \n" + \ "Please verify that you are admin \n" ############################################################ # setuserquota ############################################################ def reposetuserquota(self, userId, value): '''Image Repository setuserquota command: Establish disk space available for users (this is given in bytes). Quota argument allow math expressions like 4*1024''' #connect with the server if not self._service.connection(): print "ERROR: Connection with the server failed" return status = self._service.setUserQuota(self.user, self.passwd, self.user, userId, value) if(status == "True"): print "User quota changed successfully." else: print "The user quota has not been changed. \n" + \ "Please verify that you are admin and that the username exists \n" ############################################################ # userrole ############################################################ def reposetuserrole(self, userId, value): #connect with the server if not self._service.connection(): print "ERROR: Connection with the server failed" return status = self._service.setUserRole(self.user, self.passwd, self.user, userId, value) if(status == "True"): print "User role has been changed successfully." else: print "The user role has not been changed. " + status + "\n"\ "Please verify that you are admin and that the username exists \n" ############################################################ # userstatus ############################################################ def reposetuserstatus(self, userId, value): #connect with the server if not self._service.connection(): print "ERROR: Connection with the server failed" return status = self._service.setUserStatus(self.user, self.passwd, self.user, userId, value) if(status == "True"): print "User status has been changed successfully." else: print "The user status has not been changed. " + status + "\n"\ "Please verify that you are admin and that the username exists \n" ############################################################ # list ############################################################ def do_repolist(self, args): '''Image Repository list command: Get list of images that meet the criteria. If not argument provided it get all images. queryString can "be: * ; * where field=XX, field2=YY; field1,field2 where field3=XX''' #connect with the server if not self._service.connection(): print "ERROR: Connection with the server failed" return if (args.strip() == ""): imgsList = self._service.query(self.user, self.passwd, self.user, "*") else: imgsList = self._service.query(self.user, self.passwd, self.user, args) if(imgsList != None): try: imgs = eval(imgsList) print str(len(imgs)) + " items found" for key in imgs.keys(): print imgs[key] except: print "Server replied: " + str(imgsList) print "list: Error:" + str(sys.exc_info()) + "\n" self._log.error("list: Error interpreting the list of images from Image Repository" + str(sys.exc_info())) else: print "No list of images returned" def help_repolist(self): '''Help message for the repouserlist command''' self.print_man("list [queryString] ", self.do_repolist.__doc__) ############################################################ # modify ############################################################ def do_repomodify(self, args): args = self.getArgs(args) second = "" if(len(args) > 1): for i in range(1, len(args)): second += args[i] + " " #second = second.replace("&", "|") if (len(args) >= 2): #connect with the server if not self._service.connection(): print "ERROR: Connection with the server failed" return status = self._service.updateItem(self.user, self.passwd, self.user, args[0], second) if(status == "True"): print "The metadata of img " + args[0] + " has been updated" else: print "Error in the update. Please verify that you are the owner or that you introduced the correct arguments" else: self.help_repomodify() def help_repomodify(self): msg = "Image Repository modify command: Modify image metadata. Example " + \ "of all values of attributeString (you do not need to provide all of " + \ "them): vmtype=xen & imgtype=opennebula & os=linux & arch=x86_64 & " + \ "description=my image & tag=tag1,tag2 & permission=public & " + \ "imgStatus=available. Some attributes are controlled:" self.print_man("modify <imgId> <Metadata>", msg) first = True # TODO: GVL: maybe this calls for a function? # GVL: _print_first_occurance(self,"vmtype= ", IRTypes.ImgMeta.VmType) for line in textwrap.wrap("vmtype= " + str(IRTypes.ImgMeta.VmType), 64): if first: print " %s" % (line) first = False else: print " %s" % (line) # GVL: _print_first_occurance(self,"imgtype= " + IRTypes.ImgMeta.ImgType) first = True for line in textwrap.wrap("imgtype= " + str(IRTypes.ImgMeta.ImgType), 64): if first: print " %s" % (line) first = False else: print " %s" % (line) # GVL: _print_first_occurance(self, "imgStatus", IRTypes.ImgMeta.ImgStatus) first = True for line in textwrap.wrap("imgStatus= " + str(IRTypes.ImgMeta.ImgStatus), 64): if first: print " %s" % (line) first = False else: print " %s" % (line) # GVL: _print_first_occurance(self, "Permission", IRTypes.ImgMeta.Permission) first = True for line in textwrap.wrap("Permission= " + str(IRTypes.ImgMeta.Permission), 64): if first: print " %s" % (line) first = False else: print " %s" % (line) # GVL: #def _print_first_occurance(self, label, type): # " label is in Permission, imgStatus, imagetype, vmtype" # " type is in IRTypes.ImgMeta.Permission" # first = True # for line in textwrap.wrap(label + "= " + str(type), 64): # if first: # print " %s" % (line) # first = False # else: # print " %s" % (line) ############################################################ # permission ############################################################ def do_reposetpermission(self, args): args = self.getArgs(args) if (len(args) == 2): #connect with the server if not self._service.connection(): print "ERROR: Connection with the server failed" return status = self._service.setPermission(self.user, self.passwd, self.user, args[0], args[1]) if(status == "True"): print "Permission of img " + args[0] + " updated" else: print "The permission have not been changed. " + status else: self.help_reposetpermission() def help_reposetpermission(self): msg = "Image Repository setPermission command: Change image permission." + \ " Permission= " + str(IRTypes.ImgMeta.Permission) self.print_man("setpermission <imgId> <permission>", msg) ############################################################ # get ############################################################ def do_repoget(self, args): '''Image Repository get command: Get an image or only the URI by id.''' args = self.getArgs(args) if (len(args) == 1): #connect with the server if not self._service.connection(): print "ERROR: Connection with the server failed" return imgstatus = self._service.get(self.user, self.passwd, self.user, "img", args[0], "./") if imgstatus: print "The image " + args[0] + " is located in " +imgstatus else: print "Cannot get access to the image with imgId = " + args[0] else: self.help_repoget() def help_repoget(self): '''Help message for the repoget command''' self.print_man("get <imgId>", self.do_repoget.__doc__) ############################################################ # put ############################################################ def do_repoput(self, args): args = self.getArgs(args) second = "" if(len(args) > 1): for i in range(1, len(args)): second += args[i] + " " #second = second.replace("&", "|") status = "" ok = False if (len(args) > 1): #connect with the server if not self._service.connection(): print "ERROR: Connection with the server failed" return status = self._service.put(self.user, self.passwd, self.user, args[0], second) ok = True elif (len(args) == 1): #connect with the server if not self._service.connection(): print "ERROR: Connection with the server failed" return status = self._service.put(self.user, self.passwd, self.user, args[0], "") ok = True else: self.help_repoput() if(ok): if (re.search('^ERROR', status)): print 'The image has not been uploaded. Exit error: ' + status else: print "The image has been uploaded and registered with id " + str(status) def help_repoput(self): msg = "Image Repository put command: Upload a new image and its " + \ "metadata as an attributeString. If no attributeString provided some default values are " + \ "assigned. Example of all values of attributeString (you do not need to " + \ "provide all of them): vmtype=xen & imgtype=opennebula & os=linux & " + \ "arch=x86_64 & description=my image & tag=tag1,tag2 & permission=public & " + \ "imgStatus=available. Some attributes are controlled:" self.print_man("put <imgFile> [attributeString]", msg) # TODO: GVL: If labels would be same capitalizatiion, one could # simplify the code for finding the first occurance via eval. low priority. self.type_print ("vmtype= ", IRTypes.ImgMeta.VmType) self.type_print ("imgtype= ", IRTypes.ImgMeta.ImgType) self.type_print ("imgStatus= ",IRTypes.ImgMeta.ImgStatus) self.type_print ("Permission=" ,IRTypes.ImgMeta.Permission) # GVL: ups ;-) I see Javier had the same idea ;-) I suggest to use this in the help_repomodify ... def type_print (self, label, irtype): first = True for line in textwrap.wrap(label + str(irtype), 64): if first: print " %s" % (line) first = False else: print " %s" % (line) ############################################################ # remove ############################################################ def do_reporemove(self, args): '''The Image Repository remove command: Remove images from the repository.''' args = self.getArgs(args) if (len(args) >= 1): #connect with the server if not self._service.connection(): print "ERROR: Connection with the server failed" return output=self._service.remove(self.user, self.passwd, self.user, args) if ( output == "True"): print "All images have been removed." else: print "Some images have NOT been removed. Images with imgIds= " + str(output) + " have NOT been removed. Please verify the imgIds and if you are the owner" else: self.help_reporemove() def help_reporemove(self): '''Help message for the repremove command''' self.print_man("remove <list of imgId>", self.do_reporemove.__doc__)
def main(): parser = argparse.ArgumentParser(prog="fg-repo", formatter_class=argparse.RawDescriptionHelpFormatter, description="FutureGrid Image Repository Help ", epilog=textwrap.dedent(extra_help())) parser.add_argument('-u', '--user', dest='user', required=True, metavar='user', help='FutureGrid User name') parser.add_argument('-d', '--debug', dest='debug', action="store_true", help='Print logs in the screen for debug') group = parser.add_mutually_exclusive_group(required=True) group.add_argument('-q', '--list', dest='list', nargs='?', default='', metavar='AttributeString', help='Get list of images that meet the criteria.') group.add_argument('-g', '--get', dest='get', metavar='imgId', help='Get an image') group.add_argument('-p', '--put', dest='put', nargs='+', metavar=('imgFile', 'AttributeString'), help='Upload/Register an image') group.add_argument('-m', '--modify', dest='modify', nargs=2, metavar=('imgId', 'AttributeString'), help='Update image metadata') group.add_argument('-r', '--remove', dest='remove', metavar='imgId', nargs="+", help='Delete images from the Repository') group.add_argument('-s', '--setpermission', dest='setpermission', nargs=2, metavar=('imgId', 'permissionString'), help='Set Access permission') group.add_argument('--useradd', dest='useradd', metavar='userId', help='Add a new user to the repository') group.add_argument('--userdel', dest='userdel', metavar='userId', help='Delete an user from the repository') group.add_argument('--userlist', dest='userlist', action="store_true", help='List of users') group.add_argument('--setuserquota', dest='setuserquota', nargs=2, metavar=('userId', 'quotaExpresion'), help='Modify User Quota') group.add_argument('--setuserrole', dest='setuserrole', nargs=2, metavar=('userId', 'role'), help='Modify User Role') group.add_argument('--setuserstatus', dest='setuserstatus', nargs=2, metavar=('userId', 'status'), help='Modify User Status') group.add_argument('--histimg', dest='histimg', nargs='?', metavar='imgId', default='None', help='Get usage info of an Image') group.add_argument('--histuser', dest='histuser', nargs='?', metavar='userId', default='None', help='Get usage info of an User') parser.add_argument('--nopasswd', dest='nopasswd', action="store_true", default=False, help='If this option is used, the password is not requested. This is intended for systems daemons like Inca') args = parser.parse_args() #print sys.argv #print args if len(sys.argv) == 3: print "\nERROR: You need to select and additional option to indicate the operation that you want to do. \n" parser.print_help() verbose = True #This is to print the logs in the screen service = IRServiceProxy(verbose, args.debug) if args.nopasswd == False: print "Please insert the password for the user " + args.user + "" m = hashlib.md5() m.update(getpass()) passwd = m.hexdigest() else: passwd = "None" used_args = sys.argv[1:] print "Your request is in the queue to be processed" #connect with the server if not service.connection(): print "ERROR: Connection with the server failed" sys.exit(1) if ('-q' in used_args or '--list' in used_args): if (args.list == None): imgsList = service.query(args.user, passwd, args.user, "*") else: imgsList = service.query(args.user, passwd, args.user, args.list) #dict wrapped into a list, convert it first #print imgsList if(imgsList != None): try: imgs = eval(imgsList) print str(len(imgs)) + " items found" for key in imgs.keys(): print imgs[key] except: print "Server replied: " + str(imgsList) print "list: Error:" + str(sys.exc_info()) + "\n" service._log.error("list: Error interpreting the list of images from Image Repository" + str(sys.exc_info())) else: print "No list of images returned" elif ('-g' in used_args or '--get' in used_args): #if (args.get[0] == 'img' or args.get[0] == 'uri'): img1 = service.get(args.user, passwd, args.user, "img", args.get, "./") if img1: print "The image " + args.get + " is located in " + img1 else: print "Cannot get access to the image with imgId = " + args.get #else: # print "Error: First argument of -g/--get must be 'img' or 'uri'" elif ('-p' in used_args or '--put' in used_args): status = "" ok = False if (len(args.put) == 2): status = service.put(args.user, passwd, args.user, args.put[0], args.put[1]) ok = True elif (len(args.put) == 1): status = service.put(args.user, passwd, args.user, args.put[0], "") ok = True else: args.print_help() if(ok): if (re.search('^ERROR', status)): print 'The image has not been uploaded. Exit error: ' + status else: print "The image has been uploaded and registered with id " + str(status) elif ('-m' in used_args or '--modify' in used_args): success = service.updateItem(args.user, passwd, args.user, args.modify[0], args.modify[1]) if (success == "True"): print "The item was successfully updated" else: print "Error in the update. Please verify that you are the owner and the attribute string" elif ('-r' in used_args or '--remove' in used_args): output = service.remove(args.user, passwd, args.user, args.remove) if ( output == "True"): print "All images have been removed." else: print "Some images have NOT been removed. Images with imgIds= " + str(output) + " have NOT been removed. Please verify the imgIds and if you are the owner" elif('-s' in used_args or '--setpermission' in used_args): status = service.setPermission(args.user, passwd, args.user, args.setpermission[0], args.setpermission[1]) if(status == "True"): print "Permission of img " + args.setpermission[0] + " updated" else: print "The permission have not been changed. " + status #This commands only can be used by users with Admin Role. elif ('--useradd' in used_args): #args[0] is the username. It MUST be the same that the system user status = service.userAdd(args.user, passwd, args.user, args.useradd) if(status == "True"): print "User created successfully." print "Remember that you still need to activate this user (see --setuserstatus command)\n" else: print "The user has not been created. \n" + \ "Please verify that you are admin and that the username does not exist \n" elif ('--userdel' in used_args): status = service.userDel(args.user, passwd, args.user, args.userdel) if(status == "True"): print "User deleted successfully." else: print "The user has not been deleted. \n" + \ "Please verify that you are admin and that the username \"" + args.userdel + "\" exists \n" elif ('--userlist' in used_args): userList = service.userList(args.user, passwd, args.user) #print userList if(userList != None): try: imgs = eval(userList) print str(len(imgs)) + " users found" for key in imgs.keys(): print imgs[key] except: print "Server replied: " + str(userList) print "userlist: Error:" + str(sys.exc_info()[0]) + "\n" service._log.error("userlist: Error interpreting the list of users from Image Repository" + str(sys.exc_info()[0])) else: print "No list of user returned. \n" + \ "Please verify that you are admin \n" #LOOK into how to use math ops, maybe we need to put it between "" elif ('--setuserquota' in used_args): status = service.setUserQuota(args.user, passwd, args.user, args.setuserquota[0], args.setuserquota[1]) if(status == "True"): print "Quota changed successfully." else: print "The user quota has not been changed. \n" + \ "Please verify that you are admin and that the username \"" + args.setuserquota[0] + "\" exists \n" elif ('--setuserrole' in used_args): status = service.setUserRole(args.user, passwd, args.user, args.setuserrole[0], args.setuserrole[1]) if(status == "True"): print "Role changed successfully." else: print "The user role has not been changed. " + status + "\n"+\ "Please verify that you are admin and that the username \"" + args.setuserrole[0] + "\" exists \n" elif ('--setuserstatus' in used_args): status = service.setUserStatus(args.user, passwd, args.user, args.setuserstatus[0], args.setuserstatus[1]) if(status == "True"): print "Status changed successfully." else: print "The user status has not been changed. " + status + "\n"+\ "Please verify that you are admin and that the username \""+args.setuserstatus[0]+"\"exists \n" #these are again for eveyone elif ('--histimg' in used_args): if( args.histimg != None ): imgsList = service.histImg(args.user, passwd, args.user, args.histimg) else: imgsList = service.histImg(args.user, passwd, args.user, "None") if imgsList == None: print "ERROR: Not image record found" else: try: imgs = eval(imgsList) for key in imgs.keys(): print imgs[key] except: print "Server replied: " + str(imgsList) print "histimg: Error:" + str(sys.exc_info()) + "\n" service._log.error("histimg: Error interpreting the list of images from Image Repository" + str(sys.exc_info()[0])) elif('--histuser' in used_args): if( args.histuser != None): userList = service.histUser(args.user, passwd, args.user, args.histuser) else: userList = service.histUser(args.user, passwd, args.user, "None") if userList == None: print "ERROR: Not user found" else: try: users = eval(userList) for key in users.keys(): print users[key] except: print "Server replied: " + str(userList) print "histuser: Error:" + str(sys.exc_info()) + "\n" service._log.error("histuser: Error interpreting the list of users from Image Repository" + str(sys.exc_info()))