mirror of
				https://github.com/juanfont/headscale.git
				synced 2025-10-28 10:51:44 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			88 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package cli
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
	"io"
 | 
						|
	"os"
 | 
						|
 | 
						|
	v1 "github.com/juanfont/headscale/gen/go/headscale/v1"
 | 
						|
	"github.com/rs/zerolog/log"
 | 
						|
	"github.com/spf13/cobra"
 | 
						|
)
 | 
						|
 | 
						|
func init() {
 | 
						|
	rootCmd.AddCommand(policyCmd)
 | 
						|
	policyCmd.AddCommand(getPolicy)
 | 
						|
 | 
						|
	setPolicy.Flags().StringP("file", "f", "", "Path to a policy file in HuJSON format")
 | 
						|
	if err := setPolicy.MarkFlagRequired("file"); err != nil {
 | 
						|
		log.Fatal().Err(err).Msg("")
 | 
						|
	}
 | 
						|
	policyCmd.AddCommand(setPolicy)
 | 
						|
}
 | 
						|
 | 
						|
var policyCmd = &cobra.Command{
 | 
						|
	Use:   "policy",
 | 
						|
	Short: "Manage the Headscale ACL Policy",
 | 
						|
}
 | 
						|
 | 
						|
var getPolicy = &cobra.Command{
 | 
						|
	Use:     "get",
 | 
						|
	Short:   "Print the current ACL Policy",
 | 
						|
	Aliases: []string{"show", "view", "fetch"},
 | 
						|
	Run: func(cmd *cobra.Command, args []string) {
 | 
						|
		output, _ := cmd.Flags().GetString("output")
 | 
						|
		ctx, client, conn, cancel := newHeadscaleCLIWithConfig()
 | 
						|
		defer cancel()
 | 
						|
		defer conn.Close()
 | 
						|
 | 
						|
		request := &v1.GetPolicyRequest{}
 | 
						|
 | 
						|
		response, err := client.GetPolicy(ctx, request)
 | 
						|
		if err != nil {
 | 
						|
			ErrorOutput(err, fmt.Sprintf("Failed loading ACL Policy: %s", err), output)
 | 
						|
		}
 | 
						|
 | 
						|
		// TODO(pallabpain): Maybe print this better?
 | 
						|
		// This does not pass output as we dont support yaml, json or json-line
 | 
						|
		// output for this command. It is HuJSON already.
 | 
						|
		SuccessOutput("", response.GetPolicy(), "")
 | 
						|
	},
 | 
						|
}
 | 
						|
 | 
						|
var setPolicy = &cobra.Command{
 | 
						|
	Use:   "set",
 | 
						|
	Short: "Updates the ACL Policy",
 | 
						|
	Long: `
 | 
						|
	Updates the existing ACL Policy with the provided policy. The policy must be a valid HuJSON object.
 | 
						|
	This command only works when the acl.policy_mode is set to "db", and the policy will be stored in the database.`,
 | 
						|
	Aliases: []string{"put", "update"},
 | 
						|
	Run: func(cmd *cobra.Command, args []string) {
 | 
						|
		output, _ := cmd.Flags().GetString("output")
 | 
						|
		policyPath, _ := cmd.Flags().GetString("file")
 | 
						|
 | 
						|
		f, err := os.Open(policyPath)
 | 
						|
		if err != nil {
 | 
						|
			ErrorOutput(err, fmt.Sprintf("Error opening the policy file: %s", err), output)
 | 
						|
		}
 | 
						|
		defer f.Close()
 | 
						|
 | 
						|
		policyBytes, err := io.ReadAll(f)
 | 
						|
		if err != nil {
 | 
						|
			ErrorOutput(err, fmt.Sprintf("Error reading the policy file: %s", err), output)
 | 
						|
		}
 | 
						|
 | 
						|
		request := &v1.SetPolicyRequest{Policy: string(policyBytes)}
 | 
						|
 | 
						|
		ctx, client, conn, cancel := newHeadscaleCLIWithConfig()
 | 
						|
		defer cancel()
 | 
						|
		defer conn.Close()
 | 
						|
 | 
						|
		if _, err := client.SetPolicy(ctx, request); err != nil {
 | 
						|
			ErrorOutput(err, fmt.Sprintf("Failed to set ACL Policy: %s", err), output)
 | 
						|
		}
 | 
						|
 | 
						|
		SuccessOutput(nil, "Policy updated.", "")
 | 
						|
	},
 | 
						|
}
 |