예제 #1
0
파일: __init__.py 프로젝트: tanonl/openuds
    def nextEvent(self, checkFrom=None, startEvent=True, offset=None):
        """
        Returns next event for this interval
        Returns a list of two elements. First is datetime of event begining, second is timedelta of duration
        """
        logger.debug('Obtaining nextEvent')
        if checkFrom is None:
            checkFrom = getSqlDatetime()

        if offset is None:
            offset = datetime.timedelta(minutes=0)

        cacheKey = str(hash(self.calendar.modified)) + self.calendar.uuid + str(
            offset.seconds) + str(int(time.mktime(checkFrom.timetuple()))) + 'event' + ('x' if startEvent is True else '_')
        next_event = CalendarChecker.cache.get(cacheKey, None)
        if next_event is None:
            logger.debug('Regenerating cached nextEvent')
            next_event = self._updateEvents(checkFrom + offset,
                                            startEvent)  # We substract on checkin, so we can take into account for next execution the "offset" on start & end (just the inverse of current, so we substract it)
            if next_event is not None:
                next_event += offset
            CalendarChecker.cache.put(cacheKey, next_event, 3600)
        else:
            logger.debug('nextEvent cache hit')
            CalendarChecker.hits += 1

        return next_event
예제 #2
0
파일: cache.py 프로젝트: tanonl/openuds
    def get(self,
            skey: typing.Union[str, bytes],
            defValue: typing.Any = None) -> typing.Any:
        now: datetime = typing.cast(datetime, getSqlDatetime())
        # logger.debug('Requesting key "%s" for cache "%s"', skey, self._owner)
        try:
            key = self.__getKey(skey)
            # logger.debug('Key: %s', key)
            c: DBCache = DBCache.objects.get(pk=key)  # @UndefinedVariable
            # If expired
            if now > c.created + timedelta(seconds=c.validity):
                return defValue

            try:
                # logger.debug('value: %s', c.value)
                val = pickle.loads(
                    typing.cast(bytes, encoders.decode(c.value, 'base64')))
            except Exception:  # If invalid, simple do no tuse it
                logger.exception('Invalid pickle from cache. Removing it.')
                c.delete()
                return defValue

            Cache.hits += 1
            return val
        except DBCache.DoesNotExist:  # @UndefinedVariable
            Cache.misses += 1
            # logger.debug('key not found: %s', skey)
            return defValue
        except Exception:
            Cache.misses += 1
            # logger.debug('Cache inaccesible: %s:%s', skey, e)
            return defValue
예제 #3
0
파일: cache.py 프로젝트: tanonl/openuds
 def put(self,
         skey: typing.Union[str, bytes],
         value: typing.Any,
         validity: typing.Optional[int] = None) -> None:
     # logger.debug('Saving key "%s" for cache "%s"' % (skey, self._owner,))
     if validity is None:
         validity = Cache.DEFAULT_VALIDITY
     key = self.__getKey(skey)
     value = typing.cast(
         str, encoders.encode(pickle.dumps(value), 'base64', asText=True))
     now: datetime = typing.cast(datetime, getSqlDatetime())
     try:
         DBCache.objects.create(owner=self._owner,
                                key=key,
                                value=value,
                                created=now,
                                validity=validity)  # @UndefinedVariable
     except Exception:
         try:
             # Already exists, modify it
             c: DBCache = DBCache.objects.get(pk=key)  # @UndefinedVariable
             c.owner = self._owner
             c.key = key
             c.value = value
             c.created = now
             c.validity = validity
             c.save()
         except transaction.TransactionManagementError:
             logger.debug('Transaction in course, cannot store value')
예제 #4
0
파일: __init__.py 프로젝트: tanonl/openuds
    def check(self, dtime=None):
        """
        Checks if the given time is a valid event on calendar
        @param dtime: Datetime object to check
        TODO: We can improve performance of this by getting from a cache first if we can
        """
        if dtime is None:
            dtime = getSqlDatetime()

        # First, try to get data from cache if it is valid
        cacheKey = str(hash(self.calendar.modified)) + str(dtime.date().toordinal()) + self.calendar.uuid + 'checker'
        cached = CalendarChecker.cache.get(cacheKey, None)

        if cached is not None:
            data = bitarray.bitarray()  # Empty bitarray
            data.frombytes(cached)
            CalendarChecker.cache_hit += 1
        else:
            data = self._updateData(dtime)

            # Now data can be accessed as an array of booleans.
            # Store data on persistent cache
            CalendarChecker.cache.put(cacheKey, data.tobytes(), 3600 * 24)

        return data[dtime.hour * 60 + dtime.minute]
예제 #5
0
    def check(self, dtime=None):
        """
        Checks if the given time is a valid event on calendar
        @param dtime: Datetime object to check
        """
        if dtime is None:
            dtime = getSqlDatetime()

        # memcached access
        memCache = caches['memory']

        # First, try to get data from cache if it is valid
        cacheKey = (str(self.calendar.modified.toordinal()) +
                    str(dtime.date().toordinal()) + self.calendar.uuid +
                    'checker')
        # First, check "local memory cache", and if not found, from DB cache
        cached = memCache.get(cacheKey)
        if not cached:
            cached = CalendarChecker.cache.get(cacheKey, None)
            if cached:
                memCache.set(cacheKey, cached, ONE_DAY)

        if cached:
            data = bitarray.bitarray()  # Empty bitarray
            data.frombytes(cached)
            CalendarChecker.cache_hit += 1
        else:
            data = self._updateData(dtime)

            # Now data can be accessed as an array of booleans.
            # Store data on persistent cache
            CalendarChecker.cache.put(cacheKey, data.tobytes(), ONE_DAY)
            memCache.set(cacheKey, data.tobytes(), ONE_DAY)

        return data[dtime.hour * 60 + dtime.minute]
예제 #6
0
 def deleteItem(self, parent: 'Calendar', item: str) -> None:
     logger.debug('Deleting rule %s from %s', item, parent)
     try:
         calRule = parent.rules.get(uuid=processUuid(item))
         calRule.calendar.modified = getSqlDatetime()
         calRule.calendar.save()
         calRule.delete()
     except Exception:
         logger.exception('Exception')
         raise self.invalidItemException()
예제 #7
0
파일: cache.py 프로젝트: tanonl/openuds
 def refresh(self, skey: typing.Union[str, bytes]) -> None:
     # logger.debug('Refreshing key "%s" for cache "%s"' % (skey, self._owner,))
     try:
         key = self.__getKey(skey)
         c = DBCache.objects.get(pk=key)  # @UndefinedVariable
         c.created = getSqlDatetime()
         c.save()
     except DBCache.DoesNotExist:  # @UndefinedVariable
         logger.debug(
             'Can\'t refresh cache key %s because it doesn\'t exists', skey)
         return
예제 #8
0
 def publish(self) -> str:
     """
     Realizes the publication of the service
     """
     self._name = 'Publication {}'.format(getSqlDatetime())
     return State.FINISHED
예제 #9
0
    def getLink(  # pylint: disable=too-many-locals
        self,
        userService: 'models.UserService',
        transport: 'models.Transport',
        ip: str,
        os: typing.Dict[str, str],
        user: '******',
        password: str,
        request: 'HttpRequest',
    ) -> str:
        credsInfo = self.processUserAndPassword(userService, user, password)
        username, password, domain = (
            credsInfo['username'],
            credsInfo['password'],
            credsInfo['domain'],
        )

        scrambler = cryptoManager().randomString(32)
        passwordCrypted = cryptoManager().symCrypt(password, scrambler)

        # Build params dict
        params = {
            'protocol': 'rdp',
            'hostname': ip,
            'username': username,
            'password': passwordCrypted,
            'resize-method': 'display-update',
            'ignore-cert': 'true',
            'security': self.security.value,
            'drive-path': '/share/{}'.format(user.uuid),
            'create-drive-path': 'true',
        }

        if False:  # Future imp
            sanitize = lambda x: re.sub("[^a-zA-Z0-9_-]", "_", x)
            params['recording-path'] = (
                '/share/recording/' + sanitize(user.manager.name) + '_' +
                sanitize(user.name) + '/' +
                getSqlDatetime().strftime('%Y%m%d-%H%M'))
            params['create-recording-path'] = 'true'

        if domain:
            params['domain'] = domain

        if self.enableFileSharing.value == 'true':
            params['enable-drive'] = 'true'
        elif self.enableFileSharing.value == 'down':
            params['enable-drive'] = 'true'
            params['disable-upload'] = 'true'
        elif self.enableFileSharing.value == 'up':
            params['enable-drive'] = 'true'
            params['disable-download'] = 'true'

        if self.serverLayout.value != '-':
            params['server-layout'] = self.serverLayout.value

        if not self.enableAudio.isTrue():
            params['disable-audio'] = 'true'
        elif self.enableAudioInput.isTrue():
            params['enable-audio-input'] = 'true'

        if self.enablePrinting.isTrue():
            params['enable-printing'] = 'true'
            params['printer-name'] = 'UDS-Printer'

        if self.wallpaper.isTrue():
            params['enable-wallpaper'] = 'true'

        if self.desktopComp.isTrue():
            params['enable-desktop-composition'] = 'true'

        if self.smooth.isTrue():
            params['enable-font-smoothing'] = 'true'

        logger.debug('RDP Params: %s', params)

        ticket = models.TicketStore.create(params,
                                           validity=self.ticketValidity.num())

        onw = ('&o_n_w={};'.format(hash(transport.name))
               if self.forceNewWindow.isTrue() else '')
        return str("{}/guacamole/#/?data={}.{}{}".format(
            self.guacamoleServer.value, ticket, scrambler, onw))