Add report on diff of users in portal vs. AFS
[hcoop/zz_old/portal.git] / init.sml
index 9352b3e..c5f5fa9 100644 (file)
--- a/init.sml
+++ b/init.sml
@@ -101,6 +101,11 @@ fun listUsers () =
                                  FROM WebUser
                                  ORDER BY name`)
 
+fun listActiveUsers () =
+    C.map (getDb ()) mkUserRow ($`SELECT id, name, rname, bal, joined, app, shares
+                                 FROM WebUserActive
+                                 ORDER BY name`)
+
 fun nextSeq (db, seq) =
     case C.oneRow db ($`SELECT nextval('^(seq)')`) of
        [id] => C.intFromSql id
@@ -132,7 +137,7 @@ fun byPledge () =
     C.map (getDb ()) mkUserRow ($`SELECT id, name, rname, bal, joined, app, shares
                                  FROM WebUser
                                  WHERE shares > 1
-                                 ORDER BY shares DESC`)    
+                                 ORDER BY shares DESC, name`)
 
 fun deleteUser id =
     C.dml (getDb ()) ($`DELETE FROM WebUser WHERE id = ^(C.intToSql id)`)
@@ -203,4 +208,79 @@ fun nodeDebian id =
        [debian] => C.stringFromSql debian
       | row => rowError ("nodeDebian", row)
 
+fun explain e =
+    case e of
+       OS.SysErr (name, sop) =>
+       "System error: " ^ name ^
+       (case sop of
+            NONE => ""
+          | SOME syserr => ": " ^ OS.errorName syserr ^ ": " ^ OS.errorMsg syserr)
+      | _ => "Unknown"
+
+fun tokens () =
+    let
+       val proc = Unix.execute ("/usr/bin/tokens", [])
+       val inf = Unix.textInstreamOf proc
+
+       fun reader acc =
+           case TextIO.inputLine inf of
+               NONE => String.concat (rev acc)
+             | SOME s => reader (s :: acc)
+    in
+       reader []
+       before (TextIO.closeIn inf;
+               ignore (Unix.reap proc))
+    end
+
+fun tokensForked () =
+    case Posix.Process.fork () of
+       NONE => (OS.Process.system "/usr/bin/tokens >/tmp/tokens.child";
+                OS.Process.exit OS.Process.success)
+      | _ => ignore (OS.Process.system "/usr/bin/tokens >/tmp/tokens.parent")
+
+fun unmigratedUsers () =
+    List.filter (fn user =>
+                   (ignore (Posix.SysDB.getpwnam (#name user));
+                    false)
+                   handle OS.SysErr _ => true) (listActiveUsers ())
+
+fun usersDiff (ls1, ls2) =
+    {onlyInFirst = List.filter (fn x => not (Util.mem (x, ls2))) ls1,
+     onlyInSecond = List.filter (fn x => not (Util.mem (x, ls1))) ls2}
+
+fun listUsernames () = C.map (getDb ())
+                            (fn [name] => C.stringFromSql name
+                              | row => rowError ("listUsernames", row))
+                            "SELECT name FROM WebUserActive ORDER BY name"
+fun usersInAfs () =
+    let
+       fun explore (dir, level, acc) =
+           if level = 3 then
+               dir :: acc
+           else
+               let
+                   val dr = Posix.FileSys.opendir dir
+
+                   fun loop acc =
+                       case Posix.FileSys.readdir dr of
+                           NONE => acc
+                         | SOME name =>
+                           let
+                               val dir' = OS.Path.joinDirFile {dir = dir,
+                                                               file = name}
+
+                               val acc = explore (dir', level+1, acc)
+                           in
+                               loop acc
+                           end
+               in
+                   loop acc
+                   before Posix.FileSys.closedir dr
+               end
+
+       val acc = explore ("/afs/hcoop.net/user", 0, [])
+    in
+       List.map OS.Path.file acc
+    end
+
 end