Explorar el Código

New command-line option 'fsck'.

grunfink hace 10 meses
padre
commit
c541296f25
Se han modificado 3 ficheros con 66 adiciones y 0 borrados
  1. 58 0
      data.c
  2. 6 0
      main.c
  3. 2 0
      snac.h

+ 58 - 0
data.c

@@ -4362,3 +4362,61 @@ const char *lang_str(const char *str, const snac *user)
 
     return n_str;
 }
+
+
+/** integrity checks **/
+
+void data_fsck(void)
+{
+    xs *list = user_list();
+    const char *uid;
+
+    xs_list_foreach(list, uid) {
+        snac user;
+
+        if (!user_open(&user, uid))
+            continue;
+
+        {
+            /* iterate all private posts and check that non-public posts
+               from this user are also linked into the public directory,
+               to avoid the don't-fucking-delete-my-own-private-posts purge bug */
+
+            xs *priv_spec = xs_fmt("%s/private/""*.json", user.basedir);
+            xs *posts = xs_glob(priv_spec, 0, 0);
+            const char *priv_fn;
+
+            xs_list_foreach(posts, priv_fn) {
+                xs *pub_fn = xs_replace(priv_fn, "/private/", "/public/");
+
+                /* already there? look no more */
+                if (mtime(pub_fn))
+                    continue;
+
+                /* read the post */
+                FILE *f;
+                if ((f = fopen(priv_fn, "r")) == NULL)
+                    continue;
+
+                xs *post = xs_json_load(f);
+                fclose(f);
+
+                if (!xs_is_dict(post))
+                    continue;
+
+                const char *attr_to = get_atto(post);
+
+                if (!xs_is_string(attr_to) || strcmp(attr_to, user.actor) != 0) {
+                    /* not from this user */
+                    continue;
+                }
+
+                /* link */
+                snac_log(&user, xs_fmt("fsck: fixed missing link %s", xs_dict_get(post, "id")));
+                link(priv_fn, pub_fn);
+            }
+        }
+
+        user_free(&user);
+    }
+}

+ 6 - 0
main.c

@@ -34,6 +34,7 @@ int usage(const char *cmd)
         "httpd {basedir}                      Starts the HTTPD daemon\n"
         "purge {basedir}                      Purges old data\n"
         "state {basedir}                      Prints server state\n"
+        "fsck {basedir}                       Performs a non-destructive data integrity check\n"
         "webfinger {basedir} {account}        Queries about an account (@user@host or actor url)\n"
         "queue {basedir} {uid}                Processes a user queue\n"
         "follow {basedir} {uid} {actor}       Follows an actor\n"
@@ -200,6 +201,11 @@ int main(int argc, char *argv[])
         return 0;
     }
 
+    if (strcmp(cmd, "fsck") == 0) { /** **/
+        data_fsck();
+        return 0;
+    }
+
     if ((user = GET_ARGV()) == NULL)
         return usage(cmd);
 

+ 2 - 0
snac.h

@@ -477,3 +477,5 @@ xs_str *rss_from_timeline(snac *user, const xs_list *timeline,
                         const char *title, const char *link, const char *desc);
 void rss_to_timeline(snac *user, const char *url);
 void rss_poll_hashtags(void);
+
+void data_fsck(void);