/usr/lib/upstart/migrate-inittab.pl is in upstart 1.13.2-0ubuntu21.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 | #!/usr/bin/perl
use strict;
use warnings;
my %gettys;
my $have_cad = 0;
#-----------------------------------------------------------------------------#
# Parse /etc/inittab
#-----------------------------------------------------------------------------#
open INITTAB, "/etc/inittab"
or die "Unable to open /etc/inittab: $!";
while (<INITTAB>) {
chomp;
s/^\s*//;
next if /^\#/;
next unless length;
my ($id, $rlevel, $action, $process) = split /:/, $_, 4;
warn "missing id field" and next
unless defined $id and length $id;
warn "missing runlevel field" and next
unless defined $rlevel;
warn "missing action field" and next
unless defined $action and length $action;
warn "missing process field" and next
unless defined $process;
$have_cad = 1 if $action eq "ctrlaltdel";
$gettys{$1} = [ $rlevel, $process ] if $process =~ /getty.*\b(tty\w+)/;
}
close INITTAB
or warn "Error while closing /etc/inittab: $!";
#-----------------------------------------------------------------------------#
# Alter /etc/event.d
#-----------------------------------------------------------------------------#
unlink "/etc/init/control-alt-delete.conf"
unless $have_cad;
foreach (qw/tty1 tty2 tty3 tty4 tty5 tty6/) {
unlink "/etc/init/$_.conf"
unless exists $gettys{$_};
}
foreach (sort keys %gettys) {
my ($rlevel, $process) = @{$gettys{$_}};
my @job;
if (-f "/etc/event.d/$_") {
open JOB, "/etc/event.d/$_"
or warn "Unable to open /etc/event.d/$_: $!" and next;
@job = <JOB>;
chomp @job;
close JOB
or warn "Error while closing /etc/event,d/$_: $!" and next;
foreach my $rl (qw/2 3 4 5/) {
my $idx;
for ($idx = 0; $idx < @job; $idx++) {
last if $job[$idx] =~ /^\s*(start|stop)\s+on\s+runlevel\s+$rl\b/;
}
if ($idx < @job) {
if ($rlevel =~ /$rl/) {
$job[$idx] =~ s/^(\s*)stop(\s+)/$1start$2/;
} else {
$job[$idx] =~ s/^(\s*)start(\s+)/$1stop$2/;
}
} else {
if ($rlevel =~ /$rl/) {
push @job, "start on runlevel $rl";
} else {
push @job, "stop on runlevel $rl";
}
}
}
my $idx;
for ($idx = 0; $idx < @job; $idx++) {
last if $job[$idx] =~ /^\s*respawn\s*/; # match bare 'respawn' too
}
if ($idx < @job) {
# only match old-style 'respawn process', not bare 'respawn'
$job[$idx] =~ s/^(\s*respawn\s+).*/$1$process/;
} else {
push @job, "respawn";
push @job, "exec $process";
}
# Try to fix up effects of previous broken migrations
if (@job and $job[$#job] =~ /.*(.+?)exec (\1)$/) {
$job[$#job] = "exec $1";
}
} else {
push @job, "# $_ - getty";
push @job, "#";
push @job, "# Converted from /etc/inittab entry";
push @job, "";
foreach my $rl (qw/2 3 4 5/) {
if ($rlevel =~ /$rl/) {
push @job, "start on runlevel $rl";
} else {
push @job, "stop on runlevel $rl";
}
}
push @job, "";
push @job, "stop on shutdown";
push @job, "";
push @job, "respawn";
push @job, "exec $process";
}
open JOB, ">/etc/event.d/.$_"
or warn "Unable to write to /etc/event.d/.$_: $!" and next;
print JOB map { "$_\n" } @job;
unless (close JOB) {
warn "Error while closing /etc/event.d/.$_: $!";
unlink "/etc/event.d/.$_";
next;
}
unless (rename "/etc/event.d/.$_", "/etc/event.d/$_") {
warn "Unable to replace /etc/event.d/$_: $!";
unlink "/etc/event.d/.$_";
next;
}
}
|