@tony-yin
2018-10-10T15:46:33.000000Z
字数 1621
阅读 764
C15000
FTP
服务分为匿名用户和普通用户两种,一个节点上匿名用户最多只能存在一个,而普通用户是可以存在多个的;C15000
项目中的FTP
服务,可以是一个匿名用户,也可以是一个或者多个普通用户,又或者是匿名用户和普通用户都存在;
对一个FTP
服务进行修改时,必须保证最少要存在一个用户;
删除只存在匿名用户的FTP
服务时,页面可以直接选中删除,后端对应的逻辑就是先删除服务,再删除匿名用户;而删除一个普通用户的FTP
服务时,则不能直接删除服务和用户,必须先要修改服务,将普通用户修改成匿名用户才能删除,对应的后端逻辑为先删除所有普通用户,再创建一个匿名用户,然后删除服务,最后再删除匿名用户。(为什么这么设计这里就不多说了)
ucsmftpadm ftp del -a /ftp1
ucsmftpadm ftp del -u storageuser /ftp1
FTP
服务
# 删除服务
ucsmftpadm ftp del /ftp1
# 删除匿名用户
ucsmftpadm ftp del -a /ftp1
FTP
服务
# 删除普通用户
ucsmftpadm ftp del -u storageuser /ftp1
# 添加匿名用户
ucsmftpadm ftp add -a -p pool1 /ftp1
# 删除ftp服务
ucsmftpadm ftp del /ftp1
# 删除匿名用户
ucsmftpadm ftp del -a /ftp1
FTP
服务
# 删除普通用户
ucsmftpadm ftp del -u storageuser /ftp1
# 删除ftp服务
ucsmftpadm ftp del /ftp1
# 删除匿名用户
ucsmftpadm ftp del -a /ftp1
【问题原因】
FTP
服务正常的删除逻辑是:
UI
上直接点击删除按钮,然后后端调用删除服务和删除匿名用户两个接口;但是,当FTP
服务创建失败时,不管是匿名用户还是正常用户,都可以直接点击删除按钮,这时后端只会调用一个接口:删除服务,这样并不会做删除用户的相关操作,则会导致下次创建时用户信息已存在,创建失败。
【解决方案】
在每次调用直接删除服务的接口中,判断该服务是否还存在对应的用户,如果存在则默认是创建失败的删除,这时候会先调用先删除用户的接口,然后再删除服务。
也就是每次如果hostagent
层收到的请求是ucsmftpadm ftp del xxx
时,都会根据/etc/hostagent/service.conf
文件检查该服务是否有用户存在,有用户就先删除所有用户,再删除服务。因为删除整个服务只有两种情况,一种是正常的匿名用户删除,一种是存在普通用户或匿名用户的创建失败的服务删除,这样实现便可以兼顾这两种情况,只不过原来正常匿名用户服务删除的删除匿名用户操作,提前到删除服务那一环节了(其实这是有问题的,下个issue
会提到)。
【问题原因】
修改Issue C15000-784
导致,为了保证对创建失败的ftp
服务进行彻底删除,在每次后端收到删除服务时做用户校验,如果存在用户,则判定为删除失败的服务。但是存在场景不删除服务,只删除匿名用户,添加普通用户,这时候只会调用删除匿名用户的接口,而该接口由于之前的改动已经不会做实际删除工作,导致匿名用户目录并没有真正删除,下次创建匿名用户后由于存在匿名用户目录而创建失败。
【解决方案】
在原来的删除匿名用户接口下,再次进行判断,如果/etc/hostagent/service.conf
存在匿名用户相关字段时,判定为删除匿名用户而非删除整个服务,调用删除匿名用户函数即可