From c3610401d3e6c8f356df19c9f554c522ef9bfbac Mon Sep 17 00:00:00 2001 From: AvantLiu Date: Wed, 15 Dec 2021 20:55:22 +0800 Subject: [PATCH] fix: export_data --- .../src/handler/dgiot_data_handler.erl | 4 +- apps/dgiot_device/src/dgiot_product.erl | 3 +- .../src/handler/dgiot_evidence_handler.erl | 89 +++++---- .../src/aliyun/dgiot_aliyun_auth.erl | 172 ++++++++++-------- apps/dgiot_parse/src/dgiot_parse.erl | 2 +- dgiot_install.sh | 18 +- 6 files changed, 155 insertions(+), 133 deletions(-) diff --git a/apps/dgiot_api/src/handler/dgiot_data_handler.erl b/apps/dgiot_api/src/handler/dgiot_data_handler.erl index c1e07c2aa8..bab05c1acf 100644 --- a/apps/dgiot_api/src/handler/dgiot_data_handler.erl +++ b/apps/dgiot_api/src/handler/dgiot_data_handler.erl @@ -408,7 +408,7 @@ do_request(post_import_data, #{<<"className">> := Class, <<"file">> := FileInfo} ?LOG(info, "Res ~p", [Res]), lists:concat([Acc, Res]) end, - case dgiot_parse:import(Class, Data, 5000, Fun, []) of + case dgiot_parse:import(Class, Data, length(Data), Fun, []) of {error, Reason1} -> {error, Reason1}; Result -> @@ -538,7 +538,7 @@ get_class(Name, Filter, FileName, SessionToken) -> [{"X-Parse-Session-Token", SessionToken}], [{from, rest}]) of {ok, #{<<"results">> := Data}} -> NewData = lists:foldl(fun(X, Acc) -> - Acc ++ [maps:without([<<"createdAt">>, <<"updatedAt">>], X)] + Acc ++ [maps:without([<<"createdAt">>, <<"updatedAt">>, <<"children">>], X)] end, [], Data), BinFile = unicode:characters_to_binary(jsx:encode(NewData)), case zip:create(FileName, [{"data.json", BinFile}], [memory]) of diff --git a/apps/dgiot_device/src/dgiot_product.erl b/apps/dgiot_device/src/dgiot_product.erl index 3ff7cbd185..6ada029476 100644 --- a/apps/dgiot_device/src/dgiot_product.erl +++ b/apps/dgiot_device/src/dgiot_product.erl @@ -364,12 +364,13 @@ create_product(#{<<"name">> := ProductName, <<"devType">> := DevType, dgiot_parse:update_object(<<"Product">>, ObjectId, Product, [{"X-Parse-Session-Token", SessionToken}], [{from, rest}]); _ -> + ACL = maps:get(<<"ACL">>, Product, #{}), case dgiot_auth:get_session(SessionToken) of #{<<"roles">> := Roles} = _User -> [#{<<"name">> := Role} | _] = maps:values(Roles), dgiot_parse:create_object(<<"Product">>, Product#{ - <<"ACL">> => #{<<"role:", Role/binary>> => #{ + <<"ACL">> => ACL#{<<"role:", Role/binary>> => #{ <<"read">> => true, <<"write">> => true} }, diff --git a/apps/dgiot_evidence/src/handler/dgiot_evidence_handler.erl b/apps/dgiot_evidence/src/handler/dgiot_evidence_handler.erl index 66bc4aa741..00f4bbee17 100644 --- a/apps/dgiot_evidence/src/handler/dgiot_evidence_handler.erl +++ b/apps/dgiot_evidence/src/handler/dgiot_evidence_handler.erl @@ -174,7 +174,7 @@ do_request(post_reporttemp, #{<<"name">> := Name, <<"devType">> := DevType, <<"c %% 请求:POST /iotapi/generatereport do_request(post_generatereport, #{<<"id">> := TaskId}, #{<<"sessionToken">> := _SessionToken} = _Context, #{headers := #{<<"origin">> := Uri}} = _Req) -> case dgiot_parse:get_object(<<"Device">>, TaskId) of - {ok, #{<<"name">> := TaskName, <<"basedata">> := Basedata, <<"profile">> := #{<<"reporttemp">> := Reporttemp} = Profile, + {ok, #{<<"name">> := TaskName, <<"basedata">> := Basedata, <<"profile">> := #{<<"step">> := Step, <<"reporttemp">> := Reporttemp} = Profile, <<"product">> := #{<<"__type">> := <<"Pointer">>, <<"className">> := <<"Product">>, <<"objectId">> := _ProductId}, <<"parentId">> := #{<<"__type">> := <<"Pointer">>, <<"className">> := <<"Device">>, <<"objectId">> := _ParentId} }} -> @@ -211,41 +211,44 @@ do_request(post_generatereport, #{<<"id">> := TaskId}, #{<<"sessionToken">> := _ Acc end; _ -> - case Type of - <<"text">> -> - - Acc ++ [#{ - <<"type">> => <<"text">>, - <<"source">> => Sources, - <<"name">> => Identifier, - <<"value">> => Value}]; - <<"dynamicTable">> -> + case Step =< 1 of + true -> + Acc; + _ -> + case Type of + <<"text">> -> + Acc ++ [#{ + <<"type">> => <<"text">>, + <<"source">> => Sources, + <<"name">> => Identifier, + <<"value">> => Value}]; + <<"dynamicTable">> -> %% 采样参数 %% Parameter = maps:get(<<"parameter">>, Param, <<"flow">>), %% 采样个数 %% Samplingnumber = maps:get(<<"samplingnumber">>, Param, <<"flow">>), %% 获取表格数据 %% dgiot_evidence:get_Tabledata(ParentId, SessionToken, Parameter, Samplingnumber), - Tabledata = [ - <<"10,0,2.254,28.86,2900,0,0.266537,0,28.86,2.254,0">>, - <<"9,5.13,2.548,27.941,2900,0,0.257272,5.13,27.941,2.548,15.35">>, - <<"8,10.19,2.764,26.545,2900,0,0.242822,10.19,26.545,2.764,26.71">>, - <<"7,15.52,2.94,24.639,2900,0,0.222779,15.52,24.639,2.94,35.5">>, - <<"6,20.25,3.136,22.969,2900,0,0.204725,20.25,22.969,3.136,40.48">>, - <<"5,25.05,3.234,20.726,2900,0,0.180568,25.05,20.726,3.234,43.81">>, - <<"4,30.09,3.43,18.289,2900,0,0.153912,30.09,18.289,3.43,43.78">>, - <<"3,35.29,3.528,15.25,2900,0,0.120728,35.29,15.25,3.528,41.63">>, - <<"2,40.66,3.704,12.29,2900,0,0.087646,40.66,12.29,3.704,36.81">>, - <<"1,46.62,3.763,8.411,2900,0,0.044432,46.62,8.411,3.763,28.44">>], - Acc ++ [#{ - <<"type">> => <<"dynamicTable">>, - <<"source">> => Sources, - <<"tablerow">> => Row, - <<"tablecolumn">> => Column, - <<"name">> => Identifier, - <<"data">> => Tabledata - }]; - <<"image">> -> + Tabledata = [ + <<"10,0,2.254,28.86,2900,0,0.266537,0,28.86,2.254,0">>, + <<"9,5.13,2.548,27.941,2900,0,0.257272,5.13,27.941,2.548,15.35">>, + <<"8,10.19,2.764,26.545,2900,0,0.242822,10.19,26.545,2.764,26.71">>, + <<"7,15.52,2.94,24.639,2900,0,0.222779,15.52,24.639,2.94,35.5">>, + <<"6,20.25,3.136,22.969,2900,0,0.204725,20.25,22.969,3.136,40.48">>, + <<"5,25.05,3.234,20.726,2900,0,0.180568,25.05,20.726,3.234,43.81">>, + <<"4,30.09,3.43,18.289,2900,0,0.153912,30.09,18.289,3.43,43.78">>, + <<"3,35.29,3.528,15.25,2900,0,0.120728,35.29,15.25,3.528,41.63">>, + <<"2,40.66,3.704,12.29,2900,0,0.087646,40.66,12.29,3.704,36.81">>, + <<"1,46.62,3.763,8.411,2900,0,0.044432,46.62,8.411,3.763,28.44">>], + Acc ++ [#{ + <<"type">> => <<"dynamicTable">>, + <<"source">> => Sources, + <<"tablerow">> => Row, + <<"tablecolumn">> => Column, + <<"name">> => Identifier, + <<"data">> => Tabledata + }]; + <<"image">> -> %% PythonBody = #{<<"name">> => <>, <<"path">> => <<"/data/dgiot/go_fastdfs/files/dgiot_file/pump_pytoh/">>}, %% Imagepath = %% case catch base64:decode(os:cmd("python3 /data/dgiot/dgiot/lib/dgiot_evidence-4.3.0/priv/python/drawxnqx.py " ++ dgiot_utils:to_list(base64:encode(jsx:encode(PythonBody))))) of @@ -255,16 +258,17 @@ do_request(post_generatereport, #{<<"id">> := TaskId}, #{<<"sessionToken">> := _ %% Path %% end, %% Repath = re:replace(dgiot_utils:to_list(Imagepath), "/data/dgiot/go_fastdfs/files", "", [global, {return, binary}, unicode]), - Acc ++ [#{ - <<"type">> => <<"image">>, - <<"source">> => Sources, - <<"name">> => Identifier, - <<"url">> => <<"https://pump.dgiotcloud.com/dgiot_file/device/1639483984.jpg">>, - <<"width">> => 600, - <<"height">> => 330 - }]; - _ -> - Acc + Acc ++ [#{ + <<"type">> => <<"image">>, + <<"source">> => Sources, + <<"name">> => Identifier, + <<"url">> => <<"https://pump.dgiotcloud.com/dgiot_file/device/1639483984.jpg">>, + <<"width">> => 600, + <<"height">> => 330 + }]; + _ -> + Acc + end end end end, [], Params), @@ -399,6 +403,11 @@ do_report(Config, DevType, Name, SessionToken, FullPath, Uri) -> <<"devType">> => DevType, <<"desc">> => <<"0">>, <<"nodeType">> => 1, + <<"ACL">> => #{<<"role:admin">> => #{ + <<"read">> => true, + <<"write">> => true}, + <<"*">> => #{<<"read">> => true} + }, <<"channel">> => #{<<"type">> => 1, <<"tdchannel">> => <<"24b9b4bc50">>, <<"taskchannel">> => <<"0edaeb918e">>, <<"otherchannel">> => [<<"11ed8ad9f2">>]}, <<"netType">> => <<"Evidence">>, <<"category">> => #{<<"objectId">> => CategoryId, <<"__type">> => <<"Pointer">>, <<"className">> => <<"Category">>}, diff --git a/apps/dgiot_http/src/aliyun/dgiot_aliyun_auth.erl b/apps/dgiot_http/src/aliyun/dgiot_aliyun_auth.erl index be7033d451..0048724f13 100644 --- a/apps/dgiot_http/src/aliyun/dgiot_aliyun_auth.erl +++ b/apps/dgiot_http/src/aliyun/dgiot_aliyun_auth.erl @@ -177,87 +177,99 @@ jwtlogin(Idtoken) -> Path = code:priv_dir(dgiot_http), {ok, PublcPem} = file:read_file(Path ++ "/jwt/jwt_public_key_pkc8.pem"), Algorithm = dgiot_utils:to_atom(application:get_env(dgiot_http, jwt_algorithm, <<"rs256">>)), - case catch jwerl:verify(Idtoken, Algorithm, PublcPem) of - {'EXIT', _Error} -> - {ok, #{<<"code">> => 500, <<"msg">> => <<"operation error">>}}; - {ok, #{<<"udAccountUuid">> := UdAccountUuid, username := Username} = TokenData} -> - Mobile = maps:get(<<"mobile">>, TokenData, <<"">>), - Email = maps:get(email, TokenData, <>), - Name = maps:get(name, TokenData, Username), - UserBody = #{ - <<"email">> => Email, - <<"emailVerified">> => true, - <<"nick">> => Name, - <<"password">> => UdAccountUuid, - <<"phone">> => Mobile, - <<"username">> => Username, - <<"tag">> => #{ - <<"companyinfo">> => #{ - <<"Copyright">> => <<"© 2017-2021 温岭水泵远程检测中心 Corporation, All Rights Reserved"/utf8>>, - <<"backgroundimage">> => <<"/dgiot_file/user/profile/Klht7ERlYn_companyinfo_backgroundimage.jpg?timestamp=1636974751417">>, - <<"logo">> => <<"/group1/default/20211019/18/33/4/微信图片_20210705103613.jpg"/utf8>>, - <<"name">> => <<"温岭水泵远程检测中心"/utf8>>, - <<"title">> => <<"欢迎登录温岭水泵远程检测中心"/utf8>>, - <<"_mimg">> => <<"/dgiot_file/user/profile/Klht7ERlYn_companyinfo__mimg.jpeg?timestamp=1635245663651">>, - <<"_pcimg">> => <<"/dgiot_file/user/profile/Klht7ERlYn_companyinfo__pcimg.jpeg?timestamp=1635245685140">> - }, - <<"theme">> => #{ - <<"columnStyle">> => <<"horizontal">>, - <<"fixedHeader">> => true, - <<"layout">> => <<"horizontal">>, - <<"pictureSwitch">> => true, - <<"showFullScreen">> => true, - <<"showLanguage">> => true, - <<"showNotice">> => false, - <<"showProgressBar">> => true, - <<"showRefresh">> => true, - <<"showSearch">> => false, - <<"showTabs">> => true, - <<"showTabsBarIcon">> => false, - <<"showTheme">> => true, - <<"showThemeSetting">> => true, - <<"tabsBarStyle">> => <<"smart">>, - <<"themeName">> => <<"default">> - }, - <<"userinfo">> => #{ - <<"avatar">> => <<"/dgiot_file/user/profile/Klht7ERlYn_userinfo_avatar.png?timestamp=1637914878741">>, + Md5Idtoken = dgiot_utils:to_md5(Idtoken), + case dgiot_data:get({userinfo, Md5Idtoken}) of + not_find -> + case catch jwerl:verify(Idtoken, Algorithm, PublcPem) of + {'EXIT', _Error} -> + {ok, #{<<"code">> => 500, <<"msg">> => <<"operation error">>}}; + {ok, #{<<"udAccountUuid">> := UdAccountUuid, username := Username} = TokenData} -> + Mobile = maps:get(<<"mobile">>, TokenData, <<"">>), + Email = maps:get(email, TokenData, <>), + Name = maps:get(name, TokenData, Username), + UserBody = #{ + <<"email">> => Email, + <<"emailVerified">> => true, + <<"nick">> => Name, + <<"password">> => UdAccountUuid, <<"phone">> => Mobile, - <<"sex">> => "男" - }, - <<"jwt">> => TokenData}}, - _SessionToken = dgiot_parse_handler:get_token(<<228, 186, 167, 228, 184, 154, 229, 164, 167, 232, 132, 145, 231, 148, 168, 230, 136, 183>>), - case dgiot_parse:query_object(<<"_User">>, #{<<"where">> => #{<<"username">> => Username}}) of - {ok, #{<<"results">> := Results}} when length(Results) == 0 -> - case dgiot_parse:get_object(<<"_Role">>, <<"f897518198">>) of - {ok, #{<<"objectId">> := RoleId, <<"name">> := Appname}} -> - SessionToken1 = dgiot_parse_handler:get_token(Appname), - dgiot_parse_handler:create_user(UserBody#{<<"department">> => RoleId}, SessionToken1); - _ -> - Body = #{<<"tempname">> => <<"产业大脑用户"/utf8>>, <<"parent">> => <<"a46c243b51">>, <<"depname">> => <<"产业大脑用户"/utf8>>, - <<"name">> => <<228, 186, 167, 228, 184, 154, 229, 164, 167, 232, 132, 145, 231, 148, 168, 230, 136, 183>>, <<"desc">> => <<"产业大脑用户"/utf8>>}, - SessionToken2 = dgiot_parse_handler:get_token(<<"admin">>), - Department = - case dgiot_role:post_role(Body, SessionToken2) of - {ok, #{<<"objectId">> := RoleId}} -> - RoleId; - _ -> - <<"a46c243b51">> - end, - dgiot_parse_handler:create_user(UserBody#{<<"department">> => Department}, SessionToken2) - end; - {ok, #{<<"results">> := [#{<<"objectId">> := UserId, <<"tag">> := Tag} | _]}} -> - dgiot_parse:update_object(<<"_User">>, UserId, #{<<"tag">> => Tag#{<<"jwt">> => TokenData}}) - end, - UserInfo = - case dgiot_parse_handler:login_by_account(Username, UdAccountUuid) of - {ok, #{<<"objectId">> := _UserId} = UserInfo1} -> - UserInfo1; - {error, _Msg} -> - #{} - end, - {ok, UserInfo#{<<"code">> => 200, <<"username">> => Username, <<"state">> => TokenData, <<"msg">> => <<"operation success">>}}; - _Error -> - {ok, #{<<"code">> => 500, <<"msg">> => <<"operation error">>}} + <<"username">> => Username, + <<"tag">> => #{ + <<"companyinfo">> => #{ + <<"Copyright">> => <<"© 2017-2021 温岭水泵远程检测中心 Corporation, All Rights Reserved"/utf8>>, + <<"backgroundimage">> => <<"/dgiot_file/user/profile/Klht7ERlYn_companyinfo_backgroundimage.jpg?timestamp=1636974751417">>, + <<"logo">> => <<"/group1/default/20211019/18/33/4/微信图片_20210705103613.jpg"/utf8>>, + <<"name">> => <<"温岭水泵远程检测中心"/utf8>>, + <<"title">> => <<"欢迎登录温岭水泵远程检测中心"/utf8>>, + <<"_mimg">> => <<"/dgiot_file/user/profile/Klht7ERlYn_companyinfo__mimg.jpeg?timestamp=1635245663651">>, + <<"_pcimg">> => <<"/dgiot_file/user/profile/Klht7ERlYn_companyinfo__pcimg.jpeg?timestamp=1635245685140">> + }, + <<"theme">> => #{ + <<"columnStyle">> => <<"horizontal">>, + <<"fixedHeader">> => true, + <<"layout">> => <<"horizontal">>, + <<"pictureSwitch">> => true, + <<"showFullScreen">> => true, + <<"showLanguage">> => true, + <<"showNotice">> => false, + <<"showProgressBar">> => true, + <<"showRefresh">> => true, + <<"showSearch">> => false, + <<"showTabs">> => true, + <<"showTabsBarIcon">> => false, + <<"showTheme">> => true, + <<"showThemeSetting">> => true, + <<"tabsBarStyle">> => <<"smart">>, + <<"themeName">> => <<"default">> + }, + <<"userinfo">> => #{ + <<"avatar">> => <<"/dgiot_file/user/profile/Klht7ERlYn_userinfo_avatar.png?timestamp=1637914878741">>, + <<"phone">> => Mobile, + <<"sex">> => "男" + }, + <<"jwt">> => TokenData}}, + _SessionToken = dgiot_parse_handler:get_token(<<228, 186, 167, 228, 184, 154, 229, 164, 167, 232, 132, 145, 231, 148, 168, 230, 136, 183>>), + case dgiot_parse:query_object(<<"_User">>, #{<<"where">> => #{<<"username">> => Username}}) of + {ok, #{<<"results">> := Results}} when length(Results) == 0 -> + case dgiot_parse:get_object(<<"_Role">>, <<"f897518198">>) of + {ok, #{<<"objectId">> := RoleId, <<"name">> := Appname}} -> + SessionToken1 = dgiot_parse_handler:get_token(Appname), + dgiot_parse_handler:create_user(UserBody#{<<"department">> => RoleId}, SessionToken1); + _ -> + Body = #{<<"tempname">> => <<"产业大脑用户"/utf8>>, <<"parent">> => <<"a46c243b51">>, <<"depname">> => <<"产业大脑用户"/utf8>>, + <<"name">> => <<228, 186, 167, 228, 184, 154, 229, 164, 167, 232, 132, 145, 231, 148, 168, 230, 136, 183>>, <<"desc">> => <<"产业大脑用户"/utf8>>}, + SessionToken2 = dgiot_parse_handler:get_token(<<"admin">>), + Department = + case dgiot_role:post_role(Body, SessionToken2) of + {ok, #{<<"objectId">> := RoleId}} -> + RoleId; + _ -> + <<"a46c243b51">> + end, + dgiot_parse_handler:create_user(UserBody#{<<"department">> => Department}, SessionToken2) + end; + {ok, #{<<"results">> := [#{<<"objectId">> := UserId, <<"tag">> := Tag} | _]}} -> + dgiot_parse:update_object(<<"_User">>, UserId, #{<<"tag">> => Tag#{<<"jwt">> => TokenData}}) + end, + UserInfo = + case dgiot_parse_handler:login_by_account(Username, UdAccountUuid) of + {ok, #{<<"objectId">> := _UserId} = UserInfo1} -> + UserInfo1#{<<"code">> => 200, <<"username">> => Username, <<"state">> => TokenData, <<"msg">> => <<"operation success">>}; + {error, _Msg} -> + #{<<"code">> => 200, <<"username">> => Username, <<"state">> => TokenData, <<"msg">> => <<"operation success">>} + end, + dgiot_data:insert({userinfo, Md5Idtoken}, {UserInfo, Username, UdAccountUuid}), + {ok, UserInfo}; + _Error -> + {ok, #{<<"code">> => 500, <<"msg">> => <<"operation error">>}} + end; + {UserInfo2, Username2, UdAccountUuid2} -> + case dgiot_parse_handler:login_by_account(Username2, UdAccountUuid2) of + {ok, #{<<"objectId">> := _UserId} = UserInfo3} -> + {ok, maps:merge(UserInfo2, UserInfo3)}; + {error, _Msg} -> + {ok, UserInfo2} + end end. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%aliyun_test%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/apps/dgiot_parse/src/dgiot_parse.erl b/apps/dgiot_parse/src/dgiot_parse.erl index c84db5680e..19d6c437b4 100644 --- a/apps/dgiot_parse/src/dgiot_parse.erl +++ b/apps/dgiot_parse/src/dgiot_parse.erl @@ -931,7 +931,7 @@ import(Name, Class, [Data | Other], Count, Requests, Fun, Acc) when length(Reque try NewRequests = [#{ <<"method">> => <<"POST">>, - <<"path">> => <<"classes/", Class/binary>>, + <<"path">> => <<"/classes/", Class/binary>>, <<"body">> => Data } | Requests], import(Name, Class, Other, Count, NewRequests, Fun, Acc) diff --git a/dgiot_install.sh b/dgiot_install.sh index de15828a98..c4a7a28ad7 100644 --- a/dgiot_install.sh +++ b/dgiot_install.sh @@ -967,20 +967,20 @@ function make_ssl() { cd /etc/ssl/dgiot/ # 生成自签名的CA key和证书 - openssl genrsa -out ca.key 2048 - openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -subj "/CN=${wlanip}" -out ca.pem + openssl genrsa -out ca.key 2048 &> /dev/null + openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -subj "/CN=${wlanip}" -out ca.pem &> /dev/null # 生成服务器端的key和证书 - openssl genrsa -out server.key 2048 - openssl req -new -key ./server.key -out server.csr -subj "/CN=0.0.0.0" - openssl x509 -req -in ./server.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out server.pem -days 3650 -sha256 + openssl genrsa -out server.key 2048 &> /dev/null + openssl req -new -key ./server.key -out server.csr -subj "/CN=0.0.0.0" &> /dev/null + openssl x509 -req -in ./server.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out server.pem -days 3650 -sha256 &> /dev/null # 生成客户端key和证书 - openssl genrsa -out client.key 2048 - openssl req -new -key ./client.key -out client.csr -subj "/CN=0.0.0.0" - openssl x509 -req -in ./client.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out client.pem -days 3650 -sha256 + openssl genrsa -out client.key 2048 &> /dev/null + openssl req -new -key ./client.key -out client.csr -subj "/CN=0.0.0.0" &> /dev/null + openssl x509 -req -in ./client.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out client.pem -days 3650 -sha256 &> /dev/null - cd ${script_dir}/ + cd ${script_dir}/ &> /dev/null fi }