setquota, traffic accounting

This commit is contained in:
Peter Hormanns 2011-08-03 17:05:20 +00:00
parent deea1a494b
commit f5c673054e
8 changed files with 95 additions and 49 deletions

View File

@ -0,0 +1,25 @@
package de.hsadmin.core.util;
import java.util.Random;
import de.rrze.jpwgen.flags.PwGeneratorFlagBuilder;
import de.rrze.jpwgen.impl.PwGenerator;
public class PasswordTool {
public static PwGeneratorFlagBuilder flagBuilder = new PwGeneratorFlagBuilder();
public static Random random = new Random();
static {
flagBuilder.setIncludeCapitals();
flagBuilder.setIncludeNumerals();
// flagBuilder.setIncludeReducedSymbols();
flagBuilder.setFilterAmbiguous();
}
public static String generatePassword() {
String password = PwGenerator.generatePassword(7, flagBuilder.build(), 100, random);
return password;
}
}

View File

@ -25,6 +25,9 @@ import de.hsadmin.mods.user.UnixUser;
public class DomainProcessorFactory implements EntityProcessorFactory { public class DomainProcessorFactory implements EntityProcessorFactory {
private static final String[] DW_STRUCTURE = new String[] { "htdocs", "htdocs-ssl", "subs", "subs/www", "subs-ssl", "subs-ssl/www", "cgi", "fastcgi", "cgi-ssl", "fastcgi-ssl", "etc", "var" };
private static final String[] SW_STRUCTURE = new String[] { "htdocs", "htdocs-ssl", "subs", "subs/www", "subs-ssl", "subs-ssl/www", "etc", "var" };
public <T extends AbstractEntity> Processor createCreateProcessor(EntityManager em, T entity) throws ProcessorException { public <T extends AbstractEntity> Processor createCreateProcessor(EntityManager em, T entity) throws ProcessorException {
String hiveName = entity.getHiveName(); String hiveName = entity.getHiveName();
Domain dom = (Domain) entity; Domain dom = (Domain) entity;
@ -187,11 +190,13 @@ public class DomainProcessorFactory implements EntityProcessorFactory {
private CompoundProcessor createDomainDirectoriesProcessor(Domain dom, Map<String, String> templateVars) throws ProcessorException { private CompoundProcessor createDomainDirectoriesProcessor(Domain dom, Map<String, String> templateVars) throws ProcessorException {
UnixUser domUser = dom.getUser(); UnixUser domUser = dom.getUser();
String domName = dom.getName(); String domName = dom.getName();
String pacName = domUser.getPac().getName(); Pac pac = domUser.getPac();
boolean dynamicWeb = pac.isDynamicWeb();
String pacName = pac.getName();
String domsDir = domUser.getHomedir() + "/doms"; String domsDir = domUser.getHomedir() + "/doms";
String userName = domUser.getName(); String userName = domUser.getName();
String domainDir = domsDir + "/" + dom.getName(); String domainDir = domsDir + "/" + dom.getName();
String[] subDirs = new String[] { "htdocs", "htdocs-ssl", "subs", "subs/www", "subs-ssl", "subs-ssl/www", "cgi", "fastcgi", "cgi-ssl", "fastcgi-ssl", "etc", "var" }; String[] subDirs = dynamicWeb ? DW_STRUCTURE : SW_STRUCTURE;
Processor mkDomainDirProzessor = Processor mkDomainDirProzessor =
new ShellProcessor( new ShellProcessor(
"mkdir --mode=1550 --parents " + domsDir + " && " + "mkdir --mode=1550 --parents " + domsDir + " && " +
@ -220,18 +225,20 @@ public class DomainProcessorFactory implements EntityProcessorFactory {
domDirsProcessor.appendProcessor( domDirsProcessor.appendProcessor(
new CreateFileProcessor("/de/hsadmin/mods/dom/index.html.jtpl", templateVars, domainDir + "/subs-ssl/www/index.html", userName, pacName, "644") new CreateFileProcessor("/de/hsadmin/mods/dom/index.html.jtpl", templateVars, domainDir + "/subs-ssl/www/index.html", userName, pacName, "644")
); );
domDirsProcessor.appendProcessor( if (dynamicWeb) {
new CreateFileProcessor("/de/hsadmin/mods/dom/test.cgi.jtpl", templateVars, domainDir + "/cgi/test.cgi", userName, pacName, "755") domDirsProcessor.appendProcessor(
new CreateFileProcessor("/de/hsadmin/mods/dom/test.cgi.jtpl", templateVars, domainDir + "/cgi/test.cgi", userName, pacName, "755")
);
domDirsProcessor.appendProcessor(
new CreateFileProcessor("/de/hsadmin/mods/dom/test.cgi.jtpl", templateVars, domainDir + "/cgi-ssl/test.cgi", userName, pacName, "755")
);
domDirsProcessor.appendProcessor(
new CopyFileProcessor("/usr/local/src/phpstub/phpstub", domainDir + "/fastcgi/phpstub", userName, pacName, "755")
);
domDirsProcessor.appendProcessor(
new CopyFileProcessor("/usr/local/src/phpstub/phpstub", domainDir + "/fastcgi-ssl/phpstub", userName, pacName, "755")
); );
domDirsProcessor.appendProcessor( }
new CreateFileProcessor("/de/hsadmin/mods/dom/test.cgi.jtpl", templateVars, domainDir + "/cgi-ssl/test.cgi", userName, pacName, "755")
);
domDirsProcessor.appendProcessor(
new CopyFileProcessor("/usr/local/src/phpstub/phpstub", domainDir + "/fastcgi/phpstub", userName, pacName, "755")
);
domDirsProcessor.appendProcessor(
new CopyFileProcessor("/usr/local/src/phpstub/phpstub", domainDir + "/fastcgi-ssl/phpstub", userName, pacName, "755")
);
domDirsProcessor.appendProcessor( domDirsProcessor.appendProcessor(
new ShellProcessor("ln -s " + domainDir + " /home/doms/ && " + new ShellProcessor("ln -s " + domainDir + " /home/doms/ && " +
"chown --no-dereference " + userName + ":httpd /home/doms/" + domName "chown --no-dereference " + userName + ":httpd /home/doms/" + domName
@ -269,7 +276,7 @@ public class DomainProcessorFactory implements EntityProcessorFactory {
if (domName.equals(pac.getName() + ".hostsharing.net")) { if (domName.equals(pac.getName() + ".hostsharing.net")) {
return "/de/hsadmin/mods/dom/httpd-vhost-dynamic.jtpl"; return "/de/hsadmin/mods/dom/httpd-vhost-dynamic.jtpl";
} }
if (pac.getBasepac().getName().startsWith("DW")) { if (pac.isDynamicWeb()) {
return "/de/hsadmin/mods/dom/httpd-vhost-dynamic.jtpl"; return "/de/hsadmin/mods/dom/httpd-vhost-dynamic.jtpl";
} }
return "/de/hsadmin/mods/dom/httpd-vhost-static.jtpl"; return "/de/hsadmin/mods/dom/httpd-vhost-static.jtpl";

View File

@ -272,6 +272,10 @@ public class Pac extends AbstractEntity implements Serializable {
|| super.isReadAllowedFor(loginUser); || super.isReadAllowedFor(loginUser);
} }
public boolean isDynamicWeb() {
return getBasepac().getName().startsWith("DW");
}
public static String restriction() { public static String restriction() {
return return
// all pacs of customer // all pacs of customer

View File

@ -4,7 +4,6 @@ import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Random;
import java.util.Set; import java.util.Set;
import javax.persistence.EntityManager; import javax.persistence.EntityManager;
@ -18,22 +17,11 @@ import de.hsadmin.core.qserv.ProcessorException;
import de.hsadmin.core.qserv.ShellProcessor; import de.hsadmin.core.qserv.ShellProcessor;
import de.hsadmin.core.qserv.TemplateProcessor; import de.hsadmin.core.qserv.TemplateProcessor;
import de.hsadmin.core.qserv.WaitingTasksProcessor; import de.hsadmin.core.qserv.WaitingTasksProcessor;
import de.hsadmin.core.util.PasswordTool;
import de.hsadmin.mods.user.UnixUser; import de.hsadmin.mods.user.UnixUser;
import de.rrze.jpwgen.flags.PwGeneratorFlagBuilder;
import de.rrze.jpwgen.impl.PwGenerator;
public class PacProcessorFactory implements EntityProcessorFactory { public class PacProcessorFactory implements EntityProcessorFactory {
private static PwGeneratorFlagBuilder flagBuilder = new PwGeneratorFlagBuilder();
private static Random random = new Random();
static {
flagBuilder.setIncludeCapitals();
flagBuilder.setIncludeNumerals();
// flagBuilder.setIncludeReducedSymbols();
flagBuilder.setFilterAmbiguous();
}
@Override @Override
public <T extends AbstractEntity> Processor createCreateProcessor( public <T extends AbstractEntity> Processor createCreateProcessor(
EntityManager em, T entity) throws ProcessorException { EntityManager em, T entity) throws ProcessorException {
@ -42,14 +30,16 @@ public class PacProcessorFactory implements EntityProcessorFactory {
String customerEMail = pac.getCustomer().getContractualContact().getEmail(); String customerEMail = pac.getCustomer().getContractualContact().getEmail();
Hive hive = pac.getHive(); Hive hive = pac.getHive();
UnixUser unixUser = getPacAdminUser(pac); UnixUser unixUser = getPacAdminUser(pac);
String password = PwGenerator.generatePassword(7, flagBuilder.build(), 100, random); String password = PasswordTool.generatePassword();
Map<String, String> hiveValues = fillHiveValues(hive); Map<String, String> hiveValues = fillHiveValues(hive);
List<Map<String, String>> pacValuesList = fillPacValuesList(hive, null); List<Map<String, String>> pacValuesList = fillPacValuesList(hive, null);
Map<String, String> emailVars = fillEMailValues(pacName, customerEMail, password); Map<String, String> emailVars = fillEMailValues(pacName, customerEMail, password);
Processor priProcessor = new CompoundProcessor( Processor priProcessor = new CompoundProcessor(
createAddUserProc(pacName, unixUser, password), createAddUserProc(pacName, unixUser, password),
createSetQuotaProc(pac),
createEtcHostsProc(hiveValues, pacValuesList), createEtcHostsProc(hiveValues, pacValuesList),
createNetworkInterfacesProc(hiveValues, pacValuesList), createNetworkInterfacesProc(hiveValues, pacValuesList),
createIPTablesProc(),
createSudouersProc(hiveValues, pacValuesList), createSudouersProc(hiveValues, pacValuesList),
createProftpdConfProc(hiveValues, pacValuesList), createProftpdConfProc(hiveValues, pacValuesList),
createMakePacDirectoryStructure(unixUser)); createMakePacDirectoryStructure(unixUser));
@ -65,8 +55,7 @@ public class PacProcessorFactory implements EntityProcessorFactory {
} }
@Override @Override
public <T extends AbstractEntity> Processor createDeleteProcessor( public <T extends AbstractEntity> Processor createDeleteProcessor(EntityManager em, T entity) throws ProcessorException {
EntityManager em, T entity) throws ProcessorException {
Pac pac = (Pac) entity; Pac pac = (Pac) entity;
Hive hive = pac.getHive(); Hive hive = pac.getHive();
Map<String, String> hiveValues = fillHiveValues(hive); Map<String, String> hiveValues = fillHiveValues(hive);
@ -80,32 +69,35 @@ public class PacProcessorFactory implements EntityProcessorFactory {
return waitingProcessor; return waitingProcessor;
} }
private TemplateProcessor createEtcHostsProc( private Processor createEtcHostsProc(
Map<String, String> hiveValues, Map<String, String> hiveValues,
List<Map<String, String>> pacValuesList) throws ProcessorException { List<Map<String, String>> pacValuesList) throws ProcessorException {
return new TemplateProcessor("/de/hsadmin/mods/pac/hosts.jtpl", hiveValues, pacValuesList.iterator(), "/etc/hosts", true); return new TemplateProcessor("/de/hsadmin/mods/pac/hosts.jtpl", hiveValues, pacValuesList.iterator(), "/etc/hosts", true);
} }
private TemplateProcessor createNetworkInterfacesProc( private Processor createNetworkInterfacesProc(
Map<String, String> hiveValues, Map<String, String> hiveValues,
List<Map<String, String>> pacValuesList) throws ProcessorException { List<Map<String, String>> pacValuesList) throws ProcessorException {
return new TemplateProcessor("/de/hsadmin/mods/pac/interfaces.jtpl", hiveValues, pacValuesList.iterator(), "/etc/network/interfaces", true); return new TemplateProcessor("/de/hsadmin/mods/pac/interfaces.jtpl", hiveValues, pacValuesList.iterator(), "/etc/network/interfaces", true);
} }
private TemplateProcessor createSudouersProc( private Processor createIPTablesProc() {
return new ShellProcessor("mk-iptables-rules Accounting");
}
private Processor createSudouersProc(
Map<String, String> hiveValues, Map<String, String> hiveValues,
List<Map<String, String>> pacValuesList) throws ProcessorException { List<Map<String, String>> pacValuesList) throws ProcessorException {
return new TemplateProcessor("/de/hsadmin/mods/pac/sudoers.jtpl", hiveValues, pacValuesList.iterator(), "/etc/sudoers", true); return new TemplateProcessor("/de/hsadmin/mods/pac/sudoers.jtpl", hiveValues, pacValuesList.iterator(), "/etc/sudoers", true);
} }
private TemplateProcessor createProftpdConfProc( private Processor createProftpdConfProc(
Map<String, String> hiveValues, Map<String, String> hiveValues,
List<Map<String, String>> pacValuesList) throws ProcessorException { List<Map<String, String>> pacValuesList) throws ProcessorException {
return new TemplateProcessor("/de/hsadmin/mods/pac/proftpd-conf.jtpl", hiveValues, pacValuesList.iterator(), "/etc/proftpd/proftpd.conf", true); return new TemplateProcessor("/de/hsadmin/mods/pac/proftpd-conf.jtpl", hiveValues, pacValuesList.iterator(), "/etc/proftpd/proftpd.conf", true);
} }
private ShellProcessor createAddUserProc(String pacName, UnixUser unixUser, private Processor createAddUserProc(String pacName, UnixUser unixUser, String password) {
String password) {
return new ShellProcessor( return new ShellProcessor(
"newusers", pacName + ":" + password + ":" "newusers", pacName + ":" + password + ":"
+ unixUser.getUserId() + ":" + unixUser.getUserId() + unixUser.getUserId() + ":" + unixUser.getUserId()
@ -113,11 +105,31 @@ public class PacProcessorFactory implements EntityProcessorFactory {
+ ":" + unixUser.getShell() + "\n"); + ":" + unixUser.getShell() + "\n");
} }
private ShellProcessor createDelUserProc(String pacName) { private Processor createSetQuotaProc(Pac pac) {
int quota = 128;
Set<PacComponent> pacComponents = pac.getPacComponents();
for (PacComponent pacComponent : pacComponents) {
BaseComponent baseComponent = pacComponent.getBaseComponent();
String feature = baseComponent.getFeature();
if ("QUOTA".equals(feature)) {
quota = pacComponent.getQuantity();
}
}
int blocksSoft = quota * 1024;
int blocksHard = quota * 1024 * 2;
int inodesSoft = blocksSoft / 4;
int inodesHard = blocksHard / 4;
return new ShellProcessor("setquota -g " + pac.getName() + " "
+ blocksSoft + " " + blocksHard + " "
+ inodesSoft + " " + inodesHard + " "
+ "`df /home/pacs/ | tail -n1 | cut -d' ' -f1`");
}
private Processor createDelUserProc(String pacName) {
return new ShellProcessor("rm -rf /home/pacs/" + pacName + "/* && deluser --remove-all-files " + pacName + ">/dev/null 2>&1"); return new ShellProcessor("rm -rf /home/pacs/" + pacName + "/* && deluser --remove-all-files " + pacName + ">/dev/null 2>&1");
} }
private ShellProcessor createMakePacDirectoryStructure(UnixUser unixUser) { private Processor createMakePacDirectoryStructure(UnixUser unixUser) {
return new ShellProcessor("chmod 711 " + unixUser.getHomedir() + " && " + return new ShellProcessor("chmod 711 " + unixUser.getHomedir() + " && " +
"su -l " + unixUser.getName() + " -s \"/bin/bash\" -c \"mkdir -p " + "su -l " + unixUser.getName() + " -s \"/bin/bash\" -c \"mkdir -p " +
unixUser.getHomedir() + "/doms " + unixUser.getHomedir() + "/doms " +

View File

@ -55,7 +55,7 @@ public class InitDataTest {
setParams.put("contact_city", "Musterstadt"); setParams.put("contact_city", "Musterstadt");
setParams.put("contact_country", "D"); setParams.put("contact_country", "D");
setParams.put("contact_phone_private", "+49 9999 123456"); setParams.put("contact_phone_private", "+49 9999 123456");
setParams.put("contact_email", "rainer.mustermann@example.org"); setParams.put("contact_email", "test@ostwall195.de");
Object[] params = new Object[] { user, Object[] params = new Object[] { user,
cas.getServiceTicket(grantingTicketURL, RemoteTestHelper.getBackendURL()), cas.getServiceTicket(grantingTicketURL, RemoteTestHelper.getBackendURL()),
setParams }; setParams };

View File

@ -12,7 +12,6 @@ import org.apache.xmlrpc.XmlRpcException;
import org.apache.xmlrpc.client.XmlRpcClient; import org.apache.xmlrpc.client.XmlRpcClient;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test; import org.junit.Test;
public class MysqlUserTest { public class MysqlUserTest {

View File

@ -12,7 +12,6 @@ import org.apache.xmlrpc.XmlRpcException;
import org.apache.xmlrpc.client.XmlRpcClient; import org.apache.xmlrpc.client.XmlRpcClient;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test; import org.junit.Test;
public class PgsqlUserTest { public class PgsqlUserTest {

View File

@ -6,16 +6,16 @@ import org.junit.runners.Suite;
@RunWith(Suite.class) @RunWith(Suite.class)
@Suite.SuiteClasses({ @Suite.SuiteClasses({
InitDataTest.class, InitDataTest.class,
PacTest.class, // PacTest.class,
UnixUserTest.class, // UnixUserTest.class,
MysqlUserTest.class, // MysqlUserTest.class,
MysqlDbTest.class, // MysqlDbTest.class,
PgsqlUserTest.class, // PgsqlUserTest.class,
PgsqlDbTest.class, // PgsqlDbTest.class,
// EMailAliasTest.class, // EMailAliasTest.class,
// DomainTest.class, // DomainTest.class,
// EMailAddressTest.class, // EMailAddressTest.class,
CustomerTest.class // CustomerTest.class
// HostmasterTest.class, // HostmasterTest.class,
// QueueTaskTest.class // QueueTaskTest.class
}) })