def __init__(self, name, directory, frontDirectory): self.name = name self.directory = directory + "/" + name self.frontDirectory = frontDirectory + "/" + name self.group = "ovd_share_" + self.name self.ro_users = [] self.rw_users = [] self.htaccess = HTAccess(self.directory) self.active = False
def __init__(self, name, directory, frontDirectory): self.name = name self.directory = directory + "/" + name self.frontDirectory = frontDirectory + "/" + name self.group = "ovd_share_"+self.name self.ro_users = [] self.rw_users = [] self.htaccess = HTAccess(self.directory) self.active = False
class Share: STATUS_NOT_EXISTS = 1 STATUS_ACTIVE = 2 STATUS_INACTIVE = 3 def __init__(self, name, directory, frontDirectory): self.name = name self.directory = directory + "/" + name self.frontDirectory = frontDirectory + "/" + name self.group = "ovd_share_"+self.name self.ro_users = [] self.rw_users = [] self.htaccess = HTAccess(self.directory) self.active = False def exists(self): return os.path.isdir(self.directory) def isActive(self): return self.active def status(self): if not self.exists(): return self.STATUS_NOT_EXISTS if self.active: return self.STATUS_ACTIVE return self.STATUS_INACTIVE def create(self): try: os.mkdir(self.directory, 0700) os.chown(self.directory, -1, Config.gid) os.chmod(self.directory, stat.S_IRWXU | stat.S_IRWXG | stat.S_ISGID) # TODO Find a better way if self.name.startswith("p"): ## Creating minimal skeleton path = os.path.join(self.directory, "Data") os.mkdir(path, 0700) os.chown(path, Config.uid, Config.gid) os.chmod(path, stat.S_IRWXU | stat.S_IRWXG | stat.S_ISGID) except: Logger.warn("FS: unable to create profile '%s'"%(self.name)) return False return True def delete(self): cmd = "rm -rf %s"%(self.directory) p = System.execute(cmd) if p.returncode is not 0: Logger.error("FS: unable to del share") Logger.debug("FS: command '%s' return %d: %s"%(cmd, p.returncode, p.stdout.read().decode("UTF-8"))) return False return True def enable(self, mode): for i in ['ro', 'rw']: cmd = "groupadd %s_%s"%(self.group, i) p = System.execute(cmd) if p.returncode is not 0: Logger.error("FS: unable to create group") Logger.debug("FS: command '%s' return %d: %s"%(cmd, p.returncode, p.stdout.read().decode("UTF-8"))) return False cmd = 'net usershare add %s "%s" %s %s_ro:r,%s_rw:f guest_ok=n'%(self.name, self.frontDirectory, self.name, self.group, self.group) p = System.execute(cmd) if p.returncode is not 0: Logger.error("FS: unable to add share") Logger.debug("FS: command '%s' return %d: %s"%(cmd, p.returncode, p.stdout.read().decode("UTF-8"))) return False self.do_right_normalization() self.htaccess.addGroup(self.group) self.htaccess.save() self.active = True return True def disable(self): path = os.path.join(self.directory, ".htaccess") if not os.path.exists(path): ret = False Logger.error("FS: no .htaccess") Logger.debug("FS: no .htaccess '%s'"%(path)) else: try: os.remove(path) except Exception: ret = False Logger.exception("FS: unable to remove .htaccess '%s'"%path) cmd = "net usershare delete %s"%(self.name) p = System.execute(cmd) ret = True if p.returncode is not 0: ret = False Logger.error("FS: unable to del share") Logger.debug("FS: command '%s' return %d: %s"%(cmd, p.returncode, p.stdout.read().decode("UTF-8"))) for i in ['rw', 'ro']: cmd = "groupdel %s_%s"%(self.group, i) p = System.execute(cmd) if p.returncode is not 0: ret = False Logger.error("FS: unable to del group") Logger.debug("FS: command '%s' return %d: %s"%(cmd, p.returncode, p.stdout.read().decode("UTF-8"))) self.do_right_normalization() self.htaccess.delGroup(self.group) self.htaccess.save() self.active = False return ret def do_right_normalization(self): cmd = 'chown -R %s:%s "%s"'%(Config.uid, Config.gid, self.directory) p = System.execute(cmd) if p.returncode is not 0: Logger.debug("FS: following command '%s' returned %d => %s"%(cmd, p.returncode, p.stdout.read())) cmd = 'chmod -R u=rwX,g=rwX,o-rwx "%s"'%(self.directory) p = System.execute(cmd) if p.returncode is not 0: Logger.debug("FS: following command '%s' returned %d => %s"%(cmd, p.returncode, p.stdout.read())) def add_user(self, user, mode): if not self.active: self.enable(mode) cmd = "adduser %s %s_%s"%(user, self.group, mode) p = System.execute(cmd) if p.returncode is not 0: Logger.error("FS: unable to add user in group") Logger.debug("FS: command '%s' return %d: %s"%(cmd, p.returncode, p.stdout.read().decode("UTF-8"))) return False htgroup = HTGroup(Config.dav_group_file) if mode == 'rw': self.rw_users.append(user) htgroup.add(user, self.group+"_rw") else: self.ro_users.append(user) htgroup.add(user, self.group+"_ro") return True def del_user(self, user): if user not in self.ro_users and user not in self.rw_users: return True ret = True if user in self.ro_users: cmd = "deluser %s %s_ro"%(user, self.group) else: cmd = "deluser %s %s_rw"%(user, self.group) p = System.execute(cmd) if p.returncode is not 0: ret = False Logger.error("FS: unable to del user in group") Logger.debug("FS: command '%s' return %d: %s"%(cmd, p.returncode, p.stdout.read().decode("UTF-8"))) htgroup = HTGroup(Config.dav_group_file) if user in self.ro_users: self.ro_users.remove(user) htgroup.delete(user, self.group+"_ro") if user in self.rw_users: self.rw_users.remove(user) htgroup.delete(user, self.group+"_rw") if (len(self.ro_users) + len(self.rw_users)) == 0: return self.disable() return True def has_user(self, user): return (user in self.ro_users) or (user in self.rw_users)
class Share: STATUS_NOT_EXISTS = 1 STATUS_ACTIVE = 2 STATUS_INACTIVE = 3 def __init__(self, name, directory, frontDirectory): self.name = name self.directory = directory + "/" + name self.frontDirectory = frontDirectory + "/" + name self.group = "ovd_share_" + self.name self.ro_users = [] self.rw_users = [] self.htaccess = HTAccess(self.directory) self.active = False def exists(self): return os.path.isdir(self.directory) def isActive(self): return self.active def status(self): if not self.exists(): return self.STATUS_NOT_EXISTS if self.active: return self.STATUS_ACTIVE return self.STATUS_INACTIVE def create(self): try: os.mkdir(self.directory, 0700) os.chown(self.directory, -1, Config.gid) os.chmod(self.directory, stat.S_IRWXU | stat.S_IRWXG | stat.S_ISGID) # TODO Find a better way if self.name.startswith("p"): ## Creating minimal skeleton path = os.path.join(self.directory, "Data") os.mkdir(path, 0700) os.chown(path, Config.uid, Config.gid) os.chmod(path, stat.S_IRWXU | stat.S_IRWXG | stat.S_ISGID) except: Logger.warn("FS: unable to create profile '%s'" % (self.name)) return False return True def delete(self): cmd = "rm -rf %s" % (self.directory) p = System.execute(cmd) if p.returncode is not 0: Logger.error("FS: unable to del share") Logger.debug("FS: command '%s' return %d: %s" % (cmd, p.returncode, p.stdout.read().decode("UTF-8"))) return False return True def enable(self, mode): for i in ['ro', 'rw']: cmd = "groupadd %s_%s" % (self.group, i) p = System.execute(cmd) if p.returncode is not 0: Logger.error("FS: unable to create group") Logger.debug( "FS: command '%s' return %d: %s" % (cmd, p.returncode, p.stdout.read().decode("UTF-8"))) return False cmd = 'net usershare add %s "%s" %s %s_ro:r,%s_rw:f guest_ok=n' % ( self.name, self.frontDirectory, self.name, self.group, self.group) p = System.execute(cmd) if p.returncode is not 0: Logger.error("FS: unable to add share") Logger.debug("FS: command '%s' return %d: %s" % (cmd, p.returncode, p.stdout.read().decode("UTF-8"))) return False self.do_right_normalization() self.htaccess.addGroup(self.group) self.htaccess.save() self.active = True return True def disable(self): path = os.path.join(self.directory, ".htaccess") if not os.path.exists(path): ret = False Logger.error("FS: no .htaccess") Logger.debug("FS: no .htaccess '%s'" % (path)) else: try: os.remove(path) except Exception: ret = False Logger.exception("FS: unable to remove .htaccess '%s'" % path) cmd = "net usershare delete %s" % (self.name) p = System.execute(cmd) ret = True if p.returncode is not 0: ret = False Logger.error("FS: unable to del share") Logger.debug("FS: command '%s' return %d: %s" % (cmd, p.returncode, p.stdout.read().decode("UTF-8"))) for i in ['rw', 'ro']: cmd = "groupdel %s_%s" % (self.group, i) p = System.execute(cmd) if p.returncode is not 0: ret = False Logger.error("FS: unable to del group") Logger.debug( "FS: command '%s' return %d: %s" % (cmd, p.returncode, p.stdout.read().decode("UTF-8"))) self.do_right_normalization() self.htaccess.delGroup(self.group) self.htaccess.save() self.active = False return ret def do_right_normalization(self): cmd = 'chown -R %s:%s "%s"' % (Config.uid, Config.gid, self.directory) p = System.execute(cmd) if p.returncode is not 0: Logger.debug("FS: following command '%s' returned %d => %s" % (cmd, p.returncode, p.stdout.read())) cmd = 'chmod -R u=rwX,g=rwX,o-rwx "%s"' % (self.directory) p = System.execute(cmd) if p.returncode is not 0: Logger.debug("FS: following command '%s' returned %d => %s" % (cmd, p.returncode, p.stdout.read())) def add_user(self, user, mode): if not self.active: self.enable(mode) cmd = "adduser %s %s_%s" % (user, self.group, mode) p = System.execute(cmd) if p.returncode is not 0: Logger.error("FS: unable to add user in group") Logger.debug("FS: command '%s' return %d: %s" % (cmd, p.returncode, p.stdout.read().decode("UTF-8"))) return False htgroup = HTGroup(Config.dav_group_file) if mode == 'rw': self.rw_users.append(user) htgroup.add(user, self.group + "_rw") else: self.ro_users.append(user) htgroup.add(user, self.group + "_ro") return True def del_user(self, user): if user not in self.ro_users and user not in self.rw_users: return True ret = True if user in self.ro_users: cmd = "deluser %s %s_ro" % (user, self.group) else: cmd = "deluser %s %s_rw" % (user, self.group) p = System.execute(cmd) if p.returncode is not 0: ret = False Logger.error("FS: unable to del user in group") Logger.debug("FS: command '%s' return %d: %s" % (cmd, p.returncode, p.stdout.read().decode("UTF-8"))) htgroup = HTGroup(Config.dav_group_file) if user in self.ro_users: self.ro_users.remove(user) htgroup.delete(user, self.group + "_ro") if user in self.rw_users: self.rw_users.remove(user) htgroup.delete(user, self.group + "_rw") if (len(self.ro_users) + len(self.rw_users)) == 0: return self.disable() return True def has_user(self, user): return (user in self.ro_users) or (user in self.rw_users)