]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
systemctl: Create new unit files with "edit --force" (#3584)
authorDoug Christman <douglaschristman@gmail.com>
Fri, 24 Jun 2016 06:00:35 +0000 (02:00 -0400)
committerMartin Pitt <martin.pitt@ubuntu.com>
Fri, 24 Jun 2016 06:00:35 +0000 (08:00 +0200)
TODO
man/systemctl.xml
src/systemctl/systemctl.c

diff --git a/TODO b/TODO
index 8de1029b9b77c1e03c9e70af1c078c59ed39d5c2..0d18e0734bca27b10b2e226c5ef10b17de77ab43 100644 (file)
--- a/TODO
+++ b/TODO
@@ -197,9 +197,7 @@ Features:
 
 * systemctl: if some operation fails, show log output?
 
-* systemctl edit:
-- allow creation of units from scratch
-- use equvalent of cat() to insert existing config as a comment, prepended with #.
+* systemctl edit: use equvalent of cat() to insert existing config as a comment, prepended with #.
   Upon editor exit, lines with one # are removed, lines with two # are left with one #, etc.
 
 * exponential backoff in timesyncd when we cannot reach a server
index 914af929c8ef362d006756a6e1dc9b733bee09cb..742da81cfece92b9faceb195f8c291ee23d6fd14 100644 (file)
           <para>When used with <command>enable</command>, overwrite
           any existing conflicting symlinks.</para>
 
+          <para>When used with <command>edit</command>, create all of the
+          specified units which do not already exist.</para>
+
           <para>When used with <command>halt</command>, <command>poweroff</command>, <command>reboot</command> or
           <command>kexec</command>, execute the selected operation without shutting down all units. However, all
           processes will be killed forcibly and all file systems are unmounted or remounted read-only. This is hence a
@@ -1303,6 +1306,9 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
             <para>If <option>--full</option> is specified, this will copy the
             original units instead of creating drop-in files.</para>
 
+            <para>If <option>--force</option> is specified and any units do
+            not already exist, new unit files will be opened for editing.</para>
+
             <para>If <option>--runtime</option> is specified, the changes will
             be made temporarily in <filename>/run</filename> and they will be
             lost on the next reboot.</para>
index 38b5a7e0824b47c4cab786a00256b0437b8aa3f6..0a8e60c1957dacda3a1bf9719703ec111ca940c9 100644 (file)
@@ -2499,7 +2499,7 @@ static int unit_find_paths(
                 r = 1;
         }
 
-        if (r == 0)
+        if (r == 0 && !arg_force)
                 log_error("No files found for %s.", unit_name);
 
         return r;
@@ -6070,7 +6070,7 @@ static int create_edit_temp_file(const char *new_path, const char *original_path
                         return log_error_errno(r, "Failed to create temporary file \"%s\": %m", t);
 
         } else if (r < 0)
-                return log_error_errno(r, "Failed to copy \"%s\" to \"%s\": %m", original_path, t);
+                return log_error_errno(r, "Failed to create temporary file for \"%s\": %m", new_path);
 
         *ret_tmp_fn = t;
         t = NULL;
@@ -6114,9 +6114,10 @@ static int get_file_to_edit(
         return 0;
 }
 
-static int unit_file_create_dropin(
+static int unit_file_create_new(
                 const LookupPaths *paths,
                 const char *unit_name,
+                const char *suffix,
                 char **ret_new_path,
                 char **ret_tmp_path) {
 
@@ -6127,7 +6128,7 @@ static int unit_file_create_dropin(
         assert(ret_new_path);
         assert(ret_tmp_path);
 
-        ending = strjoina(unit_name, ".d/override.conf");
+        ending = strjoina(unit_name, suffix);
         r = get_file_to_edit(paths, ending, &tmp_new_path);
         if (r < 0)
                 return r;
@@ -6180,7 +6181,6 @@ static int unit_file_create_copy(
 
         r = create_edit_temp_file(tmp_new_path, fragment_path, &tmp_tmp_path);
         if (r < 0) {
-                log_error_errno(r, "Failed to create temporary file for \"%s\": %m", tmp_new_path);
                 free(tmp_new_path);
                 return r;
         }
@@ -6291,18 +6291,26 @@ static int find_paths_to_edit(sd_bus *bus, char **names, char ***paths) {
                 r = unit_find_paths(bus, *name, &lp, &path, NULL);
                 if (r < 0)
                         return r;
-                else if (r == 0)
-                        return -ENOENT;
-                else if (!path) {
-                        // FIXME: support units with path==NULL (no FragmentPath)
-                        log_error("No fragment exists for %s.", *name);
-                        return -ENOENT;
+                else if (!arg_force) {
+                        if (r == 0) {
+                                log_error("Run 'systemctl edit --force %s' to create a new unit.", *name);
+                                return -ENOENT;
+                        } else if (!path) {
+                                // FIXME: support units with path==NULL (no FragmentPath)
+                                log_error("No fragment exists for %s.", *name);
+                                return -ENOENT;
+                        }
+                }
+
+                if (path) {
+                        if (arg_full)
+                                r = unit_file_create_copy(&lp, *name, path, &new_path, &tmp_path);
+                        else
+                                r = unit_file_create_new(&lp, *name, ".d/override.conf", &new_path, &tmp_path);
+                } else {
+                        r = unit_file_create_new(&lp, *name, NULL, &new_path, &tmp_path);
                 }
 
-                if (arg_full)
-                        r = unit_file_create_copy(&lp, *name, path, &new_path, &tmp_path);
-                else
-                        r = unit_file_create_dropin(&lp, *name, &new_path, &tmp_path);
                 if (r < 0)
                         return r;