1 | #!/usr/bin/perl␊ |
2 | ␊ |
3 | use strict;␊ |
4 | use YAML::Syck;␊ |
5 | ␊ |
6 | our $target_volume;␊ |
7 | our $boot_plist_filepath;␊ |
8 | ␊ |
9 | our $yaml_file="@YAML_FILE@";␊ |
10 | ␊ |
11 | if ($#ARGV < 0) {␊ |
12 | print stderr "A target volume is needed\n";␊ |
13 | } else {␊ |
14 | $target_volume=$ARGV[0];␊ |
15 | }␊ |
16 | ␊ |
17 | $boot_plist_filepath = "${target_volume}/Extra/org.chameleon.Boot.plist";␊ |
18 | if ( -f "$boot_plist_filepath" ) {␊ |
19 | main("$yaml_file");␊ |
20 | }␊ |
21 | ␊ |
22 | sub _do_cmd {␊ |
23 | my ($cmd, $key, $value) = @_;␊ |
24 | my $out;␊ |
25 | ␊ |
26 | $key =~ s/([\s])/\\$1/g; # Escape characters in key␊ |
27 | $value =~ s/([\s"])/\\$1/g; # Escape characters in value (space & ")␊ |
28 | my $plistbuddy_command="$cmd :$key $value";␊ |
29 | ␊ |
30 | open ( OUTPUT, "-|", '/usr/libexec/plistbuddy', "-c", "$plistbuddy_command", "$boot_plist_filepath" );␊ |
31 | my $exit_code = $?;␊ |
32 | chomp($out = <OUTPUT>);␊ |
33 | close OUTPUT;␊ |
34 | return $out;␊ |
35 | }␊ |
36 | ␊ |
37 | sub get_boot_plist_option {␊ |
38 | my ($option) = @_;␊ |
39 | return _do_cmd( "Print", "$option");␊ |
40 | }␊ |
41 | ␊ |
42 | sub delete_boot_plist_option {␊ |
43 | my ($option) = @_;␊ |
44 | return _do_cmd( "Delete", "$option");␊ |
45 | }␊ |
46 | ␊ |
47 | sub delete_boot_plist_text_option {␊ |
48 | my ($option, $values) = @_;␊ |
49 | my $current_value = get_boot_plist_option "$option";␊ |
50 | if ( $current_value ne "") {␊ |
51 | foreach my $recognized_value (@{$values}) {␊ |
52 | if ($recognized_value eq $current_value) {␊ |
53 | return _do_cmd( "Delete", "$option");␊ |
54 | }␊ |
55 | }␊ |
56 | }␊ |
57 | return "";␊ |
58 | }␊ |
59 | ␊ |
60 | sub delete_boot_plist_list_option {␊ |
61 | my ($option, $values) = @_;␊ |
62 | my $current_value = get_boot_plist_option "$option";␊ |
63 | if ( $current_value ne "") {␊ |
64 | my %count;␊ |
65 | my @new_list;␊ |
66 | foreach my $value (@{$values}) {␊ |
67 | $count{$value} = 1;␊ |
68 | }␊ |
69 | foreach my $value (split(/\s+/,$current_value)) {␊ |
70 | if ( not exists $count{$value} ) {␊ |
71 | push @new_list, $value;␊ |
72 | }␊ |
73 | }␊ |
74 | return _do_cmd( "Set", $option, join(' ',@new_list) );␊ |
75 | }␊ |
76 | return "";␊ |
77 | }␊ |
78 | ␊ |
79 | sub main() {␊ |
80 | # Remove all options that installer can managed␊ |
81 | my ($yaml_file) = @_;␊ |
82 | my $hash_ref = LoadFile($yaml_file) or die "Can't open yaml file\n";␊ |
83 | foreach my $option ( keys %{$hash_ref} ) {␊ |
84 | my $type = $hash_ref->{$option}->{type};␊ |
85 | if ( $type =~ /^bool$/i ) {␊ |
86 | delete_boot_plist_option($option);␊ |
87 | } elsif ( $type =~ /^text$/i ) {␊ |
88 | delete_boot_plist_text_option( $option,␊ |
89 | $hash_ref->{$option}->{values} );␊ |
90 | } elsif ( $type =~ /^list$/i ) {␊ |
91 | delete_boot_plist_list_option( $option,␊ |
92 | $hash_ref->{$option}->{values} );␊ |
93 | }␊ |
94 | }␊ |
95 | }␊ |
96 | |