# packages

pkgId: c5bc521d29b5d58b9deb40716f5ed5bd090631060cd1f56e3089337be4c8c870
name: python-cloudcomponents.cdk-stripe-webhook
arch: src
version: 2.4.0
epoch: 0
release: 1
summary: Create, update and delete stripe webhooks with your app deployment
url: https://github.com/cloudcomponents/cdk-constructs
rpm_license: MIT
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudcomponents.cdk-stripe-webhook-2.4.0-1.src.rpm
checksum_type: sha256
description:
  [![cloudcomponents Logo](https://raw.githubusercontent.com/cloudcomponents/cdk-constructs/master/logo.png)](https://github.com/cloudcomponents/cdk-constructs)



  [![Build Status](https://github.com/cloudcomponents/cdk-constructs/workflows/Build/badge.svg)](https://github.com/cloudcomponents/cdk-constructs/actions?query=workflow=Build)
  [![cdkdx](https://img.shields.io/badge/buildtool-cdkdx-blue.svg)](https://github.com/hupe1980/cdkdx)
  [![typescript](https://img.shields.io/badge/jsii-typescript-blueviolet.svg)](https://www.npmjs.com/package/@cloudcomponents/cdk-stripe-webhook)
  [![python](https://img.shields.io/badge/jsii-python-blueviolet.svg)](https://pypi.org/project/cloudcomponents.cdk-stripe-webhook/)

  > Create, update and delete stripe webhooks with your app deployment



  TypeScript/JavaScript:

  ```bash
  npm i @cloudcomponents/cdk-stripe-webhook
  ```

  Python:

  ```bash
  pip install cloudcomponents.cdk-stripe-webhook
  ```





  ```python
  import { SecretKey, SecretKeyStore } from '@cloudcomponents/cdk-secret-key';
  import { StripeWebhook, StripeEventBusProducer } from '@cloudcomponents/cdk-stripe-webhook';
  import { Stack, StackProps, aws_ssm } from 'aws-cdk-lib';
  import { Construct } from 'constructs';

  export class StripeWebhookEventBusStack extends Stack {
    constructor(scope: Construct, id: string, props?: StackProps) {
      super(scope, id, props);

      if (typeof process.env.SECRET_KEY === 'undefined') {
        throw new Error('environment variable SECRET_KEY undefined');
      }
      const secretKey = SecretKey.fromPlainText(process.env.SECRET_KEY);

      const endpointSecretParameter = aws_ssm.StringParameter.fromSecureStringParameterAttributes(this, 'Param', {
        parameterName: 'stripe',
        version: 1,
      });

      const producer = new StripeEventBusProducer(this, 'Producer', {
        secretKey,
        endpointSecret: SecretKey.fromSSMParameter(endpointSecretParameter),
      });

      const events = ['charge.failed', 'charge.succeeded'];

      const endpointSecretStore = SecretKeyStore.fromSSMParameter(endpointSecretParameter);

      new StripeWebhook(this, 'StripeWebhook', {
        secretKey,
        url: producer.url,
        events,
        logLevel: 'debug',
        endpointSecretStore,
      });
    }
  }
  ```



  ```python
  import { SecretKey } from '@cloudcomponents/cdk-secret-key';
  import { StripeWebhook } from '@cloudcomponents/cdk-stripe-webhook';
  import { Stack, StackProps, aws_apigateway } from 'aws-cdk-lib';
  import { Construct } from 'constructs';
  export class StripeWebhookStack extends Stack {
    constructor(scope: Construct, id: string, props?: StackProps) {
      super(scope, id, props);

      const api = new aws_apigateway.RestApi(this, 'Endpoint');
      api.root.addMethod('POST');

      if (typeof process.env.SECRET_KEY === 'undefined') {
        throw new Error('environment variable SECRET_KEY undefined');
      }
      const secretKey = SecretKey.fromPlainText(process.env.SECRET_KEY);

      const events = ['charge.failed', 'charge.succeeded'];

      new StripeWebhook(this, 'StripeWebhook', {
        secretKey,
        url: api.url,
        events,
        logLevel: 'debug',
      });
    }
  }
  ```



  See [API.md](https://github.com/cloudcomponents/cdk-constructs/tree/master/packages/cdk-stripe-webhook/API.md).



  See more complete [examples](https://github.com/cloudcomponents/cdk-constructs/tree/master/examples).



  [MIT](https://github.com/cloudcomponents/cdk-constructs/tree/master/packages/cdk-stripe-webhook/LICENSE)


pkgId: b1e5afd3a14724289e2a6ea0947b3cba5262a7aa9af6d76a123a3a6e7b07a05d
name: python-cloudcomponents.cdk-temp-stack
arch: src
version: 2.4.0
epoch: 0
release: 1
summary: A stack that destroys itself after a given time (ttl)
url: https://github.com/cloudcomponents/cdk-constructs
rpm_license: MIT
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudcomponents.cdk-temp-stack-2.4.0-1.src.rpm
checksum_type: sha256
description:
  [![cloudcomponents Logo](https://raw.githubusercontent.com/cloudcomponents/cdk-constructs/master/logo.png)](https://github.com/cloudcomponents/cdk-constructs)



  [![Build Status](https://github.com/cloudcomponents/cdk-constructs/workflows/Build/badge.svg)](https://github.com/cloudcomponents/cdk-constructs/actions?query=workflow=Build)
  [![cdkdx](https://img.shields.io/badge/buildtool-cdkdx-blue.svg)](https://github.com/hupe1980/cdkdx)
  [![typescript](https://img.shields.io/badge/jsii-typescript-blueviolet.svg)](https://www.npmjs.com/package/@cloudcomponents/cdk-temp-stack)
  [![python](https://img.shields.io/badge/jsii-python-blueviolet.svg)](https://pypi.org/project/cloudcomponents.cdk-temp-stack/)

  > A stack that destroys itself after a given time (ttl)



  TypeScript/JavaScript:

  ```bash
  npm i @cloudcomponents/cdk-temp-stack
  ```

  Python:

  ```bash
  pip install cloudcomponents.cdk-temp-stack
  ```



  ```python
  // temp-infra-app.ts



  import 'source-map-support/register';
  import { App, Duration } from 'aws-cdk-lib';

  import { TempInfraStack } from './temp-infra-stack';

  const app = new App();

  new TempInfraStack(app, 'TempInfraStack', {
    env: {
      region: process.env.DEFAULT_REGION,
      account: process.env.CDK_DEFAULT_ACCOUNT,
    },
    ttl: Duration.minutes(10),
  });

  // temp-infra-stack.ts

  import { TempStack, TempStackProps } from '@cloudcomponents/cdk-temp-stack';
  import { Vpc } from 'aws-cdk-lib/aws-ec2';
  import { Construct } from 'constructs';

  export class TempInfraStack extends TempStack {
    constructor(scope: Construct, id: string, props: TempStackProps) {
      super(scope, id, props);

      new Vpc(this, 'VPC');
    }
  }
  ```



  Alternatively, you can also add the TimeToLive construct to your stack

  ```python
  // your stack

  import { TimeToLive } from '@cloudcomponents/cdk-temp-stack';
  import { Stack, StackProps, Duration } from 'aws-cdk-lib';
  import { Construct } from 'constructs';

  export class YourStack extends Stack {
    constructor(scope: Construct, id: string, props: StackProps) {
      super(scope, id, props);

      new TimeToLive(this, 'TimeToLive', {
        ttl: Duration.minutes(10),
      });
    }
  }
  ```



  See [API.md](https://github.com/cloudcomponents/cdk-constructs/tree/master/packages/cdk-temp-stack/API.md).



  See more complete [examples](https://github.com/cloudcomponents/cdk-constructs/tree/master/examples).



  [MIT](https://github.com/cloudcomponents/cdk-constructs/tree/master/packages/cdk-temp-stack/LICENSE)


pkgId: ee6a7c315e3edb068d780e7b741998880f9f53f92266ce343909584a8cba20ed
name: python-cloudconformity
arch: src
version: 0.1.9
epoch: 0
release: 1
summary: Cloud Conformity template scanner tool
url: https://github.com/JustinDPerkins/cloudconformity
rpm_license: MIT License
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudconformity-0.1.9-1.src.rpm
checksum_type: sha256
description:
  This is a python package to Cloud Conformity Template Scanner.



  To start using we need to setup the config.ini file first.
  Navigate to the install pip package. <br>

  Add your apiKey. We have created and environment variable
  ```
  api= os.environ.get('apiKey')
  ```

  Endpoint Region is set as US(Oregon - us-west-2)<br>
  <br>
  For reference, check out the conformity API documentation.<br>
  https://github.com/cloudconformity/documentation-api




  Finally, we can scan a CloudFormation Template for misconfigurations before deployment into your AWS infrastructure.

  We can scan by default or failures using either [all, fail]
  Alternatively, we can filter by severity [Extreme, Very High, High, Medium, Low]

  For example, a scan looking for any failure in your template
  ```
  cloudconformity --scan fail C:\MyExample\template.yaml
  ```
  Another example, a scan looking for extreme failures in your template
  ```
  cloudconformity --scan extreme C:\MyExample\template.yaml
  ```
  To see the original json response from API call
  ```
  cloudconformity --scan default C:\MyExample\template.yaml


pkgId: 9d7dd8fca2aecb1ae6ca9ce9ad512162046dd400c096ec7b5ee95287eda5c1e7
name: python-cloudconvert
arch: src
version: 2.1.0
epoch: 0
release: 1
summary: Python REST API wrapper for cloud convert
url: https://github.com/cloudconvert/cloudconvert-python
rpm_license: MIT License
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudconvert-2.1.0-1.src.rpm
checksum_type: sha256
description:
  This is the official Python SDK for the [CloudConvert](https://cloudconvert.com/api/v2) **API v2**.

  [![Tests](https://github.com/cloudconvert/cloudconvert-python/actions/workflows/run-tests.yml/badge.svg)](https://github.com/cloudconvert/cloudconvert-python/actions/workflows/run-tests.yml)
  ![PyPI](https://img.shields.io/pypi/v/cloudconvert)
  ![PyPI - Downloads](https://img.shields.io/pypi/dm/cloudconvert)



  ```
   pip install cloudconvert
  ```



  ```py
   import cloudconvert

  cloudconvert.configure(api_key='API_KEY', sandbox=False)
  ```

  Or set the environment variable `CLOUDCONVERT_API_KEY` and use:

  ```py
   import cloudconvert

  cloudconvert.default()
  ```



  ```py
   import cloudconvert

  cloudconvert.configure(api_key='API_KEY')

  cloudconvert.Job.create(payload={
      "tasks": {
          'import-my-file': {
              'operation': 'import/url',
              'url': 'https://my-url'
          },
          'convert-my-file': {
              'operation': 'convert',
              'input': 'import-my-file',
              'output_format': 'pdf',
              'some_other_option': 'value'
          },
          'export-my-file': {
              'operation': 'export/url',
              'input': 'convert-my-file'
          }
      }
  })

  ```



  CloudConvert can generate public URLs for using `export/url` tasks. You can use these URLs to download output files.

  ```py
  exported_url_task_id = "84e872fc-d823-4363-baab-eade2e05ee54"
  res = cloudconvert.Task.wait(id=exported_url_task_id)  # Wait for job completion
  file = res.get("result").get("files")[0]
  res = cloudconvert.download(filename=file['filename'], url=file['url'])
  print(res)
  ```



  Uploads to CloudConvert are done via `import/upload` tasks (see
  the [docs](https://cloudconvert.com/api/v2/import#import-upload-tasks)). This SDK offers a convenient upload method:

  ```py
  job = cloudconvert.Job.create(payload={
      'tasks': {
          'upload-my-file': {
              'operation': 'import/upload'
          }
      }
  })

  upload_task_id = job['tasks'][0]['id']

  upload_task = cloudconvert.Task.find(id=upload_task_id)
  res = cloudconvert.Task.upload(file_name='path/to/sample.pdf', task=upload_task)

  res = cloudconvert.Task.find(id=upload_task_id)
  ```



  The node SDK allows to verify webhook requests received from CloudConvert.

  ```py
  payloadString = '...';  # The JSON string from the raw request body.
  signature = '...';  # The value of the "CloudConvert-Signature" header.
  signingSecret = '...';  # You can find it in your webhook settings.

  isValid = cloudconvert.Webhook.verify(payloadString, signature, signingSecret);  # returns true or false
  ```



  Signed URLs allow converting files on demand only using URL query parameters. The Python SDK allows to generate such
  URLs. Therefore, you need to obtain a signed URL base and a signing secret on
  the [CloudConvert Dashboard](https://cloudconvert.com/dashboard/api/v2/signed-urls).

  ```py
  base = 'https://s.cloudconvert.com/...'  # You can find it in your signed URL settings.
  signing_secret = '...'  # You can find it in your signed URL settings.
  cache_key = 'cache-key'  # Allows caching of the result file for 24h

  job = {
      "tasks": {
          "import-file": {
              "operation": "import/url",
              "url": "https://github.com/cloudconvert/cloudconvert-php/raw/master/tests/Integration/files/input.pdf"
          },
          "export-file": {
              "operation": "export/url",
              "input": "import-file"
          }
      }
  }

  url = cloudconvert.SignedUrl.sign(base, signing_secret, job, cache_key);  # returns the URL
  ```



  ```

  $ python tests/unit/testTask.py


  $ python tests/unit/testJob.py


  $ python tests/unit/testWebhookSignature.py

  ```



  ```

  $ python tests/integration/testTasks.py


  $ python tests/integration/testJobs.py

  ```



  * [API v2 Documentation](https://cloudconvert.com/api/v2)
  * [CloudConvert Blog](https://cloudconvert.com/blog)


pkgId: 63e010b94742250ee50cd7e2f5442ae217389b9d92813dfefb46b50a7e279309
name: python-clouddl
arch: src
version: 0.5.0
epoch: 0
release: 1
summary: Python library that allows you to parse Google Drive & Dropbox links and download files
url: https://github.com/duckduckgrayduck/clouddl
rpm_license: MIT License
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-clouddl-0.5.0-1.src.rpm
checksum_type: sha256
description:
  Downloader for Google Drive & DropBox

  - Python 3
  - Works on all operating systems
  - No API keys / credentials needed
  - Auto extracts .zip files
  - Auto extracts .rar files (requires 7zip)
  - Auto deletes compressed files after extraction


  ```console
  pip install clouddl
  ```


  ```python3
  from clouddl import grab


  grab('https://drive.google.com/file/d/.../view?usp=sharing', './Downloads/')
  ```


  ```python3
  from clouddl import grab

  grab('https://drive.google.com/file/d/.../view?usp=sharing', './Downloads/', quiet=False)
  ```


  ```python3
  from clouddl import grab

  download_list = ['URL1', 'URL2', 'URL3']

  for url in download_list:
   grab(url, './')
  ```


  ```python3
  from clouddl import DROPBOX_URL, GDRIVE_URL
  ```

  Google Drive
  ```txt
  https://drive.google.com/drive/folders/...?usp=sharing
  https://drive.google.com/file/d/.../view?usp=sharing
  ```
  Dropbox
  ```txt
  https://www.dropbox.com/s/.../...?dl=0
  https://www.dropbox.com/s/.../...?dl=1
  https://www.dropbox.com/sh/.../...?dl=0
  https://www.dropbox.com/sh/.../...?dl=1
  ```



  Thank you to the authors of the following repos:
  - "gdrivedl" by matthuisman - https://github.com/matthuisman/gdrivedl
  - "lootdl" by jesusyanez - https://github.com/jesusyanez/lootdl


pkgId: 8e17004378498bd7f7b5318cc264446daf10dabce69e9d8d8924d338a452dfe6
name: python-clouddrive
arch: src
version: 0.0.12.3
epoch: 0
release: 1
summary: Python wrapper for CloudDrive.
url: https://github.com/ChenyangGao/web-mount-packs/tree/main/python-clouddrive-client
rpm_license: MIT
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-clouddrive-0.0.12.3-1.src.rpm
checksum_type: sha256
description:
  ![PyPI - Python Version](https://img.shields.io/pypi/pyversions/clouddrive)
  ![PyPI - Version](https://img.shields.io/pypi/v/clouddrive)
  ![PyPI - Downloads](https://img.shields.io/pypi/dm/clouddrive)
  ![PyPI - Format](https://img.shields.io/pypi/format/clouddrive)
  ![PyPI - Status](https://img.shields.io/pypi/status/clouddrive)



  通过 [pypi](https://pypi.org/project/clouddrive/)

  ```console
  pip install -U clouddrive
  ```





  **导入模块**

  ```python
  from clouddrive import CloudDriveClient, CloudDriveFileSystem
  ```

  **创建客户端对象，登录 <kbd>CloudDrive</kbd>：此处，后台服务地址: `"http://localhost:19798"`，用户名: `"test"`，密码: `"test@test"`**

  > 请确保 <kbd>CloudDrive</kbd> 已经启动，并且可通过 <kbd>http://localhost:19798</kbd> 访问

  ```python
  client = CloudDriveClient("http://localhost:19798", "test", "test@test")
  ```

  绝大部分 <kbd>CloudDriveClient</kbd> 的方法带有 `async_` 参数，意味着它支持异步 IO。

  ```python
  >>> import asyncio
  >>> loop = asyncio.get_event_loop()

  >>> from clouddrive import CloudDriveClient, CloudDriveFileSystem
  >>> client = CloudDriveClient("http://localhost:19798", "test", "test@test")

  >>> import CloudDrive_pb2
  >>> client.FindFileByPath(CloudDrive_pb2.FindFileByPathRequest(path="/"))
  id: "60512951-88d8-4b5a-bea4-fbcb5d86ce6f"
  name: "/"
  fullPathName: "/"
  createTime {
    seconds: 1703821474
    nanos: 152897000
  }
  writeTime {
    seconds: 1703821474
    nanos: 152897000
  }
  accessTime {
    seconds: 1703821474
    nanos: 152897000
  }
  CloudAPI {
    name: "BaseFsApi"
  }
  isDirectory: true
  isRoot: true

  >>> client.FindFileByPath(CloudDrive_pb2.FindFileByPathRequest(path="/"), async_=True)
  <coroutine object UnaryUnaryMethod.__call__ at 0x107518f20>
  >>> loop.run_until_complete(client.FindFileByPath(CloudDrive_pb2.FindFileByPathRequest(path="/"), async_=True))
  id: "60512951-88d8-4b5a-bea4-fbcb5d86ce6f"
  name: "/"
  fullPathName: "/"
  createTime {
    seconds: 1703821474
    nanos: 152897000
  }
  writeTime {
    seconds: 1703821474
    nanos: 152897000
  }
  accessTime {
    seconds: 1703821474
    nanos: 152897000
  }
  CloudAPI {
    name: "BaseFsApi"
  }
  isDirectory: true
  isRoot: true
  ```

  **创建文件系统对象**

  ```python
  fs = CloudDriveFileSystem(client)
  ```

  或者直接在 <kbd>client</kbd> 上就可获取文件系统对象

  ```python
  fs = client.fs
  ```

  或者直接用 <kbd>CloudDriveFileSystem</kbd> 登录

  ```python
  fs = CloudDriveFileSystem.login("http://localhost:19798", "test", "test@test")
  ```



  文件系统对象的方法，设计和行为参考了 <kbd>[os](https://docs.python.org/3/library/os.html)</kbd>、<kbd>[posixpath](https://docs.python.org/3/library/os.path.html)</kbd>、<kbd>[pathlib.Path](https://docs.python.org/3/library/pathlib.html)</kbd> 和 <kbd>[shutil](https://docs.python.org/3/library/shutil.html)</kbd> 等模块。

  <kbd>clouddrive.CloudDriveFileSystem</kbd> 实现了读写的文件系统方法。

  <kbd>clouddrive.CloudDrivePath</kbd> 实现了二次封装，从路径的角度来进行操作。

  **使用** <kbd>getcwd</kbd> **方法，获取当前工作目录的路径，参考** <kbd>os.getcwd</kbd>

  ```python
  >>> fs.getcwd()
  '/'
  ```

  **使用** <kbd>listdir</kbd> **方法，罗列当前目录的文件名，参考** <kbd>os.listdir</kbd>

  ```python
  >>> fs.listdir()
  ['115', '阿里云盘Open']
  ```

  **使用** <kbd>chdir</kbd> **方法，切换当前工作目录，参考** <kbd>os.chdir</kbd>

  ```python
  >>> fs.chdir("/115")
  ```

  **使用** <kbd>listdir_attr</kbd> **方法，罗列当前目录时，还可以获取属性**

  ```python
  >>> fs.listdir_attr()
  [{'id': '2592968610464922758',
    'name': '000阅读·乱七八糟',
    'fullPathName': '/115/000阅读·乱七八糟',
    'createTime': '2023-03-18T06:45:45Z',
    'writeTime': '2023-12-14T06:54:20Z',
    'accessTime': '2023-12-14T06:54:20Z',
    'CloudAPI': {'name': '115',
     'userName': '306576686',
     'nickName': '306576686'},
    'isDirectory': True,
    'isCloudDirectory': True,
    'canSearch': True,
    'hasDetailProperties': True,
    'canOfflineDownload': True,
    'path': '/115/000阅读·乱七八糟',
    'lastest_update': datetime.datetime(2023, 12, 29, 13, 14, 2, 172632)},
   {'id': '2644648816430546428',
    'name': 'libgen',
    'fullPathName': '/115/libgen',
    'createTime': '2023-05-28T14:05:06Z',
    'writeTime': '2023-12-14T06:54:20Z',
    'accessTime': '2023-12-14T06:54:20Z',
    'CloudAPI': {'name': '115',
     'userName': '306576686',
     'nickName': '306576686'},
    'isDirectory': True,
    'isCloudDirectory': True,
    'canSearch': True,
    'hasDetailProperties': True,
    'canOfflineDownload': True,
    'path': '/115/libgen',
    'lastest_update': datetime.datetime(2023, 12, 29, 13, 14, 2, 172632)},
   {'id': '2593093001609739968',
    'name': '云下载',
    'fullPathName': '/115/云下载',
    'createTime': '2023-03-18T10:52:54Z',
    'writeTime': '2023-12-16T13:58:22Z',
    'accessTime': '2023-12-16T13:58:22Z',
    'CloudAPI': {'name': '115',
     'userName': '306576686',
     'nickName': '306576686'},
    'isDirectory': True,
    'isCloudDirectory': True,
    'canSearch': True,
    'hasDetailProperties': True,
    'canOfflineDownload': True,
    'path': '/115/云下载',
    'lastest_update': datetime.datetime(2023, 12, 29, 13, 14, 2, 172632)},
   {'id': '2580587204111760961',
    'name': '电影',
    'fullPathName': '/115/电影',
    'createTime': '2023-03-01T04:46:07Z',
    'writeTime': '2023-12-14T06:54:20Z',
    'accessTime': '2023-12-14T06:54:20Z',
    'CloudAPI': {'name': '115',
     'userName': '306576686',
     'nickName': '306576686'},
    'isDirectory': True,
    'isCloudDirectory': True,
    'canSearch': True,
    'hasDetailProperties': True,
    'canOfflineDownload': True,
    'path': '/115/电影',
    'lastest_update': datetime.datetime(2023, 12, 29, 13, 14, 2, 172632)},
   {'id': '2614100250469596984',
    'name': '电视剧',
    'fullPathName': '/115/电视剧',
    'createTime': '2023-04-16T10:30:33Z',
    'writeTime': '2023-12-23T14:26:17Z',
    'accessTime': '2023-12-23T14:26:17Z',
    'CloudAPI': {'name': '115',
     'userName': '306576686',
     'nickName': '306576686'},
    'isDirectory': True,
    'isCloudDirectory': True,
    'canSearch': True,
    'hasDetailProperties': True,
    'canOfflineDownload': True,
    'path': '/115/电视剧',
    'lastest_update': datetime.datetime(2023, 12, 29, 13, 14, 2, 172632)},
   {'id': '2576930424647319247',
    'name': '纪录片',
    'fullPathName': '/115/纪录片',
    'createTime': '2023-02-24T03:40:45Z',
    'writeTime': '2023-12-18T10:49:29Z',
    'accessTime': '2023-12-18T10:49:29Z',
    'CloudAPI': {'name': '115',
     'userName': '306576686',
     'nickName': '306576686'},
    'isDirectory': True,
    'isCloudDirectory': True,
    'canSearch': True,
    'hasDetailProperties': True,
    'canOfflineDownload': True,
    'path': '/115/纪录片',
    'lastest_update': datetime.datetime(2023, 12, 29, 13, 14, 2, 172632)},
   {'id': '2580131407544188592',
    'name': '👾0号：重要资源',
    'fullPathName': '/115/👾0号：重要资源',
    'createTime': '2023-02-28T13:40:32Z',
    'writeTime': '2023-12-14T06:54:20Z',
    'accessTime': '2023-12-14T06:54:20Z',
    'CloudAPI': {'name': '115',
     'userName': '306576686',
     'nickName': '306576686'},
    'isDirectory': True,
    'isCloudDirectory': True,
    'canSearch': True,
    'hasDetailProperties': True,
    'canOfflineDownload': True,
    'path': '/115/👾0号：重要资源',
    'lastest_update': datetime.datetime(2023, 12, 29, 13, 14, 2, 172632)},
   {'id': '2580246506904748007',
    'name': '📚1号：书籍大礼包',
    'fullPathName': '/115/📚1号：书籍大礼包',
    'createTime': '2023-02-28T17:29:12Z',
    'writeTime': '2023-12-14T06:54:20Z',
    'accessTime': '2023-12-14T06:54:20Z',
    'CloudAPI': {'name': '115',
     'userName': '306576686',
     'nickName': '306576686'},
    'isDirectory': True,
    'isCloudDirectory': True,
    'canSearch': True,
    'hasDetailProperties': True,
    'canOfflineDownload': True,
    'path': '/115/📚1号：书籍大礼包',
    'lastest_update': datetime.datetime(2023, 12, 29, 13, 14, 2, 172632)},
   {'id': '2673432528538303699',
    'name': '📼资料备份',
    'fullPathName': '/115/📼资料备份',
    'createTime': '2023-07-07T07:13:12Z',
    'writeTime': '2023-12-14T06:54:20Z',
    'accessTime': '2023-12-14T06:54:20Z',
    'CloudAPI': {'name': '115',
     'userName': '306576686',
     'nickName': '306576686'},
    'isDirectory': True,
    'isCloudDirectory': True,
    'canSearch': True,
    'hasDetailProperties': True,
    'canOfflineDownload': True,
    'path': '/115/📼资料备份',
    'lastest_update': datetime.datetime(2023, 12, 29, 13, 14, 2, 172632)}]
  ```

  **使用** <kbd>listdir_path</kbd> **方法，罗列当前目录时，还可以获取** <kbd>clouddrive.CloudDrivePath</kbd> **对象**

  ```python
  >>> fs.listdir_path()
  [<clouddrive.CloudDrivePath(id='2592968610464922758', name='000阅读·乱七八糟', fullPathName='/115/000阅读·乱七八糟', createTime='2023-03-18T06:45:45Z', writeTime='2023-12-14T06:54:20Z', accessTime='2023-12-14T06:54:20Z', CloudAPI={'name': '115', 'userName': '306576686', 'nickName': '306576686'}, isDirectory=True, isCloudDirectory=True, canSearch=True, hasDetailProperties=True, canOfflineDownload=True, lastest_update=datetime.datetime(2023, 12, 29, 13, 15, 21, 23281), fs=clouddrive.CloudDriveFileSystem(client=clouddrive.CloudDriveClient(origin='http://localhost:19798', username='2339083510@qq.com', password='******', channel=<grpc._channel.Channel object at 0x105e9a850>, async_channel=Channel('localhost', 19798, ..., path=None)), path='/115', refresh=False), path='/115/000阅读·乱七八糟')>,
   <clouddrive.CloudDrivePath(id='2644648816430546428', name='libgen', fullPathName='/115/libgen', createTime='2023-05-28T14:05:06Z', writeTime='2023-12-14T06:54:20Z', accessTime='2023-12-14T06:54:20Z', CloudAPI={'name': '115', 'userName': '306576686', 'nickName': '306576686'}, isDirectory=True, isCloudDirectory=True, canSearch=True, hasDetailProperties=True, canOfflineDownload=True, lastest_update=datetime.datetime(2023, 12, 29, 13, 15, 21, 23281), fs=clouddrive.CloudDriveFileSystem(client=clouddrive.CloudDriveClient(origin='http://localhost:19798', username='2339083510@qq.com', password='******', channel=<grpc._channel.Channel object at 0x105e9a850>, async_channel=Channel('localhost', 19798, ..., path=None)), path='/115', refresh=False), path='/115/libgen')>,
   <clouddrive.CloudDrivePath(id='2593093001609739968', name='云下载', fullPathName='/115/云下载', createTime='2023-03-18T10:52:54Z', writeTime='2023-12-16T13:58:22Z', accessTime='2023-12-16T13:58:22Z', CloudAPI={'name': '115', 'userName': '306576686', 'nickName': '306576686'}, isDirectory=True, isCloudDirectory=True, canSearch=True, hasDetailProperties=True, canOfflineDownload=True, lastest_update=datetime.datetime(2023, 12, 29, 13, 15, 21, 23281), fs=clouddrive.CloudDriveFileSystem(client=clouddrive.CloudDriveClient(origin='http://localhost:19798', username='2339083510@qq.com', password='******', channel=<grpc._channel.Channel object at 0x105e9a850>, async_channel=Channel('localhost', 19798, ..., path=None)), path='/115', refresh=False), path='/115/云下载')>,
   <clouddrive.CloudDrivePath(id='2580587204111760961', name='电影', fullPathName='/115/电影', createTime='2023-03-01T04:46:07Z', writeTime='2023-12-14T06:54:20Z', accessTime='2023-12-14T06:54:20Z', CloudAPI={'name': '115', 'userName': '306576686', 'nickName': '306576686'}, isDirectory=True, isCloudDirectory=True, canSearch=True, hasDetailProperties=True, canOfflineDownload=True, lastest_update=datetime.datetime(2023, 12, 29, 13, 15, 21, 23281), fs=clouddrive.CloudDriveFileSystem(client=clouddrive.CloudDriveClient(origin='http://localhost:19798', username='2339083510@qq.com', password='******', channel=<grpc._channel.Channel object at 0x105e9a850>, async_channel=Channel('localhost', 19798, ..., path=None)), path='/115', refresh=False), path='/115/电影')>,
   <clouddrive.CloudDrivePath(id='2614100250469596984', name='电视剧', fullPathName='/115/电视剧', createTime='2023-04-16T10:30:33Z', writeTime='2023-12-23T14:26:17Z', accessTime='2023-12-23T14:26:17Z', CloudAPI={'name': '115', 'userName': '306576686', 'nickName': '306576686'}, isDirectory=True, isCloudDirectory=True, canSearch=True, hasDetailProperties=True, canOfflineDownload=True, lastest_update=datetime.datetime(2023, 12, 29, 13, 15, 21, 23281), fs=clouddrive.CloudDriveFileSystem(client=clouddrive.CloudDriveClient(origin='http://localhost:19798', username='2339083510@qq.com', password='******', channel=<grpc._channel.Channel object at 0x105e9a850>, async_channel=Channel('localhost', 19798, ..., path=None)), path='/115', refresh=False), path='/115/电视剧')>,
   <clouddrive.CloudDrivePath(id='2576930424647319247', name='纪录片', fullPathName='/115/纪录片', createTime='2023-02-24T03:40:45Z', writeTime='2023-12-18T10:49:29Z', accessTime='2023-12-18T10:49:29Z', CloudAPI={'name': '115', 'userName': '306576686', 'nickName': '306576686'}, isDirectory=True, isCloudDirectory=True, canSearch=True, hasDetailProperties=True, canOfflineDownload=True, lastest_update=datetime.datetime(2023, 12, 29, 13, 15, 21, 23281), fs=clouddrive.CloudDriveFileSystem(client=clouddrive.CloudDriveClient(origin='http://localhost:19798', username='2339083510@qq.com', password='******', channel=<grpc._channel.Channel object at 0x105e9a850>, async_channel=Channel('localhost', 19798, ..., path=None)), path='/115', refresh=False), path='/115/纪录片')>,
   <clouddrive.CloudDrivePath(id='2580131407544188592', name='👾0号：重要资源', fullPathName='/115/👾0号：重要资源', createTime='2023-02-28T13:40:32Z', writeTime='2023-12-14T06:54:20Z', accessTime='2023-12-14T06:54:20Z', CloudAPI={'name': '115', 'userName': '306576686', 'nickName': '306576686'}, isDirectory=True, isCloudDirectory=True, canSearch=True, hasDetailProperties=True, canOfflineDownload=True, lastest_update=datetime.datetime(2023, 12, 29, 13, 15, 21, 23281), fs=clouddrive.CloudDriveFileSystem(client=clouddrive.CloudDriveClient(origin='http://localhost:19798', username='2339083510@qq.com', password='******', channel=<grpc._channel.Channel object at 0x105e9a850>, async_channel=Channel('localhost', 19798, ..., path=None)), path='/115', refresh=False), path='/115/👾0号：重要资源')>,
   <clouddrive.CloudDrivePath(id='2580246506904748007', name='📚1号：书籍大礼包', fullPathName='/115/📚1号：书籍大礼包', createTime='2023-02-28T17:29:12Z', writeTime='2023-12-14T06:54:20Z', accessTime='2023-12-14T06:54:20Z', CloudAPI={'name': '115', 'userName': '306576686', 'nickName': '306576686'}, isDirectory=True, isCloudDirectory=True, canSearch=True, hasDetailProperties=True, canOfflineDownload=True, lastest_update=datetime.datetime(2023, 12, 29, 13, 15, 21, 23281), fs=clouddrive.CloudDriveFileSystem(client=clouddrive.CloudDriveClient(origin='http://localhost:19798', username='2339083510@qq.com', password='******', channel=<grpc._channel.Channel object at 0x105e9a850>, async_channel=Channel('localhost', 19798, ..., path=None)), path='/115', refresh=False), path='/115/📚1号：书籍大礼包')>,
   <clouddrive.CloudDrivePath(id='2673432528538303699', name='📼资料备份', fullPathName='/115/📼资料备份', createTime='2023-07-07T07:13:12Z', writeTime='2023-12-14T06:54:20Z', accessTime='2023-12-14T06:54:20Z', CloudAPI={'name': '115', 'userName': '306576686', 'nickName': '306576686'}, isDirectory=True, isCloudDirectory=True, canSearch=True, hasDetailProperties=True, canOfflineDownload=True, lastest_update=datetime.datetime(2023, 12, 29, 13, 15, 21, 23281), fs=clouddrive.CloudDriveFileSystem(client=clouddrive.CloudDriveClient(origin='http://localhost:19798', username='2339083510@qq.com', password='******', channel=<grpc._channel.Channel object at 0x105e9a850>, async_channel=Channel('localhost', 19798, ..., path=None)), path='/115', refresh=False), path='/115/📼资料备份')>]
  ```

  **再次使用** <kbd>chdir</kbd> **，进入一些目录**

  ```python
  >>> fs.chdir("电视剧/欧美剧/A")
  >>> fs.getcwd()
  '/115/电视剧/欧美剧/A'
  >>> fs.listdir()
  ['A《爱、死亡和机器人》(Love.Death.and.Robot)[tt9561862]']
  >>> fs.chdir("A《爱、死亡和机器人》(Love.Death.and.Robot)[tt9561862]/爱、死亡和机器人S01.Love.Death.and.Robots.1080p.NF.WEB-DL.DDP5.1.x264-NTG（18集）")
  >>> fs.listdir()
  ['Love.Death.and.Robots.S01E01.Sonnies.Edge.1080p.NF.WEB-DL.DDP5.1.x264-NTG.简体&英文.ass', 'Love.Death.and.Robots.S01E01.Sonnies.Edge.1080p.NF.WEB-DL.DDP5.1.x264-NTG.mkv']
  ```

  **使用** <kbd>attr</kbd> **方法，获取文件或文件夹的属性**

  ```python
  >>> fs.attr("Love.Death.and.Robots.S01E01.Sonnies.Edge.1080p.NF.WEB-DL.DDP5.1.x264-NTG.mkv")
  {'id': '2576931481393823441',
   'name': 'Love.Death.and.Robots.S01E01.Sonnies.Edge.1080p.NF.WEB-DL.DDP5.1.x264-NTG.mkv',
   'fullPathName': '/115/电视剧/欧美剧/A/A《爱、死亡和机器人》(Love.Death.and.Robot)[tt9561862]/爱、死亡和机器人S01.Love.Death.and.Robots.1080p.NF.WEB-DL.DDP5.1.x264-NTG（18集）/Love.Death.and.Robots.S01E01.Sonnies.Edge.1080p.NF.WEB-DL.DDP5.1.x264-NTG.mkv',
   'size': '924544482',
   'fileType': 'File',
   'createTime': '2023-02-24T03:42:51Z',
   'writeTime': '2023-02-24T03:42:51Z',
   'accessTime': '2023-02-24T03:42:51Z',
   'CloudAPI': {'name': '115', 'userName': '306576686', 'nickName': '306576686'},
   'isCloudFile': True,
   'hasDetailProperties': True,
   'canOfflineDownload': True,
   'fileHashes': {'2': '7F4121B68A4E467ABF30A84627E20A8978895A4E'},
   'path': '/115/电视剧/欧美剧/A/A《爱、死亡和机器人》(Love.Death.and.Robot)[tt9561862]/爱、死亡和机器人S01.Love.Death.and.Robots.1080p.NF.WEB-DL.DDP5.1.x264-NTG（18集）/Love.Death.and.Robots.S01E01.Sonnies.Edge.1080p.NF.WEB-DL.DDP5.1.x264-NTG.mkv',
   'lastest_update': datetime.datetime(2023, 12, 29, 13, 18, 27, 395024)}
  ```

  **使用** <kbd>stat</kbd> **方法，获取文件或文件夹的部分，参考** <kbd>os.stat</kbd>

  ```python
  >>> fs.stat("Love.Death.and.Robots.S01E01.Sonnies.Edge.1080p.NF.WEB-DL.DDP5.1.x264-NTG.mkv")
  os.stat_result(st_mode=33279, st_ino=0, st_dev=0, st_nlink=1, st_uid=0, st_gid=0, st_size=924544482, st_atime=1677210171.0, st_mtime=1677210171.0, st_ctime=1677210171.0)
  ```

  **使用** <kbd>open</kbd> **方法，打开一个文件（目前只支持读取，不支持写入），参考** <kbd>open</kbd>

  ```python
  >>> f = fs.open("Love.Death.and.Robots.S01E01.Sonnies.Edge.1080p.NF.WEB-DL.DDP5.1.x264-NTG.简体&英文.ass", encoding="UTF-16")
  >>> f
  <_io.TextIOWrapper name='Love.Death.and.Robots.S01E01.Sonnies.Edge.1080p.NF.WEB-DL.DDP5.1.x264-NTG.简体&英文.ass' encoding='UTF-16'>
  ```

  读取此文件的前 100 个字符

  ```python
  >>> f.read(100)
  '[Script Info]\n;SrtEdit 6.3.2012.1001\n;Copyright(C) 2005-2012 Yuan Weiguo\n\nTitle: YYeTs\nOriginal Scri'
  ```

  用完后请及时关闭文件（其实不主动关闭也可以，只要文件不被引用，就会自动关闭）

  ```python
  >>> f.close()
  ```

  **以二进制模式打开一个文件，此时** `mode="rb"`

  ```python
  >>> f = fs.open("Love.Death.and.Robots.S01E01.Sonnies.Edge.1080p.NF.WEB-DL.DDP5.1.x264-NTG.mkv", "rb")
  >>> f
  clouddrive.util.file.HTTPFileReader('http://localhost:19798/static/http/localhost:19798/False/%2F115%2F%E7%94%B5%E8%A7%86%E5%89%A7%2F%E6%AC%A7%E7%BE%8E%E5%89%A7%2FA%2FA%E3%80%8A%E7%88%B1%E3%80%81%E6%AD%BB%E4%BA%A1%E5%92%8C%E6%9C%BA%E5%99%A8%E4%BA%BA%E3%80%8B%28Love.Death.and.Robot%29%5Btt9561862%5D%2F%E7%88%B1%E3%80%81%E6%AD%BB%E4%BA%A1%E5%92%8C%E6%9C%BA%E5%99%A8%E4%BA%BAS01.Love.Death.and.Robots.1080p.NF.WEB-DL.DDP5.1.x264-NTG%EF%BC%8818%E9%9B%86%EF%BC%89%2FLove.Death.and.Robots.S01E01.Sonnies.Edge.1080p.NF.WEB-DL.DDP5.1.x264-NTG.mkv', urlopen=<function urlopen at 0x1069200e0>, headers=mappingproxy({'Accept-Encoding': 'identity'}))
  ```

  读取前 10 个字节

  ```python
  >>> f.read(10)
  b'\x1aE\xdf\xa3\xa3B\x86\x81\x01B'
  ```

  再读取 10 个字节

  ```python
  >>> f.read(10)
  b'\xf7\x81\x01B\xf2\x81\x04B\xf3\x81'
  ```

  当前文件偏移位置（从 0 开始计算）

  ```python
  >>> f.tell()
  20
  ```

  把读取位置重新变为文件开头

  ```python
  >>> f.seek(0)
  0
  >>> f.tell()
  0
  ```

  再次读取 20 字节，应该等于上面两次结果的拼接

  ```python
  >>> f.read(20)
  b'\x1aE\xdf\xa3\xa3B\x86\x81\x01B\xf7\x81\x01B\xf2\x81\x04B\xf3\x81'
  >>> f.tell()
  20
  ```

  **回到根目录，我们继续其它试验**

  ```python
  >>> fs.chdir("/")
  ```

  **使用** <kbd>walk</kbd> **方法，可以遍历一个目录，参考** <kbd>os.walk</kbd>

  ```python
  >>> next(fs.walk())
  ('/', ['115', '阿里云盘'], [])
  ```

  **使用** <kbd>walk_path</kbd> **方法，可以遍历一个目录时，获取** <kbd>clouddrive.CloudDrivePath</kbd> 对象

  ```python
  >>> next(fs.walk_path())
  ('/',
   [<clouddrive.CloudDrivePath(id='0', name='115', fullPathName='/115', createTime='2023-12-29T03:44:34.427131Z', writeTime='2023-12-29T03:44:34.427131Z', accessTime='2023-12-29T03:44:34.427131Z', CloudAPI={'name': '115', 'userName': '306576686', 'nickName': '306576686'}, isDirectory=True, isCloudRoot=True, isCloudDirectory=True, canSearch=True, hasDetailProperties=True, canOfflineDownload=True, fs=clouddrive.CloudDriveFileSystem(client=clouddrive.CloudDriveClient(origin='http://localhost:19798', username='2339083510@qq.com', password='******', channel=<grpc._channel.Channel object at 0x1064ee350>, async_channel=Channel('localhost', 19798, ..., path=None)), path='/', refresh=False), path='/115')>,
    <clouddrive.CloudDrivePath(id='58188691_root', name='阿里云盘Open', fullPathName='/阿里云盘Open', createTime='2023-12-29T03:44:34.952368Z', writeTime='2023-12-29T03:44:34.952368Z', accessTime='2023-12-29T03:44:34.952368Z', CloudAPI={'name': '阿里云盘Open', 'userName': '4d1769fb91ba4752ac417f77c1da8082', 'nickName': '请设置昵称？'}, isDirectory=True, isCloudRoot=True, isCloudDirectory=True, canSearch=True, canDeletePermanently=True, fs=clouddrive.CloudDriveFileSystem(client=clouddrive.CloudDriveClient(origin='http://localhost:19798', username='2339083510@qq.com', password='******', channel=<grpc._channel.Channel object at 0x1064ee350>, async_channel=Channel('localhost', 19798, ..., path=None)), path='/', refresh=False), path='/阿里云盘Open')>],
   [])
  ```

  **在根目录下不能创建文件，因此进入 `/115` 下，继续做实验**

  ```python
  >>> fs.chdir("/115")
  ```

  **使用** <kbd>mkdir</kbd> **方法，可以创建空文件夹，参考** <kbd>os.mkdir</kbd>

  ```python
  >>> fs.mkdir("test")
  '/115/test'
  ```

  <kbd>CloudDrive</kbd> 会对文件名进行一些转换，以确保即便在 <kbd>Windows</kbd> 上文件名也是有效的。一个比较彻底的办法是，名字中如果包含 `*?:/\<>|"`，会被转换成对应的全角字符 `＊？：／＼＜＞｜＂`，尾部如果有空白符号 <code> </code>(空格)`\r\n\t\v\f\xa0` 和 点号 `.` 会被移除。

  [^1]: 可以用下面 2 个帮助函数，来解释这一行为：
  ```python
  def normalize_name(
      s: str,
      /,
      _transtab = {c: c + 65248 for c in b'*?:/\\<>|"'},
  ) -> str:
      return s.translate(_transtab).rstrip(" \r\n\v\t\f\xa0.")

  def normalize_path(s: str, /) -> str:
      return "/"[:s.startswith("/")] + "/".join(filter(None, map(normalize_name, s.split("/"))))
  ```

  不妨创建一个名字很特殊的文件夹试一下

  ```python
  >>> fs.mkdir("*?:\\<>| \r\n\v\t\f\xa0.")
  '/115/＊？：《》｜'
  ```

  可以看到返回的名字中，半角转全角，且尾部空白符号和 `.` 都被移除了。

  ```python
  >>> fs.listdir()
  ['000阅读·乱七八糟',
   'libgen',
   'test',
   '云下载',
   '电影',
   '电视剧',
   '纪录片',
   '＊？：《》｜',
   '👾0号：重要资源',
   '📚1号：书籍大礼包',
   '📼资料备份']
  ```

  **使用** <kbd>rmdir</kbd> **方法，可以删除空文件夹，参考** <kbd>os.rmdir</kbd>

  ```python
  >>> fs.rmdir('test')
  >>> fs.rmdir('＊？：《》｜')
  >>> fs.listdir()
  ['000阅读·乱七八糟',
   'libgen',
   '云下载',
   '电影',
   '电视剧',
   '纪录片',
   '👾0号：重要资源',
   '📚1号：书籍大礼包',
   '📼资料备份']
  ```

  **使用** <kbd>makedirs</kbd> **方法，可以创建多级的空目录，参考** <kbd>os.makedirs</kbd>

  ```python
  >>> fs.makedirs("a/b/c/d", exist_ok=True)
  '/115/a/b/c/d'
  >>> fs.listdir()
  ['000阅读·乱七八糟',
   'a',
   'libgen',
   '云下载',
   '电影',
   '电视剧',
   '纪录片',
   '👾0号：重要资源',
   '📚1号：书籍大礼包',
   '📼资料备份']
  ```

  **使用** <kbd>removedirs</kbd> **方法，可以（自底向上地）删除多级的空目录，参考** <kbd>os.removedirs</kbd>

  ```python
  >>> fs.removedirs("a/b/c/d")
  >>> fs.listdir()
  ['000阅读·乱七八糟',
   'libgen',
   '云下载',
   '电影',
   '电视剧',
   '纪录片',
   '👾0号：重要资源',
   '📚1号：书籍大礼包',
   '📼资料备份']
  ```

  **使用** <kbd>upload</kbd> **方法上传文件（提示：文件只是上传到 <kbd>CloudDrive</kbd> 服务器上，至于 <kbd>CloudDrive</kbd> 什么时候上传完成，得等待）**

  ```python
  >>> from io import BytesIO
  >>> fs.upload(BytesIO(b"123"), "test.txt")
  '/115/test.txt'
  >>> fs.read_text("test.txt")
  '123'
  >>> fs.upload("file.py")
  '/115/file.py'
  >>> fs.listdir()
  ['000阅读·乱七八糟',
   'file.py',
   'libgen',
   'test.txt',
   '云下载',
   '电影',
   '电视剧',
   '纪录片',
   '👾0号：重要资源',
   '📚1号：书籍大礼包',
   '📼资料备份']
  ```

  **使用** <kbd>remove</kbd> **方法可以删除文件，参考** <kbd>os.remove</kbd>

  ```python
  >>> fs.remove("test.txt")
  >>> fs.remove("file.py")
  >>> fs.listdir()
  ['000阅读·乱七八糟',
   'libgen',
   '云下载',
   '电影',
   '电视剧',
   '纪录片',
   '👾0号：重要资源',
   '📚1号：书籍大礼包',
   '📼资料备份']
  ```

  **使用** <kbd>rmtree</kbd> **方法可以删除文件或文件夹，并且在删除文件夹时，也删除其中的文件和文件夹，参考** <kbd>shutil.rmtree</kbd>

  ```python
  >>> fs.makedirs("a/b/c/d")
  '/115/a/b/c/d'
  >>> fs.removedirs("a")
  Traceback (most recent call last):
      ...
  OSError: [Errno 66] directory not empty: '/115/a'
  >>> fs.rmtree("a")
  ```

  **使用** <kbd>rename</kbd> **方法可以对文件或文件夹进行改名或移动，参考** <kbd>os.rename</kbd>

  ```python
  >>> fs.touch("a")
  '/115/a'
  >>> fs.attr("a")
  {'id': '0/a',
   'name': 'a',
   'fullPathName': '/115/a',
   'fileType': 'File',
   'createTime': '2023-12-29T06:28:12.869507Z',
   'writeTime': '2023-12-29T06:28:12.869507Z',
   'accessTime': '2023-12-29T06:28:12.869507Z',
   'CloudAPI': {'name': '115', 'userName': '306576686', 'nickName': '306576686'},
   'isCloudFile': True,
   'hasDetailProperties': True,
   'canOfflineDownload': True,
   'path': '/115/a',
   'lastest_update': datetime.datetime(2023, 12, 29, 14, 28, 16, 470077)}
  >>> fs.rename('a', 'b')
  '/115/b'
  >>> fs.attr("b")
  {'id': '2800245724120349982',
   'name': 'b',
   'fullPathName': '/115/b',
   'fileType': 'File',
   'createTime': '2023-12-29T06:28:12.869507Z',
   'writeTime': '2023-12-29T06:28:12.869507Z',
   'accessTime': '2023-12-29T06:28:12.869507Z',
   'CloudAPI': {'name': '115', 'userName': '306576686', 'nickName': '306576686'},
   'isCloudFile': True,
   'hasDetailProperties': True,
   'canOfflineDownload': True,
   'fileHashes': {'2': 'da39a3ee5e6b4b0d3255bfef95601890afd80709'},
   'path': '/115/b',
   'lastest_update': datetime.datetime(2023, 12, 29, 14, 29, 18, 273151)}
  ```

  **说明**：由于目前，<kbd>CloudDrive</kbd> 只在创建空文件夹后返回名字，而在上传和改名后，并不返回名字，而我目前也并不完全确定 <kbd>CloudDrive</kbd> 对于文件名**规范化**的完整逻辑，因此就直接返回用户传入的名字（而不进行半角转全角、清理后缀等）。如果你的名字里面可能有特殊符号，或者你不放心，就自行进行二次处理，参考 [^1]

  **使用** <kbd>renames</kbd> **方法可以对文件或文件夹进行改名或移动，并且在移动后如果原来所在目录为空，则会删除那个目录，参考** <kbd>os.renames</kbd>

  **使用** <kbd>replace</kbd> **方法可以对文件或文件夹进行改名或移动，并且如果原始路径上是文件，目标路径上也存在一个文件，则会先把目标路径上的文件删除，参考** <kbd>os.replace</kbd>

  **使用** <kbd>move</kbd> **方法可以对文件或文件夹进行改名或移动，目标路径存在且是一个目录，则把文件移动到其中（但是目录中有同名的文件或文件夹，还是会报错），参考** <kbd>shutil.move</kbd>





  **第 1 种方法，使用** <kbd>iter</kbd>，返回 <kbd>clouddrive.CloudDrivePath</kbd> 对象的迭代器

  ```python
  for path in fs.iter(max_depth=-1):
      if path.name.endswith(".mkv"):
          print(path.url)
  ```

  **第 2 种方法，使用** <kbd>glob</kbd>，参考 <kbd>pathlib.Path.glob</kbd> 和 <kbd>glob.iglob</kbd>，使用通配符查找

  ```python
  for path in fs.glob("**/*.mkv"):
      print(path.url)
  ```

  **第 3 种方法，使用** <kbd>rglob</kbd>，参考 <kbd>pathlib.Path.rglob</kbd>

  ```python
  for path in fs.rglob("*.mkv"):
      print(path.url)
  ```



  <kbd>CloudDrive</kbd> 目前支持 `2` 种类型的任务，我分别进行了封装，大部分方法都支持异步调用 (`async_=True`)

  - <kbd>clouddrive.CloudDriveDownloadTaskList</kbd> 封装了 `下载` 的任务列表。
  - <kbd>clouddrive.CloudDriveUploadTaskList</kbd> 封装了 `上传` 的任务列表。

  ```python
  from clouddrive import CloudDriveClient

  client = CloudDriveClient("http://localhost:19798", "test", "test@test")


  download_tasklist = client.download_tasklist
  upload_tasklist = client.upload_tasklist




  from clouddrive import CloudDriveDownloadTaskList
  download_tasklist = CloudDriveDownloadTaskList(client)


  from clouddrive import CloudDriveUploadTaskList
  upload_tasklist = CloudDriveUploadTaskList(client)
  ```



  > 正在编写中


pkgId: c2ffcc0406973fc11e9c60c161d8962ccfc337eb8acaa32511349cc26ac7bc0a
name: python-cloudendure
arch: src
version: 0.3.5
epoch: 0
release: 1
summary: Python wrapper and CLI for CloudEndure
url: https://2ndwatch.github.io/cloudendure-python/
rpm_license: MIT License
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudendure-0.3.5-1.src.rpm
checksum_type: sha256
description:
  Python wrapper and CLI for [CloudEndure](https://www.cloudendure.com/)

  [![PyPI](https://img.shields.io/pypi/v/cloudendure) ![PyPI - Python Version](https://img.shields.io/pypi/pyversions/cloudendure)](https://pypi.org/project/cloudendure/) [![PyPi Publish](https://github.com/2ndWatch/cloudendure-python/workflows/PyPi%20Publish/badge.svg)](https://2ndwatch.github.io/cloudendure-python/) [![Documenation](https://github.com/2ndWatch/cloudendure-python/workflows/Github%20Pages/badge.svg)](https://2ndwatch.github.io/cloudendure-python/)



  [Python 3.7+](https://www.python.org/downloads/)





  ```sh
  pip install cloudendure
  cloudendure version
  ```



  ```sh
  brew install poetry # if not installed
  poetry install
  ```



  ```sh
  docker run --rm -it cloudendurepy/cloudendure bash
  ```



  Then import the package:

  ```python
  import cloudendure
  ```


  CloudEndure Pipeline Flow
  ![CloudEndure Pipeline Flow](images/ce_migration_pipeline.png)

  CloudEndure Data Flow
  ![CloudEndure Data Flow](images/ce_dataflow.png)

  Pipeline Flow (as seen in AWS Console)
  ![Pipeline_Flow](images/stepfunctions_graph.svg)



  Please note: `cloudendure` and `ce` can be used interchangeably

  ```sh
  export CLOUDENDURE_USERNAME=<your_ce_user>
  export CLOUDENDURE_PASSWORD=<your_ce_password>
  export CLOUDENDURE_DESTINATION_ACCOUNT=<destination_aws_account_id>

  cloudendure api login
  ```

  or

  ```sh
  export CLOUDENDURE_USER_API_TOKEN=<your_ce_user_api_token>
  export CLOUDENDURE_DESTINATION_ACCOUNT=<destination_aws_account_id>

  ce api login
  ```



  Please note: `cloudendure` and `ce` can be used interchangeably

  ```sh
  cloudendure api login --user=<your_ce_user> --password=<your_ce_password>
  ```

  or

  ```sh
  ce api login --token=<your_ce_user_api_token>
  ```

  Logging in for the first time will generate the `~/.cloudendure.yml` file.



  This project is currently a work in progress and will actively change. This client has not yet been finalized and is entirely subject to change.



  Check out the [CHANGELOG](CHANGELOG.md)


pkgId: 39e7f185ac3a6d368d8eb2fdb2af1fbb57ebb9be465bb31c51bb61750af8ff82
name: python-cloudevents
arch: src
version: 1.11.0
epoch: 0
release: 1
summary: CloudEvents Python SDK
url: https://github.com/cloudevents/sdk-python
rpm_license: https://www.apache.org/licenses/LICENSE-2.0
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudevents-1.11.0-1.src.rpm
checksum_type: sha256
description:
  [![PyPI version](https://badge.fury.io/py/cloudevents.svg)](https://badge.fury.io/py/cloudevents)



  This SDK is still considered a work in progress, therefore things might (and
  will) break with every update.

  This SDK current supports the following versions of CloudEvents:

  - v1.0
  - v0.3



  Package **cloudevents** provides primitives to work with CloudEvents specification:
  https://github.com/cloudevents/spec.



  The CloudEvents SDK can be installed with pip:

  ```
  pip install cloudevents
  ```



  Below we will provide samples on how to send cloudevents using the popular
  [`requests`](http://docs.python-requests.org) library.



  ```python
  from cloudevents.http import CloudEvent
  from cloudevents.conversion import to_binary
  import requests



  attributes = {
      "type": "com.example.sampletype1",
      "source": "https://example.com/event-producer",
  }
  data = {"message": "Hello World!"}
  event = CloudEvent(attributes, data)


  headers, body = to_binary(event)


  requests.post("<some-url>", data=body, headers=headers)
  ```



  ```python
  from cloudevents.conversion import to_structured
  from cloudevents.http import CloudEvent
  import requests



  attributes = {
      "type": "com.example.sampletype2",
      "source": "https://example.com/event-producer",
  }
  data = {"message": "Hello World!"}
  event = CloudEvent(attributes, data)


  headers, body = to_structured(event)


  requests.post("<some-url>", data=body, headers=headers)
  ```

  You can find a complete example of turning a CloudEvent into a HTTP request
  [in the samples' directory](samples/http-json-cloudevents/client.py).



  The code below shows how to consume a cloudevent using the popular python web framework
  [flask](https://flask.palletsprojects.com/en/2.2.x/quickstart/):

  ```python
  from flask import Flask, request

  from cloudevents.http import from_http

  app = Flask(__name__)



  @app.route("/", methods=["POST"])
  def home():
      
      event = from_http(request.headers, request.get_data())

      
      print(
          f"Found {event['id']} from {event['source']} with type "
          f"{event['type']} and specversion {event['specversion']}"
      )

      return "", 204


  if __name__ == "__main__":
      app.run(port=3000)
  ```

  You can find a complete example of turning a CloudEvent into a HTTP request
  [in the samples' directory](samples/http-json-cloudevents/json_sample_server.py).



  The goal of this package is to provide support for all released versions of CloudEvents,
  ideally while maintaining the same API. It will use semantic versioning
  with following rules:

  - MAJOR version increments when backwards incompatible changes is introduced.
  - MINOR version increments when backwards compatible feature is introduced
    INCLUDING support for new CloudEvents version.
  - PATCH version increments when a backwards compatible bug fix is introduced.



  - There are bi-weekly calls immediately following the [Serverless/CloudEvents
    call](https://github.com/cloudevents/spec#meeting-time) at
    9am PT (US Pacific). Which means they will typically start at 10am PT, but
    if the other call ends early then the SDK call will start early as well.
    See the [CloudEvents meeting minutes](https://docs.google.com/document/d/1OVF68rpuPK5shIHILK9JOqlZBbfe91RNzQ7u_P7YCDE/edit#)
    to determine which week will have the call.
  - Slack: #cloudeventssdk channel under
    [CNCF's Slack workspace](https://slack.cncf.io/).
  - Email: https://lists.cncf.io/g/cncf-cloudevents-sdk
  - Contact for additional information: Denis Makogon (`@denysmakogon` on slack).

  Each SDK may have its own unique processes, tooling and guidelines, common
  governance related material can be found in the
  [CloudEvents `docs`](https://github.com/cloudevents/spec/tree/main/docs)
  directory. In particular, in there you will find information concerning
  how SDK projects are
  [managed](https://github.com/cloudevents/spec/blob/main/docs/GOVERNANCE.md),
  [guidelines](https://github.com/cloudevents/spec/blob/main/docs/SDK-maintainer-guidelines.md)
  for how PR reviews and approval, and our
  [Code of Conduct](https://github.com/cloudevents/spec/blob/main/docs/GOVERNANCE.md#additional-information)
  information.

  If there is a security concern with one of the CloudEvents specifications, or
  with one of the project's SDKs, please send an email to
  [cncf-cloudevents-security@lists.cncf.io](mailto:cncf-cloudevents-security@lists.cncf.io).



  - [List of current active maintainers](MAINTAINERS.md)
  - [How to contribute to the project](CONTRIBUTING.md)
  - [SDK's License](LICENSE)
  - [SDK's Release process](RELEASING.md)



  We use [black][black] and [isort][isort] for autoformatting. We set up a [tox][tox]
  environment to reformat the codebase.

  e.g.

  ```bash
  pip install tox
  tox -e reformat
  ```

  For information on releasing version bumps see [RELEASING.md](RELEASING.md)

  [black]: https://black.readthedocs.io/
  [isort]: https://pycqa.github.io/isort/
  [tox]: https://tox.wiki/


pkgId: 384c94e028580f9baca6522be4bf879c5f6aad2236a358ae2267040aa824f309
name: python-cloudexplain
arch: src
version: 0.1.0rc3
epoch: 0
release: 1
summary: A package for explaining cloud-based solutions provided by cloudexplain GmbH.
url: https://www.cloudexplain.eu
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudexplain-0.1.0rc3-1.src.rpm
checksum_type: sha256
description:
  This is the open source cloudexplain package (or what it is going to be). This just uploads your current data to the azure account you are currently logged in via az.


  To install this for azure run:
  ```bash
  pip install cloudexplain[azure]
  ```
  In order to run it on azure you must have write rights on the `cloudexplainmodels` storage account on the resource group `cloudexplain` on your subscription and must be logged in via
  ```bash
  az login
  ```



  ```python
  import shap
  import sklearn
  import cloudexplain

  X, y = shap.datasets.adult(n_points=100)
  X["adult_id"] = list(range(len(X)))
  dtc = sklearn.tree.DecisionTreeClassifier()
  dtc.fit(X, y)


  with cloudexplain.azure.explain(dtc,
                                  X,
                                  y,
                                  model_version="0.0.1",
                                  model_description="This is a new model.",
                                  resource_group_name="mycomp-cloudexplain-tf",
                                  explanation_name="dummy_name",
                                  explanation_env="dev",
                                  data_source="shap_adult_dataset",
                                  observation_id_column="adult_id") as run:
      print("This is the run uuid", run.run_uuid)
      pred = dtc.predict(X)
  ```



  When logged in with multiple accounts it can be the case that the permissions are not handled correctly. Signing out of all users
  except for the one who has the correct rights helps.
  ```bash
  az logout
  ```

rpm_license:
  MIT License  Copyright (c) 2024 cloudexplain GmbH  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


pkgId: 053a25664329fba002e3edaf70aa4f9735c4751abfb479a1ccce40286eb9160d
name: python-cloudflare
arch: src
version: 3.1.0
epoch: 0
release: 1
summary: The official Python library for the cloudflare API
url: https://github.com/cloudflare/cloudflare-python
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudflare-3.1.0-1.src.rpm
checksum_type: sha256
description:
  [![PyPI version](https://img.shields.io/pypi/v/cloudflare.svg)](https://pypi.org/project/cloudflare/)

  The Cloudflare Python library provides convenient access to the Cloudflare REST API from any Python 3.7+
  application. The library includes type definitions for all request params and response fields,
  and offers both synchronous and asynchronous clients powered by [httpx](https://github.com/encode/httpx).



  The REST API documentation can be found on [developers.cloudflare.com](https://developers.cloudflare.com/api). The full API of this library can be found in [api.md](https://github.com/cloudflare/cloudflare-python/tree/main/api.md).



  ```sh

  pip install cloudflare
  ```



  The full API of this library can be found in [api.md](https://github.com/cloudflare/cloudflare-python/tree/main/api.md).

  ```python
  import os
  from cloudflare import Cloudflare

  client = Cloudflare(
      
      api_email=os.environ.get("CLOUDFLARE_EMAIL"),
      
      api_key=os.environ.get("CLOUDFLARE_API_KEY"),
  )

  zone = client.zones.create(
      account={"id": "023e105f4ecef8ad9ca31a8372d0c353"},
      name="example.com",
      type="full",
  )
  print(zone.id)
  ```

  While you can provide a `api_email` keyword argument,
  we recommend using [python-dotenv](https://pypi.org/project/python-dotenv/)
  to add `CLOUDFLARE_EMAIL="user@example.com"` to your `.env` file
  so that your API Email is not stored in source control.



  Simply import `AsyncCloudflare` instead of `Cloudflare` and use `await` with each API call:

  ```python
  import os
  import asyncio
  from cloudflare import AsyncCloudflare

  client = AsyncCloudflare(
      
      api_email=os.environ.get("CLOUDFLARE_EMAIL"),
      
      api_key=os.environ.get("CLOUDFLARE_API_KEY"),
  )


  async def main() -> None:
      zone = await client.zones.create(
          account={"id": "023e105f4ecef8ad9ca31a8372d0c353"},
          name="example.com",
          type="full",
      )
      print(zone.id)


  asyncio.run(main())
  ```

  Functionality between the synchronous and asynchronous clients is otherwise identical.



  Nested request parameters are [TypedDicts](https://docs.python.org/3/library/typing.html#typing.TypedDict). Responses are [Pydantic models](https://docs.pydantic.dev) which also provide helper methods for things like:

  - Serializing back into JSON, `model.to_json()`
  - Converting to a dictionary, `model.to_dict()`

  Typed requests and responses provide autocomplete and documentation within your editor. If you would like to see type errors in VS Code to help catch bugs earlier, set `python.analysis.typeCheckingMode` to `basic`.



  List methods in the Cloudflare API are paginated.

  This library provides auto-paginating iterators with each list response, so you do not have to request successive pages manually:

  ```python
  import cloudflare

  client = Cloudflare()

  all_accounts = []

  for account in client.accounts.list():
      
      all_accounts.append(account)
  print(all_accounts)
  ```

  Or, asynchronously:

  ```python
  import asyncio
  import cloudflare

  client = AsyncCloudflare()


  async def main() -> None:
      all_accounts = []
      
      async for account in client.accounts.list():
          all_accounts.append(account)
      print(all_accounts)


  asyncio.run(main())
  ```

  Alternatively, you can use the `.has_next_page()`, `.next_page_info()`, or `.get_next_page()` methods for more granular control working with pages:

  ```python
  first_page = await client.accounts.list()
  if first_page.has_next_page():
      print(f"will fetch next page using these details: {first_page.next_page_info()}")
      next_page = await first_page.get_next_page()
      print(f"number of items we just fetched: {len(next_page.result)}")


  ```

  Or just work directly with the returned data:

  ```python
  first_page = await client.accounts.list()
  for account in first_page.result:
      print(account)


  ```



  When the library is unable to connect to the API (for example, due to network connection problems or a timeout), a subclass of `cloudflare.APIConnectionError` is raised.

  When the API returns a non-success status code (that is, 4xx or 5xx
  response), a subclass of `cloudflare.APIStatusError` is raised, containing `status_code` and `response` properties.

  All errors inherit from `cloudflare.APIError`.

  ```python
  import cloudflare
  from cloudflare import Cloudflare

  client = Cloudflare()

  try:
      client.zones.get(
          zone_id="023e105f4ecef8ad9ca31a8372d0c353",
      )
  except cloudflare.APIConnectionError as e:
      print("The server could not be reached")
      print(e.__cause__)  # an underlying Exception, likely raised within httpx.
  except cloudflare.RateLimitError as e:
      print("A 429 status code was received; we should back off a bit.")
  except cloudflare.APIStatusError as e:
      print("Another non-200-range status code was received")
      print(e.status_code)
      print(e.response)
  ```

  Error codes are as followed:

  | Status Code | Error Type                 |
  | ----------- | -------------------------- |
  | 400         | `BadRequestError`          |
  | 401         | `AuthenticationError`      |
  | 403         | `PermissionDeniedError`    |
  | 404         | `NotFoundError`            |
  | 422         | `UnprocessableEntityError` |
  | 429         | `RateLimitError`           |
  | >=500       | `InternalServerError`      |
  | N/A         | `APIConnectionError`       |



  Certain errors are automatically retried 2 times by default, with a short exponential backoff.
  Connection errors (for example, due to a network connectivity problem), 408 Request Timeout, 409 Conflict,
  429 Rate Limit, and >=500 Internal errors are all retried by default.

  You can use the `max_retries` option to configure or disable retry settings:

  ```python
  from cloudflare import Cloudflare


  client = Cloudflare(
      
      max_retries=0,
  )


  client.with_options(max_retries=5).zones.get(
      zone_id="023e105f4ecef8ad9ca31a8372d0c353",
  )
  ```



  By default requests time out after 1 minute. You can configure this with a `timeout` option,
  which accepts a float or an [`httpx.Timeout`](https://www.python-httpx.org/advanced/#fine-tuning-the-configuration) object:

  ```python
  from cloudflare import Cloudflare


  client = Cloudflare(
      
      timeout=20.0,
  )


  client = Cloudflare(
      timeout=httpx.Timeout(60.0, read=5.0, write=10.0, connect=2.0),
  )


  client.with_options(timeout=5.0).zones.edit(
      zone_id="023e105f4ecef8ad9ca31a8372d0c353",
  )
  ```

  On timeout, an `APITimeoutError` is thrown.

  Note that requests that time out are [retried twice by default](https://github.com/cloudflare/cloudflare-python/tree/main/#retries).





  We use the standard library [`logging`](https://docs.python.org/3/library/logging.html) module.

  You can enable logging by setting the environment variable `CLOUDFLARE_LOG` to `debug`.

  ```shell
  $ export CLOUDFLARE_LOG=debug
  ```



  In an API response, a field may be explicitly `null`, or missing entirely; in either case, its value is `None` in this library. You can differentiate the two cases with `.model_fields_set`:

  ```py
  if response.my_field is None:
    if 'my_field' not in response.model_fields_set:
      print('Got json like {}, without a "my_field" key present at all.')
    else:
      print('Got json like {"my_field": null}.')
  ```



  The "raw" Response object can be accessed by prefixing `.with_raw_response.` to any HTTP method call, e.g.,

  ```py
  from cloudflare import Cloudflare

  client = Cloudflare()
  response = client.zones.with_raw_response.create(
      account={
          "id": "023e105f4ecef8ad9ca31a8372d0c353"
      },
      name="example.com",
      type="full",
  )
  print(response.headers.get('X-My-Header'))

  zone = response.parse()  # get the object that `zones.create()` would have returned
  print(zone.id)
  ```

  These methods return an [`APIResponse`](https://github.com/cloudflare/cloudflare-python/tree/main/src/cloudflare/_response.py) object.

  The async client returns an [`AsyncAPIResponse`](https://github.com/cloudflare/cloudflare-python/tree/main/src/cloudflare/_response.py) with the same structure, the only difference being `await`able methods for reading the response content.



  The above interface eagerly reads the full response body when you make the request, which may not always be what you want.

  To stream the response body, use `.with_streaming_response` instead, which requires a context manager and only reads the response body once you call `.read()`, `.text()`, `.json()`, `.iter_bytes()`, `.iter_text()`, `.iter_lines()` or `.parse()`. In the async client, these are async methods.

  ```python
  with client.zones.with_streaming_response.create(
      account={"id": "023e105f4ecef8ad9ca31a8372d0c353"},
      name="example.com",
      type="full",
  ) as response:
      print(response.headers.get("X-My-Header"))

      for line in response.iter_lines():
          print(line)
  ```

  The context manager is required so that the response will reliably be closed.



  This library is typed for convenient access to the documented API.

  If you need to access undocumented endpoints, params, or response properties, the library can still be used.



  To make requests to undocumented endpoints, you can make requests using `client.get`, `client.post`, and other
  http verbs. Options on the client will be respected (such as retries) will be respected when making this
  request.

  ```py
  import httpx

  response = client.post(
      "/foo",
      cast_to=httpx.Response,
      body={"my_param": True},
  )

  print(response.headers.get("x-foo"))
  ```



  If you want to explicitly send an extra param, you can do so with the `extra_query`, `extra_body`, and `extra_headers` request
  options.



  To access undocumented response properties, you can access the extra fields like `response.unknown_prop`. You
  can also get all the extra fields on the Pydantic model as a dict with
  [`response.model_extra`](https://docs.pydantic.dev/latest/api/base_model/#pydantic.BaseModel.model_extra).



  You can directly override the [httpx client](https://www.python-httpx.org/api/#client) to customize it for your use case, including:

  - Support for proxies
  - Custom transports
  - Additional [advanced](https://www.python-httpx.org/advanced/clients/) functionality

  ```python
  from cloudflare import Cloudflare, DefaultHttpxClient

  client = Cloudflare(
      
      base_url="http://my.test.server.example.com:8083",
      http_client=DefaultHttpxClient(
          proxies="http://my.test.proxy.example.com",
          transport=httpx.HTTPTransport(local_address="0.0.0.0"),
      ),
  )
  ```



  By default the library closes underlying HTTP connections whenever the client is [garbage collected](https://docs.python.org/3/reference/datamodel.html#object.__del__). You can manually close the client using the `.close()` method if desired, or with a context manager that closes when exiting.



  This package generally follows [SemVer](https://semver.org/spec/v2.0.0.html) conventions, though certain backwards-incompatible changes may be released as minor versions:

  1. Changes that only affect static types, without breaking runtime behavior.
  2. Changes to library internals which are technically public but not intended or documented for external use. _(Please open a GitHub issue to let us know if you are relying on such internals)_.
  3. Changes that we do not expect to impact the vast majority of users in practice.

  We take backwards-compatibility seriously and work hard to ensure you can rely on a smooth upgrade experience.

  We are keen for your feedback; please open an [issue](https://www.github.com/cloudflare/cloudflare-python/issues) with questions, bugs, or suggestions.



  Python 3.7 or higher.


pkgId: ff48743e92c4680a68e0cdd185ed322a10d4c49f6d4cfca4e08e01b507495ea7
name: python-cloudflare
arch: src
version: 3.1.1
epoch: 0
release: 1
summary: The official Python library for the cloudflare API
url: https://github.com/cloudflare/cloudflare-python
rpm_license: Apache-2.0
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudflare-3.1.1-1.src.rpm
checksum_type: sha256
description:
  [![PyPI version](https://img.shields.io/pypi/v/cloudflare.svg)](https://pypi.org/project/cloudflare/)

  The Cloudflare Python library provides convenient access to the Cloudflare REST API from any Python 3.7+
  application. The library includes type definitions for all request params and response fields,
  and offers both synchronous and asynchronous clients powered by [httpx](https://github.com/encode/httpx).



  The REST API documentation can be found on [developers.cloudflare.com](https://developers.cloudflare.com/api). The full API of this library can be found in [api.md](https://github.com/cloudflare/cloudflare-python/tree/main/api.md).



  ```sh

  pip install cloudflare
  ```



  The full API of this library can be found in [api.md](https://github.com/cloudflare/cloudflare-python/tree/main/api.md).

  ```python
  import os
  from cloudflare import Cloudflare

  client = Cloudflare(
      
      api_email=os.environ.get("CLOUDFLARE_EMAIL"),
      
      api_key=os.environ.get("CLOUDFLARE_API_KEY"),
  )

  zone = client.zones.create(
      account={"id": "023e105f4ecef8ad9ca31a8372d0c353"},
      name="example.com",
      type="full",
  )
  print(zone.id)
  ```

  While you can provide a `api_email` keyword argument,
  we recommend using [python-dotenv](https://pypi.org/project/python-dotenv/)
  to add `CLOUDFLARE_EMAIL="user@example.com"` to your `.env` file
  so that your API Email is not stored in source control.



  Simply import `AsyncCloudflare` instead of `Cloudflare` and use `await` with each API call:

  ```python
  import os
  import asyncio
  from cloudflare import AsyncCloudflare

  client = AsyncCloudflare(
      
      api_email=os.environ.get("CLOUDFLARE_EMAIL"),
      
      api_key=os.environ.get("CLOUDFLARE_API_KEY"),
  )


  async def main() -> None:
      zone = await client.zones.create(
          account={"id": "023e105f4ecef8ad9ca31a8372d0c353"},
          name="example.com",
          type="full",
      )
      print(zone.id)


  asyncio.run(main())
  ```

  Functionality between the synchronous and asynchronous clients is otherwise identical.



  Nested request parameters are [TypedDicts](https://docs.python.org/3/library/typing.html#typing.TypedDict). Responses are [Pydantic models](https://docs.pydantic.dev) which also provide helper methods for things like:

  - Serializing back into JSON, `model.to_json()`
  - Converting to a dictionary, `model.to_dict()`

  Typed requests and responses provide autocomplete and documentation within your editor. If you would like to see type errors in VS Code to help catch bugs earlier, set `python.analysis.typeCheckingMode` to `basic`.



  List methods in the Cloudflare API are paginated.

  This library provides auto-paginating iterators with each list response, so you do not have to request successive pages manually:

  ```python
  import cloudflare

  client = Cloudflare()

  all_accounts = []

  for account in client.accounts.list():
      
      all_accounts.append(account)
  print(all_accounts)
  ```

  Or, asynchronously:

  ```python
  import asyncio
  import cloudflare

  client = AsyncCloudflare()


  async def main() -> None:
      all_accounts = []
      
      async for account in client.accounts.list():
          all_accounts.append(account)
      print(all_accounts)


  asyncio.run(main())
  ```

  Alternatively, you can use the `.has_next_page()`, `.next_page_info()`, or `.get_next_page()` methods for more granular control working with pages:

  ```python
  first_page = await client.accounts.list()
  if first_page.has_next_page():
      print(f"will fetch next page using these details: {first_page.next_page_info()}")
      next_page = await first_page.get_next_page()
      print(f"number of items we just fetched: {len(next_page.result)}")


  ```

  Or just work directly with the returned data:

  ```python
  first_page = await client.accounts.list()
  for account in first_page.result:
      print(account)


  ```



  When the library is unable to connect to the API (for example, due to network connection problems or a timeout), a subclass of `cloudflare.APIConnectionError` is raised.

  When the API returns a non-success status code (that is, 4xx or 5xx
  response), a subclass of `cloudflare.APIStatusError` is raised, containing `status_code` and `response` properties.

  All errors inherit from `cloudflare.APIError`.

  ```python
  import cloudflare
  from cloudflare import Cloudflare

  client = Cloudflare()

  try:
      client.zones.get(
          zone_id="023e105f4ecef8ad9ca31a8372d0c353",
      )
  except cloudflare.APIConnectionError as e:
      print("The server could not be reached")
      print(e.__cause__)  # an underlying Exception, likely raised within httpx.
  except cloudflare.RateLimitError as e:
      print("A 429 status code was received; we should back off a bit.")
  except cloudflare.APIStatusError as e:
      print("Another non-200-range status code was received")
      print(e.status_code)
      print(e.response)
  ```

  Error codes are as followed:

  | Status Code | Error Type                 |
  | ----------- | -------------------------- |
  | 400         | `BadRequestError`          |
  | 401         | `AuthenticationError`      |
  | 403         | `PermissionDeniedError`    |
  | 404         | `NotFoundError`            |
  | 422         | `UnprocessableEntityError` |
  | 429         | `RateLimitError`           |
  | >=500       | `InternalServerError`      |
  | N/A         | `APIConnectionError`       |



  Certain errors are automatically retried 2 times by default, with a short exponential backoff.
  Connection errors (for example, due to a network connectivity problem), 408 Request Timeout, 409 Conflict,
  429 Rate Limit, and >=500 Internal errors are all retried by default.

  You can use the `max_retries` option to configure or disable retry settings:

  ```python
  from cloudflare import Cloudflare


  client = Cloudflare(
      
      max_retries=0,
  )


  client.with_options(max_retries=5).zones.get(
      zone_id="023e105f4ecef8ad9ca31a8372d0c353",
  )
  ```



  By default requests time out after 1 minute. You can configure this with a `timeout` option,
  which accepts a float or an [`httpx.Timeout`](https://www.python-httpx.org/advanced/#fine-tuning-the-configuration) object:

  ```python
  from cloudflare import Cloudflare


  client = Cloudflare(
      
      timeout=20.0,
  )


  client = Cloudflare(
      timeout=httpx.Timeout(60.0, read=5.0, write=10.0, connect=2.0),
  )


  client.with_options(timeout=5.0).zones.edit(
      zone_id="023e105f4ecef8ad9ca31a8372d0c353",
  )
  ```

  On timeout, an `APITimeoutError` is thrown.

  Note that requests that time out are [retried twice by default](https://github.com/cloudflare/cloudflare-python/tree/main/#retries).





  We use the standard library [`logging`](https://docs.python.org/3/library/logging.html) module.

  You can enable logging by setting the environment variable `CLOUDFLARE_LOG` to `debug`.

  ```shell
  $ export CLOUDFLARE_LOG=debug
  ```



  In an API response, a field may be explicitly `null`, or missing entirely; in either case, its value is `None` in this library. You can differentiate the two cases with `.model_fields_set`:

  ```py
  if response.my_field is None:
    if 'my_field' not in response.model_fields_set:
      print('Got json like {}, without a "my_field" key present at all.')
    else:
      print('Got json like {"my_field": null}.')
  ```



  The "raw" Response object can be accessed by prefixing `.with_raw_response.` to any HTTP method call, e.g.,

  ```py
  from cloudflare import Cloudflare

  client = Cloudflare()
  response = client.zones.with_raw_response.create(
      account={
          "id": "023e105f4ecef8ad9ca31a8372d0c353"
      },
      name="example.com",
      type="full",
  )
  print(response.headers.get('X-My-Header'))

  zone = response.parse()  # get the object that `zones.create()` would have returned
  print(zone.id)
  ```

  These methods return an [`APIResponse`](https://github.com/cloudflare/cloudflare-python/tree/main/src/cloudflare/_response.py) object.

  The async client returns an [`AsyncAPIResponse`](https://github.com/cloudflare/cloudflare-python/tree/main/src/cloudflare/_response.py) with the same structure, the only difference being `await`able methods for reading the response content.



  The above interface eagerly reads the full response body when you make the request, which may not always be what you want.

  To stream the response body, use `.with_streaming_response` instead, which requires a context manager and only reads the response body once you call `.read()`, `.text()`, `.json()`, `.iter_bytes()`, `.iter_text()`, `.iter_lines()` or `.parse()`. In the async client, these are async methods.

  ```python
  with client.zones.with_streaming_response.create(
      account={"id": "023e105f4ecef8ad9ca31a8372d0c353"},
      name="example.com",
      type="full",
  ) as response:
      print(response.headers.get("X-My-Header"))

      for line in response.iter_lines():
          print(line)
  ```

  The context manager is required so that the response will reliably be closed.



  This library is typed for convenient access to the documented API.

  If you need to access undocumented endpoints, params, or response properties, the library can still be used.



  To make requests to undocumented endpoints, you can make requests using `client.get`, `client.post`, and other
  http verbs. Options on the client will be respected (such as retries) will be respected when making this
  request.

  ```py
  import httpx

  response = client.post(
      "/foo",
      cast_to=httpx.Response,
      body={"my_param": True},
  )

  print(response.headers.get("x-foo"))
  ```



  If you want to explicitly send an extra param, you can do so with the `extra_query`, `extra_body`, and `extra_headers` request
  options.



  To access undocumented response properties, you can access the extra fields like `response.unknown_prop`. You
  can also get all the extra fields on the Pydantic model as a dict with
  [`response.model_extra`](https://docs.pydantic.dev/latest/api/base_model/#pydantic.BaseModel.model_extra).



  You can directly override the [httpx client](https://www.python-httpx.org/api/#client) to customize it for your use case, including:

  - Support for proxies
  - Custom transports
  - Additional [advanced](https://www.python-httpx.org/advanced/clients/) functionality

  ```python
  from cloudflare import Cloudflare, DefaultHttpxClient

  client = Cloudflare(
      
      base_url="http://my.test.server.example.com:8083",
      http_client=DefaultHttpxClient(
          proxies="http://my.test.proxy.example.com",
          transport=httpx.HTTPTransport(local_address="0.0.0.0"),
      ),
  )
  ```



  By default the library closes underlying HTTP connections whenever the client is [garbage collected](https://docs.python.org/3/reference/datamodel.html#object.__del__). You can manually close the client using the `.close()` method if desired, or with a context manager that closes when exiting.



  This package generally follows [SemVer](https://semver.org/spec/v2.0.0.html) conventions, though certain backwards-incompatible changes may be released as minor versions:

  1. Changes that only affect static types, without breaking runtime behavior.
  1. Changes to library internals which are technically public but not intended or documented for external use. _(Please open a GitHub issue to let us know if you are relying on such internals)_.
  1. Changes that we do not expect to impact the vast majority of users in practice.

  > [!WARNING]
  > In addition to the above, changes to type names, structure or methods _may_ occur as we stabilise the automated codegen pipeline. This will be removed in the future once we are further along and the service owner OpenAPI schemas have reached a higher maturity level where changes are not as constant.
  > If this isn't suitable for your project, we recommend pinning to a known version or using the previous major version.



  Python 3.7 or higher.


pkgId: e7efd45012465079db45d31e57f60a24112006d79a01f2bcb5519c6da7d54981
name: python-cloudflare-api
arch: src
version: 2.1.0
epoch: 0
release: 1
summary: Python client for the Cloudflare v4 API
url: https://github.com/nikhiljohn10/cloudflare-api
rpm_license: MIT
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudflare-api-2.1.0-1.src.rpm
checksum_type: sha256
description:
  <p align="center"><img src="https://raw.githubusercontent.com/nikhiljohn10/cloudflare-api/main/assets/images/logo.svg?sanitize=true" height="130"></p>

  [![Publish Package](https://github.com/nikhiljohn10/cloudflare-api/actions/workflows/publish.yml/badge.svg)](https://github.com/nikhiljohn10/cloudflare-api/actions/workflows/publish.yml) [![PyPI - Status](https://img.shields.io/pypi/status/cloudflare-api)](https://pypi.org/project/cloudflare-api) [![GitHub release (latest by date)](https://img.shields.io/github/v/release/nikhiljohn10/cloudflare-api)](https://github.com/nikhiljohn10/cloudflare-api/releases) [![PyPI](https://img.shields.io/pypi/v/cloudflare-api)](https://pypi.org/project/cloudflare-api) [![CodeFactor](https://www.codefactor.io/repository/github/nikhiljohn10/cloudflare-api/badge)](https://www.codefactor.io/repository/github/nikhiljohn10/cloudflare-api) [![GitHub license](https://img.shields.io/github/license/nikhiljohn10/cloudflare-api)](https://github.com/nikhiljohn10/cloudflare-api/blob/main/LICENSE)

  Python client for Cloudflare API v4

  > Require Python 3.9+





  ```bash
  pip install cloudflare-api
  ```

  Sample code can be found inside [/test.py](https://github.com/nikhiljohn10/cloudflare-api/blob/main/test.py)



  ```bash
  git clone https://github.com/nikhiljohn10/cloudflare-api
  cd cloudflare-api
  ```


  1. Go to [Dashboard](https://dash.cloudflare.com/profile/api-tokens)
  2. Create Token
  3. Use `Edit Cloudflare Workers` template
  4. Select one account from **Account Resources**
  5. Select `All Zones` or specific zones under **Zone Resources**
  6. Continue to summary
  7. Create Token
  8. Copy the token and save it somewhere secret & secure.

  Then run the following command in terminal:
  ```bash
  make init
  . venv/bin/activate
  make test
  ```

  If it is running for first time, you will be asked to enter API Token. Paste the api token copied from Dashboard.



  For this example, `poetry` is used for easy setup.
  ```bash
  python3 -m pip install --user poetry
  mkdir -p myapp && cd myapp
  poetry init -n
  poetry add cloudflare-api
  ```

  Copy the code below in to a new file `./myapp/app.py`.
  ```python


  from CloudflareAPI import Cloudflare

  def main():
    cf = Cloudflare()

    print(cf.account.list())
    print(cf.user.details())
    print(cf.worker.list())
    print(cf.store.list())

  if __name__ == "__main__":
      main()
  ```

  You can now run the program using following command:
  ```bash
  poetry run python app.py
  ```

  If it is running for first time, you will be asked to enter API Token. Paste the api token copied from Dashboard. This will create `cf-config.ini` file in your current working directory for future reference of the api token.

  You can find more examples in [`examples`](https://github.com/nikhiljohn10/cloudflare-api/tree/main/examples) directory



  **1. Account**
     - Workers Tail ( Read )
     - Workers KV Storage ( Edit )
     - Workers Scripts ( Edit )
     - Account Settings ( Read )

  **2. Zones**
     - Workers Routes ( Edit )

  **3. Users**
     - User Details ( Read )





  - `list` - List all accounts where given token have access
  - `get_id` - Return account id if only one account exists. Otherwise display all accounts availabe and exit.
  - `details` - Display details of an account
  - `rename`__*__ - Rename an existing account

    

    



  - `details` - Display details of the account's user

    



  - `list` - List all existing workers
  - `upload` - Upload a new worker with binding if given
    - Upload file along as javascript
    - Upload file along with metadata as multipart form-data
      - KV Bindings
      - Environment variables
      - Secrets
  - `download` - Download an existing worker
  - `deploy` - Deploy an existing worker using the subdomain
  - `undeploy` - Undeploy an existing worker
  - `delete` - Delete an existing worker

    

    - `create` - Create a new subdomain if none exists
    - `get` - Get the current subdomain from cloudflare account

    

    - `update` - Update an existing cron or create new cron for a worker
    - `get` - Get the cron task list of specified worker



  - `list` - List all existing Namespaces
  - `get_ns` - Returns requested Namespace object
  - `create` - Create a new namespace
  - `rename` - Rename an existing namespace
  - `delete` - Delete an existing namespace

    

    - `keys` - Display all the keys in the Namespace
    - `read` - Read the value of given key in the Namespace
    - `write` - Write given key-value pair to the Namespace
    - `bulk_write` - Write given key-value pairs in bulk to the Namespace
    - `delete` - Delete given key from the Namespace
    - `bulk_delete` - Delete given keys in bulk from the Namespace

      

      

      

      - `add` - Add key-value pair with metadata to bundler

  **( * : Not accessable with default Worker permissions )**





  To display current version:
  ```
  make version
  ```

  To bump to new version, where x.y.z is major,minor & patch versions respectively:
  ```
  make VERSION=x.y.z bump
  ```

  The above command does the following:

  1. Update version in `__version__.py` inside package
  2. Create a commit for the above change
  3. Tag the commit with VERSION
  4. Push the content in to main branch with tags
  5. Python publish workflow action activates
  6. Release the version pushed
  7. Build python package
  8. Publish python package in to pypi.org


pkgId: 65b568fd06df3761950a56f29b5656576fa669349eba0c6b2574b15e69f4323c
name: python-cloudformation-cli
arch: src
version: 0.2.38
epoch: 0
release: 1
summary: please add a summary manually as the author left a blank one
url: https://github.com/aws-cloudformation/aws-cloudformation-rpdk/
rpm_license: Apache License 2.0
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudformation-cli-0.2.38-1.src.rpm
checksum_type: sha256
description:
  [![CloudFormation CLI](https://github.com/aws-cloudformation/cloudformation-cli/actions/workflows/pr-ci.yaml/badge.svg?branch=master)](https://github.com/aws-cloudformation/cloudformation-cli/actions/workflows/pr-ci.yaml)



  The CloudFormation CLI (cfn) allows you to author your own resource providers, hooks, and modules that can be used by CloudFormation.





  Primary documentation for the CloudFormation CLI can be found at the [AWS Documentation](https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/what-is-cloudformation-cli.html) site.



  This tool can be installed using [pip](https://pypi.org/project/pip/) from the Python Package Index (PyPI). It requires Python 3. For resource and hook types, the tool requires at least one language plugin. Language plugins are not needed to create a module type. The language plugins are also available on PyPI and as such can be installed all at once:

  ```bash
  pip install cloudformation-cli cloudformation-cli-java-plugin cloudformation-cli-go-plugin cloudformation-cli-python-plugin cloudformation-cli-typescript-plugin
  ```




  To create a project in the current directory, use the `init` command. A wizard will guide you through the creation.

  ```bash
  cfn init
  ```



  To refresh auto-generated code, use the `generate` command. Usually, plugins try to integrate this command in the native build flow, so please consult a plugin's README to see if this is necessary.
  In a module project, this will regenerate the module schema.

  ```bash
  cfn generate
  ```



  To register a resource provider, module, or hook in your account, use the `submit` command.

  ```bash
  cfn submit
  cfn submit --dry-run #prepares schema handler package without submitting for registration
  cfn submit --set-default # if successfully registered, set submitted version to be the new default version
  ```



  This is to create a schema handler package without submitting equivalent to `cfn submit --dry-run`

  ```bash
  cfn package
  ```



  To run the contract tests for a resource type, use the `test` command.

  ```bash
  cfn test
  cfn test -- -k contract_delete_update # to run a single test
  cfn test -- --tb=long # exhaustive, informative traceback formatting
  cfn test --enforce-timeout 60  # Read/List handler timeout (Create/Update/Delete handler timeout is twice the Read/List handler timeout)
  cfn test --enforce-timeout 60 -- -k contract_delete_update # combine arguments
  cfn test --log-group-name cw_log_group --log-role-arn log_delivery_role_arn # Handler logs generated by contract tests will be delivered to the specified cw_log_group using the credentials from log_delivery_role_arn
  ```

  Note:
  * To use your type configuration in contract tests, you will need to save your type configuration json file in `~/.cfn-cli/typeConfiguration.json` or specify the file you would like to use
      * `--typeconfig ./myResourceTypeConfig.json`
      * `--typeconfig /test/myresource/config1.json`
      * `--typeconfig C:\MyResource\typeconf.json`

  * To use `propertyTransform` in schema, you will need to install [PYJQ](https://pypi.org/project/pyjq/). This feature will not be available to use with contract tests on Windows OS

  Install PYJQ for Linux system

  ```bash
  yum install autoconf automake libtool
  pip install pyjq
  ```

  Install PYJQ for macOS system

  ```bash
  brew install autoconf automake libtool
  brew install jq
  pip install pyjq
  ```

  Install PYJQ for Ubuntu system

  ```bash
  pip install pyjq
  ```



  To validate the schema, use the `validate` command.

  This command is automatically run whenever one attempts to submit a resource, module, or hook. Errors will prevent you from submitting your resource/module. Module fragments will additionally be validated via [`cfn-lint`](https://github.com/aws-cloudformation/cfn-python-lint/) (but resulting warnings will not cause this step to fail).

  ```bash
  cfn validate
  ```



  To build an image for a resource type. This image provides a minimalistic execution environment for the resource handler that does not depend on AWS Lambda in anyway. This image can be used during cfn invoke and cfn test instead of using sam cli.

  ```bash
  cfn build-image
  cfn build-image --image-name my-handler --executable target/myjar.jar
  ```

  The resulting image can be run in a container by executing the following command:

  ```
  docker run IMAGE_NAME HANDLER_ENTRYPOINT PAYLOAD
  docker run my-test-resource com.my.test.resource.ExecutableHandlerWrapper PAYLOAD_JSON # Example for a java based-project
  ```




  For developing, it's strongly suggested to install the development dependencies inside a virtual environment. (This isn't required if you just want to use this tool.)

  ```bash
  python3 -m venv env
  source env/bin/activate
  pip install -e . -r requirements.txt
  pre-commit install
  ```

  If you're creating a resource or hook type, you will also need to install a language plugin, such as [the Java language plugin](https://github.com/aws-cloudformation/cloudformation-cli-java-plugin), also via `pip install`. For example, assuming the plugin is checked out in the same parent directory as this repository:

  ```bash
  pip install -e ../cloudformation-cli-java-plugin
  ```

  ```bash

  pre-commit run --all-files

  pre-commit run pytest-local
  ```

  If you want to generate an HTML coverage report afterwards, run `coverage html`. The report is output to `htmlcov/index.html`.



  New language plugins can be independently developed. As long as they declare the appropriate entry point and are installed in the same environment, they can even be completely separate codebases. For example, a plugin for Groovy might have the following entry point:

  ```python
  entry_points={
      "rpdk.v1.languages": ["groovy = rpdk.groovy:GroovyLanguagePlugin"],
  },
  ```

  Plugins must provide the same interface as `LanguagePlugin` (in `plugin_base.py`). And they may inherit from `LanguagePlugin` for the helper methods - but this is not necessary. As long as the class has the same methods, it will work as a plugin.




  | Language | Status            | Github                                                                                                      | PyPI                                                                                       |
  | -------- | ----------------- | ----------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
  | Java      | Available         | [cloudformation-cli-java-plugin](https://github.com/aws-cloudformation/cloudformation-cli-java-plugin/)     | [cloudformation-cli-java-plugin](https://pypi.org/project/cloudformation-cli-java-plugin/)     |
  | Go        | Available         | [cloudformation-cli-go-plugin](https://github.com/aws-cloudformation/cloudformation-cli-go-plugin/)         | [cloudformation-cli-go-plugin](https://pypi.org/project/cloudformation-cli-go-plugin/)         |
  | Python    | Available         | [cloudformation-cli-python-plugin](https://github.com/aws-cloudformation/cloudformation-cli-python-plugin/) | [cloudformation-cli-python-plugin](https://pypi.org/project/cloudformation-cli-python-plugin/) |
  | TypeScript| Available         | [cloudformation-cli-typescript-plugin](https://github.com/aws-cloudformation/cloudformation-cli-typescript-plugin/) | [cloudformation-cli-typescript-plugin](https://pypi.org/project/cloudformation-cli-typescript-plugin/) |


  | Language | Status            | Github                                                                                                      | PyPI                                                                                       |
  | -------- | ----------------- | ----------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
  | Java      | Available         | [cloudformation-cli-java-plugin](https://github.com/aws-cloudformation/cloudformation-cli-java-plugin/)     | [cloudformation-cli-java-plugin](https://pypi.org/project/cloudformation-cli-java-plugin/)     |
  | Python    | Available         | [cloudformation-cli-python-plugin](https://github.com/aws-cloudformation/cloudformation-cli-python-plugin/) | [cloudformation-cli-python-plugin](https://pypi.org/project/cloudformation-cli-python-plugin/) |



  This library is licensed under the Apache 2.0 License.



  Join us on Discord! Connect & interact with CloudFormation developers &
  experts, find channels to discuss and get help for our CLI, cfn-lint, CloudFormation registry, StackSets,
  Guard and more:

  [![Join our Discord](https://discordapp.com/api/guilds/981586120448020580/widget.png?style=banner3)](https://discord.gg/9zpd7TTRwq)


pkgId: acacfbe46b21841be056270b8456fb153be257a9fb9f774a811911ffe1e4953a
name: python-cloudformation-cli-go-plugin
arch: src
version: 2.2.0
epoch: 0
release: 1
summary: please add a summary manually as the author left a blank one
url: https://github.com/aws-cloudformation/cloudformation-cli-go-plugin/
rpm_license: Apache License 2.0
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudformation-cli-go-plugin-2.2.0-1.src.rpm
checksum_type: sha256
description:
  If you are using this package to build resource providers for CloudFormation, install the [CloudFormation CLI Go Plugin](https://github.com/aws-cloudformation/cloudformation-cli-go-plugin) - this will automatically install the the [CloudFormation CLI](https://github.com/aws-cloudformation/cloudformation-cli)! A Python virtual environment is recommended.
  ```bash
  pip3 install cloudformation-cli-go-plugin
  ```
  Refer to the documentation for the [CloudFormation CLI](https://github.com/aws-cloudformation/cloudformation-cli) for usage instructions.


pkgId: 6f43d543bb20a0649fbcd195ebf112956861191611fd732aed284f57b87f63a8
name: python-cloudformation-cli-java-plugin
arch: src
version: 2.1.1
epoch: 0
release: 1
summary: please add a summary manually as the author left a blank one
url: https://github.com/aws-cloudformation/aws-cloudformation-rpdk-java-plugin/
rpm_license: Apache License 2.0
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudformation-cli-java-plugin-2.1.1-1.src.rpm
checksum_type: sha256
description:
  If you are using this package to build resource providers for CloudFormation, install the [CloudFormation CLI Java Plugin](https://github.com/aws-cloudformation/cloudformation-cli-java-plugin) - this will automatically install the the [CloudFormation CLI](https://github.com/aws-cloudformation/cloudformation-cli)! A Python virtual environment is recommended.
  **Prerequisites**
   - Python version 3.8 or above
   - Your choice of Java IDE
   - Lombok: The code generated by the CloudFormation CLI uses [Lombok](https://projectlombok.org/), which requires support in IDEs for some syntax highlighting to work. For the best development experience, it is recommended you install Lombok support in your IDE.
  **Installation**
  ```shell
  pip3 install cloudformation-cli-java-plugin
  ```
  Refer to the [CloudFormation CLI User Guide](https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/resource-types.html) for the [CloudFormation CLI](https://github.com/aws-cloudformation/cloudformation-cli) for usage instructions.

  The `format` keyword can be specified on primitive types defined in a resource provider's schema to allow the CloudFormation CLI Java Plugin to generate more than the defaults for primitive types. Consult the table below for what formats are available and defaults for various types. The `default` value is used if omitted:
  | JSON Schema Type | Format value | Generated variable type  |
  | ---- | ----------- | ---------------------- |
  | boolean | `default` | [Boolean](https://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html)|
  | integer | `default`, `int32` | [Integer](https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html)|
  | integer | `int64` | [Long](https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html)|
  | number | `default` | [Double](https://docs.oracle.com/javase/8/docs/api/java/lang/Double.html)|
  | string | `default` | [String](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html)|
  For example, the below schema for a property would generate a variable of type `Long`.
  ```
  {
      "type": "integer",
      "format": "int64"
  }
  ```


pkgId: a9aaa9b8fa62e5a784341b013100eb10a038c7128902aa42b6629bc237069ec5
name: python-cloudformation-cli-typescript-plugin
arch: src
version: 1.0.2
epoch: 0
release: 1
summary: Typescript language support for the CloudFormation CLI
url: https://github.com/aws-cloudformation/cloudformation-cli-typescript-plugin
rpm_license: Apache License 2.0
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudformation-cli-typescript-plugin-1.0.2-1.src.rpm
checksum_type: sha256
description:
  If you are using this package to build resource providers for CloudFormation, install the [CloudFormation CLI TypeScript Plugin](https://github.com/aws-cloudformation/cloudformation-cli-typescript-plugin) - this will automatically install the [CloudFormation CLI](https://github.com/aws-cloudformation/cloudformation-cli)! A Python virtual environment is recommended.
  **Prerequisites**
  - Python version 3.6 or above
  - [SAM CLI](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html)
  - Your choice of TypeScript IDE
  **Installation**
  ```shell
  pip3 install cloudformation-cli-typescript-plugin
  ```
  Refer to the [CloudFormation CLI User Guide](https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/resource-types.html) for the [CloudFormation CLI](https://github.com/aws-cloudformation/cloudformation-cli) for usage instructions.
  **Howto**
  Example run:
  ```
  $ cfn init
  Initializing new project
  What's the name of your resource type?
  (Organization::Service::Resource)
  >> Foo::Bar::Baz
  Select a language for code generation:
  [1] java
  [2] typescript
  (enter an integer):
  >> 2
  Use docker for platform-independent packaging (Y/n)?
  This is highly recommended unless you are experienced
  with cross-platform Typescript packaging.
  >> y
  Initialized a new project in <>
  $ cfn submit --dry-run
  $ sam local invoke --event sam-tests/create.json TestEntrypoint
  ```


pkgId: 95ce37ed6c0e361944dd240604b4995a73b331e6df76daee812e797ddfaf5297
name: python-cloudgeass
arch: src
version: 2.0.1
epoch: 0
release: 1
summary: Making your life easier on doing simple tasks in AWS via boto3
url: https://github.com/ThiagoPanini/cloudgeass
rpm_license: MIT
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudgeass-2.0.1-1.src.rpm
checksum_type: sha256
description:
  <div align="center">
      <br><img src="https://github.com/ThiagoPanini/cloudgeass/blob/v2.0.x/docs/assets/gifs/logo-animated-intro.gif?raw=true" alt="cloudgeass-animated-intro">
  </div>


  <div align="center">
    <br>

    [![PyPI](https://img.shields.io/pypi/v/cloudgeass?color=purple)](https://pypi.org/project/cloudgeass/)
    ![PyPI - Downloads](https://img.shields.io/pypi/dm/cloudgeass?color=purple)
    ![PyPI - Status](https://img.shields.io/pypi/status/cloudgeass?color=purple)
    ![GitHub Last Commit](https://img.shields.io/github/last-commit/ThiagoPanini/cloudgeass?color=purple)
    <br>

    ![CI workflow](https://img.shields.io/github/actions/workflow/status/ThiagoPanini/cloudgeass/ci-main.yml?label=ci)
    [![Documentation Status](https://readthedocs.org/projects/cloudgeass/badge/?version=latest)](https://cloudgeass.readthedocs.io/pt/latest/?badge=latest)
    [![codecov](https://codecov.io/github/ThiagoPanini/cloudgeass/branch/main/graph/badge.svg?token=7HI1YGS4AA)](https://codecov.io/github/ThiagoPanini/cloudgeass)

  </div>

  > **Note**
  > Now *cloudgeass* has an [official documentation page on readthedocs](https://cloudgeass.readthedocs.io/pt/latest/)! possui uma **documentação oficial** no readthedocs! Check it out to get access to the latest features!



  To start using the package, just install it using [pip](https://pypi.org/project/pip/) (or any other Python dependency management of your choose) as:

  ```python
  pip install cloudgeass
  ```

  You may want to install *cloudgeass* in a [Python virtual environment](https://docs.python.org/3/library/venv.html) to get a good control of your project or application dependencies. If you don't know what this is about, feel free to take a look at this excellent [article from Real Python](https://realpython.com/python-virtual-environments-a-primer/).



  Getting straight to the point, each *cloudgeass* module represents an AWS service that contains at least one class and a bunch of methods built from both boto's source client and resource for that service.

  In other words, some modules that you can find here are:

  - `cloudgeass.aws.s3` for working with S3 service
  - `cloudgeass.aws.ec2` for working with EC2 service
  - `cloudgeass.aws.secrets` for working with Secrets Manager service
  - *and some others*



  Each one of the aforementioned modules have at least one class that can be imported on user's application in order to provide access to all features for that given AWS service. So, we have:

  - `cloudgeass.aws.s3.S3Client` class with methods to operate with S3 service
  - `cloudgeass.aws.ec2.EC2Client` class with methods to operate with EC2 service
  - `cloudgeass.aws.secrets.SecretsManagerClient` class with methods to operate with Secrets Manager service
  - *and some others*



  All *cloudgeass'* service classes are initialized with a set of predefined attributes to make the work easier. Those basic attributes are:

  | **Service class attribute** | **Description** |
  | :-- | :-- |
  | `self.logger` | A preconfigured logger object to build and stream informative log messages |
  | `self.client` | A boto3 client for the given service |
  | `self.resource` | A boto3 resource for the given service |

  The attributes can be externally accessed for all class instances created on an application. This means users can build an application using both *cloudgeass* and source boto3 code.



  Finally, each service class has its own set of methods that, in fact, enables the power of using *cloudgeass* to do simple tasks in an AWS environment. To mention some of them, we have:

  - [S3Client.get_last_date_partition()](./mkdocstrings/s3.md/#cloudgeass.aws.s3.S3Client.get_last_date_partition) to get the last date partition from a table stored in S3
  - [EC2Client.get_default_vpc_id()](./mkdocstrings/ec2.md/#cloudgeass.aws.ec2.EC2Client.get_default_vpc_id) to get the default VPC ID of an AWS account
  - [SecretsManagerClient.get_secret_string()](./mkdocstrings/secrets.md/#cloudgeass.aws.secrets.SecretsManagerClient.get_secret_string) to get a secret string given a secret ID

  ___



  - GitHub: [@ThiagoPanini](https://github.com/ThiagoPanini)
  - LinkedIn: [Thiago Panini](https://www.linkedin.com/in/thiago-panini/)
  - Hashnode: [panini-tech-lab](https://panini.hashnode.dev/)
  - DevTo: [thiagopanini](https://dev.to/thiagopanini)


  ___



  **Python**

  - [Python - Packaging Python Projects](https://packaging.python.org/en/latest/tutorials/packaging-projects/)
  - [Stack Overflow - Reading Pandas DataFrame from S3](https://stackoverflow.com/questions/37703634/how-to-import-a-text-file-on-aws-s3-into-pandas-without-writing-to-disk)

  **Docs**

  - [NumPy docstrings](https://numpydoc.readthedocs.io/en/latest/format.html)
  - [Eduardo Mendes - Live de Python 189 - MkDocs](https://www.youtube.com/watch?v=GW6nAJ1NHUQ&t=2s&ab_channel=EduardoMendes)
  - [MkDocs](https://www.mkdocs.org/)
  - [pmdown-extensions](https://facelessuser.github.io/pymdown-extensions/)
  - [GitHub - MkDocs Themes](https://github.com/mkdocs/mkdocs/wiki/MkDocs-Themes)
  - [GitHub - Material Theme for MkDocs](https://github.com/squidfunk/mkdocs-material)
  - [Material for MkDocs - Setup](https://squidfunk.github.io/mkdocs-material/setup/changing-the-colors/)

  **Github**

  - [GitHub Actions - pypa/gh-action-pypi-publish](https://github.com/marketplace/actions/pypi-publish)
  - [Medium - Major, Minor and Patch](https://medium.com/fiverr-engineering/major-minor-patch-a5298e2e1798)
  - [Medium - Automate PyPI Releases with GitHub Actions](https://medium.com/@VersuS_/automate-pypi-releases-with-github-actions-4c5a9cfe947d)

  **Tests**

  - [Codecov - Setting Threshold](https://github.com/codecov/codecov-action/issues/554#issuecomment-1261250304)
  - [Codecov - About the Codecov YAML](https://docs.codecov.com/docs/codecov-yaml)
  - [Codecov - Status Checks](https://docs.codecov.com/docs/commit-status)
  - [Codecov - codecov.yml Reference](https://docs.codecov.com/docs/codecovyml-reference)
  - [Codecov - Ignore Paths](https://docs.codecov.com/docs/ignoring-paths)


pkgId: 6eb5fffc9bf061d4f7b09d74ff40a38885c95203d6a0e71bbdb8f0bf31ee1faa
name: python-cloudgenix
arch: src
version: 6.5.1b1
epoch: 0
release: 1
summary: Python3 SDK for the CloudGenix AppFabric
url: https://github.com/CloudGenix/sdk-python
rpm_license: MIT
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudgenix-6.5.1b1-1.src.rpm
checksum_type: sha256
description:
  [![CloudGenix Logo](https://raw.githubusercontent.com/CloudGenix/sdk-python/master/docs/CloudGenix_Logo.png)](https://www.cloudgenix.com)

  [![image](https://img.shields.io/pypi/v/cloudgenix.svg)](https://pypi.org/project/cloudgenix/)
  [![image](https://img.shields.io/pypi/pyversions/cloudgenix.svg)](https://pypi.org/project/cloudgenix/)
  [![Downloads](https://pepy.tech/badge/cloudgenix)](https://pepy.tech/project/cloudgenix)
  [![License: MIT](https://img.shields.io/pypi/l/cloudgenix.svg?color=brightgreen)](https://pypi.org/project/cloudgenix/)
  [![GitHub issues open](https://img.shields.io/github/issues/CloudGenix/sdk-python.svg)](https://github.com/CloudGenix/sdk-python/issues)

  Python3 SDK for the CloudGenix AppFabric


  Intended to be a small, lightweight SDK wrapper around the CloudGenix API for easy use.
  Initial version requires knowledge of JSON/Dict objects for POST/PUT/PATCH operations.


  * Active CloudGenix Account
  * Python >=3.7
  * Python modules:
      * Requests - <http://docs.python-requests.org/en/master/>
      * Websockets >= 8.1 - <https://websockets.readthedocs.io/en/stable/index.html>
      * urllib3 >= 2.0.0 - <https://urllib3.readthedocs.io/en/stable/>


  Comes with `example.py` that shows usage to get a JSON list of sites.

  Super-simplified example code (rewrite of example.py in ~4 lines of code):
  ```python

  from cloudgenix import API, jd


  sdk = API()


  sdk.interactive.login()


  jd(sdk.get.sites())
  ```


  MIT


  | Version   | Build | Changes                                                                                                   |
  |-----------| ----- |-----------------------------------------------------------------------------------------------------------|
  | **6.5.1** | **b1** | Support for November 2024 Controller release.                                                             |
  | **6.4.2** | **b1** | Support for August 2024 Controller release.                                                               |
  | **6.4.1** | **b1** | Support for May 2024 Controller release.                                                                  |
  | **6.3.2** | **b1** | Support for February 2024 Controller release.                                                             |
  | **6.3.1** | **b1** | Support for November 2023 Controller release.                                                             |
  | **6.2.3** | **b1** | Support for August 2023 Controller release.                                                               |
  | **6.2.2** | **b1** | Support for June 2023 Controller release.                                                                 |
  | **6.2.1** | **b1** | Support for April 2023 Controller release.                                                                |
  | **6.1.2** | **b1** | Support for January 2023 Controller release.                                                              |
  | **6.1.1** | **b1** | Support for November 2022 Controller release.                                                             |
  | **6.0.2** | **b1** | Support for August 2022 Controller release.                                                               |
  | **6.0.1** | **b1** | Support for June 2022 Controller release.                                                                 |
  | **5.6.1** | **b2** | Minor bugfix.                                                                                             |
  |           | **b1** | Support for Sept 2021 Controller release.                                                                 |
  | **5.5.3** | **b1** | Support for June 2021 Controller release.                                                                 |
  | **5.5.1** | **b3** | Fix for issue #25.                                                                                        |
  |           | **b2** | Minor bugfixes.                                                                                           |
  |           | **b1** | Support for April 2021 Controller release.                                                                |
  | **5.4.3** | **b1** | Support for October 2020 Controller release.                                                              |
  | **5.4.1** | **b1** | Support for July 2020 Controller release.                                                                 |
  | **5.3.1** | **b1** | Support for April 2020 Controller release.                                                                |
  | **5.2.3** | **b1** | Support for March 2020 Controller release.                                                                |
  | **5.2.1** | **b1** | Support for January 2020 Controller release.                                                              |
  | **5.1.5** | **b1** | Support for June 2019 Controller release.                                                                 |
  | **5.1.1** | **b1** | Support for November 2018 Controller release.                                                             |
  | **5.0.3** | **b2** | Enhanced REST API retry handling and options.                                                             |
  |           | **b1** | Support for September 2018 Controller release.                                                            |
  | **5.0.1** | **b1** | Support for July 2018 Controller release, New version notifications, Depreciate legacy _single functions. |
  | **4.7.1** | **b1** | Support for May 2018 Controller release.                                                                  |
  | **4.6.1** | **b1** | Support for Mar 2018 Controller release.                                                                  |
  | **4.5.7** | **b1** | Support for Feb 2018 Controller release, Bugfix for issue #4                                              |
  | **4.5.5** | **b4** | Bugfix for certain POST APIs, other minor fixes.                                                          |
  |           | **b3** | CA Pinning update, *_single function deprecation, add missed 'security' extras requirement.               |
  |           | **b2** | Various fixes and cleanup for public release.                                                             |
  |           | **b1** | Update for 15/12/2017 API additions.                                                                      |
  | **4.5.3** | **b2** | Initial Internal Release.                                                                                 |


   * Get help and additional CloudGenix Documentation at <http://support.cloudgenix.com>
   * View the autogenerated documentation in the `docs/` directory, or at <https://cloudgenix.github.io/sdk-python/>.
   * View in-python help using `help()` functions. (example: `help(sdk.get.login)`)


pkgId: b7f940a6895136dc72ac4e96ca6ad98fe7d2366becbf1b32efedbf27df5fc59b
name: python-cloudgenix-config
arch: src
version: 2.1.0b1
epoch: 0
release: 1
url: https://github.com/CloudGenix/cloudgenix_config
rpm_license: MIT
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudgenix-config-2.1.0b1-1.src.rpm
checksum_type: sha256
summary:
  Configuration exporting and Continuous Integration (CI) capable configuration importing for the CloudGenix Cloud Controller.

description:
  [![CloudGenix Logo](https://raw.githubusercontent.com/CloudGenix/sdk-python/master/docs/CloudGenix_Logo.png)](https://www.cloudgenix.com)

  [![image](https://img.shields.io/pypi/v/cloudgenix_config.svg)](https://pypi.org/project/cloudgenix_config/)
  [![image](https://img.shields.io/pypi/pyversions/cloudgenix_config.svg)](https://pypi.org/project/cloudgenix_config/)
  [![Downloads](https://pepy.tech/badge/cloudgenix-config)](https://pepy.tech/project/cloudgenix-config)
  [![License: MIT](https://img.shields.io/pypi/l/cloudgenix_config.svg?color=brightgreen)](https://pypi.org/project/cloudgenix_config/)
  [![GitHub issues open](https://img.shields.io/github/issues/CloudGenix/cloudgenix_config.svg)](https://github.com/CloudGenix/cloudgenix_config/issues)

  Configuration exporting and Continuous Integration (CI) capable configuration importing for the CloudGenix Cloud Controller.


  Enables export and import of configurations and templates from the CloudGenix Cloud Controller. Also, the Import of
  configuration is designed to be run on file change, to maintain configuration state on the Cloud Controller.


   - Replace ION at site by extracting configuration, replacing 'serial_number' with new ION (Must be online and at least allocated to the account).
   - Check configurations into a repository (private GIT), and have a CI process system automatically configure site(s)
   - Use configs as a rollback tool after changes.
   - Delete most configurations by simply removing them from the file and/or setting to null.
   - Use configs as a template to deploy 10s-100s-1000s of sites.


  * Active CloudGenix Account
  * Python >= 2.7 or >=3.6
  * Python modules:
      * CloudGenix Python SDK >= 5.6.1b2 - <https://github.com/CloudGenix/sdk-python>


  MIT


   - **PIP:** `pip install cloudgenix_config`. After install, `pull_site`/`do_site` scripts should be placed in the Python
   Scripts directory.
   - **Github:** Download files to a local directory, manually run `pull_site.py` and `do_site.py` scripts.


   1. Configure a Site, Element, and related objects using the UI. Record the Site name (example, MySite)
   2. Extract the configuration using the `pull_site` script: `pull_site -S "MySite" --output MySite.yaml`
      ```bash
      edwards-mbp-pro:cloudgenix_config aaron$ ./pull_site.py -S "MySite" --output MySite.yml
      edwards-mbp-pro:cloudgenix_config aaron$
      ```
   3. View, edit, make changes to the configuration file as needed. Example file at <https://github.com/CloudGenix/cloudgenix_config/blob/master/example/MySite.yml>
   4. Use `do_site.py` to apply the configuration, script will get site to that state.
      ```bash
      edwards-mbp-pro:cloudgenix_config aaron$ ./do_site.py ./MySite.yml
      No Change for Site MySite.
       No Change for Waninterface Circuit to Comcast.
       No Change for Waninterface Circuit to AT&T.
       No Change for Waninterface Circuit to Megapath.
       No Change for Lannetwork NATIVE_VLAN.
       Element: Code is at correct version 5.0.1-b9.
        No Change for Element MySite Element.
         No Change for Interface 23.
         No Change for Interface 1.
         No Change for Interface controller 1.
         No Change for Interface 4.
         No Change for AS-PATH Access List test3.
         No Change for IP Community List 20.
         No Change for Routing Prefixlist test-script-list2.
         No Change for Route Map toady.
         No Change for Route Map test8.
         No Change for Route Map toady2.
         No Change for BGP Global Config 15311892501660245.
         No Change for BGP Peer teaerz.
         No Change for Staticroute 15312386843200245.
         No Change for Ntp default.
         No Change for Toolkit 15311890594020131.
      No Change for Site MySite state (active).
      DONE
      ```


  When a major version change in the CloudGenix Config Utility is published, new parameters will likely be introduced in the YAML config template.

  Please adhere to the following workflow to make sure existing configuration templates or YAML files can be reused with the latest version of the config utility:
  * **Step 1**: Upgrade the CloudGenix Config Utility using the command ```pip install --upgrade cloudgenix_config```

  * **Step 2**: For existing Jinja2 templates and/or site specific YAML config files, re-run ```pull_site``` for the site

  * **Step 3**: Compare (diff) the old Jinja2 template and/or site specific YAML file with YAML file generated in Step 2.

  * **Step 4**: Identify all the new attributes introduced in the latest version that are applicable to your configuration

  * **Step 5**: Update the old Jinja2 template and/or YAML config file with the new parameters identified in Step 4.

  **Note**: Make sure the following steps are followed after upgrading the CloudGenix Config Utility.
  The CloudGenix Config Utility will default to using the SDK version. An out-of-date YAML file could cause issues with resource creation and/or resource updates.


   - This is a PREVIEW release, hiccups to be expected. Please file issues on Github for any problems.
   - Requires 5.6.1b2 cloudgenix SDK. Future minor SDK revisions (5.6.x, etc.) will likely require a matching `cloudgenix_config` update.
   - While this script can EXTRACT a single file with ALL sites, running do_sites.py on that file is NOT RECOMMENDED.
     - Best practice to do one site per config file.
       - These can be automatically pulled via `pull_site.py` with `--multi-output <directory>` switch, will create a config per site.
     - Site safety factor is set to 1 by default (prevents unintentional multi-site configurations)
   - Re-naming Sites is not currently supported (changing site name in config causes a new site to be created)
   - Deletion of sites using `do_site.py` DESTROYS all objects under the Site. This operation is done by running `do_site.py` with the `--destroy` option.
     - Delete WILL happily auto-destroy EVERY SITE in the referenced YAML config file (Even FULLY-CONFIGURED SITES). Use with caution.
     - Site safety factor also applies to `--destroy` operations.
   - If Element is permanently offline or in other broken state, it will fail to be removed from a site. To force-removal,
   use the `--declaim` option. This will unassign AND declaim (AKA "put back in inventory") the permanently offline or broken device.
   It will also force revocation of all credentials and certificates for that device.
   - Element Extensions with specific PATH IDs are not currently templatable across multiple sites using this script.
   - For ION 9000, if trying to configure a bypasspair and the port with the same name (12,13,14,15,16), configuration pushes via do_site have to be done in the following two steps:
       - Include only interface configuration of type port and use the do_site utility to push this configuration first.
       - Update the YAML file to remove the interface configuration of type port, include interface configuration of type bypasspair and use the do_site utiltiy to push the bypasspair configuration.


  | Version | Build | Changes |
  | ------- | ----- | ------- |
  | **2.1.0** | **b1** | Support for Cloudgenix SDK 6.3.1b1
  | **2.0.0** | **b2** | Bug fixes - CGCBL-1436, CGCBL-1925
  |           | **b1** | Support for Cloudgenix SDK 6.2.1b1, Bug fixes - CGSDW-12214, CGSDW-11898|
  | **1.9.0** | **b2** | Bug fixes - CGCBL-1251, CGCBL-1578|
  |           | **b1** | Support for Cloudgenix SDK 6.1.1b1, bug fixes|
  | **1.8.0** | **b1** | Support for Cloudgenix SDK 6.0.2b1, Fix for CGCBL-1399, CGCBL-1347|
  | **1.7.0** | **b3** | Bug fixes|
  |           | **b2** | Fix for CGCBL-336, #73, #74 and CGESC-700|
  |           | **b1** | Support for CloudGenix SDK 6.0.1b1, bug fixes|
  | **1.6.0** | **b2** | Minor bug fixes |
  |           | **b1** | Support for CloudGenix SDK 5.6.1b2, cellular devices, multicast, apiversion flag in cli, bugfixes
  | **1.5.0** | **b4** | Fix for CGCBL-1249 and CGCBL-1250|
  |           | **b3** | Back ported fix for CGCBL-842 and step upgrade (not available via pip)|
  |           | **b2** | Back ported fix for CGCBL-847 - updated used_for (private_wan to private) in default_interfaces|
  |           | **b1** | Removed mandatory 480 seconds delay (workaround for CGSDW-799) after claiming ION|
  | **1.4.0** | **b5** | Default 480 second delay after claiming ION. Workaround for CGSDW-799|
  |           | **b4** | Added wait-element-config parameter to introduce a delay before element configuration|
  |           | **b3** | Minor bug fixes |
  |           | **b2** | Minor update to requirements.txt |
  |           | **b1** | Support for CloudGenix SDK 5.5.1b1, element step upgrade/downgrade|
  | **1.3.0** | **b3** | Fix for issue #52|
  |           | **b2** | Bug fixes|
  |           | **b1** | Support for CloudGenix SDK 5.4.3b1|
  | **1.2.0** | **b3** | Support for CloudGenix SDK 5.3.1b1|
  |           | **b3** | Fix for Github issue #34|
  |           | **b2** | Fix for Github issue #32|
  |           | **b1** | Added CloudGenix SDK 5.2.1b1 support, removed SDK 5.1.1b1 support|
  | **1.1.0** | **b2** | Fix for Github issues #25, #26, #27, #28, #30|
  |           | **b1** | CloudGenix SDK 5.1.1b1 support|
  | **1.0.0** | **b6** | PIP setup will now limit CloudGenix SDK to 5.0.3b2 for v1.0.0|
  |           | **b5** | Hotfix for #16 |
  |           | **b4** | Fix issues #8 #11 #12 and #13 |
  |           | **b3** | More Bug fixes. |
  |           | **b2** | Bug fixes. |
  |           | **b1** | Initial Release. |



   * Get help and additional CloudGenix Documentation at <http://support.cloudgenix.com>


pkgId: 9ecca6e762ff677ba2003e610570f0b39ca698534201da41a402bd60824a3edd
name: python-cloudimized
arch: src
version: 1.3.11
epoch: 0
release: 1
summary: Google Cloud Platform (GCP) configuration scanning tool
url: https://github.com/egnyte/cloudimized
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudimized-1.3.11-1.src.rpm
checksum_type: sha256
description:
  Cloudimized is a Google Cloud Platform (GCP) configuration scanning tool. It allows
  monitoring changes of selected resources.

  Cloudimized performs similar function as Oxidized, but for Cloud environment.

  ![Example Slack notification when using all optional features, including a git diff of the change](https://raw.githubusercontent.com/egnyte/cloudimized/main/cloudimized-example.png)



  Cloudimized periodical scans of GCP resources via API calls and dumps them into yaml files. Files are tracked in Git,
  so every configuration change is being tracked.
  It gathers additional information for each change: changer's identity, related Terraform runs
  (optionally), identify change ticket number (optionally).
  Optionally it sends Slack notifications for each change.



  * Project discovery across GCP organization
  * Identifying changer identity
  * Manual changes detection
  * Identifying Terraform runs
  * Identifying change tickets
  * Slack notifications





  On each execution Cloudimized performs following actions:

  1. Gets configuration from previous execution from Git remote
  2. Clears all configuration files from local repo
  3. Performs resource reading
     1. For all projects for all resources executes API call to get resource configuration
     2. (optional) Performs configured field and item filtering for each resource
  4. Dumps all results in yaml files format in local Git repo
  5. Checks local Git repo state and detects all changed resource
  6. For each detected change performs additional information gathering:
     1. Get GCP Logs for change to identify changer's identity
     2. Identifies manual changes
        1. *changes performed directly by individual users as opposed to service accounts i.e. changes done outside of Terraform*
     3. (optional) If change performed via Terraform Service Account, identify related Terraform runs.
        1. Get Terraform Runs URL
        2. (optional) Get ticket/issue marker from Terraform Run message. Generate ticket URL.
  7. Commit each individual change to Git repo
     1. Contains configuration Git diff
     2. Contains all additional gathered information
  8. (optional) Send Slack notification for each change
     1. Containing same information as Git commit
  9. Push new commits to remote repo



  1. Install Cloudimized with [pipx](https://github.com/pypa/pipx) (recommended) or plain pip.

  ```
  pipx install cloudimized
  ```

  2. Cloudimized for operation requires Git repo for storing GCP configuration files.
     1. Set-up empty Git repo in remote location i.e. GitHub or GitLab



  After installation:
  1. Perform necessary [configuration](#Configuration)
  2. Schedule periodic, regular script execution
     1. This can be achieved via number of ways i.e.
        1. via cron
        2. via automation server
     2. Execute with `cloudimized -c <PATH_TO_FILE>/config.yaml`







  GCP Service Account is used to perform resources scanning, log reading and project discovery. Below steps show setting up account with organization wide
  reading permissions.
  1. Create dedicated Service Account in selected GCP project
  2. On organization level create custom role with permissions:
     1. *logging.logEntries.list* //required to identify changer
     2. *\<resource\>.list* //for each resource to be scanned
        1. i.e. **compute.subnetworks.list** for scanning of VPC subnetwork resource
        2. Refer to official Google docs for [method](https://cloud.google.com/compute/docs/reference/rest/v1/subnetworks/list) and its [permission](https://cloud.google.com/compute/docs/reference/rest/v1/subnetworks/list#iam-permissions) mapping
  3. On organization level create IAM policy that binds Service Account with Roles: Browser and custom role you've created

  This will grant Service Account permission to discover all projects in Organzation, perform scanning of selected
  resources in all projects and perform Logs scanning in all projects. If needed it is possible to limit permissions to
  selected Folders and/or Projects.

  See:
  * [Google Cloud listing permissions](https://cloud.google.com/resource-manager/docs/listing-all-resources)



  GIT Service Account is used to get configuration repository from remote and pushing to that repo detected configuration changes.
  In your GIT remote you need to configure account/access token with proper permissions. Script allows communication via
  both HTTPS and SSH.



  Terraform Account is used to read Terraform Runs. Concept of Service Account doesn't exist in Terraform, so this is
  performed in following way:
  1. Create Terraform Team with "Runs: Read Runs" permissions
  2. For each Terraform organization generate Team API token for your Team

  See:
  * [Terraform teams](https://www.terraform.io/cloud-docs/users-teams-organizations/teams)
  * [Terraform permissions](https://www.terraform.io/cloud-docs/users-teams-organizations/permissions)
  * [Terraform API tokens](https://www.terraform.io/cloud-docs/users-teams-organizations/api-tokens)



  Slack Service Account is used for sending detected change notification to Slack channel. This is done via Slack App.
  1. Create Slack app on Slack API page
     1. Select *From scratch*
     2. App Name - enter *Cloudimized*
     3. Workspace - select your workspace
  2. In *Add features and funcionality* select *Permissions*
  3. In *Scopes* -> *Bot Token Scopes*, click *Add an OAuth Scopes*
     1. Select *files:write*
  4. In *OAuth Tokens for Your Woskrpace*, click *Install to Workspace*
  5. Click *Allow access*
  6. *Bot User OAuth Token* has been generated, take a note
  7. Select/create channel to which notifications will be sent
     1. Add App bot user by @mentioning App name in selected channel

  See:
  * [Slack app setup](https://api.slack.com/authentication/basics)



  Jira Service Account is used for creating issues(tickets) for selected changes. Depending on your Jira deployement
  (Cloud vs Server), you need to setup an account with proper permissions to create Issues of selected type in given
  project.

  See:
  * [Jira Cloud API token](https://support.atlassian.com/atlassian-account/docs/manage-api-tokens-for-your-atlassian-account/)
  * [Jira Software docs](https://confluence.atlassian.com/jirasoftware/jira-software-documentation-774242447.html)



  All secrets required to run script need to be passed via env variables.



  Communication with GIT remote can be both SSH and HTTPS based. If using SSH you need to take care of your SSH keys
  configuration. If using HTTPS you need to pass credentials via following env variables:

  * env var `GIT_USR` - username
  * env var `GIT_PSW` - password/token



  Cloudimized authenticates to GCP using GCP Service Account. After creating account you need to download JSON key file.
  Passing credentials to script can be achieved either by setting env var or using Google's ADC mechanism

  * env var `GOOGLE_APPLICATION_CREDENTIALS` set to file path of service account's JSON key token

  or

  * Authenticate via `gcloud auth application-default login` by providing service account's JSON key token

  See:
  * [Best practices to securely authenticate applications in Google Cloud ](https://cloud.google.com/docs/authentication/best-practices-applications#overview_of_application_default_credentials)
  * [Authenticating as a service account](https://cloud.google.com/docs/authentication/production)
  * [gcloud auth application-default login](https://cloud.google.com/sdk/gcloud/reference/auth/application-default/login)



  Cloudimized authenticates to Terraform using Team token for each Terraform organization. Tokens are stored in JSON file
  that only contains mapping between organization and team token value. File is passed to script by providing JSON file
  location. This can be done by:

  * env var `TERRAFORM_READ_TOKENS` set to file path of terraform's JSON mapping key

  or

  * option `workspace_token_file` in configuration file set to file path of terraform's JSON mapping key



  Cloudimized authenticates to Slack using Slack's Applications Bot User token. Token is passed to script via env var

  * env var `SLACK_TOKEN` set to token value



  Cloudimized authenticates to Jira using Username and Password/Token combination. Credentials are passed to script via
  env var

  * env var `JIRA_USR` - Jira's username - (note: not set when using Token auth)
  * env var `JIRA_PSW` - Jira's password/Token



  Example configuration file:
  ```YAML
  services:
    
    - serviceName: compute
      
      version: v1
      
      queries:
        
        - resource: networks
          
          gcp_api_call: networks.list
          
          gcp_function_args:
            
            project: <PROJECT_ID>
          
          gcp_log_resource_type: gce_network
          
          
          
          field_exclude_filter:
            
            - peerings:
              
              - stateDetails
          
          item_exclude_filter:
            
            - peerings:
                name: "servicenetworking-googleapis-com"
          sortFields:
             
             
             - name
             
             - secondaryIpRanges: name

  git:
     
    remote_url: https://github.com/<ORG>/<REPO_NAME>
     
    local_directory: gcp_config


  discover_projects: True







  excluded_projects:
    - excluded-project-ID


  thread_count: 4 # default - 3


  change_processor:
    
    scan_interval: 30
    
    service_account_regex: '^(my-terraform-sa-|\d+@|service-\d+).*'
    
    ticket_regex: "^.*?([a-zA-z]{2,3}[-_][0-9]+).*"
    
    ticket_sys_url: "https://my-tickets.com/list"
    
    slack:
      
      channelID: "C123456789A"
      
      repoCommitURL: "https://github.com/<ORG>/<REPO_NAME>/commit"
    
    jira:
       
       url: "https://my.jira.com"
       
       projectKey: "KEY"
       
       issueType: "Task" #default
       
       fields:
          field_name: "field_value"
       
       filterSet:
          projectId: ".*production-only.*"
       
       isToken: True
    
    terraform:
      
      url: "https://app.terraform.io"
      
      
      
      service_workspace_map:
        
        terraform-service-account-no1:
          
          org: my-organization
          
          workspace: ["my-workspace-no1"]
  ```



  Allows to run cloudimized only to scan given resource and dump them into text files, without performing and additional
  functions (no Git, Terraform, Slack, Jira interaction and no GCP logs lookup).



  ```
  cloudimized --singlerun/-s <RESOURCE_NAME> --output/-o {yaml, csv}

  i.e
  cloudimized -s addresses -o csv
  ```



  Resource configurations for single run (**<RESOURCE_NAME>** parameter) to be scanned are stored in **singlerunconfigs**
  directory and are selected based on filename. Resource configuration is the same as in main config file. Additional
  singe run mode configs can be added to folder as needed.

  Get info available configs or what will be run with <RESOURCE_NAME> with:

  ```
  cloudimized -s --list
  cloudimized -s --describe --name <RESOURCE_NAME>
  ```



  By default script will dump results in YAML format same as in main mode. If chosen it can dump results in CSV file
  format (single file per resource).


pkgId: 8c4d5c3262ef0a54e0b84f90191a606d6d73f37243c598045dfe2682f1014e7c
name: python-cloudinary
arch: src
version: 1.41.0
epoch: 0
release: 1
summary: Python and Django SDK for Cloudinary
url: https://cloudinary.com
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudinary-1.41.0-1.src.rpm
checksum_type: sha256
description:
  The Cloudinary Python SDK allows you to quickly and easily integrate your application with Cloudinary.
  Effortlessly optimize, transform, upload and manage your cloud's assets.

  This Readme provides basic installation and usage information.
  For the complete documentation, see the [Python SDK Guide](https://cloudinary.com/documentation/django_integration).

  - [Key Features](#key-features)
  - [Version Support](#Version-Support)
  - [Installation](#installation)
  - [Usage](#usage)
      - [Setup](#Setup)
      - [Transform and Optimize Assets](#Transform-and-Optimize-Assets)
      - [Django](#Django)

  - [Transform](https://cloudinary.com/documentation/django_video_manipulation#video_transformation_examples) and
    [optimize](https://cloudinary.com/documentation/django_image_manipulation#image_optimizations) assets.
  - Generate [image](https://cloudinary.com/documentation/django_image_manipulation#deliver_and_transform_images) and
    [video](https://cloudinary.com/documentation/django_video_manipulation#django_video_transformation_code_examples) tags.
  - [Asset Management](https://cloudinary.com/documentation/django_asset_administration).
  - [Secure URLs](https://cloudinary.com/documentation/video_manipulation_and_delivery#generating_secure_https_urls_using_sdks).

  | SDK Version | Python 2.7 | Python 3.x |
  | ----------- | ---------- | ---------- |
  | 1.x         | ✔          | ✔          |
  | SDK Version | Django 1.11 | Django 2.x | Django 3.x | Django 4.x |
  | ----------- | ----------- | ---------- | ---------- | ---------- |
  | 1.x         | ✔           | ✔          | ✔          | ✔          |

  ```bash
  pip install cloudinary
  ```


  ```python
  import cloudinary
  ```

  - [See full documentation](https://cloudinary.com/documentation/django_image_manipulation).
  ```python
  cloudinary.utils.cloudinary_url("sample.jpg", width=100, height=150, crop="fill")
  ```

  - [See full documentation](https://cloudinary.com/documentation/django_image_and_video_upload).
  - [Learn more about configuring your uploads with upload presets](https://cloudinary.com/documentation/upload_presets).
  ```python
  cloudinary.uploader.upload("my_picture.jpg")
  ```

  - [See full documentation](https://cloudinary.com/documentation/django_image_and_video_upload#django_forms_and_models).

  - [See full documentation](https://cloudinary.com/documentation/solution_overview#security).

  - [Sample projects](https://github.com/cloudinary/pycloudinary/tree/master/samples).
  - [Django Photo Album](https://github.com/cloudinary/cloudinary-django-sample).

  - Ensure tests run locally.
  - Open a PR and ensure Travis tests pass.
  - See [CONTRIBUTING](CONTRIBUTING.md).

  If you run into an issue or have a question, you can either:
  - Issues related to the SDK: [Open a GitHub issue](https://github.com/cloudinary/pycloudinary/issues).
  - Issues related to your account: [Open a support ticket](https://cloudinary.com/contact).

  Cloudinary is a powerful media API for websites and mobile apps alike, Cloudinary enables developers to efficiently
  manage, transform, optimize, and deliver images and videos through multiple CDNs. Ultimately, viewers enjoy responsive
  and personalized visual-media experiences—irrespective of the viewing device.

  - [Cloudinary Transformation and REST API References](https://cloudinary.com/documentation/cloudinary_references): Comprehensive references, including syntax and examples for all SDKs.
  - [MediaJams.dev](https://mediajams.dev/): Bite-size use-case tutorials written by and for Cloudinary Developers
  - [DevJams](https://www.youtube.com/playlist?list=PL8dVGjLA2oMr09amgERARsZyrOz_sPvqw): Cloudinary developer podcasts on YouTube.
  - [Cloudinary Academy](https://training.cloudinary.com/): Free self-paced courses, instructor-led virtual courses, and on-site courses.
  - [Code Explorers and Feature Demos](https://cloudinary.com/documentation/code_explorers_demos_index): A one-stop shop for all code explorers, Postman collections, and feature demos found in the docs.
  - [Cloudinary Roadmap](https://cloudinary.com/roadmap): Your chance to follow, vote, or suggest what Cloudinary should develop next.
  - [Cloudinary Facebook Community](https://www.facebook.com/groups/CloudinaryCommunity): Learn from and offer help to other Cloudinary developers.
  - [Cloudinary Account Registration](https://cloudinary.com/users/register/free): Free Cloudinary account registration.
  - [Cloudinary Website](https://cloudinary.com): Learn about Cloudinary's products, partners, customers, pricing, and more.

  Released under the MIT license.

rpm_license:
  Released under the MIT license.  Contains MIT licensed code from https://bitbucket.org/chrisatlee/poster


pkgId: 27b5d79d27678ed75e7b4f2a56d46a11fd3a7784b6f89aca3b16b381ab8ead22
name: python-cloudipsp
arch: src
version: 1.0.4
epoch: 0
release: 1
summary: Python SDK for cloudipsp clients.
url: https://github.com/cloudipsp/python-sdk/
rpm_license: MIT
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudipsp-1.0.4-1.src.rpm
checksum_type: sha256
description:
      Cloudipsp python sdk.
      Docs   - https://docs.fondy.eu/
      README - https://github.com/cloudipsp/python-sdk/blob/master/README.md


pkgId: 4f9f6eac675730fddf2b0d78e4d19e2a00a63eff245d40d149a7efb01c18d3ba
name: python-cloudlab
arch: src
version: 1.2.0
epoch: 0
release: 1
summary: A tool for quickly provisioning lab environments on AWS.
url: https://github.com/wrmay/cloudlab
rpm_license: MIT
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudlab-1.2.0-1.src.rpm
checksum_type: sha256
description:
  Cloudlab allows you to quickly provision a lab environment on AWS.  By adopting a somewhat opinionated approach,
  It attempts to strike a good balance between configurability and ease of use.

  Cloudlab provisions a single VPC on AWS with a /16 private address space.  Within the VPC, 1 or more subnets can be
  configured.  All subnets are public and all have their own /24 address space inside the VPC.  All machines are assigned
  a role.  The machine type, image and a list of open ports are configured at the role level to avoid redundant
  configuration.

  After successful deployment, cloudlab writes an `inventory.yaml` file,  which list the public and private ips of all
  servers, grouped by role.  The inventory file is suitable for use with Ansible.

  A sample configuration for deploying 5 servers to 2 subnets is shown below.
  ```yaml
  region: us-east-2
  cidr: 10.0.0.0/16  # must be a /16 subnet, must be a non-routable IP (e.g. 10.*.*.*, 192.168.*.*)
  roles:
    ClusterMember:   # role names are copied directly into the CloudFormation template and should not contain special characters
      instance_type: m5.xlarge
      ami_name: ubuntu/images/hvm-ssd-gp3/ubuntu-noble-24.04-amd64-server-20240927
      ssh_user: ubuntu
      open_ports: [5701, 5702]
    LoadGenerator:
      instance_type: m5.xlarge
      ami_name: al2023-ami-2023.6.20241111.0-kernel-6.1-x86_64  # will look up the correct one for this region
      ssh_user: ec2-user
      open_ports: [8080]
  subnets:
    - az: a                  # will be appended to region, e.g. us-east-2a
      cidr: 10.0.1.0/24      # must be a /24
      servers:
        - private_ip_suffixes: [101, 102]   # only need to give the last octet, becomes 10.0.1.101
          role: ClusterMember
    - az: b
      cidr: 10.0.2.0/24
      servers:
        - private_ip_suffixes: [101, 102]   # creates 2 servers, 10.0.2.101 and 10.0.2.102
          role: ClusterMember
        - private_ip_suffixes: [201]
          role: LoadGenerator
  ```

  Other Notes:
  - All instances (hosts) will have an Amazon assigned public IP address and DNS name.
  - All hosts can initiate outbound connections to any other server either in or outside of the VPC
  - All hosts can receive connections on any port, from any other server in the VPC
  - All hosts accept inbound connections on port 22
  - Other than port 22, hosts will only accept inbound connections on specific ports which can be configured per role
  - Each environment provisioned with cloudlab will have its own ssh key which will be shared by all the hosts.
  - AMIs are specified by "name" rather than the typical "ami_id", which is region specific.  At deploy time, the
  name is translated to a region specific ami_id.  This makes the cloudlab configuration easier to port to another
  region.



  Cloudlab requires python 3.

  It can be installed using pip.

  ```
  pip install cloudlab
  ```

  Cloudlab requires the aws cli to be present.  See https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html
  for installation instructions.

  The AWS CLI will need to be configured with your credentials so it can access your AWS account.
  If your aws cli is not already configured, provide your credentials using the `aws configure` command or,
  if sso is configured, `aws sso login`

  Cloudlab will have whatever privileges your cli has.  The snippet below is an IAM policy describing the permissions
  needed by cloudlab.

  ```json
  {
      "Version": "2012-10-17",
      "Statement": [
          {
              "Action": [
                  "ec2:*",
                  "cloudformation:*",
                  "elasticloudbalancing:*"
              ],
              "Effect": "Allow",
              "Resource": "*"
          }
      ]
  }
  ```




  Create a file called "cloudlab_config.yaml" in the current directory and edit it to describe the environment you
  would like to provision.  See the example above.  You can also create a sample configuration file by running
  `cloudlab sample > cloudlab_config.yaml`.  See the comments in the sample file for details.



  ```
  cloudlab mkenv <envdir>
  ```

  "envdir" should be an absolute or relative path.  The name of the directory, without any path,  will be used as the
  name of the environment and the name must be unique. The "envdir" directory will be created.  The process
  will fail if the directory exists.

  You can generate a CloudFormation template and skip the provisioning step by adding the `--no-provision` flag as
  shown below.

  ```
  cloudlab mkenv <envdir> --no-provision
  ```


  ```
  cloudlab rmenv <envdir>
  ```

  This command is idempotent.  It will not fail if the environment does not exist.



  Update `cloudlab_config.yaml` with your changes and run ...

  ```
  cloudlab update <envdir>
  ```




  - default plan now includes multiple subnets
  - configuration format has changed to allow the specification of subnets
  - the `--plan` option allows alternate templates to be used although there currently are none.
  - the `cloudlab sample` will output a sample configuration file
  - removed dependency on methods in setuptools



  - updated required verision of PyYAML to >= 5.4 to avoid known vulnerability in earlier versions.



  - tplate updates broke cloudlab. The tplate version is now pinned to 1.0.3.



  - Due to a limitation of 60 outputs in an AWS CloudFormation template, it was
    not possible to provision more than 20 servers using cloudlab.  With this
    update, the limit has been raised to 60 servers.



  - fix for failing "update" command



  - fixed a bug that caused mkenv to fail



  - added the "update" command


pkgId: 56b426501745d3b7c61a147ad8e085a14a38b8a9c88795411c42514ae2994a46
name: python-cloudlab_client
arch: src
version: 0.1.135
epoch: 0
release: 1
summary: Client for the cloudlab academic cloud environment.
url: https://pypi.org/project/cloudlab_client/
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudlab_client-0.1.135-1.src.rpm
checksum_type: sha256
description:
  This package is a client for the Cloudlab service. Cloudlab is a cloud for
  academic institutions. Because I could not (yet) find any working API for
  Cloudlab, the current client relies on username / password authentication and
  web scraping.





  ```python

  username = os.environ.get("CLOUDLAB_USERNAME")
  password = os.environ.get("CLOUDLAB_PASSWORD")
  cloudlab_client = CloudlabClient()
  cloudlab_client.login(username, password)


  experiments = cloudlab_client.experiment_list()
  print(experiments)


  nodes = cloudlab_client.experiment_list_nodes("my-experiment")
  print(nodes)


  reason = ("Important experiment needed for research, conducted under advisor"
            " <fill_your_advisor>. Particular machines are needed because"
            " <fill_your_reasons>.")
  cloudlab_client.experiment_extend("my-experiment", reason, hours=6*24)
  ```


pkgId: 97807da15e05ee299c1d505cd15cda7a2974b854ce3e5fc8ca597ae63236ec20
name: python-cloudlanguagetools
arch: src
version: 11.4.0
epoch: 0
release: 1
summary: Interface with various cloud APIs for language processing such as translation, text to speech
url: https://github.com/Language-Tools/cloud-language-tools-core
rpm_license: GPL
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudlanguagetools-11.4.0-1.src.rpm
checksum_type: sha256
description:
  Interface with various cloud APIs for translation, text to speech


  see utils/service_keys.py


  see package.sh


pkgId: 2d55aa21266e3995b7bd1d25b13f14173f4095ab229f25f349f96075dd740945
name: python-cloudlink
arch: src
version: 0.2.0.1
epoch: 0
release: 1
summary: A powerful WebSocket extension for Scratch.
url: https://pypi.org/project/cloudlink/
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudlink-0.2.0.1-1.src.rpm
checksum_type: sha256
description:
  This is the original, Python-based codebase for CloudLink server.




  CloudLink can run on minimal resources. At least 25MB of RAM and any reasonably capable CPU can run a CloudLink server.


  * Unicast and multicast packets across clients
  * Expandable functionality with a built-in method loader


  All dependencies below can be installed using `pip install -r requirements.txt`.
  * 🐍 Python >=3.11
  * 🧵 asyncio (Built-in)
  * 📃 ["ujson" ultrajson](https://github.com/ultrajson/ultrajson)
  * 🔍 [pyeve/cerberus](https://github.com/pyeve/cerberus)
  * ❄️ ["snowflake-id" vd2org/snowflake](https://github.com/vd2org/snowflake)
  * 🌐 [aaugustin/websockets](https://github.com/aaugustin/websockets)


  The CloudLink Python server comes with full support for the CL4 protocol and the Scratch cloud variable protocol.
  Just download, setup, and start!


  You can easily extend the functionality of the server using classes and decorators.
  Here's an example of a simple plugin that displays "Foobar!" in the console
  when a client sends the message `{ "cmd": "foo" }` to the server.

  ```python

  from cloudlink import server


  from cloudlink.server.protocols import clpv4


  server = server()


  server.logging.basicConfig(
      level=server.logging.DEBUG
  )


  clpv4 = clpv4(server)


  class myplugin:
      def __init__(self, server, protocol):

          
          @server.on_command(cmd="foo", schema=protocol.schema)
          async def foobar(client, message):
              print("Foobar!")


  myplugin(server, clpv4)


  server.run()
  ```

rpm_license:
  MIT License  Copyright 2023 Mike J. Renaker / "MikeDEV".  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


pkgId: fa884d6489fffe0c7a69efe50ae40c9b50d41e38973cc6c5f11dc3ddd1e86ae6
name: python-cloudly
arch: src
version: 0.0.2
epoch: 0
release: 1
summary: Utilities for cloud computing.
url: https://pypi.org/project/cloudly/
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudly-0.0.2-1.src.rpm
checksum_type: sha256
description:
  Some utilities for cloud computation.
  Read the `documentation <https://cloudly.readthedocs.io/en/latest/>`_.


pkgId: b981ff3581aa22bb145f997f91e5c08745e4fa8aa40c10d20c2f0dac2eeca55d
name: python-cloudmersive-convert-api-client
arch: src
version: 3.3.0
epoch: 0
release: 1
summary: convertapi
url: https://www.cloudmersive.com/convert-api
rpm_license: UNKNOWN
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudmersive-convert-api-client-3.3.0-1.src.rpm
checksum_type: sha256
description:
  *CompareDocumentApi* | [**compare_document_docx**](docs/CompareDocumentApi.md#compare_document_docx) | **POST** /convert/compare/docx | Compare Two Word DOCX
  *ConvertDataApi* | [**convert_data_csv_to_json**](docs/ConvertDataApi.md#convert_data_csv_to_json) | **POST** /convert/csv/to/json | Convert CSV to JSON conversion
  *ConvertDataApi* | [**convert_data_csv_to_xml**](docs/ConvertDataApi.md#convert_data_csv_to_xml) | **POST** /convert/csv/to/xml | Convert CSV to XML conversion
  *ConvertDataApi* | [**convert_data_json_string_to_xml**](docs/ConvertDataApi.md#convert_data_json_string_to_xml) | **POST** /convert/json-string/to/xml | Convert JSON String to XML conversion
  *ConvertDataApi* | [**convert_data_json_to_xml**](docs/ConvertDataApi.md#convert_data_json_to_xml) | **POST** /convert/json/to/xml | Convert JSON Object to XML conversion
  *ConvertDataApi* | [**convert_data_xls_to_json**](docs/ConvertDataApi.md#convert_data_xls_to_json) | **POST** /convert/xls/to/json | Convert Excel (97-2003) XLS to JSON conversion
  *ConvertDataApi* | [**convert_data_xlsx_to_json**](docs/ConvertDataApi.md#convert_data_xlsx_to_json) | **POST** /convert/xlsx/to/json | Convert Excel XLSX to JSON conversion
  *ConvertDataApi* | [**convert_data_xlsx_to_xml**](docs/ConvertDataApi.md#convert_data_xlsx_to_xml) | **POST** /convert/xlsx/to/xml | Convert Excel XLSX to XML conversion
  *ConvertDataApi* | [**convert_data_xml_edit_add_attribute_with_x_path**](docs/ConvertDataApi.md#convert_data_xml_edit_add_attribute_with_x_path) | **POST** /convert/xml/edit/xpath/add-attribute | Adds an attribute to all XML nodes matching XPath expression
  *ConvertDataApi* | [**convert_data_xml_edit_add_child_with_x_path**](docs/ConvertDataApi.md#convert_data_xml_edit_add_child_with_x_path) | **POST** /convert/xml/edit/xpath/add-child | Adds an XML node as a child to XML nodes matching XPath expression
  *ConvertDataApi* | [**convert_data_xml_edit_remove_all_child_nodes_with_x_path**](docs/ConvertDataApi.md#convert_data_xml_edit_remove_all_child_nodes_with_x_path) | **POST** /convert/xml/edit/xpath/remove-all-children | Removes, deletes all children of nodes matching XPath expression, but does not remove the nodes
  *ConvertDataApi* | [**convert_data_xml_edit_replace_with_x_path**](docs/ConvertDataApi.md#convert_data_xml_edit_replace_with_x_path) | **POST** /convert/xml/edit/xpath/replace | Replaces XML nodes matching XPath expression with new node
  *ConvertDataApi* | [**convert_data_xml_edit_set_value_with_x_path**](docs/ConvertDataApi.md#convert_data_xml_edit_set_value_with_x_path) | **POST** /convert/xml/edit/xpath/set-value | Sets the value contents of XML nodes matching XPath expression
  *ConvertDataApi* | [**convert_data_xml_filter_with_x_path**](docs/ConvertDataApi.md#convert_data_xml_filter_with_x_path) | **POST** /convert/xml/select/xpath | Filter, select XML nodes using XPath expression, get results
  *ConvertDataApi* | [**convert_data_xml_query_with_x_query**](docs/ConvertDataApi.md#convert_data_xml_query_with_x_query) | **POST** /convert/xml/query/xquery | Query an XML file using XQuery query, get results
  *ConvertDataApi* | [**convert_data_xml_query_with_x_query_multi**](docs/ConvertDataApi.md#convert_data_xml_query_with_x_query_multi) | **POST** /convert/xml/query/xquery/multi | Query multiple XML files using XQuery query, get results
  *ConvertDataApi* | [**convert_data_xml_remove_with_x_path**](docs/ConvertDataApi.md#convert_data_xml_remove_with_x_path) | **POST** /convert/xml/edit/xpath/remove | Remove, delete XML nodes and items matching XPath expression
  *ConvertDataApi* | [**convert_data_xml_to_json**](docs/ConvertDataApi.md#convert_data_xml_to_json) | **POST** /convert/xml/to/json | Convert XML to JSON conversion
  *ConvertDataApi* | [**convert_data_xml_transform_with_xslt_to_xml**](docs/ConvertDataApi.md#convert_data_xml_transform_with_xslt_to_xml) | **POST** /convert/xml/transform/xslt/to/xml | Transform XML document file with XSLT into a new XML document
  *ConvertDocumentApi* | [**convert_document_autodetect_get_info**](docs/ConvertDocumentApi.md#convert_document_autodetect_get_info) | **POST** /convert/autodetect/get-info | Get document type information
  *ConvertDocumentApi* | [**convert_document_autodetect_to_jpg**](docs/ConvertDocumentApi.md#convert_document_autodetect_to_jpg) | **POST** /convert/autodetect/to/jpg | Convert Document to JPG/JPEG image array
  *ConvertDocumentApi* | [**convert_document_autodetect_to_pdf**](docs/ConvertDocumentApi.md#convert_document_autodetect_to_pdf) | **POST** /convert/autodetect/to/pdf | Convert Document to PDF
  *ConvertDocumentApi* | [**convert_document_autodetect_to_pdf_batch_job**](docs/ConvertDocumentApi.md#convert_document_autodetect_to_pdf_batch_job) | **POST** /convert/autodetect/to/pdf/batch-job | Convert Document to PDF as Batch Job
  *ConvertDocumentApi* | [**convert_document_autodetect_to_png_array**](docs/ConvertDocumentApi.md#convert_document_autodetect_to_png_array) | **POST** /convert/autodetect/to/png | Convert Document to PNG array
  *ConvertDocumentApi* | [**convert_document_autodetect_to_thumbnail**](docs/ConvertDocumentApi.md#convert_document_autodetect_to_thumbnail) | **POST** /convert/autodetect/to/thumbnail | Convert File to Thumbnail Image
  *ConvertDocumentApi* | [**convert_document_autodetect_to_thumbnails_advanced**](docs/ConvertDocumentApi.md#convert_document_autodetect_to_thumbnails_advanced) | **POST** /convert/autodetect/to/thumbnail/advanced | Convert File to Thumbnail Image Object
  *ConvertDocumentApi* | [**convert_document_autodetect_to_txt**](docs/ConvertDocumentApi.md#convert_document_autodetect_to_txt) | **POST** /convert/autodetect/to/txt | Convert Document to Text (txt)
  *ConvertDocumentApi* | [**convert_document_csv_multi_to_xlsx**](docs/ConvertDocumentApi.md#convert_document_csv_multi_to_xlsx) | **POST** /convert/csv/multi/to/xlsx | Convert Multiple CSV Files into a Single XLSX Spreadsheet
  *ConvertDocumentApi* | [**convert_document_csv_to_html**](docs/ConvertDocumentApi.md#convert_document_csv_to_html) | **POST** /convert/csv/to/html | Convert CSV to HTML document
  *ConvertDocumentApi* | [**convert_document_csv_to_pdf**](docs/ConvertDocumentApi.md#convert_document_csv_to_pdf) | **POST** /convert/csv/to/pdf | Convert CSV to PDF document
  *ConvertDocumentApi* | [**convert_document_csv_to_xlsx**](docs/ConvertDocumentApi.md#convert_document_csv_to_xlsx) | **POST** /convert/csv/to/xlsx | Convert CSV to Excel XLSX Spreadsheet
  *ConvertDocumentApi* | [**convert_document_doc_to_docx**](docs/ConvertDocumentApi.md#convert_document_doc_to_docx) | **POST** /convert/doc/to/docx | Convert Word DOC (97-03) Document to DOCX
  *ConvertDocumentApi* | [**convert_document_doc_to_pdf**](docs/ConvertDocumentApi.md#convert_document_doc_to_pdf) | **POST** /convert/doc/to/pdf | Convert Word DOC (97-03) Document to PDF
  *ConvertDocumentApi* | [**convert_document_doc_to_txt**](docs/ConvertDocumentApi.md#convert_document_doc_to_txt) | **POST** /convert/doc/to/txt | Convert Word DOC (97-03) Document to Text (txt)
  *ConvertDocumentApi* | [**convert_document_docx_to_doc**](docs/ConvertDocumentApi.md#convert_document_docx_to_doc) | **POST** /convert/docx/to/doc | Convert Word DOCX Document to Legacy Word DOC (97-03)
  *ConvertDocumentApi* | [**convert_document_docx_to_html**](docs/ConvertDocumentApi.md#convert_document_docx_to_html) | **POST** /convert/docx/to/html | Convert Word DOCX Document to HTML Document
  *ConvertDocumentApi* | [**convert_document_docx_to_jpg**](docs/ConvertDocumentApi.md#convert_document_docx_to_jpg) | **POST** /convert/docx/to/jpg | Convert Word DOCX Document to JPG/JPEG image array
  *ConvertDocumentApi* | [**convert_document_docx_to_pdf**](docs/ConvertDocumentApi.md#convert_document_docx_to_pdf) | **POST** /convert/docx/to/pdf | Convert Word DOCX Document to PDF
  *ConvertDocumentApi* | [**convert_document_docx_to_png**](docs/ConvertDocumentApi.md#convert_document_docx_to_png) | **POST** /convert/docx/to/png | Convert Word DOCX Document to PNG image array
  *ConvertDocumentApi* | [**convert_document_docx_to_rtf**](docs/ConvertDocumentApi.md#convert_document_docx_to_rtf) | **POST** /convert/docx/to/rtf | Convert Word DOCX Document to RTF
  *ConvertDocumentApi* | [**convert_document_docx_to_txt**](docs/ConvertDocumentApi.md#convert_document_docx_to_txt) | **POST** /convert/docx/to/txt | Convert Word DOCX Document to Text (txt)
  *ConvertDocumentApi* | [**convert_document_eml_to_html**](docs/ConvertDocumentApi.md#convert_document_eml_to_html) | **POST** /convert/eml/to/html | Convert Email EML file to HTML string
  *ConvertDocumentApi* | [**convert_document_eml_to_jpg**](docs/ConvertDocumentApi.md#convert_document_eml_to_jpg) | **POST** /convert/eml/to/jpg | Convert Email EML file to JPG/JPEG image array
  *ConvertDocumentApi* | [**convert_document_eml_to_pdf**](docs/ConvertDocumentApi.md#convert_document_eml_to_pdf) | **POST** /convert/eml/to/pdf | Convert Email EML file to PDF document
  *ConvertDocumentApi* | [**convert_document_eml_to_png**](docs/ConvertDocumentApi.md#convert_document_eml_to_png) | **POST** /convert/eml/to/png | Convert Email EML file to PNG image array
  *ConvertDocumentApi* | [**convert_document_get_async_job_status**](docs/ConvertDocumentApi.md#convert_document_get_async_job_status) | **GET** /convert/batch-job/status | Get the status and result of a Convert Document Batch Job
  *ConvertDocumentApi* | [**convert_document_get_file_type_icon**](docs/ConvertDocumentApi.md#convert_document_get_file_type_icon) | **POST** /convert/autodetect/get-icon | Get PNG icon file for the file extension
  *ConvertDocumentApi* | [**convert_document_get_file_type_icon_advanced**](docs/ConvertDocumentApi.md#convert_document_get_file_type_icon_advanced) | **POST** /convert/autodetect/get-icon/advanced | Get PNG icon byte array for the file extension
  *ConvertDocumentApi* | [**convert_document_html_to_pdf**](docs/ConvertDocumentApi.md#convert_document_html_to_pdf) | **POST** /convert/html/to/pdf | Convert HTML document file to PDF Document
  *ConvertDocumentApi* | [**convert_document_html_to_png**](docs/ConvertDocumentApi.md#convert_document_html_to_png) | **POST** /convert/html/to/png | Convert HTML document file to PNG image array
  *ConvertDocumentApi* | [**convert_document_html_to_txt**](docs/ConvertDocumentApi.md#convert_document_html_to_txt) | **POST** /convert/html/to/txt | HTML Document file to Text (txt)
  *ConvertDocumentApi* | [**convert_document_keynote_to_jpg**](docs/ConvertDocumentApi.md#convert_document_keynote_to_jpg) | **POST** /convert/key/to/jpg | Convert Keynote Presentation (KEY) to JPG/JPEG image array
  *ConvertDocumentApi* | [**convert_document_keynote_to_pdf**](docs/ConvertDocumentApi.md#convert_document_keynote_to_pdf) | **POST** /convert/key/to/pdf | Convert Keynote Presentation (KEY) to PDF
  *ConvertDocumentApi* | [**convert_document_keynote_to_png**](docs/ConvertDocumentApi.md#convert_document_keynote_to_png) | **POST** /convert/key/to/png | Convert Keynote Presentation (KEY) to PNG image array
  *ConvertDocumentApi* | [**convert_document_keynote_to_pptx**](docs/ConvertDocumentApi.md#convert_document_keynote_to_pptx) | **POST** /convert/key/to/pptx | Convert Keynote Presentation (KEY) to PPTX
  *ConvertDocumentApi* | [**convert_document_msg_to_html**](docs/ConvertDocumentApi.md#convert_document_msg_to_html) | **POST** /convert/msg/to/html | Convert Email MSG file to HTML string
  *ConvertDocumentApi* | [**convert_document_msg_to_jpg**](docs/ConvertDocumentApi.md#convert_document_msg_to_jpg) | **POST** /convert/msg/to/jpg | Convert Email MSG file to JPG/JPEG image array
  *ConvertDocumentApi* | [**convert_document_msg_to_pdf**](docs/ConvertDocumentApi.md#convert_document_msg_to_pdf) | **POST** /convert/msg/to/pdf | Convert Email MSG file to PDF document
  *ConvertDocumentApi* | [**convert_document_msg_to_png**](docs/ConvertDocumentApi.md#convert_document_msg_to_png) | **POST** /convert/msg/to/png | Convert Email MSG file to PNG image array
  *ConvertDocumentApi* | [**convert_document_odp_to_jpg**](docs/ConvertDocumentApi.md#convert_document_odp_to_jpg) | **POST** /convert/odp/to/jpg | Convert ODP Presentation to JPG/JPEG image array
  *ConvertDocumentApi* | [**convert_document_odp_to_pdf**](docs/ConvertDocumentApi.md#convert_document_odp_to_pdf) | **POST** /convert/odp/to/pdf | Convert ODP Presentation to PDF
  *ConvertDocumentApi* | [**convert_document_odp_to_png**](docs/ConvertDocumentApi.md#convert_document_odp_to_png) | **POST** /convert/odp/to/png | Convert ODP Presentation to PNG image array
  *ConvertDocumentApi* | [**convert_document_odp_to_pptx**](docs/ConvertDocumentApi.md#convert_document_odp_to_pptx) | **POST** /convert/odp/to/pptx | Convert ODP Presentation to PPTX
  *ConvertDocumentApi* | [**convert_document_ods_to_jpg**](docs/ConvertDocumentApi.md#convert_document_ods_to_jpg) | **POST** /convert/ods/to/jpg | Convert ODS Spreadsheet to JPG/JPEG image array
  *ConvertDocumentApi* | [**convert_document_ods_to_pdf**](docs/ConvertDocumentApi.md#convert_document_ods_to_pdf) | **POST** /convert/ods/to/pdf | Convert ODS Spreadsheet to PDF
  *ConvertDocumentApi* | [**convert_document_ods_to_png**](docs/ConvertDocumentApi.md#convert_document_ods_to_png) | **POST** /convert/ods/to/png | Convert ODS Spreadsheet to PNG image array
  *ConvertDocumentApi* | [**convert_document_ods_to_xlsx**](docs/ConvertDocumentApi.md#convert_document_ods_to_xlsx) | **POST** /convert/ods/to/xlsx | Convert ODS Spreadsheet to XLSX
  *ConvertDocumentApi* | [**convert_document_odt_to_docx**](docs/ConvertDocumentApi.md#convert_document_odt_to_docx) | **POST** /convert/odt/to/docx | Convert ODT Text File to Word DOCX
  *ConvertDocumentApi* | [**convert_document_odt_to_jpg**](docs/ConvertDocumentApi.md#convert_document_odt_to_jpg) | **POST** /convert/odt/to/jpg | Convert ODT Text File to JPG/JPEG image array
  *ConvertDocumentApi* | [**convert_document_odt_to_pdf**](docs/ConvertDocumentApi.md#convert_document_odt_to_pdf) | **POST** /convert/odt/to/pdf | Convert ODT Text File to PDF
  *ConvertDocumentApi* | [**convert_document_odt_to_png**](docs/ConvertDocumentApi.md#convert_document_odt_to_png) | **POST** /convert/odt/to/png | Convert ODT Text File to PNG image array
  *ConvertDocumentApi* | [**convert_document_pdf_to_docx**](docs/ConvertDocumentApi.md#convert_document_pdf_to_docx) | **POST** /convert/pdf/to/docx | Convert PDF to Word DOCX Document
  *ConvertDocumentApi* | [**convert_document_pdf_to_docx_rasterize**](docs/ConvertDocumentApi.md#convert_document_pdf_to_docx_rasterize) | **POST** /convert/pdf/to/docx/rasterize | Convert PDF to Word DOCX Document based on rasterized version of the PDF
  *ConvertDocumentApi* | [**convert_document_pdf_to_jpg**](docs/ConvertDocumentApi.md#convert_document_pdf_to_jpg) | **POST** /convert/pdf/to/jpg | Convert PDF to JPG/JPEG image array
  *ConvertDocumentApi* | [**convert_document_pdf_to_png_array**](docs/ConvertDocumentApi.md#convert_document_pdf_to_png_array) | **POST** /convert/pdf/to/png | Convert PDF to PNG Image Array
  *ConvertDocumentApi* | [**convert_document_pdf_to_png_array_direct**](docs/ConvertDocumentApi.md#convert_document_pdf_to_png_array_direct) | **POST** /convert/pdf/to/png/direct | Convert PDF to PNG Image Array (Direct)
  *ConvertDocumentApi* | [**convert_document_pdf_to_png_single**](docs/ConvertDocumentApi.md#convert_document_pdf_to_png_single) | **POST** /convert/pdf/to/png/merge-single | Convert PDF to Single PNG image
  *ConvertDocumentApi* | [**convert_document_pdf_to_pptx**](docs/ConvertDocumentApi.md#convert_document_pdf_to_pptx) | **POST** /convert/pdf/to/pptx | Convert PDF to PowerPoint PPTX Presentation
  *ConvertDocumentApi* | [**convert_document_pdf_to_tiff**](docs/ConvertDocumentApi.md#convert_document_pdf_to_tiff) | **POST** /convert/pdf/to/tiff | Convert PDF to TIFF image
  *ConvertDocumentApi* | [**convert_document_pdf_to_txt**](docs/ConvertDocumentApi.md#convert_document_pdf_to_txt) | **POST** /convert/pdf/to/txt | Convert PDF Document to Text (txt)
  *ConvertDocumentApi* | [**convert_document_png_array_to_pdf**](docs/ConvertDocumentApi.md#convert_document_png_array_to_pdf) | **POST** /convert/png/to/pdf | Convert PNG Array to PDF
  *ConvertDocumentApi* | [**convert_document_png_array_to_pdf_flatten_transparency**](docs/ConvertDocumentApi.md#convert_document_png_array_to_pdf_flatten_transparency) | **POST** /convert/png/to/pdf/remove-transparency | Convert PNG Array to PDF and remove transparency
  *ConvertDocumentApi* | [**convert_document_ppt_to_pdf**](docs/ConvertDocumentApi.md#convert_document_ppt_to_pdf) | **POST** /convert/ppt/to/pdf | Convert PowerPoint PPT (97-03) Presentation to PDF
  *ConvertDocumentApi* | [**convert_document_ppt_to_pptx**](docs/ConvertDocumentApi.md#convert_document_ppt_to_pptx) | **POST** /convert/ppt/to/pptx | Convert PowerPoint PPT (97-03) Presentation to PPTX
  *ConvertDocumentApi* | [**convert_document_pptx_to_pdf**](docs/ConvertDocumentApi.md#convert_document_pptx_to_pdf) | **POST** /convert/pptx/to/pdf | Convert PowerPoint PPTX Presentation to PDF
  *ConvertDocumentApi* | [**convert_document_pptx_to_png**](docs/ConvertDocumentApi.md#convert_document_pptx_to_png) | **POST** /convert/pptx/to/png | Convert PowerPoint PPTX to PNG image array
  *ConvertDocumentApi* | [**convert_document_pptx_to_ppt**](docs/ConvertDocumentApi.md#convert_document_pptx_to_ppt) | **POST** /convert/pptx/to/ppt | Convert PowerPoint PPTX presentation to Legacy PowerPoint PPT (97-03)
  *ConvertDocumentApi* | [**convert_document_pptx_to_txt**](docs/ConvertDocumentApi.md#convert_document_pptx_to_txt) | **POST** /convert/pptx/to/txt | Convert PowerPoint PPTX Presentation to Text (txt)
  *ConvertDocumentApi* | [**convert_document_rtf_to_docx**](docs/ConvertDocumentApi.md#convert_document_rtf_to_docx) | **POST** /convert/rtf/to/docx | Convert Rich Text Format RTF to DOCX Document
  *ConvertDocumentApi* | [**convert_document_rtf_to_html**](docs/ConvertDocumentApi.md#convert_document_rtf_to_html) | **POST** /convert/rtf/to/html | Convert Rich Text Format RTF to HTML Document
  *ConvertDocumentApi* | [**convert_document_rtf_to_jpg**](docs/ConvertDocumentApi.md#convert_document_rtf_to_jpg) | **POST** /convert/rtf/to/jpg | Convert Rich Text Format RTF to JPG/JPEG image array
  *ConvertDocumentApi* | [**convert_document_rtf_to_pdf**](docs/ConvertDocumentApi.md#convert_document_rtf_to_pdf) | **POST** /convert/rtf/to/pdf | Convert Rich Text Format RTF to PDF
  *ConvertDocumentApi* | [**convert_document_rtf_to_png**](docs/ConvertDocumentApi.md#convert_document_rtf_to_png) | **POST** /convert/rtf/to/png | Convert Rich Text Format RTF to PNG image array
  *ConvertDocumentApi* | [**convert_document_txt_to_pdf**](docs/ConvertDocumentApi.md#convert_document_txt_to_pdf) | **POST** /convert/txt/to/pdf | Convert TXT text file to PDF Document
  *ConvertDocumentApi* | [**convert_document_xls_to_csv**](docs/ConvertDocumentApi.md#convert_document_xls_to_csv) | **POST** /convert/xls/to/csv | Convert Excel XLS (97-03) Spreadsheet to CSV
  *ConvertDocumentApi* | [**convert_document_xls_to_pdf**](docs/ConvertDocumentApi.md#convert_document_xls_to_pdf) | **POST** /convert/xls/to/pdf | Convert Excel XLS (97-03) Spreadsheet to PDF
  *ConvertDocumentApi* | [**convert_document_xls_to_xlsx**](docs/ConvertDocumentApi.md#convert_document_xls_to_xlsx) | **POST** /convert/xls/to/xlsx | Convert Excel XLS (97-03) Spreadsheet to XLSX
  *ConvertDocumentApi* | [**convert_document_xlsx_to_csv**](docs/ConvertDocumentApi.md#convert_document_xlsx_to_csv) | **POST** /convert/xlsx/to/csv | Convert Excel XLSX Spreadsheet to CSV, Single Worksheet
  *ConvertDocumentApi* | [**convert_document_xlsx_to_csv_multi**](docs/ConvertDocumentApi.md#convert_document_xlsx_to_csv_multi) | **POST** /convert/xlsx/to/csv/multi | Convert Excel XLSX Spreadsheet to CSV, Multiple Worksheets
  *ConvertDocumentApi* | [**convert_document_xlsx_to_html**](docs/ConvertDocumentApi.md#convert_document_xlsx_to_html) | **POST** /convert/xlsx/to/html | Convert Excel XLSX Spreadsheet to HTML Document
  *ConvertDocumentApi* | [**convert_document_xlsx_to_pdf**](docs/ConvertDocumentApi.md#convert_document_xlsx_to_pdf) | **POST** /convert/xlsx/to/pdf | Convert Excel XLSX Spreadsheet to PDF
  *ConvertDocumentApi* | [**convert_document_xlsx_to_png**](docs/ConvertDocumentApi.md#convert_document_xlsx_to_png) | **POST** /convert/xlsx/to/png | Convert Excel XLSX spreadsheet to PNG image array
  *ConvertDocumentApi* | [**convert_document_xlsx_to_txt**](docs/ConvertDocumentApi.md#convert_document_xlsx_to_txt) | **POST** /convert/xlsx/to/txt | Convert Excel XLSX Spreadsheet to Text (txt)
  *ConvertDocumentApi* | [**convert_document_xlsx_to_xls**](docs/ConvertDocumentApi.md#convert_document_xlsx_to_xls) | **POST** /convert/xlsx/to/xls | Convert Excel XLSX Spreadsheet to Legacy Excel XLS (97-03)
  *ConvertImageApi* | [**convert_image_get_image_info**](docs/ConvertImageApi.md#convert_image_get_image_info) | **POST** /convert/image/get-info | Get information about an image
  *ConvertImageApi* | [**convert_image_image_format_convert**](docs/ConvertImageApi.md#convert_image_image_format_convert) | **POST** /convert/image/{format1}/to/{format2} | Image format conversion
  *ConvertImageApi* | [**convert_image_image_set_dpi**](docs/ConvertImageApi.md#convert_image_image_set_dpi) | **POST** /convert/image/set-dpi/{dpi} | Change image DPI
  *ConvertImageApi* | [**convert_image_multipage_image_format_convert**](docs/ConvertImageApi.md#convert_image_multipage_image_format_convert) | **POST** /convert/image-multipage/{format1}/to/{format2} | Multi-page image format conversion
  *ConvertTemplateApi* | [**convert_template_apply_docx_template**](docs/ConvertTemplateApi.md#convert_template_apply_docx_template) | **POST** /convert/template/docx/apply | Apply Word DOCX template
  *ConvertTemplateApi* | [**convert_template_apply_html_template**](docs/ConvertTemplateApi.md#convert_template_apply_html_template) | **POST** /convert/template/html/apply | Apply HTML template
  *ConvertWebApi* | [**convert_web_html_to_docx**](docs/ConvertWebApi.md#convert_web_html_to_docx) | **POST** /convert/html/to/docx | Convert HTML to Word DOCX Document
  *ConvertWebApi* | [**convert_web_html_to_pdf**](docs/ConvertWebApi.md#convert_web_html_to_pdf) | **POST** /convert/web/html/to/pdf | Convert HTML string to PDF
  *ConvertWebApi* | [**convert_web_html_to_png**](docs/ConvertWebApi.md#convert_web_html_to_png) | **POST** /convert/web/html/to/png | Convert HTML string to PNG screenshot
  *ConvertWebApi* | [**convert_web_html_to_txt**](docs/ConvertWebApi.md#convert_web_html_to_txt) | **POST** /convert/web/html/to/txt | Convert HTML string to text (txt)
  *ConvertWebApi* | [**convert_web_md_to_html**](docs/ConvertWebApi.md#convert_web_md_to_html) | **POST** /convert/web/md/to/html | Convert Markdown to HTML
  *ConvertWebApi* | [**convert_web_url_to_pdf**](docs/ConvertWebApi.md#convert_web_url_to_pdf) | **POST** /convert/web/url/to/pdf | Convert a URL to PDF
  *ConvertWebApi* | [**convert_web_url_to_screenshot**](docs/ConvertWebApi.md#convert_web_url_to_screenshot) | **POST** /convert/web/url/to/screenshot | Take screenshot of URL
  *ConvertWebApi* | [**convert_web_url_to_txt**](docs/ConvertWebApi.md#convert_web_url_to_txt) | **POST** /convert/web/url/to/txt | Convert website URL page to text (txt)
  *EditDocumentApi* | [**edit_document_begin_editing**](docs/EditDocumentApi.md#edit_document_begin_editing) | **POST** /convert/edit/begin-editing | Begin editing a document
  *EditDocumentApi* | [**edit_document_docx_accept_all_track_changes**](docs/EditDocumentApi.md#edit_document_docx_accept_all_track_changes) | **POST** /convert/edit/docx/track-changes/accept-all | Accept all tracked changes, revisions in a Word DOCX document
  *EditDocumentApi* | [**edit_document_docx_body**](docs/EditDocumentApi.md#edit_document_docx_body) | **POST** /convert/edit/docx/get-body | Get body from a Word DOCX document
  *EditDocumentApi* | [**edit_document_docx_create_blank_document**](docs/EditDocumentApi.md#edit_document_docx_create_blank_document) | **POST** /convert/edit/docx/create/blank | Create a blank Word DOCX document
  *EditDocumentApi* | [**edit_document_docx_delete_pages**](docs/EditDocumentApi.md#edit_document_docx_delete_pages) | **POST** /convert/edit/docx/delete-pages | Delete, remove pages from a Word DOCX document
  *EditDocumentApi* | [**edit_document_docx_delete_table_row**](docs/EditDocumentApi.md#edit_document_docx_delete_table_row) | **POST** /convert/edit/docx/delete-table-row | Deletes a table row in an existing table in a Word DOCX document
  *EditDocumentApi* | [**edit_document_docx_delete_table_row_range**](docs/EditDocumentApi.md#edit_document_docx_delete_table_row_range) | **POST** /convert/edit/docx/delete-table-row/range | Deletes a range of multiple table rows in an existing table in a Word DOCX document
  *EditDocumentApi* | [**edit_document_docx_disable_track_changes**](docs/EditDocumentApi.md#edit_document_docx_disable_track_changes) | **POST** /convert/edit/docx/track-changes/disable | Disable track changes, revisions in a Word DOCX document
  *EditDocumentApi* | [**edit_document_docx_enable_track_changes**](docs/EditDocumentApi.md#edit_document_docx_enable_track_changes) | **POST** /convert/edit/docx/track-changes/enable | Enable track changes, revisions in a Word DOCX document
  *EditDocumentApi* | [**edit_document_docx_find_paragraph**](docs/EditDocumentApi.md#edit_document_docx_find_paragraph) | **POST** /convert/edit/docx/find/paragraph | Find matching paragraphs in a Word DOCX document
  *EditDocumentApi* | [**edit_document_docx_get_comments**](docs/EditDocumentApi.md#edit_document_docx_get_comments) | **POST** /convert/edit/docx/get-comments/flat-list | Get comments from a Word DOCX document as a flat list
  *EditDocumentApi* | [**edit_document_docx_get_comments_hierarchical**](docs/EditDocumentApi.md#edit_document_docx_get_comments_hierarchical) | **POST** /convert/edit/docx/get-comments/hierarchical | Get comments from a Word DOCX document hierarchically
  *EditDocumentApi* | [**edit_document_docx_get_content_controls**](docs/EditDocumentApi.md#edit_document_docx_get_content_controls) | **POST** /convert/edit/docx/get-content-controls | Get all content controls (form fields) and values in a Word DOCX document
  *EditDocumentApi* | [**edit_document_docx_get_form_fields**](docs/EditDocumentApi.md#edit_document_docx_get_form_fields) | **POST** /convert/edit/docx/get-form-fields | Get all form fields in a Word DOCX document
  *EditDocumentApi* | [**edit_document_docx_get_headers_and_footers**](docs/EditDocumentApi.md#edit_document_docx_get_headers_and_footers) | **POST** /convert/edit/docx/get-headers-and-footers | Get content of a footer from a Word DOCX document
  *EditDocumentApi* | [**edit_document_docx_get_images**](docs/EditDocumentApi.md#edit_document_docx_get_images) | **POST** /convert/edit/docx/get-images | Get images from a Word DOCX document
  *EditDocumentApi* | [**edit_document_docx_get_macro_information**](docs/EditDocumentApi.md#edit_document_docx_get_macro_information) | **POST** /convert/edit/docx/get-macros | Get macro information from a Word DOCX/DOCM document
  *EditDocumentApi* | [**edit_document_docx_get_metadata_properties**](docs/EditDocumentApi.md#edit_document_docx_get_metadata_properties) | **POST** /convert/edit/docx/get-metadata | Get all metadata properties in Word DOCX document
  *EditDocumentApi* | [**edit_document_docx_get_sections**](docs/EditDocumentApi.md#edit_document_docx_get_sections) | **POST** /convert/edit/docx/get-sections | Get sections from a Word DOCX document
  *EditDocumentApi* | [**edit_document_docx_get_styles**](docs/EditDocumentApi.md#edit_document_docx_get_styles) | **POST** /convert/edit/docx/get-styles | Get styles from a Word DOCX document
  *EditDocumentApi* | [**edit_document_docx_get_table_by_index**](docs/EditDocumentApi.md#edit_document_docx_get_table_by_index) | **POST** /convert/edit/docx/get-table/by-index | Get a specific table by index in a Word DOCX document
  *EditDocumentApi* | [**edit_document_docx_get_table_row**](docs/EditDocumentApi.md#edit_document_docx_get_table_row) | **POST** /convert/edit/docx/get-table-row | Gets the contents of an existing table row in an existing table in a Word DOCX document
  *EditDocumentApi* | [**edit_document_docx_get_tables**](docs/EditDocumentApi.md#edit_document_docx_get_tables) | **POST** /convert/edit/docx/get-tables | Get all tables in Word DOCX document
  *EditDocumentApi* | [**edit_document_docx_insert_comment_on_paragraph**](docs/EditDocumentApi.md#edit_document_docx_insert_comment_on_paragraph) | **POST** /convert/edit/docx/insert-comment/on/paragraph | Insert a new comment into a Word DOCX document attached to a paragraph
  *EditDocumentApi* | [**edit_document_docx_insert_image**](docs/EditDocumentApi.md#edit_document_docx_insert_image) | **POST** /convert/edit/docx/insert-image | Insert image into a Word DOCX document
  *EditDocumentApi* | [**edit_document_docx_insert_paragraph**](docs/EditDocumentApi.md#edit_document_docx_insert_paragraph) | **POST** /convert/edit/docx/insert-paragraph | Insert a new paragraph into a Word DOCX document
  *EditDocumentApi* | [**edit_document_docx_insert_table**](docs/EditDocumentApi.md#edit_document_docx_insert_table) | **POST** /convert/edit/docx/insert-table | Insert a new table into a Word DOCX document
  *EditDocumentApi* | [**edit_document_docx_insert_table_row**](docs/EditDocumentApi.md#edit_document_docx_insert_table_row) | **POST** /convert/edit/docx/insert-table-row | Insert a new row into an existing table in a Word DOCX document
  *EditDocumentApi* | [**edit_document_docx_pages**](docs/EditDocumentApi.md#edit_document_docx_pages) | **POST** /convert/edit/docx/get-pages | Get pages and content from a Word DOCX document
  *EditDocumentApi* | [**edit_document_docx_remove_all_comments**](docs/EditDocumentApi.md#edit_document_docx_remove_all_comments) | **POST** /convert/edit/docx/comments/remove-all | Remove all comments from a Word DOCX document
  *EditDocumentApi* | [**edit_document_docx_remove_headers_and_footers**](docs/EditDocumentApi.md#edit_document_docx_remove_headers_and_footers) | **POST** /convert/edit/docx/remove-headers-and-footers | Remove headers and footers from Word DOCX document
  *EditDocumentApi* | [**edit_document_docx_remove_object**](docs/EditDocumentApi.md#edit_document_docx_remove_object) | **POST** /convert/edit/docx/remove-object | Delete any object in a Word DOCX document
  *EditDocumentApi* | [**edit_document_docx_replace**](docs/EditDocumentApi.md#edit_document_docx_replace) | **POST** /convert/edit/docx/replace-all | Replace string in Word DOCX document
  *EditDocumentApi* | [**edit_document_docx_replace_multi**](docs/EditDocumentApi.md#edit_document_docx_replace_multi) | **POST** /convert/edit/docx/replace-all/multi | Replace multiple strings in Word DOCX document, return result
  *EditDocumentApi* | [**edit_document_docx_replace_multi_edit_session**](docs/EditDocumentApi.md#edit_document_docx_replace_multi_edit_session) | **POST** /convert/edit/docx/replace-all/multi/edit-session | Replace multiple strings in Word DOCX document, return edit session
  *EditDocumentApi* | [**edit_document_docx_replace_paragraph**](docs/EditDocumentApi.md#edit_document_docx_replace_paragraph) | **POST** /convert/edit/docx/replace/paragraph | Replace matching paragraphs in a Word DOCX document
  *EditDocumentApi* | [**edit_document_docx_set_custom_metadata_properties**](docs/EditDocumentApi.md#edit_document_docx_set_custom_metadata_properties) | **POST** /convert/edit/docx/set-metadata/custom-property | Set custom property metadata properties in Word DOCX document
  *EditDocumentApi* | [**edit_document_docx_set_footer**](docs/EditDocumentApi.md#edit_document_docx_set_footer) | **POST** /convert/edit/docx/set-footer | Set the footer in a Word DOCX document
  *EditDocumentApi* | [**edit_document_docx_set_footer_add_page_number**](docs/EditDocumentApi.md#edit_document_docx_set_footer_add_page_number) | **POST** /convert/edit/docx/set-footer/add-page-number | Add page number to footer in a Word DOCX document
  *EditDocumentApi* | [**edit_document_docx_set_form_fields**](docs/EditDocumentApi.md#edit_document_docx_set_form_fields) | **POST** /convert/edit/docx/set-form-fields | Set and fill values for form fields in a Word DOCX document
  *EditDocumentApi* | [**edit_document_docx_set_header**](docs/EditDocumentApi.md#edit_document_docx_set_header) | **POST** /convert/edit/docx/set-header | Set the header in a Word DOCX document
  *EditDocumentApi* | [**edit_document_docx_update_table_cell**](docs/EditDocumentApi.md#edit_document_docx_update_table_cell) | **POST** /convert/edit/docx/update-table-cell | Update, set contents of a table cell in an existing table in a Word DOCX document
  *EditDocumentApi* | [**edit_document_docx_update_table_row**](docs/EditDocumentApi.md#edit_document_docx_update_table_row) | **POST** /convert/edit/docx/update-table-row | Update, set contents of a table row in an existing table in a Word DOCX document
  *EditDocumentApi* | [**edit_document_finish_editing**](docs/EditDocumentApi.md#edit_document_finish_editing) | **POST** /convert/edit/finish-editing | Finish editing document, and download result from document editing
  *EditDocumentApi* | [**edit_document_pptx_delete_slides**](docs/EditDocumentApi.md#edit_document_pptx_delete_slides) | **POST** /convert/edit/pptx/delete-slides | Delete, remove slides from a PowerPoint PPTX presentation document
  *EditDocumentApi* | [**edit_document_pptx_edit_size_and_orientation**](docs/EditDocumentApi.md#edit_document_pptx_edit_size_and_orientation) | **POST** /convert/edit/pptx/set-size-and-orientation | Set the size and/or orientation of a PowerPoint PPTX presentation document
  *EditDocumentApi* | [**edit_document_pptx_get_macro_information**](docs/EditDocumentApi.md#edit_document_pptx_get_macro_information) | **POST** /convert/edit/pptx/get-macros | Get macro information from a PowerPoint PPTX/PPTM presentation document
  *EditDocumentApi* | [**edit_document_pptx_get_size_and_orientation**](docs/EditDocumentApi.md#edit_document_pptx_get_size_and_orientation) | **POST** /convert/edit/pptx/get-size-and-orientation | Get the page layout information, including size and orientation of a PowerPoint PPTX presentation document
  *EditDocumentApi* | [**edit_document_pptx_replace**](docs/EditDocumentApi.md#edit_document_pptx_replace) | **POST** /convert/edit/pptx/replace-all | Replace string in PowerPoint PPTX presentation
  *EditDocumentApi* | [**edit_document_xlsx_append_row**](docs/EditDocumentApi.md#edit_document_xlsx_append_row) | **POST** /convert/edit/xlsx/append-row | Append row to a Excel XLSX spreadsheet, worksheet
  *EditDocumentApi* | [**edit_document_xlsx_clear_cell_by_index**](docs/EditDocumentApi.md#edit_document_xlsx_clear_cell_by_index) | **POST** /convert/edit/xlsx/clear-cell/by-index | Clear cell contents in an Excel XLSX spreadsheet, worksheet by index
  *EditDocumentApi* | [**edit_document_xlsx_clear_row**](docs/EditDocumentApi.md#edit_document_xlsx_clear_row) | **POST** /convert/edit/xlsx/clear-row | Clear row from a Excel XLSX spreadsheet, worksheet
  *EditDocumentApi* | [**edit_document_xlsx_create_blank_spreadsheet**](docs/EditDocumentApi.md#edit_document_xlsx_create_blank_spreadsheet) | **POST** /convert/edit/xlsx/create/blank | Create a blank Excel XLSX spreadsheet
  *EditDocumentApi* | [**edit_document_xlsx_create_spreadsheet_from_data**](docs/EditDocumentApi.md#edit_document_xlsx_create_spreadsheet_from_data) | **POST** /convert/edit/xlsx/create/from/data | Create a new Excel XLSX spreadsheet from column and row data
  *EditDocumentApi* | [**edit_document_xlsx_delete_worksheet**](docs/EditDocumentApi.md#edit_document_xlsx_delete_worksheet) | **POST** /convert/edit/xlsx/delete-worksheet | Delete, remove worksheet from an Excel XLSX spreadsheet document
  *EditDocumentApi* | [**edit_document_xlsx_disable_shared_workbook**](docs/EditDocumentApi.md#edit_document_xlsx_disable_shared_workbook) | **POST** /convert/edit/xlsx/configuration/disable-shared-workbook | Disable Shared Workbook (legacy) in Excel XLSX spreadsheet
  *EditDocumentApi* | [**edit_document_xlsx_enable_shared_workbook**](docs/EditDocumentApi.md#edit_document_xlsx_enable_shared_workbook) | **POST** /convert/edit/xlsx/configuration/enable-shared-workbook | Enable Shared Workbook (legacy) in Excel XLSX spreadsheet
  *EditDocumentApi* | [**edit_document_xlsx_get_cell_by_identifier**](docs/EditDocumentApi.md#edit_document_xlsx_get_cell_by_identifier) | **POST** /convert/edit/xlsx/get-cell/by-identifier | Get cell from an Excel XLSX spreadsheet, worksheet by cell identifier
  *EditDocumentApi* | [**edit_document_xlsx_get_cell_by_index**](docs/EditDocumentApi.md#edit_document_xlsx_get_cell_by_index) | **POST** /convert/edit/xlsx/get-cell/by-index | Get cell from an Excel XLSX spreadsheet, worksheet by index
  *EditDocumentApi* | [**edit_document_xlsx_get_columns**](docs/EditDocumentApi.md#edit_document_xlsx_get_columns) | **POST** /convert/edit/xlsx/get-columns | Get columns from a Excel XLSX spreadsheet, worksheet
  *EditDocumentApi* | [**edit_document_xlsx_get_images**](docs/EditDocumentApi.md#edit_document_xlsx_get_images) | **POST** /convert/edit/xlsx/get-images | Get images from a Excel XLSX spreadsheet, worksheet
  *EditDocumentApi* | [**edit_document_xlsx_get_macro_information**](docs/EditDocumentApi.md#edit_document_xlsx_get_macro_information) | **POST** /convert/edit/xlsx/get-macros | Get macro information from a Excel XLSX/XLSM spreadsheet, worksheet
  *EditDocumentApi* | [**edit_document_xlsx_get_rows_and_cells**](docs/EditDocumentApi.md#edit_document_xlsx_get_rows_and_cells) | **POST** /convert/edit/xlsx/get-rows-and-cells | Get rows and cells from a Excel XLSX spreadsheet, worksheet
  *EditDocumentApi* | [**edit_document_xlsx_get_specific_row**](docs/EditDocumentApi.md#edit_document_xlsx_get_specific_row) | **POST** /convert/edit/xlsx/get-specific-row | Get a specific row from a Excel XLSX spreadsheet, worksheet by path
  *EditDocumentApi* | [**edit_document_xlsx_get_styles**](docs/EditDocumentApi.md#edit_document_xlsx_get_styles) | **POST** /convert/edit/xlsx/get-styles | Get styles from a Excel XLSX spreadsheet, worksheet
  *EditDocumentApi* | [**edit_document_xlsx_get_worksheets**](docs/EditDocumentApi.md#edit_document_xlsx_get_worksheets) | **POST** /convert/edit/xlsx/get-worksheets | Get worksheets from a Excel XLSX spreadsheet
  *EditDocumentApi* | [**edit_document_xlsx_insert_worksheet**](docs/EditDocumentApi.md#edit_document_xlsx_insert_worksheet) | **POST** /convert/edit/xlsx/insert-worksheet | Insert a new worksheet into an Excel XLSX spreadsheet
  *EditDocumentApi* | [**edit_document_xlsx_rename_worksheet**](docs/EditDocumentApi.md#edit_document_xlsx_rename_worksheet) | **POST** /convert/edit/xlsx/rename-worksheet | Rename a specific worksheet in a Excel XLSX spreadsheet
  *EditDocumentApi* | [**edit_document_xlsx_set_cell_by_identifier**](docs/EditDocumentApi.md#edit_document_xlsx_set_cell_by_identifier) | **POST** /convert/edit/xlsx/set-cell/by-identifier | Set, update cell contents in an Excel XLSX spreadsheet, worksheet by cell identifier
  *EditDocumentApi* | [**edit_document_xlsx_set_cell_by_index**](docs/EditDocumentApi.md#edit_document_xlsx_set_cell_by_index) | **POST** /convert/edit/xlsx/set-cell/by-index | Set, update cell contents in an Excel XLSX spreadsheet, worksheet by index
  *EditHtmlApi* | [**edit_html_html_append_header_tag**](docs/EditHtmlApi.md#edit_html_html_append_header_tag) | **POST** /convert/edit/html/head/append/tag | Append an HTML tag to the HEAD section of an HTML Document
  *EditHtmlApi* | [**edit_html_html_append_heading**](docs/EditHtmlApi.md#edit_html_html_append_heading) | **POST** /convert/edit/html/append/heading | Append a Heading to an HTML Document
  *EditHtmlApi* | [**edit_html_html_append_image_from_url**](docs/EditHtmlApi.md#edit_html_html_append_image_from_url) | **POST** /convert/edit/html/append/image/from-url | Append an Image to an HTML Document from a URL
  *EditHtmlApi* | [**edit_html_html_append_image_inline**](docs/EditHtmlApi.md#edit_html_html_append_image_inline) | **POST** /convert/edit/html/append/image/inline | Append a Base64 Inline Image to an HTML Document
  *EditHtmlApi* | [**edit_html_html_append_paragraph**](docs/EditHtmlApi.md#edit_html_html_append_paragraph) | **POST** /convert/edit/html/append/paragraph | Append a Paragraph to an HTML Document
  *EditHtmlApi* | [**edit_html_html_create_blank_document**](docs/EditHtmlApi.md#edit_html_html_create_blank_document) | **POST** /convert/edit/html/create/blank | Create a Blank HTML Document
  *EditHtmlApi* | [**edit_html_html_get_language**](docs/EditHtmlApi.md#edit_html_html_get_language) | **POST** /convert/edit/html/head/get/language | Gets the language for the HTML document
  *EditHtmlApi* | [**edit_html_html_get_links**](docs/EditHtmlApi.md#edit_html_html_get_links) | **POST** /convert/edit/html/extract/links | Extract resolved link URLs from HTML File
  *EditHtmlApi* | [**edit_html_html_get_rel_canonical**](docs/EditHtmlApi.md#edit_html_html_get_rel_canonical) | **POST** /convert/edit/html/head/get/rel-canonical-url | Gets the rel canonical URL for the HTML document
  *EditHtmlApi* | [**edit_html_html_get_sitemap**](docs/EditHtmlApi.md#edit_html_html_get_sitemap) | **POST** /convert/edit/html/head/get/sitemap-url | Gets the sitemap URL for the HTML document
  *EditHtmlApi* | [**edit_html_html_set_language**](docs/EditHtmlApi.md#edit_html_html_set_language) | **POST** /convert/edit/html/head/set/language | Sets the language for the HTML document
  *EditHtmlApi* | [**edit_html_html_set_rel_canonical**](docs/EditHtmlApi.md#edit_html_html_set_rel_canonical) | **POST** /convert/edit/html/head/set/rel-canonical-url | Sets the rel canonical URL for the HTML document
  *EditHtmlApi* | [**edit_html_html_set_sitemap_url**](docs/EditHtmlApi.md#edit_html_html_set_sitemap_url) | **POST** /convert/edit/html/head/set/sitemap-url | Sets the sitemap URL for the HTML document
  *EditPdfApi* | [**edit_pdf_add_annotations**](docs/EditPdfApi.md#edit_pdf_add_annotations) | **POST** /convert/edit/pdf/annotations/add-item | Add one or more PDF annotations, comments in the PDF document
  *EditPdfApi* | [**edit_pdf_convert_to_pdf_a**](docs/EditPdfApi.md#edit_pdf_convert_to_pdf_a) | **POST** /convert/edit/pdf/optimize/pdf-a | Convert a PDF file to PDF/A
  *EditPdfApi* | [**edit_pdf_decrypt**](docs/EditPdfApi.md#edit_pdf_decrypt) | **POST** /convert/edit/pdf/decrypt | Decrypt and password-protect a PDF
  *EditPdfApi* | [**edit_pdf_delete_pages**](docs/EditPdfApi.md#edit_pdf_delete_pages) | **POST** /convert/edit/pdf/pages/delete | Remove, delete pages from a PDF document
  *EditPdfApi* | [**edit_pdf_delete_pages_batch_job**](docs/EditPdfApi.md#edit_pdf_delete_pages_batch_job) | **POST** /convert/edit/pdf/pages/delete/batch-job | Remove, delete pages from a PDF document as Batch Job
  *EditPdfApi* | [**edit_pdf_encrypt**](docs/EditPdfApi.md#edit_pdf_encrypt) | **POST** /convert/edit/pdf/encrypt | Encrypt and password-protect a PDF
  *EditPdfApi* | [**edit_pdf_get_annotations**](docs/EditPdfApi.md#edit_pdf_get_annotations) | **POST** /convert/edit/pdf/annotations/list | Get PDF annotations, including comments in the document
  *EditPdfApi* | [**edit_pdf_get_async_job_status**](docs/EditPdfApi.md#edit_pdf_get_async_job_status) | **GET** /convert/edit/pdf/batch-job/status | Get the status and result of a PDF Batch Job
  *EditPdfApi* | [**edit_pdf_get_form_fields**](docs/EditPdfApi.md#edit_pdf_get_form_fields) | **POST** /convert/edit/pdf/form/get-fields | Gets PDF Form fields and values
  *EditPdfApi* | [**edit_pdf_get_metadata**](docs/EditPdfApi.md#edit_pdf_get_metadata) | **POST** /convert/edit/pdf/get-metadata | Get PDF document metadata
  *EditPdfApi* | [**edit_pdf_get_pdf_text_by_pages**](docs/EditPdfApi.md#edit_pdf_get_pdf_text_by_pages) | **POST** /convert/edit/pdf/pages/get-text | Get text in a PDF document by page
  *EditPdfApi* | [**edit_pdf_insert_pages**](docs/EditPdfApi.md#edit_pdf_insert_pages) | **POST** /convert/edit/pdf/pages/insert | Insert, copy pages from one PDF document into another
  *EditPdfApi* | [**edit_pdf_insert_pages_batch_job**](docs/EditPdfApi.md#edit_pdf_insert_pages_batch_job) | **POST** /convert/edit/pdf/pages/insert/batch-job | Insert, copy pages from one PDF document into another as a batch job
  *EditPdfApi* | [**edit_pdf_linearize**](docs/EditPdfApi.md#edit_pdf_linearize) | **POST** /convert/edit/pdf/optimize/linearize | Linearize and optimize a PDF for streaming download
  *EditPdfApi* | [**edit_pdf_rasterize**](docs/EditPdfApi.md#edit_pdf_rasterize) | **POST** /convert/edit/pdf/rasterize | Rasterize a PDF to an image-based PDF
  *EditPdfApi* | [**edit_pdf_rasterize_batch_job**](docs/EditPdfApi.md#edit_pdf_rasterize_batch_job) | **POST** /convert/edit/pdf/rasterize/batch-job | Rasterize a PDF to an image-based PDF as Batch Job
  *EditPdfApi* | [**edit_pdf_reduce_file_size**](docs/EditPdfApi.md#edit_pdf_reduce_file_size) | **POST** /convert/edit/pdf/optimize/reduce-file-size | Reduce the file size and optimize a PDF
  *EditPdfApi* | [**edit_pdf_remove_all_annotations**](docs/EditPdfApi.md#edit_pdf_remove_all_annotations) | **POST** /convert/edit/pdf/annotations/remove-all | Remove all PDF annotations, including comments in the document
  *EditPdfApi* | [**edit_pdf_remove_annotation_item**](docs/EditPdfApi.md#edit_pdf_remove_annotation_item) | **POST** /convert/edit/pdf/annotations/remove-item | Remove a specific PDF annotation, comment in the document
  *EditPdfApi* | [**edit_pdf_resize**](docs/EditPdfApi.md#edit_pdf_resize) | **POST** /convert/edit/pdf/resize | Change PDF Document&#39;s Paper Size
  *EditPdfApi* | [**edit_pdf_rotate_all_pages**](docs/EditPdfApi.md#edit_pdf_rotate_all_pages) | **POST** /convert/edit/pdf/pages/rotate/all | Rotate all pages in a PDF document
  *EditPdfApi* | [**edit_pdf_rotate_page_range**](docs/EditPdfApi.md#edit_pdf_rotate_page_range) | **POST** /convert/edit/pdf/pages/rotate/page-range | Rotate a range, subset of pages in a PDF document
  *EditPdfApi* | [**edit_pdf_set_form_fields**](docs/EditPdfApi.md#edit_pdf_set_form_fields) | **POST** /convert/edit/pdf/form/set-fields | Sets ands fills PDF Form field values
  *EditPdfApi* | [**edit_pdf_set_metadata**](docs/EditPdfApi.md#edit_pdf_set_metadata) | **POST** /convert/edit/pdf/set-metadata | Sets PDF document metadata
  *EditPdfApi* | [**edit_pdf_set_permissions**](docs/EditPdfApi.md#edit_pdf_set_permissions) | **POST** /convert/edit/pdf/encrypt/set-permissions | Encrypt, password-protect and set restricted permissions on a PDF
  *EditPdfApi* | [**edit_pdf_watermark_text**](docs/EditPdfApi.md#edit_pdf_watermark_text) | **POST** /convert/edit/pdf/watermark/text | Add a text watermark to a PDF
  *EditTextApi* | [**edit_text_base64_decode**](docs/EditTextApi.md#edit_text_base64_decode) | **POST** /convert/edit/text/encoding/base64/decode | Base 64 decode, convert base 64 string to binary content
  *EditTextApi* | [**edit_text_base64_detect**](docs/EditTextApi.md#edit_text_base64_detect) | **POST** /convert/edit/text/encoding/base64/detect | Detect, check if text string is base 64 encoded
  *EditTextApi* | [**edit_text_base64_encode**](docs/EditTextApi.md#edit_text_base64_encode) | **POST** /convert/edit/text/encoding/base64/encode | Base 64 encode, convert binary or file data to a text string
  *EditTextApi* | [**edit_text_change_line_endings**](docs/EditTextApi.md#edit_text_change_line_endings) | **POST** /convert/edit/text/line-endings/change | Set, change line endings of a text file
  *EditTextApi* | [**edit_text_detect_line_endings**](docs/EditTextApi.md#edit_text_detect_line_endings) | **POST** /convert/edit/text/line-endings/detect | Detect line endings of a text file
  *EditTextApi* | [**edit_text_find_regex**](docs/EditTextApi.md#edit_text_find_regex) | **POST** /convert/edit/text/find/regex | Find a regular expression regex in text input
  *EditTextApi* | [**edit_text_find_simple**](docs/EditTextApi.md#edit_text_find_simple) | **POST** /convert/edit/text/find/string | Find a string in text input
  *EditTextApi* | [**edit_text_remove_all_whitespace**](docs/EditTextApi.md#edit_text_remove_all_whitespace) | **POST** /convert/edit/text/remove/whitespace/all | Remove whitespace from text string
  *EditTextApi* | [**edit_text_remove_html**](docs/EditTextApi.md#edit_text_remove_html) | **POST** /convert/edit/text/remove/html | Remove HTML from text string
  *EditTextApi* | [**edit_text_replace_regex**](docs/EditTextApi.md#edit_text_replace_regex) | **POST** /convert/edit/text/replace/regex | Replace a string in text with a regex regular expression string
  *EditTextApi* | [**edit_text_replace_simple**](docs/EditTextApi.md#edit_text_replace_simple) | **POST** /convert/edit/text/replace/string | Replace a string in text with another string value
  *EditTextApi* | [**edit_text_text_encoding_detect**](docs/EditTextApi.md#edit_text_text_encoding_detect) | **POST** /convert/edit/text/encoding/detect | Detect text encoding of file
  *EditTextApi* | [**edit_text_trim_whitespace**](docs/EditTextApi.md#edit_text_trim_whitespace) | **POST** /convert/edit/text/remove/whitespace/trim | Trim leading and trailing whitespace from text string
  *MergeDocumentApi* | [**merge_document_batch_job_create**](docs/MergeDocumentApi.md#merge_document_batch_job_create) | **POST** /convert/merge/batch-job/create | Merge an array of Documents into a Single Document by Page as a Batch Job
  *MergeDocumentApi* | [**merge_document_docx**](docs/MergeDocumentApi.md#merge_document_docx) | **POST** /convert/merge/docx | Merge Two Word DOCX Together
  *MergeDocumentApi* | [**merge_document_docx_multi**](docs/MergeDocumentApi.md#merge_document_docx_multi) | **POST** /convert/merge/docx/multi | Merge Multple Word DOCX Together
  *MergeDocumentApi* | [**merge_document_docx_multi_array**](docs/MergeDocumentApi.md#merge_document_docx_multi_array) | **POST** /convert/merge/docx/multi/array | Merge Multple Word DOCX Together from an array
  *MergeDocumentApi* | [**merge_document_get_async_job_status**](docs/MergeDocumentApi.md#merge_document_get_async_job_status) | **GET** /convert/merge/batch-job/status | Get the status and result of a Merge Document Batch Job
  *MergeDocumentApi* | [**merge_document_html**](docs/MergeDocumentApi.md#merge_document_html) | **POST** /convert/merge/html | Merge Two HTML (HTM) Files Together
  *MergeDocumentApi* | [**merge_document_html_multi**](docs/MergeDocumentApi.md#merge_document_html_multi) | **POST** /convert/merge/html/multi | Merge Multple HTML (HTM) Files Together
  *MergeDocumentApi* | [**merge_document_html_multi_array**](docs/MergeDocumentApi.md#merge_document_html_multi_array) | **POST** /convert/merge/html/multi/array | Merge Multple HTML (HTM) Files Together from an array
  *MergeDocumentApi* | [**merge_document_pdf**](docs/MergeDocumentApi.md#merge_document_pdf) | **POST** /convert/merge/pdf | Merge Two PDF Files Together
  *MergeDocumentApi* | [**merge_document_pdf_multi**](docs/MergeDocumentApi.md#merge_document_pdf_multi) | **POST** /convert/merge/pdf/multi | Merge Multple PDF Files Together
  *MergeDocumentApi* | [**merge_document_pdf_multi_array**](docs/MergeDocumentApi.md#merge_document_pdf_multi_array) | **POST** /convert/merge/pdf/multi/array | Merge Multple PDF Files Together from an array
  *MergeDocumentApi* | [**merge_document_png**](docs/MergeDocumentApi.md#merge_document_png) | **POST** /convert/merge/png/vertical | Merge Two PNG Files Together
  *MergeDocumentApi* | [**merge_document_png_multi**](docs/MergeDocumentApi.md#merge_document_png_multi) | **POST** /convert/merge/png/vertical/multi | Merge Multple PNG Files Together
  *MergeDocumentApi* | [**merge_document_png_multi_array**](docs/MergeDocumentApi.md#merge_document_png_multi_array) | **POST** /convert/merge/png/vertical/multi/array | Merge Multple PNG Files Together from an array
  *MergeDocumentApi* | [**merge_document_pptx**](docs/MergeDocumentApi.md#merge_document_pptx) | **POST** /convert/merge/pptx | Merge Two PowerPoint PPTX Together
  *MergeDocumentApi* | [**merge_document_pptx_multi**](docs/MergeDocumentApi.md#merge_document_pptx_multi) | **POST** /convert/merge/pptx/multi | Merge Multple PowerPoint PPTX Together
  *MergeDocumentApi* | [**merge_document_pptx_multi_array**](docs/MergeDocumentApi.md#merge_document_pptx_multi_array) | **POST** /convert/merge/pptx/multi/array | Merge Multple PowerPoint PPTX Together from an array
  *MergeDocumentApi* | [**merge_document_txt**](docs/MergeDocumentApi.md#merge_document_txt) | **POST** /convert/merge/txt | Merge Two Text (TXT) Files Together
  *MergeDocumentApi* | [**merge_document_txt_multi**](docs/MergeDocumentApi.md#merge_document_txt_multi) | **POST** /convert/merge/txt/multi | Merge Multple Text (TXT) Files Together
  *MergeDocumentApi* | [**merge_document_xlsx**](docs/MergeDocumentApi.md#merge_document_xlsx) | **POST** /convert/merge/xlsx | Merge Two Excel XLSX Together
  *MergeDocumentApi* | [**merge_document_xlsx_multi**](docs/MergeDocumentApi.md#merge_document_xlsx_multi) | **POST** /convert/merge/xlsx/multi | Merge Multple Excel XLSX Together
  *MergeDocumentApi* | [**merge_document_xlsx_multi_array**](docs/MergeDocumentApi.md#merge_document_xlsx_multi_array) | **POST** /convert/merge/xlsx/multi/array | Merge Multple Excel XLSX Together from an Array
  *SplitDocumentApi* | [**split_document_batch_job_create**](docs/SplitDocumentApi.md#split_document_batch_job_create) | **POST** /convert/split/batch-job/create | Split a single Document into Separate Documents by Page as a Batch Job
  *SplitDocumentApi* | [**split_document_docx**](docs/SplitDocumentApi.md#split_document_docx) | **POST** /convert/split/docx | Split a single Word Document DOCX into Separate Documents by Page
  *SplitDocumentApi* | [**split_document_get_async_job_status**](docs/SplitDocumentApi.md#split_document_get_async_job_status) | **GET** /convert/split/batch-job/status | Get the status and result of a Split Document Batch Job
  *SplitDocumentApi* | [**split_document_pdf_by_page**](docs/SplitDocumentApi.md#split_document_pdf_by_page) | **POST** /convert/split/pdf | Split a PDF file into separate PDF files, one per page
  *SplitDocumentApi* | [**split_document_pptx**](docs/SplitDocumentApi.md#split_document_pptx) | **POST** /convert/split/pptx | Split a single PowerPoint Presentation PPTX into Separate Slides
  *SplitDocumentApi* | [**split_document_pptx_advanced**](docs/SplitDocumentApi.md#split_document_pptx_advanced) | **POST** /convert/split/pptx/advanced | Split a single PowerPoint Presentation PPTX into Separate Presentations
  *SplitDocumentApi* | [**split_document_txt_by_line**](docs/SplitDocumentApi.md#split_document_txt_by_line) | **POST** /convert/split/txt/by-line | Split a single Text file (txt) into lines
  *SplitDocumentApi* | [**split_document_txt_by_string**](docs/SplitDocumentApi.md#split_document_txt_by_string) | **POST** /convert/split/txt/by-string | Split a single Text file (txt) by a string delimiter
  *SplitDocumentApi* | [**split_document_xlsx**](docs/SplitDocumentApi.md#split_document_xlsx) | **POST** /convert/split/xlsx | Split a single Excel XLSX into Separate Worksheets
  *TransformDocumentApi* | [**transform_document_docx_replace**](docs/TransformDocumentApi.md#transform_document_docx_replace) | **POST** /convert/transform/docx/replace-all | Replace string in Word DOCX document, return result
  *TransformDocumentApi* | [**transform_document_docx_replace_edit_session**](docs/TransformDocumentApi.md#transform_document_docx_replace_edit_session) | **POST** /convert/transform/docx/replace-all/edit-session | Replace string in Word DOCX document, return edit session
  *TransformDocumentApi* | [**transform_document_docx_table_fill_in**](docs/TransformDocumentApi.md#transform_document_docx_table_fill_in) | **POST** /convert/transform/docx/table/fill/data | Fill in data in a table in a Word DOCX document, return result
  *TransformDocumentApi* | [**transform_document_docx_table_fill_in_edit_session**](docs/TransformDocumentApi.md#transform_document_docx_table_fill_in_edit_session) | **POST** /convert/transform/docx/table/fill/data/edit-session | Fill in data in a table in a Word DOCX document, return edit session
  *TransformDocumentApi* | [**transform_document_docx_table_fill_in_multi**](docs/TransformDocumentApi.md#transform_document_docx_table_fill_in_multi) | **POST** /convert/transform/docx/table/fill/data/multi | Fill in data in multiple tables in a Word DOCX document, return result
  *TransformDocumentApi* | [**transform_document_pptx_replace**](docs/TransformDocumentApi.md#transform_document_pptx_replace) | **POST** /convert/transform/pptx/replace-all | Replace string in PowerPoint PPTX presentation, return result
  *ValidateDocumentApi* | [**validate_document_autodetect_validation**](docs/ValidateDocumentApi.md#validate_document_autodetect_validation) | **POST** /convert/validate/autodetect | Autodetect content type and validate
  *ValidateDocumentApi* | [**validate_document_csv_validation**](docs/ValidateDocumentApi.md#validate_document_csv_validation) | **POST** /convert/validate/csv | Validate a CSV file document (CSV)
  *ValidateDocumentApi* | [**validate_document_doc_validation**](docs/ValidateDocumentApi.md#validate_document_doc_validation) | **POST** /convert/validate/doc | Validate a Word 97-2003 Legacy document (DOC)
  *ValidateDocumentApi* | [**validate_document_docx_repair**](docs/ValidateDocumentApi.md#validate_document_docx_repair) | **POST** /convert/validate/docx/repair | Repair a Word document (DOCX) that contains errors
  *ValidateDocumentApi* | [**validate_document_docx_validation**](docs/ValidateDocumentApi.md#validate_document_docx_validation) | **POST** /convert/validate/docx | Validate a Word document (DOCX)
  *ValidateDocumentApi* | [**validate_document_eml_validation**](docs/ValidateDocumentApi.md#validate_document_eml_validation) | **POST** /convert/validate/eml | Validate if input file is a valid EML file
  *ValidateDocumentApi* | [**validate_document_executable_validation**](docs/ValidateDocumentApi.md#validate_document_executable_validation) | **POST** /convert/validate/executable | Validate if a file is executable
  *ValidateDocumentApi* | [**validate_document_g_zip_validation**](docs/ValidateDocumentApi.md#validate_document_g_zip_validation) | **POST** /convert/validate/gzip | Validate a GZip Archive file (gzip or gz)
  *ValidateDocumentApi* | [**validate_document_html_ssrf_validation**](docs/ValidateDocumentApi.md#validate_document_html_ssrf_validation) | **POST** /convert/validate/html/ssrf-threat-check | Validate an HTML file and checks for SSRF threats
  *ValidateDocumentApi* | [**validate_document_html_validation**](docs/ValidateDocumentApi.md#validate_document_html_validation) | **POST** /convert/validate/html | Validate an HTML file
  *ValidateDocumentApi* | [**validate_document_image_validation**](docs/ValidateDocumentApi.md#validate_document_image_validation) | **POST** /convert/validate/image | Validate an Image File
  *ValidateDocumentApi* | [**validate_document_jpg_validation**](docs/ValidateDocumentApi.md#validate_document_jpg_validation) | **POST** /convert/validate/jpg | Validate a JPG File
  *ValidateDocumentApi* | [**validate_document_json_validation**](docs/ValidateDocumentApi.md#validate_document_json_validation) | **POST** /convert/validate/json | Validate a JSON file
  *ValidateDocumentApi* | [**validate_document_msg_validation**](docs/ValidateDocumentApi.md#validate_document_msg_validation) | **POST** /convert/validate/msg | Validate if input file is a valid MSG file
  *ValidateDocumentApi* | [**validate_document_pdf_validation**](docs/ValidateDocumentApi.md#validate_document_pdf_validation) | **POST** /convert/validate/pdf | Validate a PDF document file
  *ValidateDocumentApi* | [**validate_document_png_validation**](docs/ValidateDocumentApi.md#validate_document_png_validation) | **POST** /convert/validate/png | Validate a PNG File
  *ValidateDocumentApi* | [**validate_document_ppt_validation**](docs/ValidateDocumentApi.md#validate_document_ppt_validation) | **POST** /convert/validate/ppt | Validate a PowerPoint 97-2003 Legacy presentation (PPT)
  *ValidateDocumentApi* | [**validate_document_pptx_repair**](docs/ValidateDocumentApi.md#validate_document_pptx_repair) | **POST** /convert/validate/pptx/repair | Repair a PowerPoint presentation (PPTX) that contains errors
  *ValidateDocumentApi* | [**validate_document_pptx_validation**](docs/ValidateDocumentApi.md#validate_document_pptx_validation) | **POST** /convert/validate/pptx | Validate a PowerPoint presentation (PPTX)
  *ValidateDocumentApi* | [**validate_document_rar_validation**](docs/ValidateDocumentApi.md#validate_document_rar_validation) | **POST** /convert/validate/rar | Validate a RAR Archive file (RAR)
  *ValidateDocumentApi* | [**validate_document_rtf_validation**](docs/ValidateDocumentApi.md#validate_document_rtf_validation) | **POST** /convert/validate/rtf | Validate a Rich Text Format document (RTF)
  *ValidateDocumentApi* | [**validate_document_tar_validation**](docs/ValidateDocumentApi.md#validate_document_tar_validation) | **POST** /convert/validate/tar | Validate a TAR Tarball Archive file (TAR)
  *ValidateDocumentApi* | [**validate_document_txt_validation**](docs/ValidateDocumentApi.md#validate_document_txt_validation) | **POST** /convert/validate/txt | Validate an TXT file
  *ValidateDocumentApi* | [**validate_document_xls_validation**](docs/ValidateDocumentApi.md#validate_document_xls_validation) | **POST** /convert/validate/xls | Validate a Excel 97-2003 Legacy spreadsheet (XLS)
  *ValidateDocumentApi* | [**validate_document_xlsx_repair**](docs/ValidateDocumentApi.md#validate_document_xlsx_repair) | **POST** /convert/validate/xlsx/repair | Repair an Excel spreadsheet (XLSX) that contains errors
  *ValidateDocumentApi* | [**validate_document_xlsx_validation**](docs/ValidateDocumentApi.md#validate_document_xlsx_validation) | **POST** /convert/validate/xlsx | Validate a Excel document (XLSX)
  *ValidateDocumentApi* | [**validate_document_xml_validation**](docs/ValidateDocumentApi.md#validate_document_xml_validation) | **POST** /convert/validate/xml | Validate an XML file
  *ValidateDocumentApi* | [**validate_document_xml_xxe_threat_validation**](docs/ValidateDocumentApi.md#validate_document_xml_xxe_threat_validation) | **POST** /convert/validate/xml/xxe-threats | Validate an XML file for XML External Entity (XXE) threats
  *ValidateDocumentApi* | [**validate_document_zip_validation**](docs/ValidateDocumentApi.md#validate_document_zip_validation) | **POST** /convert/validate/zip | Validate a Zip Archive file (zip)
  *ViewerToolsApi* | [**viewer_tools_create_simple**](docs/ViewerToolsApi.md#viewer_tools_create_simple) | **POST** /convert/viewer/create/web/simple | Create a web-based viewer
  *ZipArchiveApi* | [**zip_archive_zip_create**](docs/ZipArchiveApi.md#zip_archive_zip_create) | **POST** /convert/archive/zip/create | Compress files to create a new zip archive
  *ZipArchiveApi* | [**zip_archive_zip_create_advanced**](docs/ZipArchiveApi.md#zip_archive_zip_create_advanced) | **POST** /convert/archive/zip/create/advanced | Compress files and folders to create a new zip archive with advanced options
  *ZipArchiveApi* | [**zip_archive_zip_create_encrypted**](docs/ZipArchiveApi.md#zip_archive_zip_create_encrypted) | **POST** /convert/archive/zip/create/encrypted | Compress files to create a new, encrypted and password-protected zip archive
  *ZipArchiveApi* | [**zip_archive_zip_create_quarantine**](docs/ZipArchiveApi.md#zip_archive_zip_create_quarantine) | **POST** /convert/archive/zip/create/quarantine | Create an encrypted zip file to quarantine a dangerous file
  *ZipArchiveApi* | [**zip_archive_zip_decrypt**](docs/ZipArchiveApi.md#zip_archive_zip_decrypt) | **POST** /convert/archive/zip/decrypt | Decrypt and remove password protection on a zip file
  *ZipArchiveApi* | [**zip_archive_zip_encrypt_advanced**](docs/ZipArchiveApi.md#zip_archive_zip_encrypt_advanced) | **POST** /convert/archive/zip/encrypt/advanced | Encrypt and password protect a zip file
  *ZipArchiveApi* | [**zip_archive_zip_extract**](docs/ZipArchiveApi.md#zip_archive_zip_extract) | **POST** /convert/archive/zip/extract | Extract, decompress files and folders from a zip archive

   - [AddPdfAnnotationRequest](docs/AddPdfAnnotationRequest.md)
   - [AlternateFileFormatCandidate](docs/AlternateFileFormatCandidate.md)
   - [AppendXlsxRowRequest](docs/AppendXlsxRowRequest.md)
   - [AppendXlsxRowResponse](docs/AppendXlsxRowResponse.md)
   - [AutodetectDocumentValidationResult](docs/AutodetectDocumentValidationResult.md)
   - [AutodetectGetInfoResult](docs/AutodetectGetInfoResult.md)
   - [AutodetectToJpgResult](docs/AutodetectToJpgResult.md)
   - [AutodetectToPngResult](docs/AutodetectToPngResult.md)
   - [AutodetectToThumbnailsResult](docs/AutodetectToThumbnailsResult.md)
   - [Base64DecodeRequest](docs/Base64DecodeRequest.md)
   - [Base64DecodeResponse](docs/Base64DecodeResponse.md)
   - [Base64DetectRequest](docs/Base64DetectRequest.md)
   - [Base64DetectResponse](docs/Base64DetectResponse.md)
   - [Base64EncodeRequest](docs/Base64EncodeRequest.md)
   - [Base64EncodeResponse](docs/Base64EncodeResponse.md)
   - [ChangeLineEndingResponse](docs/ChangeLineEndingResponse.md)
   - [ClearXlsxCellRequest](docs/ClearXlsxCellRequest.md)
   - [ClearXlsxCellResponse](docs/ClearXlsxCellResponse.md)
   - [ClearXlsxRowRequest](docs/ClearXlsxRowRequest.md)
   - [ClearXlsxRowResponse](docs/ClearXlsxRowResponse.md)
   - [ConvertDocumentBatchJobCreateResult](docs/ConvertDocumentBatchJobCreateResult.md)
   - [ConvertDocumentJobStatusResult](docs/ConvertDocumentJobStatusResult.md)
   - [ConvertedJpgPage](docs/ConvertedJpgPage.md)
   - [ConvertedPngDirectPage](docs/ConvertedPngDirectPage.md)
   - [ConvertedPngPage](docs/ConvertedPngPage.md)
   - [CreateBlankDocxRequest](docs/CreateBlankDocxRequest.md)
   - [CreateBlankDocxResponse](docs/CreateBlankDocxResponse.md)
   - [CreateBlankSpreadsheetRequest](docs/CreateBlankSpreadsheetRequest.md)
   - [CreateBlankSpreadsheetResponse](docs/CreateBlankSpreadsheetResponse.md)
   - [CreateSpreadsheetFromDataRequest](docs/CreateSpreadsheetFromDataRequest.md)
   - [CreateSpreadsheetFromDataResponse](docs/CreateSpreadsheetFromDataResponse.md)
   - [CreateZipArchiveRequest](docs/CreateZipArchiveRequest.md)
   - [CsvCollection](docs/CsvCollection.md)
   - [CsvFileResult](docs/CsvFileResult.md)
   - [DeleteDocxTableRowRangeRequest](docs/DeleteDocxTableRowRangeRequest.md)
   - [DeleteDocxTableRowRangeResponse](docs/DeleteDocxTableRowRangeResponse.md)
   - [DeleteDocxTableRowRequest](docs/DeleteDocxTableRowRequest.md)
   - [DeleteDocxTableRowResponse](docs/DeleteDocxTableRowResponse.md)
   - [DetectLineEndingsResponse](docs/DetectLineEndingsResponse.md)
   - [DisableSharedWorkbookRequest](docs/DisableSharedWorkbookRequest.md)
   - [DisableSharedWorkbookResponse](docs/DisableSharedWorkbookResponse.md)
   - [DocumentArrayInput](docs/DocumentArrayInput.md)
   - [DocumentEditingEditSession](docs/DocumentEditingEditSession.md)
   - [DocumentItem](docs/DocumentItem.md)
   - [DocumentTransformEditSession](docs/DocumentTransformEditSession.md)
   - [DocumentValidationError](docs/DocumentValidationError.md)
   - [DocumentValidationResult](docs/DocumentValidationResult.md)
   - [DocxBody](docs/DocxBody.md)
   - [DocxCellStyle](docs/DocxCellStyle.md)
   - [DocxComment](docs/DocxComment.md)
   - [DocxContentControl](docs/DocxContentControl.md)
   - [DocxFooter](docs/DocxFooter.md)
   - [DocxHeader](docs/DocxHeader.md)
   - [DocxImage](docs/DocxImage.md)
   - [DocxInsertCommentOnParagraphRequest](docs/DocxInsertCommentOnParagraphRequest.md)
   - [DocxInsertImageRequest](docs/DocxInsertImageRequest.md)
   - [DocxInsertImageResponse](docs/DocxInsertImageResponse.md)
   - [DocxMetadataCustomProperty](docs/DocxMetadataCustomProperty.md)
   - [DocxPage](docs/DocxPage.md)
   - [DocxParagraph](docs/DocxParagraph.md)
   - [DocxRemoveObjectRequest](docs/DocxRemoveObjectRequest.md)
   - [DocxRemoveObjectResponse](docs/DocxRemoveObjectResponse.md)
   - [DocxRun](docs/DocxRun.md)
   - [DocxSection](docs/DocxSection.md)
   - [DocxSetCustomMetadataPropertiesRequest](docs/DocxSetCustomMetadataPropertiesRequest.md)
   - [DocxSetFooterAddPageNumberRequest](docs/DocxSetFooterAddPageNumberRequest.md)
   - [DocxSetFooterRequest](docs/DocxSetFooterRequest.md)
   - [DocxSetFooterResponse](docs/DocxSetFooterResponse.md)
   - [DocxSetFormFieldsRequest](docs/DocxSetFormFieldsRequest.md)
   - [DocxSetHeaderRequest](docs/DocxSetHeaderRequest.md)
   - [DocxSetHeaderResponse](docs/DocxSetHeaderResponse.md)
   - [DocxStyle](docs/DocxStyle.md)
   - [DocxTable](docs/DocxTable.md)
   - [DocxTableCell](docs/DocxTableCell.md)
   - [DocxTableRow](docs/DocxTableRow.md)
   - [DocxTableSingleTableFill](docs/DocxTableSingleTableFill.md)
   - [DocxTableTableFillMultiRequest](docs/DocxTableTableFillMultiRequest.md)
   - [DocxTableTableFillRequest](docs/DocxTableTableFillRequest.md)
   - [DocxTableTableFillTableCell](docs/DocxTableTableFillTableCell.md)
   - [DocxTableTableFillTableRow](docs/DocxTableTableFillTableRow.md)
   - [DocxTemplateApplicationRequest](docs/DocxTemplateApplicationRequest.md)
   - [DocxTemplateOperation](docs/DocxTemplateOperation.md)
   - [DocxText](docs/DocxText.md)
   - [DocxToJpgResult](docs/DocxToJpgResult.md)
   - [DocxToPngResult](docs/DocxToPngResult.md)
   - [DocxTopLevelComment](docs/DocxTopLevelComment.md)
   - [EditPdfBatchJobCreateResult](docs/EditPdfBatchJobCreateResult.md)
   - [EditPdfJobStatusResult](docs/EditPdfJobStatusResult.md)
   - [EmlAttachment](docs/EmlAttachment.md)
   - [EmlToHtmlResult](docs/EmlToHtmlResult.md)
   - [EmlToJpgResult](docs/EmlToJpgResult.md)
   - [EmlToPngResult](docs/EmlToPngResult.md)
   - [EnableSharedWorkbookRequest](docs/EnableSharedWorkbookRequest.md)
   - [EnableSharedWorkbookResponse](docs/EnableSharedWorkbookResponse.md)
   - [ExifValue](docs/ExifValue.md)
   - [FillHandlebarFormField](docs/FillHandlebarFormField.md)
   - [FindDocxParagraphRequest](docs/FindDocxParagraphRequest.md)
   - [FindDocxParagraphResponse](docs/FindDocxParagraphResponse.md)
   - [FindRegexMatch](docs/FindRegexMatch.md)
   - [FindStringMatch](docs/FindStringMatch.md)
   - [FindStringRegexRequest](docs/FindStringRegexRequest.md)
   - [FindStringRegexResponse](docs/FindStringRegexResponse.md)
   - [FindStringSimpleRequest](docs/FindStringSimpleRequest.md)
   - [FindStringSimpleResponse](docs/FindStringSimpleResponse.md)
   - [FinishEditingRequest](docs/FinishEditingRequest.md)
   - [GetDocxBodyRequest](docs/GetDocxBodyRequest.md)
   - [GetDocxBodyResponse](docs/GetDocxBodyResponse.md)
   - [GetDocxCommentsHierarchicalResponse](docs/GetDocxCommentsHierarchicalResponse.md)
   - [GetDocxCommentsResponse](docs/GetDocxCommentsResponse.md)
   - [GetDocxContentControlsResponse](docs/GetDocxContentControlsResponse.md)
   - [GetDocxGetCommentsHierarchicalRequest](docs/GetDocxGetCommentsHierarchicalRequest.md)
   - [GetDocxGetCommentsRequest](docs/GetDocxGetCommentsRequest.md)
   - [GetDocxGetFormFieldsResponse](docs/GetDocxGetFormFieldsResponse.md)
   - [GetDocxHeadersAndFootersRequest](docs/GetDocxHeadersAndFootersRequest.md)
   - [GetDocxHeadersAndFootersResponse](docs/GetDocxHeadersAndFootersResponse.md)
   - [GetDocxImagesRequest](docs/GetDocxImagesRequest.md)
   - [GetDocxImagesResponse](docs/GetDocxImagesResponse.md)
   - [GetDocxMetadataPropertiesResponse](docs/GetDocxMetadataPropertiesResponse.md)
   - [GetDocxPagesRequest](docs/GetDocxPagesRequest.md)
   - [GetDocxPagesResponse](docs/GetDocxPagesResponse.md)
   - [GetDocxSectionsRequest](docs/GetDocxSectionsRequest.md)
   - [GetDocxSectionsResponse](docs/GetDocxSectionsResponse.md)
   - [GetDocxStylesRequest](docs/GetDocxStylesRequest.md)
   - [GetDocxStylesResponse](docs/GetDocxStylesResponse.md)
   - [GetDocxTableByIndexRequest](docs/GetDocxTableByIndexRequest.md)
   - [GetDocxTableByIndexResponse](docs/GetDocxTableByIndexResponse.md)
   - [GetDocxTableRowRequest](docs/GetDocxTableRowRequest.md)
   - [GetDocxTableRowResponse](docs/GetDocxTableRowResponse.md)
   - [GetDocxTablesRequest](docs/GetDocxTablesRequest.md)
   - [GetDocxTablesResponse](docs/GetDocxTablesResponse.md)
   - [GetFileTypeIconResult](docs/GetFileTypeIconResult.md)
   - [GetImageInfoResult](docs/GetImageInfoResult.md)
   - [GetMacrosResponse](docs/GetMacrosResponse.md)
   - [GetPdfAnnotationsResult](docs/GetPdfAnnotationsResult.md)
   - [GetXlsxCellByIdentifierRequest](docs/GetXlsxCellByIdentifierRequest.md)
   - [GetXlsxCellByIdentifierResponse](docs/GetXlsxCellByIdentifierResponse.md)
   - [GetXlsxCellRequest](docs/GetXlsxCellRequest.md)
   - [GetXlsxCellResponse](docs/GetXlsxCellResponse.md)
   - [GetXlsxColumnsRequest](docs/GetXlsxColumnsRequest.md)
   - [GetXlsxColumnsResponse](docs/GetXlsxColumnsResponse.md)
   - [GetXlsxImagesRequest](docs/GetXlsxImagesRequest.md)
   - [GetXlsxImagesResponse](docs/GetXlsxImagesResponse.md)
   - [GetXlsxRowsAndCellsRequest](docs/GetXlsxRowsAndCellsRequest.md)
   - [GetXlsxRowsAndCellsResponse](docs/GetXlsxRowsAndCellsResponse.md)
   - [GetXlsxSpecificRowRequest](docs/GetXlsxSpecificRowRequest.md)
   - [GetXlsxSpecificRowResponse](docs/GetXlsxSpecificRowResponse.md)
   - [GetXlsxStylesRequest](docs/GetXlsxStylesRequest.md)
   - [GetXlsxStylesResponse](docs/GetXlsxStylesResponse.md)
   - [GetXlsxWorksheetsRequest](docs/GetXlsxWorksheetsRequest.md)
   - [GetXlsxWorksheetsResponse](docs/GetXlsxWorksheetsResponse.md)
   - [HandlebarFormField](docs/HandlebarFormField.md)
   - [HtmlGetLanguageResult](docs/HtmlGetLanguageResult.md)
   - [HtmlGetLinksResponse](docs/HtmlGetLinksResponse.md)
   - [HtmlGetRelCanonicalUrlResult](docs/HtmlGetRelCanonicalUrlResult.md)
   - [HtmlGetSitemapUrlResult](docs/HtmlGetSitemapUrlResult.md)
   - [HtmlHyperlink](docs/HtmlHyperlink.md)
   - [HtmlMdResult](docs/HtmlMdResult.md)
   - [HtmlSsrfThreatCheckResult](docs/HtmlSsrfThreatCheckResult.md)
   - [HtmlTemplateApplicationRequest](docs/HtmlTemplateApplicationRequest.md)
   - [HtmlTemplateApplicationResponse](docs/HtmlTemplateApplicationResponse.md)
   - [HtmlTemplateOperation](docs/HtmlTemplateOperation.md)
   - [HtmlThreatLink](docs/HtmlThreatLink.md)
   - [HtmlToOfficeRequest](docs/HtmlToOfficeRequest.md)
   - [HtmlToPdfRequest](docs/HtmlToPdfRequest.md)
   - [HtmlToPngRequest](docs/HtmlToPngRequest.md)
   - [HtmlToTextRequest](docs/HtmlToTextRequest.md)
   - [HtmlToTextResponse](docs/HtmlToTextResponse.md)
   - [InsertDocxCommentOnParagraphResponse](docs/InsertDocxCommentOnParagraphResponse.md)
   - [InsertDocxInsertParagraphRequest](docs/InsertDocxInsertParagraphRequest.md)
   - [InsertDocxInsertParagraphResponse](docs/InsertDocxInsertParagraphResponse.md)
   - [InsertDocxTableRowRequest](docs/InsertDocxTableRowRequest.md)
   - [InsertDocxTableRowResponse](docs/InsertDocxTableRowResponse.md)
   - [InsertDocxTablesRequest](docs/InsertDocxTablesRequest.md)
   - [InsertDocxTablesResponse](docs/InsertDocxTablesResponse.md)
   - [InsertXlsxWorksheetRequest](docs/InsertXlsxWorksheetRequest.md)
   - [InsertXlsxWorksheetResponse](docs/InsertXlsxWorksheetResponse.md)
   - [JobStatusResult](docs/JobStatusResult.md)
   - [KeynoteToJpgResult](docs/KeynoteToJpgResult.md)
   - [KeynoteToPngResult](docs/KeynoteToPngResult.md)
   - [MergeBatchJobCreateResult](docs/MergeBatchJobCreateResult.md)
   - [MergeJobStatusResult](docs/MergeJobStatusResult.md)
   - [MsgAttachment](docs/MsgAttachment.md)
   - [MsgToHtmlResult](docs/MsgToHtmlResult.md)
   - [MsgToJpgResult](docs/MsgToJpgResult.md)
   - [MsgToPngResult](docs/MsgToPngResult.md)
   - [MultiReplaceStringRequest](docs/MultiReplaceStringRequest.md)
   - [MultipageImageFormatConversionResult](docs/MultipageImageFormatConversionResult.md)
   - [OdpToJpgResult](docs/OdpToJpgResult.md)
   - [OdpToPngResult](docs/OdpToPngResult.md)
   - [OdsToJpgResult](docs/OdsToJpgResult.md)
   - [OdsToPngResult](docs/OdsToPngResult.md)
   - [OdtToJpgResult](docs/OdtToJpgResult.md)
   - [OdtToPngResult](docs/OdtToPngResult.md)
   - [PageConversionResult](docs/PageConversionResult.md)
   - [PdfAnnotation](docs/PdfAnnotation.md)
   - [PdfDocument](docs/PdfDocument.md)
   - [PdfFormField](docs/PdfFormField.md)
   - [PdfFormFields](docs/PdfFormFields.md)
   - [PdfMetadata](docs/PdfMetadata.md)
   - [PdfPageText](docs/PdfPageText.md)
   - [PdfTextByPageResult](docs/PdfTextByPageResult.md)
   - [PdfToJpgResult](docs/PdfToJpgResult.md)
   - [PdfToPngDirectResult](docs/PdfToPngDirectResult.md)
   - [PdfToPngResult](docs/PdfToPngResult.md)
   - [PptxPageLayoutInformation](docs/PptxPageLayoutInformation.md)
   - [PptxSplitAdvancedRequest](docs/PptxSplitAdvancedRequest.md)
   - [PptxSplitAdvancedResponse](docs/PptxSplitAdvancedResponse.md)
   - [PptxToPngResult](docs/PptxToPngResult.md)
   - [PresentationAdvancedResult](docs/PresentationAdvancedResult.md)
   - [PresentationResult](docs/PresentationResult.md)
   - [RemoveDocxHeadersAndFootersRequest](docs/RemoveDocxHeadersAndFootersRequest.md)
   - [RemoveDocxHeadersAndFootersResponse](docs/RemoveDocxHeadersAndFootersResponse.md)
   - [RemoveDocxPagesRequest](docs/RemoveDocxPagesRequest.md)
   - [RemoveHtmlFromTextRequest](docs/RemoveHtmlFromTextRequest.md)
   - [RemoveHtmlFromTextResponse](docs/RemoveHtmlFromTextResponse.md)
   - [RemovePptxSlidesRequest](docs/RemovePptxSlidesRequest.md)
   - [RemoveWhitespaceFromTextRequest](docs/RemoveWhitespaceFromTextRequest.md)
   - [RemoveWhitespaceFromTextResponse](docs/RemoveWhitespaceFromTextResponse.md)
   - [RemoveXlsxWorksheetRequest](docs/RemoveXlsxWorksheetRequest.md)
   - [RenameXlsxWorksheetRequest](docs/RenameXlsxWorksheetRequest.md)
   - [RenameXlsxWorksheetResponse](docs/RenameXlsxWorksheetResponse.md)
   - [ReplaceDocxParagraphRequest](docs/ReplaceDocxParagraphRequest.md)
   - [ReplaceDocxParagraphResponse](docs/ReplaceDocxParagraphResponse.md)
   - [ReplaceStringRegexRequest](docs/ReplaceStringRegexRequest.md)
   - [ReplaceStringRegexResponse](docs/ReplaceStringRegexResponse.md)
   - [ReplaceStringRequest](docs/ReplaceStringRequest.md)
   - [ReplaceStringSimpleRequest](docs/ReplaceStringSimpleRequest.md)
   - [ReplaceStringSimpleResponse](docs/ReplaceStringSimpleResponse.md)
   - [RtfToJpgResult](docs/RtfToJpgResult.md)
   - [RtfToPngResult](docs/RtfToPngResult.md)
   - [ScreenshotRequest](docs/ScreenshotRequest.md)
   - [SetFormFieldValue](docs/SetFormFieldValue.md)
   - [SetPdfFormFieldsRequest](docs/SetPdfFormFieldsRequest.md)
   - [SetPdfMetadataRequest](docs/SetPdfMetadataRequest.md)
   - [SetXlsxCellByIdentifierRequest](docs/SetXlsxCellByIdentifierRequest.md)
   - [SetXlsxCellByIdentifierResponse](docs/SetXlsxCellByIdentifierResponse.md)
   - [SetXlsxCellRequest](docs/SetXlsxCellRequest.md)
   - [SetXlsxCellResponse](docs/SetXlsxCellResponse.md)
   - [SingleReplaceString](docs/SingleReplaceString.md)
   - [SplitBatchJobCreateResult](docs/SplitBatchJobCreateResult.md)
   - [SplitDocumentResult](docs/SplitDocumentResult.md)
   - [SplitDocxDocumentResult](docs/SplitDocxDocumentResult.md)
   - [SplitPdfResult](docs/SplitPdfResult.md)
   - [SplitPptxPresentationResult](docs/SplitPptxPresentationResult.md)
   - [SplitTextDocumentByLinesResult](docs/SplitTextDocumentByLinesResult.md)
   - [SplitTextDocumentByStringResult](docs/SplitTextDocumentByStringResult.md)
   - [SplitXlsxWorksheetResult](docs/SplitXlsxWorksheetResult.md)
   - [TextConversionResult](docs/TextConversionResult.md)
   - [TextDocumentElement](docs/TextDocumentElement.md)
   - [TextDocumentLine](docs/TextDocumentLine.md)
   - [TextEncodingDetectResponse](docs/TextEncodingDetectResponse.md)
   - [Thumbnail](docs/Thumbnail.md)
   - [UpdateDocxTableCellRequest](docs/UpdateDocxTableCellRequest.md)
   - [UpdateDocxTableCellResponse](docs/UpdateDocxTableCellResponse.md)
   - [UpdateDocxTableRowRequest](docs/UpdateDocxTableRowRequest.md)
   - [UpdateDocxTableRowResponse](docs/UpdateDocxTableRowResponse.md)
   - [UrlToPdfRequest](docs/UrlToPdfRequest.md)
   - [UrlToTextRequest](docs/UrlToTextRequest.md)
   - [UrlToTextResponse](docs/UrlToTextResponse.md)
   - [ViewerResponse](docs/ViewerResponse.md)
   - [WorksheetResult](docs/WorksheetResult.md)
   - [XlsxImage](docs/XlsxImage.md)
   - [XlsxSpreadsheetCell](docs/XlsxSpreadsheetCell.md)
   - [XlsxSpreadsheetColumn](docs/XlsxSpreadsheetColumn.md)
   - [XlsxSpreadsheetRow](docs/XlsxSpreadsheetRow.md)
   - [XlsxToPngResult](docs/XlsxToPngResult.md)
   - [XlsxWorksheet](docs/XlsxWorksheet.md)
   - [XmlAddAttributeWithXPathResult](docs/XmlAddAttributeWithXPathResult.md)
   - [XmlAddChildWithXPathResult](docs/XmlAddChildWithXPathResult.md)
   - [XmlFilterWithXPathResult](docs/XmlFilterWithXPathResult.md)
   - [XmlQueryWithXQueryMultiResult](docs/XmlQueryWithXQueryMultiResult.md)
   - [XmlQueryWithXQueryResult](docs/XmlQueryWithXQueryResult.md)
   - [XmlRemoveAllChildrenWithXPathResult](docs/XmlRemoveAllChildrenWithXPathResult.md)
   - [XmlRemoveWithXPathResult](docs/XmlRemoveWithXPathResult.md)
   - [XmlReplaceWithXPathResult](docs/XmlReplaceWithXPathResult.md)
   - [XmlSetValueWithXPathResult](docs/XmlSetValueWithXPathResult.md)
   - [XxeThreatDetectionResult](docs/XxeThreatDetectionResult.md)
   - [ZipDirectory](docs/ZipDirectory.md)
   - [ZipEncryptionAdvancedRequest](docs/ZipEncryptionAdvancedRequest.md)
   - [ZipExtractResponse](docs/ZipExtractResponse.md)
   - [ZipFile](docs/ZipFile.md)


  - **Type**: API key
  - **API key parameter name**: Apikey
  - **Location**: HTTP header


pkgId: f49262a21c72a79657347243d094b6217a53747bc53bbb9ef2c4ebdecbe4c91c
name: python-cloudmersive-virus-api-client
arch: src
version: 3.2.0
epoch: 0
release: 1
summary: virusapi
url: https://www.cloudmersive.com/virus-api
rpm_license: UNKNOWN
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudmersive-virus-api-client-3.2.0-1.src.rpm
checksum_type: sha256
description:
  *ScanApi* | [**scan_file**](docs/ScanApi.md#scan_file) | **POST** /virus/scan/file | Scan a file for viruses
  *ScanApi* | [**scan_file_advanced**](docs/ScanApi.md#scan_file_advanced) | **POST** /virus/scan/file/advanced | Advanced Scan a file for viruses
  *ScanApi* | [**scan_website**](docs/ScanApi.md#scan_website) | **POST** /virus/scan/website | Scan a website for malicious content and threats
  *ScanCloudStorageApi* | [**scan_cloud_storage_scan_aws_s3_file**](docs/ScanCloudStorageApi.md#scan_cloud_storage_scan_aws_s3_file) | **POST** /virus/scan/cloud-storage/aws-s3/single | Scan an AWS S3 file for viruses
  *ScanCloudStorageApi* | [**scan_cloud_storage_scan_aws_s3_file_advanced**](docs/ScanCloudStorageApi.md#scan_cloud_storage_scan_aws_s3_file_advanced) | **POST** /virus/scan/cloud-storage/aws-s3/single/advanced | Advanced Scan an AWS S3 file for viruses
  *ScanCloudStorageApi* | [**scan_cloud_storage_scan_azure_blob**](docs/ScanCloudStorageApi.md#scan_cloud_storage_scan_azure_blob) | **POST** /virus/scan/cloud-storage/azure-blob/single | Scan an Azure Blob for viruses
  *ScanCloudStorageApi* | [**scan_cloud_storage_scan_azure_blob_advanced**](docs/ScanCloudStorageApi.md#scan_cloud_storage_scan_azure_blob_advanced) | **POST** /virus/scan/cloud-storage/azure-blob/single/advanced | Advanced Scan an Azure Blob for viruses
  *ScanCloudStorageApi* | [**scan_cloud_storage_scan_gcp_storage_file**](docs/ScanCloudStorageApi.md#scan_cloud_storage_scan_gcp_storage_file) | **POST** /virus/scan/cloud-storage/gcp-storage/single | Scan an Google Cloud Platform (GCP) Storage file for viruses
  *ScanCloudStorageApi* | [**scan_cloud_storage_scan_gcp_storage_file_advanced**](docs/ScanCloudStorageApi.md#scan_cloud_storage_scan_gcp_storage_file_advanced) | **POST** /virus/scan/cloud-storage/gcp-storage/single/advanced | Advanced Scan an Google Cloud Platform (GCP) Storage file for viruses
  *ScanCloudStorageApi* | [**scan_cloud_storage_scan_share_point_online_file**](docs/ScanCloudStorageApi.md#scan_cloud_storage_scan_share_point_online_file) | **POST** /virus/scan/cloud-storage/sharepoint-online/site/single | Virus Scan a file in a SharePoint Online Site Drive
  *ScanCloudStorageApi* | [**scan_cloud_storage_scan_share_point_online_file_advanced**](docs/ScanCloudStorageApi.md#scan_cloud_storage_scan_share_point_online_file_advanced) | **POST** /virus/scan/cloud-storage/sharepoint-online/site/advanced | Advanced Virus Scan a file in a SharePoint Online Site Drive

   - [AdditionalAdvancedScanInformation](docs/AdditionalAdvancedScanInformation.md)
   - [CloudStorageAdvancedVirusScanResult](docs/CloudStorageAdvancedVirusScanResult.md)
   - [CloudStorageVirusFound](docs/CloudStorageVirusFound.md)
   - [CloudStorageVirusScanResult](docs/CloudStorageVirusScanResult.md)
   - [VirusFound](docs/VirusFound.md)
   - [VirusScanAdvancedResult](docs/VirusScanAdvancedResult.md)
   - [VirusScanResult](docs/VirusScanResult.md)
   - [WebsiteScanRequest](docs/WebsiteScanRequest.md)
   - [WebsiteScanResult](docs/WebsiteScanResult.md)


  - **Type**: API key
  - **API key parameter name**: Apikey
  - **Location**: HTTP header


pkgId: 99168fd099b7944735873ef142a98dd55f7719158d86c9577deb1b0f02de3103
name: python-cloudmesh-bumpversion
arch: src
version: 5.0.29
epoch: 0
release: 1
summary: A cloudmesh command to bump the version in cloudmesh projects
url: https://github.com/cloudmesh/cloudmesh-bumpversion
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudmesh-bumpversion-5.0.29-1.src.rpm
checksum_type: sha256
description:
    Usage:
          bar --file=FILE
          bar list
          bar [--parameter=PARAMETER] [--experiment=EXPERIMENT] [COMMAND...]
    This command does some useful things.
    Arguments:
        FILE   a file name
        PARAMETER  a parameterized parameter of the form "a[0-3],a5"
    Options:
        -f      specify the file
    Description:
      > cms bar --parameter="a[1-2,5],a10"
      >    example on how to use Parameter.expand. See source code at
      >      https://github.com/cloudmesh/cloudmesh-bar/blob/main/cloudmesh/bar/command/bar.py
      >    prints the expanded parameter as a list
      >    ['a1', 'a2', 'a3', 'a4', 'a5', 'a10']
      > bar exp --experiment=a=b,c=d
      > example on how to use Parameter.arguments_to_dict. See source code at
      >      https://github.com/cloudmesh/cloudmesh-bar/blob/main/cloudmesh/bar/command/bar.py
      > prints the parameter as dict
      >   {'a': 'b', 'c': 'd'}
  ```
  <!-- STOP-MANUAL -->

rpm_license:
  Apache License Version 2.0, January 2004 http://www.apache.org/licenses/  Copyright 2021,2022 Gregor von Laszewski, University of Virginia  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.


pkgId: 09be7aeb4475909e22e8b3455bf35d523e42512a41c78839c6b20735041bf00c
name: python-cloudmesh-cloud
arch: src
version: 4.4.1
epoch: 0
release: 1
summary: Cloudmesh Multicloud Cloud Plugins for Cloudmesh cmd5 CMD
url: https://github.com/cloudmesh/cloudmesh-cloud
rpm_license: Apache 2.0
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudmesh-cloud-4.4.1-1.src.rpm
checksum_type: sha256
description:
  [![Version](https://img.shields.io/pypi/v/cloudmesh--cloud.svg)](https://pypi.python.org/pypi/cloudmesh--cloud)
  [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://github.com/cloudmesh/cloudmesh--cloud/blob/master/LICENSE)
  [![Python](https://img.shields.io/pypi/pyversions/cloudmesh--cloud.svg)](https://pypi.python.org/pypi/cloudmesh--cloud)
  [![Format](https://img.shields.io/pypi/format/cloudmesh--cloud.svg)](https://pypi.python.org/pypi/cloudmesh--cloud)
  [![Status](https://img.shields.io/pypi/status/cloudmesh--cloud.svg)](https://pypi.python.org/pypi/cloudmesh--cloud)
  [![Travis](https://travis-ci.com/cloudmesh/cloudmesh--cloud.svg?branch=master)](https://travis-ci.com/cloudmesh/cloudmesh-cloud)




  Please note that several packages are available which are pointed to
  in the installation documentation.

  |                          | Links                                              |
  |--------------------------|----------------------------------------------------|
  | Documentation            | <https://cloudmesh.github.io/cloudmesh-manual>     |
  | Code                     | <https://github.com/cloudmesh/cloudmesh-cloud>     |
  | Instalation Instructions | <https://github.com/cloudmesh/cloudmesh-installer> |

  An dynamically extensible CMD based command shell. For en extensive
  documentation please see

  * <https://github.com/cloudmesh-community/book/blob/master/vonLaszewski-cloud.epub?raw=true>

  where we also document how to use pyenv virtualenv.




  * See <https://github.com/cloudmesh/cloudmesh-installer>

  * See <https://github.com/cloudmesh/cloudmesh-manual>


pkgId: 0ee7b4e1bd3fc4280dd950dd49df17504800fabc38a3e222e40dc6e8f98487ce
name: python-cloudmesh-cmd5
arch: src
version: 5.0.20
epoch: 0
release: 1
summary: The cloudmesh command shell
url: https://github.com/cloudmesh/cloudmesh-cmd5
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudmesh-cmd5-5.0.20-1.src.rpm
checksum_type: sha256
description:
  EOF     commands  default  help  pause   q     shell      sys   version
  banner  config    echo     info  plugin  quit  sleep      test
  clear   debug     gui      man   py      set   stopwatch  var
  ```
  To see the manual page for a specific command, please use::
  ```
  cms> help COMMANDNAME
  ```
  A full manual page is available at
  * <https://cloudmesh.github.io/cloudmesh-manual/>

  Cmd5 comes with a sophisticated plugin mechanism. Commands can be readily
  designed from the sys command.
  The sys command can be installed either from source (as discussed previously) or
  via pip
  ```bash
  $ pip install cloudmesh-sys
  ```
  Once you have installed it, execute `cms help sys` to see the usage. Now you
  simply can in a new directory execute the sys command as follows, where
  `mycommnad` is than name of the command you like to implement.
  ```bash
  $ mkdir mycommand
  $ cd mycommand
  $ cms sys command generate mycommand .
  ```
  A directory with the name `cloudmesh-mycommand` will be generated that contains
  the template for the command. You can enter this template and modify the
  implementation in the folders `cloudmesh/mycommand/api` and
  `cloudmesh/mycommand/command` when installing it with
  ```
  $ pip install .
  ```
  The command will be added to the cms command>
  An example for the bar command is presented at:
  * [cloudmesh/bar/command/bar.py](https://github.com/cloudmesh/cloudmesh.bar/blob/main/cloudmesh/bar/command/bar.py)
  It shows how simple the command definition is (bar.py)::
  ```bash
  from cloudmesh.shell.command import command
  from cloudmesh.shell.command import PluginCommand
  class BarCommand(PluginCommand):
      @command
      def do_bar(self, args, arguments):
          """
            Usage:
                  command -f FILE
                  command FILE
                  command list
            This command does some useful things.
            Arguments:
                FILE   a file name
            Options:
                -f      specify the file
          """
          print(arguments)
  ```
  An important difference to other CMD solutions is that our commands
  can leverage (besides the standard definition), docopts as a way to
  define the manual page. This allows us to use arguments as dict and
  use simple if conditions to interpret the command. Using docopts has
  the advantage that contributors are forced to think about the command
  and its options and document them from the start. Previously we used
  not to use docopts and argparse was used. However we noticed that for
  some contributions the lead to commands that were either not properly
  documented or the developers delivered ambiguous commands that
  resulted in confusion and wrong usage by the users. Hence, we do
  recommend that you use docopts.
  The transformation is enabled by the `@command` decorator that takes
  also the manual page and creates a proper help message for the shell
  automatically. Thus there is no need to introduce a separate help
  method as would normally be needed in CMD.

  The following highlighted features are available:
  * easy command integration through separate modules
  * multi cloud environments (under development) though cloudmesh-cloud plugin
  * openapi integration through cloudmesh-openapi plugin
  * general commands as documented at in the
    [manual](https://cloudmesh.github.io/cloudmesh-manual/) such as
    [admin](https://cloudmesh.github.io/cloudmesh-manual/manual/cmd5/admin.html),
    [banner](https://cloudmesh.github.io/cloudmesh-manual/manual/cmd5/banner.html),
    [clear](https://cloudmesh.github.io/cloudmesh-manual/manual/cmd5/clear.html),
    [echo](https://cloudmesh.github.io/cloudmesh-manual/manual/cmd5/echo.html),
    [default](https://cloudmesh.github.io/cloudmesh-manual/manual/cmd5/default.html),
    [info](https://cloudmesh.github.io/cloudmesh-manual/manual/cmd5/info.html),
    [pause](https://cloudmesh.github.io/cloudmesh-manual/manual/cmd5/pause.html),
    [plugin](https://cloudmesh.github.io/cloudmesh-manual/manual/cmd5/plugin.html),
    [quit](https://cloudmesh.github.io/cloudmesh-manual/manual/cmd5/quit.html),
    [shell](https://cloudmesh.github.io/cloudmesh-manual/manual/cmd5/shell.html),
    [sleep](https://cloudmesh.github.io/cloudmesh-manual/manual/cmd5/sleep.html),
    [stopwatch](https://cloudmesh.github.io/cloudmesh-manual/manual/cmd5/stopwatch.html),
    [sys](https://cloudmesh.github.io/cloudmesh-manual/manual/cmd5/sys.html),
    [var](https://cloudmesh.github.io/cloudmesh-manual/manual/cmd5/var.html),
    [version](https://cloudmesh.github.io/cloudmesh-manual/manual/cmd5/version.html),
    [open](https://cloudmesh.github.io/cloudmesh-manual/manual/cmd5/open.html),
    and others

  * Support for terminals with dark background
  * Support for python in variable assignments
    ```
    cms set a=\"py 1 + 1\"
    a='2'
    ```
  * Support for executing python in a py command
    ```
    cms py 1 + 1
    2
    ```
  * Support for shell commands in the variabe value
    ```
    cms set a=\!pwd
    ```
  * Support for reading values from a yaml configuration file in
    `~/.cloudmesh/cloudmesh.yaml`
    ```
    cms set a=cloudmesh.profile.user
    ```
    where it is defined as
    ```
    cloudmesh:
      profile:
        user: gregor
    ```

  <!-- START-MANUAL -->
  ```

rpm_license:
  Apache License Version 2.0, January 2004 http://www.apache.org/licenses/  Copyright 2017-2021 Gregor von Laszewski, Indiana University Copyright 2021,2022 Gregor von Laszewski, University of Virginia  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.


pkgId: d937c8c862e277a4e8cc2aba1972c5c747c7fd898a6f765a82f35ee3787e0801
name: python-cloudmesh-common
arch: src
version: 5.0.60
epoch: 0
release: 1
summary: A set of useful APIs for cloudmesh
url: https://github.com/cloudmesh/cloudmesh-common
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudmesh-common-5.0.60-1.src.rpm
checksum_type: sha256
description:
  [![image](https://img.shields.io/pypi/v/cloudmesh-common.svg)](https://pypi.org/project/cloudmesh-common/)
  [![Python](https://img.shields.io/pypi/pyversions/cloudmesh-common.svg)](https://pypi.python.org/pypi/cloudmesh-common)
  [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://github.com/cloudmesh/cloudmesh-common/blob/main/LICENSE)
  [![Format](https://img.shields.io/pypi/format/cloudmesh-common.svg)](https://pypi.python.org/pypi/cloudmesh-common)
  [![Status](https://img.shields.io/pypi/status/cloudmesh-common.svg)](https://pypi.python.org/pypi/cloudmesh-common)
  [![Travis](https://travis-ci.com/cloudmesh/cloudmesh-common.svg?branch=main)](https://travis-ci.com/cloudmesh/cloudmesh-common)




  Please note that several packages are available which are pointed to in the
  installation documentation.

  |  | Links |
  |---------------|-------|
  | Documentation | <https://cloudmesh.github.io/cloudmesh-cloud> |
  | Code | <https://github.com/cloudmesh/cloudmesh-cloud> |
  | Installation Instructions | <https://github.com/cloudmesh/get> |



  This library contains a number of useful functions and APIs that we highlight
  here. They are used to interact with the system and provide a number of
  functions to implement command line programs and shells.



  The console provides convenient way to print colored messages types in the
  terminal, such as errors, info, and regular messages

  * [cloudmesh.common.console](https://github.com/cloudmesh/cloudmesh-common/blob/main/cloudmesh/common/console.py)

  ```python
  from cloudmesh.common.console import Console

  Console.error("this is an error printed in red with prefix ERROR:")
  Console.msg("this is a msg printed in black")
  Console.ok("this is an ok message printed in green")
  ```



  We have lots of shell commands that call linux commands, but also have a
  convenient execution command that returns the results in a string.

  For more information we like you to inspect the source code:

  * [cloudmesh.common.Shell](https://github.com/cloudmesh/cloudmesh-common/blob/main/cloudmesh/common/Shell.py)


  ```python
  from cloudmesh.common.Shell import Shell

  shell = Shell()

  print(shell.terminal_type())


  r = shell.execute('pwd')
  print(r)


  r = shell.live('pwd')
  print(r)


  shell.terminal("ls")


  shell.pip("install cloudmesh-common")
  ```

  We have many such build in commands, please see the source




  A convenient way to print dictionaries and lists with repeated
  entries as tables, csv, json, yaml. The dictionaries can even be hierarchical.

  * [cloudmesh.common.Printer](https://github.com/cloudmesh/cloudmesh-common/blob/main/cloudmesh/common/Printer.py)

  Let us assume we have

  ```python
  data = [
      {
          "name": "Gregor",
          "address": {
              "street": "Funny Lane 11",
              "city": "Cloudville"
          {
      },
      {
          "name": "Albert",
          "address": {
              "street": "Memory Lane 1901",
              "city": "Cloudnine"
          }
      }
  ]
  ```

  Then we can print it nicely with

  ```python
  print(Printer.flatwrite(self.data,
                      sort_keys=["name"],
                      order=["name", "address.street", "address.city"],
                      header=["Name", "Street", "City"],
                      output="table")
            )
  ```

  Other formats such as csv, json, dict are also supported.

  In addition we have also printers for printing attribute lists. Please consult
  the source code.



  See: https://colab.research.google.com/drive/1tG7IcP-XMQiNVxU05yazKQYciQ9GpMat#scrollTo=TZAjATZiQh4q&uniqifier=1 for an example



  ```python
  from cloudmesh.common.StopWatch import StopWatch
  import time

  StopWatch.start("a")
  time.sleep(3)
  StopWatch.stop("a")
  StopWatch.status("a", True)
  StopWatch.benchmark()
  ```



  If it is not wrapped in functions, do not use it this way.

  ``` python
  from cloudmesh.common.Benchmark import Benchmark
  import time

  def b():
    Benchmark.Start()
    time.sleep(3)
    Benchmark.Stop()

  def c():
    Benchmark.Start()
    time.sleep(1)
    Benchmark.Stop()

   b()
   c()

  Benchmark.print()
  ```

  * See also: [cloudmesh.common.StopWatch](https://github.com/cloudmesh/cloudmesh-common/blob/main/cloudmesh/common/StopWatch.py)






  * [cloudmesh.common.dotdict](https://github.com/cloudmesh/cloudmesh-common/blob/main/cloudmesh/common/dotdict.py)

  One dimensional Dictionaries in dot format.

  ```python
  from cloudmesh.common.dotdict import doctict


  d = dotdict({"name": "Gregor"})

  print(d["name"])
  print(d.name)
  ```



  * [cloudmesh.common.ssh](https://github.com/cloudmesh/cloudmesh-common/blob/main/cloudmesh/common/ssh)

    * managing ssh config files
    * managing authorized keys



  Very useful functions are included in util


  * [cloudmesh.common.util](https://github.com/cloudmesh/cloudmesh-common/blob/main/cloudmesh/common/util.py)

  Especially useful are

    * generating passwords
    * banners
    * yn_choices
    * path_expansion
    * grep (simple line matching)
    * HEADING() which without parameter identifies the name of the function and
    prints its name within a banner



  * added support for terminals with dark background



  Continued work was in part funded by the NSF
  CyberTraining: CIC: CyberTraining for Students and Technologies
  from Generation Z with the award numbers 1829704 and 2200409.

rpm_license:
  Apache License Version 2.0, January 2004 http://www.apache.org/licenses/  Copyright 2017-2021 Gregor von Laszewski, Indiana University Copyright 2021,2022 Gregor von Laszewski, University of Virginia  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.


pkgId: 6cd386ae65b3a6fc3a5d929ceee9c0504464b4ff31e58bf5da900d099d8f3374
name: python-cloudmesh-installer
arch: src
version: 5.0.2
epoch: 0
release: 1
summary: Installer for cloudmesh
url: https://github.com/cloudmesh/cloudmesh-installer
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudmesh-installer-5.0.2-1.src.rpm
checksum_type: sha256
description:
  [![image](https://img.shields.io/pypi/v/cloudmesh-installer.svg)](https://pypi.org/project/cloudmesh-installer/)
  [![Python](https://img.shields.io/pypi/pyversions/cloudmesh-installer.svg)](https://pypi.python.org/pypi/cloudmesh-installer)
  [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://github.com/cloudmesh/cloudmesh-installer/blob/main/LICENSE)
  [![Format](https://img.shields.io/pypi/format/cloudmesh-installer.svg)](https://pypi.python.org/pypi/cloudmesh-installer)
  [![Status](https://img.shields.io/pypi/status/cloudmesh-installer.svg)](https://pypi.python.org/pypi/cloudmesh-installer)
  [![GitHub Actions Status](https://github.com/cloudmesh/cloudmesh-installer/actions/workflows/python-package-conda.yml/badge.svg)](https://github.com/cloudmesh/cloudmesh-installer/actions/)


  This is an experimental installer that is most useful during the development of
  cloudmesh components form source. Once cloudmesh is released, you can use the
  packages hosted at pypi.

  This command can be installed with

  ```bash
  $ pip install cloudmesh-installer
  ```

  an FAQ is available at

  * <https://github.com/cloudmesh/cloudmesh-installer/blob/main/FAQ.md>



  ```bash
  cloudmesh-installer git key [LOCATION] [--benchmark]
  cloudmesh-installer [--ssh] git [clone|pull|status|authors] [BUNDLES...] [--benchmark]
  cloudmesh-installer [--ssh] get [BUNDLES...] [--benchmark]
  cloudmesh-installer update [BUNDLES...] [--benchmark]
  cloudmesh-installer install [BUNDLES...] [--venv=ENV | -e] [--benchmark]
  cloudmesh-installer list [BUNDLE] [--short | --git]
  cloudmesh-installer version
  cloudmesh-installer info [BUNDLE] [--verbose]
  cloudmesh-installer clean --dir=DIR [--force]
  cloudmesh-installer clean --venv=ENV [--force]
  cloudmesh-installer new VENV [BUNDLES...] [--python=PYTHON]
  cloudmesh-installer release [REPOS...] [--benchmark]
  cloudmesh-installer pi [--dev]
  cloudmesh-installer burn --branch BRANCH
  cloudmesh-installer to5
  cloudmesh-installer help
  cloudmesh-installer usage
  ```



  Timings

  | Command | Time |
  | --- | --- |
  | `pip install cloudmesh-installer` | 	0m4.558s |
  | `time cloudmesh-installer install cms`| 0m18.288s |
  | `time cloudmesh-installer git clone storage` | 	0m4.926s |


  Tests

   * [test_installer](tests/test_installer.py)



  This work was in part funded by the NSF
  CyberTraining: CIC: CyberTraining for Students and Technologies
  from Generation Z with the awadrd numbers 1829704 and 2200409.





  ```bash
  cloudmesh-installer -- a helper to install cloudmesh from source for
  developers.
  Usage:
    cloudmesh-installer git key [LOCATION] [--benchmark]
    cloudmesh-installer [--ssh] git  [BUNDLES...] [--benchmark]
    cloudmesh-installer [--ssh] get [BUNDLES...] [--benchmark]
    cloudmesh-installer update [BUNDLES...] [--benchmark]
    cloudmesh-installer install [BUNDLES...] [--venv=ENV | -e] [--benchmark]
    cloudmesh-installer list [BUNDLE] [--short | --git]
    cloudmesh-installer version
    cloudmesh-installer info [BUNDLE] [--verbose]
    cloudmesh-installer clean --dir=DIR [--force]
    cloudmesh-installer clean --venv=ENV [--force]
    cloudmesh-installer new VENV [BUNDLES...] [--python=PYTHON]
    cloudmesh-installer release [REPOS...] [--benchmark]
    cloudmesh-installer pi [--dev]
    cloudmesh-installer burn --branch BRANCH
    cloudmesh-installer to5
    cloudmesh-installer help
    cloudmesh-installer usage
  A convenient program called `cloudmesh-installer` to download and install
  cloudmesh from sources published in github.
  Arguments:
    BUNDLE      the bundle
    REPOS       list of git repos
    ENV         the name of the venv
    DIR         the directory form where to start the search
  Options:
    -h --help
    --force   force the execution of the command. This command could delete
  files.
  Note: you can also use `cmsi` instead of `cloudmesh-installer`
  Description:
      cmsi list
      cloudmesh-installer list
          Cloudmesh has a number of bundles. Bundles are simple a number of git
          repositories. You can list the bundels with the list command. and see
          their names in the top level.
          This command lists all available bundles
      cmsi list bundle
      cloudmesh-installer list bundle
          lists the information about a particular bundle.
      cmsi list [BUNDLE] --git
      cloudmesh-installer list [BUNDLE] --git
          Shows the location of the repositories in a bundle.
      cmsi info
      cloudmesh-installer info
          The info command gives some very basic information about the version
          numbers of cloudmesh on your system, github, and pypi. THis helps
          identifying if you may run an odlder version.
          In addition we try to check if you do use venv
      cmsi git key [LOCATION]
      cloudmesh-installer git key [LOCATION]
          This command only works if you use ssh keys to authenticate with
  github.
          This command makes uploading the key easy as it checks for your key and
          provides via the web browser automatic pageloads to github for the
          key upload. You do not have tou use this command. It is intenden for
          novice users.
      cmsi git  [BUNDLE]
      cloudmesh-installer git  [BUNDLE]
          This command executes the given git command on the bundle
      cmsi update [BUNDLE]
      cmsi get [BUNDLE]
      cloudmesh-installer update [BUNDLE]
      cloudmesh-installer get [BUNDLE]
          For each repository in the bundle it clones it and also pulls.
          Thus the command can easly be used to get a new bundle element, but
          also get the new code for already existing bundles elements.
          The code is checked out with https
      cmsi get -ssh [BUNDLE]
      cloudmesh-installer get -ssh [BUNDLE]
          For each repository in the bundle it clones it and also pulls.
          Thus the command can easly be used to get a new bundle element, but
          also get the new code for already existing bundles elements.
          The code is checked out with ssh
      cmsi install [BUNDLE]
      cloudmesh-installer install [BUNDLE]
          This command executes an install on the given bundle
      cmsi info
      cloudmesh-installer info
          This command is very useful to list the version of the installed
          package, the version n git, and the version on pypi
      cmsi clean --dir=. --force
      cloudmesh-installer clean --dir=. --force
         removes the egs in the current directory tree
      cmsi clean --venv=ENV --force
      cloudmesh-installer clean --venv=ENV --force
          removes the venv in ~/ENV
      Examples:
          let us assume you like to work on bar, than you need to do the
  following
              mkdir cm
              cd cm
              cmsi git clone bar
              cmsi install bar
              cmsi info
  ```

rpm_license:
  Apache License Version 2.0, January 2004 http://www.apache.org/licenses/  Copyright 2017-2021 Gregor von Laszewski, Indiana University Copyright 2021,2022 Gregor von Laszewski, University of Virginia  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.


pkgId: 80187b3e25317a270a229660621c580d34a24e305d6042bd56b270dc19b8c089
name: python-cloudmesh-sbatch
arch: src
version: 4.3.20
epoch: 0
release: 1
summary: A command called sbatch and foo for the cloudmesh shell
url: https://github.com/cloudmesh/cloudmesh-sbatch
rpm_license: Apache 2.0
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudmesh-sbatch-4.3.20-1.src.rpm
checksum_type: sha256
description:
  A general purpose HPC Template and Experiment management system




  Hyper Performance Computation Clusters (HPCs) are designed around a
  timesharing principle and are powered by queue-based execution
  ecosystems such as SchedMD's
  [SLURM](https://slurm.schedmd.com/overview.html) and IBM's Platform
  Load Sharing Facility
  ([LSF](https://www.ibm.com/docs/en/spectrum-lsf/10.1.0?topic=overview-lsf-introduction)).
  While these ecosystems provide a great deal of control and extension
  for planning, scheduling, and batching jobs, they are limited in their
  ability to support parameterization in a scheduled task.  While there
  are facilities in place to execute jobs on an Array, the ability to do
  permutation based experments are limited to what you integrate into
  your own batch script.  Even then, parameterization of values are only
  made availabile as environment variables, which can be limited
  depending on your OS or selected programming language.  In many cases
  limitations set by the deployment trhough the compute center also
  hinder optimal use while restrictions are placed on duration and
  number of parallel accessible resources. In some cases these
  restrictions are soo established that removing them is impractical and
  takes weks to implement on temporary basis.

  Cloudmesh Sbatch is a framework that wraps the SLURM batch processor
  into a templated framework such that experiments can be generated
  based on configuration files focusing on the livecycle of generating
  many permutations of experiments with standard tooling, so that you
  can focus more on modeling your experiments than how to orchestrate
  them with tools.  A number of batch scripts can be generated that than
  can be executed according to center policies.



  When you install cloudmesh-sbatch, you will also be installing a
  minimum baseline of the `cms` command (as part of the Cloudmesh
  ecosystem).  For more details on Cloudmesh, see its documentation on
  [read the docs](https://cloudmesh.github.io/cloudmesh-manual/). However
  all instalation can be done thorugh pip. After instalation, you will
  need to initialize cloudmesh with the command

  ```bash
  $ cms help
  ```

  While SLURM is not needed to run the `cloudmesh sbatch` command, the
  generated output will not exectue unless your system has slurm installed
  and you are able to run jobs via the `slurm sbatch` command.





  The `cloudmesh sbatch` command takes one of two forms of execution.  It is started with

  ```bash
  $ cms sbatch <command> <parameters>
  ```

  Where the command invokes a partiuclar action and parameters include a
  number of parameters for the command These commands allow you to
  inspect the generated output to confirm your parameterization
  functions as expected and as intended.

  In general, configuration arguments that appear in multiple locations are
  prioritized in the following order (highest priority first)

  1. CLI Arguments with `cms sbatch`
  2. Configuration Files
  3. Preset values



  The `generate` command is used to generate your experiments based upon either a passed
  configuration file, or via CLI arguments.  You can issue the command using
  either of the below forms:

  ```text
  cms sbatch generate SOURCE --name=NAME [--verbose] [--mode=MODE] [--config=CONFIG] [--attributes=PARAMS] [--out=DESTINATION] [--dryrun] [--noos] [--nocm] [--dir=DIR] [--experiment=EXPERIMENT]
  cms sbatch generate --setup=FILE [SOURCE] [--verbose] [--mode=MODE]  [--config=CONFIG] [--attributes=PARAMS] [--out=DESTINATION] [--dryrun] [--noos] [--nocm] [--dir=DIR] [--experiment=EXPERIMENT] [--name=NAME]
  ```

  If you have prepared a configuration file that conforms to the schema
  defined in [Setup Config](#setup-config), then you can use the second
  form which overrides the default values.

  * `--name=NAME` - Supplies a name for this experiment.  Note that the name
    must not match any existing files or directories where you are currently
    executing the command
  * `--verbose` - Enables additional logging useful when troubleshooting the
    program.
  * `--mode=MODE` - specifies how the output should be generated.  One of: f,h,d.
    * `f` or `flat` - specifies a "flat" mode, where slurm scripts are generated in a flattened structure, all in one directory.
    * `h` or `hierarchical` - specifies a "hierarchical" mode, where experiments are nested into unique directories from each other.
    * `d` or `debug` - instructs the command to not generate any output.
  * `--config=CONFIG` - specifies key-value pairs to be used across all files for substitution.  This can be a python, yaml, or json file.
  * `--attributes=PARAMS` - specifies key-value pairs that can be listed at the command line and used as substitution across all experiments.  Note this command leverages [cloudmesh's parameter expansion specification](https://cloudmesh.github.io/cloudmesh-manual/autoapi/cloudmeshcommon/cloudmesh/common/parameter/index.html) for different types of expansion rules.
  * `--out=DESTINATION` - specifies the directory to write the generated scripts out to.
  * `--dryrun` - Runs the command without performing any operations
  * `--noos` - Prevents the interleaving of OS environemnt variables into the subsitution logic
  * `--dir=DIR` - specifies the directory to write the generated scripts out to.
  * `--experiment=EXPERIMENT` - specifies a listing of key-value parameters that establish a unique experiment for each combination of values (a cartisian product across all values for each key).

  * `--setup=FILE` - provides all the above configuration options within a configuration
    file to simplify executions.



  ```text
  sbatch generate submit --name=NAME [--verbose]
  ```

  This command uses the output of the
  [generate command](#command-1---generating-experiments) and generates
  a shell script that can be used to submit your previously generated
  outputs to SLURM as a sequence of sbatch commands.

  * `--name=NAME` - specifies the name used in the
    [generate command](#command-1---generating-experiments).
    The generate command will inspect the `<NAME>.json` file and build the
    necessary commands to run all permutations that the cloudmesh sbatch
    command generated.

  Note that this command only generates the script, and you must run the
  outputted file in your shell for the commands to be issued to SLURM and
  run your jobs.


  **Sample YAML File**

  This command requires a YAML file which is configured for the host and gpu.
  The YAML file also points to the desired slurm template.

  ```python
  slurm_template: 'slurm_template.slurm'

  sbatch_setup:
    <hostname>-<gpu>:
      - card_name: "a100"
      - time: "05:00:00"
      - num_cpus: 6
      - num_gpus: 1

    rivanna-v100:
      - card_name: "v100"
      - time: "06:00:00"
      - num_cpus: 6
      - num_gpus: 1


  ```

  example:

  ```
  cms sbatch slurm.in.sh --config=a.py,b.json,c.yaml --attributes=a=1,b=4  --noos --dir=example --experiment=\"epoch=[1-3] x=[1,4] y=[10,11]\"
  sbatch slurm.in.sh --config=a.py,b.json,c.yaml --attributes=a=1,b=4 --noos --dir=example --experiment="epoch=[1-3] x=[1,4] y=[10,11]"

  epoch=1 x=1 y=10  sbatch example/slurm.sh
  epoch=1 x=1 y=11  sbatch example/slurm.sh
  epoch=1 x=4 y=10  sbatch example/slurm.sh
  epoch=1 x=4 y=11  sbatch example/slurm.sh
  epoch=2 x=1 y=10  sbatch example/slurm.sh
  epoch=2 x=1 y=11  sbatch example/slurm.sh
  epoch=2 x=4 y=10  sbatch example/slurm.sh
  epoch=2 x=4 y=11  sbatch example/slurm.sh
  epoch=3 x=1 y=10  sbatch example/slurm.sh
  epoch=3 x=1 y=11  sbatch example/slurm.sh
  epoch=3 x=4 y=10  sbatch example/slurm.sh
  epoch=3 x=4 y=11  sbatch example/slurm.sh
  Timer: 0.0022s Load: 0.0013s sbatch slurm.in.sh --config=a.py,b.json,c.yaml --attributes=a=1,b=4 --noos --dir=example --experiment="epoch=[1-3] x=[1,4] y=[10,11]"
  ```





  see https://drtailor.medium.com/how-to-setup-slurm-on-ubuntu-20-04-for-single-node-work-scheduling-6cc909574365

  32 Processors (threads)

  ```bash
  sudo apt update -y
  sudo apt install slurmd slurmctld -y

  sudo chmod 777 /etc/slurm-llnl



  sudo cat << EOF > /etc/slurm-llnl/slurm.conf




  ClusterName=localcluster
  SlurmctldHost=$HOSTNAME
  MpiDefault=none
  ProctrackType=proctrack/linuxproc
  ReturnToService=2
  SlurmctldPidFile=/var/run/slurmctld.pid
  SlurmctldPort=6817
  SlurmdPidFile=/var/run/slurmd.pid
  SlurmdPort=6818
  SlurmdSpoolDir=/var/lib/slurm-llnl/slurmd
  SlurmUser=slurm
  StateSaveLocation=/var/lib/slurm-llnl/slurmctld
  SwitchType=switch/none
  TaskPlugin=task/none


  InactiveLimit=0
  KillWait=30
  MinJobAge=300
  SlurmctldTimeout=120
  SlurmdTimeout=300
  Waittime=0

  SchedulerType=sched/backfill
  SelectType=select/cons_tres
  SelectTypeParameters=CR_Core


  AccountingStorageType=accounting_storage/none
  JobCompType=jobcomp/none
  JobAcctGatherFrequency=30
  JobAcctGatherType=jobacct_gather/none
  SlurmctldDebug=info
  SlurmctldLogFile=/var/log/slurm-llnl/slurmctld.log
  SlurmdDebug=info
  SlurmdLogFile=/var/log/slurm-llnl/slurmd.log


  NodeName=$HOSTNAME CPUs=32 RealMemory==128762 State=UNKNOWN
  PartitionName=local Nodes=ALL Default=YES MaxTime=INFINITE State=UP
  EOF

  sudo chmod 755 /etc/slurm-llnl/
  ```


  ```
  sudo systemctl start slurmctld
  sudo systemctl start slurmd

  sudo scontrol update nodename=$HOSTNAME state=resume
  ```



  ```
  sudo systemctl stop slurmd
  sudo systemctl stop slurmctld
  ```



  ```
  sinfo
  sinfo -R
  sinfo -a
  ```



  save into gregor.slurm

  ```










  pwd; hostname; date

  echo "Gregors Test"
  date
  sleep(30)
  date
  ```

  Run with

  ```
  sbatch gregor.slurm
  watch -n 1 squeue
  ```

  BUG

  ```
  JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
                   2    LocalQ gregors_    green PD       0:00      1 (Nodes required for job are DOWN, DRAINED or reserved for jobs in higher priority partitions)

  ```



  start slurm deamons

  ```bash
  cms sbatch slurm start
  ```

  stop surm deamons

  ```bash
  cms sbatch slurm stop
  ```

  BUG:

  ```bash
  srun gregor.slurm

  srun: Required node not available (down, drained or reserved)
  srun: job 7 queued and waiting for resources
  ```

  ```
  sudo scontrol update nodename=localhost state=POWER_UP

  Valid states are: NoResp DRAIN FAIL FUTURE RESUME POWER_DOWN POWER_UP UNDRAIN

  ```



  * <https://slurm.schedmd.com/pdfs/summary.pdf>



  Continued work was in part funded by the NSF
  CyberTraining: CIC: CyberTraining for Students and Technologies
  from Generation Z with the awadrd numbers 1829704 and 2200409.


pkgId: 045dbb6fe6a9ee9ed698586a52852543d6ce3b25af87c3dbef5331c518849818
name: python-cloudmesh-sys
arch: src
version: 5.0.6
epoch: 0
release: 1
url: https://github.com/cloudmesh/cloudmesh-sys
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudmesh-sys-5.0.6-1.src.rpm
checksum_type: sha256
summary:
  A cloudmesh command sys that can generate new cloudmesh commands and gets some info about cloudmesh deployments.

description:
  Cloudmesh sys is a command that allows the generation of new plugin
  commands to cmd5. For more details we like you to look at the
  `cloudmesh.cmd5` manual and the `cloudmesh.manual` pages at
  * <https://github.com/cloudmesh/cloudmesh.cmd5>
  * <https://cloudmesh.github.io/cloudmesh-manual>

  Continued work was in part funded by the NSF
  CyberTraining: CIC: CyberTraining for Students and Technologies
  from Generation Z with the awadrd numbers 1829704 and 2200409.

rpm_license:
[cell repeats an earlier one in this file: 720 characters]


pkgId: b323f5921d7ed83523dfd048c53e3a7de96dfebefb99b630947cb8295bee8293
name: python-cloudmesh_client
arch: src
version: 4.7.3
epoch: 0
release: 1
summary: cloudmesh_client - A heterogeneous multi cloud command client and shell
url: https://github.com/cloudmesh/cloudmesh_client
rpm_license: Apache License, Version 2.0
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudmesh_client-4.7.3-1.src.rpm
checksum_type: sha256
description:
  Cloudmesh client is a simple client to enable access to multiple cloud
  environments form a command shell and commandline. It is grown out of
  the need to simplify access to multiple clouds for researchers and students
  easily. In contrast to our earlier versions of cloudmesh it explicitly
  separates the code to only target client code. Due to this simplification
  it is also possible to install the client code not only on Linux, OSX, but
  also Windows. We have tested the installation on Windows 10.


pkgId: 3565268d86c043bc0473759be481bf3ffe12cc530bc6c50a68aeedaa3ab5860f
name: python-cloudnetpy
arch: src
version: 1.66.11
epoch: 0
release: 1
summary: Python package for Cloudnet processing
url: https://github.com/actris-cloudnet/cloudnetpy
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudnetpy-1.66.11-1.src.rpm
checksum_type: sha256
description:
  [![CloudnetPy CI](https://github.com/actris-cloudnet/cloudnetpy/actions/workflows/test.yml/badge.svg)](https://github.com/actris-cloudnet/cloudnetpy/actions/workflows/test.yml)
  [![PyPI version](https://badge.fury.io/py/cloudnetpy.svg)](https://badge.fury.io/py/cloudnetpy)
  [![DOI](https://zenodo.org/badge/233602651.svg)](https://zenodo.org/badge/latestdoi/233602651)
  [![status](https://joss.theoj.org/papers/959971f196f617dddc0e7d8333ff22b7/status.svg)](https://joss.theoj.org/papers/959971f196f617dddc0e7d8333ff22b7)

  CloudnetPy is Python software designed for producing vertical profiles of cloud properties from ground-based
  remote sensing measurements. The Cloudnet processing combines data from cloud radar, optical lidar,
  microwave radiometer, and numerical weather prediction models.
  Measurements and model data are brought into a common grid and
  classified as ice, liquid, aerosol, insects, and so on.
  Subsequently, geophysical products such as ice water content can be
  retrieved in further processing steps. See [Illingworth et al. (2007)](https://doi.org/10.1175/BAMS-88-6-883) for more details about the concept.

  CloudnetPy is a rewritten version of the original Cloudnet Matlab code. It features several revised methods, extensive documentation, and more.

  - CloudnetPy documentation: <https://actris-cloudnet.github.io/cloudnetpy/>
  - Cloudnet data portal: <https://cloudnet.fmi.fi>

  ![CloudnetPy example output](https://raw.githubusercontent.com/actris-cloudnet/cloudnetpy/main/docs/source/_static/20230831_lindenberg_classification-9b74f4ac-target_classification.png)





  ```
  python3 -m pip install cloudnetpy
  ```



  ```sh
  git clone https://github.com/actris-cloudnet/cloudnetpy
  cd cloudnetpy/
  python3 -m venv venv
  source venv/bin/activate
  python3 -m pip install --upgrade pip
  python3 -m pip install .
  ```



  If you wish to acknowledge CloudnetPy in your publication, please cite:

  > Tukiainen et al., (2020). CloudnetPy: A Python package for processing cloud remote sensing data. Journal of Open Source Software, 5(53), 2123, https://doi.org/10.21105/joss.02123



  We encourage you to contribute to CloudnetPy! Please check out the [contribution guidelines](CONTRIBUTING.md) about how to proceed.



  Follow the installation instructions from the source above but install with the development dependencies and [pre-commit](https://pre-commit.com/) hooks:

  ```sh
  python3 -m pip install -e .[dev,test]
  pre-commit install
  ```

  Run unit tests:

  ```sh
  python3 -m pytest --flake-finder --flake-runs=2
  ```

  Run single unit test:

  ```sh
  python3 -m pytest tests/unit/test_hatpro.py
  ```

  Run end-to-end tests:

  ```sh
  python3 tests/e2e_test.py
  ```

  ```sh
  for f in cloudnetpy/model_evaluation/tests/e2e/*/main.py; do $f; done
  ```

  Force `pre-commit` checks (`ruff`, `mypy`, etc.) for all files:

  ```sh
  pre-commit run --all
  ```



  MIT

rpm_license:
  MIT License  Copyright (c) 2019-2022 Finnish Meteorological Institute  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


pkgId: eebcf099c88604c06c52bb4be9cd9bd827e75cc3b7503cbc5796be2463e1b749
name: python-cloudnetpy
arch: src
version: 1.66.13
epoch: 0
release: 1
summary: Python package for Cloudnet processing
url: https://github.com/actris-cloudnet/cloudnetpy
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudnetpy-1.66.13-1.src.rpm
checksum_type: sha256
description:
  [![CloudnetPy CI](https://github.com/actris-cloudnet/cloudnetpy/actions/workflows/test.yml/badge.svg)](https://github.com/actris-cloudnet/cloudnetpy/actions/workflows/test.yml)
  [![PyPI version](https://badge.fury.io/py/cloudnetpy.svg)](https://badge.fury.io/py/cloudnetpy)
  [![DOI](https://zenodo.org/badge/233602651.svg)](https://zenodo.org/badge/latestdoi/233602651)
  [![status](https://joss.theoj.org/papers/959971f196f617dddc0e7d8333ff22b7/status.svg)](https://joss.theoj.org/papers/959971f196f617dddc0e7d8333ff22b7)

  CloudnetPy is Python software designed for producing vertical profiles of cloud properties from ground-based
  remote sensing measurements. The Cloudnet processing combines data from cloud radar, optical lidar,
  microwave radiometer, and numerical weather prediction models.
  Measurements and model data are brought into a common grid and
  classified as ice, liquid, aerosol, insects, and so on.
  Subsequently, geophysical products such as ice water content can be
  retrieved in further processing steps. See [Illingworth et al. (2007)](https://doi.org/10.1175/BAMS-88-6-883) for more details about the concept.

  CloudnetPy is a rewritten version of the original Cloudnet MATLAB code. It features several revised methods, extensive documentation, and more.

  - CloudnetPy documentation: <https://actris-cloudnet.github.io/cloudnetpy/>
  - Cloudnet data portal: <https://cloudnet.fmi.fi>

  ![CloudnetPy example output](https://raw.githubusercontent.com/actris-cloudnet/cloudnetpy/main/docs/source/_static/20230831_lindenberg_classification-9b74f4ac-target_classification.png)





  ```
  python3 -m pip install cloudnetpy
  ```



  ```sh
  git clone https://github.com/actris-cloudnet/cloudnetpy
  cd cloudnetpy/
  python3 -m venv venv
  source venv/bin/activate
  python3 -m pip install --upgrade pip
  python3 -m pip install .
  ```



  To verify the installation:

  ```sh
  cloudnetpy --help
  ```



  If you wish to acknowledge CloudnetPy in your publication, please cite:

  > Tukiainen et al., (2020). CloudnetPy: A Python package for processing cloud remote sensing data. Journal of Open Source Software, 5(53), 2123, https://doi.org/10.21105/joss.02123



  We encourage you to contribute to CloudnetPy! Please check out the [contribution guidelines](CONTRIBUTING.md) about how to proceed.



  Follow the installation instructions from the source above but install with the development dependencies and [pre-commit](https://pre-commit.com/) hooks:

  ```sh
  python3 -m pip install -e .[dev,test]
  pre-commit install
  ```

  Run unit tests:

  ```sh
  python3 -m pytest
  python3 -m pytest tests/unit/test_hatpro.py
  ```

  Run end-to-end tests:

  ```sh
  python3 tests/e2e_test.py
  for f in cloudnetpy/model_evaluation/tests/e2e/*/main.py; do $f; done
  ```

  Force `pre-commit` checks (`ruff`, `mypy`, etc.) for all files:

  ```sh
  pre-commit run --all
  ```



  MIT

rpm_license:
  MIT License  Copyright (c) 2019-2022 Finnish Meteorological Institute  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


pkgId: 9817f2f1c4476bfe99d325cd816bb8a6633e1d97addd44bb62b25c52a70b6084
name: python-cloudnetpy-qc
arch: src
version: 1.17.20
epoch: 0
release: 1
summary: Quality control routines for CloudnetPy products
url: https://github.com/actris-cloudnet/cloudnetpy-qc
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudnetpy-qc-1.17.20-1.src.rpm
checksum_type: sha256
description:
  [![CloudnetPy-QC CI](https://github.com/actris-cloudnet/cloudnetpy-qc/actions/workflows/test.yml/badge.svg)](https://github.com/actris-cloudnet/cloudnetpy-qc/actions/workflows/test.yml)
  [![PyPI version](https://badge.fury.io/py/cloudnetpy-qc.svg)](https://badge.fury.io/py/cloudnetpy-qc)

  Software for evaluating quality of [ACTRIS-Cloudnet](https://cloudnet.fmi.fi) data products.



  ```shell
  $ pip3 install cloudnetpy-qc
  ```



  ```python
  import json
  from cloudnetpy_qc import quality
  report = quality.run_tests('cloudnet-file.nc')
  json_object = json.dumps(report.to_dict(), indent=2)
  print(json_object)
  ```



  - `timestamp`: UTC timestamp of the test
  - `qcVersion`: `cloudnetpy-qc` version
  - `tests`: `Test[]`



  - `testId`: Unique name of the test
  - `exceptions`: `Exception[]`



  - `message`: Free-form message about the exception
  - `result`: `"info"`, `"error"` or `"warning"`



  ```json
  {
    "timestamp": "2022-10-13T07:00:26.906815Z",
    "qcVersion": "1.1.2",
    "tests": [
      {
        "testId": "TestUnits",
        "exceptions": []
      },
      {
        "testId": "TestInstrumentPid",
        "exceptions": [
          {
            "message": "Instrument PID is missing.",
            "result": "warning"
          }
        ]
      },
      {
        "testId": "TestTimeVector",
        "exceptions": []
      },
      {
        "testId": "TestVariableNames",
        "exceptions": []
      },
      {
        "testId": "TestCFConvention",
        "exceptions": []
      }
    ]
  }
  ```



  | Test                       | Description                                                                             |
  | -------------------------- | --------------------------------------------------------------------------------------- |
  | `FindAttributeOutliers`    | Find suspicious values in global attributes.                                            |
  | `FindFolding`              | Test for radar folding.                                                                 |
  | `FindVariableOutliers`     | Find suspicious data values.                                                            |
  | `TestCFConvention`         | Test compliance with the CF metadata conventions.                                       |
  | `TestDataCoverage`         | Test that file contains enough data.                                                    |
  | `TestDataTypes`            | Check that variables have expected data types.                                          |
  | `TestFillValue`            | Test that fill value is explicitly set for variables with missing data.                 |
  | `TestFloatingPointValues`  | Test for special floating-point values which may indicate problems with the processing. |
  | `TestGlobalAttributes`     | Check that file contains required global attributes.                                    |
  | `TestIfRangeCorrected`     | Test that beta is range corrected.                                                      |
  | `TestInstrumentPid`        | Test that valid instrument PID exists.                                                  |
  | `TestLDR`                  | Test that LDR values are proper.                                                        |
  | `TestLidarBeta`            | Test that one beta variable exists.                                                     |
  | `TestLongNames`            | Check that variables have expected long names.                                          |
  | `TestMask`                 | Test that data are not completely masked.                                               |
  | `TestMedianLwp`            | Test that LWP data are valid.                                                           |
  | `TestModelData`            | Test that model data are valid.                                                         |
  | `TestStandardNames`        | Check that variable have expected standard names.                                       |
  | `TestTimeVector`           | Test that time vector is continuous.                                                    |
  | `TestUnits`                | Check that variables have expected units.                                               |
  | `TestVariableNames`        | Check that file contains required variables.                                            |
  | `TestVariableNamesDefined` | Check that variables have expected names.                                               |



  MIT

rpm_license:
  MIT License  Copyright (c) 2021-2022 Finnish Meteorological Institute  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


pkgId: 7feb79499ecc0ce49166ba5831db864ff4ab82b9b2ce01ca3dad4a1419e07f21
name: python-cloudnetpy-qc
arch: src
version: 1.18.1
epoch: 0
release: 1
summary: Quality control routines for CloudnetPy products
url: https://github.com/actris-cloudnet/cloudnetpy-qc
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudnetpy-qc-1.18.1-1.src.rpm
checksum_type: sha256
description:
  [![CloudnetPy-QC CI](https://github.com/actris-cloudnet/cloudnetpy-qc/actions/workflows/test.yml/badge.svg)](https://github.com/actris-cloudnet/cloudnetpy-qc/actions/workflows/test.yml)
  [![PyPI version](https://badge.fury.io/py/cloudnetpy-qc.svg)](https://badge.fury.io/py/cloudnetpy-qc)

  Software for evaluating quality of [ACTRIS-Cloudnet](https://cloudnet.fmi.fi) data products.



  ```shell
  $ pip3 install cloudnetpy-qc
  ```



  ```python
  import json
  from cloudnetpy_qc import quality
  report = quality.run_tests('cloudnet-file.nc')
  json_object = json.dumps(report.to_dict(), indent=2)
  print(json_object)
  ```



  - `timestamp`: UTC timestamp of the test
  - `qcVersion`: `cloudnetpy-qc` version
  - `tests`: `Test[]`



  - `testId`: Unique name of the test
  - `exceptions`: `Exception[]`



  - `message`: Free-form message about the exception
  - `result`: `"info"`, `"error"` or `"warning"`



  ```json
  {
    "timestamp": "2022-10-13T07:00:26.906815Z",
    "qcVersion": "1.1.2",
    "tests": [
      {
        "testId": "TestUnits",
        "exceptions": []
      },
      {
        "testId": "TestInstrumentPid",
        "exceptions": [
          {
            "message": "Instrument PID is missing.",
            "result": "warning"
          }
        ]
      },
      {
        "testId": "TestTimeVector",
        "exceptions": []
      },
      {
        "testId": "TestVariableNames",
        "exceptions": []
      },
      {
        "testId": "TestCFConvention",
        "exceptions": []
      }
    ]
  }
  ```



  | Test                        | Description                                                                             |
  | --------------------------- | --------------------------------------------------------------------------------------- |
  | `FindAttributeOutliers`     | Find suspicious values in global attributes.                                            |
  | `FindFolding`               | Test for radar folding.                                                                 |
  | `FindVariableOutliers`      | Find suspicious data values.                                                            |
  | `TestBrightnessTemperature` | Test that brightness temperature data are valid.                                        |
  | `TestCFConvention`          | Test compliance with the CF metadata conventions.                                       |
  | `TestDataCoverage`          | Test that file contains enough data.                                                    |
  | `TestDataTypes`             | Check that variables have expected data types.                                          |
  | `TestFillValue`             | Test that fill value is explicitly set for variables with missing data.                 |
  | `TestFloatingPointValues`   | Test for special floating-point values which may indicate problems with the processing. |
  | `TestGlobalAttributes`      | Check that file contains required global attributes.                                    |
  | `TestIfRangeCorrected`      | Test that beta is range corrected.                                                      |
  | `TestInstrumentPid`         | Test that valid instrument PID exists.                                                  |
  | `TestLDR`                   | Test that LDR values are proper.                                                        |
  | `TestLidarBeta`             | Test that one beta variable exists.                                                     |
  | `TestLongNames`             | Check that variables have expected long names.                                          |
  | `TestMWRMultiTemperature`   | Test that temperature data are valid.                                                   |
  | `TestMWRSingleLWP`          | Test that LWP data are valid.                                                           |
  | `TestMask`                  | Test that data are not completely masked.                                               |
  | `TestMedianLwp`             | Test that LWP data are valid.                                                           |
  | `TestModelData`             | Test that model data are valid.                                                         |
  | `TestStandardNames`         | Check that variable have expected standard names.                                       |
  | `TestTimeVector`            | Test that time vector is continuous.                                                    |
  | `TestUnexpectedMask`        | Test if data contain unexpected masked values.                                          |
  | `TestUnits`                 | Check that variables have expected units.                                               |
  | `TestVariableNames`         | Check that file contains required variables.                                            |
  | `TestVariableNamesDefined`  | Check that variables have expected names.                                               |



  MIT

rpm_license:
  MIT License  Copyright (c) 2021-2022 Finnish Meteorological Institute  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


pkgId: 996e2ca4066e2f9484ed89a743ff5e38db5aa6f00b270ca0b991dadd495878cd
name: python-cloudpath
arch: src
version: 0.2.0
epoch: 0
release: 1
summary: Optimized pathlib backend for Google Cloud
url: http://github.com/danijar/cloudpath
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudpath-0.2.0-1.src.rpm
checksum_type: sha256
description:
  [![PyPI](https://img.shields.io/pypi/v/cloudpath.svg)](https://pypi.python.org/pypi/cloudpath/#history)



  Optimized pathlib backend for Google Cloud.

  A filesystem abstraction similar to `pathlib` that is extensible to new
  filesystems. Comes with support for local filesystems and GCS buckets.

  ```python
  path = cloudpath.Path('gs://bucket/path/to/file.txt')


  path.parent                           # gs://bucket/path/to
  path.name                             # file.txt
  path.stem                             # file
  path.suffix                           # .txt


  path.read(mode='r')                   # Content of the file as string
  path.read(mode='rb')                  # Content of the file as bytes
  path.write(content, mode='w')         # Write string to the file
  path.write(content, mode='wb')        # Write bytes to the file
  with path.open(mode='r') as f:        # Create a file pointer
    pass


  path.parent.glob('*')                 # Get all sibling paths
  path.exists()                         # True
  path.isdir()                          # False
  path.isfile()                         # True


  (path.parent / 'foo').mkdir()         # Creates directory including parents
  path.remove()                         # Deletes a file or empty directory
  path.parent.rmtree()                  # Deletes directory and its content
  path.copy(path.parent / 'copy.txt')   # Makes a copy
  path.move(path.parent / 'moved.txt')  # Moves the file
  ```


pkgId: e188c5b68b789468f973ec4f3df9e15f4085ddda268fca05d7d968f63a85e44e
name: python-cloudpathlib
arch: src
version: 0.19.0
epoch: 0
release: 1
summary: pathlib-style classes for cloud storage services.
url: https://pypi.org/project/cloudpathlib/
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudpathlib-0.19.0-1.src.rpm
checksum_type: sha256
description:
  <sup>Icon made by <a href="https://www.flaticon.com/authors/srip" title="srip">srip</a> from <a href="https://www.flaticon.com/" title="Flaticon">www.flaticon.com</a>.</sup>
  <br /><sup>Sample code block generated using the [reprexpy package](https://github.com/crew102/reprexpy).</sup>


pkgId: 2f8a7602fb63b125f743e5284317844ed62f8ae81445a21c8ac6194995685944
name: python-cloudprober-serverutils
arch: src
version: 0.13.8.post13
epoch: 0
release: 1
summary: Package for Cloudprober's external probe's serverutils
url: https://cloudprober.org
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudprober-serverutils-0.13.8.post13-1.src.rpm
checksum_type: sha256
description:
  [![Docker Pulls](https://img.shields.io/docker/pulls/cloudprober/cloudprober.svg)](https://hub.docker.com/v2/repositories/cloudprober/cloudprober/)
  [![Go Build and Test](https://github.com/cloudprober/cloudprober/actions/workflows/go.yml/badge.svg)](https://github.com/cloudprober/cloudprober/actions/workflows/go.yml)
  [![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=cloudprober_cloudprober&metric=security_rating)](https://sonarcloud.io/summary/new_code?id=cloudprober_cloudprober)
  [![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=cloudprober_cloudprober&metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=cloudprober_cloudprober)

  Homepage and documentation: [cloudprober.org](https://cloudprober.org)

  _NOTE: Cloudprober's active development moved from
  ~~[google/cloudprober](https://github.com/google/cloudprober)~~ to
  [cloudprober/cloudprober](https://github.com/cloudprober/cloudprober) in
  Nov, 2021. We lost a bunch of Github stars (1400) in the process. See
  [story of cloudprober](https://medium.com/@manugarg/story-of-cloudprober-5ac1dbc0066c)
  to learn more about the history of Cloudprober._


  Cloudprober is a monitoring software that makes it super-easy to monitor
  availability and performance of various components of your system. Cloudprober
  employs the "active" monitoring model. It runs probes against (or on) your
  components to verify that they are working as expected. For example, it can run
  a probe to verify that your frontends can reach your backends. Similarly it can
  run a probe to verify that your in-Cloud VMs can actually reach your on-premise
  systems. This kind of monitoring makes it possible to monitor your systems'
  interfaces regardless of the implementation and helps you quickly pin down
  what's broken in your system (see
  [why probers](https://medium.com/@manugarg/why-you-need-probers-f38400f5830e)).

  <img width="460" src="https://cloudprober.org/homepage.png"/>



  - Out of the box, config based, integration with many popular monitoring
    systems:

    - [Prometheus/Grafana](https://prometheus.io)
    - [DataDog](https://www.datadoghq.com/)
    - [PostgreSQL](https://www.postgresql.org/)
    - [AWS CloudWatch](https://aws.amazon.com/cloudwatch/)
    - [StackDriver / Google Cloud Monitoring](https://cloud.google.com/stackdriver/)

  - Multiple options for checks:

    - _Efficient, highly scalable_, built-in probes:
      [HTTP](https://github.com/cloudprober/cloudprober/blob/master/probes/http/proto/config.proto),
      [PING](https://github.com/cloudprober/cloudprober/blob/master/probes/ping/proto/config.proto),
      [TCP](https://github.com/cloudprober/cloudprober/blob/master/probes/tcp/proto/config.proto),
      [DNS](https://github.com/cloudprober/cloudprober/blob/master/probes/dns/proto/config.proto),
      [gRPC](https://github.com/cloudprober/cloudprober/blob/master/probes/grpc/proto/config.proto),
      [UDP](https://github.com/cloudprober/cloudprober/blob/master/probes/udp/proto/config.proto).
    - Run custom checks through the
      _"[external](https://cloudprober.org/how-to/external-probe/)"_ probe type.

  - Automated targets discovery to make Cloud deployments as painless as possible:

    - _[Kubernetes](https://cloudprober.org/how-to/run-on-kubernetes/#kubernetes-targets)_
      resources.
    - _[GCP](https://github.com/cloudprober/cloudprober/blob/master/internal/rds/gcp/proto/config.proto)_
      instances, forwarding rules, and pub/sub messages.
    - _[File](https://github.com/cloudprober/cloudprober/blob/master/internal/rds/file/proto/config.proto#L34)_
      based targets.

  - Deployment friendly:

    - Written entirely in Go, and compiles into a static binary.
    - Deploy as a standalone binary, or through docker containers.
    - Continuous, automated target discovery, to ensure that most infrastructure
      changes don't require re-deployment.

  - Low footprint. Cloudprober takes advantage of the Go's concurrency paradigms,
    and makes most of the available processing power.
  - Configurable metrics:

    - Configurable metrics labels, based on the resource labels.
    - Latency histograms for percentile calculations.

  - Extensible architecture. Cloudprober can be easily extended along most of the
    dimensions. Adding support for other Cloud targets, monitoring systems and
    even a new probe type, is straight-forward and fairly easy.



  Visit [Getting Started](http://cloudprober.org/getting-started) page to get
  started with Cloudprober.



  We'd love to hear your feedback. If you're using Cloudprober, would you please
  mind sharing how you use it by adding a comment
  [here](https://github.com/cloudprober/cloudprober/discussions/121). It will be a
  great help in planning Cloudprober's future progression.

  Join
  [Cloudprober Slack](https://join.slack.com/t/cloudprober/shared_invite/enQtNjA1OTkyOTk3ODc3LWQzZDM2ZWUyNTI0M2E4NmM4NTIyMjM5M2E0MDdjMmU1NGQ3NWNiMjU4NTViMWMyMjg0M2QwMDhkZGZjZmFlNGE)
  or [Github discussions](https://github.com/cloudprober/cloudprober/discussions)
  for questions and discussion about Cloudprober.


pkgId: aa2109d08ba7299ab42d988dfb5d6258b1dc167534bf1ecea4a22b9fd7471fd5
name: python-cloudpy-org
arch: src
version: 1.6.3
epoch: 0
release: 1
summary: Cloud data pipeline organization and automation library. Includes AWS framework manager API.
url: https://www.cloudpy.org/
rpm_license: MIT
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudpy-org-1.6.3-1.src.rpm
checksum_type: sha256
description:
  A library to programmatically create, interact, encrypt and automate your data pipelines making it simple to scale to the most popular cloud plattforms.


pkgId: a880de2eee668d54616e2de2268c6294cff1f626e934be688ceaf57cfa2cf76b
name: python-cloudscale-cli
arch: src
version: 1.4.0
epoch: 0
release: 1
summary: Command line interface client for cloudscale.ch
url: https://github.com/cloudscale-ch/cloudscale-cli
rpm_license: MIT
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudscale-cli-1.4.0-1.src.rpm
checksum_type: sha256
description:
  ![license](https://img.shields.io/pypi/l/cloudscale-cli.svg)
  ![python versions](https://img.shields.io/pypi/pyversions/cloudscale-cli.svg)
  ![status](https://img.shields.io/pypi/status/cloudscale-cli.svg)
  [![pypi version](https://img.shields.io/pypi/v/cloudscale-cli.svg)](https://pypi.org/project/cloudscale-cli/)
  ![PyPI - Downloads](https://img.shields.io/pypi/dw/cloudscale-cli)



  The official [cloudscale.ch](https://www.cloudscale.ch) command line interface (CLI) client.



  ~~~shell
  pipx install cloudscale-cli
  cloudscale --help
  ~~~



  ~~~raw
  Usage: cloudscale [OPTIONS] COMMAND [ARGS]...

  Options:
    --version                  Show the version and exit.
    -a, --api-token TEXT       API token.
    -p, --profile TEXT         Profile used in config file.
    --debug                    Enables debug log output.
    -o, --output [table|json]  Output format.  [default: table]
    -h, --help                 Show this message and exit.

  Commands:
    flavor
    floating-ip
    image
    network
    objects-user
    region
    server
    server-group
    subnet
    volume
  ~~~



  Please visit [https://cloudscale-ch.github.io/cloudscale-cli](https://cloudscale-ch.github.io/cloudscale-cli).


pkgId: 7217daf2caba7d06cf52060ee9b57fe79dd96b77238a8b35af7e4275c27b28b1
name: python-cloudscale-sdk
arch: src
version: 0.7.0
epoch: 0
release: 1
summary: A library and SDK for cloudscale.ch
url: https://github.com/cloudscale-ch/cloudscale-python-sdk
rpm_license: MIT
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudscale-sdk-0.7.0-1.src.rpm
checksum_type: sha256
description:
  ![license](https://img.shields.io/pypi/l/cloudscale-sdk.svg)
  ![python versions](https://img.shields.io/pypi/pyversions/cloudscale-sdk.svg)
  ![status](https://img.shields.io/pypi/status/cloudscale-sdk.svg)
  [![pypi version](https://img.shields.io/pypi/v/cloudscale-sdk.svg)](https://pypi.org/project/cloudscale-sdk/)
  ![PyPI - Downloads](https://img.shields.io/pypi/dw/cloudscale-sdk)



  A Python3 library for [cloudscale.ch](https://www.cloudscale.ch).



  ~~~shell
  pip3 install cloudscale-sdk
  ~~~





  ~~~shell
  tox -e coverage
  ~~~


pkgId: 786ade6cf1cff1f44738109d5d363b054432e30334893035a31202fdc627fd0f
name: python-cloudscraper
arch: src
version: 1.2.71
epoch: 0
release: 1
summary: A Python module to bypass Cloudflare's anti-bot page.
url: https://github.com/venomous/cloudscraper
rpm_license: MIT License
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudscraper-1.2.71-1.src.rpm
checksum_type: sha256
description:
  [Brotli](https://en.wikipedia.org/wiki/Brotli) decompression support has been added, and it is enabled by default.

  |Parameter|Value|Default|
  |-------------|:-------------:|:-----:|
  |allow_brotli|(boolean)|True|

  ```python
  scraper = cloudscraper.create_scraper(allow_brotli=False)


pkgId: 0e8fbf4def4825b7319a19ef0f40b7b5a9a5447f9b1fc59cdbf9ae319a70d044
name: python-cloudsearch
arch: src
version: 0.0.12
epoch: 0
release: 1
summary: cloudsearch sdk for aws cloudsearch
url: https://github.com/thanakijwanavit/cloudsearch/tree/master/
rpm_license: Apache Software License 2.0
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudsearch-0.0.12-1.src.rpm
checksum_type: sha256
description:
  > Summary description here.


  This file will become your README and also the index of your documentation.



  `pip install your_project_name`



  very simple usage,
  init the search object then call sortedSearch()


  ```
  from cloudsearch.cloudsearch import Search
  searchEndpoint = 'https://search-villa-cloudsearch-2-4izacsoytzqf6kztcyjhssy2ti.ap-southeast-1.cloudsearch.amazonaws.com'
  searcher = Search(searchTerm = 'banana', key=USER, pw= PW , endpoint=searchEndpoint)
  result = searcher.search(size=1000)
  print(f'found {len(list(result))} results, the first item is \n{next(iter(result))}')
  ```

      found 464 results, the first item is
      {'pr_country_en': 'Thailand', 'pr_abb': 'BANANA', 'pr_engname': 'BANANA', 'pr_name': 'BANANA', 'pr_online_name_en': 'BANANA', 'pr_keyword_en': 'banana,bananas,Cavendish Banana,Cavendish,,Fresh fruit', 'pr_online_name_th': 'BANANA', 'cprcode': '0226238', 'villa_category_l2_en': 'Fresh Produce', 'content_en': '0226238 BANANA banana,bananas,Cavendish Banana,Cavendish,,Fresh fruit', 'pr_name_th': 'BANANA', 'iprcode': '0226238', 'oprcode': '0226238', 'villa_category_l3_en': 'Fruits & Vegetable Local', 'hema_name_en': 'BANANA', 'pr_keyword_th': 'กล้วย,กล้วยหอม,กล้วยไข่,กล้วยออร์แกนิก,กล้วออร์แกนิค,Fresh fruit', 'hema_name_th': 'BANANA', 'pr_name_en': 'BANANA', 'pr_code': '0226238', 'villa_category_l4_en': 'Local Fruit', 'content_th': 'BANANA กล้วย,กล้วยหอม,กล้วยไข่,กล้วยออร์แกนิก,กล้วออร์แกนิค,Fresh fruit', 'pr_active': 'Y', 'villa_category_l1_en': 'Fresh'}



  You can extend the class, please have a look at sortedSearch example

  ```
  _ = searcher.sortedSearch()
  ```

      raw search result is     villa_category_l1_en villa_category_l2_en      villa_category_l3_en  \
      0                  Fresh        Fresh Produce  Fruits & Vegetable Local
      1                    NaN                  NaN                       NaN
      2                  Fresh        Fresh Produce                    Bakery
      3                  Fresh        Fresh Produce                    Bakery
      4                  Fresh        Fresh Produce                    Bakery
      ..                   ...                  ...                       ...
      459                Fresh        Seafood Fresh                Crustacean
      460                Fresh        Seafood Fresh                Crustacean
      461                Fresh        Seafood Fresh             Local Seafood
      462                Fresh               Frozen                   Seafood
      463                Fresh        Seafood Fresh             Local Seafood

          villa_category_l4_en
      0            Local Fruit
      1                    NaN
      2          Cake category
      3          Cake category
      4         Pasty category
      ..                   ...
      459                Local
      460                Local
      461                  NaN
      462                  NaN
      463                  NaN

      [464 rows x 4 columns]


  ```
  import json
  boostDict = {
      "fields":["online_category_l1_en"]
  }
  queryOptions = json.dumps(boostDict)
  searcher2 = Search(searchTerm = 'dairy', key=USER, pw= PW , endpoint=searchEndpoint)
  result = searcher2.sortedSearch(queryOptions = queryOptions, size=10)
  ```

      raw search result is   villa_category_l1_en villa_category_l2_en villa_category_l3_en  \
      0                Fresh                Dairy     Chilled Beverage
      1                Fresh                Dairy                 Milk
      2                Fresh                Dairy               Cheese
      3                Fresh                Dairy     Chilled Beverage
      4                Fresh                Dairy                 Milk
      5                  NaN                  NaN                  NaN
      6                  NaN                  NaN                  NaN
      7                Fresh                Dairy               Cheese
      8                Fresh                Dairy               Yogurt
      9                Fresh                Dairy               Yogurt

        villa_category_l4_en
      0                  NaN
      1                  NaN
      2       Cheddar Cheese
      3                  NaN
      4                  NaN
      5                  NaN
      6                  NaN
      7                  NaN
      8               Yogurt
      9        YogurtGranola


  ```
  filterQuery = "(or " + " ".join(['online_category_l1_en' + f":'{cat}'" for cat in ['Dairy']]) + ")"
  searcher3 = Search(searchTerm = 'dairy', key=USER, pw= PW , endpoint=searchEndpoint)
  result = searcher3.sortedSearch(filterQuery = filterQuery, size=10)
  ```

      raw search result is   villa_category_l1_en villa_category_l2_en villa_category_l3_en  \
      0                  NaN                  NaN                  NaN
      1                Fresh                Dairy                 Milk
      2                Fresh                Dairy                Cream
      3                Fresh                Dairy                Cream
      4                Fresh                Dairy               Yogurt
      5                Fresh                Dairy               Yogurt
      6                Fresh                Dairy               Yogurt
      7                Fresh                Dairy               Yogurt
      8                Fresh                Dairy               Yogurt
      9                Fresh                Dairy               Yogurt

         villa_category_l4_en
      0                   NaN
      1                   NaN
      2                   NaN
      3                   NaN
      4                   NaN
      5                   NaN
      6                   NaN
      7                   NaN
      8                   NaN
      9                   NaN


  ```
  result[9]['online_category_l1_en']
  ```




      'Dairy'


pkgId: 0eb4b6188bec4f0b4c76bc1fa9549bb14dcee5ddc6bb0c0d0e1872d7856eba27
name: python-cloudshell-cp-core
arch: src
version: 2.5.4
epoch: 0
release: 1
url: http://www.qualisystems.com/
rpm_license: UNKNOWN
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudshell-cp-core-2.5.4-1.src.rpm
checksum_type: sha256
summary:
  A repository for projects providing out of the box capabilities within CloudShell to parse and convert cloudShell driver request to well defined python objects. One cloudshell-cp-core For All cloudshell cloud provider shells.

description:
  A repository for projects providing out of the box capabilities within CloudShell to parse and convert cloudShell driver request to well defined python objects. One cloudshell-cp-core For All cloudshell cloud provider shells.


pkgId: b43d43e035a135564658f99bf282ae6eee4d030936885b584470e98cdb1ea053
name: python-cloudshell-cp-vcenter
arch: src
version: 7.0.2
epoch: 0
release: 1
url: http://www.qualisystems.com/
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudshell-cp-vcenter-7.0.2-1.src.rpm
checksum_type: sha256
summary:
  This Shell enables setting up vCenter as a cloud provider in CloudShell. It supports connectivity, and adds new deployment types for apps which can be used in CloudShell sandboxes.

description:
  This Shell enables setting up vCenter as a cloud provider in CloudShell. It supports connectivity, and adds new deployment types for apps which can be used in CloudShell sandboxes.


pkgId: 6cc970d8da4a00c856abc1aa8bb13585d0454c4258620f2e235a97f3aed6b6ab
name: python-cloudshell-shell-core
arch: src
version: 6.0.2
epoch: 0
release: 1
url: https://github.com/QualiSystems/cloudshell-shell-core
rpm_license: Apache 2.0
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudshell-shell-core-6.0.2-1.src.rpm
checksum_type: sha256
summary:
  Core package for all CloudShell Shells. This package contains the basic driver interfaces and metadata definitions as well as utilities and helpers created specifically for Shells

description:
  Core package for all CloudShell Shells. This package contains the basic driver interfaces and metadata definitions as well as utilities and helpers created specifically for Shells


pkgId: b6b171ff1c1ac4b4fa9c945e9af9ce05a990c9e303ae54c2f5000ce3893278fb
name: python-cloudshovel
arch: src
version: 1.0.2
epoch: 0
release: 1
summary: A tool for digging secrets in public AMIs
url: https://github.com/saw-your-packet/CloudShovel
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudshovel-1.0.2-1.src.rpm
checksum_type: sha256
description:
  CloudShovel is a tool designed to search for sensitive information within public or private Amazon Machine Images (AMIs). It automates the process of launching instances from target AMIs, mounting their volumes, and scanning for potential secrets or sensitive data.

  The tool is a modified version of what was used for the research [AWS CloudQuarry: Digging for Secrets in Public AMIs](https://securitycafe.ro/2024/05/08/aws-cloudquarry-digging-for-secrets-in-public-amis/)

  Authors:
  - [Eduard Agavriloae](https://www.linkedin.com/in/eduard-k-agavriloae/) - [hacktodef.com](https://hacktodef.com)
  - [Matei Josephs](https://www.linkedin.com/in/l31/) - [hivehack.tech](https://hivehack.tech)


  **Disclaimer**

  > This is not a tool that will fit all scenarios. There will be errors when starting an EC2 instance based on the target AMI or when trying to mount the volumes. We accept pull requests for covering more cases, but our recommendation is to manually try to handle those cases.

  Table of Contents:

  - [Introduction](#introduction)
  - [Prerequisites](#prerequisites)
  - [Installation](#installation)
    - [Using pip](#using-pip)
    - [Manually](#manually)
  - [Usage](#usage)
  - [How It Works](#how-it-works)
  - [Customizing scanning](#customizing-scanning)
  - [Resources Created](#resources-created)
  - [Required Permissions](#required-permissions)
  - [Cleaning Up](#cleaning-up)
  - [Troubleshooting](#troubleshooting)




  Before using CloudShovel, ensure you have the following:

  - Python 3.6 or higher
  - Access to your own AWS account and IAM identity
  - Python libraries (can be installed automatically)
    - Boto3 library installed (`pip install boto3`)
    - Colorama library installed (`pip install colorama`)




  From terminal:

     ```bash
     python3 -m pip install cloudshovel
     ```



  1. Clone the CloudShovel repository:
     ```
     git clone https://github.com/your-repo/cloudshovel.git
     cd cloudshovel
     ```

  2. Install the required Python libraries:
     ```
     pip install -r requirements.txt
     ```



  To use CloudShovel, run the `main.py` script with the following syntax:

  ```
  cloudshovel <ami_id> --bucket <s3_bucket_name> [--profile <aws_profile> | --access-key <access_key> --secret-key <secret_key> (--session-token <session_token>)] [--region <aws_region>]
  ```

  Arguments:
  - `ami_id`: The ID of the AMI you want to scan (required)
  - `--bucket`: The name of the S3 bucket to store results (required)
  - Authentication with configured AWS CLI profile
    - `--profile`: AWS CLI profile name (default is 'default')
  - Authentication with access keys
    - `--access-key`: AWS Access Key ID
    - `--secret-key`: AWS Secret Access Key
    - `--session-token`: AWS Session Token (optional)
  - `--region`: AWS region (default is 'us-east-1')

  If you don't specify an argument for authentication, the tool will try to automatically use the `default` profile.

  Example:
  ```
  cloudshovel ami-1234567890abcdef --bucket my-cloudshovel-results --profile my-aws-profile --region us-west-2
  ```



  CloudShovel operates through the following steps:

  1. **Initialization**:
     - Parses command-line arguments and creates an AWS session.
     - Validates the target AMI's existence.

  2. **Setup**:
     - Creates or verifies the existence of the specified S3 bucket.
     - Creates an IAM role and instance profile for the "secret searcher" EC2 instance.
     - Uploads necessary scripts to the S3 bucket.

  3. **Secret Searcher Instance**:
     - Launches an EC2 instance (the "secret searcher") based on the latest Amazon Linux 202* AMI.
     - Installs required tools on the secret searcher instance.

  4. **Target AMI Processing**:
     - Launches an EC2 instance from the target AMI.
     - Stops the instance and detaches its volumes.
     - Attaches these volumes to the secret searcher instance.

  5. **Scanning**:
     - Mounts the attached volumes on the secret searcher instance.
     - Executes the `mount_and_dig.sh` script to search for potential secrets.
     - The script looks for specific file names and patterns that might indicate sensitive information.

  6. **Results**:
     - Uploads the scanning results to the specified S3 bucket.

  7. **Cleanup**:
     - Detaches and deletes the volumes from the target AMI.
     - Terminates instances and removes created IAM resources.



  By default, the tool will execute the next command to search for files and folders that might be of interest:

  ```bash
  for item in $(find . \( ! -path "./Windows/*" -a ! -path "./Program Files/*" -a ! -path "./Program Files (x86)/*" \) -size -25M \
              \( -name ".aws" -o -name ".ssh" -o -name "credentials.xml" \
              -o -name "secrets.yml" -o -name "config.php" -o -name "_history" \
              -o -name "autologin.conf" -o -name "web.config" -o -name ".env" \
              -o -name ".git" \) -not -empty)
     do
        echo "[+] Found $item. Copying to output..."
        save_name_item=${item:1}
        save_name_item=${save_name_item////\\}
        cp -r $item /home/ec2-user/OUTPUT/$counter/${save_name_item}
     done
  ```

  The full code can be found in `src\cloudshovel\utils\bash_scripts\mount_and_dig.sh`. Feel free to modify the function and search for other files or folders, increase the file size limit or exclude additional folders from the search.

  You can also modify the function and replace the usage of `find` with `trufflehog` or `linpeas`. The difference is that using find takes about 1 minute to execute whereas other scanning alternatives might take tens of minutes or hours depending on volume size.



  CloudShovel creates the following AWS resources during its operation:

  1. **S3 Bucket**: Stores scanning scripts and results.
  2. **IAM Role and Instance Profile**: Named "minimal-ssm", used by the secret searcher instance.
  3. **EC2 Instances**:
     - A "secret searcher" instance based on Amazon Linux 2023.
     - A temporary instance launched from the target AMI (terminated after volume detachment).
  4. **EBS Volumes**: Temporary attachments to the secret searcher instance (deleted after scanning).



  To run CloudShovel, your AWS account or IAM identity needs the following permissions:

  - EC2:
    - Describe, run, stop, and terminate instances
    - Describe, create, attach, detach, and delete volumes
    - Describe and create tags
  - IAM:
    - Create, delete, and manage roles and instance profiles
    - Attach and detach role policies
  - S3:
    - Create buckets
    - Put, get, and delete objects
  - SSM:
    - Send commands to EC2 instances
    - Get command invocation results

  It's recommended to use the principle of least privilege and create a specific IAM user or role for running CloudShovel with only the necessary permissions.



  CloudShovel attempts to clean up all created resources after completion or in case of errors. However, it's good practice to verify that all resources have been properly removed, especially:

  - Check the EC2 console for any running instances tagged with "usage: CloudQuarry" or "usage: SecretSearcher".
  - Verify that the IAM role and instance profile "minimal-ssm" have been deleted.
  - The S3 bucket **is not** automatically deleted to preserve results. Delete it manually if no longer needed.



  - If the script fails to mount volumes, ensure that the necessary filesystem tools (e.g., ntfs-3g for NTFS volumes) are installed on the secret searcher instance.
  - For permission-related errors, verify that your AWS credentials have all the required permissions listed above.
  - If experiencing issues with specific AMIs, check their requirements (e.g., virtualization type, ENA support) and adjust the instance types in the script accordingly.

  Use this tool responsibly and ensure you have the right to scan the AMIs you're targeting.


pkgId: 6f49f9c5cc1b787abf9a881722a61b714924a6d4f47592957a8b1a74cfea85ed
name: python-cloudsnorkel.cdk-github-runners
arch: src
version: 0.14.6
epoch: 0
release: 1
url: https://github.com/CloudSnorkel/cdk-github-runners.git
rpm_license: Apache-2.0
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudsnorkel.cdk-github-runners-0.14.6-1.src.rpm
checksum_type: sha256
summary:
  CDK construct to create GitHub Actions self-hosted runners. Creates ephemeral runners on demand. Easy to deploy and highly customizable.

description:
  [![NPM](https://img.shields.io/npm/v/@cloudsnorkel/cdk-github-runners?label=npm&logo=npm)](https://www.npmjs.com/package/@cloudsnorkel/cdk-github-runners)
  [![PyPI](https://img.shields.io/pypi/v/cloudsnorkel.cdk-github-runners?label=pypi&logo=pypi)](https://pypi.org/project/cloudsnorkel.cdk-github-runners)
  [![Maven Central](https://img.shields.io/maven-central/v/com.cloudsnorkel/cdk.github.runners.svg?label=Maven%20Central&logo=apachemaven)](https://central.sonatype.com/artifact/com.cloudsnorkel/cdk.github.runners/)
  [![Go](https://img.shields.io/github/v/tag/CloudSnorkel/cdk-github-runners?color=red&label=go&logo=go)](https://pkg.go.dev/github.com/CloudSnorkel/cdk-github-runners-go/cloudsnorkelcdkgithubrunners)
  [![Nuget](https://img.shields.io/nuget/v/CloudSnorkel.Cdk.Github.Runners?color=red&&logo=nuget)](https://www.nuget.org/packages/CloudSnorkel.Cdk.Github.Runners/)
  [![Release](https://github.com/CloudSnorkel/cdk-github-runners/actions/workflows/release.yml/badge.svg)](https://github.com/CloudSnorkel/cdk-github-runners/actions/workflows/release.yml)
  [![License](https://img.shields.io/badge/license-Apache--2.0-blue)](https://github.com/CloudSnorkel/cdk-github-runners/blob/main/LICENSE)

  Use this CDK construct to create ephemeral [self-hosted GitHub runners](https://docs.github.com/en/actions/hosting-your-own-runners/about-self-hosted-runners) on-demand inside your AWS account.

  * 🧩 Easy to configure GitHub integration with a web-based interface
  * 🧠 Customizable runners with decent defaults
  * 🏃🏻 Multiple runner configurations controlled by labels
  * 🔐 Everything fully hosted in your account
  * 🔃 Automatically updated build environment with latest runner version

  Self-hosted runners in AWS are useful when:

  * You need easy access to internal resources in your actions
  * You want to pre-install some software for your actions
  * You want to provide some basic AWS API access (but [aws-actions/configure-aws-credentials](https://github.com/marketplace/actions/configure-aws-credentials-action-for-github-actions) has more security controls)
  * You are using GitHub Enterprise Server

  Ephemeral (or on-demand) runners are the [recommended way by GitHub](https://docs.github.com/en/actions/hosting-your-own-runners/autoscaling-with-self-hosted-runners#using-ephemeral-runners-for-autoscaling) for auto-scaling, and they make sure all jobs run with a clean image. Runners are started on-demand. You don't pay unless a job is running.



  The best way to browse API documentation is on [Constructs Hub](https://constructs.dev/packages/@cloudsnorkel/cdk-github-runners/). It is available in all supported programming languages.



  A runner provider creates compute resources on-demand and uses [actions/runner](https://github.com/actions/runner) to start a runner.

  |                  | EC2               | CodeBuild                  | Fargate        | ECS            | Lambda        |
  |------------------|-------------------|----------------------------|----------------|----------------|---------------|
  | **Time limit**   | Unlimited         | 8 hours                    | Unlimited      | Unlimited      | 15 minutes    |
  | **vCPUs**        | Unlimited         | 2, 4, 8, or 72             | 0.25 to 4      | Unlimited      | 1 to 6        |
  | **RAM**          | Unlimited         | 3gb, 7gb, 15gb, or 145gb   | 512mb to 30gb  | Unlimited      | 128mb to 10gb |
  | **Storage**      | Unlimited         | 50gb to 824gb              | 20gb to 200gb  | Unlimited      | Up to 10gb    |
  | **Architecture** | x86_64, ARM64     | x86_64, ARM64              | x86_64, ARM64  | x86_64, ARM64  | x86_64, ARM64 |
  | **sudo**         | ✔                 | ✔                         | ✔              | ✔              | ❌           |
  | **Docker**       | ✔                 | ✔ (Linux only)            | ❌              | ✔              | ❌           |
  | **Spot pricing** | ✔                 | ❌                         | ✔              | ✔              | ❌           |
  | **OS**           | Linux, Windows    | Linux, Windows             | Linux, Windows | Linux, Windows | Linux         |

  The best provider to use mostly depends on your current infrastructure. When in doubt, CodeBuild is always a good choice. Execution history and logs are easy to view, and it has no restrictive limits unless you need to run for more than 8 hours.

  * EC2 is useful when you want runners to have complete access to the host
  * ECS is useful when you want to control the infrastructure, like leaving the runner host running for faster startups
  * Lambda is useful for short jobs that can work within time, size and readonly system constraints

  You can also create your own provider by implementing `IRunnerProvider`.



  1. Install and use the appropriate package

     <details><summary>Python</summary>

     

     Available on [PyPI](https://pypi.org/project/cloudsnorkel.cdk-github-runners).

     ```bash
     pip install cloudsnorkel.cdk-github-runners
     ```

     

     ```python
     from aws_cdk import App, Stack
     from cloudsnorkel.cdk_github_runners import GitHubRunners

     app = App()
     stack = Stack(app, "github-runners")
     GitHubRunners(stack, "runners")

     app.synth()
     ```

     </details>
     <details><summary>TypeScript or JavaScript</summary>

     

     Available on [npm](https://www.npmjs.com/package/@cloudsnorkel/cdk-github-runners).

     ```bash
     npm i @cloudsnorkel/cdk-github-runners
     ```

     

     ```python
     import { App, Stack } from 'aws-cdk-lib';
     import { GitHubRunners } from '@cloudsnorkel/cdk-github-runners';

     const app = new App();
     const stack = new Stack(app, 'github-runners');
     new GitHubRunners(stack, 'runners');

     app.synth();
     ```

     </details>
     <details><summary>Java</summary>

     

     Available on [Maven](https://central.sonatype.com/artifact/com.cloudsnorkel/cdk.github.runners/).

     ```xml
     <dependency>
        <groupId>com.cloudsnorkel</groupId>
        <artifactId>cdk.github.runners</artifactId>
     </dependency>
     ```

     

     ```java
     import software.amazon.awscdk.App;
     import software.amazon.awscdk.Stack;
     import com.cloudsnorkel.cdk.github.runners.GitHubRunners;

     public class Example {
       public static void main(String[] args){
         App app = new App();
         Stack stack = new Stack(app, "github-runners");
         GitHubRunners.Builder.create(stack, "runners").build();

         app.synth();
       }
     }
     ```

     </details>
     <details><summary>Go</summary>

     

     Available on [GitHub](https://pkg.go.dev/github.com/CloudSnorkel/cdk-github-runners-go/cloudsnorkelcdkgithubrunners).

     ```bash
     go get github.com/CloudSnorkel/cdk-github-runners-go/cloudsnorkelcdkgithubrunners
     ```

     

     ```go
     package main

     import (
       "github.com/CloudSnorkel/cdk-github-runners-go/cloudsnorkelcdkgithubrunners"
       "github.com/aws/aws-cdk-go/awscdk/v2"
       "github.com/aws/jsii-runtime-go"
     )

     func main() {
       app := awscdk.NewApp(nil)
       stack := awscdk.NewStack(app, jsii.String("github-runners"), &awscdk.StackProps{})
       cloudsnorkelcdkgithubrunners.NewGitHubRunners(stack, jsii.String("runners"), &cloudsnorkelcdkgithubrunners.GitHubRunnersProps{})

       app.Synth(nil)
     }
     ```

     </details>
     <details><summary>.NET</summary>

     

     Available on [Nuget](https://www.nuget.org/packages/CloudSnorkel.Cdk.Github.Runners/).

     ```bash
     dotnet add package CloudSnorkel.Cdk.Github.Runners
     ```

     

     ```csharp
     using Amazon.CDK;
     using CloudSnorkel;

     namespace Example
     {
       sealed class Program
       {
         public static void Main(string[] args)
         {
           var app = new App();
           var stack = new Stack(app, "github-runners");
           new GitHubRunners(stack, "runners");
           app.Synth();
         }
       }
     }
     ```

     </details>
  2. Use `GitHubRunners` construct in your code (starting with default arguments is fine)
  3. Deploy your stack
  4. Look for the status command output similar to `aws --region us-east-1 lambda invoke --function-name status-XYZ123 status.json`

     ```
      ✅  github-runners-test

     ✨  Deployment time: 260.01s

     Outputs:
     github-runners-test.runnersstatuscommand4A30F0F5 = aws --region us-east-1 lambda invoke --function-name github-runners-test-runnersstatus1A5771C0-mvttg8oPQnQS status.json
     ```
  5. Execute the status command (you may need to specify `--profile` too) and open the resulting `status.json` file
  6. Open the URL in `github.setup.url` from `status.json` or [manually setup GitHub](SETUP_GITHUB.md) integration as an app or with personal access token
  7. Run status command again to confirm `github.auth.status` and `github.webhook.status` are OK
  8. Trigger a GitHub action that has a `self-hosted` label with `runs-on: [self-hosted, codebuild]` (or non-default labels you set in step 2)
  9. If the action is not successful, see [troubleshooting](#Troubleshooting)

  [![Demo](demo-thumbnail.jpg)](https://youtu.be/wlyv_3V8lIw)



  The default providers configured by `GitHubRunners` are useful for testing but probably not too much for actual production work. They run in the default VPC or no VPC and have no added IAM permissions. You would usually want to configure the providers yourself.

  For example:

  ```python
  let vpc: ec2.Vpc;
  let runnerSg: ec2.SecurityGroup;
  let dbSg: ec2.SecurityGroup;
  let bucket: s3.Bucket;

  // create a custom CodeBuild provider
  const myProvider = new CodeBuildRunnerProvider(this, 'codebuild runner', {
     labels: ['my-codebuild'],
     vpc: vpc,
     securityGroups: [runnerSg],
  });
  // grant some permissions to the provider
  bucket.grantReadWrite(myProvider);
  dbSg.connections.allowFrom(runnerSg, ec2.Port.tcp(3306), 'allow runners to connect to MySQL database');

  // create the runner infrastructure
  new GitHubRunners(this, 'runners', {
     providers: [myProvider],
  });
  ```

  Another way to customize runners is by modifying the image used to spin them up. The image contains the [runner](https://github.com/actions/runner), any required dependencies, and integration code with the provider. You may choose to customize this image by adding more packages, for example.

  ```python
  const myBuilder = FargateRunnerProvider.imageBuilder(this, 'image builder');
  myBuilder.addComponent(
    RunnerImageComponent.custom({ commands: ['apt install -y nginx xz-utils'] }),
  );

  const myProvider = new FargateRunnerProvider(this, 'fargate runner', {
     labels: ['customized-fargate'],
     imageBuilder: myBuilder,
  });

  // create the runner infrastructure
  new GitHubRunners(this, 'runners', {
     providers: [myProvider],
  });
  ```

  Your workflow will then look like:

  ```yaml
  name: self-hosted example
  on: push
  jobs:
    self-hosted:
      runs-on: [self-hosted, customized-fargate]
      steps:
        - run: echo hello world
  ```

  Windows images can also be customized the same way.

  ```python
  const myWindowsBuilder = FargateRunnerProvider.imageBuilder(this, 'Windows image builder', {
     architecture: Architecture.X86_64,
     os: Os.WINDOWS,
  });
  myWindowsBuilder.addComponent(
     RunnerImageComponent.custom({
       name: 'Ninja',
       commands: [
         'Invoke-WebRequest -UseBasicParsing -Uri "https://github.com/ninja-build/ninja/releases/download/v1.11.1/ninja-win.zip" -OutFile ninja.zip',
         'Expand-Archive ninja.zip -DestinationPath C:\\actions',
         'del ninja.zip',
       ],
     }),
  );

  const myProvider = new FargateRunnerProvider(this, 'fargate runner', {
     labels: ['customized-windows-fargate'],
     imageBuilder: myWindowsBuilder,
  });

  new GitHubRunners(this, 'runners', {
     providers: [myProvider],
  });
  ```

  The runner OS and architecture is determined by the image it is set to use. For example, to create a Fargate runner provider for ARM64 set the `architecture` property for the image builder to `Architecture.ARM64` in the image builder properties.

  ```python
  new GitHubRunners(this, 'runners', {
     providers: [
        new FargateRunnerProvider(this, 'fargate runner', {
           labels: ['arm64', 'fargate'],
           imageBuilder: FargateRunnerProvider.imageBuilder(this, 'image builder', {
              architecture: Architecture.ARM64,
              os: Os.LINUX_UBUNTU,
           }),
        }),
     ],
  });
  ```



  ![Architecture diagram](architecture.svg)



  Runners are started in response to a webhook coming in from GitHub. If there are any issues starting the runner like missing capacity or transient API issues, the provider will keep retrying for 24 hours. Configuration issue related errors like pointing to a missing AMI will not be retried. GitHub itself will cancel the job if it can't find a runner for 24 hours. If your jobs don't start, follow the steps below to examine all parts of this workflow.

  1. Always start with the status function, make sure no errors are reported, and confirm all status codes are OK
  2. Make sure `runs-on` in the workflow matches the expected labels set in the runner provider
  3. Diagnose relevant executions of the orchestrator step function by visiting the URL in `troubleshooting.stepFunctionUrl` from `status.json`

     1. If the execution failed, check your runner provider configuration for errors
     2. If the execution is still running for a long time, check the execution events to see why runner starting is being retried
     3. If there are no relevant executions, move to the next step
  4. Confirm the webhook Lambda was called by visiting the URL in `troubleshooting.webhookHandlerUrl` from `status.json`

     1. If it's not called or logs errors, confirm the webhook settings on the GitHub side
     2. If you see too many errors, make sure you're only sending `workflow_job` events
  5. When using GitHub app, make sure there are active installations in `github.auth.app.installations`

  All logs are saved in CloudWatch.

  * Log group names can be found in `status.json` for each provider, image builder, and other parts of the system
  * Some useful Logs Insights queries can be enabled with `GitHubRunners.createLogsInsightsQueries()`

  To get `status.json`, check out the CloudFormation stack output for a command that generates it. The command looks like:

  ```
  aws --region us-east-1 lambda invoke --function-name status-XYZ123 status.json
  ```



  There are two important ways to monitor your runners:

  1. Make sure runners don't fail to start. When that happens, jobs may sit and wait. Use `GitHubRunners.metricFailed()` to get a metric for the number of failed runner starts. You should use this metric to trigger an alarm.
  2. Make sure runner images don't fail to build. Failed runner image builds mean you will get stuck with out-of-date software on your runners. It may lead to security vulnerabilities, or it may lead to slower runner start-ups as the runner software itself needs to be updated. Use `GitHubRunners.failedImageBuildsTopic()` to get SNS topic that gets notified of failed runner image builds. You should subscribe to this topic.

  Other useful metrics to track:

  1. Use `GitHubRunners.metricJobCompleted()` to get a metric for the number of completed jobs broken down by labels and job success.
  2. Use `GitHubRunners.metricTime()` to get a metric for the total time a runner is running. This includes the overhead of starting the runner.



  If you use and love this project, please consider contributing.

  1. 🪳 If you see something, say something. [Issues](https://github.com/CloudSnorkel/cdk-github-runners/issues) help improve the quality of the project.

     * Include relevant logs and package versions for bugs.
     * When possible, describe the use-case behind feature requests.
  2. 🛠️ [Pull requests](https://github.com/CloudSnorkel/cdk-github-runners/pulls) are welcome.

     * Run `npm run build` before submitting to make sure all tests pass.
     * Allow edits from maintainers so small adjustments can be made easily.
  3. 💵 Consider [sponsoring](https://github.com/sponsors/CloudSnorkel) the project to show your support and optionally get your name listed below.



  1. [philips-labs/terraform-aws-github-runner](https://github.com/philips-labs/terraform-aws-github-runner) if you're using Terraform
  2. [actions/actions-runner-controller](https://github.com/actions/actions-runner-controller) if you're using Kubernetes


pkgId: 726c2d84b7ad33867e85b4615e74039c05c6f4b8a71305653ce45daa91394b22
name: python-cloudsnorkel.cdk-turbo-layers
arch: src
version: 0.3.0
epoch: 0
release: 1
summary: Speed-up Lambda function deployment with dependency layers built in AWS
url: https://github.com/CloudSnorkel/cdk-turbo-layers.git
rpm_license: Apache-2.0
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudsnorkel.cdk-turbo-layers-0.3.0-1.src.rpm
checksum_type: sha256
description:
  [![NPM](https://img.shields.io/npm/v/@cloudsnorkel/cdk-turbo-layers?label=npm&logo=npm)](https://www.npmjs.com/package/@cloudsnorkel/cdk-turbo-layers)
  [![PyPI](https://img.shields.io/pypi/v/cloudsnorkel.cdk-turbo-layers?label=pypi&logo=pypi)](https://pypi.org/project/cloudsnorkel.cdk-turbo-layers)
  [![Maven Central](https://img.shields.io/maven-central/v/com.cloudsnorkel/cdk.turbo-layers.svg?label=Maven%20Central&logo=java)](https://search.maven.org/search?q=g:%22com.cloudsnorkel%22%20AND%20a:%22cdk.turbo-layers%22)
  [![Go](https://img.shields.io/github/v/tag/CloudSnorkel/cdk-turbo-layers?color=red&label=go&logo=go)](https://pkg.go.dev/github.com/CloudSnorkel/cdk-turbo-layers-go/cloudsnorkelcdkturbolayers)
  [![Nuget](https://img.shields.io/nuget/v/CloudSnorkel.Cdk.TurboLayers?color=red&&logo=nuget)](https://www.nuget.org/packages/CloudSnorkel.Cdk.TurboLayers/)
  [![License](https://img.shields.io/badge/license-Apache--2.0-blue)](https://github.com/CloudSnorkel/cdk-turbo-layers/blob/main/LICENSE)

  Speed up deployment of Lambda functions by creating dependency layers in AWS instead of locally.

  * ⛓️ Easily separate dependency deployment from Lambda code deployment
  * 🔁 Never re-package dependencies just because of a small code change
  * ☁️ Never download another single dependency package locally again
  * 🏋️ Never upload oversized code packages again
  * 🌎 Edit your code in the browser -- no more "deployment package too large to enable inline code editing"
  * ❌ Uninstall Docker from your laptop and extend your battery life
  * ☕ Take shorter coffee breaks when deploying

  Supported Lambda runtimes:

  * 🐍 Python
  * 📜 Node.js
  * 💎 Ruby
  * ☕ Java



  Below are synth and deploy times for a simple Python function with [`PythonFunction`](https://docs.aws.amazon.com/cdk/api/v2/docs/@aws-cdk_aws-lambda-python-alpha.PythonFunction.html) compared to Turbo Layers. The [benchmark](benchmark/deployment.ts) ran three times and the best time were taken for each step.

  |                        | 💤 PythonFunction   | 🚀 Turbo Layers  | 💤 5x PythonFunction | 🚀 5x Functions w/ Shared Turbo Layer |
  |------------------------|---------------------|------------------|----------------------|---------------------------------------|
  | Initial Synth          | 1:21                | 0:06             | 2:43                 | 0:06                                  |
  | Initial Deploy         | 1:18                | 2:05             | 2:10                 | 2:06                                  |
  | Code Change Synth      | 0:31                | 0:06             | 1:21                 | 0:06                                  |
  | Code Change Deploy     | 0:49                | 0:29             | 1:19                 | 0:36                                  |
  | New Dependency Synth   | 0:33                | 0:06             | 1:30                 | 0:06                                  |
  | New Dependency Deploy  | 0:52                | 1:50             | 1:31                 | 1:50                                  |

  As you can see, code changes synth much faster and deploy a bit faster too. Dependency changes take longer to deploy, but are assumed to be way less frequent than code changes. The more dependencies your function uses, the better the results will be.

  To run the benchmark yourself use:

  ```
  npm run bundle && npm run benchmark
  ```



  The best way to browse API documentation is on [Constructs Hub](https://constructs.dev/packages/@cloudsnorkel/cdk-turbo-layers/). It is available in all supported programming languages.



  1. Confirm you're using CDK v2
  2. Install the appropriate package

     1. [Python](https://pypi.org/project/cloudsnorkel.cdk-turbo-layers)

        ```
        pip install cloudsnorkel.cdk-turbo-layers
        ```
     2. [TypeScript or JavaScript](https://www.npmjs.com/package/@cloudsnorkel/cdk-turbo-layers)

        ```
        npm i @cloudsnorkel/cdk-turbo-layers
        ```
     3. [Java](https://search.maven.org/search?q=g:%22com.cloudsnorkel%22%20AND%20a:%22cdk.turbo-layers%22)

        ```xml
        <dependency>
        <groupId>com.cloudsnorkel</groupId>
        <artifactId>cdk.turbo-layers</artifactId>
        </dependency>
        ```
     4. [Go](https://pkg.go.dev/github.com/CloudSnorkel/cdk-turbo-layers-go/cloudsnorkelcdkturbolayers)

        ```
        go get github.com/CloudSnorkel/cdk-turbo-layers-go/cloudsnorkelcdkturbolayers
        ```
     5. [.NET](https://www.nuget.org/packages/CloudSnorkel.Cdk.TurboLayers/)

        ```
        dotnet add package CloudSnorkel.Cdk.TurboLayers
        ```



  The very basic example below will create a layer with dependencies specified as parameters and attach it to a Lambda function.

  ```python
   const packager = new PythonDependencyPackager(this, 'Packager', {
      runtime: lambda.Runtime.PYTHON_3_9,
      type: DependencyPackagerType.LAMBDA,
  });
  new Function(this, 'Function with inline requirements', {
      handler: 'index.handler',
      code: lambda.Code.fromInline('def handler(event, context):\n  import requests'),
      runtime: lambda.Runtime.PYTHON_3_9,
      // this will create a layer from with requests and Scrapy in a Lambda function instead of locally
      layers: [packager.layerFromInline('inline requirements', ['requests', 'Scrapy'])],
  });
  ```

  The next example will create a layer with dependencies specified in a `requirements.txt` file and attach it to a Lambda function.

  ```python
  const packager = new PythonDependencyPackager(this, 'Packager', {
      runtime: lambda.Runtime.PYTHON_3_9,
      type: DependencyPackagerType.LAMBDA,
  });
  new Function(this, 'Function with external source and requirements', {
      handler: 'index.handler',
      code: lambda.Code.fromAsset('lambda-src'),
      runtime: lambda.Runtime.PYTHON_3_9,
      // this will read requirements.txt and create a layer from the requirements in a Lambda function instead of locally
      layers: [packager.layerFromRequirementsTxt('requirements.txt', 'lambda-src')],
  });
  ```

  Custom package managers like Pipenv or Poetry are also supported.

  ```python
  const packager = new PythonDependencyPackager(this, 'Packager', {
      runtime: lambda.Runtime.PYTHON_3_9,
      type: DependencyPackagerType.LAMBDA,
  });
  new Function(this, 'Function with external source and requirements', {
      handler: 'index.handler',
      code: lambda.Code.fromAsset('lambda-poetry-src'),
      runtime: lambda.Runtime.PYTHON_3_9,
      // this will read pyproject.toml and poetry.lock and create a layer from the requirements in a Lambda function instead of locally
      layers: [packager.layerFromPoetry('poetry dependencies', 'lambda-poetry-src')],
  });
  ```

  If your dependencies have some C library dependencies, you may need to use the more capable but slower CodeBuild packager.

  ```python
  const packager = new PythonDependencyPackager(this, 'Packager', {
      runtime: lambda.Runtime.PYTHON_3_9,
      type: DependencyPackagerType.CODEBUILD,
      preinstallCommands: [
          'apt install -y libxml2-dev libxslt-dev libffi-dev libssl-dev',
      ],
  });
  new Function(this, 'Function with external source and requirements', {
      handler: 'index.handler',
      code: lambda.Code.fromAsset('lambda-pipenv-src'),
      runtime: lambda.Runtime.PYTHON_3_9,
      layers: [packager.layerFromPipenv('pipenv dependencies', 'lambda-pipenv-src')],
  });
  ```

  Building layers for ARM64 functions is also supported.

  ```python
  const packager = new PythonDependencyPackager(this, 'Packager', {
      runtime: lambda.Runtime.PYTHON_3_9,
      type: DependencyPackagerType.LAMBDA,
      architecture: Architecture.ARM_64,
  });
  new Function(this, 'Function with external source and requirements', {
      handler: 'index.handler',
      code: lambda.Code.fromAsset('lambda-poetry-src'),
      runtime: lambda.Runtime.PYTHON_3_9,
      architecture: Architecture.ARM_64,
      layers: [packager.layerFromPoetry('poetry dependencies', 'lambda-poetry-src')],
  });
  ```

  All these examples are for Python, but the same API is available for Node.js, Ruby, and Java. The same build options are available. Multiple different package managers are supported. See [Constructs Hub](https://constructs.dev/packages/@cloudsnorkel/cdk-turbo-layers/) for more details.



  * [lovage](https://github.com/CloudSnorkel/lovage): standalone Python framework that uses the same trick to deploy decorated functions to AWS
  * [serverless-pydeps](https://github.com/CloudSnorkel/serverless-pydeps): plugin for [Serverless Framework](https://www.serverless.com/) that speeds up deployment


pkgId: 55824f012cdc0351eeb2cf5a65cbaa089aac6fd1af1132841496ef511e85d8d2
name: python-cloudspark
arch: src
version: 1.0.14
epoch: 0
release: 1
url: https://github.com/muhammedrahil/cloudspark
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudspark-1.0.14-1.src.rpm
checksum_type: sha256
summary:
  CloudSpark is a powerful Python package designed to simplify the management of AWS S3 and Lambda services. Whether you're working on the frontend or backend, CloudSpark provides an intuitive interface to generate presigned URLs and handle file uploads seamlessly.

description:
  `cloudspark` is a Python package that provides a convenient way to manage AWS S3 buckets and generate presigned URLs using `boto3`. It supports bucket creation, CORS management, policy setting, and presigned URL generation.







  - **S3 Management**: Effortlessly manage your S3 buckets, objects, and file uploads with built-in methods.



  - **Presigned URL Generation**: Generate secure presigned URLs for your S3 objects, enabling users to upload files directly from the frontend without exposing your credentials.



  - **Seamless Integration**: Designed to work smoothly with both frontend and backend applications, making file uploads and cloud function management more accessible.





  This repository contains several components. For more details on each component, refer to the respective README files.



  - [git repository](https://github.com/muhammedrahil/cloudspark)

  - [Documentation](https://github.com/muhammedrahil/cloudspark/blob/main/README.md)

  - [Js-Implementation](https://github.com/muhammedrahil/cloudspark/blob/main/js-implementation.md)









  You can install `cloudspark` via pip. Make sure you have `boto3` installed as well.



  ```bash

  pip install cloudspark

  ```





  ```python

  from cloudspark import S3Connection

  ```



  Create an instance of `S3Connection` by providing your AWS credentials and region name

  ```python

  s3_conn = S3Connection(access_key='YOUR_ACCESS_KEY',

                         secret_access_key='YOUR_SECRET_ACCESS_KEY',

                         region_name='YOUR_REGION_NAME')

  ```





  Establish a connection to an S3 bucket:

  ```python

  s3_bucketclient = s3_conn.connect(bucket_name='your-bucket-name')

  ```

  returns an S3 client instance.





  ```python

  s3_bucketclient = s3_conn.get_instance()

  ```

  returns an S3 client instance.





  Creates an S3 bucket with the provided name.

  ```python

  s3_client = s3_conn.connect()

  s3_bucketclient = s3_conn.create_s3bucket(bucket_name='new-bucket-name')

  ```





  Set the CORS configuration for the connected bucket



  ```python

  s3_conn.set_bucket_cors()







  cors_rules = [

      {

          'AllowedHeaders': ['*'],

          'AllowedMethods': ['GET', 'POST'],

          'AllowedOrigins': ['*'],

          'ExposeHeaders': [],

          'MaxAgeSeconds': 3000

      }

  ]



  s3_conn.set_bucket_cors(CORSRules=cors_rules)

  ```



  Retrieve the CORS configuration for the connected bucket

  ```python

  cors_config = s3_conn.get_bucket_cors()

  ```





  Delete the CORS configuration from the connected bucket

  ```python

  s3_conn.delete_bucket_cors()

  ```



  Set or update the bucket policy for the connected bucket

  ```python



  s3_conn.set_bucket_policy()









  policy = {

      "Version": "2012-10-17",

      "Statement": [

          {

              "Sid": "PublicReadGetObject",

              "Effect": "Allow",

              "Principal": "*",

              "Action": "s3:GetObject",

              "Resource": f"arn:aws:s3:::{bucket_name}/*"

          }

      ]

  }

  s3_conn.set_bucket_policy(bucket_policy=policy)

  ```







      Key: "Version"

      Value: "2012-10-17"

      Explanation:

      This specifies the version of the policy language. "2012-10-17" is the latest version and is recommended for use.



      Key: "Id"

      Value: "Policy1719828879302"

      Explanation:

      The Id is an optional identifier for the policy. It helps in identifying the policy, especially when dealing with multiple policies. The value here is just a unique identifier that you can use to track or refer to this policy.



      Key: "Statement"

      Value: [ ... ]

      Explanation:

      This is an array of statements that define what actions are allowed or denied. Each statement contains specific instructions for who can perform what actions on which resources.

      Inside the Statement Array:

      Sid



          Key: "Sid"

              Value: "Stmt1719828876812"

              Explanation:

              The Sid (Statement ID) is an optional identifier for the specific statement. It helps in identifying and managing individual statements within the policy.

              Effect



          Key: "Effect"

              Value: "Allow"

              Explanation:

              The Effect determines whether the statement allows or denies access. Here, "Allow" means that the actions specified in the Action field are permitted. If it were "Deny", those actions would be explicitly forbidden.

              Principal



          Key: "Principal"

              Value: "*"

              Explanation:

              The Principal specifies the entity that is allowed or denied the actions. "*" means any entity (i.e., any user, role, or service) is allowed to perform the specified actions. You could also restrict this to a specific AWS account or IAM user.

              Action



          Key: "Action"

              Value: "s3:GetObject"

              Explanation:

              The Action specifies what actions are allowed or denied. Here, "s3:GetObject" means that the entities specified in the Principal field are allowed to retrieve objects from the S3 bucket. "s3:GetObject" is the action used for downloading files from S3.

              Resource



          Key: "Resource"

              Value: "arn:aws:s3:::{{bucket_name}}/*"

              Explanation:

              The Resource specifies the particular AWS resource that the policy applies to. Here, the resource is specified as "arn:aws:s3:::{{bucket_name}}/*", which means all objects (files) within the {{bucket_name}} S3 bucket.

              The arn:aws:s3:::{{bucket_name}}/* is an Amazon Resource Name (ARN) that uniquely identifies the S3 bucket and all its objects. The /* at the end means that the policy applies to all objects within the {{bucket_name}} bucket.





  Retrieves the bucket policy for the connected S3 bucket

  ```python

  policy = s3_conn.get_bucket_policy()

  ```





  Delete the bucket policy from the connected bucket

  ```python

  s3_conn.delete_bucket_policy()

  ```





  List inline policies for an IAM user

  ```python

  policies = s3_conn.list_user_policies(UserName='user-name')

  ```



  Block or allow public access to the bucket

  ```python

  s3_conn.public_access(block=True)  # Block public access

  s3_conn.public_access(block=False) # Allow public access

  ```





  Generate a presigned URL for creating an object



  ```python

  responce = s3_conn.presigned_create_url(

      object_name='object_name',

      params={'key': 'value'}, # Or params= None

      fields={'field': 'value'}, # Or fields= None

      conditions=[{'condition': 'value'}], # Or conditions= None

      expiration=3600

  )

  ```

  `object_name` : The name of the object to be created in the S3 bucket.



  `params`: (Optional) Additional request parameters to include in the presigned URL.



  `fields` : (Optional) Pre-filled form fields to include in the presigned URL.



  `conditions`: (Optional) Conditions to include in the presigned URL.



  `expiration` : (Optional) Time in seconds for which the presigned URL should remain valid. Default is 3600 seconds (1 hour).







  ```python

  {

    "url": "https://{{bucket_name}}.s3.amazonaws.com/",

    "fields": {

      "key": "{{object_name.extention}}",

      "x-amz-algorithm": "AWS4-HMAC-SHA256",

      "x-amz-credential": "{{access_key}}/20240814/us-east-1/s3/aws4_request",

      "x-amz-date": "20240814T092932Z",

      "x-amz-security-token": "{{sts_token}}",

      "policy": "{{policy}}",

      "x-amz-signature": "{{signature}}"

    }

  }



  ```





  Generate a presigned URL for Delete an object



  ```python

  responce = s3_conn.presigned_delete_url(object_name='object_name', expiration=3600)

  ```







  ```python

  "https://{{bucket_name}}.s3.amazonaws.com/hdfwf.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential={{access_key}}%2F20240812%2Fap-south-1%2Fs3%2Faws4_request&X-Amz-Date=20240812T151744Z&X-Amz-Expires=4600&X-Amz-SignedHeaders=host&X-Amz-Signature=a680ee638e9cc27f2ec21cae36ad807cffb2fc74e1e91fa55709f25f324d1e22"

  ```







  ```python

  responce = s3_conn.upload_object(file=file, key_name="object_name")





  with open('file_name',"rb") as file_obj:

      s3_conn.upload_object(file=file_obj, key_name="object_name")

  ```

  `file`: Bytes of the file to upload



  `key_name`: S3 object name (e.g., 'folder/filename.txt').







  return: The object metadata



  ```python

  key_object = s3_conn.get_object(key_name="object_name")



  ```







  ```python

  key_object = s3_conn.delete_object(key_name="object_name")



  ```







  ```python

  key_object = s3_conn.get_objects()

  ```



  ```python

  key_object = s3_conn.get_objects(only_objects=True)

  ```



  `only_objects`: If True, returns a list of object metadata (excluding keys).



  ```python

  key_object = s3_conn.get_objects(only_keys=True)

  ```



  `only_keys`: If True, returns a list of object keys.







  The `head_object` method retrieves metadata for an object stored in an S3 bucket. This includes details such as the content type, last modified date, and content length, but does not return the object's actual data.



  ```python

  key_object = s3_conn.head_object(key_name="object_name")

  ```







  The `policy_decode` function is designed to decode a Base64-encoded AWS S3 policy string and return it as a formatted JSON string. This is useful for inspecting and validating S3 presigned URL policies.



  Decodes a Base64-encoded policy string and returns it as a formatted JSON string

  ```python



  policy_dict = s3_conn.policy_decode(policy_encoded="policy_encoded string")



  ```


pkgId: d7ece4c05c5b603376400b78b00e5f892e1f1ca7f42dff141ce5ec9a07db3f71
name: python-cloudsplaining
arch: src
version: 0.7.0
epoch: 0
release: 1
url: https://github.com/salesforce/cloudsplaining
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudsplaining-0.7.0-1.src.rpm
checksum_type: sha256
summary:
  AWS IAM Security Assessment tool that identifies violations of least privilege and generates a risk-prioritized HTML report.

description:
  Cloudsplaining is an AWS IAM Security Assessment tool that identifies violations of least privilege and generates a risk-prioritized HTML report.
  [![Tests](https://github.com/salesforce/cloudsplaining/workflows/Test/badge.svg)](https://github.com/salesforce/cloudsplaining/actions?query=workflow%3ATest)
  [![Documentation Status](https://readthedocs.org/projects/cloudsplaining/badge/?version=latest)](https://cloudsplaining.readthedocs.io/en/latest/?badge=latest)
  [![Join the chat at https://gitter.im/cloudsplaining](https://badges.gitter.im/cloudsplaining.svg)](https://gitter.im/cloudsplaining?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
  [![Twitter](https://img.shields.io/twitter/url/https/twitter.com/kmcquade3.svg?style=social&label=Follow%20the%20author)](https://twitter.com/kmcquade3)
  [![PyPI](https://img.shields.io/pypi/v/cloudsplaining)](https://pypi.org/project/cloudsplaining)
  [![Python Version](https://img.shields.io/pypi/pyversions/cloudsplaining)](#)
  [![Downloads](https://static.pepy.tech/badge/cloudsplaining)](https://pepy.tech/project/cloudsplaining)
  * [Example report](https://opensource.salesforce.com/cloudsplaining/)
  > ![](https://github.com/salesforce/cloudsplaining/raw/master/docs/_images/cloudsplaining-report.gif)

  For full documentation, please visit the [project on ReadTheDocs](https://cloudsplaining.readthedocs.io/en/latest/).
  * [Installation](#installation)
  * [Cheatsheet](#cheatsheet)
  * [Example report](https://opensource.salesforce.com/cloudsplaining/)

  Cloudsplaining identifies violations of least privilege in AWS IAM policies and generates a pretty HTML report with a triage worksheet. It can scan all the policies in your AWS account or it can scan a single policy file.
  It helps to identify IAM actions that do not leverage resource constraints. It also helps prioritize the remediation process by flagging IAM policies that present the following risks to the AWS account in question without restriction:
  * Data Exfiltration (`s3:GetObject`, `ssm:GetParameter`, `secretsmanager:GetSecretValue`)
  * Infrastructure Modification
  * Resource Exposure (the ability to modify resource-based policies)
  * Privilege Escalation (based on Rhino Security Labs research)
  Cloudsplaining also identifies IAM Roles that can be assumed by AWS Compute Services (such as EC2, ECS, EKS, or Lambda), as they can present greater risk than user-defined roles - especially if the AWS Compute service is on an instance that is directly or indirectly exposed to the internet. Flagging these roles is particularly useful to penetration testers (or attackers) under certain scenarios. For example, if an attacker obtains privileges to execute [ssm:SendCommand](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_SendCommand.html) and there are privileged EC2 instances with the SSM agent installed, they can effectively have the privileges of those EC2 instances. Remote Code Execution via AWS Systems Manager Agent was already a known escalation/exploitation path, but Cloudsplaining can make the process of identifying theses cases easier. See the [sample report](https://opensource.salesforce.com/cloudsplaining/#executive-summary) for some examples.
  You can also specify a custom exclusions file to filter out results that are False Positives for various reasons. For example, User Policies are permissive by design, whereas System roles are generally more restrictive. You might also have exclusions that are specific to your organization's multi-account strategy or AWS application architecture.

  [Policy Sentry](https://engineering.salesforce.com/salesforce-cloud-security-automating-least-privilege-in-aws-iam-with-policy-sentry-b04fe457b8dc) revealed to us that it is possible to finally write IAM policies according to least privilege in a scalable manner. Before Policy Sentry was released, it was too easy to find IAM policy documents that lacked resource constraints. Consider the policy below, which allows the IAM principal (a role or user) to run `s3:PutObject` on any S3 bucket in the AWS account:
  ```json
  {
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Action": [
          "s3:PutObject"
        ],
        "Resource": "*"
      }
    ]
  }
  ```
  This is bad. Ideally, access should be restricted according to resource ARNs, like so:
  ```json
  {
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Action": [
          "s3:GetObject"
        ],
        "Resource": "arn:aws:s3:::my-bucket/*"
      }
    ]
  }
  ```
  Policy Sentry [makes it really easy to do this](https://github.com/salesforce/policy_sentry/#policy-sentry). Once Infrastructure as Code developers or AWS Administrators gain familiarity with the tool (which is quite easy to use), we've found that adoption starts very quickly. **However**, if you've been using AWS, there is probably a very large backlog of IAM policies that could use an uplift. If you have hundreds of AWS accounts with dozens of policies in each, how can we lock down those AWS accounts by programmatically identifying the policies that should be fixed?
  That's why we wrote Cloudsplaining.
  Cloudsplaining identifies violations of least privilege in AWS IAM policies and generates a pretty HTML report with a triage worksheet. It can scan all the policies in your AWS account or it can scan a single policy file.


  ```bash
  brew tap salesforce/cloudsplaining https://github.com/salesforce/cloudsplaining
  brew install cloudsplaining
  ```

  ```bash
  pip3 install --user cloudsplaining
  ```
  * Now you should be able to execute `cloudsplaining` from command line by running `cloudsplaining --help`.

  To enable Bash completion, put this in your `.bashrc`:
  ```bash
  eval "$(_CLOUDSPLAINING_COMPLETE=source cloudsplaining)"
  ```
  To enable ZSH completion, put this in your .zshrc:
  ```bash
  eval "$(_CLOUDSPLAINING_COMPLETE=source_zsh cloudsplaining)"
  ```

  You can also scan a single policy file to identify risks instead of an entire account.
  ```bash
  cloudsplaining scan-policy-file --input-file examples/policies/explicit-actions.json
  ```
  The output will include a finding description and a list of the IAM actions that do not leverage resource constraints.
  The output will resemble the following:
  ```console
  Issue found: Data Exfiltration
  Actions: s3:GetObject
  Issue found: Resource Exposure
  Actions: ecr:DeleteRepositoryPolicy, ecr:SetRepositoryPolicy, s3:BypassGovernanceRetention, s3:DeleteAccessPointPolicy, s3:DeleteBucketPolicy, s3:ObjectOwnerOverrideToBucketOwner, s3:PutAccessPointPolicy, s3:PutAccountPublicAccessBlock, s3:PutBucketAcl, s3:PutBucketPolicy, s3:PutBucketPublicAccessBlock, s3:PutObjectAcl, s3:PutObjectVersionAcl
  Issue found: Unrestricted Infrastructure Modification
  Actions: ecr:BatchDeleteImage, ecr:CompleteLayerUpload, ecr:CreateRepository, ecr:DeleteLifecyclePolicy, ecr:DeleteRepository, ecr:DeleteRepositoryPolicy, ecr:InitiateLayerUpload, ecr:PutImage, ecr:PutImageScanningConfiguration, ecr:PutImageTagMutability, ecr:PutLifecyclePolicy, ecr:SetRepositoryPolicy, ecr:StartImageScan, ecr:StartLifecyclePolicyPreview, ecr:TagResource, ecr:UntagResource, ecr:UploadLayerPart, s3:AbortMultipartUpload, s3:BypassGovernanceRetention, s3:CreateAccessPoint, s3:CreateBucket, s3:DeleteAccessPoint, s3:DeleteAccessPointPolicy, s3:DeleteBucket, s3:DeleteBucketPolicy, s3:DeleteBucketWebsite, s3:DeleteObject, s3:DeleteObjectTagging, s3:DeleteObjectVersion, s3:DeleteObjectVersionTagging, s3:GetObject, s3:ObjectOwnerOverrideToBucketOwner, s3:PutAccelerateConfiguration, s3:PutAccessPointPolicy, s3:PutAnalyticsConfiguration, s3:PutBucketAcl, s3:PutBucketCORS, s3:PutBucketLogging, s3:PutBucketNotification, s3:PutBucketObjectLockConfiguration, s3:PutBucketPolicy, s3:PutBucketPublicAccessBlock, s3:PutBucketRequestPayment, s3:PutBucketTagging, s3:PutBucketVersioning, s3:PutBucketWebsite, s3:PutEncryptionConfiguration, s3:PutInventoryConfiguration, s3:PutLifecycleConfiguration, s3:PutMetricsConfiguration, s3:PutObject, s3:PutObjectAcl, s3:PutObjectLegalHold, s3:PutObjectRetention, s3:PutObjectTagging, s3:PutObjectVersionAcl, s3:PutObjectVersionTagging, s3:PutReplicationConfiguration, s3:ReplicateDelete, s3:ReplicateObject, s3:ReplicateTags, s3:RestoreObject, s3:UpdateJobPriority, s3:UpdateJobStatus
  ```


  We can scan an entire AWS account and generate reports. To do this, we leverage the AWS IAM [get-account-authorization-details](https://docs.aws.amazon.com/cli/latest/reference/iam/get-account-authorization-details.html) API call, which downloads a large JSON file (around 100KB per account) that contains all of the IAM details for the account. This includes data on users, groups, roles, customer-managed policies, and AWS-managed policies.
  * You must have AWS credentials configured that can be used by the CLI.
  * You must have the privileges to run [iam:GetAccountAuthorizationDetails](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetAccountAuthorizationDetails.html). The `arn:aws:iam::aws:policy/SecurityAudit` policy includes this, as do many others that allow Read access to the IAM Service.
  * To download the account authorization details, ensure you are authenticated to AWS, then run `cloudsplaining`'s `download` command:
  ```bash
  cloudsplaining download
  ```
  * If you prefer to use your `~/.aws/credentials` file instead of environment variables, you can specify the profile name:
  ```bash
  cloudsplaining download --profile myprofile
  ```
  It will download a JSON file in your current directory that contains your account authorization detail information.

  Cloudsplaining tool does not attempt to understand the context behind everything in your AWS account. It's possible to understand the context behind some of these things programmatically - whether the policy is applied to an instance profile, whether the policy is attached, whether inline IAM policies are in use, and whether or not AWS Managed Policies are in use. **Only you know the context behind the design of your AWS infrastructure and the IAM strategy**.
  As such, it's important to eliminate False Positives that are context-dependent. You can do this with an exclusions file. We've included a command that will generate an exclusions file for you so you don't have to remember the required format.
  You can create an exclusions template via the following command:
  ```bash
  cloudsplaining create-exclusions-file
  ```
  This will generate a file in your current directory titled `exclusions.yml`.
  Now when you run the `scan` command, you can use the exclusions file like this:
  ```bash
  cloudsplaining scan --exclusions-file exclusions.yml --input-file examples/files/example.json --output examples/files/
  ```
  For more information on the structure of the exclusions file, see [Filtering False Positives](#filtering-false-positives)

  Now that we've downloaded the account authorization file, we can scan *all* of the AWS IAM policies with `cloudsplaining`.
  Run the following command:
  ```bash
  cloudsplaining scan --exclusions-file exclusions.yml --input-file examples/files/example.json --output examples/files/
  ```
  It will create an HTML report like [this](https://opensource.salesforce.com/cloudsplaining/):
  > ![](docs/_images/cloudsplaining-report.gif)
  It will also create a raw JSON data file:
  * `default-iam-results.json`: This contains the raw JSON output of the report. You can use this data file for operating on the scan results for various purposes. For example, you could write a Python script that parses this data and opens up automated JIRA issues or Salesforce Work Items. An example entry is shown below. The full example can be viewed at [examples/files/iam-results-example.json](examples/files/iam-results-example.json)
  ```json
  {
      "example-authz-details": [
          {
              "AccountID": "012345678901",
              "ManagedBy": "Customer",
              "PolicyName": "InsecureUserPolicy",
              "Arn": "arn:aws:iam::012345678901:user/userwithlotsofpermissions",
              "ActionsCount": 2,
              "ServicesCount": 1,
              "Actions": [
                  "s3:PutObject",
                  "s3:PutObjectAcl"
              ],
              "Services": [
                  "s3"
              ]
          }
      ]
  }
  ```
  See the [examples/files](examples/files) folder for sample output.

  Resource constraints are best practice - especially for system roles/instance profiles - but sometimes, these are by design. For example, consider a situation where a custom IAM policy is used on an instance profile for an EC2 instance that provisions Terraform. *In this case, broad permissions are design requirements* - so we don't want to include these in the results.
  You can create an exclusions template via the following command:
  ```bash
  cloudsplaining create-exclusions-file
  ```
  This will generate a file in your current directory titled `exclusions.yml`.
  The default exclusions file looks like this:
  ```yaml


  policies:
    - "AWSServiceRoleFor*"
    - "*ServiceRolePolicy"
    - "*ServiceLinkedRolePolicy"
    - "AdministratorAccess" # Otherwise, this will take a long time
    - "service-role*"
    - "aws-service-role*"

  roles:
    - "service-role*"
    - "aws-service-role*"
  users:
    - ""
  groups:
    - ""


  include-actions:
    - "s3:GetObject"
    - "ssm:GetParameter"
    - "ssm:GetParameters"
    - "ssm:GetParametersByPath"
    - "secretsmanager:GetSecretValue"

  exclude-actions:
    - ""
  ```
  * Make any additions or modifications that you want.
    * Under `policies`, list the path of policy names that you want to exclude.
    * If you want to exclude a role titled `MyRole`, list `MyRole` or `MyR*` in the `roles` list.
    * You can follow the same approach for `users` and `groups` list.
  Now when you run the `scan` command, you can use the exclusions file like this:
  ```bash
  cloudsplaining scan --exclusions-file exclusions.yml --input-file examples/files/example.json --output examples/files/
  ```

  If your IAM user or IAM role has `sts:AssumeRole` permissions to a common IAM role across multiple AWS accounts, you can use the `scan-multi-account` command.
  This diagram depicts how the process works:
  ![Diagram for scanning multiple AWS accounts with Cloudsplaining](docs/_images/scan-multiple-accounts.png)
  > Note: If you are new to setting up cross-account access, check out [the official AWS Tutorial on Delegating access across AWS accounts using IAM roles](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_cross-account-with-roles.html). That can help you set up the architecture above.
  * First, you'll need to create the multi-account config file. Run the following command:
  ```bash
  cloudsplaining create-multi-account-config-file \
      -o multi-account-config.yml
  ```
  * This will generate a file called `multi-account-config.yml` with the following contents:
  ```yaml
  accounts:
    default_account: 123456789012
    prod: 123456789013
    test: 123456789014
  ```
  > Note: Observe how the format of the file above includes `account_name: accountID`. Edit the file contents to match your desired account name and account ID. Include as many account IDs as you like.
  For the next step, let's say that:
   * We have a role in the target accounts that is called `CommonSecurityRole`.
  * The credentials for your IAM user are under the AWS Credentials profile called `scanning-user`.
  * That user has `sts:AssumeRole` permissions to assume the `CommonSecurityRole` in all your target accounts specified in the YAML file we created previously.
  * You want to save the output to an S3 bucket called `my-results-bucket`
  Using the data above, you can run the following command:
  ```bash
  cloudsplaining scan-multi-account \
      -c multi-account-config.yml \
      --profile scanning-user \
      --role-name CommonSecurityRole \
      --output-bucket my-results-bucket
  ```
  > Note that if you run the above without the `--profile` flag, it will execute in the standard [AWS Credentials order of precedence](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/credentials.html#credentials-default) (i.e., Environment variables, credentials profiles, ECS container credentials, then finally EC2 Instance Profile credentials).

  ```bash

  cloudsplaining download

  cloudsplaining download --profile someprofile

  cloudsplaining scan --input-file default.json

  cloudsplaining scan --input-file default.json --exclusions-file exclusions.yml

  cloudsplaining scan-policy-file --input-file examples/policies/wildcards.json
  cloudsplaining scan-policy-file --input-file examples/policies/wildcards.json  --exclusions-file examples/example-exclusions.yml


  cloudsplaining create-multi-account-config-file -o accounts.yml
  cloudsplaining scan-multi-account -c accounts.yml -r TargetRole --output-directory ./
  ```

  **Will it scan all policies by default?**
  No, it will only scan policies that are attached to IAM principals.
  **Will the download command download all policy versions?**
  Not by default. If you want to do this, specify the `--include-non-default-policy-versions` flag. Note that the `scan` tool does not currently operate on non-default versions.
  **I followed the installation instructions but can't execute the program via command line at all. What do I do?**
  This is likely an issue with your PATH. Your PATH environment variable is not considering the binary packages installed by `pip3`. On a Mac, you can likely fix this by entering the command below, depending on the versions you have installed. YMMV.
  ```bash
  export PATH=$HOME/Library/Python/3.7/bin/:$PATH
  ```
  **I followed the installation instructions, but I am receiving a `ModuleNotFoundError` that says `No module named policy_sentry.analysis.expand`. What should I do?**
  Try upgrading to the latest version of Cloudsplaining. This error was fixed in version 0.0.10.

  * [Policy Sentry](https://github.com/salesforce/policy_sentry/) by [Kinnaird McQuade](https://twitter.com/kmcquade3) at Salesforce
  * [Parliament](https://github.com/duo-labs/parliament/) by [Scott Piper](https://twitter.com/0xdabbad00) at [Summit Route](http://summitroute.com/) and Duo Labs.
  * [AWS Privilege Escalation Methods](https://github.com/RhinoSecurityLabs/AWS-IAM-Privilege-Escalation) by [Spencer Gietzen](https://twitter.com/SpenGietz) at Rhino Security Labs
  * [Understanding Access Level Summaries within Policy Summaries](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_understand-policy-summary-access-level-summaries.html)
  * [Leveraging next-generation blockchain-based AI across multiple service meshes to transparently automate multi-cloud IAM wizardry :mage_man:](http://kmcquade.com/rick.html)


pkgId: 419c0656d3803dac4ffc69b1b8d6dcc1b4bb71ae794643a28b9ab01e1ba6fbba
name: python-cloudstorageio
arch: src
version: 1.2.15
epoch: 0
release: 1
summary: please add a summary manually as the author left a blank one
url: https://github.com/cognaize/cloudstorageio
rpm_license: UNKNOWN
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudstorageio-1.2.15-1.src.rpm
checksum_type: sha256
description:
  Storage agnostic IO interface for humans

  _Developed and tested on python 3.6+_

  [GitHub](https://github.com/VahagnGhaz/cloudstorageio)

  [PyPi](https://pypi.org/project/cloudstorageio)


  These instructions will get you a copy of the project up and running on your local machine.

  * #### S3 configs
      ```bash
      pip install awscli --upgrade --user
      ```
      set your aws configs
      ```bash
       sudo apt install awscli
      ```

      ```bash
      $ aws configure
      AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
      AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
      Default region name [None]: us-west-2
      Default output format [None]: json
       ```
     [click here](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/quickstart.html#installation) for more info about configuration and installation

  * #### Google cloud storage configs
     Provide authentication credentials to your application code by setting the environment variable GOOGLE_APPLICATION_CREDENTIALS.
     Replace [FILE_NAME] with the file of the JSON file that contains your service account key

      ```bash
     GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/[FILE_NAME].json"
      ```

     [click here](https://cloud.google.com/storage/docs/reference/libraries) for more info about configuration and installation

  * #### Dropbox workspace configs
      Provide app access token by setting the environment variable DROPBOX_TOKEN.
      Replace [TOKEN] with the generated token of your dropbox app

      ```bash
      DROPBOX_TOKEN='TOKEN'
      ```

     [click here](http://99rabbits.com/get-dropbox-access-token/) for more info about configuration and installation



  The default installation includes only AWS connection.
  ```
  pip install cloudstorageio
  ```

  To add Google Drive install with `drive` extra:
  ```shell
  pip install "cloudstorageio[drive]"
  ```

  To add Google Storage install with `google` extra:
  ```shell
  pip install "cloudstorageio[google]"
  ```

  To add Dropbox install with `dropbox` extra:
  ```shell
  pip install "cloudstorageio[dropbox]"
  ```

  To install all extras run:
  ```shell
  pip install "cloudstorageio[all]"
  ```



  * Write and read file
  ```python
  from cloudstorageio import CloudInterface

  google_file_path = 'gs://bucket-name/path-to-file/sample-file.txt'
  s3_file_path = 's3://bucket-name/path-to-file/sample-pic.jpg'
  ci = CloudInterface()


  with ci.open(google_file_path, 'w') as f:
     f.write("Lorem Ipsum is simply dummy text")

  ci.save(google_file_path, "Lorem Ipsum is simply dummy text")


  with ci.open(s3_file_path, 'rb') as f:
      s3_output = f.read()  # binary content of picture

  ci.fetch(s3_file_path)

  ```

  * Remove, list, and check folder/file
  ```python
  from cloudstorageio import CloudInterface

  dropbox_folder_path = 'dbx://bucket-name/folder'
  s3_file_path = 's3://bucket-name/path-to-file/sample-pic.jpg'
  ci = CloudInterface()

  ci.isfile(s3_file_path) # returns True
  ci.isdir(dropbox_folder_path) # returns True
  ci.remove(s3_file_path) # removes file
  ci.listdir(dropbox_folder_path) # lists folder content
  ```
  * Copy file
  ```python
  from cloudstorageio import CloudInterface

  dropbox_file_path = 'dbx://bucket-name/path-to-file/sample-pic.jpg'
  gs_file_path = 'gs://bucket-name/path-to-file/sample-file.txt'
  ci = CloudInterface()

  ci.copy(from_path=dropbox_file_path, to_path=gs_file_path) # copies dropbox file to gs
  ```

  * Copy dir
  ```python
  from cloudstorageio import CloudInterface

  s3_dir = 's3://bucket-name/sample_folder'
  gs_dir = 'gs://bucket-name/sample_folder'
  ci = CloudInterface()

  ci.copy_dir(source_dir=s3_dir, dest_dir=gs_dir) # copies s3 folder to gs
  ```

  _Powered by_ ![](/docs/cognaize_logo.png) [Cognaize](https://www.cognaize.com/)

  `# Changelog
  All major cloudstorageio changes and pypi releases are listed here



  - Created project skeleton

  - Implemented S3 & Google Cloud Storage Interfaces

  - Implemented Cloud Storage Interface
  - Implemented Local interface

  - Add delete, listdir & isfile/isdir methods for all interfaces

  - Implemented DropBox interface

  - Add copy_batch for folder copying

  - Add Google Drive interface

  - Add Async Cloud Interface

  - Structure changes (file renames/moves)
  - Implemented scalable unittests

  - Commented Overwriting loggers,
  - add cognaize logo in Readme

  - Add copy_dir for path to path copy
  - Change copy_batch for list to list copy
  - Usages in README

  - README changes

  - Using multipart upload when copying from local to S3



  See CHANGES references

  - [0.0.3]


  - [0.0.4]

  - [0.0.6]

  - [0.0.9]

  - [0.1.0]

  - [0.1.1]

  - [0.1.2]

  - Update listdir for s3

  - Add AWS session token support

  - Remove dropbox package dependency (dropbox will not be supported with this version)

  - Add option include_files for listdir

  - Updated build to setuptools

  - Fix error on listdir for s3 if the folder did not include subfolders
  - Add option include_files for listdir for non-recursive case

  - Add github workflows for merging
  - Update tests to use AWS mocker
  - Move moto dependency to dev-requirements

  - Fix listdir implementation to include full paths in S3
  - Fix path concatenation in S3


  - Add `moto` to test requirements


  - Add exclude options to `copy_dir` function in S3


  - Fix issue with document deepcopy
  - Add Dropbox, Google Storage and Drive as extra dependencies


pkgId: 21c4ec401acdaa815db8301e928254dad8e2719029770e8a2a4bb9e35e0e0023
name: python-cloudstructs
arch: src
version: 0.9.19
epoch: 0
release: 1
summary: High-level constructs for AWS CDK
url: https://github.com/jogold/cloudstructs.git
rpm_license: Apache-2.0
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudstructs-0.9.19-1.src.rpm
checksum_type: sha256
description:
  High-level constructs for AWS CDK



  `npm install cloudstructs` or `yarn add cloudstructs`

  Version >= 0.2.0 requires AWS CDK v2.



  * [`CodeCommitMirror`](src/codecommit-mirror) Mirror a repository to AWS CodeCommit on schedule
  * [`EcsServiceRoller`](src/ecs-service-roller) Roll your ECS service tasks on schedule or with
    a rule
  * [`EmailReceiver`](src/email-receiver) Receive emails through SES, save them to S3
    and invoke a Lambda function
  * [`MjmlTemplate`](src/mjml-template) SES email template from [MJML](https://mjml.io/)
  * [`SlackApp`](src/slack-app) Deploy Slack apps from manifests
  * [`SlackEvents`](src/slack-events) Send Slack events to Amazon EventBridge
  * [`SlackTextract`](src/slack-textract) Extract text from images posted to Slack
    using Amazon Textract. The extracted text is posted in a thread under the image
    and gets indexed!
  * [`SslServerTest`](src/ssl-server-test) Test a server/host for SSL/TLS on schedule and
    get notified when the overall rating is not satisfactory. [Powered by Qualys SSL Labs](https://www.ssllabs.com/).
  * [`StateMachineCustomResourceProvider`](src/state-machine-cr-provider) Implement custom
    resources with AWS Step Functions state machines
  * [`StaticWebsite`](src/static-website) A CloudFront static website hosted on S3 with
    HTTPS redirect, SPA redirect, HTTP security headers and backend configuration saved
    to the bucket.
  * [`ToolkitCleaner`](src/toolkit-cleaner) Clean unused S3 and ECR assets from your CDK
    Toolkit.
  * [`UrlShortener`](src/url-shortener) Deploy an URL shortener API


pkgId: bb44994d7209130b0f2a7042d6ee1c37c7aad09968d8d99962c8f3f362b06eaa
name: python-cloudsync
arch: src
version: 3.4.0
epoch: 0
release: 1
summary: cloudsync enables simple cloud file-level sync with a variety of cloud providers
url: https://github.com/atakamallc/cloudsync
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudsync-3.4.0-1.src.rpm
checksum_type: sha256
description:
  [![Build Status](https://travis-ci.com/AtakamaLLC/cloudsync.svg?branch=master&token=WD7aozR2wQ3ePGe1QpA8)](https://travis-ci.com/AtakamaLLC/cloudsync)
  [![Code Coverage](https://codecov.io/gh/AtakamaLLC/cloudsync/branch/master/graph/badge.svg)](https://codecov.io/gh/AtakamaLLC/cloudsync)




  Python Cloud Synchronization Library



  ```bash
  pip install cloudsync


  pip install cloudsync-gdrive
  ```



  *   [Documentation](https://atakama-llc-cloudsync.readthedocs-hosted.com/en/latest/)
  *   [Source Code + Issue Tracker](https://github.com/AtakamaLLC/cloudsync)



  ```bash

  cloudsync sync --help

  cloudsync sync file:c:/users/me/documents gdrive:/mydocs


  ```


  ```python
  import cloudsync



  oauth_config = cloudsync.command.utils.generic_oauth_config('gdrive')


  provider = cloudsync.create_provider('gdrive', oauth_config=oauth_config)


  creds = provider.authenticate()


  provider.connect(creds)


  for entry in provider.listdir_path("/"):
      print(entry.path)
  ```


  ```python
  import cloudsync
  import tempfile
  import time


  local_root = tempfile.mkdtemp()
  remote_root = "/cloudsync_test/" + time.strftime("%Y%m%d%H%M")
  provider_name = 'gdrive'
  print("syncronizing between %s locally and %s on %s" % (local_root, remote_root, provider_name))



  cloud_oauth_config = cloudsync.command.utils.generic_oauth_config(provider_name)


  local = cloudsync.create_provider("filesystem")
  remote = cloudsync.create_provider(provider_name, oauth_config=cloud_oauth_config)


  creds = remote.authenticate()


  local.namespace = local_root  # filesystem provider wants to know the root namespace before connecting
  local.connect(None)
  remote.connect(creds)


  print("Creating folder %s on %s" % (remote_root, provider_name))
  remote.mkdirs(remote_root)  # provider.mkdirs() will automatically create any necessary parent folders


  sync_roots = (local_root, remote_root)


  sync = cloudsync.CloudSync((local, remote), roots=sync_roots)
  sync.start()


  local_hello_path = local.join(local_root, "hello.txt")
  print("Creating local file %s" % local_hello_path)
  with open(local_hello_path, "w") as f:
      f.write("hello")


  remote_hello_path = remote.join(remote_root, "hello.txt")


  while not remote.exists_path(remote_hello_path):
      time.sleep(1)

  remote_hello_info = remote.info_path(remote_hello_path)


  local_goodbye_path = local.join(local_root, "goodbye.txt")
  remote_goodbye_path = remote.join(remote_root, "goodbye.txt")
  print("renaming %s to %s on %s" % (remote_hello_path, remote_goodbye_path, provider_name))
  remote.rename(remote_hello_info.oid, remote_goodbye_path)  # rename refers to the file to rename by oid


  while not local.exists_path(local_goodbye_path):
      time.sleep(1)

  print("synced")

  sync.stop(forever=True)
  local.disconnect()
  remote.disconnect()
  ```


pkgId: b31bb8c181db58001ad2cd82804596f3425a9da3612145435226ff4501af9fb2
name: python-cloudtoolbox
arch: src
version: 0.5.0
epoch: 0
release: 1
summary: Toolbox for the cloud.
url: https://pypi.org/project/cloudtoolbox/
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudtoolbox-0.5.0-1.src.rpm
checksum_type: sha256
description:
  ![Tests](https://github.com/DotzInc/cloud-toolbox/actions/workflows/tests.yml/badge.svg?event=push)
  ![PyPI - Version](https://img.shields.io/pypi/v/cloudtoolbox)
  ![PyPI - Python Version](https://img.shields.io/pypi/pyversions/cloudtoolbox)

  Decouple your applications from cloud providers with carefully crafted service interfaces.



  * Python 3.8+



  To install Cloud Toolbox, use pip:

  ```sh
  pip install cloudtoolbox
  ```



  Cloud Toolbox offers the following optional dependencies for easy installation of provider SDKs:

  * `cloudtoolbox[amazon]` - Installs the Amazon AWS SDK.
  * `cloudtoolbox[google]` - Installs the Google Cloud SDK.
  * `cloudtoolbox[all]` - Installs SDKs for both providers.



  Uploading a file to Google Cloud Storage.

  ```python
  from cloud import factory
  from cloud.google.storage import Uploader

  FileUploader = factory.storage_uploader(Uploader)

  bucket = "my-bucket"
  filename = "notes.txt"
  filepath = f"/path/to/{filename}"

  uploader = FileUploader()
  uploader.upload(bucket, filename, filepath)
  ```

  Switching from Cloud Storage to Amazon S3.

  ```python

  from cloud.google.storage import Uploader


  from cloud.amazon.s3 import Uploader
  ```


pkgId: 4a85f8de7ae48e07b281241e0c1ad231e6b1640db0bfa8e1fea87d7f0d5b7bf1
name: python-cloudtower-sdk
arch: src
version: 2.18.0
epoch: 0
release: 1
summary: please add a summary manually as the author left a blank one
url: https://github.com/smartxworks/cloudtower-python-sdk
rpm_license: None
rpm_group: Unspecified
rpm_buildhost: localhost
location_href: Packages/python-cloudtower-sdk-2.18.0-1.src.rpm
checksum_type: sha256
description:
  Python 环境下的 Cloudtower SDK，适用于 2.7 与 3.4 以上版本。

  - [源码地址](https://github.com/smartxworks/cloudtower-python-sdk)
  - [下载地址](https://github.com/smartxworks/cloudtower-python-sdk/releases)
  - [通用指南](https://cloudtower-api-doc.vercel.app)



  - ### whl

    ```shell
    pip install cloudtower_sdk-2.18.0-py2.py3-none-any.whl
    ```

  - ### tar.gz

    ```shell
    tar xvzf cloudtower-sdk-2.18.0.tar.gz
    cd cloudtower-sdk-2.18.0
    python setup.py install
    ```

  - ### git 源码安装

    ```
    git clone https://github.com/smartxworks/cloudtower-python-sdk.git
    cd cloudtower-python-sdk
    python setup.py install
    ```

  - ### git pip 安装

    ```shell
    pip install git+https://github.com/smartxworks/cloudtower-python-sdk.git
    ```

  - ### pypi 安装
    ```shell
    pip install cloudtower-sdk
    ```







  ```python
  from cloudtower.configuration import Configuration
  from cloudtower import ApiClient

  configuration = Configuration(host="http://192.168.96.133/v2/api")
  client = ApiClient(configuration)
  ```

  > 如果需要使用 https，可以安装证书，或者忽略证书验证

  ```python
  configuration = Configuration(host="https://192.168.96.133/v2/api")
  configuration.verify_ssl = False
  client = ApiClient(configuration)
  ```



  > 根据不同用途的操作创建相关的 API 实例，例如虚拟机相关操作需要创建一个 `VmApi`。

  ```python
  from cloudtower.api.vm_api import VmApi
  vm_api = VmApi(client)
  ```



  > 可以通过 utils 中封装的登陆方法来鉴权 `ApiClient`

  ```python
  from cloudtower.utils import wait_tasks, login
  conf = Configuration(host="http://api-test.dev-cloudtower.smartx.com/v2/api")
  api_client = ApiClient(conf)
  login(api_client, "your_username", "your_password") # 默认使用 LOCAL 作为 usersource
  ```

  > 也可以直接将 token 应用置 `configuration` 的 `api_key` 中

  ```python
  from cloudtower.api.user_api import UserApi
  from cloudtower.models import UserSource

  user_api = UserApi(client)
  login_res = user_api.login({
      "username": "your_username",
      "password": "your_password",
      "source": UserSource.LOCAL
  })


  configuration.api_key["Authorization"] = login_res.data.token
  ```





  ```python
  vms = vm_api.get_vms({
    "where": {
      "id": "vm_id"
    },
    "first":1,
  })
  ```



  > 资源更新会产生相关的异步任务，当异步任务结束时，代表资源操作完成且数据已更新。

  ```python
  start_res = vm_api.start_vm({
    "where": {
      "id": "stopped_vm_id"
    },
  })
  ```

  > 可以通过提供的工具方法同步等待异步任务结束

  ```python
  from cloudtower.utils import wait_tasks
  try:
   wait_tasks([res.task_id for res in start_res], api_client)
  except ApiException as e:
   
  else:
   
  ```



  | 参数名        | 类型      | 是否必须 | 说明                                                                                 |
  | ------------- | --------- | -------- | ------------------------------------------------------------------------------------ |
  | ids           | list[str] | 是       | 需查询的 task 的 id 列表                                                             |
  | api_client    | ApiClient | 是       | 查询所使用的 ApiClient 实例                                                          |
  | interval      | int       | 否       | 轮询的间隔时间，默认为 5s                                                            |
  | timeout       | int       | 否       | 超时时间，默认为 300s                                                                |
  | exit_on_error | bool      | 否       | 是否在单个 Task 出错时立即退出，否则则会等待全部 Task 都完成后再退出，默认为 False。 |



  | 错误码 | 说明             |
  | ------ | ---------------- |
  | 408    | 超时             |
  | 500    | 异步任务内部错误 |



  > cloudtower api 支持通过设置 header 中的 content-language 来设置返回信息的语言, 可选值 `en-US`, `zh-CN`。默认为 `en-US`。



  > 可以通过 `ApiClient` 的 `set_default_header` 方法设置默认的 header 信息。

  ```python
  api_client.set_default_header("content_language","en-US")
  alert_api = AlertApi(api_client)

  alerts = alert_api.get_alerts(
    {
      "where": {
        "cluster": {
          "id": "cluster_id"
        }
      },
      "first": 100
    },
  )
  ```



  > 也可以通过设置请求的关键字参数 `content_language` 来设置返回信息的语言。

  ```python
  from cloudtower.api.user_api import AlertApi

  alert_api = AlertApi(api_client)

  alerts = alert_api.get_alerts(
    {
      "where": {
        "cluster": {
          "id": "cluster_id"
        }
      },
      "first": 100
    },
    content_language="zh-CN"
  )
  ```





  > 上述请求的发送都是同步的请求，会堵塞当前进程。如果需要使用异步请求，请在对应请求的关键字参数中加上 `async_req=True`。
  > 通过返回结果 `ApplyResult.get()` 来获取对应的结果。

  ```python
  vms = vm_api.get_vms(
    {
      "where": {
        "id": "vm_id"
      }
    },
    async_req=True
  )
  print(vms.get()[0].name)
  ```



  ```python
  client.close()
  ```







  ```python
  from cloudtower import ApiClient, Configuration, VmApi

  conf = Configuration(host="http://192.168.96.133/v2/api")
  conf.api_key["Authorization"] = "token"
  api_client = ApiClient(conf)
  vm_api = VmApi(api_client)

  vms = vm_api.get_vms({})
  ```



  ```python
  from cloudtower import ApiClient, Configuration, VmApi

  conf = Configuration(host="http://192.168.96.133/v2/api")
  conf.api_key["Authorization"] = "token"
  api_client = ApiClient(conf)
  vm_api = VmApi(api_client)

  vms_from_51_to_100 = vm_api.get_vms({
    "first": 50,
    "skip": 50,
  })
  ```



  ```python
  from cloudtower import ApiClient, Configuration, VmApi, VmStatus

  conf = Configuration(host="http://192.168.96.133/v2/api")
  conf.api_key["Authorization"] = "token"
  api_client = ApiClient(conf)
  vm_api = VmApi(api_client)

  running_vms = vm_api.get_vms(
      {
          "where": {
              "status": VmStatus.RUNNING
          }
      },
  )
  ```



  ```python
  from cloudtower import ApiClient, Configuration, VmApi

  conf = Configuration(host="http://192.168.96.133/v2/api")
  conf.api_key["Authorization"] = "token"
  api_client = ApiClient(conf)
  vm_api = VmApi(api_client)

  vms_name_contains = vm_api.get_vms(
      {
          "where": {
              "name_contains": "string"
          }
      },
  )
  ```



  ```python
  from cloudtower import ApiClient, Configuration, VmApi

  conf = Configuration(host="http://192.168.96.133/v2/api")
  conf.api_key["Authorization"] = "token"
  api_client = ApiClient(conf)
  vm_api = VmApi(api_client)

  vms_has_4_more_vcpu = vm_api.get_vms(
      {
          "where": {
              "vcpu_gt": 4
          }
      },
  )
  ```





  ```python
  from cloudtower.api import VmApi, ContentLibraryVmTemplateApi, ClusterApi
  from cloudtower.utils import login, wait_tasks
  from cloudtower.configuration import Configuration
  from cloudtower import ApiClient
  import os


  configuration = Configuration(host=os.getenv("CLOUDTOWER_ENDPOINT"))
  client = ApiClient(configuration)

  login(client, os.getenv("CLOUDTOWER_USERNAME"), os.getenv("CLOUDTOWER_PASSWORD"))


  def create_vm_from_template(template_name, cluster_name, vm_name):
      """
      通过内容库模板创建一台虚拟机，内容通过内容库模板设置
      :param template_name: 指定所需使用的内容库模板名称
      :param cluster_name: 指定虚拟机被部署的集群的集群名称
      :param vm_name: 虚拟机名称
      :return: 被创建的虚拟机
      """
      vm_api = VmApi(client)
      cluster_api = ClusterApi(client)
      template_api = ContentLibraryVmTemplateApi(client)

      cluster = cluster_api.get_clusters({
          "where": {
              "name": cluster_name
          }
      })
      if len(cluster) == 0:
          raise Exception("cluster not found")

      template = template_api.get_content_library_vm_templates({
          "where": {
              "name": template_name
          }
      })
      if len(template) == 0:
          raise Exception("template not found")

      with_task_vms = vm_api.create_vm_from_content_library_template([
          {
              "template_id": template[0].id,
              "cluster_id": cluster[0].id,
              "name": vm_name,
              "is_full_copy": False
          }
      ])
      tasks = [with_task_vm.task_id for with_task_vm in with_task_vms]
      vm_ids = [
          with_task_vm.data.id for with_task_vm in with_task_vms]
      wait_tasks(tasks, client)
      return vm_api.get_vms({
          "where": {
              "id_in": vm_ids
          }
      })[0]
  ```



  ```python
  from cloudtower.api import VmApi, ContentLibraryVmTemplateApi, ClusterApi
  from cloudtower.utils import login, wait_tasks
  from cloudtower.configuration import Configuration
  from cloudtower.models import Bus, VmVolumeElfStoragePolicyType
  from cloudtower import ApiClient
  import os


  configuration = Configuration(host=os.getenv("CLOUDTOWER_ENDPOINT"))
  client = ApiClient(configuration)

  login(client, os.getenv("CLOUDTOWER_USERNAME"), os.getenv("CLOUDTOWER_PASSWORD"))


  def create_vm_from_template_modify_disk(template_name, cluster_name, vm_name, disk_operate):
      """
      通过内容库模板创建一台虚拟机，配置虚拟机的磁盘
      :param template_name: 模板名称
      :param cluster_name: 集群名称
      :param vm_name: 虚拟机名称
      :param disk_operate: 磁盘操作，使用详见 create_vm_from_template_modify_disk_example 方法
      :return: 被创建的虚拟机
      """
      vm_api = VmApi(client)
      cluster_api = ClusterApi(client)
      template_api = ContentLibraryVmTemplateApi(client)

      cluster = cluster_api.get_clusters({
          "where": {
              "name": cluster_name
          }
      })
      if len(cluster) == 0:
          raise Exception("cluster not found")

      template = template_api.get_content_library_vm_templates({
          "where": {
              "name": template_name
          }
      })
      if len(template) == 0:
          raise Exception("template not found")

      with_task_vms = vm_api.create_vm_from_content_library_template([
          {
              "template_id": template[0].id,
              "cluster_id": cluster[0].id,
              "name": vm_name,
              "is_full_copy": False,
              "disk_operate": disk_operate
          }
      ])
      tasks = [with_task_vm.task_id for with_task_vm in with_task_vms]
      vm_ids = [
          with_task_vm.data.id for with_task_vm in with_task_vms]
      wait_tasks(tasks, client)
      return vm_api.get_vms({
          "where": {
              "id_in": vm_ids
          }
      })[0]


  def create_vm_from_template_modify_disk_example():
      """
      通过模板创建虚拟机时，如果希望对原有的磁盘进行任何修改，可以通过 disk_operate 参数进行配置
      disk_operate 参数的类型是 VmDiskOperate，它是一个字典，包含以下字段：
      - remove_disks 由于删除指定index的磁盘
      - modify_disks 修改现有磁盘的配置，目前仅支持修改总线，如果有其他修改可以通过，删除原有盘
      - new_disks 新增磁盘，类型是 VmDiskParams，它是一个字典，包含以下字段：
          - mount_cd_roms 挂载 cd-rom
          - mount_disks 挂载已有磁盘
          - mount_new_create_disks 挂载新磁盘
      """
      disk_operate = {
          "remove_disks": {
              "disk_index": [0]  # 用于删除指定 index 的磁盘，index 从 0 开始计算，这里既是删除第一块磁盘
          },
          "new_disks": {
              "mount_cd_roms": [
                  {
                      "boot": 2,  # 启动顺序
                      "content_library_image_id": ""  # 指定挂载内容库镜像的 id
                  }
              ],
              "mount_disks": [
                  {
                      "boot": 3,  # 启动顺序
                      "bus": Bus.VIRTIO,  # 总线类型
                      "vm_volume_id": "cljm6x2g1405g0958tp3zkhvh"  # 被挂载虚拟卷的 id
                  }
              ],
              "mount_new_create_disks": [
                  {
                      "boot": 4,
                      "bus": Bus.VIRTIO,
                      "vm_volume": {
                          "name": "test",  # 新建虚拟卷的名称
                          "size": 10 * 1024 * 1024 * 1024,  # 新建虚拟卷的大小，单位是字节
                          "elf_storage_policy": VmVolumeElfStoragePolicyType._2_THIN_PROVISION  # 存储策略
                      }
                  }
              ]
          }
      }
      create_vm_from_template_modify_disk("template-name", "cluster-name", "vm-name", disk_operate)
  ```



  ```python
  from cloudtower.api import VmApi, ContentLibraryVmTemplateApi, ClusterApi
  from cloudtower.utils import login, wait_tasks
  from cloudtower.configuration import Configuration
  from cloudtower.models import Bus, VmNicModel
  from cloudtower import ApiClient
  import os


  configuration = Configuration(host=os.getenv("CLOUDTOWER_ENDPOINT"))
  client = ApiClient(configuration)

  login(client, os.getenv("CLOUDTOWER_USERNAME"), os.getenv("CLOUDTOWER_PASSWORD"))


  def create_vm_from_template_modified_nic(template_name, cluster_name, vm_name, nic_params):
      """
      通过内容库模板创建一台虚拟机，配置虚拟机的网卡
      :param template_name: 模板名称
      :param cluster_name: 集群名称
      :param vm_name: 虚拟机名称
      :param nic_params: 磁盘操作，使用详见 create_vm_from_template_modified_nic_example 方法
      :return: 被创建的虚拟机
      """
      vm_api = VmApi(client)
      cluster_api = ClusterApi(client)
      template_api = ContentLibraryVmTemplateApi(client)

      cluster = cluster_api.get_clusters({
          "where": {
              "name": cluster_name
          }
      })
      if len(cluster) == 0:
          raise Exception("cluster not found")

      template = template_api.get_content_library_vm_templates({
          "where": {
              "name": template_name
          }
      })
      if len(template) == 0:
          raise Exception("template not found")

      with_task_vms = vm_api.create_vm_from_content_library_template([
          {
              "template_id": template[0].id,
              "cluster_id": cluster[0].id,
              "name": vm_name,
              "is_full_copy": False,
              "vm_nics": nic_params
          }
      ])
      tasks = [with_task_vm.task_id for with_task_vm in with_task_vms]
      vm_ids = [
          with_task_vm.data.id for with_task_vm in with_task_vms]
      wait_tasks(tasks, client)
      return vm_api.get_vms({
          "where": {
              "id_in": vm_ids
          }
      })[0]


  def create_vm_from_template_modified_nic_example():
      """
      通过内容库模板创建虚拟机时，如果不传递 vm_nics 参数，会默认使用模板的网卡配置，如果需要修改网卡配置，可以传递 vm_nics 参数，
      vm_nics 参数是一个列表，列表中的每个元素都是一个字典：
      - connect_vlan_id 网卡对应虚拟机网络的 id，并非虚拟机网络的 vlan_id
      - enabled 是否启用网卡
      - model 网卡类型，可以使用 VmNicModel 类的属性，如 VmNicModel.VIRTIO
      创建虚拟机时并不支持修改网卡的 ip，mac，gateway，subnet mask，如果需要配置ip，子网，网关，可以通过 cloudinit 来实现，需要模板支持 cloudinit
      """
      nic_params = [
          {
              "connect_vlan_id": "vlan_id",
              "enabled": True,
              "model": VmNicModel.VIRTIO
          }
      ]
      create_vm_from_template_modified_nic("template_name", "cluster_name", "vm_name", nic_params)
  ```





  ```python
  from cloudtower import (
      ApiClient,
      Configuration,
      VmApi,
      VmStatus,
      VmFirmware,
      Bus
  )
  from cloudtower.utils import wait_tasks

  conf = Configuration(host="http://192.168.96.133/v2/api")
  conf.api_key["Authorization"] = "token"
  api_client = ApiClient(conf)
  vm_api = VmApi(api_client)
  with_task_vm = vm_api.create_vm([
      {
          "cluster_id": "cluster_id",
          "name": "vm_name",
          "ha": True,
          "cpu_cores": 4,
          "cpu_sockets": 4,
          "memory": 4*1024*1024*1024,
          "vcpu": 16,
          "status": VmStatus.STOPPED,
          "firmware": VmFirmware.BIOS,
          "vm_nics": [
              {
                  "connect_vlan_id": "vlan_id",
              }
          ],
          "vm_disks": {
              "mount_cd_roms": [{
                  "boot": 0,
                  "index": 0
              }],
          }
      }
  ])[0]

  wait_tasks([with_task_vm.task_id], api_client)
  created_vm = vm_api.get_vms({
      "where": {
          "id": with_task_vm.data.id
      }
  })
  ```





  ```python
  from cloudtower import (
      ApiClient,
      Configuration,
      VmApi,
      VmStatus,
      VmFirmware,
      Bus
  )
  from cloudtower.utils import wait_tasks

  conf = Configuration(host="http://192.168.96.133/v2/api")
  conf.api_key["Authorization"] = "token"
  api_client = ApiClient(conf)
  vm_api = VmApi(api_client)
  with_task_vm = vm_api.create_vm([
      {
          "cluster_id": "cluster_id",
          "name": "vm_name",
          "ha": True,
          "cpu_cores": 4,
          "cpu_sockets": 4,
          "memory": 4*1024*1024*1024,
          "vcpu": 16,
          "status": VmStatus.STOPPED,
          "firmware": VmFirmware.BIOS,
          "vm_nics": [
              {
                  "connect_vlan_id": "vlan_id",
              }
          ],
          "vm_disks": {
              "mount_cd_roms": [{
                  "index": 0,
                  "boot": 0,
                  "elf_image_id": "elf_image_id"
              }],
          }
      }
  ])[0]

  wait_tasks([with_task_vm.task_id], api_client)
  created_vm = vm_api.get_vms({
      "where": {
          "id": with_task_vm.data.id
      }
  })
  ```



  ```python
  from cloudtower import (
      ApiClient,
      Configuration,
      VmApi,
      VmStatus,
      VmFirmware,
      Bus
  )
  from cloudtower.utils import wait_tasks

  conf = Configuration(host="http://192.168.96.133/v2/api")
  conf.api_key["Authorization"] = "token"
  api_client = ApiClient(conf)
  vm_api = VmApi(api_client)
  with_task_vm = vm_api.create_vm([
      {
          "cluster_id": "cluster_id",
          "name": "vm_name",
          "ha": True,
          "cpu_cores": 4,
          "cpu_sockets": 4,
          "memory": 4*1024*1024*1024,
          "vcpu": 16,
          "status": VmStatus.STOPPED,
          "firmware": VmFirmware.BIOS,
          "vm_nics": [
              {
                  "connect_vlan_id": "vlan_id",
              }
          ],
          "vm_disks": {
              "mount_disks": [{
                  "index": 0,
                  "boot": 0,
                  "bus": Bus.VIRTIO,
                  "vm_volume_id": "vm_volume_id",
                  "index": 0,
              }],
          }
      }
  ])[0]

  wait_tasks([with_task_vm.task_id], api_client)
  created_vm = vm_api.get_vms({
      "where": {
          "id": with_task_vm.data.id
      }
  })
  ```



  ```python
  from cloudtower import (
      ApiClient,
      Configuration,
      VmApi,
      VmStatus,
      VmFirmware,
      Bus,
      VmVolumeElfStoragePolicyType
  )
  from cloudtower.utils import wait_tasks

  conf = Configuration(host="http://192.168.96.133/v2/api")
  conf.api_key["Authorization"] = "token"
  api_client = ApiClient(conf)
  vm_api = VmApi(api_client)
  with_task_vm = vm_api.create_vm([
      {
          "cluster_id": "cluster_id",
          "name": "vm_name",
          "ha": True,
          "cpu_cores": 4,
          "cpu_sockets": 4,
          "memory": 4 * 1024*1024*1024,
          "vcpu": 16,
          "status": VmStatus.STOPPED,
          "firmware": VmFirmware.BIOS,
          "vm_nics": [
              {
                  "connect_vlan_id": "vlan_id",
              }
          ],
          "vm_disks": {
              "mount_new_create_disks": [{
                  "boot": 0,
                  "bus": Bus.VIRTIO,
                  "vm_volume": {
                      "elf_storage_policy": VmVolumeElfStoragePolicyType._2_THIN_PROVISION,
                      "size": 10 * 1024 * 1024 * 1024,
                      "name": "new_volume_name"
                  }
              }],
          }
      }
  ])[0]

  wait_tasks([with_task_vm.task_id], api_client)
  created_vm = vm_api.get_vms({
      "where": {
          "id": with_task_vm.data.id
      }
  })
  ```



  ```python
  from cloudtower import (
      ApiClient,
      Configuration,
      VmApi,
      VmStatus,
      VmFirmware,
      Bus,
      VmNicModel,
      VmVolumeElfStoragePolicyType
  )
  from cloudtower.utils import wait_tasks

  conf = Configuration(host="http://192.168.96.133/v2/api")
  conf.api_key["Authorization"] = "token"
  api_client = ApiClient(conf)
  vm_api = VmApi(api_client)
  with_task_vm = vm_api.create_vm([
      {
          "cluster_id": "cluster_id",
          "name": "vm_name1",
          "ha": True,
          "cpu_cores": 4,
          "cpu_sockets": 4,
          "memory": 4 * 1024*1024*1024,
          "vcpu": 16,
          "status": VmStatus.STOPPED,
          "firmware": VmFirmware.BIOS,
          "vm_nics": [
              {
                  "connect_vlan_id": "vlan_id",
                  "mirror": True,
                  "model": VmNicModel.VIRTIO
              }
          ],
          "vm_disks": {
              "mount_cd_roms": [{
                  "index": 0,
                  "boot": 0,
              }],
          }
      }
  ])[0]

  wait_tasks([with_task_vm.task_id], api_client)
  created_vm = vm_api.get_vms({
      "where": {
          "id": with_task_vm.data.id
      }
  })
  ```





  ```python
  from cloudtower import ApiClient, Configuration, VmApi
  from cloudtower.utils import wait_tasks

  conf = Configuration(host="http://192.168.96.133/v2/api")
  conf.api_key["Authorization"] = "token"
  api_client = ApiClient(conf)
  vm_api = VmApi(api_client)

  with_task_vm = vm_api.update_vm({
      "where": {
          "id": "vm_id"
      },
      "data": {
          "name": "new_name",
          "description": "new_description",
          "ha": False,
          "vcpu": 2 * 2,
          "cpu_cores": 2,
          "cpu_sockets": 2,
          "memory": 1*1024*1024*1024,
      }
  })[0]

  wait_tasks([with_task_vm.task_id], api_client)

  updated_vm = vm_api.get_vms({
      "where": {
          "id": with_task_vm.data.id
      }
  })
  ```





  ```python
  from cloudtower import ApiClient, Configuration, VmApi
  from cloudtower.utils import wait_tasks

  conf = Configuration(host="http://192.168.96.133/v2/api")
  conf.api_key["Authorization"] = "token"
  api_client = ApiClient(conf)
  vm_api = VmApi(api_client)

  with_task_vm = vm_api.add_vm_cd_rom({
      "where": {
          "id": "vm_id"
      },
      "data": {
          "vm_cd_roms": [
              {
                  "elf_image_id": "elf_image_id",
                  "boot": 0,
                  "index": 0
              }
          ]
      }
  })[0]
  wait_tasks([with_task_vm.task_id], api_client)

  updated_vm = vm_api.get_vms({
      "where": {
          "id": with_task_vm.data.id
      }
  })
  ```



  ```python
  from cloudtower import ApiClient, Configuration, VmApi
  from cloudtower.utils import wait_tasks

  conf = Configuration(host="http://192.168.96.133/v2/api")
  conf.api_key["Authorization"] = "token"
  api_client = ApiClient(conf)
  vm_api = VmApi(api_client)

  with_task_vm = vm_api.remove_vm_cd_rom({
      "where": {
          "id": "vm_id"
      },
      "data": {
          "cd_rom_ids": ["cd_rom_id_1", "cd_rom_id_2"]
      }
  })[0]

  wait_tasks([with_task_vm.task_id], api_client)

  updated_vm = vm_api.get_vms({
      "where": {
          "id": with_task_vm.data.id
      }
  })
  ```





  ```python
  from cloudtower import ApiClient, Configuration, Bus, VmVolumeElfStoragePolicyType, VmApi
  from cloudtower.utils import wait_tasks

  conf = Configuration(host="http://192.168.96.133/v2/api")
  conf.api_key["Authorization"] = "token"
  api_client = ApiClient(conf)
  vm_api = VmApi(api_client)

  with_task_vm = vm_api.add_vm_disk({
      "where": {
          "id": "vm_id"
      },
      "data": {
          "vm_disks": {
              "mount_new_create_disks": [
                  {
                      "vm_volume": {
                          "elf_storage_policy": VmVolumeElfStoragePolicyType._2_THIN_PROVISION,
                          "size": 5*1024*1024*1024,
                          "name": "new_volume_name"
                      },
                      "boot": 1,
                      "bus": Bus.VIRTIO,
                  }
              ]
          }
      }
  })[0]

  wait_tasks([with_task_vm.task_id], api_client)

  updated_vm = vm_api.get_vms({
      "where": {
          "id": with_task_vm.data.id
      }
  })
  ```



  ```python
  from cloudtower import ApiClient, Configuration, Bus, VmApi
  from cloudtower.utils import wait_tasks

  conf = Configuration(host="http://192.168.96.133/v2/api")
  conf.api_key["Authorization"] = "token"
  api_client = ApiClient(conf)
  vm_api = VmApi(api_client)

  with_task_vm = vm_api.add_vm_disk({
      "where": {
          "id": "vm_id"
      },
      "data": {
          "vm_disks": {
              "mount_disks": [
                  {
                      "index": 0,
                      "vm_volume_id": "vm_volume_id",
                      "boot": 1,
                      "bus": Bus.VIRTIO,
                  }
              ]
          }
      }
  })[0]

  wait_tasks([with_task_vm.task_id], api_client)

  updated_vm = vm_api.get_vms({
      "where": {
          "id": with_task_vm.data.id
      }
  })
  ```



  ```python
  from cloudtower import ApiClient, Configuration, VmVolumeElfStoragePolicyType, Bus, VmApi
  from cloudtower.utils import wait_tasks

  conf = Configuration(host="http://192.168.96.133/v2/api")
  conf.api_key["Authorization"] = "token"
  api_client = ApiClient(conf)
  vm_api = VmApi(api_client)

  with_task_vm = vm_api.remove_vm_disk({
      "where": {
          "id": "vm_id"
      },
      "data": {
          "disk_ids": ["vm_disk_id_1", "vm_disk_id_2"]
      }
  })[0]

  wait_tasks([with_task_vm.task_id], api_client)

  updated_vm = vm_api.get_vms({
      "where": {
          "id": with_task_vm.data.id
      }
  })
  ```





  ```python
  from cloudtower import ApiClient, Configuration, VmApi, VmNicModel
  from cloudtower.utils import wait_tasks

  conf = Configuration(host="http://192.168.96.133/v2/api")
  conf.api_key["Authorization"] = "token"
  api_client = ApiClient(conf)

  vm_api = VmApi(api_client)

  with_task_vm = vm_api.add_vm_nic({
      "where": {
          "id": "vm_id"
      },
      "data": {
          "vm_nics": [
              {
                  "connect_vlan_id": "vlan_id",
                  "enabled": False,
                  "model": VmNicModel.VIRTIO,
              },
              {
                  "connect_vlan_id": "vlan_id_2",
                  "enabled": True,
                  "mirror": True,
                  "model": VmNicModel.VIRTIO,
              }
          ]
      }
  })[0]

  wait_tasks([with_task_vm.task_id], api_client)
  updated_vm = vm_api.get_vms({
      "where": {
          "id": with_task_vm.data.id
      }
  })
  ```



  ```python
  from cloudtower import ApiClient, Configuration, VmApi
  from cloudtower.utils import wait_tasks

  conf = Configuration(host="http://192.168.96.133/v2/api")
  conf.api_key["Authorization"] = "token"
  api_client = ApiClient(conf)

  vm_api = VmApi(api_client)

  with_task_vm = vm_api.update_vm_nic({
      "where": {
          "id": "vm_id"
      },
      "data": {
          "nic_index": 0,
          "enabled": False,
          "mirror": False,
          "connect_vlan_id": "vlan_id"
      }
  })[0]

  wait_tasks([with_task_vm.task_id], api_client)
  updated_vm = vm_api.get_vms({
      "where": {
          "id": with_task_vm.data.id
      }
  })
  ```



  ```python
  from cloudtower import ApiClient, Configuration, VmApi
  from cloudtower.utils import wait_tasks

  conf = Configuration(host="http://192.168.96.133/v2/api")
  conf.api_key["Authorization"] = "token"
  api_client = ApiClient(conf)

  vm_api = VmApi(api_client)

  with_task_vm = vm_api.remove_vm_nic({
      "where": {
          "id": "vm_id"
      },
      "data": {
          "nic_index": [0, 1]
      }
  })[0]

  wait_tasks([with_task_vm.task_id], api_client)
  updated_vm = vm_api.get_vms({
      "where": {
          "id": with_task_vm.data.id
      }
  })
  ```





  ```python
  from cloudtower import ApiClient, Configuration, VmApi
  from cloudtower.utils import wait_tasks

  conf = Configuration(host="http://192.168.96.133/v2/api")
  conf.api_key["Authorization"] = "token"
  api_client = ApiClient(conf)

  vm_api = VmApi(api_client)

  with_task_vm = vm_api.mig_rate_vm({
      "where": {
          "id": "vm_id"
      },
      "data": {
          "host_id": "host_id"
      }
  })[0]

  wait_tasks([with_task_vm.task_id], api_client)
  ```



  ```python
  from cloudtower import ApiClient, Configuration, VmApi
  from cloudtower.utils import wait_tasks

  conf = Configuration(host="http://192.168.96.133/v2/api")
  conf.api_key["Authorization"] = "token"
  api_client = ApiClient(conf)

  vm_api = VmApi(api_client)

  with_task_vm = vm_api.mig_rate_vm({
      "where": {
          "id": "vm_id"
      }
  })[0]

  wait_tasks([with_task_vm.task_id], api_client)
  ```







  ```python
  from cloudtower import ApiClient, Configuration, VmApi
  from cloudtower.utils import wait_tasks

  conf = Configuration(host="http://192.168.96.133/v2/api")
  conf.api_key["Authorization"] = "token"
  api_client = ApiClient(conf)

  vm_api = VmApi(api_client)
  with_task_vm = vm_api.start_vm({
      "where": {
          "id": "vm_id"
      }
  })[0]

  wait_tasks([with_task_vm.task_id], api_client)

  opened_vm = vm_api.get_vms({"where": {"id": with_task_vm.data.id}})[0]
  ```



  ```python
  from cloudtower import ApiClient, Configuration, VmApi
  from cloudtower.utils import wait_tasks

  conf = Configuration(host="http://192.168.96.133/v2/api")
  conf.api_key["Authorization"] = "token"
  api_client = ApiClient(conf)

  vm_api = VmApi(api_client)
  with_task_vms = vm_api.start_vm({
      "where": {
          "id_in": ["vm_id_1", "vm_id_2"]
      }
  })

  tasks = [with_task_vm.task_id for with_task_vm in with_task_vms]
  ids = [with_task_vm.data.id for with_task_vm in with_task_vms]
  wait_tasks(tasks, api_client)

  opened_vms = vm_api.get_vms({"where": {"id_in": ids}})
  ```



  ```python
  from cloudtower import ApiClient, Configuration, VmApi
  from cloudtower.utils import wait_tasks

  conf = Configuration(host="http://192.168.96.133/v2/api")
  conf.api_key["Authorization"] = "token"
  api_client = ApiClient(conf)

  vm_api = VmApi(api_client)
  with_task_vm = vm_api.start_vm({
      "where": {
          "id": "vm_id"
      },
      "data": {
          "host_id": "host_id"
      }
  })[0]

  wait_tasks([with_task_vm.task_id], api_client)

  opened_vm = vm_api.get_vms({"where": {"id": with_task_vm.data.id}})[0]
  ```





  ```python
  from cloudtower import ApiClient, Configuration, VmApi
  from cloudtower.utils import wait_tasks

  conf = Configuration(host="http://192.168.96.133/v2/api")
  conf.api_key["Authorization"] = "token"
  api_client = ApiClient(conf)

  vm_api = VmApi(api_client)
  with_task_vm = vm_api.shut_down_vm({
      "where": {
          "id": "vm_id"
      }
  })[0]

  wait_tasks([with_task_vm.task_id], api_client)

  closed_vm = vm_api.get_vms({"where": {"id": with_task_vm.data.id}})[0]
  ```



  ```python
  from cloudtower import ApiClient, Configuration, VmApi
  from cloudtower.utils import wait_tasks

  conf = Configuration(host="http://192.168.96.133/v2/api")
  conf.api_key["Authorization"] = "token"
  api_client = ApiClient(conf)

  vm_api = VmApi(api_client)
  with_task_vms = vm_api.shut_down_vm({
      "where": {
          "id_in": ["vm_id_1", "vm_id_2"]
      }
  })

  tasks = [with_task_vm.task_id for with_task_vm in with_task_vms]
  ids = [with_task_vm.data.id for with_task_vm in with_task_vms]

  wait_tasks(tasks, api_client)

  closed_vms = vm_api.get_vms({"where": {"id_in": ids}})
  ```



  ```python
  from cloudtower import ApiClient, Configuration, VmApi
  from cloudtower.utils import wait_tasks

  conf = Configuration(host="http://192.168.96.133/v2/api")
  conf.api_key["Authorization"] = "token"
  api_client = ApiClient(conf)

  vm_api = VmApi(api_client)
  with_task_vm = vm_api.force_shut_down_vm({
      "where": {
          "id": "vm_id"
      }
  })[0]

  wait_tasks([with_task_vm.task_id], api_client)

  closed_vm = vm_api.get_vms({"where": {"id": with_task_vm.data.id}})[0]
  ```



  ```python
  from cloudtower import ApiClient, Configuration, VmApi
  from cloudtower.utils import wait_tasks

  conf = Configuration(host="http://192.168.96.133/v2/api")
  conf.api_key["Authorization"] = "token"
  api_client = ApiClient(conf)

  vm_api = VmApi(api_client)
  with_task_vms = vm_api.force_shut_down_vm({
      "where": {
          "id_in": ["vm_id_1", "vm_id_2"]
      }
  })

  tasks = [with_task_vm.task_id for with_task_vm in with_task_vms]
  ids = [with_task_vm.data.id for with_task_vm in with_task_vms]
  wait_tasks(tasks, api_client)

  closed_vms = vm_api.get_vms({"where": {"id_in": ids}})
  ```





  ```python
  from cloudtower import ApiClient, Configuration, VmApi
  from cloudtower.utils import wait_tasks

  api_client = ApiClient(Configuration(host="http://192.168.96.133/v2/api"))

  vm_api = VmApi(api_client)
  with_task_vm = vm_api.restart_vm({
      "where": {
          "id": "vm_id"
      }
  })[0]

  wait_tasks([with_task_vm.task_id], api_client)

  restarted_vm = vm_api.get_vms({"where": {"id": with_task_vm.data.id}})[0]
  ```



  ```python
  from cloudtower import ApiClient, Configuration, VmApi
  from cloudtower.utils import wait_tasks

  api_client = ApiClient(Configuration(host="http://192.168.96.133/v2/api"))

  vm_api = VmApi(api_client)
  with_task_vms = vm_api.restart_vm({
      "where": {
          "id_in": ["vm_id_1", "vm_id_2"]
      }
  })

  tasks = [with_task_vm.task_id for with_task_vm in with_task_vms]
  ids = [with_task_vm.data.id for with_task_vm in with_task_vms]

  wait_tasks(tasks, api_client)

  restarted_vms = vm_api.get_vms({"where": {"id_in": ids}})
  ```



  ```python
  from cloudtower import ApiClient, Configuration, VmApi
  from cloudtower.utils import wait_tasks

  api_client = ApiClient(Configuration(host="http://192.168.96.133/v2/api"))

  vm_api = VmApi(api_client)
  with_task_vm = vm_api.force_restart_vm({
      "where": {
          "id": "vm_id"
      }
  })[0]

  wait_tasks([with_task_vm.task_id], api_client)

  restarted_vm = vm_api.get_vms({"where": {"id": with_task_vm.data.id}})[0]
  ```



  ```python
  from cloudtower import ApiClient, Configuration, VmApi
  from cloudtower.utils import wait_tasks

  api_client = ApiClient(Configuration(host="http://192.168.96.133/v2/api"))

  vm_api = VmApi(api_client)
  with_task_vms = vm_api.force_restart_vm({
      "where": {
          "id_in": ["vm_id_1", "vm_id_2"]
      }
  })

  tasks = [with_task_vm.task_id for with_task_vm in with_task_vms]
  ids = [with_task_vm.data.id for with_task_vm in with_task_vms]

  wait_tasks(tasks, api_client)

  restarted_vms = vm_api.get_vms({"where": {"id_in": ids}})
  ```





  ```python
  from cloudtower import ApiClient, Configuration, VmApi
  from cloudtower.utils import wait_tasks

  api_client = ApiClient(Configuration(host="http://192.168.96.133/v2/api"))

  vm_api = VmApi(api_client)
  with_task_vm = vm_api.suspend_vm({
      "where": {
          "id": "vm_id"
      }
  })[0]

  wait_tasks([with_task_vm.task_id], api_client)

  suspended_vm = vm_api.get_vms({"where": {"id": with_task_vm.data.id}})[0]
  ```



  ```python
  from cloudtower import ApiClient, Configuration, VmApi
  from cloudtower.utils import wait_tasks

  api_client = ApiClient(Configuration(host="http://192.168.96.133/v2/api"))

  vm_api = VmApi(api_client)
  with_task_vms = vm_api.suspend_vm({
      "where": {
          "id_in": ["vm_id_1", "vm_id_2"]
      }
  })

  tasks = [with_task_vm.task_id for with_task_vm in with_task_vms]
  ids = [with_task_vm.data.id for with_task_vm in with_task_vms]

  wait_tasks(tasks, api_client)

  suspended_vms = vm_api.get_vms({"where": {"id_in": ids}})
  ```





  ```python
  from cloudtower import ApiClient, Configuration, VmApi
  from cloudtower.utils import wait_tasks

  api_client = ApiClient(Configuration(host="http://192.168.96.133/v2/api"))

  vm_api = VmApi(api_client)
  with_task_vm = vm_api.resume_vm({
      "where": {
          "id": "vm_id"
      }
  })[0]

  wait_tasks([with_task_vm.task_id], api_client)

  resumed_vm = vm_api.get_vms({"where": {"id": with_task_vm.data.id}})[0]
  ```



  ```python
  from cloudtower import ApiClient, Configuration, VmApi
  from cloudtower.utils import wait_tasks

  api_client = ApiClient(Configuration(host="http://192.168.96.133/v2/api"))

  vm_api = VmApi(api_client)
  with_task_vms = vm_api.resume_vm({
      "where": {
          "id_in": ["vm_id_1", "vm_id_2"]
      }
  })

  tasks = [with_task_vm.task_id for with_task_vm in with_task_vms]
  ids = [with_task_vm.data.id for with_task_vm in with_task_vms]

  wait_tasks(tasks, api_client)

  resumed_vms = vm_api.get_vms({"where": {"id_in": ids}})
  ```







  ```python
  from cloudtower import ApiClient, Configuration, VmApi
  from cloudtower.utils import wait_tasks

  api_client = ApiClient(Configuration(host="http://192.168.96.133/v2/api"))

  vm_api = VmApi(api_client)
  with_task_delete_vms = vm_api.move_vm_to_recycle_bin({
      "where": {
          "id_in": ["vm_id_1", "vm_id_2"]
      }
  })

  tasks = [with_task_delete_vm.task_id for with_task_delete_vm in with_task_delete_vms]
  ids = [with_task_vm.data.id for with_task_vm in with_task_vms]

  wait_tasks(tasks, api_client)

  vm_moved_to_recycle_bin = vm_api.get_vms({"where": {"id_in": ids}})
  ```



  ```python
  from cloudtower import ApiClient, Configuration, VmApi
  from cloudtower.utils import wait_tasks

  api_client = ApiClient(Configuration(host="http://192.168.96.133/v2/api"))

  vm_api = VmApi(api_client)
  with_task_delete_vms = vm_api.recover_vm_from_recycle_bin({
      "where": {
          "id_in": ["vm_id_1", "vm_id_2"]
      }
  })

  tasks = [with_task_delete_vm.task_id for with_task_delete_vm in with_task_delete_vms]
  ids = [with_task_vm.data.id for with_task_vm in with_task_vms]

  wait_tasks(tasks, api_client)

  recovered_vms = vm_api.get_vms({"where": {"id_in": ids}})
  ```



  ```python
  from cloudtower import ApiClient, Configuration, VmApi
  from cloudtower.utils import wait_tasks

  api_client = ApiClient(Configuration(host="http://192.168.96.133/v2/api"))

  vm_api = VmApi(api_client)
  with_task_delete_vms = vm_api.delete_vm({
      "where": {
          "id_in": ["vm_id_1", "vm_id_2"]
      }
  })

  tasks = [with_task_delete_vm.task_id for with_task_delete_vm in with_task_delete_vms]

  wait_tasks(tasks, api_client)
  ```





  ```python
  from cloudtower import ApiClient
  from cloudtower.api.vm_api import VmApi
  from cloudtower.api.vm_snapshot_api import VmSnapshotApi
  from cloudtower.api.iscsi_lun_snapshot_api import IscsiLunSnapshotApi
  from cloudtower.models import (
      ConsistentType,
      VmToolsStatus
  )
  from cloudtower.utils import wait_tasks


  def create_vm_snapshot(
      api_client: ApiClient,
      target_vm_name: str,
      target_snapshot_name: str,
      consistent_type: ConsistentType
  ):
      vm_api = VmApi(api_client)
      vm_snapshot_api = VmSnapshotApi(api_client)
      iscsi_lun_snapshot_api = IscsiLunSnapshotApi(api_client)
      
      vm = vm_api.get_vms({
          "where": {
              "name": target_vm_name
          },
          "first": 1
      })
      
      if vm.vm_tools_status != VmToolsStatus.RUNNING and consistent_type == ConsistentType.FILE_SYSTEM_CONSISTENT:
          consistent_type = ConsistentType.CRASH_CONSISTENT

      
      snapshots_with_task = vm_snapshot_api.create_vm_snapshot({
          "data": [
              {
                  "vm_id": vm.id,
                  "name": target_snapshot_name,
                  "consistent_type": consistent_type
              }
          ]
      })

      
      wait_tasks([snapshots_with_task[0].task_id], api_client)

      
      snapshot = vm_snapshot_api.get_vm_snapshots({
          "where": {
              "id": snapshots_with_task.data.id
          }
      })[0]
      
      
      
      lun_snapshot_ids = []
      for disk in snapshot.vm_disks:
          if disk.type == "DISK":
              lun_snapshot_ids.append(disk.snapshot_local_id)

      lun_snapshots = iscsi_lun_snapshot_api.get_iscsi_lun_snapshots({
          "where": {
              "name_in": lun_snapshot_ids
          }
      })

      return {
          "vm_snapshot": snapshot,
          "lun_snapshots": lun_snapshots
      }

  ```





  ```python
  from functools import reduce
  from datetime import datetime, timedelta
  from cloudtower import ApiClient
  from cloudtower.configuration import Configuration
  from cloudtower.models import SeverityEnum, ClusterType, Hypervisor, DiskType, DiskUsageStatus, DiskHealthStatus
  from cloudtower.api import VmApi, ClusterApi, AlertApi, HostApi, DiskApi, ClusterSettingsApi, GlobalSettingsApi

  api_client = ApiClient(Configuration(host="http://192.168.96.133/v2/api"))

  byte_units = ["B", "KiB", "MiB", "GiB", "TiB", "PiB"]
  hz_units = ["Hz", "KHz", "MHz", "GHz", "THz"]


  def format_unit(base: int, units, step=1024):
      if not len(units):
          raise Exception("no unit provided")
      if base <= 0:
          return "0" + units[0]
      for unit in units:
          if base < step:
              return "{:.2f}{}".format(base, unit)
          base /= step
      return "{:.2f}{}".format(base, units[-1])
  ```



  ```python
  def build_alerts(api_client: ApiClient, cluster_ids):
      alert_api = AlertApi(api_client)
      alerts = alert_api.get_alerts({
          "where": {
              "ended": False,
              "cluster": {
                  "id_in": cluster_ids
              },
          }
      })
      critial_alerts = [
          alert for alert in alerts if alert.severity == SeverityEnum.CRITICAL]
      notice_alerts = [
          alert for alert in alerts if alert.severity == SeverityEnum.NOTICE]
      info_alerts = [
          alert for alert in alerts if alert.severity == SeverityEnum.INFO]
      return {
          "critical": critial_alerts,
          "notice": notice_alerts,
          "info": info_alerts
      }
  ```



  > 这里以机械硬盘为例

  ```python
  def build_hdd_info(api_client: ApiClient, cluster_ids):
      disk_api = DiskApi(api_client)
      disks = disk_api.get_disks({
          "where": {
              "host": {
                  "cluster": {
                      "id_in": cluster_ids
                  }
              }
          }
      })
      hdd = {
          "healthy": 0,
          "warning": 0,
          "error": 0,
          "total": 0,
      }
      for disk in disks:
          if disk.type == DiskType.HDD:
              if disk.health_status in [DiskHealthStatus.UNHEALTHY, DiskHealthStatus.SUBHEALTHY, DiskHealthStatus.SMART_FAILED]:
                  hdd['error'] += 1
              elif disk.usage_status in [DiskUsageStatus.UNMOUNTED, DiskUsageStatus.PARTIAL_MOUNTED]:
                  hdd['warning'] += 1
              else:
                  hdd['healthy'] += 1
              hdd['total'] += 1
      return hdd
  ```



  > 获取指定集群的 CPU 核数，CPU 频率总数，CPU 使用率，内存总量，内存使用量，存储资源总量，存储资源已使用量，存储资源失效量与存储资源可用量。

  ```python
  def build_metrics(api_client: ApiClient, clusters, cluster_ids):
      result = {}
      host_api = HostApi(api_client)
      hosts = host_api.get_hosts({
          "where": {
              "cluster": {
                  "id_in": cluster_ids
              }
          }
      })
      cpu = {
          "total_cpu_cores": 0,
          "total_cpu_hz": 0,
          "used_cpu_hz": 0,
      }
      memory = {
          "total_memory": 0,
          "used_memory": 0,
      }
      storage = {
          "total": 0,
          "used": 0,
          "invalid": 0,
          "available": 0
      }

      for host in hosts:
          cluster = next(
              cluster for cluster in clusters if cluster.id == host.cluster.id)
          if cluster.hypervisor == Hypervisor.ELF:
              memory['total_memory'] += 0 if host.total_memory_bytes is None else host.total_memory_bytes
              memory['used_memory'] += (0 if host.running_pause_vm_memory_bytes is None else host.running_pause_vm_memory_bytes) + \
                  (0 if host.os_memory_bytes is None else host.os_memory_bytes)

      for cluster in clusters:
          if cluster.type == ClusterType.SMTX_OS:
              cpu["total_cpu_cores"] += 0 if cluster.total_cpu_cores is None else cluster.total_cpu_cores
              cpu["total_cpu_hz"] += 0 if cluster.total_cpu_hz is None else cluster.total_cpu_hz
              cpu["used_cpu_hz"] += 0 if cluster.used_cpu_hz is None else cluster.used_cpu_hz
              if cluster.hypervisor == Hypervisor.VMWARE:
                  memory["total_memory"] += 0 if cluster.total_memory_bytes is None else cluster.total_memory_bytes
                  memory["used_memory"] += 0 if cluster.used_memory_bytes is None else cluster.used_memory_bytes
          storage["total"] += 0 if cluster.total_data_capacity is None else cluster.total_data_capacity
          storage["used"] += 0 if cluster.used_data_space is None else cluster.used_data_space
          storage["invalid"] += 0 if cluster.failure_data_space is None else cluster.failure_data_space
      if len([cluster for cluster in clusters if cluster.type != ClusterType.SMTX_ZBS]) > 1:
          cpu["cpu_usage"] = "{:.2f}%".format(
              cpu["used_cpu_hz"] / cpu["total_cpu_hz"])
          cpu["total_cpu_hz"] = format_unit(cpu["total_cpu_hz"], hz_units, 1000)
          cpu["used_cpu_hz"] = format_unit(cpu["used_cpu_hz"], hz_units, 1000)
          result['cpu'] = cpu
          memory["memory_usage"] = "{:.2f}%".format(
              memory["used_memory"] / memory["total_memory"])
          memory["total_memory"] = format_unit(
              memory["total_memory"], byte_units)
          memory["used_memory"] = format_unit(
              memory["used_memory"], byte_units)
          result["memory"] = memory
      storage["available"] = format_unit(
          storage["total"] - storage["used"] - storage["invalid"], byte_units)
      storage["total"] = format_unit(storage["total"], byte_units)
      storage["used"] = format_unit(storage["used"], byte_units)
      storage["invalid"] = format_unit(storage["invalid"], byte_units)
      result["storage"] = storage
      return result
  ```



  ```python
  def build_dashboard(api_client: ApiClient, datacenter_id: str = None, cluster_id: str = None):
      result = {}
      cluster_api = ClusterApi(api_client)
      clusters = cluster_api.get_clusters({
          "where": {"id": cluster_id} if cluster_id is not None else {"datacenters_some": {"id": datacenter_id}} if datacenter_id is not None else None
      })
      cluster_ids = [cluster.id for cluster in clusters]

      result["alerts"] = build_alerts(api_client, cluster_ids)
      result["hdd"] = build_hdd_info(api_client, cluster_ids)
      metric = build_metrics(api_client, clusters, cluster_ids)
      if "cpu" in metric:
          result["cpu"] = metric["cpu"]
      if "memory" in metric:
          result["memory"] = metric["memory"]
      if "storage" in metric:
          result["storage"] = metric["storage"]
      return result
  ```


