Showing
5 changed files
with
50 additions
and
34 deletions
... | ... | @@ -30,6 +30,7 @@ import org.springframework.web.bind.annotation.ResponseBody; |
30 | 30 | import org.springframework.web.bind.annotation.RestController; |
31 | 31 | import org.thingsboard.server.common.data.TbResource; |
32 | 32 | import org.thingsboard.server.common.data.TbResourceInfo; |
33 | +import org.thingsboard.server.common.data.exception.ThingsboardErrorCode; | |
33 | 34 | import org.thingsboard.server.common.data.exception.ThingsboardException; |
34 | 35 | import org.thingsboard.server.common.data.id.TbResourceId; |
35 | 36 | import org.thingsboard.server.common.data.lwm2m.LwM2mObject; |
... | ... | @@ -41,8 +42,10 @@ import org.thingsboard.server.queue.util.TbCoreComponent; |
41 | 42 | import org.thingsboard.server.service.security.permission.Operation; |
42 | 43 | import org.thingsboard.server.service.security.permission.Resource; |
43 | 44 | |
45 | +import java.util.ArrayList; | |
44 | 46 | import java.util.Base64; |
45 | 47 | import java.util.List; |
48 | +import java.util.StringJoiner; | |
46 | 49 | |
47 | 50 | @Slf4j |
48 | 51 | @RestController |
... | ... | @@ -108,13 +111,22 @@ public class TbResourceController extends BaseController { |
108 | 111 | @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')") |
109 | 112 | @RequestMapping(value = "/resource", method = RequestMethod.POST) |
110 | 113 | @ResponseBody |
111 | - public TbResource saveResource(@RequestBody TbResource resource) throws ThingsboardException { | |
114 | + public List<TbResource> saveResources(@RequestBody List<TbResource> resources) throws ThingsboardException { | |
112 | 115 | try { |
113 | - resource.setTenantId(getTenantId()); | |
114 | - checkEntity(resource.getId(), resource, Resource.TB_RESOURCE); | |
115 | - TbResource savedResource = checkNotNull(resourceService.saveResource(resource)); | |
116 | - tbClusterService.onResourceChange(savedResource, null); | |
117 | - return savedResource; | |
116 | + List<TbResource> addResources = new ArrayList<>(); | |
117 | + StringJoiner noSaveResources = new StringJoiner("; "); | |
118 | + resources.forEach(resource -> { | |
119 | + try { | |
120 | + addResources.add(addResource(resource)); | |
121 | + } catch (Exception e) { | |
122 | + noSaveResources.add(resource.getFileName()); | |
123 | + log.warn("Fail save resource: [{}]", resource.getFileName(), e); | |
124 | + } | |
125 | + }); | |
126 | + if (noSaveResources.length() > 0) { | |
127 | + throw new ThingsboardException(String.format("Fail save resource: %s", noSaveResources.toString()), ThingsboardErrorCode.INVALID_ARGUMENTS); | |
128 | + } | |
129 | + return addResources; | |
118 | 130 | } catch (Exception e) { |
119 | 131 | throw handleException(e); |
120 | 132 | } |
... | ... | @@ -183,4 +195,12 @@ public class TbResourceController extends BaseController { |
183 | 195 | throw handleException(e); |
184 | 196 | } |
185 | 197 | } |
186 | -} | |
198 | + | |
199 | + private TbResource addResource(TbResource resource) throws Exception { | |
200 | + resource.setTenantId(getTenantId()); | |
201 | + checkEntity(resource.getId(), resource, Resource.TB_RESOURCE); | |
202 | + TbResource savedResource = checkNotNull(resourceService.saveResource(resource)); | |
203 | + tbClusterService.onResourceChange(savedResource, null); | |
204 | + return savedResource; | |
205 | + } | |
206 | +} | |
\ No newline at end of file | ... | ... |
... | ... | @@ -596,8 +596,7 @@ transport: |
596 | 596 | timeout: "${LWM2M_TIMEOUT:120000}" |
597 | 597 | recommended_ciphers: "${LWM2M_RECOMMENDED_CIPHERS:false}" |
598 | 598 | recommended_supported_groups: "${LWM2M_RECOMMENDED_SUPPORTED_GROUPS:true}" |
599 | - request_pool_size: "${LWM2M_REQUEST_POOL_SIZE:100}" | |
600 | - request_error_pool_size: "${LWM2M_REQUEST_ERROR_POOL_SIZE:10}" | |
599 | + response_pool_size: "${LWM2M_RESPONSE_POOL_SIZE:100}" | |
601 | 600 | registered_pool_size: "${LWM2M_REGISTERED_POOL_SIZE:10}" |
602 | 601 | update_registered_pool_size: "${LWM2M_UPDATE_REGISTERED_POOL_SIZE:10}" |
603 | 602 | un_registered_pool_size: "${LWM2M_UN_REGISTERED_POOL_SIZE:10}" |
... | ... | @@ -606,8 +605,7 @@ transport: |
606 | 605 | # To get helps about files format and how to generate it, see: https://github.com/eclipse/leshan/wiki/Credential-files-format |
607 | 606 | # Create new X509 Certificates: common/transport/lwm2m/src/main/resources/credentials/shell/lwM2M_credentials.sh |
608 | 607 | key_store_type: "${LWM2M_KEYSTORE_TYPE:JKS}" |
609 | - # key_store_type: "${LWM2M_KEYSTORE_TYPE:PKCS12}" | |
610 | -# key_store_path_file: "${KEY_STORE_PATH_FILE:/common/transport/lwm2m/src/main/resources/credentials/serverKeyStore.jks" | |
608 | + # key_store_path_file: "${KEY_STORE_PATH_FILE:/common/transport/lwm2m/src/main/resources/credentials/serverKeyStore.jks" | |
611 | 609 | key_store_path_file: "${KEY_STORE_PATH_FILE:}" |
612 | 610 | key_store_password: "${LWM2M_KEYSTORE_PASSWORD_SERVER:server_ks_password}" |
613 | 611 | root_alias: "${LWM2M_SERVER_ROOT_CA:rootca}" |
... | ... | @@ -626,24 +624,26 @@ transport: |
626 | 624 | # - Elliptic Curve parameters : [secp256r1 [NIST P-256, X9.62 prime256v1] (1.2.840.10045.3.1.7)] |
627 | 625 | public_x: "${LWM2M_SERVER_PUBLIC_X:05064b9e6762dd8d8b8a52355d7b4d8b9a3d64e6d2ee277d76c248861353f358}" |
628 | 626 | public_y: "${LWM2M_SERVER_PUBLIC_Y:5eeb1838e4f9e37b31fa347aef5ce3431eb54e0a2506910c5e0298817445721b}" |
629 | - private_encoded: "${LWM2M_SERVER_PRIVATE_ENCODED:308193020100301306072a8648ce3d020106082a8648ce3d030107047930770201010420dc774b309e547ceb48fee547e104ce201a9c48c449dc5414cd04e7f5cf05f67ba00a06082a8648ce3d030107a1440342000405064b9e6762dd8d8b8a52355d7b4d8b9a3d64e6d2ee277d76c248861353f3585eeb1838e4f9e37b31fa347aef5ce3431eb54e0a2506910c5e0298817445721b}" # Only Certificate_x509: | |
627 | + private_encoded: "${LWM2M_SERVER_PRIVATE_ENCODED:308193020100301306072a8648ce3d020106082a8648ce3d030107047930770201010420dc774b309e547ceb48fee547e104ce201a9c48c449dc5414cd04e7f5cf05f67ba00a06082a8648ce3d030107a1440342000405064b9e6762dd8d8b8a52355d7b4d8b9a3d64e6d2ee277d76c248861353f3585eeb1838e4f9e37b31fa347aef5ce3431eb54e0a2506910c5e0298817445721b}" | |
628 | + # Only Certificate_x509: | |
630 | 629 | alias: "${LWM2M_KEYSTORE_ALIAS_SERVER:server}" |
631 | 630 | bootstrap: |
632 | - enable: "${LWM2M_BOOTSTRAP_ENABLED:true}" | |
633 | - id: "${LWM2M_SERVER_ID:111}" | |
631 | + enable: "${LWM2M_ENABLED_BS:true}" | |
632 | + id: "${LWM2M_SERVER_ID_BS:111}" | |
634 | 633 | bind_address: "${LWM2M_BIND_ADDRESS_BS:0.0.0.0}" |
635 | 634 | bind_port_no_sec: "${LWM2M_BIND_PORT_NO_SEC_BS:5687}" |
636 | 635 | secure: |
637 | 636 | bind_address_security: "${LWM2M_BIND_ADDRESS_BS:0.0.0.0}" |
638 | - bind_port_security: "${LWM2M_BIND_PORT_SEC_BS:5688}" | |
637 | + bind_port_security: "${LWM2M_BIND_PORT_SECURITY_BS:5688}" | |
639 | 638 | # Only for RPK: Public & Private Key. If the keystore file is missing or not working |
640 | 639 | # - Elliptic Curve parameters : [secp256r1 [NIST P-256, X9.62 prime256v1] (1.2.840.10045.3.1.7)] |
641 | 640 | # - Public Key (Hex): [3059301306072a8648ce3d020106082a8648ce3d030107034200045017c87a1c1768264656b3b355434b0def6edb8b9bf166a4762d9930cd730f913fc4e61bcd8901ec27c424114c3e887ed372497f0c2cf85839b8443e76988b34] |
642 | 641 | # - Private Key (Hex): [308193020100301306072a8648ce3d020106082a8648ce3d0301070479307702010104205ecafd90caa7be45c42e1f3f32571632b8409e6e6249d7124f4ba56fab3c8083a00a06082a8648ce3d030107a144034200045017c87a1c1768264656b3b355434b0def6edb8b9bf166a4762d9930cd730f913fc4e61bcd8901ec27c424114c3e887ed372497f0c2cf85839b8443e76988b34], |
643 | 642 | public_x: "${LWM2M_SERVER_PUBLIC_X_BS:5017c87a1c1768264656b3b355434b0def6edb8b9bf166a4762d9930cd730f91}" |
644 | 643 | public_y: "${LWM2M_SERVER_PUBLIC_Y_BS:3fc4e61bcd8901ec27c424114c3e887ed372497f0c2cf85839b8443e76988b34}" |
645 | - private_encoded: "${LWM2M_SERVER_PRIVATE_ENCODED_BS:308193020100301306072a8648ce3d020106082a8648ce3d0301070479307702010104205ecafd90caa7be45c42e1f3f32571632b8409e6e6249d7124f4ba56fab3c8083a00a06082a8648ce3d030107a144034200045017c87a1c1768264656b3b355434b0def6edb8b9bf166a4762d9930cd730f913fc4e61bcd8901ec27c424114c3e887ed372497f0c2cf85839b8443e76988b34}" # Only Certificate_x509: | |
646 | - alias: "${LWM2M_KEYSTORE_ALIAS_BOOTSTRAP:bootstrap}" | |
644 | + private_encoded: "${LWM2M_SERVER_PRIVATE_ENCODED_BS:308193020100301306072a8648ce3d020106082a8648ce3d0301070479307702010104205ecafd90caa7be45c42e1f3f32571632b8409e6e6249d7124f4ba56fab3c8083a00a06082a8648ce3d030107a144034200045017c87a1c1768264656b3b355434b0def6edb8b9bf166a4762d9930cd730f913fc4e61bcd8901ec27c424114c3e887ed372497f0c2cf85839b8443e76988b34}" | |
645 | + # Only Certificate_x509: | |
646 | + alias: "${LWM2M_KEYSTORE_ALIAS_BS:bootstrap}" | |
647 | 647 | # Use redis for Security and Registration stores |
648 | 648 | redis.enabled: "${LWM2M_REDIS_ENABLED:false}" |
649 | 649 | ... | ... |
... | ... | @@ -101,7 +101,7 @@ public class LwM2mTransportRequest { |
101 | 101 | @PostConstruct |
102 | 102 | public void init() { |
103 | 103 | this.converter = LwM2mValueConverterImpl.getInstance(); |
104 | - executorResponse = Executors.newFixedThreadPool(this.lwM2mTransportContextServer.getLwM2MTransportConfigServer().getRequestPoolSize(), | |
104 | + executorResponse = Executors.newFixedThreadPool(this.lwM2mTransportContextServer.getLwM2MTransportConfigServer().getResponsePoolSize(), | |
105 | 105 | new NamedThreadFactory(String.format("LwM2M %s channel response", RESPONSE_CHANNEL))); |
106 | 106 | } |
107 | 107 | ... | ... |
... | ... | @@ -92,12 +92,8 @@ public class LwM2MTransportConfigServer { |
92 | 92 | private boolean recommendedSupportedGroups; |
93 | 93 | |
94 | 94 | @Getter |
95 | - @Value("${transport.lwm2m.request_pool_size:}") | |
96 | - private int requestPoolSize; | |
97 | - | |
98 | - @Getter | |
99 | - @Value("${transport.lwm2m.request_error_pool_size:}") | |
100 | - private int requestErrorPoolSize; | |
95 | + @Value("${transport.lwm2m.response_pool_size:}") | |
96 | + private int responsePoolSize; | |
101 | 97 | |
102 | 98 | @Getter |
103 | 99 | @Value("${transport.lwm2m.registered_pool_size:}") | ... | ... |
... | ... | @@ -129,8 +129,7 @@ transport: |
129 | 129 | timeout: "${LWM2M_TIMEOUT:120000}" |
130 | 130 | recommended_ciphers: "${LWM2M_RECOMMENDED_CIPHERS:false}" |
131 | 131 | recommended_supported_groups: "${LWM2M_RECOMMENDED_SUPPORTED_GROUPS:true}" |
132 | - request_pool_size: "${LWM2M_REQUEST_POOL_SIZE:100}" | |
133 | - request_error_pool_size: "${LWM2M_REQUEST_ERROR_POOL_SIZE:10}" | |
132 | + response_pool_size: "${LWM2M_RESPONSE_POOL_SIZE:100}" | |
134 | 133 | registered_pool_size: "${LWM2M_REGISTERED_POOL_SIZE:10}" |
135 | 134 | update_registered_pool_size: "${LWM2M_UPDATE_REGISTERED_POOL_SIZE:10}" |
136 | 135 | un_registered_pool_size: "${LWM2M_UN_REGISTERED_POOL_SIZE:10}" |
... | ... | @@ -139,8 +138,7 @@ transport: |
139 | 138 | # To get helps about files format and how to generate it, see: https://github.com/eclipse/leshan/wiki/Credential-files-format |
140 | 139 | # Create new X509 Certificates: common/transport/lwm2m/src/main/resources/credentials/shell/lwM2M_credentials.sh |
141 | 140 | key_store_type: "${LWM2M_KEYSTORE_TYPE:JKS}" |
142 | - # key_store_type: "${LWM2M_KEYSTORE_TYPE:PKCS12}" | |
143 | - # key_store_path_file: "${KEY_STORE_PATH_FILE:/transport/lwm2m/src/main/data/credentials/serverKeyStore.jks}" | |
141 | + # key_store_path_file: "${KEY_STORE_PATH_FILE:/transport/lwm2m/src/main/data/credentials/serverKeyStore.jks}" | |
144 | 142 | key_store_path_file: "${KEY_STORE_PATH_FILE:}" |
145 | 143 | key_store_password: "${LWM2M_KEYSTORE_PASSWORD_SERVER:server_ks_password}" |
146 | 144 | root_alias: "${LWM2M_SERVER_ROOT_CA:rootca}" |
... | ... | @@ -159,24 +157,26 @@ transport: |
159 | 157 | # - Elliptic Curve parameters : [secp256r1 [NIST P-256, X9.62 prime256v1] (1.2.840.10045.3.1.7)] |
160 | 158 | public_x: "${LWM2M_SERVER_PUBLIC_X:05064b9e6762dd8d8b8a52355d7b4d8b9a3d64e6d2ee277d76c248861353f358}" |
161 | 159 | public_y: "${LWM2M_SERVER_PUBLIC_Y:5eeb1838e4f9e37b31fa347aef5ce3431eb54e0a2506910c5e0298817445721b}" |
162 | - private_encoded: "${LWM2M_SERVER_PRIVATE_ENCODED:308193020100301306072a8648ce3d020106082a8648ce3d030107047930770201010420dc774b309e547ceb48fee547e104ce201a9c48c449dc5414cd04e7f5cf05f67ba00a06082a8648ce3d030107a1440342000405064b9e6762dd8d8b8a52355d7b4d8b9a3d64e6d2ee277d76c248861353f3585eeb1838e4f9e37b31fa347aef5ce3431eb54e0a2506910c5e0298817445721b}" # Only Certificate_x509: | |
160 | + private_encoded: "${LWM2M_SERVER_PRIVATE_ENCODED:308193020100301306072a8648ce3d020106082a8648ce3d030107047930770201010420dc774b309e547ceb48fee547e104ce201a9c48c449dc5414cd04e7f5cf05f67ba00a06082a8648ce3d030107a1440342000405064b9e6762dd8d8b8a52355d7b4d8b9a3d64e6d2ee277d76c248861353f3585eeb1838e4f9e37b31fa347aef5ce3431eb54e0a2506910c5e0298817445721b}" | |
161 | + # Only Certificate_x509: | |
163 | 162 | alias: "${LWM2M_KEYSTORE_ALIAS_SERVER:server}" |
164 | 163 | bootstrap: |
165 | - enable: "${LWM2M_BOOTSTRAP_ENABLED:true}" | |
166 | - id: "${LWM2M_SERVER_ID:111}" | |
164 | + enable: "${LWM2M_ENABLED_BS:true}" | |
165 | + id: "${LWM2M_SERVER_ID_BS:111}" | |
167 | 166 | bind_address: "${LWM2M_BIND_ADDRESS_BS:0.0.0.0}" |
168 | 167 | bind_port_no_sec: "${LWM2M_BIND_PORT_NO_SEC_BS:5687}" |
169 | 168 | secure: |
170 | 169 | bind_address_security: "${LWM2M_BIND_ADDRESS_BS:0.0.0.0}" |
171 | - bind_port_security: "${LWM2M_BIND_PORT_SEC_BS:5688}" | |
170 | + bind_port_security: "${LWM2M_BIND_PORT_SECURITY_BS:5688}" | |
172 | 171 | # Only for RPK: Public & Private Key. If the keystore file is missing or not working |
173 | 172 | # - Elliptic Curve parameters : [secp256r1 [NIST P-256, X9.62 prime256v1] (1.2.840.10045.3.1.7)] |
174 | 173 | # - Public Key (Hex): [3059301306072a8648ce3d020106082a8648ce3d030107034200045017c87a1c1768264656b3b355434b0def6edb8b9bf166a4762d9930cd730f913fc4e61bcd8901ec27c424114c3e887ed372497f0c2cf85839b8443e76988b34] |
175 | 174 | # - Private Key (Hex): [308193020100301306072a8648ce3d020106082a8648ce3d0301070479307702010104205ecafd90caa7be45c42e1f3f32571632b8409e6e6249d7124f4ba56fab3c8083a00a06082a8648ce3d030107a144034200045017c87a1c1768264656b3b355434b0def6edb8b9bf166a4762d9930cd730f913fc4e61bcd8901ec27c424114c3e887ed372497f0c2cf85839b8443e76988b34], |
176 | 175 | public_x: "${LWM2M_SERVER_PUBLIC_X_BS:5017c87a1c1768264656b3b355434b0def6edb8b9bf166a4762d9930cd730f91}" |
177 | 176 | public_y: "${LWM2M_SERVER_PUBLIC_Y_BS:3fc4e61bcd8901ec27c424114c3e887ed372497f0c2cf85839b8443e76988b34}" |
178 | - private_encoded: "${LWM2M_SERVER_PRIVATE_ENCODED_BS:308193020100301306072a8648ce3d020106082a8648ce3d0301070479307702010104205ecafd90caa7be45c42e1f3f32571632b8409e6e6249d7124f4ba56fab3c8083a00a06082a8648ce3d030107a144034200045017c87a1c1768264656b3b355434b0def6edb8b9bf166a4762d9930cd730f913fc4e61bcd8901ec27c424114c3e887ed372497f0c2cf85839b8443e76988b34}" # Only Certificate_x509: | |
179 | - alias: "${LWM2M_KEYSTORE_ALIAS_BOOTSTRAP:bootstrap}" | |
177 | + private_encoded: "${LWM2M_SERVER_PRIVATE_ENCODED_BS:308193020100301306072a8648ce3d020106082a8648ce3d0301070479307702010104205ecafd90caa7be45c42e1f3f32571632b8409e6e6249d7124f4ba56fab3c8083a00a06082a8648ce3d030107a144034200045017c87a1c1768264656b3b355434b0def6edb8b9bf166a4762d9930cd730f913fc4e61bcd8901ec27c424114c3e887ed372497f0c2cf85839b8443e76988b34}" | |
178 | + # Only Certificate_x509: | |
179 | + alias: "${LWM2M_KEYSTORE_ALIAS_BS:bootstrap}" | |
180 | 180 | # Use redis for Security and Registration stores |
181 | 181 | redis.enabled: "${LWM2M_REDIS_ENABLED:false}" |
182 | 182 | ... | ... |