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
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)`)
[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