Example #1
0
    def req_configure(self, request):

        try:
            document = minidom.parseString(request["data"])
            rootNode = document.documentElement

            if rootNode != "vm":
                raise Exception("invalid root node")

        except:
            Logger.warn("Invalid input XML")
            doc = Document()
            rootNode = doc.createElement("error")
            rootNode.setAttribute("id", "name")
            doc.appendChild(rootNode)

            return self.req_answer(doc)

        vname = rootnode.getAttribute("id")
        ram = rootNode.getAttribute("ram")
        vcpus = rootNode.getAttribute("cpu")

        self.role_instance.config(vname, vcpus, ram)

        rootNode.setAttribute("status", "OK")

        return self.req_answer(document)
Example #2
0
	def del_user(self, user):
		if user not in self.ro_users and user not in self.rw_users:
			return True
		
		ret = True
		if user in self.ro_users:
			cmd = "deluser %s %s_ro"%(user, self.group)
		else:
			cmd = "deluser %s %s_rw"%(user, self.group)
		
		p = System.execute(cmd)
		if p.returncode is not 0:
			ret = False
			Logger.error("FS: unable to del user in group")
			Logger.debug("FS: command '%s' return %d: %s"%(cmd, p.returncode, p.stdout.read().decode("UTF-8")))
		
		htgroup = HTGroup(Config.dav_group_file)
		
		if user in self.ro_users:
			self.ro_users.remove(user)
			htgroup.delete(user, self.group+"_ro")
		if user in self.rw_users:
			self.rw_users.remove(user)
			htgroup.delete(user, self.group+"_rw")
		
		if (len(self.ro_users) + len(self.rw_users)) == 0:
			return self.disable()
		
		return True
Example #3
0
    def mount_cifs(self, share, uri, dest):
        mount_env = {}
        if share.has_key("login") and share.has_key("password"):
            cmd = "mount -t cifs -o 'uid=%s,gid=0,%s,iocharset=utf8' //%s%s %s" % (
                self.session.user.name,
                self.DEFAULT_PERMISSION,
                uri.netloc,
                uri.path,
                dest,
            )
            mount_env["USER"] = share["login"]
            mount_env["PASSWD"] = share["password"]
        else:
            cmd = "mount -t cifs -o 'guest,uid=%s,gid=0,%s,iocharset=utf8' //%s%s %s" % (
                self.session.user.name,
                self.DEFAULT_PERMISSION,
                uri.netloc,
                uri.path,
                dest,
            )

        cmd = self.transformToLocaleEncoding(cmd)
        Logger.debug("Profile, share mount command: '%s'" % (cmd))
        p = System.execute(cmd, env=mount_env)
        if p.returncode != 0:
            Logger.debug("CIFS mount failed (status: %d) => %s" % (p.returncode, p.stdout.read()))
            return False

        return True
Example #4
0
    def init(infos):
        if infos.has_key("thread_count"):
            value = infos["thread_count"]
            if value.lower() == "auto":
                Config.thread_count = None
            else:
                try:
                    nbThread = int(value)
                except ValueError:
                    Logger.error("Invalid int number for thread_count")
                    nbThread = 1

                if nbThread <= 0:
                    Logger.error("thread_count must be greater than 0")
                else:
                    Config.thread_count = nbThread

        if infos.has_key("checkshell"):
            Config.checkShell = (infos["checkshell"].lower() == "true")

        if infos.has_key("clean_dump_archive"):
            Config.clean_dump_archive = (
                infos["clean_dump_archive"].lower() == True)

        return True
Example #5
0
	def init(self):
		Logger.info("Gateway init")

		if version[0] != 2 or version[1] < 6 or (version[1] == 7 and version[2] in [1, 2]):
			Logger.error("Gateway:: incompatibility with current Python machine '%d.%d.%d'" % version[:3])
			return False
		
		fpem = os.path.join(Config.general.conf_dir, "gateway.pem")
		if os.path.exists(fpem):
			self.ssl_ctx = SSL.Context(SSL.SSLv23_METHOD)
			self.ssl_ctx.use_privatekey_file(fpem)
			self.ssl_ctx.use_certificate_file(fpem)
			self.ssl_ctx.load_verify_locations(fpem)
			if Config.disable_sslv2:
				self.ssl_ctx.set_options(SSL.OP_NO_SSLv2)
		else:
			Logger.error("Gateway role need a certificate (%s)" % fpem)
			return False
		
		addr = (Config.address, Config.port)
		try:
			GatewayTCPHandler.role = self
			self.server = GatewayTCPServer(addr, GatewayTCPHandler, bind_and_activate=False)
			self.server.allow_reuse_address = Config.general.server_allow_reuse_address
			
			self.server.server_bind()
			self.server.server_activate()
		except socket.error:
			Logger.exception("Gateway:: socket init")
			return False
		
		Logger.info('Gateway:: running on (%s, %d)' % addr)
		return True
Example #6
0
    def handle(self):
        self.role.kill_mutex.acquire()

        best_proc = None
        for pid, proc in self.role.processes.items():
            ctrl = proc[0][1]
            nb_conn = ctrl.send('nb_conn')
            self.role.processes[pid][1] = nb_conn
            if nb_conn < Config.max_connection:
                best_proc = pid
                break
        if best_proc is None:
            if len(self.role.processes) < Config.max_process:
                best_proc = self.role.create_process()
            else:
                best_proc = min(self.role.processes,
                                key=lambda pid: self.role.processes[pid][1])
                Logger.warn(
                    "WebApps service has reached the open connections limit")

        ctrl = self.role.processes[best_proc][0][1]
        pickled_sock = pickle.dumps(reduce_socket(self.request)[1])
        ctrl.send(('socket', pickled_sock))

        self.role.kill_mutex.release()
Example #7
0
	def req_user_logout(self, request):
		try:
			document = minidom.parseString(request["data"])
			rootNode = document.documentElement
			
			if rootNode.nodeName != "user":
				raise Exception("invalid root node")
			
			if not rootNode.hasAttribute("login"):
				raise Exception("invalid root node")
			
			login = rootNode.getAttribute("login")
			
		except:
			Logger.warn("Invalid xml input !!")
			doc = Document()
			rootNode = doc.createElement('error')
			rootNode.setAttribute("id", "usage")
			doc.appendChild(rootNode)
			return self.req_answer(doc)
		
		
		session = self.role_instance.get_session_from_login(login)
		
		if session is None:
			doc = Document()
			rootNode = doc.createElement('error')
			rootNode.setAttribute("id", "unknown user")
			doc.appendChild(rootNode)
			
			return self.req_answer(doc)
		
		self.role_instance.spool_action("logoff", session.id)
		
		return self.req_answer(document)
Example #8
0
	def process(self, request):
		path = request["path"]
		
		if request["method"] == "GET":
			Logger.debug("do_GET "+path)
			
			if path == "/configuration":
				return self.req_server_conf(request)
			
			elif path == "/monitoring":
				return self.req_server_monitoring(request)
			
			elif path == "/status":
				return self.req_server_status(request)
			
			elif path.startswith("/logs"):
				since = 0
				extra = path[len("/logs"):]
				if extra.startswith("/since/"):
					since_str = extra[len("/since/"):]
					if since_str.isdigit():
						since = int(since_str)
				elif len(extra) > 0:
					return None  
				
				return self.req_server_logs(request, since)
			
			return None
		
		elif request["method"] == "POST":
			return None
		
		return None
	def __init__(self, args):
		win32serviceutil.ServiceFramework.__init__(self, args)
		
		# Give the multiprocessing module a python interpreter to run
		if sys.argv[0].endswith("exe"):
			basedir = os.path.dirname(sys.argv[0])
			multiprocessing.set_executable(os.path.join(basedir, "ulteo-ovd-slaveserver.exe"))
	
		# Init the logger instance
		Win32Logger.initialize("OVD", Config.log_level, None)
		ConfigModule.report_error = WinReport_error
		
		config_file = os.path.join(Platform.System.get_default_config_dir(), "slaveserver.conf")
		if not Config.read(config_file):
			Logger.error("invalid configuration file '%s'"%(config_file))
			sys.exit(1)
	
		if not Config.is_valid():
			Logger.error("invalid config")
			sys.exit(1)
		
		Win32Logger.initialize("OVD", Config.log_level, Config.log_file)
		
		
		SlaveServer.__init__(self, Communication)
		self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
Example #10
0
	def init(self):
		Logger.info("FileServer init")
		
		if not Config.init_role():
			return False

		if not self.FSBackend.start():
			Logger.error("FileServer: failed to initialize FSBackend")
			self.FSBackend.stop()
			return False
		
		if not self.cleanup_samba():
			Logger.error("FileServer: unable to cleanup samba")
			return False
		
		if not self.purgeGroup():
			Logger.error("FileServer: unable to cleanup users")
			return False
		
		if not self.cleanup_repository():
			Logger.error("FileServer: unable to cleanup users")
			return False
		
		self.shares = self.get_existing_shares()
		
		return True
Example #11
0
	def create(self):
		userData = {}
		userData['name'] = self.name
		
		if self.infos.has_key("displayName"):
			userData['full_name'] = self.infos["displayName"]
			
		if self.infos.has_key("password"):
			userData['password'] = self.infos["password"]
		
		userData['flags']  = win32netcon.UF_DONT_EXPIRE_PASSWD
		userData['flags'] |= win32netcon.UF_NORMAL_ACCOUNT
		userData['flags'] |= win32netcon.UF_PASSWD_CANT_CHANGE
		userData['flags'] |= win32netcon.UF_SCRIPT
		
		userData['priv'] = win32netcon.USER_PRIV_USER
		userData['primary_group_id'] = ntsecuritycon.DOMAIN_GROUP_RID_USERS
		userData['password_expired'] = 0 # password never expire
		userData['acct_expires'] =  win32netcon.TIMEQ_FOREVER
		if self.infos.has_key("locale"):
			userData['country_code'] =  Langs.getLCID(self.infos["locale"])
		
		try:
			win32net.NetUserAdd(None, 3, userData)
		except Exception:
			Logger.exception("unable to create user")
			return False
		
		self.post_create()
		return True
	def get_by_id(cls, app_id):
		if cls._instance is None:
			Logger.error('[WebApps] using not initialized ApplicationsRepository')
		
		for app_def in cls._instance.process('_list'):
			if app_def.id == app_id:
				return app_def
Example #13
0
	def req_debian_id(self, req):
		try:
			(rid, request) = req.split("/", 2)
			req = self.role_instance.apt.get(rid)
			if req is None:
				req = Apt.Request()
				req.status = "unknown"
				return self.req_answer(self.debian_request2xml(rid, req))
			
			if request == "status":
				return self.req_answer(self.debian_request2xml(rid, req))
			
			elif request in ["stdout", "stderr"]:
				response = {}
				response["code"] = httplib.OK
				response["Content-Type"] = "text/plain"
				response["data"] = req.getLog(request)
				return response
			
			else:
				raise Exception("usage")
			
		except Exception, err:
			Logger.warn("Invalid xml input: "+str(err))
			doc = Document()
			rootNode = doc.createElement('error')
			rootNode.setAttribute("id", "usage")
			doc.appendChild(rootNode)
			return self.req_answer(doc)
Example #14
0
	def req_debian(self, request):
		try:
			document = minidom.parseString(request["data"])
			rootNode = document.documentElement
			if rootNode.nodeName != "debian":
				raise Exception("invalid root node")
			
			request = rootNode.getAttribute("request")
			if request not in ["upgrade", "install", "remove", "available"]:
				raise Exception("usage")
			
			packageNodes = rootNode.getElementsByTagName("package")
			if request in ["install", "remove"] and len(packageNodes)==0:
				raise Exception("usage")
			
			packages = []
			for packageNode in packageNodes:
				packages.append(packageNode.getAttribute("name"))
		
		except Exception, err:
			Logger.warn("Invalid xml input: "+str(err))
			doc = Document()
			rootNode = doc.createElement('error')
			rootNode.setAttribute("id", "usage")
			doc.appendChild(rootNode)
			return self.req_answer(doc)
Example #15
0
    def process(self, request):
        path = request["path"]

        if request["method"] == "GET":

            Logger.debug("do_GET " + path)

            if path == "/status":
                return self.req_status()

        elif request["method"] == "POST":

            Logger.debug("do_POST " + path)

            if path == "/vm/destroy":
                return self.req_delete(request)

            if path == "/vm/create":
                return self.req_create(request)

            if path == "/vm/manage":
                return self.req_manage(request)

            if path == "/vm/name":
                return self.req_name(request)

            if path == "/vm/configure":
                return self.req_configure(request)

        return None
Example #16
0
    def handle_read(self):
        # Read data in buffer
        SecureServerCommunicator.handle_read(self)

        # Fetch the Http request from parent communicator
        if (self.http_communicator is None) and (len(
                self.communicator.http_history) > 0):
            self.http_communicator = self.communicator.http_history.pop(0)

            if self.http_communicator.path in Config.force_buffering:
                Logger.debug("Force buffering : " +
                             self.http_communicator.path)
                self.http.force_full_buffering = True

        if not self.http.is_ready():
            # Parse it until ready
            if self.make_http_message():
                # Now it is ready
                self._buffer = self.process()  # Stream it
                self.http_communicator = None
        else:
            # Data is streamed "on-the-fly"
            self._buffer = self._buffer  # Stream it

        if self.http.is_complete():
            self.http = HttpMessage(self)
Example #17
0
    def destroy_user(self, user):
        Logger.info("SessionManagement::destroy_user %s" % (user.name))

        if user.infos.has_key("tsid"):
            self.logoff_user(user)

        user.destroy()
Example #18
0
    def rewrite_xml(self, body):
        try:
            session = parser.XML(body)
            if session.tag.lower() != 'session':
                raise Exception("not a 'session' XML response")
        except Exception:
            Logger.exception("Gateway:: parsing XML session failed")
            return None

        session.set('mode_gateway', 'on')
        for server in session.findall('server'):
            port = Protocol.RDP

            if server.attrib.has_key("port"):
                try:
                    port = int(server.attrib["port"])
                except ValueError, err:
                    Logger.warn(
                        "Gateway:: Invalid protocol: server port attribute is not a digit (%s)"
                        % (server.attrib["port"]))

            token = self.f_ctrl.send(
                ('insert_token', (server.attrib['fqdn'], port)))
            server.set('token', token)
            del server.attrib['fqdn']
            if server.attrib.has_key("port"):
                del server.attrib["port"]
Example #19
0
    def del_user(self, user):
        if user not in self.ro_users and user not in self.rw_users:
            return True

        ret = True
        if user in self.ro_users:
            cmd = "deluser %s %s_ro" % (user, self.group)
        else:
            cmd = "deluser %s %s_rw" % (user, self.group)

        p = System.execute(cmd)
        if p.returncode is not 0:
            ret = False
            Logger.error("FS: unable to del user in group")
            Logger.debug("FS: command '%s' return %d: %s" %
                         (cmd, p.returncode, p.stdout.read().decode("UTF-8")))

        htgroup = HTGroup(Config.dav_group_file)

        if user in self.ro_users:
            self.ro_users.remove(user)
            htgroup.delete(user, self.group + "_ro")
        if user in self.rw_users:
            self.rw_users.remove(user)
            htgroup.delete(user, self.group + "_rw")

        if (len(self.ro_users) + len(self.rw_users)) == 0:
            return self.disable()

        return True
Example #20
0
	def groupMember(name_):
		try:
			(users, _, _) = win32net.NetLocalGroupGetMembers(None, name_, 1)
		
		except win32net.error, e:
			Logger.error("groupMember: '%s'"%(str(e)))
			return None
Example #21
0
	def req_debian_id(self, req):
		try:
			(rid, request) = req.split("/", 2)
			req = self.role_instance.apt.get(rid)
			if req is None:
				req = Apt.Request()
				req.status = "unknown"
				return self.req_answer(self.debian_request2xml(rid, req))
			
			if request == "status":
				return self.req_answer(self.debian_request2xml(rid, req))
			
			elif request in ["stdout", "stderr"]:
				response = {}
				response["code"] = httplib.OK
				response["Content-Type"] = "text/plain"
				response["data"] = req.getLog(request)
				return response
			
			else:
				raise Exception("usage")
			
		except Exception:
			Logger.exception("Invalid xml input")
			doc = Document()
			rootNode = doc.createElement('error')
			rootNode.setAttribute("id", "usage")
			doc.appendChild(rootNode)
			return self.req_answer(doc)
Example #22
0
	def userRemove(user_):
		try:
			win32net.NetUserDel(None, user_)
		
		except win32net.error, e:
			Logger.error("userRemove: '%s'"%(str(e)))
			return False
Example #23
0
	def run(self):
		self.synchronizer.restore()
		Logger._instance.setQueue(self.logging_queue, False)
		global loop
		loop = True

		Platform.System.prepareForSessionActions()
		
		# Prevent the process to be stop by a keyboard interruption
		def quit(machin, truc):
			global loop
			loop = False
		signal.signal(signal.SIGINT, signal.SIG_IGN)
		signal.signal(signal.SIGTERM, quit)
		
		Logger.debug("Starting SessionManager process")
		while loop:
			try:
				(request, obj) = self.queue2.get_nowait()
			except Queue.Empty:
				try:
					(request, obj) = self.queue.get(True, 4)
				except Queue.Empty, e:
					continue
				except IOError, e:
					if e.errno == 4:
						break
					else:
						raise e
Example #24
0
	def _create(self, data):
		sess_id = data.pop('id')
		Logger.info('[WebApps] creating session id={0} for user {1}'.format(sess_id, data.get('login')))
		data.setdefault('cookies', {})
		session = Session(sess_id, data, self.debug)
		self.sessions[sess_id] = session
		return session
Example #25
0
    def uninstall_client(self):
        if not self.succefully_initialized:
            return

        self.archive_shell_dump()

        if self.profile is not None and self.profile.hasProfile():
            if not self.profile.mount():
                Logger.warn(
                    "Unable to mount profile at uninstall_client of session " +
                    self.id)
            else:
                self.profile.copySessionStop()

                desktop_path = os.path.join(self.profile.mountPoint,
                                            self.profile.DesktopDir)
                self.cleanupShortcut(desktop_path)

                for shortcut in self.installedShortcut:
                    dstFile = os.path.join(self.profile.mountPoint,
                                           self.profile.DesktopDir, shortcut)
                    if os.path.exists(dstFile):
                        os.remove(dstFile)

                if not self.profile.umount():
                    Logger.error(
                        "Unable to umount profile at uninstall_client of session "
                        + self.id)

        self.domain.onSessionEnd()
        return True
Example #26
0
	def disconnect_session(self, session):
		Logger.info("SessionManagement::disconnect %s"%(session.id))
		
		if session.user.created or not session.domain.manage_user():
			# Doesn't have to disconnect the session if the user was never created
			
			try:
				sessid = TS.getSessionID(session.user.name)
			except Exception:
				Logger.exception("RDP server dialog failed ... ")
				return False
			
			try:
				status = TS.getState(sessid)
			except Exception:
				Logger.exception("RDP server dialog failed ... ")
				return
			
			if status in [TS.STATUS_LOGGED]:
				Logger.info("must disconnect ts session %s user %s"%(sessid, session.user.name))
				
				try:
					TS.disconnect(sessid)
				except Exception:
					Logger.exception("RDP server dialog failed ... ")
					return
		
		session.switch_status(Session.SESSION_STATUS_INACTIVE)
Example #27
0
def clone(srcFile, dstFile, path, args):
	pythoncom.CoInitialize()
	
	shortcut_src = pythoncom.CoCreateInstance(shell.CLSID_ShellLink, None, pythoncom.CLSCTX_INPROC_SERVER, shell.IID_IShellLink)
	shortcut_src.QueryInterface(pythoncom.IID_IPersistFile).Load(srcFile)
	
	iconLocation = shortcut_src.GetIconLocation()[0]
	if len(iconLocation) == 0:
		iconLocation = shortcut_src.GetPath(0)[0]
	
	workingDirectory = shortcut_src.GetWorkingDirectory()
	description = shortcut_src.GetDescription()
	
	
	shortcut_dst = pythoncom.CoCreateInstance(shell.CLSID_ShellLink, None, pythoncom.CLSCTX_INPROC_SERVER, shell.IID_IShellLink)
	try:
		shortcut_dst.SetPath(path)
	except:
		Logger.warn("LnkFile::clone: unable to setPath. Check that the following command is available on the system: '%s'"%(path))
		return False
	
	shortcut_dst.SetArguments(args)
	shortcut_dst.SetIconLocation(iconLocation, 0)
	shortcut_dst.SetWorkingDirectory(workingDirectory)
	shortcut_dst.SetDescription(description)
	
	shortcut_dst.QueryInterface(pythoncom.IID_IPersistFile).Save(dstFile, 0)
	return True
Example #28
0
	def main(self):
		self.synchronizer.restore()
		Logger._instance.setQueue(self.logging_queue, False)
		
		System.prepareForSessionActions()
		
		# Prevent the process to be stop by a keyboard interruption
		signal.signal(signal.SIGINT, signal.SIG_IGN)
		signal.signal(signal.SIGTERM, signal.SIG_IGN)
		
		Logger.debug("Starting SessionManager process")
		while True:
			self.current_session_id.value = ""
			try:
				(request, obj) = self.queue2.get_nowait()
			except Queue.Empty:
				try:
					(request, obj) = self.queue.get(True, 4)
				except Queue.Empty, e:
					continue
				except IOError, e:
					if e.errno == 4:
						break
					else:
						raise e
Example #29
0
	def order_stop(self):
		Logger.info("%s role::stop"%(self.getName()))
		if self.status == Role.STATUS_INIT:
			self.status = Role.STATUS_STOP
			return
		
		self.status = Role.STATUS_STOPPING
Example #30
0
    def getTargetFromShortcut(self, path):
        szShortcutTarget = ctypes.c_wchar_p(path)
        szProductCode = ctypes.create_unicode_buffer(4096)
        szFeatureId = ctypes.create_unicode_buffer(4096)
        szComponentCode = ctypes.create_unicode_buffer(4096)

        status = self.dll.MsiGetShortcutTargetW(szShortcutTarget,
                                                ctypes.byref(szProductCode),
                                                ctypes.byref(szFeatureId),
                                                ctypes.byref(szComponentCode))
        if status != self.SUCCESS:
            Logger.debug3("MsiGetShortcutTargetW return %d on '%s'" %
                          (status, path))
            return None

        path_len = ctypes.c_uint(4096)
        path_buffer = ctypes.create_unicode_buffer(4096)

        status = self.dll.MsiGetComponentPathW(szProductCode.value,
                                               szComponentCode.value,
                                               ctypes.byref(path_buffer),
                                               ctypes.byref(path_len))
        if status != self.INSTALLSTATE_LOCAL:
            Logger.debug2("MsiGetComponentPathW return %d on '%s'" %
                          (status, path))
            return None

        return path_buffer.value
Example #31
0
    def req_manage(self, request):

        try:
            document = minidom.parseString(request["data"])
            rootNode = document.documentElement

            if rootNode.nodeName != "vm":
                raise Exception("invalid root node")

        except:
            Logger.warn("Invalid xml input !!")
            doc = Document()
            rootNode = doc.createElement('error')
            rootNode.setAttribute("id", "name")
            doc.appendChild(rootNode)

            return self.req_answer(doc)

        vname = rootNode.getAttribute("id")
        action = rootNode.getAttribute("action")
        ret = self.role_instance.manage("ulteo_ovd_" + vname, action)

        doc = Document()
        rootNode = doc.createElement("vm")
        rootNode.setAttribute("status", ret)
        doc.appendChild(rootNode)

        return self.req_answer(doc)
Example #32
0
    def process(self, request):
        path = request["path"]

        if request["method"] == "GET":
            Logger.debug("do_GET " + path)

            if path == "/configuration":
                return self.req_server_conf(request)

            elif path == "/monitoring":
                return self.req_server_monitoring(request)

            elif path == "/status":
                return self.req_server_status(request)

            elif path.startswith("/logs"):
                since = 0
                extra = path[len("/logs"):]
                if extra.startswith("/since/"):
                    since_str = extra[len("/since/"):]
                    if since_str.isdigit():
                        since = int(since_str)
                elif len(extra) > 0:
                    return None

                return self.req_server_logs(request, since)

            return None

        elif request["method"] == "POST":
            return None

        return None
Example #33
0
    def disconnect_session(self, session):
        Logger.info("SessionManagement::disconnect %s" % (session.id))

        if session.user.created or not session.domain.manage_user():
            # Doesn't have to disconnect the session if the user was never created

            try:
                sessid = TS.getSessionID(session.user.name)
            except Exception:
                Logger.exception("RDP server dialog failed ... ")
                return False

            try:
                status = TS.getState(sessid)
            except Exception:
                Logger.exception("RDP server dialog failed ... ")
                return

            if status in [TS.STATUS_LOGGED]:
                Logger.info("must disconnect ts session %s user %s" %
                            (sessid, session.user.name))

                try:
                    TS.disconnect(sessid)
                except Exception:
                    Logger.exception("RDP server dialog failed ... ")
                    return

        session.switch_status(Session.SESSION_STATUS_INACTIVE)
	def readable(self):
		if time.time() - self.lastPacketTime > Config.connection_timeout:
			Logger.error("ProtocolDetectDispatcher::connection timeout")
			self.handle_close()
			return False
		
		return True
Example #35
0
    def main(self):
        self.synchronizer.restore()
        Logger._instance.setQueue(self.logging_queue, False)

        System.prepareForSessionActions()

        # Prevent the process to be stop by a keyboard interruption
        signal.signal(signal.SIGINT, signal.SIG_IGN)
        signal.signal(signal.SIGTERM, signal.SIG_IGN)

        Logger.debug("Starting SessionManager process")
        while True:
            self.current_session_id.value = ""
            try:
                (request, obj) = self.queue2.get_nowait()
            except Queue.Empty:
                try:
                    (request, obj) = self.queue.get(True, 4)
                except Queue.Empty, e:
                    continue
                except IOError, e:
                    if e.errno == 4:
                        break
                    else:
                        raise e
Example #36
0
    def uninstall_client(self):
        if not self.succefully_initialized:
            return

        self.archive_shell_dump()

        if self.profile is not None and self.profile.hasProfile():
            if not self.profile.mount():
                Logger.warn("Unable to mount profile at uninstall_client of session " + self.id)
            else:
                self.profile.copySessionStop()

                desktop_path = os.path.join(self.profile.mountPoint, self.profile.DesktopDir)
                self.cleanupShortcut(desktop_path)

                for shortcut in self.installedShortcut:
                    dstFile = os.path.join(self.profile.mountPoint, self.profile.DesktopDir, shortcut)
                    if os.path.exists(dstFile):
                        os.remove(dstFile)

                if not self.profile.umount():
                    Logger.error("Unable to umount profile at uninstall_client of session " + self.id)

        self.domain.onSessionEnd()
        return True
Example #37
0
 def init_role(cls):
     try:
         infos = pwd.getpwnam(cls.user)
     except KeyError, err:
         Logger.info("FileServer Config failed: no such user '%s'" %
                     (cls.user))
         return False
    def createShortcut(self, application_):
        lines = []
        lines.append("[Desktop Entry]")
        lines.append("Type=Application")
        lines.append("Terminal=false")
        lines.append("Version=1.0")
        lines.append("Icon=%s" %
                     (os.path.join(self.spool, application_["id"] + ".png")))
        lines.append("Name=%s" % (application_["name"]))
        lines.append("Comment=%s" % (application_["description"]))
        lines.append("Exec=%s" % (application_["command"]))
        lines.append("MimeType=%s" % (";".join(application_["mimetypes"])))
        #parser = ConfigParser.ConfigParser()
        #parser.add_section("Desktop Entry")
        #parser.set("Desktop Entry", "Type", "Application")
        #parser.set("Desktop Entry", "Version", "1.0")
        #parser.set("Desktop Entry", "Terminal", "false")
        #parser.set("Desktop Entry", "Icon", os.path.join(self.spool, application_["id"]+".png"))
        #parser.set("Desktop Entry", "Name", application_["name"])
        #parser.set("Desktop Entry", "Comment", application_["description"])
        #parser.set("Desktop Entry", "Exec", application_["command"])
        #parser.set("Desktop Entry", "MimeType", ";".join(application_["mimetypes"]))

        path = os.path.join(self.spool, application_["id"] + ".desktop")
        try:
            f = file(path, "w")
        except:
            Logger.error("Unable to open file '%s'" % (path))
            return False

        f.writelines([s + "\n" for s in lines])
        #parser.write(f)
        f.close()

        return True
Example #39
0
	def req_user_loggedin(self, request):
		try:
			document = minidom.parseString(request["data"])
			rootNode = document.documentElement
			
			if rootNode.nodeName != "user":
				raise Exception("invalid root node")
			
			if not rootNode.hasAttribute("login"):
				raise Exception("invalid root node")
			
			login = rootNode.getAttribute("login")
			
		except:
			Logger.warn("Invalid xml input !!")
			doc = Document()
			rootNode = doc.createElement('error')
			rootNode.setAttribute("id", "usage")
			doc.appendChild(rootNode)
			return self.req_answer(doc)
		
		try:
			ret = TS.getSessionID(login)
		except Exception:
			Logger.exception("RDP server dialog failed ... ")
			doc = Document()
			rootNode = doc.createElement('error')
			rootNode.setAttribute("id", "internalerror")
			doc.appendChild(rootNode)
			return self.req_answer(doc)
		
		rootNode.setAttribute("loggedin", str((ret is not None)).lower())
		
		return self.req_answer(document)
    def readable(self):
        if time.time() - self.lastPacketTime > Config.connection_timeout:
            Logger.error("HttpProtocolDetectDispatcher::connection timeout")
            self.handle_close()
            return False

        return True
Example #41
0
	def req_debian(self, request):
		try:
			document = minidom.parseString(request["data"])
			rootNode = document.documentElement
			if rootNode.nodeName != "debian":
				raise Exception("invalid root node")
			
			request = rootNode.getAttribute("request")
			if request not in ["upgrade", "install", "remove", "available"]:
				raise Exception("usage")
			
			packageNodes = rootNode.getElementsByTagName("package")
			if request in ["install", "remove"] and len(packageNodes)==0:
				raise Exception("usage")
			
			packages = []
			for packageNode in packageNodes:
				packages.append(packageNode.getAttribute("name"))
		
		except Exception:
			Logger.exception("Invalid xml input")
			doc = Document()
			rootNode = doc.createElement('error')
			rootNode.setAttribute("id", "usage")
			doc.appendChild(rootNode)
			return self.req_answer(doc)
		
		if request == "available":
			req = Apt.Request_Available()
		else:
			req = Apt.Request_Packages(request, packages)
		
		req_id = self.role_instance.apt.add(req)
		
		return self.req_answer(self.debian_request2xml(req_id, req))
Example #42
0
    def create(self):
        userData = {}
        userData['name'] = self.name

        if self.infos.has_key("displayName"):
            userData['full_name'] = self.infos["displayName"]

        if self.infos.has_key("password"):
            userData['password'] = self.infos["password"]

        userData['flags'] = win32netcon.UF_DONT_EXPIRE_PASSWD
        userData['flags'] |= win32netcon.UF_NORMAL_ACCOUNT
        userData['flags'] |= win32netcon.UF_PASSWD_CANT_CHANGE
        userData['flags'] |= win32netcon.UF_SCRIPT

        userData['priv'] = win32netcon.USER_PRIV_USER
        userData['primary_group_id'] = ntsecuritycon.DOMAIN_GROUP_RID_USERS
        userData['password_expired'] = 0  # password never expire
        userData['acct_expires'] = win32netcon.TIMEQ_FOREVER
        if self.infos.has_key("locale"):
            userData['country_code'] = Langs.getLCID(self.infos["locale"])

        try:
            win32net.NetUserAdd(None, 3, userData)
        except Exception, e:
            Logger.error("unable to create user: " + str(e))
            return False
Example #43
0
	def getUsersGroup():
		try:
			sid = win32security.ConvertStringSidToSid("S-1-5-32-555")
			name, _, _ = win32security.LookupAccountSid(None, sid)
		except Exception, err:
			Logger.error("TS::getUsersGroup unable to found remote users group replacing by default name")
			return "Remote Desktop Users"
Example #44
0
	def req_configure(self, request):
		
		try:
			document = minidom.parseString(request["data"])
			rootNode = document.documentElement
			
			if rootNode != "vm" :
				raise Exception("invalid root node")
			
		except:
			Logger.warn("Invalid input XML")
			doc = Document()
			rootNode = doc.createElement("error")
			rootNode.setAttribute("id", "name")
			doc.appendChild(rootNode)
			
			return self.req_answer(doc)
			
		vname = rootnode.getAttribute("id")
		ram = rootNode.getAttribute("ram")
		vcpus = rootNode.getAttribute("cpu")
		
		self.role_instance.config(vname, vcpus, ram)
		
		rootNode.setAttribute("status", "OK")
		
		return self.req_answer(document)
Example #45
0
	def destroy_user(self, user):
		Logger.info("SessionManagement::destroy_user %s"%(user.name))
		
		if user.infos.has_key("tsid"):
			self.logoff_user(user)
		
		user.destroy()
Example #46
0
	def req_manage(self, request):
		
		try:
			document = minidom.parseString(request["data"])
			rootNode = document.documentElement
		
			if rootNode.nodeName != "vm":
				raise Exception("invalid root node")
			
		except:
			Logger.warn("Invalid xml input !!")
			doc = Document()
			rootNode = doc.createElement('error')
			rootNode.setAttribute("id", "name")
			doc.appendChild(rootNode)
			
			return self.req_answer(doc)
		
		vname = rootNode.getAttribute("id")	
		action = rootNode.getAttribute("action")
		ret = self.role_instance.manage("ulteo_ovd_"+vname,action)
		
		doc = Document()
		rootNode = doc.createElement("vm")
		rootNode.setAttribute("status",ret)
		doc.appendChild(rootNode)
		
		return self.req_answer(doc)
Example #47
0
	def run(self):
		self.updateApplications()
		self.has_run = True
		
		Logger._instance.lock.acquire()
		Logger._instance.close()
		for thread in self.threads:
			thread.start()
		Logger._instance.lock.release()
		
		t0_update_app = time.time()
		
		self.status = Role.STATUS_RUNNING
		
		while self.thread.thread_continue():
			while True:
				try:
					session = self.sessions_sync.get_nowait()
				except Queue.Empty, e:
					break
				except (EOFError, socket.error):
					Logger.debug("Role stopping")
					return
				
				if not self.sessions.has_key(session.id):
					Logger.warn("Session %s do not exist, session information are ignored"%(session.id))
					continue
				
				if session.status != self.sessions[session.id].status:
					self.manager.session_switch_status(session, session.status)
				
				if session.status == RolePlatform.Session.SESSION_STATUS_DESTROYED:
					del(self.sessions[session.id])
				else:
					self.sessions[session.id] = session
Example #48
0
	def process(self, request):
		path = request["path"]
		
		if request["method"] == "GET":
			
			Logger.debug("do_GET "+path)
			
			if path == "/status" :
				return self.req_status()
		
		
		elif request["method"] == "POST":
			
			Logger.debug("do_POST "+path)
			
			if path == "/vm/destroy":
				return self.req_delete(request)
	
			if path == "/vm/create":
				return self.req_create(request)
	
			if path == "/vm/manage":
				return self.req_manage(request)
				
			if path == "/vm/name":
				return self.req_name(request)
				
			if path == "/vm/configure":
				return self.req_configure(request)
		
		return None
Example #49
0
    def init(self):
        Logger.info("FileServer init")

        if not Config.init_role():
            return False

        if not self.FSBackend.start():
            Logger.error("FileServer: failed to initialize FSBackend")
            self.FSBackend.stop()
            return False

        if not self.cleanup_samba():
            Logger.error("FileServer: unable to cleanup samba")
            return False

        if not self.purgeGroup():
            Logger.error("FileServer: unable to cleanup users")
            return False

        if not self.cleanup_repository():
            Logger.error("FileServer: unable to cleanup users")
            return False

        self.shares = self.get_existing_shares()

        return True
Example #50
0
def clone(srcFile, dstFile, path, args):
    pythoncom.CoInitialize()

    shortcut_src = pythoncom.CoCreateInstance(shell.CLSID_ShellLink, None,
                                              pythoncom.CLSCTX_INPROC_SERVER,
                                              shell.IID_IShellLink)
    shortcut_src.QueryInterface(pythoncom.IID_IPersistFile).Load(srcFile)

    iconLocation = shortcut_src.GetIconLocation()[0]
    if len(iconLocation) == 0:
        iconLocation = shortcut_src.GetPath(0)[0]

    workingDirectory = shortcut_src.GetWorkingDirectory()
    description = shortcut_src.GetDescription()

    shortcut_dst = pythoncom.CoCreateInstance(shell.CLSID_ShellLink, None,
                                              pythoncom.CLSCTX_INPROC_SERVER,
                                              shell.IID_IShellLink)
    try:
        shortcut_dst.SetPath(path)
    except:
        Logger.warn(
            "LnkFile::clone: unable to setPath. Check that the following command is available on the system: '%s'"
            % (path))
        return False

    shortcut_dst.SetArguments(args)
    shortcut_dst.SetIconLocation(iconLocation, 0)
    shortcut_dst.SetWorkingDirectory(workingDirectory)
    shortcut_dst.SetDescription(description)

    shortcut_dst.QueryInterface(pythoncom.IID_IPersistFile).Save(dstFile, 0)
    return True
Example #51
0
    def req_sendip(self, request):

        try:
            document = minidom.parseString(request["data"])
            rootNode = document.documentElement

            if rootNode.nodeName != "vm":
                raise Exception("invalid root node")

        except:
            Logger.error("Invalid input XML")
            doc = Document()
            rootNode = doc.createElement("error")
            rootNode.setAttribute("reason", "Invalid input XML")
            doc.appendChild(rootNode)

        response = self.send_packet("/vm/info", document)

        if response is False:

            Logger.warn(
                "DialogHypVM::send_ip unable to send request to the session manager"
            )
            return False

        return self.req_answer(document)
	def getIcon(self, id_):
		doc = Document()
		rootNode = doc.createElement('application')
		rootNode.setAttribute("id", id_)
		doc.appendChild(rootNode)
		
		response = self.communictionInstance.send_packet("/application/icon", doc)
		if response is False or not response.headers.has_key("Content-Type"):
			return False
		
		contentType = response.headers["Content-Type"].split(";")[0]
		if not contentType == "image/png":
			Logger.error("content type: %s"%(contentType))
			print response.read()
			return None
		
		data = response.read()
		
		
		path = os.path.join(self.spool, id_+".png")
		try:
			f= file(path, "wb")
		except:
			Logger.error("Unable to open file '%s'"%(path))
			return False
		
		f.write(data)
		f.close()
		
		return True
Example #53
0
	def send_server_status(self, status):
		doc = Document()
		rootNode = doc.createElement('server')
		rootNode.setAttribute("status", status)
		doc.appendChild(rootNode)
		response = self.send_packet("/server/status", doc)
		if response is False:
			Logger.warn("SMRequest::send_server_status Unable to send packet")
			return False
		
		document = self.get_response_xml(response)
		if document is None:
			Logger.warn("SMRequest::send_server_status response not XML")
			return False
		
		rootNode = document.documentElement
		
		if rootNode.nodeName != "server":
			Logger.error("SMRequest::send_server_status response not valid %s"%(rootNode.toxml()))
			return False
		
		if not rootNode.hasAttribute("name") or rootNode.getAttribute("name") != self.name:
			Logger.error("SMRequest::send_server_status response invalid name")
			return False
		
		if not rootNode.hasAttribute("status") or rootNode.getAttribute("status") != status:
			Logger.error("SMRequest::send_server_status response invalid status")
			return False
		
		return True
Example #54
0
    def onSessionCreate(self):
        if not self.session.user.exists():
            Logger.error(
                "Unable to create session for user '%s': user doesn't not exists and use local users ..."
                % (self.session.user.name))
            return False

        self.groups_before_ovd_session = self.session.user.get_groups()
        if self.groups_before_ovd_session is None:
            return False

        groups = set(self.ovd_session_required_groups +
                     self.groups_before_ovd_session)
        if not self.session.user.set_groups(groups):
            Logger.error("Failed to customize groups of the user %s" %
                         (self.session.user.name))
            return False

        if self.force_local_password:
            if Config.override_password_method is Config.OVERRIDE_PASSWORD_METHOD_CUSTOM:
                ret = self.session.user.set_custom_password()
            else:
                ret = self.session.user.set_password()

            if not ret:
                return False

        if not self.session.install_client():
            return False

        return True
Example #55
0
	def create(self):
		
		userData = {}
		userData['name'] = self.name
		
		if self.infos.has_key("displayName"):
			userData['full_name'] = self.infos["displayName"]
			
		if self.infos.has_key("password"):
			userData['password'] = self.infos["password"]
		
		userData['flags']  = win32netcon.UF_DONT_EXPIRE_PASSWD
		userData['flags'] |= win32netcon.UF_NORMAL_ACCOUNT
		userData['flags'] |= win32netcon.UF_PASSWD_CANT_CHANGE
		userData['flags'] |= win32netcon.UF_SCRIPT
		
		userData['priv'] = win32netcon.USER_PRIV_USER
		userData['primary_group_id'] = ntsecuritycon.DOMAIN_GROUP_RID_USERS
		userData['password_expired'] = 0 # password never expire
		userData['acct_expires'] =  win32netcon.TIMEQ_FOREVER
		
		try:
			win32net.NetUserAdd(None, 3, userData)
		except Exception, e:
			Logger.error("unable to create user: "+str(e))
			raise e
Example #56
0
	def put_headers(self):
		headers, separator, body = self.communicator._buffer.partition("\r\n\r\n")

		if separator is '':
			# No or incomplete header chunk
			return None

		self.headers = headers + "\r\n"
		first_line = self.headers.split('\r\n', 1)[0]

		# Get requested service
		res = HttpMessage.http_req_ptn.search(first_line)
		if res is not None:
			self.path = res.group("url")
			self.service = Service.get(self.path)
		
		# Get Transfert encoding
		TE = self.get_header('Transfer-Encoding')
		if TE is not None and TE in 'chunked':
			self.TE = HttpMessage.CHUNKED
		else:
			self.TE = HttpMessage.DEFLATE
			len_body = self.get_header('Content-Length')
			if len_body is not None:
				self.len_body = int(len_body)

		if self.path is not '':
			Logger.debug("Gateway:: HTTP request: " + self.path)

		self.communicator._buffer = body
		return body;