Remote Desktop Protocol in Twisted Python

Related tags

DevOps Tools rdpy
Overview

RDPY Build Status PyPI version

Remote Desktop Protocol in twisted python.

RDPY is a pure Python implementation of the Microsoft RDP (Remote Desktop Protocol) protocol (client and server side). RDPY is built over the event driven network engine Twisted. RDPY support standard RDP security layer, RDP over SSL and NLA authentication (through ntlmv2 authentication protocol).

RDPY provides the following RDP and VNC binaries :

  • RDP Man In The Middle proxy which record session
  • RDP Honeypot
  • RDP screenshoter
  • RDP client
  • VNC client
  • VNC screenshoter
  • RSS Player

Build

RDPY is fully implemented in python, except the bitmap decompression algorithm which is implemented in C for performance purposes.

Dependencies

Dependencies are only needed for pyqt4 binaries :

  • rdpy-rdpclient
  • rdpy-rdpscreenshot
  • rdpy-vncclient
  • rdpy-vncscreenshot
  • rdpy-rssplayer

Linux

Example for Debian based systems :

sudo apt-get install python-qt4

OS X

Example for OS X to install PyQt with homebrew

$ brew install qt sip pyqt

Windows

x86 x86_64
PyQt4 PyQt4
PyWin32 PyWin32

Build

$ git clone https://github.com/citronneur/rdpy.git rdpy
$ pip install twisted pyopenssl qt4reactor service_identity rsa pyasn1
$ python rdpy/setup.py install

Or use PIP:

$ pip install rdpy

For virtualenv, you will need to link the qt4 library to it:

$ ln -s /usr/lib/python2.7/dist-packages/PyQt4/ $VIRTUAL_ENV/lib/python2.7/site-packages/
$ ln -s /usr/lib/python2.7/dist-packages/sip.so $VIRTUAL_ENV/lib/python2.7/site-packages/

RDPY Binaries

RDPY comes with some very useful binaries. These binaries are linux and windows compatible.

rdpy-rdpclient

rdpy-rdpclient is a simple RDP Qt4 client.

$ rdpy-rdpclient.py [-u username] [-p password] [-d domain] [-r rss_ouput_file] [...] XXX.XXX.XXX.XXX[:3389]

You can use rdpy-rdpclient in a Recorder Session Scenario, used in rdpy-rdphoneypot.

rdpy-vncclient

rdpy-vncclient is a simple VNC Qt4 client .

$ rdpy-vncclient.py [-p password] XXX.XXX.XXX.XXX[:5900]

rdpy-rdpscreenshot

rdpy-rdpscreenshot saves login screen in file.

$ rdpy-rdpscreenshot.py [-w width] [-l height] [-o output_file_path] XXX.XXX.XXX.XXX[:3389]

rdpy-vncscreenshot

rdpy-vncscreenshot saves the first screen update in file.

$ rdpy-vncscreenshot.py [-p password] [-o output_file_path] XXX.XXX.XXX.XXX[:5900]

rdpy-rdpmitm

rdpy-rdpmitm is a RDP proxy allows you to do a Man In The Middle attack on RDP protocol. Record Session Scenario into rss file which can be replayed by rdpy-rssplayer.

$ rdpy-rdpmitm.py -o output_dir [-l listen_port] [-k private_key_file_path] [-c certificate_file_path] [-r (for XP or server 2003 client)] target_host[:target_port]

Output directory is used to save the rss file with following format (YYYYMMDDHHMMSS_ip_index.rss) The private key file and the certificate file are classic cryptographic files for SSL connections. The RDP protocol can negotiate its own security layer If one of both parameters are omitted, the server use standard RDP as security layer.

rdpy-rdphoneypot

rdpy-rdphoneypot is an RDP honey Pot. Use Recorded Session Scenario to replay scenario through RDP Protocol.

$ rdpy-rdphoneypot.py [-l listen_port] [-k private_key_file_path] [-c certificate_file_path] rss_file_path_1 ... rss_file_path_N

The private key file and the certificate file are classic cryptographic files for SSL connections. The RDP protocol can negotiate its own security layer. If one of both parameters are omitted, the server use standard RDP as security layer. You can specify more than one files to match more common screen size.

rdpy-rssplayer

rdpy-rssplayer is use to replay Record Session Scenario (rss) files generates by either rdpy-rdpmitm or rdpy-rdpclient binaries.

$ rdpy-rssplayer.py rss_file_path

RDPY Qt Widget

RDPY can also be used as Qt widget through rdpy.ui.qt4.QRemoteDesktop class. It can be embedded in your own Qt application. qt4reactor must be used in your app for Twisted and Qt to work together. For more details, see sources of rdpy-rdpclient.

RDPY library

In a nutshell RDPY can be used as a protocol library with a twisted engine.

Simple RDP Client

from rdpy.protocol.rdp import rdp

class MyRDPFactory(rdp.ClientFactory):

    def clientConnectionLost(self, connector, reason):
        reactor.stop()

    def clientConnectionFailed(self, connector, reason):
        reactor.stop()

    def buildObserver(self, controller, addr):

        class MyObserver(rdp.RDPClientObserver):

            def onReady(self):
                """
                @summary: Call when stack is ready
                """
                #send 'r' key
                self._controller.sendKeyEventUnicode(ord(unicode("r".toUtf8(), encoding="UTF-8")), True)
                #mouse move and click at pixel 200x200
                self._controller.sendPointerEvent(200, 200, 1, true)

            def onUpdate(self, destLeft, destTop, destRight, destBottom, width, height, bitsPerPixel, isCompress, data):
                """
                @summary: Notify bitmap update
                @param destLeft: xmin position
                @param destTop: ymin position
                @param destRight: xmax position because RDP can send bitmap with padding
                @param destBottom: ymax position because RDP can send bitmap with padding
                @param width: width of bitmap
                @param height: height of bitmap
                @param bitsPerPixel: number of bit per pixel
                @param isCompress: use RLE compression
                @param data: bitmap data
                """
                
            def onSessionReady(self):
		        """
		        @summary: Windows session is ready
		        """

            def onClose(self):
                """
                @summary: Call when stack is close
                """

        return MyObserver(controller)

from twisted.internet import reactor
reactor.connectTCP("XXX.XXX.XXX.XXX", 3389, MyRDPFactory())
reactor.run()

Simple RDP Server

from rdpy.protocol.rdp import rdp

class MyRDPFactory(rdp.ServerFactory):

    def buildObserver(self, controller, addr):

        class MyObserver(rdp.RDPServerObserver):

            def onReady(self):
                """
                @summary: Call when server is ready
                to send and receive messages
                """

            def onKeyEventScancode(self, code, isPressed):
                """
                @summary: Event call when a keyboard event is catch in scan code format
                @param code: scan code of key
                @param isPressed: True if key is down
                @see: rdp.RDPServerObserver.onKeyEventScancode
                """

            def onKeyEventUnicode(self, code, isPressed):
                """
                @summary: Event call when a keyboard event is catch in unicode format
                @param code: unicode of key
                @param isPressed: True if key is down
                @see: rdp.RDPServerObserver.onKeyEventUnicode
                """

            def onPointerEvent(self, x, y, button, isPressed):
                """
                @summary: Event call on mouse event
                @param x: x position
                @param y: y position
                @param button: 1, 2, 3, 4 or 5 button
                @param isPressed: True if mouse button is pressed
                @see: rdp.RDPServerObserver.onPointerEvent
                """

            def onClose(self):
                """
                @summary: Call when human client close connection
                @see: rdp.RDPServerObserver.onClose
                """

        return MyObserver(controller)

from twisted.internet import reactor
reactor.listenTCP(3389, MyRDPFactory())
reactor.run()

Simple VNC Client

from rdpy.protocol.rfb import rfb

class MyRFBFactory(rfb.ClientFactory):

    def clientConnectionLost(self, connector, reason):
        reactor.stop()

    def clientConnectionFailed(self, connector, reason):
        reactor.stop()

    def buildObserver(self, controller, addr):
        class MyObserver(rfb.RFBClientObserver):

            def onReady(self):
                """
                @summary: Event when network stack is ready to receive or send event
                """

            def onUpdate(self, width, height, x, y, pixelFormat, encoding, data):
                """
                @summary: Implement RFBClientObserver interface
                @param width: width of new image
                @param height: height of new image
                @param x: x position of new image
                @param y: y position of new image
                @param pixelFormat: pixefFormat structure in rfb.message.PixelFormat
                @param encoding: encoding type rfb.message.Encoding
                @param data: image data in accordance with pixel format and encoding
                """

            def onCutText(self, text):
                """
                @summary: event when server send cut text event
                @param text: text received
                """

            def onBell(self):
                """
                @summary: event when server send biiip
                """

            def onClose(self):
                """
                @summary: Call when stack is close
                """

        return MyObserver(controller)

from twisted.internet import reactor
reactor.connectTCP("XXX.XXX.XXX.XXX", 3389, MyRFBFactory())
reactor.run()
Comments
  • RDP Connection Issue/Error

    RDP Connection Issue/Error

    Hi there,

    I'm attempting to loop over connecting to multiple machines via RDP, and I'm getting an error in rdpy. If I'm writing this code wrong, I'd love to know, otherwise I wanted to report this bug to you. The pastebin here (http://pastebin.com/3Rx4vd5B) shows the error that I'm getting. The top is the error, the bottom part is the specific function I am using to connect via RDP and make a screenshot.

    If you need to see my full code, it's here - https://github.com/ChrisTruncer/EyeWitness/tree/Eyewitness_deaux_Shmoo

    opened by ChrisTruncer 14
  • Screenshot Capability?

    Screenshot Capability?

    So, I have a use case that I would love to use rdpy for (assuming you were cool with it). I write a tool which is designed to take screenshots of web apps (along with other information), and aggregate all of that into a report. This really helps make the information gathering phase of pen tests go easier as we can automate this process.

    I'd LOVE to be able to add in the ability to screenshot workstations/servers over RDP. This would also be great information to have for pen tests. I've never really developed with pyqt, so I figured I'd ask you first. Is there any easy way that you could add in the ability to take screenshots of the open window of rdpy? The most likely scenario how I would use this is to either take a screenshot of the login page itself (when not providing a username or password), or to take a screenshot after successfully having logged into the remote system. Is there any way you would be interested in adding a switch, or something that I could invoke which would screenshot the current rdpy screen? I'd really love that ability :)

    Thanks again!

    opened by ChrisTruncer 13
  • exceptions.AttributeError in rdpy-rdpmitm.py

    exceptions.AttributeError in rdpy-rdpmitm.py

    Tested freerdp version 1.2.0_beta1_pre20141115 against rdpmitm, here's the output:

    % ./rdpy-rdpmitm.py -o /tmp 192.168.56.3
    Unhandled Error
    Traceback (most recent call last):
      File "venv/lib/python2.7/site-packages/Twisted-15.0.0-py2.7-linux-x86_64.egg/twisted/python/log.py", line 88, in callWithLogger
        return callWithContext({"system": lp}, func, *args, **kw)
      File "venv/lib/python2.7/site-packages/Twisted-15.0.0-py2.7-linux-x86_64.egg/twisted/python/log.py", line 73, in callWithContext
        return context.call({ILogContext: newCtx}, func, *args, **kw)
      File "venv/lib/python2.7/site-packages/Twisted-15.0.0-py2.7-linux-x86_64.egg/twisted/python/context.py", line 118, in callWithContext
        return self.currentContext().callWithContext(ctx, func, *args, **kw)
      File "venv/lib/python2.7/site-packages/Twisted-15.0.0-py2.7-linux-x86_64.egg/twisted/python/context.py", line 81, in callWithContext
        return func(*args,**kw)
    --- <exception caught here> ---
      File "venv/lib/python2.7/site-packages/Twisted-15.0.0-py2.7-linux-x86_64.egg/twisted/internet/posixbase.py", line 614, in _doReadOrWrite
        why = selectable.doRead()
      File "venv/lib/python2.7/site-packages/Twisted-15.0.0-py2.7-linux-x86_64.egg/twisted/internet/tcp.py", line 215, in doRead
        return self._dataReceived(data)
      File "venv/lib/python2.7/site-packages/Twisted-15.0.0-py2.7-linux-x86_64.egg/twisted/internet/tcp.py", line 221, in _dataReceived
        rval = self.protocol.dataReceived(data)
      File "build/bdist.linux-x86_64/egg/rdpy/core/layer.py", line 209, in dataReceived
    
      File "build/bdist.linux-x86_64/egg/rdpy/protocol/rdp/tpkt.py", line 195, in readData
    
      File "build/bdist.linux-x86_64/egg/rdpy/protocol/rdp/x224.py", line 147, in recvData
    
      File "build/bdist.linux-x86_64/egg/rdpy/protocol/rdp/mcs.py", line 520, in recvConnectInitial
    
    exceptions.AttributeError: 'NoneType' object has no attribute 'channelDefArray'
    
    opened by adepasquale 9
  • RDPY client/server test

    RDPY client/server test

    Hi, Thanks for your efforts in creating this library and sharing with us!

    I am trying to use this code to handle some actions on a remote machine. I am able to connect to the remote machine using the rdpy client code sample, however, I am not able to send any mouse or key events to the remote machine. How do I achieve this?

    Do I need to run the rdpy server code on the remote machine? if so, how can I do it since the port 3389 is already in use by the TCP services on windows and the rdpy server code throws exception saying that it cant listen on port 3389 since its already being listened by the windows TCP services.

    Let me know...Thanks in advance!

    opened by gaikwad7amar 8
  • rdpy.core.error.InvalidSize in rdp-rdpclient.py

    rdpy.core.error.InvalidSize in rdp-rdpclient.py

    I'm connecting to a test VM, when I use rdesktop is all fine but with rdpy-rdpclient here's what I got. I tried removing some options, changing width&height, but no luck. :-(

    % rdpy-rdpclient.py -u username -p password -w 800 -l 600 -r test.rss 192.168.1.102
    INFO : keyboard layout set to en
    ERROR : Error during read <class 'rdpy.protocol.rdp.gcc.ServerCoreData'>::clientRequestedProtocol
    ERROR : Error during read <class 'rdpy.protocol.rdp.gcc.DataBlock'>::dataBlock
    ERROR : Error during read <class 'rdpy.protocol.rdp.gcc.Settings'>::settings
    Unhandled Error
    Traceback (most recent call last):
      File "/usr/lib64/python2.7/site-packages/twisted/python/log.py", line 88, in callWithLogger
        return callWithContext({"system": lp}, func, *args, **kw)
      File "/usr/lib64/python2.7/site-packages/twisted/python/log.py", line 73, in callWithContext
        return context.call({ILogContext: newCtx}, func, *args, **kw)
      File "/usr/lib64/python2.7/site-packages/twisted/python/context.py", line 118, in callWithContext
        return self.currentContext().callWithContext(ctx, func, *args, **kw)
      File "/usr/lib64/python2.7/site-packages/twisted/python/context.py", line 81, in callWithContext
        return func(*args,**kw)
    --- <exception caught here> ---
      File "/usr/lib64/python2.7/site-packages/qtreactor/qt4base.py", line 100, in _read
        data = w.doRead()
      File "/usr/lib64/python2.7/site-packages/twisted/internet/tcp.py", line 214, in doRead
        return self._dataReceived(data)
      File "/usr/lib64/python2.7/site-packages/twisted/internet/tcp.py", line 220, in _dataReceived
        rval = self.protocol.dataReceived(data)
      File "/usr/lib64/python2.7/site-packages/rdpy/core/layer.py", line 209, in dataReceived
        self.recv(expectedData)
      File "/usr/lib64/python2.7/site-packages/rdpy/protocol/rdp/tpkt.py", line 195, in readData
        self._presentation.recv(data)
      File "/usr/lib64/python2.7/site-packages/rdpy/protocol/rdp/x224.py", line 147, in recvData
        self._presentation.recv(data)
      File "/usr/lib64/python2.7/site-packages/rdpy/protocol/rdp/mcs.py", line 372, in recvConnectResponse
        self._serverSettings = gcc.readConferenceCreateResponse(data)
      File "/usr/lib64/python2.7/site-packages/rdpy/protocol/rdp/gcc.py", line 581, in readConferenceCreateResponse
        s.readType(serverSettings)
      File "/usr/lib64/python2.7/site-packages/rdpy/core/type.py", line 894, in readType
        value.read(self)
      File "/usr/lib64/python2.7/site-packages/rdpy/core/type.py", line 97, in read
        self.__read__(s)
      File "/usr/lib64/python2.7/site-packages/rdpy/core/type.py", line 477, in __read__
        raise e
    rdpy.core.error.InvalidSize: Impossible to read type <class 'rdpy.protocol.rdp.gcc.ServerCoreData'> : read length is too small
    
    opened by adepasquale 7
  • Build Issue

    Build Issue

    Hey there,

    First off, I know this is a work in project (so it seems). Having this built, would be AWESOME. I've been searching for a pure python RDP client, I would love to see this.

    I tried building rdpy after cloning it, but it seems I am getting an error. I'm using Kali linux to test this on. Figured I'd post the error here for you:

    scons -C rdpy/rdpy/core install scons: Entering directory `/mnt/hgfs/gitrepos/rdpy/rdpy/core' scons: Reading SConscript files ... TypeError: File /mnt/hgfs/gitrepos/rdpy/rdpy/core/Sconstruct found where directory expected.: File "/mnt/hgfs/gitrepos/rdpy/rdpy/core/SConstruct", line 4: script_dir = os.path.dirname(os.path.realpath(Dir("#/Sconstruct").abspath)) File "/usr/lib/scons/SCons/Script/SConscript.py", line 614: return method(_args, *_kw) File "/usr/lib/scons/SCons/Environment.py", line 1978: return self.fs.Dir(s, _args, *_kw) File "/usr/lib/scons/SCons/Node/FS.py", line 1351: return self._lookup(name, directory, Dir, create) File "/usr/lib/scons/SCons/Node/FS.py", line 1318: return root._lookup_abs(p, fsclass, create) File "/usr/lib/scons/SCons/Node/FS.py", line 2215: result.diskcheck_match() File "/usr/lib/scons/SCons/Node/FS.py", line 1504: "File %s found where directory expected.") File "/usr/lib/scons/SCons/Node/FS.py", line 384: return self.func(_args, *_kw) File "/usr/lib/scons/SCons/Node/FS.py", line 405: raise TypeError(errorfmt % node.abspath)

    opened by ChrisTruncer 7
  • NLA security

    NLA security

    Why in NLA Security level connection (with -n key), credetentials are not asks (as on attached picture) before connect and then this session are closed? image

    opened by ciberx 5
  • LWin key press is not working

    LWin key press is not working

    I want to open Explorer on the remote machine, to which I joined by the rdpy. To do this, i need to press the hotkeys win + e. I do this with the following code: self._controller.sendKeyEventScancode (347, True) self._controller.sendKeyEventScancode (18, True) self._controller.sendKeyEventScancode (18, False) self._controller.sendKeyEventScancode (347, False) Since the keys scancode lwin = 347. But the key is not pressed. Can you please tell me what code i should write to do this.

    opened by ex0dus-cpp 4
  • Exception when starting RDP client on os x 10.9

    Exception when starting RDP client on os x 10.9

    Followed installation instructions.

    on

     rdpy-rdpclient.py server-name
    

    Rdp window opens and I have a popup with this text:

     Lost connection : [Failure instance: Traceback (failure with no frames): 
     <class 'twisted.internet.error.ConnectionDone'>: Connection was closed cleanly. ]
    

    And here is what I have in terminal:

    INFO : failed to auto detect keyboard layout [Errno 2] No such file or directory
    INFO : keyboard layout set to en
    INFO : *******************************************
    INFO : *          NLA Security selected          *
    INFO : *******************************************
    ^[[A2015-03-13 11:48:59.010 Python[52516:d07] modalSession has been exited 
    prematurely - check for a reentrant call to endModalSession:
    

    pyqt installed via homebrew (brew install qt sip pyqt)

    I did not expected it to work on os x 10.9 as you don't mentioned os x at all, but it was worth checking out. If it would've work for me, that going to be my replacement for CoRD as I cannot make changes to that, and contributing to python source code is actually an option.

    Thank you for this project!

    opened by viktor-evdokimov 4
  • RDPScreenshot Bug

    RDPScreenshot Bug

    Hi there again!

    I'm trying to go through and test your latest commits before I push out my stuff (finally), and I am running into a bug when trying to screenshot a rdp server.

    I removed the IP address, but if you need one, let me know and I can send you one privately to test against. Here is the crash dump - http://pastebin.com/PtcytEsw

    Thanks!

    opened by ChrisTruncer 4
  • If an exception is thrown, all screenshots are black

    If an exception is thrown, all screenshots are black

    Hi there,

    So I know that currently older versions of RDP are not supported. When RDPY connects to one of those older systems, an exception is thrown (obviously). However, if the same reactor is used after the previous exception has been hit, all of the following screenshots are only black screens.

    This function (https://github.com/ChrisTruncer/EyeWitness/blob/Eyewitness_deaux_Shmoo/EyeWitness.py#L741-772) iterates over a list containing multiple IPs to connect to. If one of the IPs is running an old version of RDP, all screenshots will be black.

    To re-create this ideally in a simpler manner, I'm going to try to edit your script to encounter the same issue. Try using this here - http://pastebin.com/8PsyVSA3

    Just change the values of all_machines to IPs of systems on your network. Make one of them a Windows XP machine (or any unsupported RDP system). The script will likely finish, but all screenshots are black, even though two out of the three machines should have a screenshot.

    Hope this helps to clarify the issue I am having. Just let me know otherwise.

    opened by ChrisTruncer 4
  • Mac os install failed

    Mac os install failed

    Hello! Can't install on macOS 12.1. I am attaching a traceback:

    (nbki-reporter-py3.10) ➜  nbki_reporter pip install rdpy
    Collecting rdpy
      Downloading rdpy-1.3.2.zip (151 kB)
         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 151.5/151.5 kB 977.3 kB/s eta 0:00:00
      Preparing metadata (setup.py) ... done
    Requirement already satisfied: twisted in /Users/etomarat/Library/Caches/pypoetry/virtualenvs/nbki-reporter-cIhFgnC6-py3.10/lib/python3.10/site-packages (from rdpy) (22.8.0)
    Requirement already satisfied: pyopenssl in /Users/etomarat/Library/Caches/pypoetry/virtualenvs/nbki-reporter-cIhFgnC6-py3.10/lib/python3.10/site-packages (from rdpy) (22.0.0)
    Requirement already satisfied: service_identity in /Users/etomarat/Library/Caches/pypoetry/virtualenvs/nbki-reporter-cIhFgnC6-py3.10/lib/python3.10/site-packages (from rdpy) (21.1.0)
    Requirement already satisfied: qt4reactor in /Users/etomarat/Library/Caches/pypoetry/virtualenvs/nbki-reporter-cIhFgnC6-py3.10/lib/python3.10/site-packages (from rdpy) (1.6)
    Requirement already satisfied: rsa in /Users/etomarat/Library/Caches/pypoetry/virtualenvs/nbki-reporter-cIhFgnC6-py3.10/lib/python3.10/site-packages (from rdpy) (4.9)
    Requirement already satisfied: pyasn1 in /Users/etomarat/Library/Caches/pypoetry/virtualenvs/nbki-reporter-cIhFgnC6-py3.10/lib/python3.10/site-packages (from rdpy) (0.4.8)
    Requirement already satisfied: cryptography>=35.0 in /Users/etomarat/Library/Caches/pypoetry/virtualenvs/nbki-reporter-cIhFgnC6-py3.10/lib/python3.10/site-packages (from pyopenssl->rdpy) (38.0.1)
    Requirement already satisfied: pyasn1-modules in /Users/etomarat/Library/Caches/pypoetry/virtualenvs/nbki-reporter-cIhFgnC6-py3.10/lib/python3.10/site-packages (from service_identity->rdpy) (0.2.8)
    Requirement already satisfied: six in /Users/etomarat/Library/Caches/pypoetry/virtualenvs/nbki-reporter-cIhFgnC6-py3.10/lib/python3.10/site-packages (from service_identity->rdpy) (1.16.0)
    Requirement already satisfied: attrs>=19.1.0 in /Users/etomarat/Library/Caches/pypoetry/virtualenvs/nbki-reporter-cIhFgnC6-py3.10/lib/python3.10/site-packages (from service_identity->rdpy) (22.1.0)
    Requirement already satisfied: incremental>=21.3.0 in /Users/etomarat/Library/Caches/pypoetry/virtualenvs/nbki-reporter-cIhFgnC6-py3.10/lib/python3.10/site-packages (from twisted->rdpy) (21.3.0)
    Requirement already satisfied: hyperlink>=17.1.1 in /Users/etomarat/Library/Caches/pypoetry/virtualenvs/nbki-reporter-cIhFgnC6-py3.10/lib/python3.10/site-packages (from twisted->rdpy) (21.0.0)
    Requirement already satisfied: typing-extensions>=3.6.5 in /Users/etomarat/Library/Caches/pypoetry/virtualenvs/nbki-reporter-cIhFgnC6-py3.10/lib/python3.10/site-packages (from twisted->rdpy) (4.3.0)
    Requirement already satisfied: zope.interface>=4.4.2 in /Users/etomarat/Library/Caches/pypoetry/virtualenvs/nbki-reporter-cIhFgnC6-py3.10/lib/python3.10/site-packages (from twisted->rdpy) (5.4.0)
    Requirement already satisfied: constantly>=15.1 in /Users/etomarat/Library/Caches/pypoetry/virtualenvs/nbki-reporter-cIhFgnC6-py3.10/lib/python3.10/site-packages (from twisted->rdpy) (15.1.0)
    Requirement already satisfied: Automat>=0.8.0 in /Users/etomarat/Library/Caches/pypoetry/virtualenvs/nbki-reporter-cIhFgnC6-py3.10/lib/python3.10/site-packages (from twisted->rdpy) (20.2.0)
    Requirement already satisfied: cffi>=1.12 in /Users/etomarat/Library/Caches/pypoetry/virtualenvs/nbki-reporter-cIhFgnC6-py3.10/lib/python3.10/site-packages (from cryptography>=35.0->pyopenssl->rdpy) (1.15.1)
    Requirement already satisfied: idna>=2.5 in /Users/etomarat/Library/Caches/pypoetry/virtualenvs/nbki-reporter-cIhFgnC6-py3.10/lib/python3.10/site-packages (from hyperlink>=17.1.1->twisted->rdpy) (3.4)
    Requirement already satisfied: setuptools in /Users/etomarat/Library/Caches/pypoetry/virtualenvs/nbki-reporter-cIhFgnC6-py3.10/lib/python3.10/site-packages (from zope.interface>=4.4.2->twisted->rdpy) (65.3.0)
    Requirement already satisfied: pycparser in /Users/etomarat/Library/Caches/pypoetry/virtualenvs/nbki-reporter-cIhFgnC6-py3.10/lib/python3.10/site-packages (from cffi>=1.12->cryptography>=35.0->pyopenssl->rdpy) (2.21)
    Building wheels for collected packages: rdpy
      Building wheel for rdpy (setup.py) ... error
      error: subprocess-exited-with-error
    
      × python setup.py bdist_wheel did not run successfully.
      │ exit code: 1
      ╰─> [69 lines of output]
          running bdist_wheel
          running build
          running build_py
          creating build
          creating build/lib.macosx-12-arm64-cpython-310
          creating build/lib.macosx-12-arm64-cpython-310/rdpy
          copying rdpy/__init__.py -> build/lib.macosx-12-arm64-cpython-310/rdpy
          creating build/lib.macosx-12-arm64-cpython-310/rdpy/core
          copying rdpy/core/rss.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/core
          copying rdpy/core/error.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/core
          copying rdpy/core/log.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/core
          copying rdpy/core/scancode.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/core
          copying rdpy/core/__init__.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/core
          copying rdpy/core/type.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/core
          copying rdpy/core/filetimes.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/core
          copying rdpy/core/layer.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/core
          copying rdpy/core/const.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/core
          creating build/lib.macosx-12-arm64-cpython-310/rdpy/security
          copying rdpy/security/rsa_wrapper.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/security
          copying rdpy/security/pyDes.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/security
          copying rdpy/security/x509.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/security
          copying rdpy/security/__init__.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/security
          copying rdpy/security/rc4.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/security
          creating build/lib.macosx-12-arm64-cpython-310/rdpy/protocol
          copying rdpy/protocol/__init__.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol
          creating build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp
          copying rdpy/protocol/rdp/lic.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp
          copying rdpy/protocol/rdp/__init__.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp
          copying rdpy/protocol/rdp/tpkt.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp
          copying rdpy/protocol/rdp/sec.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp
          copying rdpy/protocol/rdp/rdp.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp
          copying rdpy/protocol/rdp/x224.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp
          creating build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp/pdu
          copying rdpy/protocol/rdp/pdu/order.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp/pdu
          copying rdpy/protocol/rdp/pdu/__init__.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp/pdu
          copying rdpy/protocol/rdp/pdu/layer.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp/pdu
          copying rdpy/protocol/rdp/pdu/data.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp/pdu
          copying rdpy/protocol/rdp/pdu/caps.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp/pdu
          creating build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp/nla
          copying rdpy/protocol/rdp/nla/ntlm.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp/nla
          copying rdpy/protocol/rdp/nla/cssp.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp/nla
          copying rdpy/protocol/rdp/nla/__init__.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp/nla
          copying rdpy/protocol/rdp/nla/sspi.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp/nla
          creating build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp/t125
          copying rdpy/protocol/rdp/t125/__init__.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp/t125
          copying rdpy/protocol/rdp/t125/mcs.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp/t125
          copying rdpy/protocol/rdp/t125/ber.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp/t125
          copying rdpy/protocol/rdp/t125/gcc.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp/t125
          copying rdpy/protocol/rdp/t125/per.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp/t125
          creating build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rfb
          copying rdpy/protocol/rfb/__init__.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rfb
          copying rdpy/protocol/rfb/rfb.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rfb
          creating build/lib.macosx-12-arm64-cpython-310/rdpy/ui
          copying rdpy/ui/qt4.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/ui
          copying rdpy/ui/__init__.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/ui
          copying rdpy/ui/view.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/ui
          running build_ext
          building 'rle' extension
          creating build/temp.macosx-12-arm64-cpython-310
          creating build/temp.macosx-12-arm64-cpython-310/ext
          clang -Wno-unused-result -Wsign-compare -Wunreachable-code -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX12.sdk -I/Users/etomarat/Library/Caches/pypoetry/virtualenvs/nbki-reporter-cIhFgnC6-py3.10/include -I/opt/homebrew/opt/[email protected]/Frameworks/Python.framework/Versions/3.10/include/python3.10 -c ext/rle.c -o build/temp.macosx-12-arm64-cpython-310/ext/rle.o
          ext/rle.c:945:13: error: implicit declaration of function 'Py_InitModule' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
               (void) Py_InitModule("rle", rle_methods);
                      ^
          ext/rle.c:946:1: warning: non-void function does not return a value [-Wreturn-type]
          }
          ^
          1 warning and 1 error generated.
          error: command '/usr/bin/clang' failed with exit code 1
          [end of output]
    
      note: This error originates from a subprocess, and is likely not a problem with pip.
      ERROR: Failed building wheel for rdpy
      Running setup.py clean for rdpy
    Failed to build rdpy
    Installing collected packages: rdpy
      Running setup.py install for rdpy ... error
      error: subprocess-exited-with-error
    
      × Running setup.py install for rdpy did not run successfully.
      │ exit code: 1
      ╰─> [71 lines of output]
          running install
          /Users/etomarat/Library/Caches/pypoetry/virtualenvs/nbki-reporter-cIhFgnC6-py3.10/lib/python3.10/site-packages/setuptools/command/install.py:34: SetuptoolsDeprecationWarning: setup.py install is deprecated. Use build and pip and other standards-based tools.
            warnings.warn(
          running build
          running build_py
          creating build
          creating build/lib.macosx-12-arm64-cpython-310
          creating build/lib.macosx-12-arm64-cpython-310/rdpy
          copying rdpy/__init__.py -> build/lib.macosx-12-arm64-cpython-310/rdpy
          creating build/lib.macosx-12-arm64-cpython-310/rdpy/core
          copying rdpy/core/rss.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/core
          copying rdpy/core/error.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/core
          copying rdpy/core/log.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/core
          copying rdpy/core/scancode.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/core
          copying rdpy/core/__init__.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/core
          copying rdpy/core/type.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/core
          copying rdpy/core/filetimes.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/core
          copying rdpy/core/layer.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/core
          copying rdpy/core/const.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/core
          creating build/lib.macosx-12-arm64-cpython-310/rdpy/security
          copying rdpy/security/rsa_wrapper.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/security
          copying rdpy/security/pyDes.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/security
          copying rdpy/security/x509.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/security
          copying rdpy/security/__init__.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/security
          copying rdpy/security/rc4.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/security
          creating build/lib.macosx-12-arm64-cpython-310/rdpy/protocol
          copying rdpy/protocol/__init__.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol
          creating build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp
          copying rdpy/protocol/rdp/lic.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp
          copying rdpy/protocol/rdp/__init__.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp
          copying rdpy/protocol/rdp/tpkt.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp
          copying rdpy/protocol/rdp/sec.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp
          copying rdpy/protocol/rdp/rdp.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp
          copying rdpy/protocol/rdp/x224.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp
          creating build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp/pdu
          copying rdpy/protocol/rdp/pdu/order.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp/pdu
          copying rdpy/protocol/rdp/pdu/__init__.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp/pdu
          copying rdpy/protocol/rdp/pdu/layer.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp/pdu
          copying rdpy/protocol/rdp/pdu/data.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp/pdu
          copying rdpy/protocol/rdp/pdu/caps.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp/pdu
          creating build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp/nla
          copying rdpy/protocol/rdp/nla/ntlm.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp/nla
          copying rdpy/protocol/rdp/nla/cssp.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp/nla
          copying rdpy/protocol/rdp/nla/__init__.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp/nla
          copying rdpy/protocol/rdp/nla/sspi.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp/nla
          creating build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp/t125
          copying rdpy/protocol/rdp/t125/__init__.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp/t125
          copying rdpy/protocol/rdp/t125/mcs.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp/t125
          copying rdpy/protocol/rdp/t125/ber.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp/t125
          copying rdpy/protocol/rdp/t125/gcc.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp/t125
          copying rdpy/protocol/rdp/t125/per.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rdp/t125
          creating build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rfb
          copying rdpy/protocol/rfb/__init__.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rfb
          copying rdpy/protocol/rfb/rfb.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/protocol/rfb
          creating build/lib.macosx-12-arm64-cpython-310/rdpy/ui
          copying rdpy/ui/qt4.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/ui
          copying rdpy/ui/__init__.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/ui
          copying rdpy/ui/view.py -> build/lib.macosx-12-arm64-cpython-310/rdpy/ui
          running build_ext
          building 'rle' extension
          creating build/temp.macosx-12-arm64-cpython-310
          creating build/temp.macosx-12-arm64-cpython-310/ext
          clang -Wno-unused-result -Wsign-compare -Wunreachable-code -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX12.sdk -I/Users/etomarat/Library/Caches/pypoetry/virtualenvs/nbki-reporter-cIhFgnC6-py3.10/include -I/opt/homebrew/opt/[email protected]/Frameworks/Python.framework/Versions/3.10/include/python3.10 -c ext/rle.c -o build/temp.macosx-12-arm64-cpython-310/ext/rle.o
          ext/rle.c:945:13: error: implicit declaration of function 'Py_InitModule' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
               (void) Py_InitModule("rle", rle_methods);
                      ^
          ext/rle.c:946:1: warning: non-void function does not return a value [-Wreturn-type]
          }
          ^
          1 warning and 1 error generated.
          error: command '/usr/bin/clang' failed with exit code 1
          [end of output]
    
      note: This error originates from a subprocess, and is likely not a problem with pip.
    error: legacy-install-failure
    
    × Encountered error while trying to install package.
    ╰─> rdpy
    
    note: This is an issue with the package mentioned above, not pip.
    hint: See above for output from the failure.
    

    Can you suggest how to solve the problem? PS: I want to use rdpy only as a protocol library

    opened by etomarat 6
  • ImportError: No module named rdpy.core

    ImportError: No module named rdpy.core

    python2 rdpy-rdphoneypot.py

    Traceback (most recent call last): File "rdpy-rdphoneypot.py", line 27, in from rdpy.core import log, error, rss ImportError: No module named rdpy.core

    errrrr even in python2

    opened by techstartupexplorer 1
  • 【Chinese garbled code】

    【Chinese garbled code】

    The following code is the content of rdpy-rdphp.py I slightly modified the output format of rdpy

            domain, username, password = self._controller.getCredentials()
            hostname = self._controller.getHostname()
            print("username::::", username,type(username))
            print('{"type":2,"time":"%s","domain":"%s","addr":"%s:%s","username":"%s","password":"%s","hostname":"%s"}'%(datetime.datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%S.%fZ"), domain, addr.host, addr.port,username, password, hostname))
            # self.start()
            self._controller.close()
    

    For example, when the input user name is Chinese "憨憨", there will be garbled code 图片

    opened by ctccaozhe 0
  • error: package directory 'rdpy/core' does not exist

    error: package directory 'rdpy/core' does not exist

    (honey) root@ubuntu:~# python rdpy/setup.py install running install running bdist_egg running egg_info creating rdpy.egg-info writing rdpy.egg-info/PKG-INFO writing dependency_links to rdpy.egg-info/dependency_links.txt writing requirements to rdpy.egg-info/requires.txt writing top-level names to rdpy.egg-info/top_level.txt writing manifest file 'rdpy.egg-info/SOURCES.txt' package init file 'rdpy/init.py' not found (or not a regular file) error: package directory 'rdpy/core' does not exist

    opened by innxrmxst 0
  • ERROR: Package 'rsa' requires a different Python: 2.7.18 not in '>=3.5, <4'

    ERROR: Package 'rsa' requires a different Python: 2.7.18 not in '>=3.5, <4'

    Command: pip install twisted pyopenssl qt4reactor service_identity rsa pyasn1 --force

    Output: Collecting rsa Using cached rsa-4.7.1.tar.gz (38 kB) ERROR: Package 'rsa' requires a different Python: 2.7.18 not in '>=3.5, <4'

    opened by innxrmxst 1
Owner
Sylvain Peyrefitte
Sylvain Peyrefitte
Nagios status monitor for your desktop.

Nagstamon Nagstamon is a status monitor for the desktop. It connects to multiple Nagios, Icinga, Opsview, Centreon, Op5 Monitor/Ninja, Checkmk Multisi

Henri Wahl 361 Jan 5, 2023
Lima is an alternative to using Docker Desktop on your Mac.

lima-xbar-plugin Table of Contents Description Installation Dependencies Lima is an alternative to using Docker Desktop on your Mac. Description This

Joe Block 68 Dec 22, 2022
Simple ssh overlay for easy, remote server management written in Python GTK with paramiko

Simple "ssh" overlay for easy, remote server management written in Python GTK with paramiko

kłapouch 3 May 1, 2022
Simple, Pythonic remote execution and deployment.

Welcome to Fabric! Fabric is a high level Python (2.7, 3.4+) library designed to execute shell commands remotely over SSH, yielding useful Python obje

Fabric 13.8k Jan 6, 2023
SSH tunnels to remote server.

Author: Pahaz Repo: https://github.com/pahaz/sshtunnel/ Inspired by https://github.com/jmagnusson/bgtunnel, which doesn't work on Windows. See also: h

Pavel White 1k Dec 28, 2022
Python IMDB Docker - A docker tutorial to containerize a python script.

Python_IMDB_Docker A docker tutorial to containerize a python script. Build the docker in the current directory: docker build -t python-imdb . Run the

Sarthak Babbar 1 Dec 30, 2021
Honcho: a python clone of Foreman. For managing Procfile-based applications.

___ ___ ___ ___ ___ ___ /\__\ /\ \ /\__\ /\ \ /\__\ /\

Nick Stenning 1.5k Jan 3, 2023
Cross-platform lib for process and system monitoring in Python

Home Install Documentation Download Forum Blog Funding What's new Summary psutil (process and system utilities) is a cross-platform library for retrie

Giampaolo Rodola 9k Jan 2, 2023
A Python library for the Docker Engine API

Docker SDK for Python A Python library for the Docker Engine API. It lets you do anything the docker command does, but from within Python apps – run c

Docker 6.1k Dec 31, 2022
Official Python client library for kubernetes

Kubernetes Python Client Python client for the kubernetes API. Installation From source: git clone --recursive https://github.com/kubernetes-client/py

Kubernetes Clients 5.4k Jan 2, 2023
Python job scheduling for humans.

schedule Python job scheduling for humans. Run Python functions (or any other callable) periodically using a friendly syntax. A simple to use API for

Dan Bader 10.4k Jan 2, 2023
A cron monitoring tool written in Python & Django

Healthchecks Healthchecks is a cron job monitoring service. It listens for HTTP requests and email messages ("pings") from your cron jobs and schedule

Healthchecks 5.8k Jan 2, 2023
Python utility function to communicate with a subprocess using iterables: for when data is too big to fit in memory and has to be streamed

iterable-subprocess Python utility function to communicate with a subprocess using iterables: for when data is too big to fit in memory and has to be

Department for International Trade 5 Jul 10, 2022
Linux, Jenkins, AWS, SRE, Prometheus, Docker, Python, Ansible, Git, Kubernetes, Terraform, OpenStack, SQL, NoSQL, Azure, GCP, DNS, Elastic, Network, Virtualization. DevOps Interview Questions

Linux, Jenkins, AWS, SRE, Prometheus, Docker, Python, Ansible, Git, Kubernetes, Terraform, OpenStack, SQL, NoSQL, Azure, GCP, DNS, Elastic, Network, Virtualization. DevOps Interview Questions

Arie Bregman 35.1k Jan 2, 2023
Push Container Image To Docker Registry In Python

push-container-image-to-docker-registry 概要 push-container-image-to-docker-registry は、エッジコンピューティング環境において、特定のエッジ端末上の Private Docker Registry に特定のコンテナイメー

Latona, Inc. 3 Nov 4, 2021
Get Response Of Container Deployment Kube with python

get-response-of-container-deployment-kube 概要 get-response-of-container-deployment-kube は、例えばエッジコンピューティング環境のコンテナデプロイメントシステムにおいて、デプロイ元の端末がデプロイ先のコンテナデプロイ

Latona, Inc. 3 Nov 5, 2021
Containerize a python web application

containerize a python web application introduction this document is part of GDSC at the university of bahrain you don't need to follow along, fell fre

abdullah mosibah 1 Oct 19, 2021
A simple python application for running a CI pipeline locally This app currently supports GitLab CI scripts

?? Simple Local CI Runner ?? A simple python application for running a CI pipeline locally This app currently supports GitLab CI scripts ⚙️ Setup Inst

Tom Stowe 0 Jan 11, 2022