188715ce3163b91fea77ec062f470396c1592a59
[darcs-mirror-metainit.git] / translators / sysvinit.pl
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5
6 use Parse;
7
8 my $metainit_dir = './examples';
9 my $etc = './etc';
10 my $utils = '.';
11 my $updatercd = './update-rc.d';
12
13 #
14 # Rough plan of operation:
15 #    (Maybe:
16 #     Check all init files, find all generated ones, see if the metainit 
17 #     file is missing and delete them then)
18 #    Check all metainit files, whether the init.d file is out of date.
19 #    If the init.d file was created, find a suitable rc2.d/ number and run update-rc.
20 #
21
22 use Getopt::Long;
23
24 my $remove = '';
25 GetOptions( 'remove-metainit=s' => \$remove );
26
27 if ($remove) {
28         # Operation: Remove all geranted files for the given metainit name
29         remove($remove)
30 } else {
31         # Operation: Rebuild everything
32         
33         #check_orphaned_initscripts()
34         my @metainits = read_metainits();
35         my @generated = ();
36         foreach my $metainit (@metainits) {
37                 my $created = regenerate_initscript($metainit);
38                 push @generated, $metainit->{Name} if $created;
39         }
40
41         my %arrangement = ();
42         open(ARRANGE, '-|',"$utils/arrange-sysvinit.pl",@generated) or die $!;
43         while (<ARRANGE>) {
44                 if (/^([\w\.-]+) (\d\d)$/){
45                         $arrangement{$1} = $2;
46                 } else {
47                         die "Can't parse $_";
48                 }
49         }
50         close ARRANGE;
51
52         while (my ($initname,$num) = each %arrangement) {
53                 system($updatercd, $initname, "defaults", $num);
54         }
55
56
57 }
58
59 sub read_metainits{
60         my @metainits;
61         for my $metainit_file (<$metainit_dir/*.metainit>) {
62                 push @metainits, Parse::parse($metainit_file);
63         }
64         return @metainits;
65 }
66
67 sub regenerate_initscript {
68         my ($metainit) = @_;
69         my $initscript = init_script_name($metainit);
70         my $new = not -e $initscript;
71
72         
73         if (not $new) {
74                 my $can_touch = 0;
75                 open INIT, '<', $initscript or die $!;
76                 while (<INIT>) {
77                         if (/DO NOT EDIT THIS FILE/) {
78                                 $can_touch = 1;
79                                 last;
80                         }
81                 }
82                 close INIT;
83                 return 0 if (not $can_touch);
84         } else {
85                 # Here me might want to check if the file is up-to-date.
86                 # For now, we just override it always.
87         }
88
89         system("$utils/create-sysvinit-file.pl", $metainit->{File}, $initscript);
90
91         return $new;
92
93 }
94
95 sub init_script_name {
96         my ($metainit) = @_;
97         return sprintf "%s/init.d/%s", $etc, $metainit->{Name};
98 }
99
100 sub remove {
101         die "Remove not yet implemented"
102 }