raspi-back/app/routes/admin.js

138 lines
4.6 KiB
JavaScript
Executable File

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