Chameleon

Chameleon Svn Source Tree

Root/trunk/package/Scripts.templates/Pre/clean_bootplist.pl

  • Property svn:executable set to *
1#!/usr/bin/perl
2
3use strict;
4use YAML::Syck;
5
6our $target_volume;
7our $boot_plist_filepath;
8
9our $yaml_file="@YAML_FILE@";
10
11if ($#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";
18if ( -f "$boot_plist_filepath" ) {
19 main("$yaml_file");
20}
21
22sub _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
37sub get_boot_plist_option {
38 my ($option) = @_;
39 return _do_cmd( "Print", "$option");
40}
41
42sub delete_boot_plist_option {
43 my ($option) = @_;
44 return _do_cmd( "Delete", "$option");
45}
46
47sub 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
60sub 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
79sub 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

Archive Download this file

Revision: 1801