diff --git a/application/pom.xml b/application/pom.xml index 62c9f6abbc..3aff9fb365 100644 --- a/application/pom.xml +++ b/application/pom.xml @@ -21,9 +21,9 @@ org.thingsboard 0.0.1-SNAPSHOT - server + thingsboard - org.thingsboard.server + org.thingsboard application jar @@ -47,35 +47,35 @@ linux-x86_64 - org.thingsboard.server + org.thingsboard extensions-api - org.thingsboard.server + org.thingsboard extensions-core - org.thingsboard.server.common + org.thingsboard.common transport - org.thingsboard.server.transport + org.thingsboard.transport http - org.thingsboard.server.transport + org.thingsboard.transport coap - org.thingsboard.server.transport + org.thingsboard.transport mqtt - org.thingsboard.server + org.thingsboard dao - org.thingsboard.server + org.thingsboard dao test-jar test @@ -103,7 +103,7 @@ test - org.thingsboard.server + org.thingsboard ui ${project.version} runtime @@ -140,26 +140,6 @@ org.springframework spring-context-support - - org.springframework.boot - spring-boot-starter-test - test - - - org.springframework.security - spring-security-test - test - - - com.jayway.jsonpath - json-path - test - - - com.jayway.jsonpath - json-path-assert - test - com.typesafe.akka akka-actor_${scala.version} @@ -184,16 +164,6 @@ ch.qos.logback logback-classic - - junit - junit - test - - - org.mockito - mockito-all - test - javax.mail mail @@ -218,12 +188,50 @@ io.grpc grpc-stub + + io.springfox + springfox-swagger-ui + + + io.springfox + springfox-swagger2 + org.thingsboard.server tools 0.0.1-SNAPSHOT test + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.security + spring-security-test + test + + + com.jayway.jsonpath + json-path + test + + + com.jayway.jsonpath + json-path-assert + test + + + junit + junit + test + + + org.mockito + mockito-all + test + @@ -337,17 +345,17 @@ ${project.build.directory}/extensions - org.thingsboard.server.extensions + org.thingsboard.extensions extension-rabbitmq extension - org.thingsboard.server.extensions + org.thingsboard.extensions extension-rest-api-call extension - org.thingsboard.server.extensions + org.thingsboard.extensions extension-kafka extension diff --git a/application/src/main/java/org/thingsboard/server/ThingsboardServerApplication.java b/application/src/main/java/org/thingsboard/server/ThingsboardServerApplication.java index f082824ab7..9f1bce3a71 100644 --- a/application/src/main/java/org/thingsboard/server/ThingsboardServerApplication.java +++ b/application/src/main/java/org/thingsboard/server/ThingsboardServerApplication.java @@ -19,11 +19,13 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; +import springfox.documentation.swagger2.annotations.EnableSwagger2; import java.util.Arrays; @EnableAutoConfiguration @SpringBootApplication +@EnableSwagger2 @ComponentScan({"org.thingsboard.server"}) public class ThingsboardServerApplication { diff --git a/application/src/main/java/org/thingsboard/server/config/SwaggerConfiguration.java b/application/src/main/java/org/thingsboard/server/config/SwaggerConfiguration.java new file mode 100644 index 0000000000..59e97b751d --- /dev/null +++ b/application/src/main/java/org/thingsboard/server/config/SwaggerConfiguration.java @@ -0,0 +1,78 @@ +/** + * Copyright © 2016 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.server.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.thingsboard.server.common.data.security.Authority; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.service.*; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spi.service.contexts.SecurityContext; +import springfox.documentation.spring.web.plugins.Docket; + +import java.util.List; + +import static com.google.common.collect.Lists.newArrayList; + +@Configuration +public class SwaggerConfiguration { + + @Bean + public Docket thingsboardApi() { + return new Docket(DocumentationType.SWAGGER_2) + .groupName("thingsboard") + .apiInfo(apiInfo()) + .select() + .paths(PathSelectors.any()) + .build() + .securitySchemes(newArrayList(jwtTokenKey())) + .securityContexts(newArrayList(securityContext())); + } + + private ApiKey jwtTokenKey() { + return new ApiKey("X-Authorization", "JWT token", "header"); + } + + private SecurityContext securityContext() { + return SecurityContext.builder() + .securityReferences(defaultAuth()) + .forPaths(PathSelectors.regex("/api.*")) + .build(); + } + + List defaultAuth() { + AuthorizationScope[] authorizationScopes = new AuthorizationScope[3]; + authorizationScopes[0] = new AuthorizationScope(Authority.SYS_ADMIN.name(), "System administrator"); + authorizationScopes[1] = new AuthorizationScope(Authority.TENANT_ADMIN.name(), "Tenant administrator"); + authorizationScopes[2] = new AuthorizationScope(Authority.CUSTOMER_USER.name(), "Customer"); + return newArrayList( + new SecurityReference("X-Authorization", authorizationScopes)); + } + + private ApiInfo apiInfo() { + return new ApiInfoBuilder() + .title("Thingsboard REST API") + .description("For instructions how to authorize requests please visit Documentation page") + .contact(new Contact("Thingsboard team", "http://thingsboard.io", "info@thingsboard.io")) + .license("Apache License Version 2.0") + .licenseUrl("https://github.com/thingsboard/thingsboard/blob/master/LICENSE") + .version("2.0") + .build(); + } + +} diff --git a/application/src/main/java/org/thingsboard/server/config/ThingsboardSecurityConfiguration.java b/application/src/main/java/org/thingsboard/server/config/ThingsboardSecurityConfiguration.java index ec6ca81367..7ae4604c22 100644 --- a/application/src/main/java/org/thingsboard/server/config/ThingsboardSecurityConfiguration.java +++ b/application/src/main/java/org/thingsboard/server/config/ThingsboardSecurityConfiguration.java @@ -53,10 +53,11 @@ public class ThingsboardSecurityConfiguration extends WebSecurityConfigurerAdapt public static final String JWT_TOKEN_HEADER_PARAM = "X-Authorization"; public static final String JWT_TOKEN_QUERY_PARAM = "token"; + public static final String WEBJARS_ENTRY_POINT = "/webjars/**"; public static final String DEVICE_API_ENTRY_POINT = "/api/v1/**"; public static final String FORM_BASED_LOGIN_ENTRY_POINT = "/api/auth/login"; public static final String TOKEN_REFRESH_ENTRY_POINT = "/api/auth/token"; - public static final String[] NON_TOKEN_BASED_AUTH_ENTRY_POINTS = new String[] {"/index.html", "/static/**", "/api/noauth/**"}; + public static final String[] NON_TOKEN_BASED_AUTH_ENTRY_POINTS = new String[] {"/index.html", "/static/**", "/api/noauth/**", "/webjars/**"}; public static final String TOKEN_BASED_AUTH_ENTRY_POINT = "/api/**"; public static final String WS_TOKEN_BASED_AUTH_ENTRY_POINT = "/api/ws/**"; @@ -89,7 +90,7 @@ public class ThingsboardSecurityConfiguration extends WebSecurityConfigurerAdapt @Bean protected JwtTokenAuthenticationProcessingFilter buildJwtTokenAuthenticationProcessingFilter() throws Exception { List pathsToSkip = new ArrayList(Arrays.asList(NON_TOKEN_BASED_AUTH_ENTRY_POINTS)); - pathsToSkip.addAll(Arrays.asList(WS_TOKEN_BASED_AUTH_ENTRY_POINT, TOKEN_REFRESH_ENTRY_POINT, FORM_BASED_LOGIN_ENTRY_POINT, DEVICE_API_ENTRY_POINT)); + pathsToSkip.addAll(Arrays.asList(WS_TOKEN_BASED_AUTH_ENTRY_POINT, TOKEN_REFRESH_ENTRY_POINT, FORM_BASED_LOGIN_ENTRY_POINT, DEVICE_API_ENTRY_POINT, WEBJARS_ENTRY_POINT)); SkipPathRequestMatcher matcher = new SkipPathRequestMatcher(pathsToSkip, TOKEN_BASED_AUTH_ENTRY_POINT); JwtTokenAuthenticationProcessingFilter filter = new JwtTokenAuthenticationProcessingFilter(failureHandler, jwtHeaderTokenExtractor, matcher); @@ -142,6 +143,7 @@ public class ThingsboardSecurityConfiguration extends WebSecurityConfigurerAdapt .sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .authorizeRequests() + .antMatchers(WEBJARS_ENTRY_POINT).permitAll() // Webjars .antMatchers(DEVICE_API_ENTRY_POINT).permitAll() // Device HTTP Transport API .antMatchers(FORM_BASED_LOGIN_ENTRY_POINT).permitAll() // Login end-point .antMatchers(TOKEN_REFRESH_ENTRY_POINT).permitAll() // Token refresh end-point diff --git a/application/src/main/java/org/thingsboard/server/config/WebConfig.java b/application/src/main/java/org/thingsboard/server/config/WebConfig.java index 3a2234a2fb..02d8cfc2a8 100644 --- a/application/src/main/java/org/thingsboard/server/config/WebConfig.java +++ b/application/src/main/java/org/thingsboard/server/config/WebConfig.java @@ -21,7 +21,7 @@ import org.springframework.web.bind.annotation.RequestMapping; @Controller public class WebConfig { - @RequestMapping(value = "/{path:^(?!api$)(?!static$)[^\\.]*}/**") + @RequestMapping(value = "/{path:^(?!api$)(?!static$)(?!webjars$)[^\\.]*}/**") public String redirect() { return "forward:/index.html"; } diff --git a/application/src/main/java/org/thingsboard/server/controller/AdminController.java b/application/src/main/java/org/thingsboard/server/controller/AdminController.java index cace783099..e97885d1c5 100644 --- a/application/src/main/java/org/thingsboard/server/controller/AdminController.java +++ b/application/src/main/java/org/thingsboard/server/controller/AdminController.java @@ -15,6 +15,7 @@ */ package org.thingsboard.server.controller; +import io.swagger.annotations.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; @@ -45,6 +46,18 @@ public class AdminController extends BaseController { } @PreAuthorize("hasAuthority('SYS_ADMIN')") + @ApiOperation( + value = "Save admin settings", notes = "Saves admin settings", + response = AdminSettings.class, + authorizations = { + @Authorization(value = "X-Authorization", scopes = { + @AuthorizationScope(scope = "SYS_ADMIN", description = "") + })}) + @ApiResponses(value = { + @ApiResponse(code = 200, response = AdminSettings.class, message = "Admin settings successfully updated"), + @ApiResponse(code = 400, message = "Invalid admin settings payload supplied"), + @ApiResponse(code = 404, message = "Admin settings not found")} + ) @RequestMapping(value = "/settings", method = RequestMethod.POST) @ResponseBody public AdminSettings saveAdminSettings(@RequestBody AdminSettings adminSettings) throws ThingsboardException { diff --git a/application/src/main/java/org/thingsboard/server/controller/RuleController.java b/application/src/main/java/org/thingsboard/server/controller/RuleController.java index 3c04619529..a21f5dcd29 100644 --- a/application/src/main/java/org/thingsboard/server/controller/RuleController.java +++ b/application/src/main/java/org/thingsboard/server/controller/RuleController.java @@ -15,6 +15,9 @@ */ package org.thingsboard.server.controller; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; import org.springframework.http.HttpStatus; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; @@ -34,6 +37,12 @@ import java.util.List; @RequestMapping("/api") public class RuleController extends BaseController { + @ApiOperation(value = "getRuleById", nickname = "Get Rule By ID") + @ApiResponses(value = { + @ApiResponse(code = 200, message = "Success", response = RuleMetaData.class), + @ApiResponse(code = 401, message = "Unauthorized"), + @ApiResponse(code = 403, message = "Forbidden"), + @ApiResponse(code = 404, message = "Not Found")}) @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')") @RequestMapping(value = "/rule/{ruleId}", method = RequestMethod.GET) @ResponseBody diff --git a/common/data/pom.xml b/common/data/pom.xml index b458ef1e37..08de1a46f8 100644 --- a/common/data/pom.xml +++ b/common/data/pom.xml @@ -19,11 +19,11 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - org.thingsboard.server + org.thingsboard 0.0.1-SNAPSHOT common - org.thingsboard.server.common + org.thingsboard.common data jar diff --git a/common/message/pom.xml b/common/message/pom.xml index be1492813a..5d433d1667 100644 --- a/common/message/pom.xml +++ b/common/message/pom.xml @@ -19,11 +19,11 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - org.thingsboard.server + org.thingsboard 0.0.1-SNAPSHOT common - org.thingsboard.server.common + org.thingsboard.common message jar @@ -37,7 +37,7 @@ - org.thingsboard.server.common + org.thingsboard.common data diff --git a/common/pom.xml b/common/pom.xml index 97ff8ab62b..7a21a46e28 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -21,9 +21,9 @@ org.thingsboard 0.0.1-SNAPSHOT - server + thingsboard - org.thingsboard.server + org.thingsboard common pom diff --git a/common/transport/pom.xml b/common/transport/pom.xml index e57d3d790a..198d1e7ef5 100644 --- a/common/transport/pom.xml +++ b/common/transport/pom.xml @@ -19,11 +19,11 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - org.thingsboard.server + org.thingsboard 0.0.1-SNAPSHOT common - org.thingsboard.server.common + org.thingsboard.common transport jar @@ -37,11 +37,11 @@ - org.thingsboard.server.common + org.thingsboard.common data - org.thingsboard.server.common + org.thingsboard.common message diff --git a/dao/pom.xml b/dao/pom.xml index f9f0d56454..2a2aa83783 100644 --- a/dao/pom.xml +++ b/dao/pom.xml @@ -21,9 +21,9 @@ org.thingsboard 0.0.1-SNAPSHOT - server + thingsboard - org.thingsboard.server + org.thingsboard dao jar @@ -37,7 +37,7 @@ - org.thingsboard.server.common + org.thingsboard.common data diff --git a/dao/src/main/resources/demo-data.cql b/dao/src/main/resources/demo-data.cql index e879274a07..5ce642f596 100644 --- a/dao/src/main/resources/demo-data.cql +++ b/dao/src/main/resources/demo-data.cql @@ -204,6 +204,15 @@ VALUES ( '{"description":"Demo device that is used in sample applications that upload data from DHT11 temperature and humidity sensor"}' ); +INSERT INTO thingsboard.device ( id, tenant_id, customer_id, name, search_text, additional_info) +VALUES ( + c8f1a6f0-b993-11e6-8a04-9ff4e1b7933d, + minTimeuuid ( '2016-11-01 01:02:01+0000' ), + minTimeuuid ( 0 ), + 'Raspberry Pi Demo Device', + 'raspberry pi demo device', + '{"description":"Demo device that is used in Raspberry Pi GPIO control sample application"}' +); INSERT INTO thingsboard.device_credentials ( id, device_id, credentials_type, credentials_id) VALUES ( @@ -253,6 +262,14 @@ VALUES ( 'DHT11_DEMO_TOKEN' ); +INSERT INTO thingsboard.device_credentials ( id, device_id, credentials_type, credentials_id) +VALUES ( + now(), + c8f1a6f0-b993-11e6-8a04-9ff4e1b7933d, + 'ACCESS_TOKEN', + 'RASPBERRY_PI_DEMO_TOKEN' +); + /** Demo data **/ /** Demo plugins & rules **/ @@ -430,4 +447,14 @@ VALUES ( '{"description":"Demo dashboard for sample applications that upload temperature and humidity received from DHT11 or DHT22 sensors","widgets":[{"isSystemType":true,"bundleAlias":"digital_gauges","typeAlias":"digital_thermometer","type":"latest","title":"New widget","sizeX":5,"sizeY":5,"config":{"datasources":[{"type":"device","dataKeys":[{"name":"temperature","type":"timeseries","label":"temperature","color":"#2196f3","settings":{},"_hash":0.3720839051412099}],"deviceAliasId":1,"name":"DHT11"}],"timewindow":{"realtime":{"timewindowMs":60000}},"showTitle":false,"backgroundColor":"#000000","color":"rgba(0, 0, 0, 0.87)","padding":"0px","settings":{"maxValue":50,"donutStartAngle":90,"showValue":true,"showMinMax":true,"gaugeWidthScale":1,"levelColors":["#304ffe","#7e57c2","#ff4081","#d32f2f"],"refreshAnimationType":"<>","refreshAnimationTime":700,"startAnimationType":"<>","startAnimationTime":700,"titleFont":{"family":"RobotoDraft","size":12,"style":"normal","weight":"500"},"labelFont":{"family":"RobotoDraft","size":8,"style":"normal","weight":"500"},"valueFont":{"family":"Segment7Standard","style":"normal","weight":"500","size":18},"minMaxFont":{"family":"Segment7Standard","size":12,"style":"normal","weight":"500"},"dashThickness":1.5,"decimals":0,"minValue":0,"units":"°C","gaugeColor":"#333333","neonGlowBrightness":35,"gaugeType":"donut","showTitle":false},"title":"Temperature"},"row":0,"col":0},{"isSystemType":true,"bundleAlias":"digital_gauges","typeAlias":"digital_vertical_bar","type":"latest","title":"New widget","sizeX":3,"sizeY":5,"config":{"datasources":[{"type":"device","dataKeys":[{"name":"humidity","type":"timeseries","label":"humidity","color":"#2196f3","settings":{},"_hash":0.9492802776509441}],"deviceAliasId":"1","name":"DHT11"}],"timewindow":{"realtime":{"timewindowMs":60000}},"showTitle":false,"backgroundColor":"#000000","color":"rgba(0, 0, 0, 0.87)","padding":"0px","settings":{"maxValue":100,"donutStartAngle":90,"showValue":true,"showMinMax":true,"gaugeWidthScale":0.75,"levelColors":["#3d5afe","#f44336"],"refreshAnimationType":"<>","refreshAnimationTime":700,"startAnimationType":"<>","startAnimationTime":700,"titleFont":{"family":"RobotoDraft","size":12,"style":"normal","weight":"500"},"labelFont":{"family":"RobotoDraft","size":8,"style":"normal","weight":"500"},"valueFont":{"family":"Segment7Standard","style":"normal","weight":"500","size":14},"minMaxFont":{"family":"Segment7Standard","size":8,"style":"normal","weight":"normal","color":"#cccccc"},"neonGlowBrightness":20,"decimals":0,"showUnitTitle":true,"gaugeColor":"#171a1c","gaugeType":"verticalBar","showTitle":false,"minValue":0,"dashThickness":1.2},"title":"Humidity"},"row":0,"col":5}],"deviceAliases":{"1":{"alias":"DHT11","deviceId":"c8f1a6f0-b993-11e6-8a04-9ff4e1b7933c"}}}', 'Temperature & Humidity Demo Dashboard', 'temperature & humidity demo dashboard' +); + +INSERT INTO thingsboard.dashboard ( id, tenant_id, customer_id, configuration, title, search_text) +VALUES ( + now(), + minTimeuuid ( '2016-11-01 01:02:01+0000' ), + minTimeuuid ( 0 ), + '{"description":"Demo dashboard for Raspberry PI GPIO Demo","widgets":[{"isSystemType":true,"bundleAlias":"gpio_widgets","typeAlias":"raspberry_pi_gpio_control","type":"rpc","title":"New widget","sizeX":6,"sizeY":10,"config":{"targetDeviceAliases":[],"showTitle":true,"backgroundColor":"#fff","color":"rgba(0, 0, 0, 0.87)","padding":"0px","settings":{"parseGpioStatusFunction":"return body[pin] === true;","gpioStatusChangeRequest":{"method":"setGpioStatus","paramsBody":"{\n \"pin\": \"{$pin}\",\n \"enabled\": \"{$enabled}\"\n}"},"requestTimeout":500,"switchPanelBackgroundColor":"#008a00","gpioStatusRequest":{"method":"getGpioStatus","paramsBody":"{}"},"gpioList":[{"pin":7,"label":"GPIO 4 (GPCLK0)","row":3,"col":0,"_uniqueKey":0},{"pin":11,"label":"GPIO 17","row":5,"col":0,"_uniqueKey":1},{"pin":12,"label":"GPIO 18","row":5,"col":1,"_uniqueKey":2},{"_uniqueKey":3,"pin":13,"label":"GPIO 27","row":6,"col":0},{"_uniqueKey":4,"pin":15,"label":"GPIO 22","row":7,"col":0},{"_uniqueKey":5,"pin":16,"label":"GPIO 23","row":7,"col":1},{"_uniqueKey":6,"pin":18,"label":"GPIO 24","row":8,"col":1},{"_uniqueKey":7,"pin":22,"label":"GPIO 25","row":10,"col":1},{"_uniqueKey":8,"pin":29,"label":"GPIO 5","row":14,"col":0},{"_uniqueKey":9,"pin":31,"label":"GPIO 6","row":15,"col":0},{"_uniqueKey":10,"pin":32,"label":"GPIO 12","row":15,"col":1},{"_uniqueKey":11,"pin":33,"label":"GPIO 13","row":16,"col":0},{"_uniqueKey":12,"pin":35,"label":"GPIO 19","row":17,"col":0},{"_uniqueKey":13,"pin":36,"label":"GPIO 16","row":17,"col":1},{"_uniqueKey":14,"pin":37,"label":"GPIO 26","row":18,"col":0},{"_uniqueKey":15,"pin":38,"label":"GPIO 20","row":18,"col":1},{"_uniqueKey":16,"pin":40,"label":"GPIO 21","row":19,"col":1}]},"title":"Raspberry Pi GPIO Control Panel","datasources":[],"targetDeviceAliasIds":["1"]},"row":0,"col":0},{"isSystemType":true,"bundleAlias":"gpio_widgets","typeAlias":"raspberry_pi_gpio_panel","type":"latest","title":"New widget","sizeX":7,"sizeY":10,"config":{"showTitle":true,"backgroundColor":"#fff","color":"rgba(0, 0, 0, 0.87)","padding":"0px","settings":{"gpioList":[{"pin":1,"label":"3.3V","row":0,"col":0,"color":"#fc9700","_uniqueKey":0},{"pin":2,"label":"5V","row":0,"col":1,"color":"#fb0000","_uniqueKey":1},{"pin":3,"label":"GPIO 2 (I2C1_SDA)","row":1,"col":0,"color":"#02fefb","_uniqueKey":2},{"color":"#fb0000","pin":4,"label":"5V","row":1,"col":1},{"color":"#02fefb","pin":5,"label":"GPIO 3 (I2C1_SCL)","row":2,"col":0},{"color":"#000000","pin":6,"label":"GND","row":2,"col":1},{"color":"#00fd00","pin":7,"label":"GPIO 4 (GPCLK0)","row":3,"col":0},{"color":"#fdfb00","pin":8,"label":"GPIO 14 (UART_TXD)","row":3,"col":1},{"color":"#000000","pin":9,"label":"GND","row":4,"col":0},{"color":"#fdfb00","pin":10,"label":"GPIO 15 (UART_RXD)","row":4,"col":1},{"color":"#00fd00","pin":11,"label":"GPIO 17","row":5,"col":0},{"color":"#00fd00","pin":12,"label":"GPIO 18","row":5,"col":1},{"color":"#00fd00","pin":13,"label":"GPIO 27","row":6,"col":0},{"color":"#000000","pin":14,"label":"GND","row":6,"col":1},{"color":"#00fd00","pin":15,"label":"GPIO 22","row":7,"col":0},{"color":"#00fd00","pin":16,"label":"GPIO 23","row":7,"col":1},{"color":"#fc9700","pin":17,"label":"3.3V","row":8,"col":0},{"color":"#00fd00","pin":18,"label":"GPIO 24","row":8,"col":1},{"color":"#fd01fd","pin":19,"label":"GPIO 10 (SPI_MOSI)","row":9,"col":0},{"color":"#000000","pin":20,"label":"GND","row":9,"col":1},{"color":"#fd01fd","pin":21,"label":"GPIO 9 (SPI_MISO)","row":10,"col":0},{"color":"#00fd00","pin":22,"label":"GPIO 25","row":10,"col":1},{"color":"#fd01fd","pin":23,"label":"GPIO 11 (SPI_SCLK)","row":11,"col":0},{"color":"#fd01fd","pin":24,"label":"GPIO 8 (SPI_CE0)","row":11,"col":1},{"color":"#000000","pin":25,"label":"GND","row":12,"col":0},{"color":"#fd01fd","pin":26,"label":"GPIO 7 (SPI_CE1)","row":12,"col":1},{"color":"#ffffff","pin":27,"label":"ID_SD","row":13,"col":0},{"color":"#ffffff","pin":28,"label":"ID_SC","row":13,"col":1},{"color":"#00fd00","pin":29,"label":"GPIO 5","row":14,"col":0},{"color":"#000000","pin":30,"label":"GND","row":14,"col":1},{"color":"#00fd00","pin":31,"label":"GPIO 6","row":15,"col":0},{"color":"#00fd00","pin":32,"label":"GPIO 12","row":15,"col":1},{"color":"#00fd00","pin":33,"label":"GPIO 13","row":16,"col":0},{"color":"#000000","pin":34,"label":"GND","row":16,"col":1},{"color":"#00fd00","pin":35,"label":"GPIO 19","row":17,"col":0},{"color":"#00fd00","pin":36,"label":"GPIO 16","row":17,"col":1},{"color":"#00fd00","pin":37,"label":"GPIO 26","row":18,"col":0},{"color":"#00fd00","pin":38,"label":"GPIO 20","row":18,"col":1},{"color":"#000000","pin":39,"label":"GND","row":19,"col":0},{"color":"#00fd00","pin":40,"label":"GPIO 21","row":19,"col":1}],"ledPanelBackgroundColor":"#008a00"},"title":"Raspberry Pi GPIO Status Panel","datasources":[{"type":"device","dataKeys":[{"name":"7","type":"attribute","label":"7","color":"#2196f3","settings":{},"_hash":0.20925966435886978},{"name":"11","type":"attribute","label":"11","color":"#4caf50","settings":{},"_hash":0.330267349594344},{"name":"12","type":"attribute","label":"12","color":"#f44336","settings":{},"_hash":0.5040578704481748},{"name":"13","type":"attribute","label":"13","color":"#ffc107","settings":{},"_hash":0.588956328191639},{"name":"15","type":"attribute","label":"15","color":"#607d8b","settings":{},"_hash":0.9229040530336119},{"name":"16","type":"attribute","label":"16","color":"#9c27b0","settings":{},"_hash":0.8692315253041654},{"name":"18","type":"attribute","label":"18","color":"#8bc34a","settings":{},"_hash":0.41465562857521543},{"name":"22","type":"attribute","label":"22","color":"#3f51b5","settings":{},"_hash":0.36135260043112827},{"name":"29","type":"attribute","label":"29","color":"#e91e63","settings":{},"_hash":0.9904592276182183},{"name":"31","type":"attribute","label":"31","color":"#ffeb3b","settings":{},"_hash":0.038330985429919195},{"name":"32","type":"attribute","label":"32","color":"#03a9f4","settings":{},"_hash":0.4334683890135089},{"name":"33","type":"attribute","label":"33","color":"#ff9800","settings":{},"_hash":0.6487255992492305},{"name":"35","type":"attribute","label":"35","color":"#673ab7","settings":{},"_hash":0.971555321150732},{"name":"36","type":"attribute","label":"36","color":"#cddc39","settings":{},"_hash":0.7826129728424382},{"name":"37","type":"attribute","label":"37","color":"#009688","settings":{},"_hash":0.44925676517537627},{"name":"38","type":"attribute","label":"38","color":"#795548","settings":{},"_hash":0.051518155759787465},{"name":"40","type":"attribute","label":"40","color":"#00bcd4","settings":{},"_hash":0.8733296686871144}],"deviceAliasId":1,"name":"RPi"}],"timewindow":{"realtime":{"timewindowMs":60000}}},"row":0,"col":6}],"deviceAliases":{"1":{"alias":"RPi","deviceId":"c8f1a6f0-b993-11e6-8a04-9ff4e1b7933d"}}}', + 'Raspberry PI GPIO Demo Dashboard', + 'raspberry pi gpio demo dashboard' ); \ No newline at end of file diff --git a/docker/.env b/docker/.env new file mode 100644 index 0000000000..ca7f2b0357 --- /dev/null +++ b/docker/.env @@ -0,0 +1 @@ +CASSANDRA_DATA_DIR=/home/docker/cassandra_volume diff --git a/docker/deploy_cassandra_zookeeper.sh b/docker/deploy_cassandra_zookeeper.sh index 6c4cc50592..263ef4927c 100755 --- a/docker/deploy_cassandra_zookeeper.sh +++ b/docker/deploy_cassandra_zookeeper.sh @@ -27,5 +27,5 @@ $command rm -f echo "building images.." $command build -echo "starting cassandra, zookeeper, db-schema images..." -$command up -d cassandra zookeeper db-schema +echo "starting cassandra, zookeeper, thingsboard-db-schema images..." +$command up -d cassandra zookeeper thingsboard-db-schema diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 65b0aa7087..fd1c0a1991 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -18,7 +18,7 @@ version: '2' services: thingsboard: - build: thingsboard + image: "thingsboard/application:0.1" ports: - "8080:8080" - "1883:1883" @@ -27,8 +27,6 @@ services: - cassandra:db - zookeeper:zk - thingsboard-db-schema:thingsboard-db-schema - volumes: - - "../application/target/thingsboard.deb:/root/thingsboard.deb" env_file: - thingsboard.env entrypoint: ./run_thingsboard.sh diff --git a/docker/thingsboard/Dockerfile b/docker/thingsboard/Dockerfile index c145939ee4..1587d79203 100644 --- a/docker/thingsboard/Dockerfile +++ b/docker/thingsboard/Dockerfile @@ -17,6 +17,7 @@ FROM openjdk:8-jre ADD run_thingsboard.sh /root/run_thingsboard.sh +ADD thingsboard.deb /root/thingsboard.deb RUN chmod +x /root/run_thingsboard.sh diff --git a/docker/thingsboard/build_and_deploy.sh b/docker/thingsboard/build_and_deploy.sh new file mode 100755 index 0000000000..937ac4bc1f --- /dev/null +++ b/docker/thingsboard/build_and_deploy.sh @@ -0,0 +1,25 @@ +#!/bin/bash +# +# Copyright © 2016 The Thingsboard Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + + +cp ../../application/target/thingsboard.deb thingsboard.deb + +docker build -t thingsboard/application:0.1 . + +docker login + +docker push thingsboard/application:0.1 \ No newline at end of file diff --git a/extensions-api/pom.xml b/extensions-api/pom.xml index 4af3de3372..c8b9ede80b 100644 --- a/extensions-api/pom.xml +++ b/extensions-api/pom.xml @@ -21,9 +21,9 @@ org.thingsboard 0.0.1-SNAPSHOT - server + thingsboard - org.thingsboard.server + org.thingsboard extensions-api jar @@ -37,11 +37,11 @@ - org.thingsboard.server.common + org.thingsboard.common data - org.thingsboard.server.common + org.thingsboard.common message diff --git a/extensions-core/pom.xml b/extensions-core/pom.xml index b2e2d183c0..61b2833391 100644 --- a/extensions-core/pom.xml +++ b/extensions-core/pom.xml @@ -21,9 +21,9 @@ org.thingsboard 0.0.1-SNAPSHOT - server + thingsboard - org.thingsboard.server + org.thingsboard extensions-core jar @@ -37,7 +37,7 @@ - org.thingsboard.server + org.thingsboard extensions-api provided diff --git a/extensions/extension-kafka/pom.xml b/extensions/extension-kafka/pom.xml index 23a5e4bbbc..27132c2bd4 100644 --- a/extensions/extension-kafka/pom.xml +++ b/extensions/extension-kafka/pom.xml @@ -21,11 +21,11 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - org.thingsboard.server + org.thingsboard 0.0.1-SNAPSHOT extensions - org.thingsboard.server.extensions + org.thingsboard.extensions extension-kafka jar @@ -49,12 +49,12 @@ provided - org.thingsboard.server + org.thingsboard extensions-api provided - org.thingsboard.server + org.thingsboard extensions-core provided diff --git a/extensions/extension-rabbitmq/pom.xml b/extensions/extension-rabbitmq/pom.xml index f2456c5c5e..4f8ea38c8d 100644 --- a/extensions/extension-rabbitmq/pom.xml +++ b/extensions/extension-rabbitmq/pom.xml @@ -19,11 +19,11 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - org.thingsboard.server + org.thingsboard 0.0.1-SNAPSHOT extensions - org.thingsboard.server.extensions + org.thingsboard.extensions extension-rabbitmq jar @@ -41,12 +41,12 @@ amqp-client - org.thingsboard.server + org.thingsboard extensions-api provided - org.thingsboard.server + org.thingsboard extensions-core provided diff --git a/extensions/extension-rest-api-call/pom.xml b/extensions/extension-rest-api-call/pom.xml index 175d7362ea..0214197e5c 100644 --- a/extensions/extension-rest-api-call/pom.xml +++ b/extensions/extension-rest-api-call/pom.xml @@ -21,11 +21,11 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - org.thingsboard.server + org.thingsboard 0.0.1-SNAPSHOT extensions - org.thingsboard.server.extensions + org.thingsboard.extensions extension-rest-api-call jar @@ -49,7 +49,7 @@ provided - org.thingsboard.server + org.thingsboard extensions-api provided @@ -59,7 +59,7 @@ provided - org.thingsboard.server + org.thingsboard extensions-core provided diff --git a/extensions/pom.xml b/extensions/pom.xml index 8609ea7c23..1fcc5d973e 100644 --- a/extensions/pom.xml +++ b/extensions/pom.xml @@ -21,9 +21,9 @@ org.thingsboard 0.0.1-SNAPSHOT - server + thingsboard - org.thingsboard.server + org.thingsboard extensions pom diff --git a/pom.xml b/pom.xml index 488de00932..bd1faaea6b 100755 --- a/pom.xml +++ b/pom.xml @@ -68,6 +68,7 @@ 3.6.1 2.19.1 3.0.2 + 2.6.1 @@ -301,70 +302,70 @@ - org.thingsboard.server + org.thingsboard extensions-api ${project.version} - org.thingsboard.server + org.thingsboard extensions-core ${project.version} - org.thingsboard.server.extensions + org.thingsboard.extensions extension-rabbitmq extension ${project.version} - org.thingsboard.server.extensions + org.thingsboard.extensions extension-rest-api-call extension ${project.version} - org.thingsboard.server.extensions + org.thingsboard.extensions extension-kafka extension ${project.version} - org.thingsboard.server.common + org.thingsboard.common data ${project.version} - org.thingsboard.server.common + org.thingsboard.common message ${project.version} - org.thingsboard.server.common + org.thingsboard.common transport ${project.version} - org.thingsboard.server.transport + org.thingsboard.transport http ${project.version} - org.thingsboard.server.transport + org.thingsboard.transport coap ${project.version} - org.thingsboard.server.transport + org.thingsboard.transport mqtt ${project.version} - org.thingsboard.server + org.thingsboard dao ${project.version} - org.thingsboard.server + org.thingsboard dao ${project.version} test-jar @@ -672,6 +673,16 @@ hazelcast ${hazelcast.version} + + io.springfox + springfox-swagger-ui + ${springfox-swagger.version} + + + io.springfox + springfox-swagger2 + ${springfox-swagger.version} + diff --git a/tools/pom.xml b/tools/pom.xml index f022ac50ef..0eb68df8da 100644 --- a/tools/pom.xml +++ b/tools/pom.xml @@ -21,9 +21,9 @@ org.thingsboard 0.0.1-SNAPSHOT - server + thingsboard - org.thingsboard.server + org.thingsboard tools jar @@ -37,7 +37,7 @@ - org.thingsboard.server.common + org.thingsboard.common data diff --git a/transport/coap/pom.xml b/transport/coap/pom.xml index 6ddf64bd9a..6634165a17 100644 --- a/transport/coap/pom.xml +++ b/transport/coap/pom.xml @@ -19,11 +19,11 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - org.thingsboard.server + org.thingsboard 0.0.1-SNAPSHOT transport - org.thingsboard.server.transport + org.thingsboard.transport coap jar @@ -37,7 +37,7 @@ - org.thingsboard.server.common + org.thingsboard.common transport diff --git a/transport/http/pom.xml b/transport/http/pom.xml index 665a152657..a13d26f36e 100644 --- a/transport/http/pom.xml +++ b/transport/http/pom.xml @@ -19,11 +19,11 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - org.thingsboard.server + org.thingsboard 0.0.1-SNAPSHOT transport - org.thingsboard.server.transport + org.thingsboard.transport http jar @@ -37,7 +37,7 @@ - org.thingsboard.server.common + org.thingsboard.common transport diff --git a/transport/mqtt/pom.xml b/transport/mqtt/pom.xml index 045bb1f3b9..3941544700 100644 --- a/transport/mqtt/pom.xml +++ b/transport/mqtt/pom.xml @@ -19,11 +19,11 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - org.thingsboard.server + org.thingsboard 0.0.1-SNAPSHOT transport - org.thingsboard.server.transport + org.thingsboard.transport mqtt jar @@ -37,7 +37,7 @@ - org.thingsboard.server.common + org.thingsboard.common transport diff --git a/transport/pom.xml b/transport/pom.xml index 4675cdf300..328ab6dbb3 100644 --- a/transport/pom.xml +++ b/transport/pom.xml @@ -21,9 +21,9 @@ org.thingsboard 0.0.1-SNAPSHOT - server + thingsboard - org.thingsboard.server + org.thingsboard transport pom diff --git a/ui/pom.xml b/ui/pom.xml index c9e4c686a6..e7911ff903 100644 --- a/ui/pom.xml +++ b/ui/pom.xml @@ -21,9 +21,9 @@ org.thingsboard 0.0.1-SNAPSHOT - server + thingsboard - org.thingsboard.server + org.thingsboard ui jar diff --git a/ui/src/app/api/telemetry-websocket.service.js b/ui/src/app/api/telemetry-websocket.service.js index f7e35eba60..ab74f0818f 100644 --- a/ui/src/app/api/telemetry-websocket.service.js +++ b/ui/src/app/api/telemetry-websocket.service.js @@ -21,7 +21,7 @@ export default angular.module('thingsboard.api.telemetryWebsocket', [thingsboard .name; /*@ngInject*/ -function TelemetryWebsocketService($log, $websocket, $timeout, $window, types, userService) { +function TelemetryWebsocketService($websocket, $timeout, $window, types, userService) { var isOpening = false, isOpened = false, @@ -57,9 +57,7 @@ function TelemetryWebsocketService($log, $websocket, $timeout, $window, types, u if (isOpened && (cmdsWrapper.tsSubCmds.length > 0 || cmdsWrapper.historyCmds.length > 0 || cmdsWrapper.attrSubCmds.length > 0)) { - $log.debug("Sending subscription commands!"); dataStream.send(angular.copy(cmdsWrapper)).then(function () { - $log.debug("Subscription commands were sent!"); checkToClose(); }); cmdsWrapper.tsSubCmds = []; @@ -69,21 +67,17 @@ function TelemetryWebsocketService($log, $websocket, $timeout, $window, types, u tryOpenSocket(); } - function onError (message) { - $log.debug("Websocket error:"); - $log.debug(message); + function onError (/*message*/) { isOpening = false; } function onOpen () { - $log.debug("Websocket opened"); isOpening = false; isOpened = true; publishCommands(); } function onClose () { - $log.debug("Websocket closed"); isOpening = false; isOpened = false; } diff --git a/ui/src/app/help/help-links.constant.js b/ui/src/app/help/help-links.constant.js index c0e2e891a7..ae2bdc106d 100644 --- a/ui/src/app/help/help-links.constant.js +++ b/ui/src/app/help/help-links.constant.js @@ -46,8 +46,7 @@ var pluginActionsClazzHelpLinkMap = { 'org.thingsboard.server.extensions.rest.action.RestApiCallPluginAction': 'pluginActionRestApiCall' }; -//var helpBaseUrl = "http://thingsboard.io"; -var helpBaseUrl = "http://localhost:4000"; +var helpBaseUrl = "http://thingsboard.io"; export default angular.module('thingsboard.help', []) .constant('helpLinks',