redmine坑 解决后续
接上期大坑
利用redmine的api
用ldap账号推送账户
脚本如下
require 'net/https'
require 'uri'
require 'json'
require 'net/ldap'
def get_user
api =('http://192.168.0.222:3000/users.json')
params ={"key" =>'XXXXXXXf',}
uri = URI(api)
uri.query = URI.encode_www_form(params)
#use_ssl = true if uri.scheme =='https'
res = Net::HTTP.get_response(uri)
#puts res.body if res.is_a?(Net::HTTPSuccess)
json =JSON.load(res.body)
p json
puts "get users"
end
def update_user(ldapuser, ldapname,mail)
base_url = "http://192.168.0.222:3000"
api_token = "xxxxxxxxf"
payload = {
user: {
login: ldapuser,
firstname: ldapname,
lastname: ldapuser,
mail: mail,
valid_statuse: 'STATUS_ACTIVE',#valid_statuses = [STATUS_ACTIVE, STATUS_REGISTERED, STATUS_LOCKED]
user_auth_source_id: 1,
password: "[FILTERED]",
password_confirmation: "[FILTERED]",
generate_password:"[FILTERED]"
}
}
url = "#{base_url}/users.json"
puts url
uri = URI.parse(url)
req = Net::HTTP::Post.new(uri.request_uri)
req["Content-Type"] = "application/json"
req['X-Redmine-API-Key'] = api_token
req.body = payload.to_json
http = Net::HTTP.new(uri.host,uri.port)
#http.use_ssl = true
response = http.request(req)
return response
end
host = '192.168.0.252' #
@users = File.open("users.json","w")
def ldap_list(host)()
ldap_list_full=[]
filter = Net::LDAP::Filter.eq("cn","uid=xxx,cn=users,dc=xxx,dc=com")#filter条件
ldap = Net::LDAP.new(:host => host,
:port => 389,
:auth => {:method => :simple,
:username => "uid=root,cn=users,dc=xxx,dc=com",#
:password => "xxx"})
attrs = ["mail", "cn", "gecos", ]
treebase = "cn=users,dc=xxx,dc=com"
count =0
ldap.search(:base=>treebase,:size=>1000,
:attributes => attrs,
#:filter =>filter
) do |entry|
ldap_list_full.push(entry.dn)
count +=1
end
puts "共有记录#{count}条"
b=[]
ldap_list_full.each do |y|
b.push(y.to_s.sub!(/,cn.*$/,"").to_s.sub!(/uid=/,""))
end
n = b.reject { |c| c ==nil }.reject { |c| c =="admin" }
end
def ldap_mess_list(host,uid)()
ldap_list_full=[]
filter = Net::LDAP::Filter.eq("uid",uid)#filter条件
ldap = Net::LDAP.new(:host => host,
:port => 389,
:auth => {:method => :simple,
:username => "uid=root,cn=users,dc=xxx,dc=com",#
:password => "xxxx"})
attrs = ["mail", "cn", "gecos", ]
treebase = "cn=users,dc=xxx,dc=com" #查询amp
hashlist = {}
count =0
ldap.search(:base=>treebase,:size=>1000,
:attributes => attrs,
:filter =>filter
) do |entry|
entry.each do |k,v|
hashlist[k.to_s]=v.to_s
end
count +=1
end
end
a=ldap_list(host)
c=[]
a.each do |uid|
c.push(ldap_mess_list(host,uid).to_s)
end
c.each_index do |n|
if n ==c.length-1
@users.puts c[n].gsub(/#+.*hash=/,"").gsub(">]","").gsub(':','"').gsub('=>','":').sub('[','').sub('}','}]').gsub(' ','')
elsif n ==0
@users.puts c[n].gsub(/#+.*hash=/,"").gsub(">]","").gsub(':','"').gsub('=>','":').sub('[','').sub('}','},').sub('{','[{').gsub(' ','')
else
@users.puts c[n].gsub(/#+.*hash=/,"").gsub(">]","").gsub(':','"').gsub('=>','":').sub('[','').sub('}','},').gsub(' ','')
end
end
@users.close
obj = File.read("users.json")
ff =JSON.parse(obj)
ff.each_index do |e|
final_first_ame= ff[e]["cn"][0]
final_lastname= ff[e]["gecos"][0]
final_mail=ff[e]["mail"][0]
update_user(final_first_ame,final_lastname,final_mail)
end
然后定时跑下
主要难点是ldap的查询数据是对象,所以最后选择生成json文件在进行hash