ruby 访问 ceph

发布时间 2023-06-09 10:10:32作者: 戈_戈
#!/usr/bin/env ruby
# 通过restful API

require "base64"
require "openssl"
require "net/http"

PublicKey = "publicKey"
PrivateKey = "privateKey"

def gen_auth(http_method, bucket, filename, gmttime)
  sign = http_method + "\n" + "\n" + "\n" + gmttime + "\n" + "x-amz-acl:public-read" + "\n" + "/" + bucket + "/" + filename
  puts sign
  hmac = OpenSSL::HMAC.digest "sha1", PrivateKey, sign
  base64Str = Base64.encode64 hmac
  "AWS" + " " + PublicKey + ":" + base64Str
end

  Host = '36.135.133.17'
  Bucket = 'bk'
  BucketFile = 'rb3'
def put_file

  gmttime = Time.now.utc.strftime "%a, %d %b %Y %H:%M:%S GMT"
  auth = gen_auth "PUT", Bucket, BucketFile, gmttime
  headers = { 'Accept': '*/*', 'User-Agent': 'fuck', 'Content-Type': '', # for ceph Q version, Content-type header empty or no exist
              'Accept-Encoding': 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', "Host": Host, "Date": gmttime, "x-amz-acl": "public-read", "Authorization": auth, "Content-Length": '12' }
  http = Net::HTTP.new(Host, 32206)

  res = http.put "/#{Bucket}/#{BucketFile}", "xour_put_dat",headers
  puts "response code: #{res.code}, body: #{res.body}"
end

if $PROGRAM_NAME == __FILE__
  put_file
end
# 通过SDK 文中。
# ak/sk 和 url和bucket 替换成可正常访问的
require "aws-sdk-s3"

require "resolv-replace"

def run_demo
  Aws.config.update(
    endpoint: "http://36.134.132.17:3367",
    access_key_id: "ak",
    secret_access_key: "sk",
    force_path_style: true,
    region: "us-east-1",
  )
  s3_client = Aws::S3::Client.new
  # s3_client.create_bucket(bucket: 'my-new-bucket2')
  s3_client.list_buckets.buckets.each do |bucket|
    puts "#{bucket.name}\t#{bucket.creation_date}"
    begin
    objects = s3_client.list_objects(delimiter: "/", prefix: "", bucket: bucket.name)
      puts objects.common_prefixes
    rescue
      puts $!
    end
  end

#  resp = s3_client.put_object_acl(bucket: "bk", key: "load_snap_rec/srs1_0/1685049511.ts", acl: "public-read")
#  puts resp.to_h
end

run_demo if $PROGRAM_NAME == __FILE__