blob: 7d73cc919719ca4855aa9fc9d9d144490f2c2cf6 [file] [edit]
// Copyright 2026 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package main
import (
"context"
"flag"
"fmt"
"github.com/google/subcommands"
)
type disableCmd struct {
disk string
}
func (*disableCmd) Name() string {
return "disable"
}
func (*disableCmd) Synopsis() string {
return "Disable one or more allowlisted arguments for the next boot"
}
func (*disableCmd) Usage() string {
return "disable [--disk <disk image>] <arg1> [arg2] ...\n"
}
func (c *disableCmd) SetFlags(f *flag.FlagSet) {
f.StringVar(&c.disk, "disk", "", "Path to the disk image (empty for live system)")
}
func (c *disableCmd) Execute(_ context.Context, f *flag.FlagSet, _ ...interface{}) subcommands.ExitStatus {
args := f.Args()
if len(args) == 0 {
fmt.Println("Usage: disable [--disk <disk image>] <arg1> [arg2] ...")
return subcommands.ExitUsageError
}
allowlist, _, err := readAllowlist(c.disk)
if err != nil {
fmt.Printf("Error reading allowlist: %v\n", err)
return subcommands.ExitFailure
}
bitfield, err := readBitfield(c.disk)
if err != nil {
fmt.Printf("Error reading bitfield: %v\n", err)
return subcommands.ExitFailure
}
for _, argToDisable := range args {
found := false
for i, arg := range allowlist {
if argToDisable == arg {
bitfield &= ^(1 << i)
found = true
break
}
}
if !found {
fmt.Printf("Error: argument '%s' is not in the allowlist\n", argToDisable)
return subcommands.ExitFailure
}
}
err = writeBitfield(c.disk, bitfield)
if err != nil {
fmt.Printf("Error writing bitfield: %v\n", err)
return subcommands.ExitFailure
}
fmt.Printf("Successfully disabled %v\n", args)
return subcommands.ExitSuccess
}