private void buttonPollForRequest_Click(object sender, EventArgs e) { string remoteq = @"FormatName:direct=OS:provsvc\private$\Provision"; MessageQueue rq = new MessageQueue(remoteq); System.Messaging.Cursor cursor = rq.CreateCursor(); TimeSpan timeout = new TimeSpan(0, 0, 10); rq.Formatter = new XmlMessageFormatter(new[] { typeof(ProvisionTask) }); System.Messaging.Message m; PeekAction action = PeekAction.Current; m = GetPeek(rq, cursor, PeekAction.Current); while (m != null) { ProvisionTask r = (ProvisionTask)m.Body; if (r.target.ToLower() == Environment.MachineName.ToLower()) { m = GetMessage(rq, m.Id); } m = GetPeek(rq, cursor, PeekAction.Next); } cursor.Close(); }
private void SendMessage(string queue, string server, ProvisionTask task) { MessageQueue rq = new MessageQueue(String.Format(@"FormatName:direct=OS:{0}\private$\{1}", server, queue)); //rq.Formatter = rq.Formatter = new XmlMessageFormatter(new[] { typeof(ProvisionTask) }); rq.Send(task); }
private void ProcessQueue() { var m = GetNextMessage("RemoteInvoke", "provsvc"); try { while (m != null) { ProvisionTask task = (ProvisionTask)m.Body; log(String.Format("Task {1} received.{0}OS Family {2} - passing to appropriate handler", Environment.NewLine, task.taskid, task.image.OS_Family)); switch (task.image.OS_Family) { case OSFamily.Windows: RIWindows(task); break; } task.state++; log(String.Format("Passing task back to decider")); SendMessage(task, "Provision", "provsvc"); m = null; m = GetNextMessage("RemoteInvoke", "ProvSvc"); } } catch (Exception ex) { Debug.WriteLine(ex.Message); } }
private void ProcessCert(ProvisionTask task) { string certname = String.Format("{0}.{1}", task.hostname, task.domain); var s = GetCertStatus(certname, task.puppetmaster, task.environment); switch (s.ToString().ToLower()) { case "requested": SignCert(certname, task.puppetmaster, task.environment); log(String.Format("Cert should be signed, dropping back into queue to be reprocessed")); SendMessage(task, "certsignrequest", "provsvc"); break; case "signed": task.state++; task.certsigned = true; log(String.Format("Passing task back to decider")); SendMessage(task, "provision", "provsvc"); break; default: SendMessage(task, "certsignrequest", "provsvc"); log("Dropped to the default for some reason. popping back into the queue"); Debug.WriteLine("arrgghh"); break; } }
private void button1_Click(object sender, EventArgs e) { StackRequest request = new StackRequest(); ProvisionTask r = new ProvisionTask(); r.state = 0; r.commonname = "W2008R2-BASE"; r.domain = "mojo.local"; r.environment = "production"; r.location = "benifold"; r.provider = Provider.Vagrant; r.puppetmaster = "puppet.mojo.local"; r.puppetversion = "3.7.3"; r.role = "web"; r.target = "achilles"; r.cpus = 2; r.memory = 2536; r.puppetclasses = new List <string>(); r.puppetclasses.Add("joet"); request.Instances.Add(r); HttpClient client = new HttpClient(); HttpResponseMessage response = client.PostAsJsonAsync("http://provsvc/provisioning/api/stack", request).Result; ; }
private void failed(ProvisionTask task) { GetProvisionTaskMessage("provision", task.taskid); MessageQueue rq = new MessageQueue(@"FormatName:direct=OS:provsvc\private$\failed"); rq.Formatter = rq.Formatter = new XmlMessageFormatter(new[] { typeof(ProvisionTask) }); rq.Send(task); }
public VagrantVM(ProvisionTask task) { this.task = task; vbname = task.hostname; communicator = (task.image.OS_Family == OSFamily.Windows)?"winrm":"ssh"; ram = task.memory; cpus = task.cpus; box = task.image.Id; guest = task.hostname; riusername = "******"; ripassword = "******"; }
private bool RequestHostname(ProvisionTask task) { try { MessageQueue rq = new MessageQueue(@"FormatName:direct=OS:provsvc\private$\NameRequest"); rq.Formatter = new XmlMessageFormatter(new[] { typeof(ProvisionTask) }); rq.Send(task); return(true); } catch (Exception ex) { Debug.WriteLine(ex.Message); } return(false); }
private void ProcessNameRequestQueue() { MessageQueue rq = new MessageQueue(@"FormatName:direct=OS:provsvc\private$\NameRequest"); rq.Formatter = new XmlMessageFormatter(new[] { typeof(ProvisionTask) }); TimeSpan timeout = new TimeSpan(0, 0, 0); try { System.Messaging.Message m = null; try { m = rq.Receive(timeout); } catch (Exception ex) { Debug.WriteLine(ex.Message); } while (m != null) { ProvisionTask task = (ProvisionTask)m.Body; log(String.Format("Task {0} requesting a new domain object", task.taskid)); var result = RequestName(task); task.state = (result == "not found") ? 99 : 2; task.hostname = result; log(String.Format("Domain object {0} created. Passing task back to decider", task.hostname)); var resultq = new MessageQueue(@"FormatName:direct=OS:provsvc\private$\provision"); resultq.Send(task); m = null; try { m = rq.Receive(timeout); } catch (Exception ex) { Debug.WriteLine(ex.Message); } } } catch (Exception ex) { log(String.Format("Exception caught : {1}{0}{2}", Environment.NewLine, ex.Message, ex.InnerException)); } }
private PSSO.Image GetImageDetails(ProvisionTask task) { PSSO.Image image = null; try { using (var client = new HttpClient()) { client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); var response = client.GetAsync(String.Format(@"http://webbake/bakery/api/image/?ImageType=2&CommonName={0}&Provider={1}", task.commonname, (int)task.provider)).Result; image = response.Content.ReadAsAsync <PSSO.Image>().Result; } } catch (Exception ex) { } return(image); }
private void UpdateENC(ProvisionTask task) { SshClient sshclient = new SshClient("192.168.1.51", 22, "root", "Ncc1701d"); sshclient.Connect(); List <string> results; string classes = ""; foreach (string s in task.puppetclasses) { classes += String.Format("{0},", s); } classes = classes.Substring(0, classes.Length - 1); SshCommand command3 = sshclient.RunCommand(String.Format("cd /usr/share/puppet-dashboard;rake RAILS_ENV=production node:del name={0}.{1}", task.hostname, task.domain)); SshCommand command4 = sshclient.RunCommand(String.Format("cd /usr/share/puppet-dashboard;rake RAILS_ENV=production node:add name={0}.{1} classes={2}", task.hostname, task.domain, classes)); sshclient.Disconnect(); sshclient.Dispose(); }
private string RequestName(ProvisionTask task) { string oupath = ""; string servername = ""; string domain = map.MapDomain(task.domain); string searchpath = String.Format("LDAP://{0}/{1}", domain, DomainToLDAP(domain)); //DomainToLDAP(domain); DirectoryEntry de = new DirectoryEntry(searchpath, aduser, adpass, AuthenticationTypes.Sealing & AuthenticationTypes.Secure); DirectorySearcher ds = new DirectorySearcher(de); string namepart = string.Format("{0}{1}{2}{3}", map.DomainToTLA(domain), map.LocationToTLA(task.location), map.RoleToTLA(task.role), map.EnvironmentToSLA(task.environment)); ds.Filter = String.Format("(&(objectCategory=computer)(name={0}*))", namepart); var result = ds.FindAll(); SearchResult[] r = new SearchResult[result.Count]; result.CopyTo(r, 0); int i = 0; while (i < 1000) { i++; if (Array.Find(r, p => p.Path.Contains(String.Format("CN={0}{1}", namepart, i.ToString("D3")))) == null) { break; } } if (i < 1000) { string addpath = String.Format("LDAP://{0}/OU={1},OU=Servers,OU={2},{3}", map.MapDomain(task.domain), map.RoleToOU(task.role), map.DomainToTLA(task.domain), DomainToLDAP(task.domain)); de = new DirectoryEntry(addpath, aduser, adpass, AuthenticationTypes.Secure & AuthenticationTypes.Sealing); string newname = String.Format("{0}{1}V", namepart, i.ToString("D3")); DirectoryEntry newserver = de.Children.Add("CN=" + newname, "computer"); newserver.CommitChanges(); newserver.Properties["userAccountcontrol"].Value = 0x1000; newserver.CommitChanges(); return(newname); } return("unable to create"); }
private void ProcessQueue() { var m = GetNextMessage("CertSignRequest", "provsvc"); try { while (m != null) { ProvisionTask task = (ProvisionTask)m.Body; log(String.Format("Task {1} received.{0}ProcessingSigning Cert", Environment.NewLine, task.taskid)); ProcessCert(task); m = null; m = GetNextMessage("CertSignRequest", "ProvSvc"); } } catch (Exception ex) { Debug.WriteLine(ex.Message); } }
private System.Messaging.Message GetProvisionTaskMessage(string queuename, Guid taskid) { MessageQueue rq = new MessageQueue(String.Format(@"FormatName:direct=OS:provsvc\private$\{0}", queuename)); rq.Formatter = rq.Formatter = new XmlMessageFormatter(new[] { typeof(ProvisionTask) }); System.Messaging.Cursor cursor = rq.CreateCursor(); TimeSpan timeout = new TimeSpan(0, 0, 10); System.Messaging.Message m = GetPeek(rq, cursor, PeekAction.Current); while (m != null) { ProvisionTask task = (ProvisionTask)m.Body; if (task.taskid == taskid) { m = GetMessageByID("Provision", m.Id); rq.Close(); return(m); } } return(null); }
void ProcessQueue() { MessageQueue q = new MessageQueue(@"FormatName:direct=OS:provsvc\private$\vagprovider"); q.Formatter = new XmlMessageFormatter(new[] { typeof(ProvisionTask) }); try { System.Messaging.Message m = null; try { m = q.Receive(new TimeSpan(0, 0, 1)); } catch (Exception ex) {} if (m != null) { ProvisionTask task = (ProvisionTask)m.Body; log(String.Format("Processing provision request for Task {0}. Hostname will be {1}{4}vCPU's {2}{4}RAM {3}", task.taskid, task.hostname, task.cpus, task.memory, Environment.NewLine)); var vm = new VagrantVM(task); ProvisionVM(vm); task.state = 4; MessageQueue rq = new MessageQueue(@"FormatName:direct=OS:provsvc\private$\Provision"); log(String.Format("Instance IP: {1}{0}Instance Identifier: {2}", Environment.NewLine, task.IPAddress, task.identifier)); log(String.Format("Task {0} passing back to decider", task.taskid)); rq.Send(task); rq.Close(); rq.Dispose(); vm = null; } } catch (Exception ex) { Debug.WriteLine(ex.Message); } q.Close(); q.Dispose(); }
private void ProcessQueue() { var m = GetNextMessage("ENCRequest", "provsvc"); try { while (m != null) { ProvisionTask task = (ProvisionTask)m.Body; log(String.Format("Task {1} received.{0}Updating ENC", Environment.NewLine, task.taskid)); m = null; UpdateENC(task); m = GetNextMessage("ENCRequest", "ProvSvc"); task.state++; log(String.Format("Passing task back to decider")); } } catch (Exception ex) { Debug.WriteLine(ex.Message); } }
private void SendMessage(ProvisionTask task, string queue, string server) { MessageQueue q = new MessageQueue(String.Format(@"FormatName:direct=OS:{0}\private$\{1}", server, queue)); q.Send(task); }
private void ProcessProvisionQueue() { var m = GetNextMessage("provision", "provsvc"); while (m != null) { ProvisionTask task = (ProvisionTask)m.Body; switch (task.state) { case 0: //Posted, no processing //ok some basic processing of the request first. //lets get image details log(String.Format("Task ID {0} transition to state 0.{1} Requesting AD Computer object.", task.taskid, Environment.NewLine)); task.image = GetImageDetails(task); //Reqeust domain object to be created. increment status task.state++; SendMessage("namerequest", "provsvc", task); break; case 1: //Domain Object Reqeusted //ignore break; case 2: //Domain Object Created log(String.Format("Task ID {0} transition to state 2. Domain object created. Hostname will be {1}.{3} Sending task to {2} provider", task.taskid, task.hostname, task.provider, Environment.NewLine)); task.state = 3; string provider = ""; switch (task.provider) { case Provider.Vagrant: provider = "Vag"; break; } SendMessage(String.Format("{0}provider", provider), "provsvc", task); break; case 3: break; case 4: //Instance Provisioned log(String.Format("Task ID {0} transition to state 4.Instance has been provisioned. Passing to Remote Invocation", task.taskid)); task.state = 5; SendMessage("RemoteInvoke", "provsvc", task); break; case 5: break; case 6: log(String.Format("Task ID {0} transition to state 6.Cert needs to be signed", task.taskid)); task.state = 7; SendMessage("certsignrequest", "provsvc", task); break; case 7: break; case 8: break; case 9: break; case 10: //Cert signed break; case 11: //puppet results ready break; default: SendMessage("complete", "provsvc", task); break; } m = null; m = GetNextMessage("provision", "provsvc"); } }
private void RIWindows(ProvisionTask task) { //First lets construct some credentials //We're going to cheat and store credentials here string user = "******"; string pass = "******"; string user2 = "mojo\\joe"; string pass2 = "Ncc-1701d"; string shellUri = "http://schemas.microsoft.com/powershell/Microsoft.PowerShell"; SecureString securepass = new SecureString(); foreach (char c in pass.ToCharArray()) { securepass.AppendChar(c); } PSCredential cred = new PSCredential(user, securepass); SecureString securepass2 = new SecureString(); foreach (char c in pass2.ToCharArray()) { securepass2.AppendChar(c); } PSCredential cred2 = new PSCredential(user2, securepass2); WSManConnectionInfo ci = new WSManConnectionInfo(false, task.IPAddress, 5985, "/wsman", shellUri, cred); using (Runspace runspace = RunspaceFactory.CreateRunspace(ci)) { runspace.Open(); PowerShell ps = PowerShell.Create(); ps.Runspace = runspace; //Renameserver log(String.Format("Renaming instance to {0}", task.hostname)); string script = String.Format("$computerinfo=get-wmiobject -Class Win32_ComputerSystem ; $computerinfo.rename({0}{1}{0})", "\"", task.hostname); ps.AddScript(script); Collection <PSObject> PsOutput = ps.Invoke(); ps.Commands.Clear(); log(String.Format("Activating license")); ps.AddScript("cscript c:\\windows\\system32\\slmgr.vbs -ipk \"GDRKC-WG4G4-636M3-3PM3K-K9Y3P\";cscript c:\\windows\\system32\\slmgr.vbs -ato"); ps.Invoke(); log("Rebooting instance"); ps.Commands.Clear(); ps.AddCommand("restart-computer"); ps.AddParameter("Force"); ps.Invoke(); Thread.Sleep(20000);//Gotta give the instance time to start shutting down } while (!Test4WinRM(task.IPAddress)) { Thread.Sleep(5000); } using (Runspace runspace = RunspaceFactory.CreateRunspace(ci)) { runspace.Open(); PowerShell ps = PowerShell.Create(); ps.Runspace = runspace; log(String.Format("Joining instance to domain {0}", task.domain)); string script = String.Format("netsh interface ip add dns name=\"Local Area Connection 2\" addr=192.168.1.50", "\""); ps.AddScript(script); ps.Invoke(); ps.Commands.Clear(); ps.AddCommand("add-computer"); ps.AddParameter("DomainName", task.domain); ps.AddParameter("Credential", cred2); ps.Invoke(); ps.Commands.Clear(); ps.AddCommand("restart-computer"); ps.AddParameter("Force"); ps.Invoke(); Thread.Sleep(20000);//Gotta give the instance time to start shutting down } while (!Test4WinRM(task.IPAddress)) { Thread.Sleep(5000); } using (Runspace runspace = RunspaceFactory.CreateRunspace(ci)) { log(String.Format("Installing puppet agent version {0}", task.puppetversion)); runspace.Open(); PowerShell ps = PowerShell.Create(); ps.Runspace = runspace; ps.AddScript(String.Format("cmd /c start /wait msiexec /qn /i c:\\installers\\puppetagents\\puppet-{0}-x64.msi PUPPET_MASTER_SERVER={1} PUPPET_AGENT_CERTNAME={2}.{3}", task.puppetversion, task.puppetmaster, task.hostname.ToLower(), task.domain.ToLower())); ps.Invoke(); } }