• 739814301937 tao.mtl amazon 账号。
  • integration test 和uattest什么区别?今晚感觉一下integration test
  • 首先我们来看shadowManager类
    • 第一个测试,方法名字叫做:given SM已经发布,当 nucleus启动时,SM也要启动。
      • 好奇葩,居然方法体就一句话,叫启动NucleusWith config,这方法我给0分。
      • 进去这个方法,发现真正跳舞的是kernel(nucleus部件中lifecyclemanager目录下的一员猛将啊)
        • kernel.parrseArgs(),这方法蛮操蛋的,基本不知所云。-------还是看一下吧,
          • 里面先调用了kernelCommandLine的parseArg的方法,也不知道里面都干了些啥坏事。------OK,没有干坏事,就是那些--help能看到的参数的处理。
          • kenel解开裤子,在他的config里找了一下三个topic在不在,services, main, lifecycle --又要干啥?
          • 从commandLine借了个bootstrapManager,和deploymentDirectoryManager,还从context要了个KeinalAlternatives的实例(这个估计没能借到吧)
          • 要干票大的吗?--------原来这个kernelAlts要根据bootstrapManager还有deploymentDirecrotyManager才能知道现在处于哪个stage: bootstrap ? kernel_activation? kernel-rollback? 
            • 如果是前两个的话,configFileName 用TargetConfigFilePath
            • 如果是RollBack,用snapshotFileapath.
          • 调用kernelLifecycle的initConfigAndTlog----弄啥咧
          • 调用kernelCommandLine的updateDeviceConfiguration方法。
          • 调用deviceConfiguration的initializeNucleusFromRecipe方法。
          • setupProxy()
        • 初始化一个listener,这个listener估计是个binary吧,怎么地感觉就是把个方法给它赋值了啊,还是说所有的只有一个方法的类或者接口的类的实例,都可以这样赋值?----想想就觉得自己悟性高,一个只包含一个方法的匿名类。帅!
        • 然后就是对kernel.getContext()的疯狂输出了,
          • 先给丫加个globalStateChangeListener.
            • 先问下这个kernel的Context是个啥玩意,是shadow的json文件吗?Contex是nucleusde组件depencency下的一员大将。
            • context不是应该都是写put、get之类的方法吗?居然定义了add/removeGlobalChangeListener接口,这个globalChange事件想必还是个蛮重要的东东嘛。。
            • 打住,这个实现看来还是相当有技术含量的,又是并发线程又是双向链表的,我还是先摸清楚这个测试用得到的小技巧,再说吧。反正我将来也就是个使用,谁需要管他内核如何实现的呢。(看我多出息)
          • 然后put一个(MqttClient.class, mqttClient) ----------是不是spring的bean也是这样管理的?每个类放一个实例到applicationContext里面。也不知道他存个mqttClient干嘛用,估计99%是用来要跟shadwo通讯用
          • 继续存装备----但是这里,这里...........好像突然间内急,随地大小便了一个mock!如果cliient连接成功,则返回true,这,这,这也可以吗?-----------哦,原来mqttClient是个mocke的实例.......这里是说如果有人调他的方法询问连接状态,就说连着呢好了。。。。
          • 如果有要求mock db,那就装配个shadowManagerDatabase (mock的),我去,没有听说,shadowmanager还自带个数据库啊?是啥嵌入数据库?liqle?必须是很小的吧。也未必,coredevice不是client device,完全可以跑大程序。
            • 哦,有数据库就要有authorizationHandlerWrapper, 也不知道这是个啥,为啥要跟数据库一起装配?
          • 如果有要求mock cloud的话,就装配个iotDataPlaneClientFactory,完了完了,要上天了,还iotDataPlaneClient, 这位大神到底要干啥?
          • 如果要求mockDao,那就再装个dao,
          • 够了!!还要的话明天清早!!!!!!!!!!
        • kenel.lauch()
          • 好美呦,感觉看到一个花生仁,挎包里面装着globalStateChangeListener,mqttClient,database,外挂AuthorizationHandler,iotDataPlaneClentFactory、还有一把dao,向着外太空飞去~~~~~~~
      • 最后,回到地球来吧,看看这个shadowManagerRunning.await(TEST_TIME_OUT_SEC, TimeUnit.SECONDS)是不是在若干秒后返回了true,
        • 可是,吃错药了吧,这个shadwoManagerRunning其实是个会count down的门闩子啊,他在那等个啥呢?
    • 第二个测试,感觉方法名字是有一个安装好了的shadwoManager组件,如果安装数据库时出错,服务报错?-------what? the datebase was not installed at same time as a embedded db? it's cloud db???? that explains why it need a authorizationHandler
      • 首先,它先ignoreExceptinOfType(FlaywayException) first.--------这个方法好,测试过程中无关的异常可以忽略掉。
      • 然后,他说如果有调用shadowManagerDB.install() 则抛出FlaywayException。
      • 最后,启动Nucleus, config参数里指明期待状态是State.error.
    • 第三个测试,when nucleus shutdown, then shadowmanagerdatabase close (等等,为啥他不说sm closed,而是说他的db关了呢?
      • 首先启动nucleus
      • 然后关闭kernel----有情况,这个kernel不是比nucleur大吗?怎么跑到nucleur里面去的?
      • 检查mockShadowManagerDatabase 的close方法至少被调用了一次。---------等等抬下杠哈,这个不说明关闭成功啊----是的,但是足够了,这就是integration测试和uat测试的区别,integration测试还是白盒测试,验证的是程序的逻辑,i.e.该掉的方法有没有调到。UAT测试关心的从用户看到的效果,所以相关的辅助功能还是不全一样的。这道题如果是用户测试的话,应该没法用mock侵入到代码内部,并检查方法是否有被掉。只能想办法检查端口,进程号等,看看程序有没有消失掉。。。。这时就需要脚本来执行了。看来python要捡起来啊。
    • 第四个测试,有无效的组件被注册,启动时,应该不影响shadow manager启动。
      • ignore exception of AuthorizationExeption,
      • do throw this exception when authorizationHandlerWrapper.registerComponent is called...
      • assert nucleus start up succesfully, and assertDoesNotThrow()----------这句啥意思,啥一场都没有抛出的意思吗?
    • 第五个测试,太搞笑了,要求是如果log产生了,那么code在里面
      • 结果,人家用一个enum类型搞定了。哈哈哈哈哈哈哈哈哈
    • 第六个测试,存在一个snc——information(什么鬼?sync info是啥,等待被sync的info吗?)如果配置(config)变了,那么移除被移除的shadow所对应的sync info---------这话是在瞎胡说吗?否则就是信息量很大了:首先,cofig-update字面意思可以是很多中config update呀?难道一定会导致shadow被移除吗?还是说你有update,我就去检查一下有没有shadow被移除呢?........其次,每个shadow都有对应的syncInfo吗?还是如果有的话,就移除对应的sync-info?
      • ignore一个预设的exceptin, and prepare a mqttclient which always pretend to be connected :)
      • put into context, then fly!
      • 一个神秘人物出现了,ShadowManagerDAOImpl!!!!!!! created two thingShadowSyncInfo with it------------等一下,难道说创建个ThingShadowSyncInfo一定要有个DaoImpl存在吗?难道这个SyncInfo是存在数据库里面的啊?好神秘,好期待呦!!!!!
        • 这个daoImpl出来溜溜来!随便一个list,就列出来了10个shadowpare,每个名字下各有5个,名字后面分别跟着shadow0~5-------------弄解释要弄啥类
        • 只见他一个list里面两个map,分别装备了(thing name topic / classic shadwo topic(boolean) / named shadow topic (Array)) 和 (thing name topic / named shadow tp[oc (array)
      • 干活
        • 来,替换个东西in config, 就替换configuration ->synchronize下面的内容为shadowDocuments, 对应上面刚建好的哪个shadowDocument list吧 
        • 看看让那个神秘人物再出来溜溜看
        • 咋就变成介样子了呢?
-- Sam 14:14 08/12/2022

 总结下,到底学到了啥
  1. 了解了green grass是啥
  2. 了解了awt IOT
    1. IOT都是有shadow的,在云端。
    2. 设备会掉线,但是仍然可以操作shadow,设置设备的属性
    3. shadow 的属性跟设备的属性是一回事吗?
      1. 好像每次发布设备时,都可以给设备做一些设置,就是定制在recipe里面的那些东西,比如
  3. greengrass在coredevice上也搞了个shadowManager。
-- Sam 09:53 16/01/2023
 我去,理解错了,人家是让我创建step,用来创建一个component
然后update the configurations of the component
然后deploy

我理解成啥了,我啥一没有理解,就想着local deploy一个东西,然后修改configuration,然后检查修改是否成功。

这两者有啥区别呢?
  1. 为啥要先修改,再发布呢?
    1. 为啥?不知道,管他呢,做做就明白了,可能。
    2. 发布是针对thing的,发布时,可以选择增加和减少组件的,也可以选择更改组件的配置的。

  2. 首先component 和shadow什么关系?
    1. 每个component都有一个shadow, 还是说是每一个thing都有一个shadow?每个thing一个shadow,组件没有。
    2. 但是可以给组件建立一个shadow。
  3. component和thing什么关系?
    1. component是thing吗?还是说只有设备是thing?------------只有设备是thing?
  4. 只有core device中有component,其他类别的Thing中没有Componet,但是所有的thing都有shadow。至少一个classic的shadow。
  5. shadow的配置和component的属性有什么区别?
    1. 我之前修改的是shadow还是component?----没有区别啊,我改的是shadow,也就是改了component了。
    2. shadow本身就是component的configuration,如果要改componet的configuration,你去改它的shadow就对了。
    3. 我之前改的是设备的config就还是设备里其中一个component的config?总是改其中一个component的config, 我之前在HelloWorld中改的是ShdowManager component的config。最近的shadow6中,我改的是shadow manager和nucleus的config。
    4. 现在,我要求改custom component的config。这个怎么搞?
      1. 先创建一个component-----创建一个component的命令已经有了,据说。
        1. 有啊,我已经用了。但是那个不对,因为是建立component,和发布一起的。没有个修改配置的机会。
        2. 我们想要有三步走的。接收参数的。
      2. 修改connfig
      3. deploy

 
  1.  首先,我原来从本地部署java程序是一直没有成功的,人家怎么成功了?怎么做到的?
  2. 听说他这个是一步到位的,我们不要一步到位,我们怎么做?
    1. 我们不在乎本地部署还是网络部署的,就是说都可以
    2. 可是哪个更容易?-------是不是说网络部署的功能已经存在了?直接用就完了,就可以记住火力在第二步了?
      1. 网络部署是怎么个用法?------我已经用了,但是是用来搞public component的,custom component 怎么用呢?
        1. 去类里去看看先。
        2. 确实看到了有例子是这种用法的,但是当我运行它时,并不work
        3. 还有个例子也用了这个,只不过artifact是python 脚本。,可是不知为啥,用tag都执行不到它。-------aws-greengrass-testing-standalone/hello_world/features/example.feature这个就是,带有@HelloWorld,但是执行不到。聪明的我把他复制了一份,从我的目录下运行,执行了,但是到关键那个方法后报错了,意思时不能解析。
  3. 云端部署custom组件的例子那么多,不肯能都搜不到吧: 而且我们也木有必要非要用java的。
  4. 别多想,慢慢干就完了。
    1. 问题是人家的路径,就好使,我的路径不好使
    2. 而且人家的reipe很神奇,会自动创建S3bucket的,可能是因为看到了recipe里面用的是java吧?否则也没有别的特别的标注了。就一个recipe而已而已而已


来吧,看看比失败更失败是多失败!

  1. 他这个assertion server 是怎么个玩法?
    1. 据说是专门部署一个component,
    2. 去访问别的component的属性?
  2. continue study evergreen test cases----Shdow1 要测试啥?
    1. 更新shadow
  3. shadow2 要测试啥?---------sync local 和 cloud的shadow?怎么sync呢?  
    1. 加两个radom shadow-----------我干过这事了吗?好像没有.....我干了啥,我部署了component,并且部署时给改了属性,部署完后也给改了属性。但是部署 custom component出了问题,也不知道OTF的设计是不是别瞎部署,直接用他们的local store的recipe?
    2. 等下,Shadow2怎么跑一个greengrass出了两个IotThing?------------我确认过眼神,我们的脚本确实只生成了一个thing。


  4. shadow4 测试从lambda访问本地的shadowservice
    1. 这怎么可能,本地访问cloud我懂,可是你lambda运行在云端,你怎么知道我本地的地址?
    2. 除非本地告诉他,这也不现实啊,你lambda总不能开个serversocket吧
    3. 唯一可能是通过queue了,大家都通过queue互相通知吧。我坚持相信core device的api只是给clent device提供的。
  5. shadow5 挑战 从component,用iot device sdk,访问local shadow service
    1. 这个我干过吧,我那俩方法就是调用IPCClientV2的get和post方法去修改shadow的,但是我修改的是自己的shadow
    2. 有点傻,但是我看到它的确建立了Thing group了,所以不用但心Thingroup,因为可以说ThingGroup是标配。
    3. 可是,到了那个步骤又不行了,因为我们目前没有办法创建一个cuostom component,因为
      1. 如果从本地创建,那么只有个一步到位的方法,它不给你机会去修改配置,或者根据配置来生成custom component。
      2. 如果从云端生成,那么
        1. 如果是java的话,那么这个jar如何生成
        2. 如果时python的话,那么这个build,如何修改,以使pythonfile被包涵进去。
  6.  shadow7 通过local pubsub 和mqtt 操作shadow
  7. shadow8 set sync directionality
    1. 废话少说来,有么有可能搞定一个的来?
-- Sam 15:09 02/01/2023
 T4居然跑过了,T3没有过,
  1. 看来需要先了解下哪个Operation是什么意思了
    1. 感觉首先是component的设置,不是shadow的设置。(每个component可以有个shadow的概念有点难理解。你一个component要shadow干嘛用呢?你跟谁通讯呢,你怕啥掉线呢?真需要shadow的话,你不能跟你的device共用一个shadow吗?)
    2. 比如T2的operation,是干嘛的 (研究下这个,毕竟这个是通过review了的)
      1. 目标是用local shadow service来update component的shadow(
        1. 坐实了component可以有shadow吧?
        2. 不知道默认是不是就自动有个classice的shadow?
        3. component的shadow在console界面能看到吗?
        4. component的shaodow应该越是h2数据库里的一条记录吧。
      2. 既然目标是local shadow service操作shadow,这说明了是shadow service提供的shadow的操作,而不是uat test来提供shadow操作。
      3. 那么是用IPCClinetV2来操作的吗?
        1. 应该是的,Component内部可以拿到IPCClient,这我是干过的。
        2. 但是不直接是,因为是通过command来操作的,command被执行后用的什么就不知道了,但是UAT用Cli来测试,意义上还是比较规范。怎么那个叫Nelson的孩子什么都懂?
        3. 如果Uat直接调用IPC方法,那还是uat测试吗?有点像整合测试了......可是如果有的系统没有Cli工具,那么如何做Uat测试呢?网站的话,应该好说,用selenium就好了,service呢?---service不做uat测试,只做整合测试。
          1. 所谓整合测试,就是测那些只有整合以后才能测得功能?还是说为了准备整合而做的测试?
          2. 我觉得应该是整合以后才做的测试。因为整合之前就能测得,应该叫做单元测试,你如果说测了controller,就可以理解为单元大了一点而已嘛。
          3. 也可能,单元测试只测试方法逻辑的正确性,只瞄准方法的逻辑保证。而测试一个controller的方法,则是测试一个整合以后会被外部调用到的方法,那么这时,如果mock service的话,那就是单元测试,因为你在保证内部逻辑嘛?如果你simulate service呢?
          4. 因为有些系统即使是整合测试时也没法确保返回值,比如邮件系统,所以即使是整合测试,也是需要simulator的。而有些系统能够控制的,不如数据库,文件系统,那么可以不用simulator。
          5. 总之一句话,就是还是不能确定整合测试是什么时候执行。等着问人吧。
        4. 这里看到了命令行支持的好处了吧,可以自动化啊,包括测试自动化,还有安装部署自动化
      4. OK,这个参数咋用的呢?
-- Sam 00:45 30/12/2022
 继续工作,好好赶脚下单独上一个amazon的班是什么赶脚。
  1. 我有了个版本,在github上,不是main branch,这是什么意思?我的for有这个branch吗?---------不行的,只能单独下载这个branch了,因为网上说的命令理解不了
  2. 所以,我先下载了一个git clone, 然后切换到了这个branch,现在我算是有她的代码了。
  3. 然后怎么办,我直接在上面开发吗?开发完了把代码拷贝会我的fork对应的本地库!!!!然后等这些代码出现在master中,我就可以commit了。
============================
  1. 这个scenario想要干啥?
  2. 人争一口气,我现在要的不是钱,不是面子,而是不愿意就这么承认我的脑子没有别人的好使。我怎么就不能搞定这个问题
  3. 好了,事情都结束了,下面应该面对脑力挑战了。
    1. 我们要干什么?移动那个uat
    2. 有什么困难?--------------运行不通过,好像是前两步时可以的。等我确认下。yes, double checked.
    3. 什么异常?------dengxia wo paopao zai
      1. 不管啥异常,我估计是逃不掉要写个方法来修改从覅古ration了---------等下,otf中好像有方法了。shadow 6不是就用了那个方法吗?咋的了?不能用啊?什么异常啊?先不用管什么异常,首先肯定有两个问题等着我
        1. 人家设置的完整接受是啥样的,你上去给个 json,那么巧格式就合适呢?
        2. install component都接受那种竖线参数了,我们的这个方法是不是也应该接受下?-------------别介,这个等Saranya干。我只使用不去动otf的代码。
        3. 还有个问题,那个operation参数是有什么特别的作用的吧?得了解一下。
  4. 主分支上的shadow-6被人改了,去掉了无所谓的代码包括
    1. 修改 my greengrass deployment configuration shadowManager的属性中的syncronized部分,还有shaodowDocumentSizeLimitBytes。
    2. 对于nucleus的修改没有改变。
    3. 另外还去掉了后来的整个的对于shadowManager的config的修改。这个就费解了,这个shadow-6是要测啥?----------哦,原来她把测试的目的也改掉了,改成了只reset默认属性而已,不测试mergeback了。
      1. mergeback的代码我还是需要参考到shadow-1里面的。
      2. shadow-1的目的也被改了,但是我觉得还是得改回来,否则没有意义了。
  5. 所以我最后看懂了
    1. otf的install component和update component都没得用,我们需要自己写install localcomponent 和update localcomponent
    2. 她那个install最后是用过的cli命令是吧?我这个update是不是也可以用cli命令来实现呢?
      1. cli命令是啥还记得不啦?--------不管他,先看她怎么吧cli的command给凑出来的
      2. 然后去blog里找command来改。
      3. 会不会和安装时同一个命令?????--------------
-- Sam 01:25 29/12/2022
 建立一个IoTThing需要些什么东西?
  1. 一个IOT Policy---------------iotLifeCycle
  2. 一个IamPolicy-IamLifeCycle
  3. 一个IamRole---IamLifCycle
  4. 一个IotRoldAlias-退回到了IotLifeCycle
  5. 怎么又一个IotPolicy?----- IotLifeCycle
  6. 一个IotThingGroup----------IotLifeCycle
  7. 一个IotCertificate------------IotLifeCycle
  8. 最后IotThing------------------IotLifeCycle
本地GG(core device)跑起需要那些东西?----------------只要运行那个neclues zip进行安装就行了。

如何发布一个组件?------------创建一个greengrass deployment先,参数中可以指定这个deployent中有哪些组件, 一步搞定。

注意了,本例测试的关键要开始了:
  1. 先来修改多个组件的设置
    1. --------可以对各个组件的,包括nucleus的的configuration进行修改
    2. --------每行修改一个,可以修改多个
  2. 然后一次性执行 deploy the greengrass deployment configration, 这里面其实包括了两个步骤(至少有两行输出)
    1. Created GreengrassDeployment-------------------- in GreengrassV2Lifecycle
    2. Created Greengrass deployment: 1f570358-b87a-4f23-ad38-a5d11bd82025  这两行输出怎么感觉很像啊
  3. 测试启动成功。
看,如何才是潇洒的撤退:
  1. 停止进程
  2. 去掉IamRole
  3. 去掉IamPolicy
  4. 去掉IotThing
  5. 去掉IotCertificate
  6. 去掉IotThingGroup
  7. 去掉IotPolicy
  8. 去掉IotRoleAlias
  9. 去掉IotPolicy
  10. 至此所有外部的资源已经取消了--------好像没有严格要求先后顺序。
  11. 清掉跑这个Scenario的线程。
宣告测试成功。
-- Sam 14:37 19/12/2022
 我去,继续搞吧,希望能move over
  1. 拷贝
  2. 编译运行
  3. 测试
  4. 问问题

-- Sam 13:46 19/12/2022
 他娘的,第一个手术,完全在人家的指导下完成,最后居然还漏了把剪刀在人家肚子里。
我谨慎希望我能靠自己把这个问题给解决了,否则后面的测试案例怎么走,至少还有两个星期的钱要捡。
问题描述:
  1. 我看到的是一个失败,好像是时间到了,没有完成:到底是不是?
    1. log manager调用了同样的方法是好的。
    2. 我给个长的时间看看?
    3. 我给个短点的json试试?---------成功了,时间设置的是6 minutes,I am now trying to give it 2 mins to see if it's still OK., 2 mins also ok...
  2. 那到底是那个语句导致了超时不成功呢?
  3. 是不是真的超时呢?如果给足够时间能活过来吗?还是说有别的错误。
-- Sam 23:04 16/12/2022
开始第一个移植手术了
  1. 作为用户,要能reset 他和default field-----啥事default field?是一个叫default的field还是把所有field reset to default value?
  2. 要能merge it back again--------merge什么back?------back 是back到哪里啊?为什么叫merge呢?是什么merge到什么呢?
------------------------------------
背景搞起:
Given:
  1. kernel 注册为thing,并加入group ShadowThingGroup
  2. 想要变有钱,于是开了公司,然后投入时间精力做了一堆不喜欢却又不得不做的事,然后发现不是公司在赚钱养活你,而是你在打几份工赚钱养活公司,世界上最失败的创业莫过于此。
  3. 我的device在跑evergreen kernel-------这个evergreen kernel是个什么鬼?我们应该不需要了把,我们不是又core了吗?
  4. 我还启动了个assertion server,---------这个assertion server是个什么鬼?
那么当
  1. 随便加个shadow给我的Thing----(听起来是子啊云端加shadow了,对了本地怎么加shadow呢?好像没有看到green gress下面有这个东西,理论上本地应该不用装吧,云端有了,本地也就有了,只要这个Thing有连到core device。)shadow名字叫翠花(MyThingNamedShadow)
  2. 创建个deploy,(要搞事情了)名叫DeploymentShadow-1 and 里面有configuration呦!-------------------侬这个英语是不是不太对啊?什么叫create a deployment configration for deployment (A) and thing group B, with components |C|latest|?------- 看起来你creaet了一个configuration,但这个configration和这个deployment难道不是一回事吗?直接说created了一个deployment不就完了????你这玩意听起来是一个configuration同时给了deployment和shadowThingGroup 用啊!!!!!
这个背景应该跟已经有的背景比较下:
  • my device is registered as a Thing
  • my device is running Greengrass 这个看着清爽多了,那么一会儿看看他们的实现吧,一样的话,就给统一喽。
开干:我要求能reset 字段strategy并且能merge it back,这个要求不过分吧?
  1. 加菜:更新depoyment,用来把最后一版的"aws.greengrass.ShadowManager"配置改一下啥意思,是不是就是吧值改掉,然后merge一下?----------以前好像手动操作过,现在终于有机会看下用代码怎么实现了。
  2.  用一个神奇的json,说是要把最后一版的nucleus组件的设置改一下,好吧。改吧,可是不是应该改shadowManager吗,你去惹而人家nuclues干嘛?
  3. deploy这个deployment
检查:
  1. deploy 成功
  2. greengrass的log包含指定文字
  3. log还包含这个
And,这里这个and是几个意思?是When吗?装一个shadowManager的版本(从local store)等下,什么是local store?
  1. 辣末1可以check cli用来知道component state is running
  2. log包含这个
  3. log还包含辣个
-- Sam 19:11 15/12/2022
 太酷了吧,学了好多东西吧,来一起回忆一下
  1. 我们建立了一个新的项目,在uat下面,叫halloworld
    1. -这样我们就不用被style check plugin 困扰,可以打印println了。
    2. 怎么建立的新项目?好像是拷贝了什么code过来,从网页上
  2. 然后再新项目里编辑了artifect 和recepi
    1. atrifect就是一个java文件,里面有调用到一个PCLClient的getShadow方法得到本地的shadow并打印出来。
      1. 包括根据thing name和shadow那么返回个handler
      2. 根据handler返回response
      3. 把response里的东东打出来。
    2. 拷贝了一整个Utils类过来,不知道干啥用的。
    3. recipe里面定义了权限,允许这个component去调用greengrass的get方法,和update方法。
      1. resource里还定义了个“*",但是这个*的意思是上面的方法可以访问的资源。
  3. 然后用 用pip3 安装了 gdk, 并用两个gdk命令来分别运行build 和publish
    1. 这两个命令之前,运行了set tokken 
      1. (token可以让isengard生成,每次点双方框,都生成个新的,
      2. 鉴于token是会过期的,那是不是说用这个token的component,过了绩效时候就不能访问云服务了呢?)
      3. 这个token能让gdk命令操作S3(创建bucket,创建folder,上传一个jar)
      4. 白瞎了,因为本地有credentials在共享目录中(~/.aws/credentials),被命令找到了,所以用的是这个credential,没有用token,
      5. 如果用了这个token的话,
    2. 这两个命令过后,jar被生成了,并且建立了一个bucket,并把jar给发布了上去。
    3. 问题来了,怎么就能把这个jar,放到stgo的bucket里面去了呢,为什么不是jaingpta的bucket里面呢?
      1. 答案是肯定的,这货必须用了我的证书,因为这货创建的bucket名字的最后一部分居然是我的账号739814301937。
      2. 既然手里拿了账号了,肯定是用这个账号登录喽,肯定不会在别的地方建立bucket喽。
      3. 这种从共享目录下找证书的机制,应该不止这个Gdk会用到吧。
  4. -----------------------------至此组件在云端生成完毕, 我们登录到coloud console,应该能看到这个component。-------------------------------
  5. 然后我们干了啥?---得把这个编译好了并且上传了的组件部署出去啊。还没有进core呢。
    1. 我们找到这个device --hp-amazon(注意不能从core device中找到,而是要从iot thing中找到,这样打开它才会看到shadowtab,新建了一个shadow给这个设备。
    2. 把刚刚上传到云端的这个componeng发布到设备中,注意发布的过程中偏后面,有个界面可以选中一个组件进行设置的。这里我们设置了一下shadowmanager 組件,用来通过在cofniguration to merge框里面写些东西来更新旧的configuation
      1. 我们设置了strategy 为real time, 还有sync directeion 为between。好让它立刻双向进行同步。
      2. 我們要檢查權限,讓put 和 get 都可用,也可以用*
      3. 我們還要他大爺的加一個reset path,讓新的設置被合并到老的上面去,(像我的例子,就是之前是deploy的人在發佈到設備組時給設置了個get權限,後來再次發佈時,添加了put權限了,但是如果不加個{“/..."}來reset的話,新的設置就不會被加到組件的設置離去,
        1. 這一點從greengrass_cli component list中的輸出中可以看得到。
        2. 從 greengrass/v2/config下面的設置文件中也能看得到。
    3. 本地重启服务,log里面看到这个shadow?
      1. No,我没有看到这个倒霉傻豆,为啥?-------因为忘记修改雲端shadow的權限了
      2. 还是忘记设置component的configuration了?
        1. 在configration to merge框裏面增加個設置  "aws.greengrass#UpdateThingShadow" (具體怎麽寫不確定)
        2. 在reset path 框裏面要加上[
            "/accessControl"
          ]否則新的設置沒有被合并進去。懷疑是個bug
      3. 然后就能看到本地的log里有这个shadow了。
    4. 然后我们在云端,手工改了shadow的状态
    5. 重启本地
  6. 要我干啥?-------------------------------------------------------
      1. 本地要循环查看,省的每次重启动
        1. 查了,收費受不了,趕緊搬到isengbirg吧。
        2. Gdk命令發佈時要用isengbirg的token才能發佈到jiangpta賬號。
        3. 需要把本地賬號裏面的”默認“去掉,否則是不會用isengar的賬號的。
      2. 本地要尝试修改本地状态,然后看console那边是否更新了。不知怎麽回事,發佈后加了reset設置后,放映特別慢,要等好久才生效。
      3. 更新到了V2版本
      4. 用一个普通的代码去访问aws的shadow,用到aws skd
  7. 文档要看。
-- Sam 22:48 09/12/2022
IAM related problem------------------------
  1. core device use "AWS IoT Core credentials provider" to authorized calls to cloud (other aws services)----with iot service should be automatically allowed, right? like deployments/ health check/.....but for getObject from s3, is not permiited yet.
  2. "AWS IoT Core credentials provider" 好长的名字! 允许devices用他们的X.509 certificates as uniq identity 来询问是否被允许访问每个服务
    1. ----------为啥不用aws access key id + secret access key了?这俩家伙藏在哪里了?应该是在core device里但是是在操作系统里吧,不在gg程序里面的配置文件里吧。
    2. 这样够安全吗?这个x。509证书是啥?是pem文件吗?是个设备级别的还是操作系统级别的?-----对了,一个windows能同时运行两个core device吗?
  3. 我看到安装core software后,core device中默认配置了一个role 名字。
    1. 那个role名字必然对应着一个role在云端对吧。这个role的默认权限必然也是已经设置好了的。
    2. 既然这个设备都是我的账号下的,那这个role必然也在我的账号下了。
    3. 这个role不是我创建的,所以这个role must have been created by system.--------那问题来了,这个role在云端是被赋予哪个iam了呢?应该是root user?
  4. 这句话怎么理解
    1. 设备们能用x。509来被core devicd认证, core是啥?是iot云端service吧,不是core device的software...
    2. 这种认证是“基于证书的认证”,别的aws服务是不支持的,只有iot core支持。中这种认证比较方便,因为这种X.509证书是buildIn的,设备发请求到iot core,iot core那边用“credentials providers”来检查你的x。509证书,来决定是不是让你访问。所以你的每个设备上不用存有至少两个key(aws access key id + secret access key)了
      1. 这个build in的证书是生成设备时就产生了的吧?可是安装一个core device时,不是也要提供两key的吗?
        1. 两key可能是用来访问别的服务的。
      2. 。。。别的aws怎么认证?--要call别的service,要用aws credentials来通过认证(这个是否允许的判断规则定义是随谁走的?是被访问的服务或者资源,还是发出访问的一方?怎么感觉两边都在定义呢?服务或者s3要定义谁能访问我,然后用户又要定义我能访问谁吗?那不是冲突了吗?)
      3. 授权定义必须是资源和服务那边来提供的,比如持有那些特定证书的程序可以访问我(iot core),只有那些能提供特定aws access key id + secret access key的服务可以访问我.....
      4. 那访问者这边呢,只能说我是谁,我属于哪个组。这个组能有哪些policy呢?都定义了什么内容呢?会不会跟资源的策略冲突呢?----------策略会包括s3:"*" 或者s3:getObject, 所以是有可能冲突的。
  5. IotCore 收到证书后,产生一个临时security token
    1. 这个token可以用来访问别的aws service吗?可是说见到这个token仅仅如同见到这个设备?设备被授权干啥,这个token就被授权干啥。
    2. 为什么说这种用x509证书换token的做法,需要创建一个(iam)role,并为这个role设置好policy。-----然后 “”
  6. 意外发现!!!!!!!
    1. 在config文件里面,有一个role-alian
    2. 所以程序想要访问aws service,和人是一样的,首要也要登录
      1. .....那登录要么是root user 登录,要么是IAMuser登录,可是程序不是人,不能巴巴的在登录页面上敲密码对吧,那怎么办?程序要提供证书或者是两key。
      2. OK,验证通过,可是你一个程序,进来了,应该把你归入哪个组呢?好吧,你想要进管理员组是吧,没问题。
      3. 那我要把个什么添加进admin group呢?你都没有个用户名,难道我说把某个域名+类名+方法名+请求名作为你的名字加入admin group吗?不好看
      4. 所以你需要有个叫role的东西。
    3. 是不是role不用赋予人用户的?没有看到可以点的相关按钮啊---看不到,但都是有一个role被自动赋予的。
  7. 在运行uat测试案例时,为什么要设置两key呢?为什么设置jiangpta的两key还不行,一定要设置stgo的两key才行?
    1. 那个ec2 instance时用jiangpta账号建立的。
    2. 运行测试用例时,需要连接到 stgo的云服务吗?
      1. 不会吧,那个core device当时是怎么安装的,-----安装时,的确要求在运行安装前设置两key的,而我当时很可能设置了stgo的两key在ec2上,所以,这个ec2虽然时属于jiangpta的,但是里面的coredevice,却是在以stgo的身份跟iot core沟通。
        1. 不是说coredevice不需要两key的吗?直接用内置的x.509证书就能跟iot core换token,然后就开始愉快的沟通了吗?要两key究竟时做什么用的呢?用来产生x.509 证书的吗?90%是的,以前ssh客户端就是产生了一个pem文件的。
        2. x.509证书就是pem证书吗?----对的,也可是别的格式,这些格式也可能是挂羊头,卖羊屁股的,但终归算用了X.509格式
      2. 可是这个跟运行测试案例又有什么关系呢?
        1. 首先得理解为什么运行测试案例需要设置两key?是不是因为它要安装core device,也就是nucleu?99%是吧?
        2. 那装nucleu为啥不能用jinagpta的两key呢?难道是因为stgo的两key已经存在什么地方了?还是说会跟已经有的core device冲突?
          1. 这个要等周末测试一下。在一个新的ec2上不装core device,直接运行用户测试案例试试。
          2. 还应该测试下能不能在不同目录下安装多个core device,是否会冲突。(
          3. 目前没有看到它启动端口,不知道是不是因为没有安装mqtt?等有client连它时,它必须要开server socket才行的呀....
          4. 别忘了测一下用jiangpta的两key能不能跑用例。
      3. 那个statement要用到吗?刚才听说那个greengrassV2.....alians,是对应一个叫greengrassV2.....的role,为什么会有这个roll被赋予core device呢?是因为我们在安装时,用到了--provision true(只设置true,但不指定role)的参数,所以就自动绑定到那个role了。
        1. ------可是这个role在哪里呢?为啥只能看到alian,看不到肉呢?
-- Sam 01:40 08/12/2022
 如何配置这个权限
  1. 我需要我的部署的过程能够下载到S3上面的jar文件
  2. 谁在下载?
    1. 是IoT service去S3要东西,被拒绝?
    2. 还是hp-amazon上的component程序去S3上要东西,被拒绝?
    3. dell-Mindgeek上的部署是不是成功了?或者曾经成功过,如果曾经成功过,说明dell-mingeek能访问s3?为什么?
      1. 如果知道dell-mindgeek到底成功过没有?
        1. package里面有没有jar?---没有jar,但是有些新的目录,是我在服务器上气的名字,说明跟aws服务器的通讯是没有问题的。
        2. 但是,没有到S3的权限。
      2. eee想多了,没有成功过。
  3. 不管是谁去要,都会被拒绝,因为没有设置权限(security group)默认是谁都不可以访问的。
    1. security goup 是啥?--------用来规定谁可以玩吧。
    2. 我的cs用的是什么用户啊?是哪个后来专门建立的ggc吗?
    3. 那么这个ggc用户在云上有没有呢?----估计没有,因为ggc是个wingdows用户,云上不会记录windows的用户吧?
    4. 那这个用户有什么用?不是只要有哪个stgo的secret key,和哪个secret。。。。就可以了吗?
  4. 话说这个security group到底是啥?规定了哪些个role可用碰我?
-- Sam 00:11 07/12/2022
  1.  The deployment fails if a component doesn't support the core device's platform-----------说明谁有要求?
    1. 已经部署的component都可以写要求?
    2. 新部署的component对既有系统有要求?
    3. 都可以有要求?---------我赌这个赢。

-- Sam 18:25 05/12/2022
 跟coponent中的shadows玩玩
  1. 原来有两种shadow document:(可能就是shadow manager component本身也有一条记录在h2数据库的document表中吧,不然你说怎么理解?)
    1. local shadow document
    2. client device shadow document
  2. 默认,新装的shadowManager只允许操作local shadow operation-----------到底什么是local shadow?是shadow manager自己对应的那一条记录吗?
  3. 然后如果和云端进行同步的话(在云端的document中有一条记录对应这这个component,(可能thing = coredivice, name = shadow manager?) 同时云端也有很多条记录分别对应着coredevice下面的连接着的每个client device。----------you must create a configuration update, 里面要带synchronize parameter o.....还记得吧修改要放在patch哦,别放到recipe下面了
  4. -----------------关于MQTT值得专门学习一下------------------------------

-- Sam 12:39 04/12/2022
 report in two delta message..........不知道是什么。


---One thing for sure-------------------------------
  1. 设备是监听消息的。
  2. 数据是存在db中的,因为规则是select from aws/things/+/shadow/updte/delta, 然后发送到${topic(3)}/delta roleArn:.../my-iot-role据说这个规则用来减少信息量。
  3. shadow是啥?是一条db记录的里面的一个字段,用json格式记录着要么目前的状态,要么想要变成的状态。
  4. -------------------------------
  5. the shadow manager can通过用本地的shadow service 和本地的publish/subscript shadow topic. 增删改本地的shadow! (我关心的是sync 表里的记录是怎么用的)
  6. shadwoManager also manager the storage of these local shadow document.
  7. shadowmanager also handle the synchronization of shadow state info with cloud shadow.(这里注意了,这个shadowmanager怎么更新cloud shadow,那应该就是一般的iotthing怎样连接cloud shadow!
    1. 确切了,device更新shadow的机制是device发送一条消息,shadowService收到消息,然后更新shadow。
    2. 相比更新coredevice中的设备还有core device中的shadowManager component sync with cloud shadow也应该是这种机制了!!!
  8. 同时,shadowManager也像cloud shadow一样,维护一个shadowdatabase。
  9. 同样,为了shadowmanager能够管理client device的shadow,必须配置一个MQTT bridge component to relay message( between local MQTT broker and local p/s service..)
  10. ---------------------------------
  11. 信息点:To use shadow manager component to manage local shadows, including client device shadows.......那么说localshadow除了client device的shadows,还有别的shadow?别的还有什么设备啊
  12. 这个state到底是藏在哪里的?
    1. 是一个数据库表的state字段还是doc字段的内容里面有个key是state?---是doc字段的内容json里的一个key。
    2. 也是消息的body中的一个比较关键的属性。直接决定service写什么到对应的数据库表的某条记录里去。
  13. 所以消息是iot service更新完数据库后发出的,不是数据库发出的,(对的,否则啥都干,数据库也显得太不专业了吧)
    1. 但是各种情况下到底都发出了什么消息呢?
  14. 如果设备想要上线后能收到“delta”消息,那就要用“persistent session” feature, 这两个鬼什么时候显形啊?????
  15. fleet indexing 是什么鬼?
  16. -------------------------------------
  17. 什么叫每个shadow有一个reservcedmqtt topic?and http url????每条记录对应一个topic吗,会不会有点多?还有http url???是带参数的吧?比如?thing= && shadowname=...
  18. 明白了,shadowManager还有IOTshadowservice 同时监听两个渠道:消息渠道和REST EndPoint,供用户来操作shadow用,有的程序没有建立消息渠道的,可以直接通过httpclient来让shadowService改变shadow。
  19. 还有个问题别忘了,就是shadowmanager还需呀管理那个h2db的尺寸,不知道他是怎么做的。
-- Sam 22:37 02/12/2022
 So, what have I learned? 
  1. we can download something into a Linux, window, then run it with some parameter, then this device is a core device. core device are different from normal IOT thing, because it can process the data from normal IOT devices, and do preprocess before sending it to cloud services.
  2. after setting a core device, we can edit/add components on local or on cloud, then deploy into every core devices. how to creating new components: 
    1. in local, create 3 folders (actually two is enough) , recipe/artifacts/patches(not necessary, but good for put updates here)
    2. artifacts must contains a complete folder structure like maven structure: e.g. com.example.HelloWorld/1.0.0/ hello_world.py 
    3. recipe folder contains json files, all of them must be well formatted:
      1. 5 lines(might be more) descriptions,
      2. ComponentConfiguration part (the value object can be replaced in runtime, and in which we can set a property of "DefaultConfiguration"
      3. Manifests part(specify on which platform, run what command/script in each lifecycle stage.
  3. I downloaded the aws-greengrass-testing opensource project into my c:\workspace\aws-greengrass-testing
    1. 这货太复杂了,两级git库,build前要先mvn submodule update -init, 
    2. 然后还要mvn resource processing......来个预编译?
    3. 然后发现还是编译不过,那个standalong就是编译不过。
    4. 如果看代码,简直晕倒,从没有见过把parent version用properties来定义的,就问子模块该如何知道到哪个parent project中去找这个property定义呢?这不是玩腻儿吗?
    5. 但是不用慌,这个项目便不过不要紧,只要有一个能编译过的在远程库中,可以用就行,因为他的用法就是
      1. 在编写测试脚本的地方(应该是api测试脚本,不是单元测试脚本)要引用到那个standalone编译生成的jar。
      2. 这样有的脚本就不用写了,直接调用opentest的库里面的类的方法即可。
      3. opentest库里面没有的方法,需要自己再写。
    6. 那么问题来了:
      1. opentest里面有些什么方法可以调用啊?
      2. 那些测试脚本是在哪里写的啊?当时没有看清楚,应该在那个pull reqest 113中能看到: 首先写了一个component.feature文件,这个文件应该是关键,因为它定义了测试内容。
        1. 定义一个feature, 第一行声名这是一个Feature,并给这个feature加个注释,比如:Feature: Testing cloud component in greegrass.
        2. 声名background部分---声明个“Background:",然后写个Given 和and比如Given my device is regiestered as a Thing And my device is running Greegrass。----------问题已经出现了,这个每一行对应一个脚本命令的机制是怎么实现的
        3. 声名 Scenario部分, 里面有两个testcase, 也就是两个When ....and....Then....and. 具体就是When I created a Greengrass deployment with compoenent(component 的脚本,和component的recipe文件路径,用|分开),并且I deploy the Greengrass deployment configuration......then The greengrass deployment is COMPLETED on the device after 180 seconds and the com.aws.HalloWorld log on the device contains the line "Hello World!!" within 20 seconds.
  4. then I downloaded an opensource project log-management into my local computer. 好像要开始为它写测试脚本了
    1. 增加了个uat目录在里面。
    2. uat目录里面一个pom.xml 文件,一个Readme文件,一个codebuild目录(不知道是不是必须,就是在linux下的编译步骤说明而已),然后就是关键部分,src目录了
    3. src目录下除了增加了一些java文件以外,resources/greengrass目录下的features和recipe目录非常可疑,每个文件夹下各有连个文件,难道每个文件是一一对应的?
      1. features文件夹下面都是测试脚本(BDD starts from here!!!)
      2. recipesx文件夹下面估计是在为测试需要新建一些IOT thing?
    4. 还是没有明白,到底是怎么把feature文件里面的每一行对应成操作的!!!!!-------------答案就在那些*stepjava文件里,所有的那些*.feature文件里的用到的Given、When、Then的后面的文字,都可以在这些spec文件中找到
  5. 好神奇呦,加个@TestingModel和@Value.Immutable注解,就能在编译的时候自动根据一个*specMode类生成一个*spec类..........
    1. 为啥要生成spec类,
    2. 为啥要让AbstractLifecyle类知道这个spce类?
    3. 这个spec类里都有些啥?跟specModel类有什么不同?-----看不出来,specModel是个接口,里面就一个默认方法实现,关键方法定义应该在其父类里,但父类源码不知道在哪......生成的spec类里面一票的构造器,还有一个内部类叫builder....到底怎么个玩法???
    4. 是谁在从specModel类检测出@TestModel和@Value.Immutable注解,并生成一个Spec.java文件的?
-- Sam 20:33 26/11/2022
git submodule update --init
mvn process-resources
-- Sam 21:16 22/11/2022
account id:147169962239
Admin/jiangpta-Isengard
IAM username:stgo
access key id=AKIASERADND7SH6W4IWI
secret access key=cElgPe90LmNxfIWet7JuKEra+6uxLjtnwyrxFD2
---------------------------------------------------------------
account id:739814301937
username:stgo
password:O****1
access key id:AKIA2YQC6MDYYTEVHHON   
secret access key:bJ3lF1X68ZHASjuJQ67vBaX7AE7D4pAsROcYNACH

这些号码据说手机丢了的话可以用来找回github的two factory authentication
fc3f1-36455
cb6e4-83c0c
f82a7-ab54d
85cd3-cf27427183-2834ff2185-f803878a7b-f2b7b225cb-28cbca9a7a-f7092eab61-cbc48e995d-4c754a909c-a6b18619c7-de41738f8d-0e109887ae-e043317162-ca9a5


-- Sam 17:26 24/11/2022
deploy a component to core device:

  1. install gg core software
    1. set system variables:
      1. set AWS_ACCESS_KEY_ID=AKIA2YQC6MDYYTEVHHON
      2.  set AWS_SECRET_ACCESS_KEY=bJ3lF1X68ZHASjuJQ67vBaX7AE7D4pAsROcYNACH
    2. create a user on the core device, use psexec to save the account into Credential Manager(to avoid to prompt for password?)
      1. net user /add ggc_user <some password>
      2. psexec -s cmd /c cmdkey /generic:ggc_user /user:ggc_user /pass:<some password>
    3. cd %USERPROFILE%
    4. download the core software (use one of the following)
      1. powershell.exe -command "& {Invoke-WebRequest -Uri https://d2s8p88vqu9w66.cloudfront.net/releases/greengrass-nucleus-latest.zip -OutFile .\greengrass-nucleus-latest.zip; Expand-Archive -LiteralPath .\greengrass-nucleus-latest.zip -DestinationPath .\GreengrassInstaller}"
      2. or user following two:
        1. curl -s https://d2s8p88vqu9w66.cloudfront.net/releases/greengrass-nucleus-latest.zip > greengrass-nucleus-latest.zip
        2. mkdir GreengrassInstaller && tar -xf greengrass-nucleus-latest.zip -C GreengrassInstaller && del greengrass-nucleus-latest.zip
    5. java "-Droot=C:\greengrass\v2" "-Dlog.store=FILE" -jar .\GreengrassInstaller\lib\Greengrass.jar --aws-region us-east-1 --thing-name hp-amazon --thing-group-name GreengrassQuickStartGroup --thing-policy-name GreengrassV2IoTThingPolicy --tes-role-name GreengrassV2TokenExchangeRole --tes-role-alias-name GreengrassCoreTokenExchangeRoleAlias --component-default-user ggc_user --provision true --setup-system-service true --deploy-dev-tools true
  2. install greengrass-cli, check if it's already installed, or it's being installed, if not, manually install it.
    1. C:\greengrass\v2\bin\greengrass-cli help
    2. aws greengrassv2 list-effective-deployments --core-device-thing-name hp-AllInOne
    3. aws greengrassv2 create-deployment --target-arn "arn:aws:iot:us-east-1:739814301937:thing/hp-amazon"  --components "{\"aws.greengrass.Cli\":{\"componentVersion\":\"2.9.0\"}}"
  3. deploy component
    1. C:\greengrass\v2\bin\greengrass-cli deployment create --recipeDir %USERPROFILE%\greengrassv2\recipes --artifactDir %USERPROFILE%\greengrassv2\artifacts   --merge "com.example.HelloWorld=1.0.0"  
    2. C:\greengrass\v2\bin\greengrass-cli deployment create --merge "com.example.HelloWorld=1.0.0" --update-config hello-world-config-update.json 
      1. be careful that the hello-word-config-update.json file is not a recipe, so don't put it in recipe folder, otherwise
    3. C:\greengrass\v2\bin\greengrass-cli component restart --names "com.example.HelloWorld"  
    4. type C:\greengrass\v2\logs\com.example.HelloWorld.log
    5. aws greengrassv2 list-effective-deployments --core-device-thing-name hp-amazon
    6. aws greengrassv2 list-effective-deployments --core-device-thing-name dell_mindgeek
  4. remove a component
    1. C:\greengrass\v2\bin\greengrass-cli deployment create --remove "com.example.HelloWorld"
    2. C:\greengrass\v2\bin\greengrass-cli component list
  5. deploy a component
    1. aws greengrassv2 create-deployment --target-arn "arn:aws:iot:us-east-1:739814301937:thing/dell_mindgeek" --cli-input-json file://hello-world-deployment.json
    2. -----------------------------------hello-world-deployment.json-------------------------------------------------------------
    3. {
    4.   "components": {
    5.     "com.example.HelloWorld": {
    6.       "componentVersion": "1.0.0",
    7.       "configurationUpdate": {
    8.         "merge": "{\"Message\":\"universe\"}"
    9.       }
    10.     }
    11.   }
    12. }
-- Sam 19:05 06/12/2022
Amazon password link:            https://password-v2.corp.amazon.com/changePassword
outlook keep asking for password fix:
  1.  close Outlook,
  2.  then go to https://password-v2.corp.amazon.com/selfReset and unlock the account
  3. Once that's done, sync the password using this link: https://password-v2.corp.amazon.com/syncPassword
-- Sam 15:58 17/11/2022

add the local user into the Credential Manager: C:\Users\Sam\Downloads\PSTools>psexec -s cmd /c cmdkey /generic:ggc_user /user:ggc_user /pass:Ollwin_01
-- Sam 22:55 15/11/2022

Please click here to login and add comments! || automatically refresh content every seconds