Пример #1
0
        /// <summary>
        /// Queries BMC for the currently set boot device.
        /// </summary>
        /// <returns>Flags indicating the boot device.</returns>
        public virtual NextBoot GetNextBoot()
        {
            GetSystemBootOptionsRequest req = new GetSystemBootOptionsRequest(
                (byte)SystemBootOptionsParameter.BootFlags, 0);

            GetSystemBootOptionsResponse response =
                (GetSystemBootOptionsResponse)this.IpmiSendReceive(req, typeof(GetSystemBootOptionsResponse));

            NextBoot nextboot = new NextBoot(response.CompletionCode);

            if (response.CompletionCode == 0x00)
                nextboot.SetParamaters(response.ParameterData);

            return nextboot;
        }
        /// <summary>
        /// The helper for several boot type setting methods, as they
        /// essentially send the same sequence of messages.
        /// </summary>
        /// <param name="bootType">The desired boot type.</param>
        public virtual NextBoot SetNextBoot(BootType bootType, bool uefi, bool persistent, byte instance, bool requireCommit = false)
        {
            byte completionCode = 0x00;

            SsboSetInProgress req = new SsboSetInProgress(
                                    false, SboSetInProgress.SetInProgress);

            SetSystemBootOptionsResponse response =
                                        (SetSystemBootOptionsResponse)this.IpmiSendReceive(
                                        req, typeof(SetSystemBootOptionsResponse));

            completionCode = response.CompletionCode;

            SsboBootInfoAcknowledge ack = new SsboBootInfoAcknowledge(
                                          false,
                                          SboBootInfoAcknowledgeMask.EnableWriteBiosFlag,
                                          SboBootInfoAcknowledgeData.None);

            response = (SetSystemBootOptionsResponse)this.IpmiSendReceive(
                        ack, typeof(SetSystemBootOptionsResponse));

            if (completionCode == 0x00)
                completionCode = response.CompletionCode;

            BootFlags bootFlags = BootFlags.BootFlagsValid;

            if (persistent)
                bootFlags = (bootFlags | BootFlags.AllSubsequentBoots);

            if (uefi)
                bootFlags = (bootFlags | BootFlags.EfiBootType);

            SsboBootFlags flags = new SsboBootFlags(
                                    false, bootFlags, bootType, 0, 0, instance);

            response = (SetSystemBootOptionsResponse)this.IpmiSendReceive(
                                    flags, typeof(SetSystemBootOptionsResponse));

            if (completionCode == 0x00)
                completionCode = response.CompletionCode;

            if (requireCommit)
            {
                req = new SsboSetInProgress(false, SboSetInProgress.CommitWrite);

                response = (SetSystemBootOptionsResponse)this.IpmiSendReceive(
                            req, typeof(SetSystemBootOptionsResponse));

                if (completionCode == 0x00)
                    completionCode = response.CompletionCode;
            }

            req = new SsboSetInProgress(false, SboSetInProgress.SetComplete);

            response = (SetSystemBootOptionsResponse)this.IpmiSendReceive(
                         req, typeof(SetSystemBootOptionsResponse));

            if (completionCode == 0x00)
                completionCode = response.CompletionCode;

            NextBoot nextboot = new NextBoot(completionCode);
            nextboot.BootDevice = bootType;

            return nextboot;
        }