class AppBackend(App): class Meta: proxy = True def __init__(self, *args, **kwargs): super(AppBackend, self).__init__(*args, **kwargs) self.script = Script(self.core_server) self.proxy = ProxyObject(self) def get_user(self): return "app_%.5d" % self.id def get_group(self): return "app_%.5d" % self.id def get_home(self): home = os.path.join(settings.APPS_HOME, self.get_user()) if home != settings.APPS_HOME: return home raise AppException("Wrong home directory") def get_parmameters(self): parms = {} if self.parameters: parms.update(self.parameters) parms.update( { "user": self.get_user(), "group": self.get_group(), "home": self.get_home(), "main_domain": self.main_domain, "misc_domains": " ".join(self.misc_domains_list), "domains": " ".join(self.domains_list) } ) return parms def install(self): parms = self.get_parmameters() self.script.add_cmd("/usr/sbin/groupadd %(group)s" % parms) self.script.add_cmd("/usr/sbin/useradd -m -d %(home)s -g %(group)s %(user)s -s /bin/bash" % parms) self.script.add_cmd("/usr/sbin/usermod -G %(group)s -a www-data" % parms) self.script.add_cmd("mkdir -p %(home)s/logs" % parms, user=self.get_user()) self.script.add_cmd("mkdir -p %(home)s/app" % parms, user=self.get_user()) self.script.add_cmd("mkdir -p %(home)s/.ssh" % parms, user=self.get_user()) self.script.add_cmd("chmod 770 %(home)s/logs" % parms) self.script.add_cmd("chmod 750 %(home)s" % parms) self.installed = True self.save() self.proxy.setup() def commit(self, no_thread=False): self.script.commit(no_thread) def disable(self): parms = self.get_parmameters() self.script.add_cmd("chmod 000 %(home)s" % parms, user=self.get_user()) self.proxy.setdown() def enable(self): parms = self.get_parmameters() self.script.add_cmd("chmod 750 %(home)s" % parms, user=self.get_user()) self.proxy.setup() def uninstall(self): parms = self.get_parmameters() self.script.add_cmd("/usr/sbin/userdel %(user)s" % parms) self.script.add_cmd("/usr/sbin/groupdel %(group)s" % parms) self.script.add_cmd("rm -rf %(home)s" % parms) self.script.add_cmd("rm /etc/security/limits.d/%(user)s.conf" % parms) self.proxy.setdown() def update(self): parms = self.get_parmameters() limits = "%(user)s hard nproc 64\n" limits += "%(user)s hard as 393216\n" self.script.add_file("/etc/security/limits.d/%(user)s.conf" % parms, limits) self.proxy.setup() def get_logs(self): parms = self.get_parmameters() logfiles = [] for logfile in self.script.run("ls \"%(home)s/logs/\"" % parms)["stdout"].split(): if re.match(".*\.log$", logfile): path = os.path.join("%(home)s/logs/" % parms, logfile.strip()) logfiles.append((path, self.script.run("tail -n 60 %s" % path)["stdout"])) return logfiles def get_directories(self): parms = self.get_parmameters() return [x.strip()[len(parms.get("home"))+1:] for x in self.script.run("find -L %s -maxdepth %d -type d" % (parms.get("home"), 3))["stdout"].split("\n")] def get_uid(self): return int(self.script.run("id -u %s" % self.get_user())["stdout"].strip()) def get_gid(self): return int(self.script.run("id -g %s" % self.get_user())["stdout"].strip()) def passwd(self, password): self.script.add_cmd("/usr/sbin/chpasswd", stdin="%s:%s" % (self.get_user(), password))
class DomainObject(object): class Meta: proxy = True def __init__(self, *args, **kwargs): super(DomainObject, self).__init__(*args, **kwargs) self.script_master = Script(get_primary_ns_server()) self.scripts_slaves = [] for ns in get_secondary_ns_servers(): self.scripts_slaves.append(Script(ns)) def commit(self): self.script_master.commit() for slave in self.scripts_slaves: slave.commit() def reload(self): self.script_master.add_cmd("/etc/init.d/bind9 reload") for slave in self.scripts_slaves: slave.add_cmd("/etc/init.d/bind9 reload") def update(self, domain=None): if domain: self.script_master.add_file("%s/%s.zone" % (config.bind_master_zones_dir, domain.name), self.gen_zone(domain)) self.script_master.add_file(config.bind_master_config_file, self.gen_master_config()) for slave in self.scripts_slaves: slave.add_file(config.bind_slave_config_file, self.gen_slave_config()) def uninstall(self, domain): self.script_master.add_cmd("rm %s/%s.zone" % (config.bind_master_zones_dir, domain.name)) for slave in self.scripts_slaves: slave.add_cmd("rm %s/%s.zone" % (config.bind_slave_zones_dir, domain.name)) def gen_zone(self, domain): domain.new_serial() records = [] for ns in [get_primary_ns_server().domain] + [x.domain for x in get_secondary_ns_servers()]: records.append({"name": "@", "TTL": domain.ttl if domain.ttl else 86400, "type": "NS", "prio": "", "value": "%s." % ns}) for record in domain.record_set.order_by("order_num"): records.append({ "name": record.name, "TTL": record.ttl if record.ttl else 86400, "type": record.record_type, "prio": record.prio if record.prio else "", "value": record.value, }) return render_to_string("dns/zone.txt", { "records": records, "TTL": domain.ttl if domain.ttl else 86400, "ns1": get_primary_ns_server().domain, "rname": domain.rname.replace("@", "."), "serial": domain.serial, "refresh": config.dns_refresh, "retry": config.dns_retry, "expire": config.dns_expire, "minimum": config.dns_minimum, }) def gen_master_config(self): domains = [] for domain in Domain.objects.all(): domains.append(render_to_string("dns/master_config.txt", { "domain": domain.name, "slaves_ips": ";".join([x.ip for x in get_secondary_ns_servers()]), })) return "\n".join(domains) def gen_slave_config(self): domains = [] for domain in Domain.objects.all(): domains.append(render_to_string("dns/slave_config.txt", { "domain": domain.name, "msters_ips": get_primary_ns_server().ip, })) return "\n".join(domains)
class DomainObject(object): class Meta: proxy = True def __init__(self, *args, **kwargs): super(DomainObject, self).__init__(*args, **kwargs) self.script_master = Script(get_primary_ns_server()) self.scripts_slaves = [] for ns in get_secondary_ns_servers(): self.scripts_slaves.append(Script(ns)) def commit(self): self.script_master.commit() for slave in self.scripts_slaves: slave.commit() def reload(self): self.script_master.add_cmd("/etc/init.d/bind9 reload") for slave in self.scripts_slaves: slave.add_cmd("/etc/init.d/bind9 reload") def update(self, domain=None): if domain: self.script_master.add_file( "%s/%s.zone" % (config.bind_master_zones_dir, domain.name), self.gen_zone(domain)) self.script_master.add_file(config.bind_master_config_file, self.gen_master_config()) for slave in self.scripts_slaves: slave.add_file(config.bind_slave_config_file, self.gen_slave_config()) def uninstall(self, domain): self.script_master.add_cmd("rm %s/%s.zone" % (config.bind_master_zones_dir, domain.name)) for slave in self.scripts_slaves: slave.add_cmd("rm %s/%s.zone" % (config.bind_slave_zones_dir, domain.name)) def gen_zone(self, domain): domain.new_serial() records = [] for ns in [get_primary_ns_server().domain ] + [x.domain for x in get_secondary_ns_servers()]: records.append({ "name": "@", "TTL": domain.ttl if domain.ttl else 86400, "type": "NS", "prio": "", "value": "%s." % ns }) for record in domain.record_set.order_by("order_num"): records.append({ "name": record.name, "TTL": record.ttl if record.ttl else 86400, "type": record.record_type, "prio": record.prio if record.prio else "", "value": record.value, }) return render_to_string( "dns/zone.txt", { "records": records, "TTL": domain.ttl if domain.ttl else 86400, "ns1": get_primary_ns_server().domain, "rname": domain.rname.replace("@", "."), "serial": domain.serial, "refresh": config.dns_refresh, "retry": config.dns_retry, "expire": config.dns_expire, "minimum": config.dns_minimum, }) def gen_master_config(self): domains = [] for domain in Domain.objects.all(): domains.append( render_to_string( "dns/master_config.txt", { "domain": domain.name, "slaves_ips": ";".join([x.ip for x in get_secondary_ns_servers()]), })) return "\n".join(domains) def gen_slave_config(self): domains = [] for domain in Domain.objects.all(): domains.append( render_to_string( "dns/slave_config.txt", { "domain": domain.name, "msters_ips": get_primary_ns_server().ip, })) return "\n".join(domains)