package org.zstack.storage.primary.nfs; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.zstack.core.db.DatabaseFacade; import org.zstack.core.db.Q; import org.zstack.core.db.SQLBatch; import org.zstack.core.errorcode.ErrorFacade; import org.zstack.header.apimediator.ApiMessageInterceptionException; import org.zstack.header.apimediator.ApiMessageInterceptor; import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.errorcode.OperationFailureException; import org.zstack.header.message.APIMessage; import org.zstack.header.storage.primary.APIUpdatePrimaryStorageMsg; import org.zstack.header.storage.primary.PrimaryStorageVO; import org.zstack.header.storage.primary.PrimaryStorageVO_; import org.zstack.header.vm.VmInstanceState; import javax.persistence.Tuple; import javax.persistence.TypedQuery; import java.util.List; import java.util.stream.Collectors; import static org.zstack.core.Platform.operr; import static org.zstack.core.Platform.argerr; /** */ public class NfsPrimaryStorageApiInterceptor implements ApiMessageInterceptor { @Autowired private DatabaseFacade dbf; @Autowired private ErrorFacade errf; @Override public APIMessage intercept(APIMessage msg) throws ApiMessageInterceptionException { if (msg instanceof APIAddNfsPrimaryStorageMsg) { validate((APIAddNfsPrimaryStorageMsg) msg); }else if(msg instanceof APIUpdatePrimaryStorageMsg){ validate((APIUpdatePrimaryStorageMsg) msg); } return msg; } private void validate(APIAddNfsPrimaryStorageMsg msg) { new NfsApiParamChecker().checkUrl(msg.getZoneUuid(), msg.getUrl()); String[] results = msg.getUrl().split(":"); if (results.length == 2 && ( results[1].startsWith("/dev") || results[1].startsWith("/proc") || results[1].startsWith("/sys"))) { throw new ApiMessageInterceptionException(argerr(" the url contains an invalid folder[/dev or /proc or /sys]")); } } private void validate(APIUpdatePrimaryStorageMsg msg){ Tuple t = Q.New(PrimaryStorageVO.class) .select(PrimaryStorageVO_.type, PrimaryStorageVO_.url, PrimaryStorageVO_.zoneUuid) .eq(PrimaryStorageVO_.uuid, msg.getUuid()) .findTuple(); String type = t.get(0, String.class); String url = t.get(1, String.class); String zoneUuid = t.get(2, String.class); if(!type.equals(NfsPrimaryStorageConstant.NFS_PRIMARY_STORAGE_TYPE)){ return; } if (msg.getUrl() != null && !msg.getUrl().equals(url)){ new SQLBatch(){ @Override protected void scripts() { NfsApiParamChecker checker = new NfsApiParamChecker(); checker.checkUrl(zoneUuid, msg.getUrl()); checker.checkRunningVmForUpdateUrl(msg.getUuid()); } }.execute(); } } }