allocatePortNo(); // allocte port for the conyainer use $this->updateProvision(); $provArrv = [ "11833.devprov.mermsemr.com", "94099.devprov.mermsemr.com", "33271.devprov.mermsemr.com", "49819.devprov.mermsemr.com", "82790.devprov.mermsemr.com", "23233.devprov.mermsemr.com", "89354.devprov.mermsemr.com", "73344.devprov.mermsemr.com", "37338.devprov.mermsemr.com", "43333.devprov.mermsemr.com", "85959.devprov.mermsemr.com", "23607.devprov.mermsemr.com", "57257.devprov.mermsemr.com", "63404.devprov.mermsemr.com" ]; foreach ($provArrv as $svv){ $tgt = $ansible_folder = str_replace(".", "_", $svv).".yml"; // $this->runAnsibleShell($tgt); } // $this->runAnsibleShell('94099_devprov_mermsemr_com.yml'); return 0; } public function updateProvision(): string { $list_limit = 1; // for noow $public_path = FCPATH; $ansible_folder = str_replace("public/", "ANSIBLE", $public_path); $partMachineLocal = "/home/chiefsoft/MermsProvision/ANSIBLE/parts/"; if (!is_dir($ansible_folder . "/parts")) { mkdir($ansible_folder . "/parts", 0700); } $mysql = "SELECT id, uid, internal_url,product_id,status,provision_port,updated, member_id FROM members_products WHERE provision_port > 0 ORDER BY updated ASC LIMIT ".$list_limit; $query = $this->db->query($mysql); // $num = $query->num_rows(); $provision_list = $query->getResult(); //$provision_list =[]; foreach ($provision_list as $pr) { $provisionPort = $pr->provision_port; $productId = $pr->product_id; $provisionUID = $pr->uid; $memberID = $pr->member_id; $ContainerName = $productId . str_pad($pr->id, 10, "0", STR_PAD_LEFT); $partFolder = $ansible_folder . "/parts/" . $provisionUID; $allocatedPort = 8011; $this->updateToNow($provisionUID); if (!is_dir($partFolder)) { mkdir($partFolder, 0700); } // THIS PROVISONING COMPOSERS $composer_template_path = $ansible_folder . "/templates/composers/" . $productId . "/docker-compose.yml"; $composer_template_path_local = $partMachineLocal . $provisionUID; $prov_name = str_replace(".", "_", $pr->internal_url) . ".yml"; $template_file = $ansible_folder . "/templates/" . $pr->product_id . ".yml"; //Get the domposer template file $composer_template_contents = file_get_contents($composer_template_path); // Do the processing $composer_template_contents = str_replace("WHAT_CONTAINER_NAME", $ContainerName, $composer_template_contents); $destinationHomeFolder = "/home/chiefsoft/SITES/" . $ContainerName; $composer_template_contents = str_replace("DESTINATION_FOLDER", $destinationHomeFolder, $composer_template_contents); $composer_template_contents = str_replace("ALLOCATED_PORT", $allocatedPort, $composer_template_contents); $composer_template_contents = str_replace("CNT_DB_NAME", $ContainerName, $composer_template_contents); $composer_template_contents = str_replace("CNT_DB_PASS", $provisionUID, $composer_template_contents); //Save to the specific path $destination_composer_path = $ansible_folder . "/parts/" . $provisionUID . "/docker-compose.yml"; $composerFile = fopen($destination_composer_path, "w") or die("Unable to open file!"); fwrite($composerFile, $composer_template_contents); fclose($composerFile); // GET THE TEMPLATE FOR THIS PROVISIONING $template_content = file_get_contents($template_file); $template_content_processed = str_replace("WHAT_HOST_IN_USE", $productId . "_SERVER", $template_content); $template_content_processed = str_replace("WHAT_PART_FOLDER", $partFolder, $template_content_processed); $template_content_processed = str_replace("DESTINATION_FOLDER", $destinationHomeFolder, $template_content_processed); $template_content_processed = str_replace("WHAT_PART_LOCAL", $composer_template_path_local, $template_content_processed); // depends on the local machine // CREATE PROVISOINING FILE $myfile = fopen($ansible_folder . "/" . $prov_name, "w") or die("Unable to open file!"); fwrite($myfile, $template_content_processed); fclose($myfile); $this->provisionActions($memberID, $provisionUID, "Auto Configuration Started"); } return view('welcome_message'); } private function allocatePortNo(){ $list_limit = 2; $mysql = "SELECT id, member_id, uid, internal_url,product_id,status,provision_port,updated FROM members_products WHERE provision_port = 0 ORDER BY updated ASC LIMIT ".$list_limit; $query = $this->db->query($mysql); $provision_list = $query->getResult(); foreach ($provision_list as $pr) { $memberID = $pr->member_id; $productId = $pr->product_id; $provisionUID = $pr->uid; $allocated_port = $this->allocatePortNumber( $productId ); $primary_server = $this->provisionServer( $productId ); $mysql = "UPDATE members_products SET updated=now(), provision_port=".$allocated_port.", primary_server='".$primary_server."' WHERE uid::TEXT = '".$provisionUID."' AND provision_port = 0"; $query = $this->db->query($mysql); $this->provisionActions($memberID, $provisionUID, "Allocating Provisioning Ports"); } } private function allocatePortNumber($productId){ $portF = 0; try { $mysql = "SELECT max(provision_port) AS max_port FROM members_products WHERE product_id = '".$productId."'"; $query = $this->db->query($mysql); $maxItem = $query->getResult()[0]->max_port; //var_dump($maxItem); if ($maxItem == 0 ){ switch ($productId) { case "A000002": $maxItem = 5500; break; case "A000004": $maxItem = 8800; break; case "A000005": $maxItem = 7700; break; case "A000001": $maxItem = 4400; break; case "A000003": $maxItem = 6600; break; } } else{ $maxItem = $maxItem+1; } $portF = $maxItem; } catch (Exception $e) { echo 'Caught exception: ', $e->getMessage(), "\n"; } return $portF; } private function provisionServer($productId){ switch ($productId) { case "A000001": case "A000002": $primaryServer = "172.16.4.92"; break; case "A000003": case "A000004": $primaryServer = "172.16.4.91"; break; case "A000005": $primaryServer = "172.16.4.95"; break; } return $primaryServer; } /* [A000001_SERVER] 172.16.4.92 [A000002_SERVER] 172.16.4.92 [A000003_SERVER] 172.16.4.91 [A000004_SERVER] 172.16.4.91 [A000005_SERVER] 172.16.4.95 */ private function updateToNow($provisionUID){ try { $mysql = "UPDATE members_products SET updated=now() WHERE uid::TEXT = '".$provisionUID."'"; $query = $this->db->query($mysql); } catch (Exception $e) { echo 'Caught exception: ', $e->getMessage(), "\n"; log_message('critical', "***** ***** Provision Error:: updateToNow() ".$e->getMessage()); } } private function provisionActions($memberID, $provisionUID,$actionText){ log_message('critical', "***** ***** Provision :: provisionActions($memberID, $provisionUID,$actionText) "); try { $mysql = "INSERT INTO provision_actions (member_id,product_uid,action) VALUES ($memberID,'$provisionUID', '$actionText')"; log_message('critical', "***** ***** Provision :: provisionActions(QUERY) :: ".$mysql); $query = $this->db->query($mysql); // TELL THE SOCKET TO REFRESH PAGE $data["product_uid"] = $provisionUID; $this->APIcall("GET", 'http://10.0.0.32:5006/broadcast/provisionings', $data); } catch ( \Exception $e) { // echo 'Caught exception: ', $e->getMessage(), "\n"; log_message('critical', "***** ***** Provision Error:: provisionActions() ".$e->getMessage()); } return 0; } public function runAnsibleShell($provisionFile){ try{ log_message('critical', "***** ***** Provision :: runAnsibleShell($provisionFile) "); $shellCommand ="ansible-playbook --vault-password-file secrets.pass --key-file ~/.ssh/ansible_worker -i inventory $provisionFile"; $output = shell_exec($shellCommand ); log_message('critical', "***** ***** Provision :: runAnsibleShell(output) ".$output); } catch ( \Exception $e){ log_message('critical', "***** ***** Provision Error:: runAnsibleShell() ".$e->getMessage()); } return 0; } }