package io.cattle.platform.configitem.server.model.impl; import static io.cattle.platform.core.model.tables.InstanceTable.*; import io.cattle.platform.archaius.util.ArchaiusUtil; import io.cattle.platform.configitem.server.model.Request; import io.cattle.platform.configitem.version.ConfigItemStatusManager; import io.cattle.platform.core.dao.DataDao; import io.cattle.platform.core.dao.NicDao; import io.cattle.platform.core.model.Instance; import io.cattle.platform.core.model.Nic; import io.cattle.platform.object.ObjectManager; import java.io.IOException; import java.security.SecureRandom; import java.util.concurrent.Callable; import org.apache.commons.codec.binary.Hex; import com.netflix.config.DynamicIntProperty; public class PSKConfigItem extends AbstractConfigItem { private static final DynamicIntProperty LENGTH = ArchaiusUtil.getInt("ipsec.psk.byte.length"); public static final String ITEM = "psk"; SecureRandom random = new SecureRandom(); String sourceRevision; NicDao nicDao; DataDao dataDao; ObjectManager objectManager; public PSKConfigItem(ObjectManager objectManager, NicDao nicDao, DataDao dataDao, ConfigItemStatusManager versionManager) throws IOException { super(ITEM, versionManager); this.sourceRevision = ""; this.nicDao = nicDao; this.dataDao = dataDao; this.objectManager = objectManager; } protected String randomKey() { byte[] bytes = new byte[LENGTH.get()]; random.nextBytes(bytes); return Hex.encodeHexString(bytes); } @Override public void handleRequest(Request req) throws IOException { Instance instance = objectManager.findAny(Instance.class, INSTANCE.AGENT_ID, req.getClient().getResourceId()); if (instance == null) { return; } Nic primaryNic = nicDao.getPrimaryNic(instance); if (primaryNic == null) { return; } String key = dataDao.getOrCreate(String.format("psk.%d", primaryNic.getNetworkId()), false, new Callable<String>() { @Override public String call() throws Exception { return randomKey(); } }); req.getOutputStream().write(key.getBytes("UTF-8")); } @Override public String getSourceRevision() { return sourceRevision; } }