OXIESEC PANEL
- Current Dir:
/
/
opt
/
gsutil
/
gslib
Server IP: 82.112.239.19
Upload:
Create Dir:
Name
Size
Modified
Perms
📁
..
-
02/11/2025 08:26:26 AM
rwxr-xr-x
📄
README
378 bytes
12/09/2024 05:26:03 PM
rw-r--r--
📄
__init__.py
6.3 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
__main__.py
33.59 KB
12/09/2024 05:26:03 PM
rw-r--r--
📁
__pycache__
-
02/11/2025 08:26:27 AM
rwxr-xr-x
📁
addlhelp
-
02/11/2025 08:26:27 AM
rwxr-xr-x
📄
boto_resumable_upload.py
24.69 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
boto_translation.py
85.52 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
bucket_listing_ref.py
3.9 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
cloud_api.py
40.97 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
cloud_api_delegator.py
29.87 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
command.py
110.58 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
command_argument.py
4.35 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
command_runner.py
23.21 KB
12/09/2024 05:26:03 PM
rw-r--r--
📁
commands
-
02/11/2025 08:26:27 AM
rwxr-xr-x
📄
context_config.py
8.36 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
cred_types.py
1.15 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
cs_api_map.py
3.31 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
daisy_chain_wrapper.py
14.39 KB
12/09/2024 05:26:03 PM
rw-r--r--
📁
data
-
12/09/2024 05:26:03 PM
rwxr-xr-x
📄
devshell_auth_plugin.py
1.69 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
discard_messages_queue.py
1.29 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
exception.py
5.18 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
file_part.py
3.39 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
gcs_json_api.py
104.02 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
gcs_json_credentials.py
20.31 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
gcs_json_media.py
28.5 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
help_provider.py
4.26 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
iamcredentials_api.py
11.72 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
impersonation_credentials.py
2.51 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
kms_api.py
13.24 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
lazy_wrapper.py
2.26 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
metrics.py
38.98 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
metrics_reporter.py
4.61 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
metrics_tuple.py
1.44 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
name_expansion.py
29.97 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
no_op_auth_plugin.py
1.19 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
no_op_credentials.py
1.03 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
parallel_tracker_file.py
12.14 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
plurality_checkable_iterator.py
4.4 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
progress_callback.py
6.08 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
project_id.py
1.69 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
pubsub_api.py
11.17 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
resumable_streaming_upload.py
8.53 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
seek_ahead_thread.py
5.11 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
sig_handling.py
5.64 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
storage_uri_builder.py
2.02 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
storage_url.py
16.16 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
tab_complete.py
10.77 KB
12/09/2024 05:26:03 PM
rw-r--r--
📁
tests
-
02/11/2025 08:26:27 AM
rwxr-xr-x
📁
third_party
-
02/11/2025 08:26:27 AM
rwxr-xr-x
📄
thread_message.py
13.71 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
tracker_file.py
24.23 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
tz_utc.py
2.2 KB
12/09/2024 05:26:03 PM
rw-r--r--
📄
ui_controller.py
47.42 KB
12/09/2024 05:26:03 PM
rw-r--r--
📁
utils
-
02/11/2025 08:26:26 AM
rwxr-xr-x
📁
vendored
-
12/09/2024 05:26:03 PM
rwxr-xr-x
📄
wildcard_iterator.py
37.73 KB
12/09/2024 05:26:03 PM
rw-r--r--
Editing: plurality_checkable_iterator.py
Close
# -*- coding: utf-8 -*- # Copyright 2012 Google Inc. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Iterator wrapper for checking wrapped iterator's emptiness or plurality.""" # TODO: Here and elsewhere (wildcard_iterator, name_expansion), do not reference # __iter__ directly because it causes the first element to be instantiated. # Instead, implement __iter__ as a return self and implement the next() function # which returns (not yields) the values. This necessitates that in the case # of the iterator classes, the iterator is used once per class instantiation # so that next() calls do not collide, but this semantic has been long-assumed # by the iterator classes for the use of __iter__ anyway. from __future__ import absolute_import from __future__ import print_function from __future__ import division from __future__ import unicode_literals import sys import six class PluralityCheckableIterator(six.Iterator): """Iterator wrapper class. Allows you to check whether the wrapped iterator is empty and whether it has more than 1 element. This iterator accepts three types of values from the iterator it wraps: 1. A yielded element (this is the normal case). 2. A raised exception, which will be buffered and re-raised when it is reached in this iterator. 3. A yielded tuple of (exception, stack trace), which will be buffered and raised with it is reached in this iterator. """ def __init__(self, it): # Need to get the iterator function here so that we don't immediately # instantiate the first element (which could raise an exception). self.orig_iterator = it self.base_iterator = None self.head = [] self.underlying_iter_empty = False def _PopulateHead(self, num_elements=1): """Populates self.head from the underlying iterator. Args: num_elements: Populate until self.head contains this many elements (or until the underlying iterator runs out). Returns: Number of elements at self.head after execution complete. """ while not self.underlying_iter_empty and len(self.head) < num_elements: try: if not self.base_iterator: self.base_iterator = iter(self.orig_iterator) e = next(self.base_iterator) self.underlying_iter_empty = False if isinstance(e, tuple) and isinstance(e[0], Exception): self.head.append(('exception', e[0], e[1])) else: self.head.append(('element', e)) except StopIteration: # Indicates we can no longer call next() on underlying iterator, but # there could still be elements left to iterate in head. self.underlying_iter_empty = True except Exception as e: # pylint: disable=broad-except # Buffer the exception and raise it when the element is accessed. # Also, preserve the original stack trace, as the stack trace from # within plurality_checkable_iterator.next is not very useful. self.head.append(('exception', e, sys.exc_info()[2])) return len(self.head) def __iter__(self): return self def __next__(self): if self._PopulateHead(): item_tuple = self.head.pop(0) if item_tuple[0] == 'element': return item_tuple[1] else: # buffered exception raise six.reraise(item_tuple[1].__class__, item_tuple[1], item_tuple[2]) raise StopIteration() def IsEmpty(self): return not self._PopulateHead() def HasPlurality(self): # Populate 2 elements (if possible) into head so we can check whether # iterator has more than 1 item remaining. return self._PopulateHead(num_elements=2) > 1 def PeekException(self): """Raises an exception if the first iterated element raised.""" if self._PopulateHead() and self.head[0][0] == 'exception': exception_tuple = self.head[0] raise six.reraise(exception_tuple[1].__class__, exception_tuple[1], exception_tuple[2])