def __init__(self): self.weblive = WebLive(self.URL, True) self.available_servers = [] for client in (WebLiveClientX2GO, WebLiveClientQTNX): if client.is_supported(): self.client = client() break self._ready = Event()
class WebLiveBackend(object): """ Backend for interacting with the WebLive service """ client = None URL = os.environ.get('SOFTWARE_CENTER_WEBLIVE_HOST', 'https://weblive.stgraber.org/weblive/json') def __init__(self): self.weblive = WebLive(self.URL, True) self.available_servers = [] for client in (WebLiveClientX2GO, WebLiveClientQTNX): if client.is_supported(): self.client = client() break self._ready = Event() @property def ready(self): """ Return true if data from the remote server was loaded """ return self.client and self._ready.is_set() def query_available(self): """ Get all the available data from WebLive """ self._ready.clear() servers = self.weblive.list_everything() self._ready.set() return servers def query_available_async(self): """ Call query_available in a thread and set self.ready """ def _query_available_helper(): self.available_servers = self.query_available() p = Thread(target=_query_available_helper) p.start() def is_pkgname_available_on_server(self, pkgname, serverid=None): """Check if the package is available (on all servers or on 'serverid') """ for server in self.available_servers: if not serverid or server.name == serverid: for pkg in server.packages: if pkg.pkgname == pkgname: return True return False def get_servers_for_pkgname(self, pkgname): """ Return a list of servers having a given package """ servers = [] for server in self.available_servers: # No point in returning a server that's full if server.current_users >= server.userlimit: continue for pkg in server.packages: if pkg.pkgname == pkgname: servers.append(server) return servers def create_automatic_user_and_run_session(self, serverid, session="desktop", wait=False): """ Create a user on 'serverid' and start the session """ # Use the boot_id to get a temporary unique identifier # (until next reboot) if os.path.exists('/proc/sys/kernel/random/boot_id'): uuid = open('/proc/sys/kernel/random/boot_id', 'r').read().strip().replace('-', '') random.seed(uuid) # Generate a 20 characters string based on the boot_id identifier = ''.join( random.choice(string.ascii_lowercase) for x in range(20)) # Use the current username as the GECOS on the server # if it's invalid (by weblive's standard), use "WebLive user" instead fullname = str(os.environ.get('USER', 'WebLive user')) if not re.match("^[A-Za-z0-9 ]*$", fullname) or len(fullname) == 0: fullname = 'WebLive user' # Send the user's locale so it's automatically selected when connecting locale = os.environ.get("LANG", "None").replace("UTF-8", "utf8") # Create the user and retrieve host and port of the target server connection = self.weblive.create_user(serverid, identifier, fullname, identifier, session, locale) # Connect using x2go or fallback to qtnx if not available if (self.client): self.client.start_session(connection[0], connection[1], session, identifier, identifier, wait) else: raise IOError("No remote desktop client available.")
class WebLiveBackend(object): """ Backend for interacting with the WebLive service """ client = None URL = os.environ.get('SOFTWARE_CENTER_WEBLIVE_HOST', 'https://weblive.stgraber.org/weblive/json') def __init__(self): self.weblive = WebLive(self.URL, True) self.available_servers = [] for client in (WebLiveClientX2GO, WebLiveClientQTNX): if client.is_supported(): self.client = client() break self._ready = Event() @property def ready(self): """ Return true if data from the remote server was loaded """ return self.client and self._ready.is_set() def query_available(self): """ Get all the available data from WebLive """ self._ready.clear() servers = self.weblive.list_everything() self._ready.set() return servers def query_available_async(self): """ Call query_available in a thread and set self.ready """ def _query_available_helper(): self.available_servers = self.query_available() p = Thread(target=_query_available_helper) p.start() def is_pkgname_available_on_server(self, pkgname, serverid=None): """Check if the package is available (on all servers or on 'serverid') """ for server in self.available_servers: if not serverid or server.name == serverid: for pkg in server.packages: if pkg.pkgname == pkgname: return True return False def get_servers_for_pkgname(self, pkgname): """ Return a list of servers having a given package """ servers = [] for server in self.available_servers: # No point in returning a server that's full if server.current_users >= server.userlimit: continue for pkg in server.packages: if pkg.pkgname == pkgname: servers.append(server) return servers def create_automatic_user_and_run_session(self, serverid, session="desktop", wait=False): """ Create a user on 'serverid' and start the session """ # Use the boot_id to get a temporary unique identifier # (until next reboot) if os.path.exists('/proc/sys/kernel/random/boot_id'): uuid = open('/proc/sys/kernel/random/boot_id', 'r').read().strip().replace('-', '') random.seed(uuid) # Generate a 20 characters string based on the boot_id identifier = ''.join(random.choice(string.ascii_lowercase) for x in range(20)) # Use the current username as the GECOS on the server # if it's invalid (by weblive's standard), use "WebLive user" instead fullname = str(os.environ.get('USER', 'WebLive user')) if not re.match("^[A-Za-z0-9 ]*$", fullname) or len(fullname) == 0: fullname = 'WebLive user' # Send the user's locale so it's automatically selected when connecting locale = os.environ.get("LANG", "None").replace("UTF-8", "utf8") # Create the user and retrieve host and port of the target server connection = self.weblive.create_user(serverid, identifier, fullname, identifier, session, locale) # Connect using x2go or fallback to qtnx if not available if (self.client): self.client.start_session(connection[0], connection[1], session, identifier, identifier, wait) else: raise IOError("No remote desktop client available.")