2

I am currently building a tool using flask that does various actions using ssh. One of those actions is using DD to copy from X to Y.

I currently have the following javascript set up on my page

    <script>
      var source == new EventSource("/dd");
      source.onmessage = function(event){
        $('.determinate'.css('width', event.data+'%')
        if(event.data == 100){
          source.close()
          }
        }

Which calls the following flask generator which parse's the stdout of DD to return a % value for the current progress.

@app.route('/dd')
def progress():
  def generate():
    ssh.SSHClient('127.0.0.1', username, password)
    chan =  ssh.get_transport().open_session()
    chan.settimeout(10800)
    try:
      ssh.do('dd if=/dev/sda of=/test.img')
      while data:
        data = chan.recv_stderr(1024)
          try:
            yield "data: " + str(data) + "\n\n\"

  return Response(generate(), mimetype='text/event-stream')

The above is pseudo code, but the things i want to be able to change are the DD command (dd if=/dev/sda of=/test/img) from variables i get from the form that triggers this page, as well as the hostname from the ssh.connect function with request.remote_addr.

When i try to replace '127.0.0.1' with request.remote_addr i get an out of context error.

Is there anyway to pass flask/jinja2 variables such as {{ image.path }} to my generator view?. The pseudo code i want would be this, where hostname, and dd is dynamic ( changes are in curly brackets )

@app.route('/dd')
def progress():
  def generate():
    ssh.SSHClient({{ request.remote_addr }}, username, password)
    chan =  ssh.get_transport().open_session()
    chan.settimeout(10800)
    try:
      ssh.do('dd if={{ device }} of={{ image.path }}')
      while data:
        data = chan.recv_stderr(1024)
          try:
            yield "data: " + str(data) + "\n\n\"

  return Response(generate(), mimetype='text/event-stream')

1 Answer 1

3

Just figured it out, didn't read the last paragraph of the docs.

If You want to keep the context of the previous request in the generator just change

return Response(generate(), mimetype='text/event-stream')

to

 return Response(stream_with_context(generatE()), mimetype='text/event-stream')

For passing data i just used the "session" object to pass data and then remove it when im done using it.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.