XCP-ng
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Register
    • Login

    Python help

    Scheduled Pinned Locked Moved REST API
    28 Posts 5 Posters 1.0k Views 4 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • S Offline
      Studmuffn1134 @Studmuffn1134
      last edited by Studmuffn1134

      @Studmuffn1134 That is what i did and it still does not work I get a status code 200 but it never shuts the host off

      1 Reply Last reply Reply Quote 0
      • TheNorthernLightT Offline
        TheNorthernLight @Studmuffn1134
        last edited by

        @Studmuffn1134 LOL at "ThePlague"... (hackers unite!)

        S 1 Reply Last reply Reply Quote 0
        • S Offline
          Studmuffn1134 @TheNorthernLight
          last edited by

          @TheNorthernLight Finally someone gets the reference But what do u think I am doing wrong

          TheNorthernLightT 1 Reply Last reply Reply Quote 0
          • TheNorthernLightT Offline
            TheNorthernLight @Studmuffn1134
            last edited by

            @Studmuffn1134 Sadly, I dont know squat about python, sorry!

            S 1 Reply Last reply Reply Quote 0
            • S Offline
              Studmuffn1134 @TheNorthernLight
              last edited by

              @TheNorthernLight Well could you do it in a language you know and maybe i would be able to convert it>?

              1 Reply Last reply Reply Quote 0
              • G Offline
                Gurve
                last edited by

                Did some "kicking" around in python, I don't python that much so "readers beware"

                How did i figure it out, the french blog from here was useful, but only showed listing methods. I was still very confused as to how to call the vm.stop and which parameters it took.

                Enter xo-cli ❤

                xo-cli uses jsonrpc but is CLi only, but you can get very nice info from it just have to register and call "list-methods". should be available on your xo VM

                xo-cli register http://[yourXO].example.com [yourusername]
                #after registering/authenticating
                xo-cli list-commands | egrep 'vm\.' --color=always
                

                here you will get a nice list of all "methods" in jsonrpc related to vm and a line about vm.stop:

                vm.stop id=<string> [force=<boolean>] [forceShutdownDelay=<number>] [bypassBlockedOperation=<boolean>]

                which was enough information to alter the french guy's (Baron) example into this:

                import aiohttp
                import asyncio
                
                from jsonrpc_websocket import Server
                
                async def routine():
                    async with aiohttp.ClientSession() as client:
                        server = Server('ws://[yourXO]/api/', client)
                
                        await server.ws_connect()
                
                        # signIn required
                        result = await server.session.signIn(username='[xoAdmin]', password='[xoAdmin]') # email attribute is working in place of username
                        
                        #hard shutdown
                        #result = await server.vm.stop(id='3f32beeb-ab3f-a8ac-087d-fdc7ed061b58', force=(bool(1)))
                        
                        #clean Shutdown
                        result = await server.vm.stop(id='3f32beeb-ab3f-a8ac-087d-fdc7ed061b58', force=(bool(0)))
                        
                        print (result)
                
                asyncio.get_event_loop().run_until_complete(routine())
                
                
                
                S 1 Reply Last reply Reply Quote 0
                • S Offline
                  Studmuffn1134 @Gurve
                  last edited by

                  @Gurve Is this for the vm's on the server or the host itself i need the host itself

                  G 1 Reply Last reply Reply Quote 0
                  • G Offline
                    Gurve @Studmuffn1134
                    last edited by

                    @Studmuffn1134 Sorry, must have somehow read another reply about vm and mixed them. But pretty sure you should be able to utilise the steps I did for host shutdown

                    xo-cli to get relevant api endpoints, xo-cli to get parameters for said endpoint and then press play

                    S 1 Reply Last reply Reply Quote 0
                    • S Offline
                      Studmuffn1134 @Gurve
                      last edited by

                      @Gurve Do i have to enable the xo-cli?

                      G 1 Reply Last reply Reply Quote 0
                      • G Offline
                        Gurve @Studmuffn1134
                        last edited by Gurve

                        @Studmuffn1134 should be available in XO vm, it was atleast for me, I just used the XO installer script from github.

                        I did a quick search with xo cli now

                        xo-cli list-commands | egrep 'host.'

                        in case it looks weird "\." is just to escape the "." which just tells regex I am looking for an actual "."

                        import aiohttp
                        import asyncio
                        
                        from jsonrpc_websocket import Server
                        
                        async def routine():
                            async with aiohttp.ClientSession() as client:
                                server = Server('ws://[yourXO]/api/', client)
                        
                                await server.ws_connect()
                        
                                # signIn required
                                result = await server.session.signIn(username='[yourXOusername]', password='[yourXOPassword]') # email attribute is working in place of username
                                
                                #hard shutdown VM
                                #result = await server.vm.stop(id='3f32beeb-ab3f-a8ac-087d-fdc7ed061b58', force=(bool(1)))
                                
                                #clean Shutdown VM
                                #result = await server.vm.stop(id='3f32beeb-ab3f-a8ac-087d-fdc7ed061b58', force=(bool(0)))
                        
                                #bypassbackup and bypassevacuate set off by default but include for wholeness of parameters
                                result = await server.host.stop(id=[hostUUID],bypassBackupCheck=(bool(0)),bypassEvacuate=bool(0))
                                
                                print (result)
                        
                        asyncio.get_event_loop().run_until_complete(routine())
                        

                        I just built all examples into one, here in the end is the host.stop example also

                        S 1 Reply Last reply Reply Quote 0
                        • S Offline
                          Studmuffn1134 @Gurve
                          last edited by

                          @Gurve '''def shutdown_vm_hosts(host_id,xo_url,auth_token,use_force):

                          async def routine():
                              async with aiohttp.ClientSession() as client:
                                  server = Server('ws://192.168.100.30:2223/api/', client)
                                  await server.ws_connect()
                                  # signIn required
                                  result = await server.session.signIn(username='ThePlague', password='No') # email attribute is working in place of username
                                  hostUUID ="d2f1374c-728d-4905-85cc-e0d7166a3fbf"
                                  #hard shutdown VM
                                  #result = await server.vm.stop(id='3f32beeb-ab3f-a8ac-087d-fdc7ed061b58', force=(bool(1)))
                                  #clean Shutdown VM
                                  #result = await server.vm.stop(id='3f32beeb-ab3f-a8ac-087d-fdc7ed061b58', force=(bool(0)))
                                  #bypassbackup and bypassevacuate set off by default but include for wholeness of parameters
                                  result = await server.host.stop(id=[hostUUID],bypassBackupCheck=(bool(0)),bypassEvacuate=bool(0))
                                  print (result)''' Traceback (most recent call last):
                                  
                                    File "z:\Valera\School\Lakeland University\Finished\Programming 2\Python Programs\StudsPrograms\Shutdowntest.py", line 72, in <module>
                                  
                                      main() # second part of calling the main function
                                  
                                      ~~~~^^
                                  
                                    File "z:\Valera\School\Lakeland University\Finished\Programming 2\Python Programs\StudsPrograms\Shutdowntest.py", line 70, in main
                                  
                                      shutdown_vm_hosts(l,XO_URL,AUTH_TOKEN,use_force=False)
                                  
                                      ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                                  
                                    File "z:\Valera\School\Lakeland University\Finished\Programming 2\Python Programs\StudsPrograms\Shutdowntest.py", line 29, in shutdown_vm_hosts
                                  
                                      asyncio.get_event_loop().run_until_complete(routine())
                                  
                                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^
                                  
                                    File "C:\Users\ThePlague\AppData\Local\Programs\Python\Python313\Lib\asyncio\base_events.py", line 725, in run_until_complete
                                  
                                      return future.result()
                                  
                                             ~~~~~~~~~~~~~^^
                                  
                                    File "z:\Valera\School\Lakeland University\Finished\Programming 2\Python Programs\StudsPrograms\Shutdowntest.py", line 13, in routine
                                  
                                      await server.ws_connect()
                                  
                                    File "Z:\Valera\School\Lakeland University\Finished\Programming 2\Python Programs\StudsPrograms\.venv\Lib\site-packages\jsonrpc_websocket\jsonrpc.py", line 68, in ws_connect
                                  
                                      raise TransportError('Error connecting to server', None, exc)
                                  
                                  jsonrpc_base.jsonrpc.TransportError: ('Error connecting to server', ServerDisconnectedError('Server disconnected'))
                          

                          I tried that and that is the error code I get

                          S 1 Reply Last reply Reply Quote 0
                          • S Offline
                            Studmuffn1134 @Studmuffn1134
                            last edited by

                            @Studmuffn1134 I changed my link from ws:// to https:// and it now gives me this error File "Z:\Valera\School\Lakeland University\Finished\Programming 2\Python Programs\StudsPrograms.venv\Lib\site-packages\jsonrpc_base\jsonrpc.py", line 213, in parse_response
                            raise ProtocolError(code, message, data)
                            jsonrpc_base.jsonrpc.ProtocolError: (10, 'invalid parameters', {'error': {'message': 'invalid parameters', 'code': 10, 'data': {'errors': [{'instancePath': '/id', 'schemaPath': '#/properties/id/type', 'keyword': 'type', 'params': {'type': 'string'}, 'message': 'must be string'}]}}, 'id': '0a11ec72-9300-4030-a5d2-a5c0286f3811', 'jsonrpc': '2.0'})

                            1 Reply Last reply Reply Quote 0
                            • First post
                              Last post