autolab / Autolab

Course management service that enables auto-graded programming assignments.
http://www.autolabproject.com/
Apache License 2.0
752 stars 214 forks source link

AFS Submit Script Broken #126

Closed metalogical closed 9 years ago

metalogical commented 9 years ago

The example script given (Autolab/script/autolabSubmit.sh) is broken. In particular, it seems that the unofficial.fish.ics.cs.cmu.edu URL can't see "new Autolab" courses and gives me ERROR: invalid course.

15-210 uses this for all labs, so getting a fix for this or a new URL that works would be nice.

dlbucci commented 9 years ago

The unofficial_submit is now a route for autolab, so I think the problem is that the example submit script needs to be rewritten, but I'm not 100% sure that everything else is working.

ymzong commented 9 years ago

We really want to fix the issue asap -- I see it bothering lots of students in 15-122 working on Windows... They should be able to run handin filea.c0 fileb.c0 on andrew, but now they need to:

robsimmons commented 9 years ago

The "handin" file is actually /afs/andrew.cmu.edu/course/15/122/bin/handin, which calls /afs/andrew.cmu.edu/course/15/122/bin/handin/autolabSubmit-master.sh, which follows the following protocol:

Queries: http://unofficial.fish.ics.cs.cmu.edu/officialSubmit.rb?course=15122-s15&user=rjsimmon&assessment=scavhunt Receives an AFS path in response Places the handin tarball (handinscavhunt.tgz) in that directory Queries: http://unofficial.fish.ics.cs.cmu.edu/officialSubmit.rb?course=15122-s15&user=rjsimmon&assessment=scavhunt&submit=handinscavhunt.tgz

I'm happy to hack my script, but I just don't know a lot of things, starting with what my source number is: "15122-s15" and "14" both give me "invalid course".

dlbucci commented 9 years ago

This can't be resolved until we fix our SSL setup: unofficial submit needs to use HTTP to get around the user needing HTTPS certificates, but our current Apache setup always forces HTTPS. We should be switching to Rails-enforced SSL instead of Apache, which will let Rails not force SSL for some routes. Then we can rewrite this script.

icanb commented 9 years ago

Hi @robsimmons, I'm working on fixing this as soon as possible. The unofficial route is working now, but the url is different. It's the part of the app now, so it can be reached through:

http://autolab.cs.cmu.edu/courses/{{COURSE_ID}}/assessments/{ASSESSMENT_ID}}/unofficial_submit?user={{USER_EMAIL}}&result={{anything}}

I'm not exactly sure about the expected behavior of officialSubmit and the code is pretty poorly documented at this point. Do you know of a way for me to debug this? I think I cleaned up the code but currently don't know of a way to test it. Any help and input would be great!

robsimmons commented 9 years ago

Is this pushed?

https://autolab.cs.cmu.edu/courses/14/assessments/49/unofficial_submit?user=robsimmons@gmail.com

gives me a DK

Error Information

--- !ruby/exception:SystemExit
message: exit

Stack Dump

/opt/autolab/build/Autolab/app/controllers/assessments_controller.rb:1196:in `exit'
/opt/autolab/build/Autolab/app/controllers/assessments_controller.rb:1196:in `unofficial_submit'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_controller/metal/implicit_render.rb:4:in `send_action'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/abstract_controller/base.rb:198:in `process_action'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_controller/metal/rendering.rb:10:in `process_action'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/abstract_controller/callbacks.rb:20:in `block in process_action'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:117:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:117:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:151:in `block in halting_and_conditional'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:234:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:234:in `block in halting'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:151:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:151:in `block in halting_and_conditional'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:169:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:169:in `block in halting'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:151:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:151:in `block in halting_and_conditional'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:169:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:169:in `block in halting'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:169:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:169:in `block in halting'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:151:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:151:in `block in halting_and_conditional'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:234:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:234:in `block in halting'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:169:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:169:in `block in halting'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:169:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:169:in `block in halting'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:92:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:92:in `_run_callbacks'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:734:in `_run_process_action_callbacks'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:81:in `run_callbacks'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/abstract_controller/callbacks.rb:19:in `process_action'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_controller/metal/rescue.rb:29:in `process_action'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_controller/metal/instrumentation.rb:31:in `block in process_action'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/notifications.rb:164:in `block in instrument'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/notifications.rb:164:in `instrument'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_controller/metal/instrumentation.rb:30:in `process_action'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_controller/metal/params_wrapper.rb:250:in `process_action'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activerecord-4.2.0/lib/active_record/railties/controller_runtime.rb:18:in `process_action'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/abstract_controller/base.rb:137:in `process'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionview-4.2.0/lib/action_view/rendering.rb:30:in `process'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_controller/metal.rb:195:in `dispatch'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_controller/metal/rack_delegation.rb:13:in `dispatch'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_controller/metal.rb:236:in `block in action'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_dispatch/routing/route_set.rb:73:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_dispatch/routing/route_set.rb:73:in `dispatch'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_dispatch/routing/route_set.rb:42:in `serve'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_dispatch/journey/router.rb:43:in `block in serve'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_dispatch/journey/router.rb:30:in `each'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_dispatch/journey/router.rb:30:in `serve'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_dispatch/routing/route_set.rb:802:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/omniauth-1.2.2/lib/omniauth/strategy.rb:186:in `call!'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/omniauth-1.2.2/lib/omniauth/strategy.rb:164:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/omniauth-1.2.2/lib/omniauth/strategy.rb:186:in `call!'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/omniauth-1.2.2/lib/omniauth/strategy.rb:164:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/omniauth-1.2.2/lib/omniauth/strategy.rb:186:in `call!'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/omniauth-1.2.2/lib/omniauth/strategy.rb:164:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/bundler/gems/exception_notification-f9dee5b5f6a1/lib/exception_notification/rack.rb:28:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rack-ssl-enforcer-0.2.8/lib/rack/ssl-enforcer.rb:52:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/warden-1.2.3/lib/warden/manager.rb:35:in `block in call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/warden-1.2.3/lib/warden/manager.rb:34:in `catch'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/warden-1.2.3/lib/warden/manager.rb:34:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rack-1.6.0/lib/rack/etag.rb:24:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rack-1.6.0/lib/rack/conditionalget.rb:25:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rack-1.6.0/lib/rack/head.rb:13:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_dispatch/middleware/params_parser.rb:27:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_dispatch/middleware/flash.rb:260:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rack-1.6.0/lib/rack/session/abstract/id.rb:225:in `context'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rack-1.6.0/lib/rack/session/abstract/id.rb:220:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_dispatch/middleware/cookies.rb:560:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activerecord-4.2.0/lib/active_record/query_cache.rb:36:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activerecord-4.2.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:647:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_dispatch/middleware/callbacks.rb:29:in `block in call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:88:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:88:in `_run_callbacks'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:734:in `_run_call_callbacks'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:81:in `run_callbacks'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_dispatch/middleware/callbacks.rb:27:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_dispatch/middleware/remote_ip.rb:78:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_dispatch/middleware/debug_exceptions.rb:17:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/railties-4.2.0/lib/rails/rack/logger.rb:38:in `call_app'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/railties-4.2.0/lib/rails/rack/logger.rb:20:in `block in call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/tagged_logging.rb:68:in `block in tagged'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/tagged_logging.rb:26:in `tagged'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/tagged_logging.rb:68:in `tagged'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/railties-4.2.0/lib/rails/rack/logger.rb:20:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_dispatch/middleware/request_id.rb:21:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rack-1.6.0/lib/rack/methodoverride.rb:22:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rack-1.6.0/lib/rack/runtime.rb:18:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/cache/strategy/local_cache_middleware.rb:28:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rack-1.6.0/lib/rack/sendfile.rb:113:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/railties-4.2.0/lib/rails/engine.rb:518:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/railties-4.2.0/lib/rails/application.rb:164:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/railties-4.2.0/lib/rails/railtie.rb:194:in `public_send'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/railties-4.2.0/lib/rails/railtie.rb:194:in `method_missing'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/passenger-4.0.57/lib/phusion_passenger/rack/thread_handler_extension.rb:74:in `process_request'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/passenger-4.0.57/lib/phusion_passenger/request_handler/thread_handler.rb:141:in `accept_and_process_next_request'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/passenger-4.0.57/lib/phusion_passenger/request_handler/thread_handler.rb:109:in `main_loop'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/passenger-4.0.57/lib/phusion_passenger/request_handler.rb:455:in `block (3 levels) in start_threads'
jez commented 9 years ago

@robsimmons Nope, we wanted to test it first. The pull request is still open: #163

robsimmons commented 9 years ago

More complete testing suggestion, though it's relative to prod because that's all I see. Is milkshark dev, or is it an exact alias of autolab.cs? If you're an account that's registered for 122:

https://autolab.cs.cmu.edu/courses/14/assessments/49/unofficial_submit?user=${{YOUR_EMAIL}} This should give you an AFS address. wget the tarball http://www.cs.cmu.edu/~rjsimmon/15122-s15/prog/pixels-handout.tgz into that AFS directory, then call https://autolab.cs.cmu.edu/courses/14/assessments/49/unofficial_submit?user=${{YOUR_EMAIL}}&submit=pixels-handout.tgz

and you should probably end up with one point.

robsimmons commented 9 years ago

Also I can work on this in my office on this from like 12:30 to 1:30 if that would be useful and if anyone wants to drop by then.

icanb commented 9 years ago

Thanks @robsimmons!

Firstly, to prevent future confusion, official_submit and unofficial_submit are different things. We use unofficial_submit for logging things for 213's bomblab and buflab. You need to use official_submit for the procedure you defined. (This actaully is terrible naming, so we should make it better. Any suggestions on what we should call this route?)

I fixed the error codes and checked out to that branch on production. So you can see it now. If you go to: https://autolab.cs.cmu.edu/courses/14/assessments/49/official_submit?user=robsimmons@gmail.com, you will get a handin directory.

I also needed to make some changes to the directory structure since we're trying to get rid of the Andrew dependencies. Currently it looks like this: 15122-s15/scavhunt/handin/robsimmons@gmail.com_remote_handin

Is this fine with you? I'm open to suggestions here too.

I'm working on the &submit= part now. It might take a little longer to fix and test. I was wondering if that request is a GET or POST. I believe that POST request would be more appropriate for the second one.

dlbucci commented 9 years ago

If you're doing a file upload on the submit call, it will need to be POST, but the first call can be a GET.

What if the routes were 'command_line_submit' and 'logger_submit'?

robsimmons commented 9 years ago

My shell script just wgets urls, so GET is waaaayyy easier.

Am I correct in understanding that there's actually some secretly-AFS-prefix I need to attach to the beginning of 15122-s15/scavhunt/handin/robsimmons@gmail.com_remote_handin in order to have the correct file path?

I think of "official_submit" as a "local" submission process - for when the user happens to have filesystem-local access to the autolab server - so I was going suggest "local_submit" myself.

metalogical commented 9 years ago

Thanks Daniel! If I'm understanding things correctly, students need permissions to dump files in the Autolab handin directory?

robsimmons commented 9 years ago

Oh, and to be clear: can you tell me what the secretly-AFS-prefix is because I don't know it :-)

icanb commented 9 years ago

"Places the handin tarball (handinscavhunt.tgz) in that directory"

So you actually cp the file yourself and just tell us the name of the file, right? In that case, GET request would actually be fine.

And yes, 15122-s15 is located in /afs/cs/academic/autolab/autolab2/courses just like all the other course material.

dlbucci commented 9 years ago

I'll just say that it's bad practice for HTTP GET requests to alter state. GET and HEAD are only meant for information retrieval. That said, if it's really that much of a pain and we're not uploading any files, GET is doable.

jez commented 9 years ago

POSTing a file with curl isn't actually too complicated:

curl -X POST -d @<filename> http://...

I don't know what the scripts that use our route look like or how intricate their wget calls are, but a simple Google search returns this StackOverflow post explaining the same thing, so it shouldn't be too big of a required change.

metalogical commented 9 years ago

One concern - are there security precautions in place to prevent a user from submitting as someone else?

On Thu, Jan 22, 2015, 12:54 PM Jake Zimmerman notifications@github.com wrote:

POSTing a file with curl isn't actually too complicated:

curl -X POST -d @ http://...

I don't know what the scripts that use our route look like or how intricate their wget calls are, but a simple Google search returns this StackOverflow post http://stackoverflow.com/questions/3007253/send-post-xml-file-using-curl-command-line explaining the same thing.

— Reply to this email directly or view it on GitHub https://github.com/autolab/Autolab/issues/126#issuecomment-71065480.

robsimmons commented 9 years ago

I'll give it a try if you want to do the correct thing and make one of both of the protocol things a POST request. (Would you say the first request creates state by creating a directory?)

I think I understand the fragment of the script that 122 is using pretty well if you can explain the actions that it is supposed to take.

robsimmons commented 9 years ago

I currently see

$ fs listacl /afs/cs/academic/autolab/autolab2/courses/15122-s15/scavhunt/handin/rjsimmon@andrew.cmu.edu_remote_handin
fs: File '/afs/cs/academic/autolab/autolab2/courses/15122-s15/scavhunt/handin/rjsimmon@andrew.cmu.edu_remote_handin' doesn't exist

even after I visit https://autolab.cs.cmu.edu/courses/14/assessments/49/official_submit?user=rjsimmon@andrew.cmu.edu

robsimmons commented 9 years ago

@namanbharadwaj In theory the old directories could be access-locked to the individual who had the right to handin, since there username was the same, though I have no idea whether this, or security-via-obscurity-and-the-absense-of-race-conditions was the order of the day.

It would certainly make sense to limit this to andrew.cmu.edu email addresses and lock writes to the andrew id... probably the new system shouldn't be less secure than the old system if that used to be the protocol.

dlbucci commented 9 years ago

@namanbharadwaj That's what I've been concerned about, but I don't think it will be any less secure than before, if that's saying anything. I think @robsimmons makes a good point that this should be CMU-specific until we can think of a less hacky solution.

icanb commented 9 years ago

I actually see the directory:

fs listacl /afs/cs/academic/autolab/autolab2/courses/15122-s15/scavhunt/handin/rjsimmon@andrew.cmu.edu_remote_handin Access list for /afs/cs/academic/autolab/autolab2/courses/15122-s15/scavhunt/handin/rjsimmon@andrew.cmu.edu_remote_handin is Normal rights: academic:write.15122 rlidwk academic:admin.15122 rlidwka academic:admin.autolab rlidwka academic.autolab rlidwka rjsimmon@andrew.cmu.edu rlidw

jez commented 9 years ago

This might not be the best short term solution, but I see Git-based submissions where users can upload public keys (similar to GitHub) as being a viable long-term option for all command line submissions, CMU or otherwise.

robsimmons commented 9 years ago

Hmm... what are the file permissions for parent?

[rjsimmon@unix3 ~]$ fs listacl /afs/cs/academic/
Access list for /afs/cs/academic/ is
Normal rights:
  system:administrators rlidwka
  system:friendlyhost rl
  system:campushost rl
  system:anyuser l
[rjsimmon@unix3 ~]$ fs listacl /afs/cs/academic/autolab/
fs: You don't have the required access rights on '/afs/cs/academic/autolab/'
[rjsimmon@unix3 ~]$ fs listacl /afs/cs/academic/autolab/autolab2/
fs: File '/afs/cs/academic/autolab/autolab2/' doesn't exist
[rjsimmon@unix3 ~]$ fs listacl /afs/cs/academic/autolab/autolab2/courses/
fs: File '/afs/cs/academic/autolab/autolab2/courses/' doesn't exist
[rjsimmon@unix3 ~]$ fs listacl /afs/cs/academic/autolab/autolab2/courses/15122-s15/
fs: File '/afs/cs/academic/autolab/autolab2/courses/15122-s15/' doesn't exist
icanb commented 9 years ago

That's interesting. I'd expect you to have permissions for '/afs/cs/academic/autolab/autolab2/courses/15122-s15/' since you've been uploading the assignments etc. there.

Are you on a school computer? Did you try doing aklog cs.cmu.edu? It seems like the system doesn't recognize you.

icanb commented 9 years ago

Just pushed more changes. (We're getting there!)

The route is local_submit now. https://autolab.cs.cmu.edu/courses/14/assessments/49/local_submit?user=robsimmons@gmail.com

The second request with &submit= should work now and it still accepts GET requests. (I'll change this to POST soon)

robsimmons commented 9 years ago

On andrew, I get the same response after aklog cs.cmu.edu

On gp.cs.cmu.edu I get a little further:

linux6:~/c> fs listacl /afs/cs/academic/
Access list for /afs/cs/academic/ is
Normal rights:
  system:administrators rlidwka
  system:friendlyhost rl
  system:campushost rl
  system:anyuser l
linux6:~/c> fs listacl /afs/cs/academic/autolab/
Access list for /afs/cs/academic/autolab/ is
Normal rights:
  academic:developer.autolab rl
  academic:admin.autolab rlidwka
  system:administrators rlidwka
  system:friendlyhost l
  academic.autolab rlidwka
linux6:~/c> fs listacl /afs/cs/academic/autolab/autolab2/
Access list for /afs/cs/academic/autolab/autolab2/ is
Normal rights:
  academic:admin.autolab rlidwka
  system:administrators rlidwka
  system:friendlyhost l
  academic.autolab rlidwka
linux6:~/c> fs listacl /afs/cs/academic/autolab/autolab2/cou
courseConfig  courses/      
linux6:~/c> fs listacl /afs/cs/academic/autolab/autolab2/courses
fs: You don't have the required access rights on '/afs/cs/academic/autolab/autolab2/courses'
linux6:~/c> fs listacl /afs/cs/academic/autolab/autolab2/courses/15122-s15
fs: File '/afs/cs/academic/autolab/autolab2/courses/15122-s15' doesn't exist

I can access /afs/cs.cmu.edu/academic/class/15122-s15/autolab just fine, and that's where I perceive my autolab instance to be - my view is different from the dev view. My student's can't access that directory, of course: I think there was some alternate path they must have accessed in the past.

Going to the still working http://unofficial.fish.ics.cs.cmu.edu/officialSubmit.rb?course=15122-f14&user=rjsimmon&assessment=scavhunt

I see a hopeful candidate: /afs/andrew.cmu.edu/scs/cs/autolabEmail/handin/rjsimmon_scavhunt/

icanb commented 9 years ago

Oh I see.

/afs/cs.cmu.edu/academic/class/15122-s15/autolab/scavhunt/handin/robsimmons@gmail.com_remote_handin should work then.

So I guess I should start returning scavhunt/handin/robsimmons@gmail.com_remote_handin, instead of 15122-s15/scavhunt/handin/robsimmons@gmail.com_remote_handin.

robsimmons commented 9 years ago

Well, maybe? As it currently stands, my students won't be able to access that directory: the directory used by the old script was in the andrew domain.

icanb commented 9 years ago

In the old system, the directory used to be: "/afs/andrew.cmu.edu/scs/cs/autolabEmail/handin/" + users's email

How did you prevent users from seeing each others' submissions?

icanb commented 9 years ago

I have two suggestions:

1) You can define your own directory, and tell it to Autolab inside your request. The old url is pretty much hardcoded anyways, so we might as well hard-code it in handin script and keep our codebase clean. On submit request, Autolab would try to grab the file from the directory you've added as the parameter. e.g.: https://autolab.cs.cmu.edu/courses/14/assessments/49/local_submit?user=robsimmons@gmail.com&submit=scav.c&directory=/afs/andrew.cmu.edu/scs/cs/autolabEmail/handin/username/"

2) You can cUrl the file with a POST request and Autolab can read the file and write to the appropriate directory.

robsimmons commented 9 years ago

Apparently Autolab automagically handled the permissions, which your suggestion wouldn't allow. Your solution also has the problem of being unable to ensure Autolab has access to the appropriate directory.

[rjsimmon@unix1 rjsimmon_strbuf]$ pwd
/afs/andrew.cmu.edu/scs/cs/autolabEmail/handin/rjsimmon_strbuf
[rjsimmon@unix1 rjsimmon_strbuf]$ fs listacl .
Access list for . is
Normal rights:
  droh:admin.autolab rlidwka
  postman:dlist rl
  system:anyuser l
  rjsimmon rlidw
  academic.autolab@cs.cmu.edu rlidwka
[rjsimmon@unix1 rjsimmon_strbuf]$ cd ..
[rjsimmon@unix1 handin]$ fs listacl .
Access list for . is
Normal rights:
  droh:admin.autolab rlidwka
  postman:dlist rl
  system:anyuser l
  98409 rlidwka
  academic.autolab@cs.cmu.edu rlidwka
robsimmons commented 9 years ago

Also, option 2 is terrifying because none of these HTTP requests include any authentication. So option 2 is much less secure than whatever the old system did, which was apparently a reasonably secure thing!

robsimmons commented 9 years ago

By the way: if this is the way it has to be for now, I think I can make do with this as it stands by making the script do the right funky AFS cross-domain registration stuff.

I just have to give students "l" AFS permisison to a lot of stuff that I'd really like them to not have any access to.

metalogical commented 9 years ago

Students shouldn't need "l" rights on a parent directory in order to write to a subdirectory to which they have permissions, if that's the concern here.

On Thu, Jan 22, 2015, 2:26 PM Robert J. Simmons notifications@github.com wrote:

By the way: if this is the way it has to be for now, I think I can make do with this as it stands by making the script do the right funky AFS cross-domain registration stuff.

I just have to give students "l" AFS permisison to a lot of stuff that I'd really like them to not have any access to.

— Reply to this email directly or view it on GitHub https://github.com/autolab/Autolab/issues/126#issuecomment-71081979.

robsimmons commented 9 years ago

I didn't think that was true, @namanbharadwaj. If I take rjsimmon@andrew.cmu.edu off of academic:admin.15122 I can't access that directory anymore

[rjsimmon@unix2 ~]$ whoami
rjsimmon
[rjsimmon@unix2 ~]$ hostname
unix2.andrew.cmu.edu
[rjsimmon@unix2 ~]$ aklog cs.cmu.edu
[rjsimmon@unix2 ~]$ cd /afs/cs.cmu.edu/academic/class/15122-s15/autolab/scavhunt/handin/rjsimmon@andrew.cmu.edu_remote_handin
/afs/cs.cmu.edu/academic/class/15122-s15/autolab/scavhunt/handin/rjsimmon@andrew.cmu.edu_remote_handin: Permission denied.
[rjsimmon@unix2 ~]$ mv a.c /afs/cs.cmu.edu/academic/class/15122-s15/autolab/scavhunt/handin/rjsimmon@andrew.cmu.edu_remote_handin
mv: accessing `/afs/cs.cmu.edu/academic/class/15122-s15/autolab/scavhunt/handin/rjsimmon@andrew.cmu.edu_remote_handin': Permission denied
robsimmons commented 9 years ago

(off topic) ...all my email addresses are going to be harvested off of this issue thread for the rest of time...

robsimmons commented 9 years ago

Okay, so some things.

Giving myself enough AFS permission that I can actually access the relevant directory again, I managed to play the game successfully by hand. Yay! I could turn this into a submit script:

bash-4.1$ LOCATION=`curl -k 'https://autolab.cs.cmu.edu/courses/14/assessments/49/local_submit?user=rjsimmon@andrew.cmu.edu'`
bash-4.1$ echo $LOCATION
scavhunt/handin/rjsimmon@andrew.cmu.edu_remote_handin
bash-4.1$ cp ~/private/s15/prog/scavhunt/handin.tgz /afs/cs/academic/class/15122-s15/autolab/$LOCATION
bash-4.1$ RESPONSE=`curl -k -F submit=handin.tgz 'https://autolab.cs.cmu.edu/courses/14/assessments/49/local_submit?user=rjsimmon@andrew.cmu.edu'`
bash-4.1$ echo $RESPONSE
Successfully submitted

But it didn't grade on autolab (and is incidentally ugly): untitled-1

And going to "regrade" DKs:

Error Information

--- !ruby/exception:Errno::ENOENT
message: No such file or directory @ rb_sysopen - /opt/autolab/build/Autolab/courses/15122-s15/scavhunt/handin/opt/autolab/build/Autolab/courses/15122-s15/scavhunt/handin/rjsimmon@andrew.cmu.edu_remote_handin/handin.tgz

Stack Dump

/var/www/.rbenv/versions/2.2.0/lib/ruby/2.2.0/digest.rb:49:in `initialize'
/var/www/.rbenv/versions/2.2.0/lib/ruby/2.2.0/digest.rb:49:in `open'
/var/www/.rbenv/versions/2.2.0/lib/ruby/2.2.0/digest.rb:49:in `file'
/var/www/.rbenv/versions/2.2.0/lib/ruby/2.2.0/digest.rb:34:in `file'
/opt/autolab/build/Autolab/app/controllers/assessment/autograde.rb:81:in `block in createVm'
/opt/autolab/build/Autolab/app/controllers/assessment/autograde.rb:80:in `each'
/opt/autolab/build/Autolab/app/controllers/assessment/autograde.rb:80:in `createVm'
/opt/autolab/build/Autolab/app/controllers/submissions_controller.rb:187:in `regrade'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_controller/metal/implicit_render.rb:4:in `send_action'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/abstract_controller/base.rb:198:in `process_action'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_controller/metal/rendering.rb:10:in `process_action'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/abstract_controller/callbacks.rb:20:in `block in process_action'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:117:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:117:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:151:in `block in halting_and_conditional'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:234:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:234:in `block in halting'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:151:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:151:in `block in halting_and_conditional'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:169:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:169:in `block in halting'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:151:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:151:in `block in halting_and_conditional'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:169:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:169:in `block in halting'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:169:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:169:in `block in halting'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:151:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:151:in `block in halting_and_conditional'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:234:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:234:in `block in halting'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:169:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:169:in `block in halting'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:169:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:169:in `block in halting'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:92:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:92:in `_run_callbacks'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:734:in `_run_process_action_callbacks'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:81:in `run_callbacks'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/abstract_controller/callbacks.rb:19:in `process_action'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_controller/metal/rescue.rb:29:in `process_action'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_controller/metal/instrumentation.rb:31:in `block in process_action'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/notifications.rb:164:in `block in instrument'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/notifications.rb:164:in `instrument'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_controller/metal/instrumentation.rb:30:in `process_action'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_controller/metal/params_wrapper.rb:250:in `process_action'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activerecord-4.2.0/lib/active_record/railties/controller_runtime.rb:18:in `process_action'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/abstract_controller/base.rb:137:in `process'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionview-4.2.0/lib/action_view/rendering.rb:30:in `process'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_controller/metal.rb:195:in `dispatch'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_controller/metal/rack_delegation.rb:13:in `dispatch'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_controller/metal.rb:236:in `block in action'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_dispatch/routing/route_set.rb:73:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_dispatch/routing/route_set.rb:73:in `dispatch'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_dispatch/routing/route_set.rb:42:in `serve'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_dispatch/journey/router.rb:43:in `block in serve'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_dispatch/journey/router.rb:30:in `each'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_dispatch/journey/router.rb:30:in `serve'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_dispatch/routing/route_set.rb:802:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/omniauth-1.2.2/lib/omniauth/strategy.rb:186:in `call!'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/omniauth-1.2.2/lib/omniauth/strategy.rb:164:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/omniauth-1.2.2/lib/omniauth/strategy.rb:186:in `call!'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/omniauth-1.2.2/lib/omniauth/strategy.rb:164:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/omniauth-1.2.2/lib/omniauth/strategy.rb:186:in `call!'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/omniauth-1.2.2/lib/omniauth/strategy.rb:164:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/bundler/gems/exception_notification-f9dee5b5f6a1/lib/exception_notification/rack.rb:28:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rack-ssl-enforcer-0.2.8/lib/rack/ssl-enforcer.rb:52:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/warden-1.2.3/lib/warden/manager.rb:35:in `block in call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/warden-1.2.3/lib/warden/manager.rb:34:in `catch'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/warden-1.2.3/lib/warden/manager.rb:34:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rack-1.6.0/lib/rack/etag.rb:24:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rack-1.6.0/lib/rack/conditionalget.rb:25:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rack-1.6.0/lib/rack/head.rb:13:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_dispatch/middleware/params_parser.rb:27:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_dispatch/middleware/flash.rb:260:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rack-1.6.0/lib/rack/session/abstract/id.rb:225:in `context'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rack-1.6.0/lib/rack/session/abstract/id.rb:220:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_dispatch/middleware/cookies.rb:560:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activerecord-4.2.0/lib/active_record/query_cache.rb:36:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activerecord-4.2.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:647:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_dispatch/middleware/callbacks.rb:29:in `block in call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:88:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:88:in `_run_callbacks'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:734:in `_run_call_callbacks'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/callbacks.rb:81:in `run_callbacks'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_dispatch/middleware/callbacks.rb:27:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_dispatch/middleware/remote_ip.rb:78:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_dispatch/middleware/debug_exceptions.rb:17:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/railties-4.2.0/lib/rails/rack/logger.rb:38:in `call_app'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/railties-4.2.0/lib/rails/rack/logger.rb:20:in `block in call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/tagged_logging.rb:68:in `block in tagged'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/tagged_logging.rb:26:in `tagged'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/tagged_logging.rb:68:in `tagged'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/railties-4.2.0/lib/rails/rack/logger.rb:20:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/actionpack-4.2.0/lib/action_dispatch/middleware/request_id.rb:21:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rack-1.6.0/lib/rack/methodoverride.rb:22:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rack-1.6.0/lib/rack/runtime.rb:18:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/activesupport-4.2.0/lib/active_support/cache/strategy/local_cache_middleware.rb:28:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/rack-1.6.0/lib/rack/sendfile.rb:113:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/railties-4.2.0/lib/rails/engine.rb:518:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/railties-4.2.0/lib/rails/application.rb:164:in `call'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/railties-4.2.0/lib/rails/railtie.rb:194:in `public_send'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/railties-4.2.0/lib/rails/railtie.rb:194:in `method_missing'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/passenger-4.0.57/lib/phusion_passenger/rack/thread_handler_extension.rb:74:in `process_request'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/passenger-4.0.57/lib/phusion_passenger/request_handler/thread_handler.rb:141:in `accept_and_process_next_request'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/passenger-4.0.57/lib/phusion_passenger/request_handler/thread_handler.rb:109:in `main_loop'
/var/www/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/passenger-4.0.57/lib/phusion_passenger/request_handler.rb:455:in `block (3 levels) in start_threads'

This exposes another problem: the .tgz almost certainly need to be copied into the autolab handin directory as a regular submission, not left in the student-writable directory! (!!!!!!) Otherwise they will overwrite their handins the next time they submit, removing Autolab's (very useful to students, in a pinch) utility as a last-ditch version control system its utility (critical to me as an instructor) as a trustworthy and immutable recordkeeping of student submissions.

icanb commented 9 years ago

Hi @robsimmons, I've fixed the problem with the file name and location.

As for the permission, Autolab actually still automagically handles the afs permission. It gives the student rlidw permission to the director.

system("fs sa #{internalDir} #{@user.email} rlidw")

I also realized that adding aklog cs.cmu.edu to the script before cp'ing helps.

Can you test this and let me know? Everything seems to work for me.

robsimmons commented 9 years ago

I can see that I correctly have permission to

/afs/cs.cmu.edu/academic/class/15122-s15/autolab/pixels/handin/rjsimmon@andrew.cmu.edu_remote_handin

but I don't have "l" permission to the parent directories (which I really do think I need, @namanbharadwaj) so as long as I have taken rjsimmon@andrew.cmu.edu off of academic:admin.15122, I can't copy to that directory.

It seems to work if I add rjsimmon@andrew.cmu.edu back to academic:admin.15122, so we just need to figure out directory access and we're in business. Is there a barrier to having the handin directory be andrew-side and leaving the complicated cross-domain bits to Autolab?

icanb commented 9 years ago

I see. I just realized that it was working for me because I'm in autolab group... Sorry for that!

In this case what I'm planning to do is letting the instructor define that directory, so instead of hardcoding /afs/andrew.cmu.edu/scs/cs/autolabEmail/handin/ like we did before, it'll be a variable. I'm planning to get this in tonight. Thanks for your patience.

robsimmons commented 9 years ago

Okay - I can probably make that work, even if it's in the CS domain. Even better would be if the instructor-defined path could be in the andrew domain, but if that takes longer to get working then just do the cs thing.

icanb commented 9 years ago

So I created the variable and added as a setting. Under 'Edit Assessment > Handi', you'll see the Remote handin path field. I set it to /afs/andrew.cmu.edu/scs/cs/autolabEmail/handin/ for the scavhunt and it seems to work for me.

Note that you no longer need to add the prefix of /afs/cs/academic/class/15122-s15/autolab/ in the script.

robsimmons commented 9 years ago

Sounds good! Will that path be set as a default?

I'll poke at this in the morning.

icanb commented 9 years ago

It's not default, but we can do that if you'd like.

Also, I think you can get this to work on Andrew domain if you really don't want the CS domain. I just didn't know what path to use on andrew.

robsimmons commented 9 years ago

You currently have it working on the Andrew domain! /afs/andrew.cmu.edu/scs/cs/autolabEmail/handin is on Andrew :)

robsimmons commented 9 years ago

Thinking a bit more about paths: is what we want in general a course specific prefix followed by an (optional) assignment specific section? That way, the configuration you had before makes sense (course prefix: /afs/cs.cmu.edu/academic/class/15122-s15/autolab, assignment pixels/handin) and the configuration I'm asking for also makes sense (course prefix: /afs/andrew.cmu.edu/scs/cs/autolabEmail/handin, no assignment specific section).

icanb commented 9 years ago

Good point! I just pushed that change. The setting is still assessment based since I didn't want to move it to class settings, but the sub directory is called icanberk@andrew.cmu.edu_remote_handin_scavhunt so the handins for different assessments can not overwrite each other.

robsimmons commented 9 years ago

I can't imagine why this doesn't appropriately belong in class settings, but I guess you're the dev.

I think I can produce a working script with this, working on that now. Three requests:

1) can you figure out why we have to add the (terrible for security) -k option to curl at the moment?

$ curl 'https://autolab.cs.cmu.edu/courses/14/assessments/49/local_submit?user=rjsimmon@andrew.cmu.edu'
curl: (60) Peer certificate cannot be authenticated with known CA certificates
More details here: http://curl.haxx.se/docs/sslcerts.html

curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). If the default
 bundle file isn't adequate, you can specify an alternate file
 using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.

2) Is there a plan for adding pretty-course-names and assignment names? (15122-s15 instead of 14 and scavhunt instead of 49, or whatever)

3) Is there a plan for integrating your thing pretty course names and assignment names?