[system-tools-backends-clone] Allow committing boot services separately



commit 59ee7aad72e8854c179fe67a53b3cbec2b3f0065
Author: Milan Bouchet-Valat <nalimilan club fr>
Date:   Tue Jan 26 19:11:36 2010 +0100

    Allow committing boot services separately
    
    Just like users and groups, we shouldn't commit all services at the same time, since this often leads to breaking services that should not have been touched at all. Create a new ServiceConfig module that runs new set_service() and get_service() functions. These are calling platform-dependent equivalents created by moving the relevant code out of global set() functions. Committing all ServicesConfig at once is still supported since it doesn't conflict with the new module. We call it ServiceConfig2 to be consistent with the new modules created with the same design in mind.

 Init/Services.pm                                   |  232 ++++++++++++-------
 Makefile.am                                        |    1 +
 ServicesConfig.pm                                  |    3 +-
 configure.in                                       |    1 +
 org.freedesktop.SystemToolsBackends.conf           |    3 +
 services/Makefile.am                               |    1 +
 ...p.SystemToolsBackends.ServiceConfig2.service.in |    4 +
 7 files changed, 158 insertions(+), 87 deletions(-)
---
diff --git a/Init/Services.pm b/Init/Services.pm
index f99e6f2..f7b014f 100644
--- a/Init/Services.pm
+++ b/Init/Services.pm
@@ -824,38 +824,43 @@ sub run_bsd_script
   }
 }
 
-# This function stores the configuration in a bsd init
-sub set_bsd_services
+sub set_bsd_service
 {
-  my ($services) = @_;
-  my ($script, $runlevels, %scripts);
-  my ($status);
+  my ($service) = @_;
+  my ($script, $runlevels, $status, %scripts);
 
   $scripts = &get_bsd_scripts_list ();
+  $script = $$scripts{$$service[0]};
+  $runlevels = $$service[1];
+  $runlevel  = $$runlevels[0];
 
-  foreach $service (@$services)
-  {
-    $script = $$scripts{$$service[0]};
-    $runlevels = $$service[1];
-    $runlevel  = $$runlevels[0];
+  next if ($script eq undef);
 
-    next if ($script eq undef);
+  $status = $$runlevel[1];
+  $status = $SERVICE_STOP if ($status eq undef);
 
-    $status = $$runlevel[1];
-    $status = $SERVICE_STOP if ($status eq undef);
+  next if ($status == &get_bsd_service_status ($script));
 
-    next if ($status == &get_bsd_service_status ($script));
+  if ($status == $SERVICE_START)
+  {
+    &Utils::File::run ("chmod", "ugo+x", $script);
+    &run_bsd_script ($script, "start");
+  }
+  else
+  {
+    &run_bsd_script ($script, "stop");
+    &Utils::File::run ("chmod", "ugo-x", $script);
+  }
+}
 
-    if ($status == $SERVICE_START)
-    {
-      &Utils::File::run ("chmod", "ugo+x", $script);
-      &run_bsd_script ($script, "start");
-    }
-    else
-    {
-      &run_bsd_script ($script, "stop");
-      &Utils::File::run ("chmod", "ugo-x", $script);
-    }
+# This function stores the configuration in a bsd init
+sub set_bsd_services
+{
+  my ($services) = @_;
+
+  foreach $service (@$services)
+  {
+    &set_bsd_service ($service);
   }
 }
 
@@ -1037,27 +1042,34 @@ sub set_gentoo_service_status
   }
 }
 
-# This function stores the configuration in gentoo init
-sub set_gentoo_services
+sub set_gentoo_service
 {
-  my ($services) = @_;
+  my ($service) = @_;
   my ($action, $rl, $script, $arr);
   my ($runlevels_services) = &get_gentoo_runlevels_services ();
 
   return if (!$runlevels_services);
 
-  foreach $service (@$services)
+  $script = $$service[0];
+  $arr = $$service[1];
+
+  foreach $i (@$arr)
   {
-    $script = $$service[0];
-    $arr = $$service[1];
+    $action = $$i[1];
+    $rl = $$i[0];
+    &set_gentoo_service_status ($script, $rl, $action,
+                                $runlevels_services);
+  }
+}
 
-    foreach $i (@$arr)
-    {
-      $action = $$i[1];
-      $rl = $$i[0];
-      &set_gentoo_service_status ($script, $rl, $action,
-                                  $runlevels_services);
-    }
+# This function stores the configuration in gentoo init
+sub set_gentoo_services
+{
+  my ($services) = @_;
+
+  foreach $service (@$services)
+  {
+    &set_gentoo_service ($service);
   }
 }
 
@@ -1229,9 +1241,9 @@ sub set_archlinux_service_status
   &run_rcng_script ($service, ($active) ? "start" : "stop");
 }
 
-sub set_rcng_services
+sub set_rcng_service
 {
-  my ($services) = @_;
+  my ($service) = @_;
   my ($action, $runlevels, $script, $func);
 
   # archlinux stores services differently
@@ -1244,14 +1256,21 @@ sub set_rcng_services
     $func = \&set_rcng_service_status;
   }
 
+  $script    = $$service[0];
+  $runlevels = $$service[1];
+  $runlevel  = $$runlevels[0];
+  $action    = ($$runlevel[1] == $SERVICE_START)? 1 : 0;
+
+  &$func ($script, $action);
+}
+
+sub set_rcng_services
+{
+  my ($services) = @_;
+
   foreach $service (@$services)
   {
-    $script    = $$service[0];
-    $runlevels = $$service[1];
-    $runlevel  = $$runlevels[0];
-    $action    = ($$runlevel[1] == $SERVICE_START)? 1 : 0;
-
-    &$func ($script, $action);
+    &set_rcng_services ($service);
   }
 }
 
@@ -1299,47 +1318,52 @@ sub get_suse_services
   return \ arr;
 }
 
-# This function stores the configuration in suse init
-sub set_suse_services
+sub set_suse_service
 {
-  my ($services) = @_;
+  my ($service) = @_;
   my ($action, $runlevels, $script, $rllist);
-  my (%configured_runlevels, $default_runlevel);
+  my (%configured_runlevelsl);
 
-  $default_runlevel = &get_sysv_default_runlevel ();
-
-  foreach $service (@$services)
-  {
-    $script = $$service[0];
-    $runlevels = $$service[1];
-    $rllist = "";
-    %configured_runlevels = {};
+  $script = $$service[0];
+  $runlevels = $$service[1];
+  $rllist = "";
+  %configured_runlevels = {};
 
-    &Utils::File::run ("insserv", "-r", $script);
+  &Utils::File::run ("insserv", "-r", $script);
 
-    foreach $rl (@$runlevels)
+  foreach $rl (@$runlevels)
+  {
+    $configured_runlevels{$$rl[0]} = 1;
+     if ($$rl[1] == $SERVICE_START)
     {
-      $configured_runlevels{$$rl[0]} = 1;
+      $rllist .= $$rl[0] . ",";
+    }
+     &run_sysv_initd_script ($script, ($$rl[1] == $SERVICE_START) ? "start" : "stop");
+  }
 
-      if ($$rl[1] == $SERVICE_START)
-      {
-        $rllist .= $$rl[0] . ",";
-      }
+  if ($rllist ne "")
+  {
+    $rllist =~ s/,$//;
+     &Utils::File::run ("insserv", $script, "start=$rllist");
+  }
 
-      &run_sysv_initd_script ($script, ($$rl[1] == $SERVICE_START) ? "start" : "stop");
-    }
+  if (!$configured_runlevels{$default_runlevel})
+  {
+    &run_sysv_initd_script ($script, $$rl[1]);
+  }
+}
 
-    if ($rllist ne "")
-    {
-      $rllist =~ s/,$//;
+# This function stores the configuration in suse init
+sub set_suse_services
+{
+  my ($services) = @_;
+  my ($default_runlevel);
 
-      &Utils::File::run ("insserv", $script, "start=$rllist");
-    }
+  $default_runlevel = &get_sysv_default_runlevel ();
 
-    if (!$configured_runlevels{$default_runlevel})
-    {
-      &run_sysv_initd_script ($script, $$rl[1]);
-    }
+  foreach $service (@$services)
+  {
+    &set_suse_service ($service);
   }
 }
 
@@ -1476,22 +1500,29 @@ sub set_smf_service_status
   }
 }
 
+sub set_smf_service
+{
+  my ($service) = @_;
+  my ($action, $rl, $script, $arr);
+
+  $script = $$service[0];
+  $arr = $$service[1];
+
+  foreach $i (@$arr)
+  {
+    $action = $$i[1];
+    $rl = $$i[0];
+    &set_smf_service_status ($script, $rl, $action);
+  }
+}
+
 sub set_smf_services
 {
   my ($services) = @_;
-  my ($action, $rl, $script, $arr);
 
   foreach $service (@$services)
   {
-    $script = $$service[0];
-    $arr = $$service[1];
-
-    foreach $i (@$arr)
-    {
-      $action = $$i[1];
-      $rl = $$i[0];
-      &set_smf_service_status ($script, $rl, $action);
-    }
+    &set_smf_service ($service);
   }
 }
 
@@ -1571,7 +1602,7 @@ sub get
 
 sub set
 {
-	my ($services) = @_;
+  my ($services) = @_;
 
   $type = &get_init_type ();
 
@@ -1585,4 +1616,33 @@ sub set
   &set_smf_services     ($services) if ($type eq "smf");
 }
 
+sub get_service
+{
+  my ($name) = @_;
+  my ($services) = &get ();
+
+  foreach $service (@$services)
+  {
+    return $service if ($service[0] eq $name);
+  }
+
+  return undef;
+}
+
+sub set_service
+{
+  my ($service) = @_;
+
+  $type = &get_init_type ();
+
+  &set_upstart_service ($service) if ($type eq "upstart");
+  &set_sysv_service    ($service) if ($type eq "sysv");
+  &set_filerc_service  ($service) if ($type eq "file-rc");
+  &set_bsd_service     ($service) if ($type eq "bsd");
+  &set_gentoo_service  ($service) if ($type eq "gentoo");
+  &set_rcng_service    ($service) if ($type eq "rcng");
+  &set_suse_service    ($service) if ($type eq "suse");
+  &set_smf_service     ($service) if ($type eq "smf");
+}
+
 1;
diff --git a/Makefile.am b/Makefile.am
index 2b7babe..44e7efd 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -14,6 +14,7 @@ modules_DATA =	\
 	IfacesConfig.pm	\
 	NFSConfig.pm		\
 	NTPConfig.pm		\
+	ServiceConfig.pm	\
 	ServicesConfig.pm	\
 	SMBConfig.pm		\
 	TimeConfig.pm		\
diff --git a/ServicesConfig.pm b/ServicesConfig.pm
index 04a394b..2c0d7f7 100644
--- a/ServicesConfig.pm
+++ b/ServicesConfig.pm
@@ -25,12 +25,13 @@ package ServicesConfig;
 use base qw(StbObject);
 use Net::DBus::Exporter ($Utils::Backend::DBUS_PREFIX);
 use Init::Services;
+use ServiceConfig;
 
 my $OBJECT_NAME = "ServicesConfig";
 my $OBJECT_PATH = "$Utils::Backend::DBUS_PATH/$OBJECT_NAME";
 my $format = [[ "array", "string" ],
               "string",
-              [ "array", [ "struct", "string", [ "array", [ "struct", "string", "int32", "int32" ]]]]];
+              [ "array", $ServiceConfig::SERVICE_FORMAT ]];
 
 sub new
 {
diff --git a/configure.in b/configure.in
index af8ac9c..fd2a310 100644
--- a/configure.in
+++ b/configure.in
@@ -174,6 +174,7 @@ services/org.freedesktop.SystemToolsBackends.NFSConfig.service
 services/org.freedesktop.SystemToolsBackends.NTPConfig.service
 services/org.freedesktop.SystemToolsBackends.Platform.service
 services/org.freedesktop.SystemToolsBackends.SelfConfig2.service
+services/org.freedesktop.SystemToolsBackends.ServiceConfig2.service
 services/org.freedesktop.SystemToolsBackends.ServicesConfig.service
 services/org.freedesktop.SystemToolsBackends.SMBConfig.service
 services/org.freedesktop.SystemToolsBackends.TimeConfig.service
diff --git a/org.freedesktop.SystemToolsBackends.conf b/org.freedesktop.SystemToolsBackends.conf
index e4b1b35..fc31ff0 100644
--- a/org.freedesktop.SystemToolsBackends.conf
+++ b/org.freedesktop.SystemToolsBackends.conf
@@ -13,6 +13,7 @@
     <allow own="org.freedesktop.SystemToolsBackends.IfacesConfig"/>
     <allow own="org.freedesktop.SystemToolsBackends.NFSConfig"/>
     <allow own="org.freedesktop.SystemToolsBackends.NTPConfig"/>
+    <allow own="org.freedesktop.SystemToolsBackends.ServiceConfig2"/>
     <allow own="org.freedesktop.SystemToolsBackends.ServicesConfig"/>
     <allow own="org.freedesktop.SystemToolsBackends.SMBConfig"/>
     <allow own="org.freedesktop.SystemToolsBackends.TimeConfig"/>
@@ -37,6 +38,7 @@
     <allow own="org.freedesktop.SystemToolsBackends.IfacesConfig"/>
     <allow own="org.freedesktop.SystemToolsBackends.NFSConfig"/>
     <allow own="org.freedesktop.SystemToolsBackends.NTPConfig"/>
+    <allow own="org.freedesktop.SystemToolsBackends.ServiceConfig2"/>
     <allow own="org.freedesktop.SystemToolsBackends.ServicesConfig"/>
     <allow own="org.freedesktop.SystemToolsBackends.SMBConfig"/>
     <allow own="org.freedesktop.SystemToolsBackends.TimeConfig"/>
@@ -56,6 +58,7 @@
     <allow send_destination="org.freedesktop.SystemToolsBackends.IfacesConfig"/>
     <allow send_destination="org.freedesktop.SystemToolsBackends.NFSConfig"/>
     <allow send_destination="org.freedesktop.SystemToolsBackends.NTPConfig"/>
+    <allow send_destination="org.freedesktop.SystemToolsBackends.ServiceConfig2"/>
     <allow send_destination="org.freedesktop.SystemToolsBackends.ServicesConfig"/>
     <allow send_destination="org.freedesktop.SystemToolsBackends.SMBConfig"/>
     <allow send_destination="org.freedesktop.SystemToolsBackends.TimeConfig"/>
diff --git a/services/Makefile.am b/services/Makefile.am
index 57f0b1c..70d132d 100644
--- a/services/Makefile.am
+++ b/services/Makefile.am
@@ -7,6 +7,7 @@ services = \
 	org.freedesktop.SystemToolsBackends.NTPConfig.service \
         org.freedesktop.SystemToolsBackends.Platform.service \
 	org.freedesktop.SystemToolsBackends.SelfConfig2.service \
+        org.freedesktop.SystemToolsBackends.ServiceConfig2.service \
         org.freedesktop.SystemToolsBackends.ServicesConfig.service \
 	org.freedesktop.SystemToolsBackends.SMBConfig.service \
 	org.freedesktop.SystemToolsBackends.TimeConfig.service \
diff --git a/services/org.freedesktop.SystemToolsBackends.ServiceConfig2.service.in b/services/org.freedesktop.SystemToolsBackends.ServiceConfig2.service.in
new file mode 100644
index 0000000..e7bd93e
--- /dev/null
+++ b/services/org.freedesktop.SystemToolsBackends.ServiceConfig2.service.in
@@ -0,0 +1,4 @@
+[D-BUS Service]
+Name=org.freedesktop.SystemToolsBackends.ServiceConfig2
+Exec= scriptsdir@/SystemToolsBackends.pl -m ServiceConfig
+User=root



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]