class ClusterHelper(object): logger = Util.ibm_logger() base_url = "https://crl.ptopenlab.com:8800/restful/supernova" def __init__(self, conf_id, num, token, username, pwd): #self.logger.info("ClusterHelper.__init__") self._conf_id = conf_id self._num = num #self._token = token #self._username = username #self._pwd = pwd self._headers = { "Content-Type": "application/json", "Authorization": token, "username": username, "password": pwd } def cluster_create(self): url = self.base_url + "/cluster/create" body = json.dumps({ "cluster_config_id": self._conf_id, "cluster_number": self._num, }) ret = requests.post(url, headers=self._headers, data=body) ret = json.loads(ret.text) return ret def cluster_list(self): url = self.base_url + "/cluster/list" ret = requests.get(url, headers=self._headers) ret = json.loads(ret.text) return ret def cluster_delete(self, cluster_id): url = self.base_url + "/cluster/delete/{0}".format(cluster_id) ret = requests.delete(url, headers=self._headers) ret = json.loads(ret.text) return ret def cluster_show(self, cluster_id): #url = self.base_url + "/cluster/show/{0}".format(cluster_id) url = self.base_url + "/cluster/show/" + cluster_id ret = requests.get(url, headers=self._headers) ret = json.loads(ret.text) return ret def get_webshell(self, user_Authorization, ip): headers = { "Content-Type": "application/json", "Authorization": user_Authorization } url = "https://dashboard.ptopenlab.com:443/restful/supernova/web_shell/get/Beijing/" + ip ret = requests.get(url, headers=headers) ret = json.loads(ret.text) return ret
class DockerHelper(object): logger = Util.ibm_logger() def __init__(self, git_host, init_user, init_pwd): self._git_host = git_host self._init_user = init_user self._init_pwd = init_pwd #create user for student def init_user(self, host, user_name, user_pwd): self.logger.info("init_user " + host + " " + user_name + " " + user_pwd) cmd = "./myuseradd-ibm " + user_name + " " + user_pwd print cmd ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(host, username=self._init_user, password=self._init_pwd) stdin, stdout, stderr = ssh.exec_command(cmd) print stdout.read() ssh.close() #initialize git config def init_git(self, host, user_name, user_pwd, email, git_name, private_key, public_key): self.logger.info("init docker git" + " " + email + " " + user_name) cmd = "umask 0002 ; mkdir .ssh ; " cmd += "echo -ne '" + private_key + "' >~/.ssh/id_rsa ; " cmd += "echo '" + public_key + "' >~/.ssh/id_rsa.pub ; " cmd += "chmod 0600 ~/.ssh/id_rsa ; " cmd += "eval 'ssh-agent -s' ; " cmd += "ssh-add ~/.ssh/id_rsa ; " cmd += "git config --global user.name '" + user_name + "' ; " cmd += "git config --global user.email " + email + " ; " #cmd += "sudo echo -ne 'StrictHostKeyChecking no\\nUserKnownHostsFile /dev/null\\n' >> /etc/ssh/ssh_config && " cmd += "mkdir ucore_lab ; cd ./ucore_lab && git init ; " #cmd += "git remote add origin_edx " + repo_url +"; " cmd += "git remote add origin_edx git@" + self._git_host + ":" + git_name + "/ucore_lab.git ; " cmd += "git pull origin_edx master" self.logger.info("cmd" + cmd) print cmd ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(host, username=user_name, password=user_pwd) stdin, stdout, stderr = ssh.exec_command(cmd) print stdout.read() ssh.close()
class IBMDockerTestXBlock(XBlock): logger = Util.ibm_logger() is_new = Boolean(default=True, scope=Scope.user_state, help="is new") is_empty = Boolean(default=True, scope=Scope.user_state, help="do not have docker") private_key = String(default="", scope=Scope.user_state, help="SHH Private Key") public_key = String(default="", scope=Scope.user_state, help="SHH Public Key") cluster_id = String(default="", scope=Scope.user_state, help="user cluster id") git_id = Integer(default="", scope=Scope.user_state, help="Git id") #repo url may be different from username/repo.git,so get it from api git_name = String(default="", scope=Scope.user_state, help="git repo") ldap_name = String(default="", scope=Scope.user_state, help="ldap name") ldap_pwd = String(default="", scope=Scope.user_state, help="ldap password") #student only own one cluster clusters = List(default=[], scope=Scope.user_state, help="clusters") # config CONFIG = Config.CONFIG git_host = CONFIG["GIT"]["HOST"] git_port = CONFIG["GIT"]["PORT"] git_admin_token = CONFIG["GIT"]["ADMIN_TOKEN"] git_import_url = CONFIG["GIT"]["IMPORT_URL"] git_project_name = CONFIG["GIT"]["PROJECT_NAME"] git_teacher_token = CONFIG["GIT"]["TEACHER"]["TOKEN"] cluster_conf_id = CONFIG["CLUSTER"]["CLUSTER_CONFIG_ID"] cluster_num = CONFIG["CLUSTER"]["CLUSTER_NUM"] delete_time = CONFIG["CLUSTER"]["DELETE_TIME"] init_user = CONFIG["CLUSTER"]["INIT_USER"] init_pwd = CONFIG["CLUSTER"]["INIT_PWD"] ibm_username = CONFIG["IBM_ACCOUNT"]["ACCOUNT"] ibm_pwd = CONFIG["IBM_ACCOUNT"]["PASSWORD"] mongo_admin = CONFIG["MONGO"]["ADMIN"] mongo_pwd = CONFIG["MONGO"]["PASSWORD"] user_Authorization = CONFIG["AUTHORIZATION"]["USER"] cluster_Authorization = CONFIG["AUTHORIZATION"]["CLUSTER"] cluster_helper = ClusterHelper(cluster_conf_id, cluster_num, cluster_Authorization, ibm_username, ibm_pwd) docker_helper = DockerHelper(git_host, init_user, init_pwd) def student_view(self, context=None): # runtime error if not hasattr(self.runtime, "anonymous_student_id"): return self.message_view( "Error in ibm_docker (get anonymous student id)" + "Cannot get anonymous_student_id in runtime", None) # preview in studio if self.runtime.anonymous_student_id == "student": cluster_list = [] conn = pymongo.Connection('localhost', 27017) db = conn.test db.authenticate(self.mongo_admin, self.mongo_pwd) cluster = db.cluster for i in cluster.find(): new_cluster = Cluster() new_cluster.set_name(i["cluster_name"]) new_cluster.set_user(i["username"]) new_cluster.set_id(i["cluster_id"]) new_cluster.set_creation_time(i["creation_time"]) new_cluster.set_status(i["status"]) new_cluster.set_ip(i["ip"]) cluster_list.append(new_cluster.object_to_dict()) context_dict = {"clusters": cluster_list, "message": ""} fragment = Fragment() fragment.add_content( Util.render_template('static/html/ibm_clusters.html', context_dict)) fragment.add_css(Util.load_resource("static/css/ibm_docker.css")) #fragment.add_javascript(Util.load_resource("static/js/src/uc_lab.js")) fragment.initialize_js("IBMDockerTestXBlock") return fragment student = self.runtime.get_real_user(self.runtime.anonymous_student_id) email = student.email name = student.first_name + " " + student.last_name username = student.username # temporary code ,not used in next course conn = pymongo.Connection('localhost', 27017) db = conn.test db.authenticate(self.mongo_admin, self.mongo_pwd) token = db.token result = token.find_one({"username": username}) conn.disconnect() #I dont now why the cluster cannot be shown in page directly temp_clusters = self.clusters if self.is_new and not result: # create git account when first visiting # get teacher id #result, message = GitLabUtil.get_user(self.git_host, self.git_port, self.git_teacher_token) #self.logger.info("get teacher id") #self.logger.info(result) #self.logger.info(message) #if not result: # return self.message_view("Error in get teacher info") #try: # message = json.loads(message) # teacher_id = message["id"] #except Exception: # return self.message_view("Error in uc_docker (load json string)", message, context) #add teacher to developer #result, message = GitLabUtil.add_project_developer(self.git_host, self.git_port, self.git_user_token, username, self.git_project_name, teacher_id) #self.logger.info("add developer result:") #self.logger.info(result) #self.logger.info(message) #if not result: # return self.message_view("Error in uc_docker (add teacher to developer)", message, context) conn = pymongo.Connection('localhost', 27017) db = conn.test db.authenticate(self.mongo_admin, self.mongo_pwd) ibm = db.ibm result = ibm.find_one({"email": email}) if not result: return self.message_view( "Error in ibm_docker (get shibboleth account info). detail" + message, temp_clusters) self.ldap_name = result["name"] self.ldap_pwd = result["password"] #get user id by email result, message = GitLabUtil.get_userid(self.git_host, self.git_port, self.git_admin_token, self.ldap_name) self.logger.info("get user id result:") self.logger.info(result) self.logger.info(message) if not result: return self.message_view( "Error in ibm_docker (get user id). detail" + message, temp_clusters) self.git_id = message["id"] self.save() result, message = GitLabUtil.create_project( self.git_host, self.git_port, self.git_admin_token, self.git_import_url, self.git_project_name, self.git_id) self.logger.info("add project result:") self.logger.info(result) self.logger.info(message) if not result: return self.message_view( "Error in ibm_docker (add project). detail:" + message, temp_clusters) try: conn = pymongo.Connection('localhost', 27017) db = conn.test db.authenticate(self.mongo_admin, self.mongo_pwd) token = db.token result = token.find_one({"username": username}) if not result: self.private_key, self.public_key = Util.gen_ssh_keys( email) #self.logger.info("private_key:" + self.private_key) self.save() token.insert({ "username": username, "private_key": self.private_key, "public_key": self.public_key }) else: self.private_key = result["private_key"] self.public_key = result["public_key"] self.save() conn.disconnect() except Exception, ex: return self.message_view( "Error in ibm_docker (gen ssh key). detail:" + ex, context) result, message = GitLabUtil.add_ssh_key( self.git_host, self.git_port, self.git_admin_token, "ucore default", self.public_key, self.git_id) self.logger.info("add_ssh_key result:") self.logger.info(result) self.logger.info(message) if not result: return self.message_view( "Error in ibm_docker (add git ssh key). detail:" + message, temp_clusters) self.is_new = False self.save() context_dict = {"dockers": self.clusters, "message": "", "report": ""} fragment = Fragment() fragment.add_content( Util.render_template('static/html/ibm_docker.html', context_dict)) fragment.add_css(Util.load_resource("static/css/ibm_docker.css")) fragment.add_javascript( Util.load_resource("static/js/src/ibm_docker.js")) fragment.initialize_js("IBMDockerTestXBlock") return fragment