~ubuntu-branches/ubuntu/quantal/sudo/quantal

« back to all changes in this revision

Viewing changes to plugins/sudoers/mkdefaults

  • Committer: Package Import Robot
  • Author(s): Marc Deslauriers
  • Date: 2011-11-20 12:07:45 UTC
  • mfrom: (1.3.17 sid)
  • Revision ID: package-import@ubuntu.com-20111120120745-o3qpklobmygytndc
Tags: 1.8.3p1-1ubuntu1
* Merge from debian/testing, remaining changes:
  - debian/patches/keep_home_by_default.patch:
    + Set HOME in initial_keepenv_table. (rebased for 1.8.3p1)
  - debian/patches/enable_badpass.patch: turn on "mail_badpass" by default:
    + attempting sudo without knowing a login password is as bad as not
      being listed in the sudoers file, especially if getting the password
      wrong means doing the access-check-email-notification never happens
      (rebased for 1.8.3p1)
  - debian/rules:
    + compile with --without-lecture --with-tty-tickets (Ubuntu specific)
    + install man/man8/sudo_root.8 (Ubuntu specific)
    + install apport hooks
    + The ubuntu-sudo-as-admin-successful.patch was taken upstream by
      Debian however it requires a --enable-admin-flag configure flag to
      actually enable it.
  - debian/sudoers: 
    + grant admin group sudo access
  - debian/sudo-ldap.dirs, debian/sudo.dirs: 
    + add usr/share/apport/package-hooks
  - debian/sudo.preinst:
    + avoid conffile prompt by checking for known default /etc/sudoers
      and if found installing the correct default /etc/sudoers file

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/perl -w
 
2
#
 
3
# Generate sudo_defs_table and associated defines
 
4
#
 
5
# Input should be formatted thusly:
 
6
#
 
7
# var_name
 
8
#       TYPE
 
9
#       description (or NULL)
 
10
#       array of struct def_values if TYPE == T_TUPLE
 
11
 
 
12
# Deal with optional -o (output) argument
 
13
if ($#ARGV > 0 && $ARGV[0] eq "-o") {
 
14
    shift;
 
15
    $header = $cfile = shift;
 
16
    $header .= '.h';
 
17
    $cfile .= '.c';
 
18
}
 
19
die "usage: $0 [input_file]\n" unless $#ARGV == -1 || $#ARGV == 0;
 
20
 
 
21
$infile = $ARGV[0] || "def_data.in";
 
22
if (!defined($header)) {
 
23
    $header = $infile;
 
24
    $header =~ s/(\.in)?$/.h/;
 
25
}
 
26
if (!defined($cfile)) {
 
27
    $cfile = $infile;
 
28
    $cfile =~ s/(\.in)?$/.c/;
 
29
}
 
30
 
 
31
open(IN, "<$infile") || die "$0: can't open $infile: $!\n";
 
32
open(HEADER, ">$header") || die "$0: can't open $header: $!\n";
 
33
open(CFILE, ">$cfile") || die "$0: can't open $cfile: $!\n";
 
34
 
 
35
$count = 0;
 
36
@tuple_values = ( "never" );
 
37
@records = ();
 
38
while(<IN>) {
 
39
    chomp;
 
40
    s/\s*#.*$//;
 
41
    next if /^\s*$/;
 
42
 
 
43
    if (/^\S/) {
 
44
        # Store previous record and begin new one
 
45
        $records[$count++] = [$var, $type, $desc, $values, $callback] if defined($var);
 
46
 
 
47
        $var = $_;
 
48
        $type = '';
 
49
        $desc = undef;
 
50
        $values = undef;
 
51
        $callback = undef;
 
52
        $field = 0;
 
53
    } else {
 
54
        $field++;
 
55
        s/^\s+//;
 
56
        s/\s+$//;
 
57
        if ($field == 1) {
 
58
            # type
 
59
            $type = $_;
 
60
        } elsif ($field == 2) {
 
61
            # description
 
62
            if ($_ eq "NULL") {
 
63
                $desc = "NULL";
 
64
            } else {
 
65
                # Strip leading and trailing double quote and escape the rest
 
66
                s/^"//;
 
67
                s/"$//;
 
68
                s/"/\\"/g;
 
69
                $desc = "N_(\"$_\")";
 
70
            }
 
71
        } elsif ($field == 3 || $field == 4) {
 
72
            if (s/^\*//) {
 
73
                $callback = $_;
 
74
            } else {
 
75
                die "$0: syntax error near line $.\n" if $type !~ /^T_TUPLE/;
 
76
                $values = [ split ];
 
77
                foreach $v (@$values) {
 
78
                    push(@tuple_values, $v) unless grep(/^$v$/, @tuple_values);
 
79
                }
 
80
            }
 
81
        } else {
 
82
            die "$0: syntax error near line $.\n";
 
83
        }
 
84
    }
 
85
}
 
86
$records[$count++] = [$var, $type, $desc, $values, $callback] if defined($var);
 
87
 
 
88
# Print out value arrays
 
89
for ($i = 0; $i < $count; $i++) {
 
90
    if (defined($records[$i]->[3])) {
 
91
        die "Values list specified for non-tuple\n" unless
 
92
            $records[$i]->[1] =~ /^T_TUPLE/;
 
93
        printf CFILE "static struct def_values def_data_%s[] = {\n", $records[$i]->[0];
 
94
        foreach (@{$records[$i]->[3]}) {
 
95
            print CFILE "    { \"$_\", $_ },\n";
 
96
        }
 
97
        print CFILE "    { NULL, 0 },\n";
 
98
        print CFILE "};\n\n";
 
99
    }
 
100
}
 
101
 
 
102
# Print each record
 
103
print CFILE "struct sudo_defs_types sudo_defs_table[] = {\n    {\n";
 
104
for ($i = 0; $i < $count; $i++) {
 
105
    &print_record($records[$i], $i);
 
106
}
 
107
print CFILE "\tNULL, 0, NULL\n    }\n};\n";
 
108
 
 
109
# Print out def_tuple
 
110
if (@tuple_values) {
 
111
    print HEADER "\nenum def_tuple {\n";
 
112
    for ($i = 0; $i <= $#tuple_values; $i++) {
 
113
        printf HEADER "\t%s%s\n", $tuple_values[$i],
 
114
            $i != $#tuple_values ? "," : "";
 
115
    }
 
116
    print HEADER "};\n";
 
117
}
 
118
 
 
119
close(IN);
 
120
close(HEADER);
 
121
close(CFILE);
 
122
 
 
123
sub print_record {
 
124
    my ($rec, $recnum) = @_;
 
125
    my ($i, $v, $defname);
 
126
    # each variable gets a macro to access its value
 
127
    for ($rec->[1]) {
 
128
        if    (/^T_U?INT/)  { $v = "ival"; }
 
129
        elsif (/^T_STR/)    { $v = "str"; }
 
130
        elsif (/^T_FLAG/)   { $v = "flag"; }
 
131
        elsif (/^T_MODE/)   { $v = "mode"; }
 
132
        elsif (/^T_LIST/)   { $v = "list"; }
 
133
        elsif (/^T_LOGFAC/) { $v = "ival"; }
 
134
        elsif (/^T_LOGPRI/) { $v = "ival"; }
 
135
        elsif (/^T_TUPLE/)  { $v = "tuple"; }
 
136
        elsif (/^T_FLOAT/)  { $v = "fval"; }
 
137
        else { die "$0: unknown defaults type: $_\n"; }
 
138
    }
 
139
    printf HEADER "#define %-23s (sudo_defs_table[$recnum].sd_un.${v})\n",
 
140
        "def_$rec->[0]";
 
141
 
 
142
    $defname = "I_" . uc($rec->[0]);
 
143
    printf HEADER "#define %-24s%d", $defname, $recnum;
 
144
    #print HEADER "\t/* $rec->[2] */" if defined($rec->[2]);
 
145
    print HEADER "\n";
 
146
 
 
147
    print CFILE "\t\"$rec->[0]\", $rec->[1],\n\t$rec->[2],\n";
 
148
    if (defined($rec->[3])) {
 
149
        printf CFILE "\tdef_data_$rec->[0],\n";
 
150
    } else {
 
151
        printf CFILE "\tNULL,\n";
 
152
    }
 
153
    printf CFILE "\t$rec->[4],\n" if defined($rec->[4]);
 
154
    print CFILE "    }, {\n";
 
155
}