pybackive/backive/core/device.py

62 lines
2.0 KiB
Python
Raw Normal View History

2019-01-06 17:34:02 +01:00
import os
import logging
import asyncio
2019-01-06 21:29:21 +01:00
import backive.config.config as cfg
2019-01-06 17:34:02 +01:00
class Device:
disks_by_uuid = "/dev/disk/by-uuid"
def __init__(self, name, config=None):
self.name = name
2019-01-06 21:29:21 +01:00
self.config = config
self._mount_dir = None
2019-01-06 21:29:21 +01:00
@classmethod
def instance(cls, name, config=None):
logging.debug("Device instance created (%s)", name)
return Device(name, config)
2019-01-06 17:34:02 +01:00
@classmethod
2019-01-06 21:29:21 +01:00
def get_list(cls):
2019-01-06 17:34:02 +01:00
if os.path.exists(cls.disks_by_uuid):
uuids = os.listdir(cls.disks_by_uuid)
return uuids
return []
2019-01-06 21:29:21 +01:00
async def mount(self, path):
self._mount_dir = os.path.join(path, self.config.get("mountname"))
dev_path = os.path.join(self.disks_by_uuid, self.config.get("uuid"))
logging.debug("dev: %s ;; mount: %s", dev_path, self._mount_dir)
# TODO: use mkdir as indicator for correct access rights (when backive
# is run as user!)
proc = await asyncio.create_subprocess_shell(
2020-09-27 17:15:46 +02:00
"""set -x; mkdir -p {mountpoint}
mount -v -o users,noexec {dev_path} {mountpoint}""".format(
mountpoint=self._mount_dir,
2020-09-27 17:15:46 +02:00
dev_path=dev_path,
),
2020-09-27 17:15:46 +02:00
shell=True,
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE,
)
stdout, stderr = await proc.communicate()
logging.debug("stdout: %s", stdout)
2020-09-27 17:15:46 +02:00
logging.debug("stderr: %s", stderr)
# TODO: Also add a touch operation in the target mount if the correct
# access rights are given! (when backive is run as user)
return True # on success, False on failure
async def unmount(self):
if not self._mount_dir:
return
proc = await asyncio.create_subprocess_shell(
"""sync
sudo umount -v %s
""" % self._mount_dir,
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE,
)
stdout, stderr = await proc.communicate()
logging.debug("stdout: %s", stdout)