138 lines
4.6 KiB
JavaScript
Executable File
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 |