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();
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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);
            }
        }
Beispiel #4
0
        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;

            ;
        }
Beispiel #6
0
        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);
        }
Beispiel #7
0
 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   = "******";
 }
Beispiel #8
0
 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));
            }
        }
Beispiel #10
0
        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");
        }
Beispiel #13
0
        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);
            }
        }
Beispiel #14
0
        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);
        }
Beispiel #18
0
        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");
            }
        }
Beispiel #19
0
        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();
            }
        }