be more careful when dumping sysrepo configuration

I've seen one lab device with a zero-size JSON file, which obviously
cannot be restored. That's fishy and this should not happen, so let's
try to be a bit more robust when creating that file:

- do not overwrite in place (which might hit a FS race and cause an
  empty file)
- check that sysrepocfg produced "some data" (if it crashed early
  enough, it would previously still have been an empty file due to the
  output redirection)

The actual writeout is a bit more involved than I would prefer, and
because I want locking (thanks, Tomas), I think it's easier to use two
scripts for this one.

Change-Id: I43fccd3a49cae77f88b282ccac07471453910c25
diff --git a/package/czechlight-cfg-fs/cfg-save-sysrepo b/package/czechlight-cfg-fs/cfg-save-sysrepo
new file mode 100755
index 0000000..fcf302c
--- /dev/null
+++ b/package/czechlight-cfg-fs/cfg-save-sysrepo
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+exec flock /cfg/sysrepo/startup.json.2 /sbin/impl-cfg-save-sysrepo
diff --git a/package/czechlight-cfg-fs/czechlight-cfg-fs.mk b/package/czechlight-cfg-fs/czechlight-cfg-fs.mk
index 6a26dfc..e816275 100644
--- a/package/czechlight-cfg-fs/czechlight-cfg-fs.mk
+++ b/package/czechlight-cfg-fs/czechlight-cfg-fs.mk
@@ -43,6 +43,8 @@
 
 	$(INSTALL) -D -m 0755 -t $(TARGET_DIR)/sbin \
 		$(BR2_EXTERNAL_CZECHLIGHT_PATH)/package/czechlight-cfg-fs/init-czechlight.sh \
+		$(BR2_EXTERNAL_CZECHLIGHT_PATH)/package/czechlight-cfg-fs/cfg-save-sysrepo \
+		$(BR2_EXTERNAL_CZECHLIGHT_PATH)/package/czechlight-cfg-fs/impl-cfg-save-sysrepo \
 		$(@D)/czechlight-random-seed
 
 	$(INSTALL) -D -m 0644 -t $(TARGET_DIR)/usr/share/yang-data/ \
diff --git a/package/czechlight-cfg-fs/impl-cfg-save-sysrepo b/package/czechlight-cfg-fs/impl-cfg-save-sysrepo
new file mode 100644
index 0000000..385503f
--- /dev/null
+++ b/package/czechlight-cfg-fs/impl-cfg-save-sysrepo
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+CONFIG_FILE=/cfg/sysrepo/startup.json
+NEW_COPY=/cfg/sysrepo/startup.json.2
+
+sysrepocfg -d startup -f json -X > ${NEW_COPY}
+if [ ! -s ${NEW_COPY} ]; then
+    logger -p user.emerg "Corrupted sysrepo configuration dump"
+    exit 1
+fi
+sync ${NEW_COPY}
+mv ${NEW_COPY} ${CONFIG_FILE}
+sync ${CONFIG_FILE}
diff --git a/package/czechlight-cfg-fs/sysrepo-persistent-cfg.service b/package/czechlight-cfg-fs/sysrepo-persistent-cfg.service
index 25991f4..0c961e5 100644
--- a/package/czechlight-cfg-fs/sysrepo-persistent-cfg.service
+++ b/package/czechlight-cfg-fs/sysrepo-persistent-cfg.service
@@ -6,6 +6,6 @@
 [Service]
 Type=simple
 UMask=0077
-ExecStartPre=/bin/sh -c 'mkdir -p /cfg/sysrepo/ && sysrepocfg -d startup -f json -X > /cfg/sysrepo/startup.json'
-ExecStart=/bin/sh -c 'while true; do inotifywait -e CLOSE_WRITE /etc/sysrepo/data/*.startup && sysrepocfg -d startup -f json -X > /cfg/sysrepo/startup.json; done'
+ExecStartPre=/bin/sh -c 'mkdir -p /cfg/sysrepo/ && cfg-save-sysrepo'
+ExecStart=/bin/sh -c 'while true; do inotifywait -e CLOSE_WRITE /etc/sysrepo/data/*.startup && cfg-save-sysrepo; done'
 Group=sysrepo