const route = require("express").Router(); const {exec} = require("child_process") const { getUsers, removeUserScope, blockUser, unblockUser, addUserScope } = require("../arangodb"); const {verifyToken} = require("../checkToken"); const { mkdir, readFileSync, writeFileSync } = require("fs"); const getDeviceData = (dev)=>new Promise((res, rej)=>{ exec(`blkid`, (err, out)=>{ if(err){ rej({error: 500, message:err}) }else{ const output = out.split("\n").map((line)=>{ const lineitems = line.split(/[:"] {1,}/); const lineobj = {dev: lineitems.shift()} lineitems.forEach((item)=>{ const [key, val] = item.split("="); // console.log(key) lineobj[key]=val.replace(/"/g, "") }) return lineobj }) const found = output.find((item)=>item.dev==dev); if(found){ res(found) }else{ rej({error: 404, message:`${dev} not found in block device list`}) } } }) }) route.get("/users", verifyToken, (req, res)=>{ getUsers(["name", "blocked", "id", "scopes"]).then((users)=>{ res.json(users.map(({name, blocked, id, scopes})=>({id, name, blocked, scopes}))) }) }) route.post("/removescope", verifyToken, (req, res)=>{ removeUserScope(req.body.uid, req.body.scope).then(()=>{ res.end() }, ({error, message})=>{ res.status(error).json(message) }) }) route.post("/addscope", verifyToken, (req, res)=>{ addUserScope(req.body.uid, req.body.scope).then(()=>{ res.end() }, ({error, message})=>{ res.status(error).json(message) }) }) route.post("/unmount", verifyToken, (req, res)=>{ const {mount} = req.body if(mount){ exec(`umount ${mount} `, (err, out, serr)=>{ if(err){ res.status(500).json(`failed to unmount ${mount}`) }else{ const fstab = readFileSync("/etc/fstab").toString().split("\n") writeFileSync("/etc/fstab", fstab.filter((line)=>!line.match(new RegExp(mount))).join("\n")) res.end() } }) }else{ res.status(400).json("no mount path specified for unmounting") } }) route.post("/mount", verifyToken, (req, res)=>{ const {dev, path} = req.body; // console.log(req.body) if(path.match(/^\/[^\/]*\/?$/)){ res.status(403).json("can't mount drive to / or direct child of /") }else{ exec(`mount ${dev} ${path}`, (err, out, sterr)=>{ if(err){ // console.log(err) res.status(500).json("mount failure") }else{ // console.log(out, sterr) const fstab = readFileSync("/etc/fstab").toString().split("\n") // console.log(fstab)( getDeviceData(dev).then(({TYPE, UUID})=>{ const fstabstring = `/dev/disk/by-uuid/${UUID} ${path} ${TYPE} defaults 0 0` fstab.splice(fstab.findIndex((line)=>!line.length), 0, fstabstring) writeFileSync("/etc/fstab", fstab.join("\n")) res.end() }, ({error, message})=>{ res.status(error).json(message) }) } }) } }) route.post("/mkdir", verifyToken, (req, res)=>{ const {path} = req.body; if(path.match(/^\/[^\/]*\/?$/)){ res.status(403).json("can't make / or direct children of /") }else{ mkdir(path, (err)=>{ if(err){ // console.log(err) res.status(500).json("can't create directory") }else{ res.end() } }) } }) route.post("/rmdir", verifyToken, (req, res)=>{ const {path, force} = req.body; if(path.match(/^\/[^\/]*\/?$/)){ res.status(403).json("can't delete / or direct children of /") }else{ exec(`rm -r${force?"f":""} ${path}`, (err, stdout )=>{ if(err){ res.status(500).json("failed to remove folder") }else{ res.end() } }) } }) route.post("/block", verifyToken, (req, res)=>{ const {uid, blocked} = req.body; blockUser({id: uid, blocked}).then(()=>{ res.end() }, ({error, message})=>{ res.status(error).json(message) }) }) route.post("/unblock", verifyToken, (req, res)=>{ // console.log("unblockung user " + req.body.uid) unblockUser({id: req.body.uid}).then(()=>{ res.end() }, ({error, message})=>{ res.status(error).json(message) }) }) module.exports = route