/**
  * Store a newly created resource in storage.
  *
  * @param  Request  $request
  * @return Response
  */
 public function store(Request $request)
 {
     $this->validate($request, ['time_limit' => 'required', 'memory_limit' => 'required', 'name' => 'required', 'description' => 'required', 'input' => 'required', 'output' => 'required', 'sampleIn' => 'required', 'sampleOut' => 'required', 'tags' => 'required', 'testIn' => 'required', 'testOut' => 'required']);
     $problem = new Problem();
     $problem->name = $request->input('name');
     $problem->description = $request->input('description');
     $problem->input = $request->input('input');
     $problem->output = $request->input('output');
     $problem->sample_input = $request->input('sampleIn');
     $problem->sample_output = $request->input('sampleOut');
     $problem->time_limit = $request->input('time_limit');
     $problem->memory_limit = $request->input('memory_limit');
     $problem->save();
     $problemFolder = public_path() . '/' . $problem->id;
     File::makeDirectory($problemFolder);
     File::put($problemFolder . '/sample.in', $problem->sample_input);
     File::put($problemFolder . '/sample.out', $problem->sample_output);
     $testIn = $request->file('testIn');
     $testIn->move($problemFolder, 'test.in');
     $testOut = $request->file('testOut');
     $testOut->move($problemFolder, 'test.out');
     /*
     $inputFiles = $problem->id;
     $inputFilesFolder = public_path() . '/' . $inputFiles;
     $outputFiles = $problem->id;
     $outputFilesFolder = public_path() . '/' . $outputFiles;
     
     $fileinput=$request->file('inputfile');
     $filenameInput='sample.in';
     $fileinput->move($inputFilesFolder, $filenameInput);
     File::put($inputFilesFolder.'/samplei.in','John DoeIN');
     $fileoutput=$request->file('outputfile');
     $filenameOut=time().'.'.$fileoutput->getClientOriginalExtension();
     $filenameOut='test.in';
     $fileoutput->move($outputFilesFolder, $filenameOut);
     File::put($outputFilesFolder.'/sampleo.out','John DoeOut');
     */
     foreach (explode(',', $request->input('tags2')) as $tag_id) {
         DB::table('problemhastags')->insert(['problem_id' => $problem->id, 'tag_id' => $tag_id]);
     }
     return redirect()->action('ProblemController@index');
 }
Beispiel #2
0
 function run()
 {
     $problem = new Problem();
     $problem->station_code = 'POCG  ';
     $problem->data_type = 'RAIN';
     $problem->problem_type = 'BD';
     $problem->start_datetime = date('Y-m-d 09:00');
     $problem->end_datetime = date('Y-m-d 10:10');
     $problem->num = 7;
     $problem->status = 'undefined';
     if (!$problem->save()) {
         Log::info('Unable to create problem ' . $problem->station_code, (array) $problem->errors());
     } else {
         Log::info('Created problem "' . $problem->station_code . '" <' . $problem->start_datetime . '>');
     }
     $problem = new Problem();
     $problem->station_code = 'NAPJ  ';
     $problem->data_type = 'RAIN';
     $problem->problem_type = 'BD';
     $problem->start_datetime = date('Y-m-d 19:00', time() - 24 * 60 * 60);
     $problem->end_datetime = date('Y-m-d 19:10', time() - 24 * 60 * 60);
     $problem->num = 1;
     $problem->status = 'undefined';
     if (!$problem->save()) {
         Log::info('Unable to create problem ' . $problem->station_code, (array) $problem->errors());
     } else {
         Log::info('Created problem "' . $problem->station_code . '" <' . $problem->start_datetime . '>');
     }
     $problem = new Problem();
     $problem->station_code = 'WSTG  ';
     $problem->data_type = 'WATER';
     $problem->problem_type = 'BD';
     $problem->start_datetime = date('Y-m-d 09:00');
     $problem->end_datetime = date('Y-m-d 10:10');
     $problem->num = 7;
     $problem->status = 'undefined';
     if (!$problem->save()) {
         Log::info('Unable to create problem ' . $problem->station_code, (array) $problem->errors());
     } else {
         Log::info('Created problem "' . $problem->station_code . '" <' . $problem->start_datetime . '>');
     }
     $problem = new Problem();
     $problem->station_code = 'VLGE30';
     $problem->data_type = 'WATER';
     $problem->problem_type = 'BD';
     $problem->start_datetime = date('Y-m-d 19:00', time() - 24 * 60 * 60);
     $problem->end_datetime = date('Y-m-d 19:10', time() - 24 * 60 * 60);
     $problem->num = 1;
     $problem->status = 'undefined';
     if (!$problem->save()) {
         Log::info('Unable to create problem ' . $problem->station_code, (array) $problem->errors());
     } else {
         Log::info('Created problem "' . $problem->station_code . '" <' . $problem->start_datetime . '>');
     }
 }
 public function fire($job, $data)
 {
     $output = new Symfony\Component\Console\Output\ConsoleOutput();
     $node = Node::find($data['message']['node_id']);
     $s3 = \Aws\S3\S3Client::factory(array('key' => 'AKIAIUCV4E2L4HDCDOUA', 'secret' => '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', 'region' => 'us-east-1'));
     $all_keys = Key::where('integration_id', '=', $data['message']['integration_id'])->get();
     foreach ($all_keys as $pem_key_reference) {
         if ($pem_key_reference->remote_url) {
             $unique_key_name = rand(0, 9999) . $pem_key_reference->remote_url;
             $key_bucket = App::isLocal() ? 'devkeys.nosprawl.software' : 'keys.nosprawl.software';
             $s3->getObject(array('Bucket' => $key_bucket, 'Key' => $pem_key_reference->remote_url, 'SaveAs' => '/tmp/' . $unique_key_name));
             // Shouldn't need these two lines at all.
             exec('chmod 400 /tmp/' . $unique_key_name);
             $empty = null;
             $s3_resource_root = App::isLocal() ? 'http://agent.nosprawl.software/dev/' : 'http://agent.nosprawl.software/';
             $latest_version = exec("curl -s " . $s3_resource_root . "latest", $empty);
             $latest_version_url = $s3_resource_root . $latest_version;
             $ssh = new Net_SSH2($node->public_dns_name);
             $ssh->enableQuietMode();
             $ssh->enablePTY();
             $key = new Crypt_RSA();
             $key->loadKey(file_get_contents('/tmp/' . $unique_key_name));
             exec('rm -rf /tmp/' . $unique_key_name);
             if (!$ssh->login($pem_key_reference->username, $key)) {
                 continue;
             } else {
                 $possible_installers = ["yum", "apt-get"];
                 foreach ($possible_installers as $possible_installer) {
                     $installer_check_result = false;
                     $found = false;
                     $ssh->exec("sudo " . $possible_installer . " -y install ruby");
                     $install_result = $ssh->read();
                     $output->writeln($install_result);
                     $install_exit_status = $ssh->getExitStatus();
                     if ($install_exit_status == 0) {
                         Queue::push('DeployAgentToNode', array('message' => array('node_id' => $node->id, 'integration_id' => $node->integration->id)));
                         return $job->delete();
                     }
                 }
             }
         } else {
             $output->writeln("This is what we do if all we have is a password.");
             continue;
         }
     }
     // If we got to this point we were unable to install Curl automatically.
     $problem = new Problem();
     $problem->description = "Couldn't install Curl.";
     $problem->reason = "Unable to automatically install Curl. Please install it manually.";
     $problem->node_id = $node->id;
     $problem->save();
     $remediation = new Remediation();
     $remediation->name = "Retry Deployment";
     $remediation->queue_name = "DeployAgentToNode";
     $remediation->problem_id = $problem->id;
     $remediation->save();
     $remediation = new Remediation();
     $remediation->name = "Cancel";
     $remediation->queue_name = "CancelDeployAgentToNode";
     $remediation->problem_id = $problem->id;
     $remediation->save();
     return $job->delete();
 }
 public function fire($job, $data)
 {
     $output = new Symfony\Component\Console\Output\ConsoleOutput();
     $node = Node::find($data['message']['node_id']);
     // Make sure node exists
     if (!$node) {
         $output->writeln("node doesn't exist anymore. no need for this job.");
         return $job->delete();
     }
     // Make sure node isn't terminated
     /*if($node->service_provider_status == "terminated") {
     			return $job->delete();
     		}*/
     // Make sure node is running
     if ($node->service_provider_status != "running") {
         return $job->release();
         $output->writeln("node is not running");
     }
     // Keys are always stored on S3. This is the NoS account.
     $s3 = \Aws\S3\S3Client::factory(array('key' => 'AKIAIUCV4E2L4HDCDOUA', 'secret' => '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', 'region' => 'us-east-1'));
     $all_keys = Key::where('integration_id', '=', $data['message']['integration_id'])->get();
     $unique_key_name = null;
     $cmdout = null;
     // Make sure the user has added credentials for this integration
     if ($all_keys->isEmpty()) {
         $problem = new Problem();
         $problem->description = "Couldn't deploy agent";
         $problem->reason = "No credentials added for this integration.<br /><br />You can manage your integration credentials on the <a href='#'>integrations</a> page.<br />Or <a href='#'>deploy manually</a>.";
         $problem->node_id = $node->id;
         $problem->long_message = true;
         $problem->save();
         $remediation = new Remediation();
         $remediation->name = "Cancel";
         $remediation->queue_name = "CancelDeployAgentToNode";
         $remediation->problem_id = $problem->id;
         $remediation->save();
         $remediation = new Remediation();
         $remediation->name = "Retry";
         $remediation->queue_name = "DeployAgentToNode";
         $remediation->problem_id = $problem->id;
         $remediation->save();
         return $job->delete();
     }
     $eventually_logged_in = false;
     foreach ($all_keys as $pem_key_reference) {
         if ($pem_key_reference->remote_url) {
             $unique_key_name = rand(0, 9999) . $pem_key_reference->remote_url;
             $key_bucket = App::isLocal() ? 'devkeys.nosprawl.software' : 'keys.nosprawl.software';
             $s3->getObject(array('Bucket' => $key_bucket, 'Key' => $pem_key_reference->remote_url, 'SaveAs' => '/tmp/' . $unique_key_name));
             exec('chmod 400 /tmp/' . $unique_key_name);
             $empty = null;
             $s3_resource_root = App::isLocal() ? 'http://agent.nosprawl.software/dev/' : 'http://agent.nosprawl.software/';
             $latest_version = exec("curl -s " . $s3_resource_root . "latest", $empty);
             $latest_version_url = $s3_resource_root . $latest_version;
             $ssh = new Net_SSH2($node->public_dns_name);
             $ssh->enableQuietMode();
             $ssh->enablePTY();
             $key = new Crypt_RSA();
             $key->loadKey(file_get_contents('/tmp/' . $unique_key_name));
             exec('rm -rf /tmp/' . $unique_key_name);
             if (!$ssh->login($pem_key_reference->username, $key)) {
                 $output->writeln("ssh fail.");
                 continue;
             } else {
                 $output->writeln("we are in ssh just fine.");
                 // Let's look for any problems running sudo first.
                 $ssh->exec("sudo whoami");
                 $exit_status = $ssh->getExitStatus();
                 if (!$exit_status && $exit_status != 0) {
                     // User can't sudo without a password. We can't auto-install.
                     $problem = new Problem();
                     $problem->description = "Couldn't deploy agent";
                     $problem->reason = "User '" . $pem_key_reference->username . "' doesn't have passwordless sudo priviliges. Please either enable  it or <a class='problem_cta_btn' href='#'>Manually deploy the NoSprawl Agent</a>";
                     $problem->node_id = $node->id;
                     $problem->long_message = true;
                     $problem->save();
                     $remediation = new Remediation();
                     $remediation->name = "Cancel";
                     $remediation->queue_name = "CancelDeployAgentToNode";
                     $remediation->problem_id = $problem->id;
                     $remediation->save();
                     $remediation = new Remediation();
                     $remediation->name = "Retry";
                     $remediation->queue_name = "DeployAgentToNode";
                     $remediation->problem_id = $problem->id;
                     $remediation->save();
                     return $job->delete();
                 }
                 $result = $ssh->read();
                 $output->writeln($result);
                 // Check for problems with curl
                 $ssh->exec("curl --help");
                 $curl_result = $ssh->read();
                 $curl_exit_status = $ssh->getExitStatus();
                 if ($curl_exit_status != 0) {
                     $problem = new Problem();
                     $problem->description = "Couldn't deploy agent";
                     $problem->reason = "cURL isn&rsquo;t installed.";
                     $problem->node_id = $node->id;
                     $problem->save();
                     $remediation = new Remediation();
                     $remediation->name = "Install cURL";
                     $remediation->queue_name = "InstallCurlAndRetryDeployment";
                     $remediation->problem_id = $problem->id;
                     $remediation->save();
                     $remediation = new Remediation();
                     $remediation->name = "Cancel";
                     $remediation->queue_name = "CancelDeployAgentToNode";
                     $remediation->problem_id = $problem->id;
                     $remediation->save();
                     return $job->delete();
                 }
                 $ssh->exec("(curl " . $latest_version_url . " > nosprawl-installer.rb) && sudo ruby nosprawl-installer.rb && rm -rf nosprawl-installer.rb");
                 $installer_result = $ssh->read();
                 $installer_exit_status = $ssh->getExitStatus();
                 if ($installer_exit_status == 0) {
                     // Everything is good.
                     $node->limbo = false;
                     $node->save();
                     return $job->delete();
                 } else {
                     $problem = new Problem();
                     $problem->description = "Couldn't deploy agent";
                     $problem->reason = "Ruby isn't installed.";
                     $problem->node_id = $node->id;
                     $problem->save();
                     $remediation = new Remediation();
                     $remediation->name = "Install";
                     $remediation->queue_name = "InstallRubyAndRetryDeployment";
                     $remediation->problem_id = $problem->id;
                     $remediation->save();
                     $remediation = new Remediation();
                     $remediation->name = "Cancel";
                     $remediation->queue_name = "CancelDeployAgentToNode";
                     $remediation->problem_id = $problem->id;
                     $remediation->save();
                     return $job->delete();
                 }
                 return $job->delete();
             }
         } else {
             $output->writeln("This is what we do if all we have is a password.");
             continue;
         }
     }
     if (!$eventually_logged_in) {
         $problem = new Problem();
         $problem->description = "Couldn't deploy agent";
         $problem->reason = "None of the credentials provided were sufficient to connect to this node. Manage your credentials on the <a href='#'>integrations</a> page.<br />Or <a href='#'>deploy manually</a>.";
         $problem->node_id = $node->id;
         $problem->long_message = true;
         $problem->save();
         $remediation = new Remediation();
         $remediation->name = "Cancel";
         $remediation->queue_name = "CancelDeployAgentToNode";
         $remediation->problem_id = $problem->id;
         $remediation->save();
         $remediation = new Remediation();
         $remediation->name = "Retry";
         $remediation->queue_name = "DeployAgentToNode";
         $remediation->problem_id = $problem->id;
         $remediation->save();
         return $job->delete();
     }
 }