Ask Your Question
2

use swift stat to vertify but get http return 401 unauthorized

asked 2014-07-15 04:05:39 -0500

hugesu gravatar image

updated 2015-01-14 14:37:36 -0500

smaffulli gravatar image

I am installing and configuring openstack swift, but now I encounter a problem. last week, I have finished the installation following the guide http://docs.openstack.org/icehouse/in... . I installed 1 proxy node named proxy1 and 3 storage nodes named storage 1/2/3. all these nodes metioned above are KVMs which bridge to real network. I install the keystone on another real server. because my proxy-server was not installed on node where keystone. so my configuration is a little different from guide.

keystone endpoint-create --service-id=$(keystone service-list | awk '/ object-store / {print $2}') --publicurl='http://proxy1:8080/v1/AUTH_%(tenant_id)s' --internalurl='http://proxy1:8080/v1/AUTH_%(tenant_id)s' --adminurl=http://proxy1:8080

At that moment, everything seemed fine and I could upload and download files on proxy1. This week, I reboot the all the KVMs and now I encounter a problem. after I execute

source admin-openrc.sh
swift stat

Iget:

Account HEAD failed: http://proxy1:8080:8080/v1/AUTH_3e54a18b27d542e5b55c9d4b522ac627 401 Unauthorized.

In the /var/log/messages, it shows:

Jul 15 22:43:53 proxy1 proxy-server: Authorization failed for token
Jul 15 22:43:53 proxy1 proxy-server: Invalid user token - deferring reject downstream

I try to restart service proxy-server, keystone and services on storage, but it does not go well. In the proxy1, I try

keystone token-get

and it works. In key_signing directory, I can see all three pem files.

Because of my poor python skill, I cannot understand how program works, I just print some variables to find out what happens.*

[root@proxy1 stx]# swift stat
hugesu: __main__: begin
hugesu: st_stat: before get_conn
hugesu: get_conn: begin
hugesu: get_conn: options.auth=http://controller:35357/v2.0
hugesu: get_conn: options.user=admin
hugesu: get_conn: options.key=123456
hugesu: get_conn: options.retries=5
hugesu: get_conn: options.auth_version=2.0
hugesu: get_conn: options.os_options={'region_name': None, 'tenant_id': None, 'auth_token': None, 'endpoint_type': None, 'tenant_name': 'admin', 'service_type': None, 'object_storage_url': None}
hugesu: get_conn: options.snet=False
hugesu: get_conn: options.os_cacert=None
hugesu: get_conn: options.insecure=False
hugesu: get_conn: options.ssl_compression=True
hugesu: st_stat: if not args
hugesu: st_stat: before stat_account
hugesu: stat_account: begin
hugesu: _retry: begin
hugesu: head_account: begin
hugesu: head_account: url=http://proxy1:8080/v1/AUTH_3e54a18b27d542e5b55c9d4b522ac627
hugesu: head_account: before conn.request
hugesu: head_account: http_scheme=http
hugesu: head_account: http_host=proxy1:8080
hugesu: head_account: port=8080
hugesu: head_account: method=HEAD
hugesu: head_account: parsed.path=/v1/AUTH_3e54a18b27d542e5b55c9d4b522ac627
hugesu: head_account: headers={'X-Auth-Token': u'MIILlgYJKoZIhvcNAQcCoIILhzCCC4MCAQExCTAHBgUrDgMCGjCCCewGCSqGSIb3DQEHAaCCCd0EggnZeyJhY2Nlc3MiOiB7InRva2VuIjogeyJpc3N1ZWRfYXQiOiAiMjAxNC0wNy0xNVQwNzoxNDowMC44ODIzMDEiLCAiZXhwaXJlcyI6ICIyMDE0LTA3LTE1VDA4OjE0OjAwWiIsICJpZCI6ICJwbGFjZWhvbGRlciIsICJ0ZW5hbnQiOiB7ImRlc2NyaXB0aW9uIjogIkFkbWluIFRlbmFudCIsICJlbmFibGVkIjogdHJ1ZSwgImlkIjogIjNlNTRhMThiMjdkNTQyZTViNTVjOWQ0YjUyMmFjNjI3IiwgIm5hbWUiOiAiYWRtaW4ifX0sICJzZXJ2aWNlQ2F0YWxvZyI6IFt7ImVuZHBvaW50cyI6IFt7ImFkbWluVVJMIjogImh0dHA6Ly9jb250cm9sbGVyOjg3NzQvdjIvM2U1NGExOGIyN2Q1NDJlNWI1NWM5ZDRiNTIyYWM2MjciLCAicmVnaW9uIjogInJlZ2lvbk9uZSIsICJpbnRlcm5hbFVSTCI6ICJodHRwOi8vY29udHJvbGxlcjo4Nzc0L3YyLzNlNTRhMThiMjdkNTQyZTViNTVjOWQ0YjUyMmFjNjI3IiwgImlkIjogIjM3ZDA4NWM3MTc2MDQwOGU4MWExNzgxNWFjMmY5ODQ2IiwgInB1YmxpY1VSTCI6ICJodHRwOi8vY29udHJvbGxlcjo4Nzc0L3YyLzNlNTRhMThiMjdkNTQyZTViNTVjOWQ0YjUyMmFjNjI3In1dLCAiZW5kcG9pbnRzX2xpbmtzIjogW10sICJ0eXBlIjogImNvbXB1dGUiLCAibmFtZSI6ICJub3ZhIn0sIHsiZW5kcG9pbnRzIjogW3siYWRtaW5VUkwiOiAiaHR0cDovL2NvbnRyb2xsZXI6ODc3Ni92Mi8zZTU0YTE4YjI3ZDU0MmU1YjU1YzlkNGI1MjJhYzYyNyIsICJyZWdpb24iOiAicmVnaW9uT25lIiwgImludGVybmFsVVJMIjogImh0dHA6Ly9jb250cm9sbGVyOjg3NzYvdjIvM2U1NGExOGIyN2Q1NDJlNWI1NWM5ZDRiNTIyYWM2MjciLCAiaWQiOiAiMTkyOTE4ZTNkYzMwNDUxZjgyNzQzY2Y3NjRjYzkxMTQiLCAicHVibGljVVJMIjogImh0dHA6Ly9jb250cm9sbGVyOjg3NzYvdjIvM2U1NGExOGIyN2Q1NDJlNWI1NWM5ZDRiNTIyYWM2MjcifV0sICJlbmRwb2ludHNfbGlua3MiOiBbXSwgInR5cGUiOiAidm9sdW1ldjIiLCAibmFtZSI6ICJjaW5kZXJ2MiJ9LCB7ImVuZHBvaW50cyI6IFt7ImFkbWluVVJMIjogImh0dHA6Ly9jb250cm9sbGVyOjkyOTIiLCAicmVnaW9uIjogInJlZ2lvbk9uZSIsICJpbnRlcm5hbFVSTCI6ICJodHRwOi8vY29udHJvbGxlcjo5MjkyIiwgImlkIjogIjE3NTRhZjIyZWEwODRmNDdiNjc5ZTFkYjU1ZDQyN2E4IiwgInB1YmxpY1VSTCI6ICJodHRwOi8vY29udHJvbGxlcjo5MjkyIn1dLCAiZW5kcG9pbnRzX2xpbmtzIjogW10sICJ0eXBlIjogImltYWdlIiwgIm5hbWUiOiAiZ2xhbmNlIn0sIHsiZW5kcG9pbnRzIjogW3siYWRtaW5VUkwiOiAiaHR0cDovL2NvbnRyb2xsZXI6ODc3Ni92MS8zZTU0YTE4YjI3ZDU0MmU1YjU1YzlkNGI1MjJhYzYyNyIsICJyZWdpb24iOiAicmVnaW9uT25lIiwgImludGVybmFsVVJMIjogImh0dHA6Ly9jb250cm9sbGVyOjg3NzYvdjEvM2U1NGExOGIyN2Q1NDJlNWI1NWM5ZDRiNTIyYWM2MjciLCAiaWQiOiAiMGU2MDBhNmI5OGViNGRlNDhhNGI3NTI2NTZmNTQ4OGIiLCAicHVibGljVVJMIjogImh0dHA6Ly9jb250cm9sbGVyOjg3NzYvdjEvM2U1NGExOGIyN2Q1NDJlNWI1NWM5ZDRiNTIyYWM2MjcifV0sICJlbmRwb2ludHNfbGlua3MiOiBbXSwgInR5cGUiOiAidm9sdW1lIiwgIm5hbWUiOiAiY2luZGVyIn0sIHsiZW5kcG9pbnRzIjogW3siYWRtaW5VUkwiOiAiaHR0cDovL3Byb3h5MTo4MDgwIiwgInJlZ2lvbiI6ICJyZWdpb25PbmUiLCAiaW50ZXJuYWxVUkwiOiAiaHR0cDovL3Byb3h5MTo4MDgwL3YxL0FVVEhfM2U1NGExOGIyN2Q1NDJlNWI1NWM5ZDRiNTIyYWM2MjciLCAiaWQiOiAiMGIyY2MxYTY5MDg1NGRmNWE3N2ZiYWI3YjU1ZWNmNDkiLCAicHVibGljVVJMIjogImh0dHA6Ly9wcm94eTE6ODA4MC92MS9BVVRIXzNlNTRhMThiMjdkNTQyZTViNTVjOWQ0YjUyMmFjNjI3In1dLCAiZW5kcG9pbnRzX2xpbmtzIjogW10sICJ0eXBlIjogIm9iamVjdC1zdG9yZSIsICJuYW1lIjogInN3aWZ0In0sIHsiZW5kcG9pbnRzIjogW3siYWRtaW5VUkwiOiAiaHR0cDovL2NvbnRyb2xsZXI6MzUzNTcvdjIuMCIsICJyZWdpb24iOiAicmVnaW9uT25lIiwgImludGVybmFsVVJMIjogImh0dHA6Ly9jb250cm9sbGVyOjUwMDAvdjIuMCIsICJpZCI6ICI0MmU4NjAzNmEzODI0Y2JmYmE4MWY1OGIwOWU5YjI3ZiIsICJwdWJsaWNVUkwiOiAiaHR0cDovL2NvbnRyb2xsZXI6NTAwMC92Mi4wIn1dLCAiZW5kcG9pbnRzX2xpbmtzIjogW10sICJ0eXBlIjogImlkZW50aXR5IiwgIm5hbWUiOiAia2V5c3RvbmUifV0sICJ1c2VyIjogeyJ1c2VybmFtZSI6ICJhZG1pbiIsICJyb2xlc19saW5rcyI6IFtdLCAiaWQiOiAiOWIzODhjYTEwZjQzNGRhMjg4N2Q5NDRhMjA4YzhmNWEiLCAicm9sZXMiOiBbeyJuYW1lIjogIl9tZW1iZXJfIn0sIHsibmFtZSI6ICJhZG1pbiJ9XSwgIm5hbWUiOiAiYWRtaW4ifSwgIm1ldGFkYXRhIjogeyJpc19hZG1pbiI6IDAsICJyb2xlcyI6IFsiOWZlMmZmOWVlNDM4NGIxODk0YTkwODc4ZDNlOTJiYWIiLCAiYmM3ZGMzMGIwN2NlNGU1MmIyZDRkMDJkM2U0MTMwOTgiXX19fTGCAYEwggF9AgEBMFwwVzELMAkGA1UEBhMCVVMxDjAMBgNVBAgMBVVuc2V0MQ4wDAYDVQQHDAVVbnNldDEOMAwGA1UECgwFVW5zZXQxGDAWBgNVBAMMD3d3dy5leGFtcGxlLmNvbQIBATAHBgUrDgMCGjANBgkqhkiG9w0BAQEFAASCAQBIfqqXlZvYtzJ97uXZKj1m+MTAhS7hNOQwHerxv9rmZX2sVwE-0B1wR3OLrFzhcwE79W8RjaWAQypIUtOQni--i8hYPqZxV1xbgaon9b36ZfY7ESbzu9P6D52TsxlsL9cmeUAaQ288QaOtJBH6CDCowjFOjZLBNmq1DYtfRClvl6P9rskOSwx82dMcx7kFB-uSpOqtCVw1rUrdTy7psrd6zVU--mpEZ1vKEl6FMqoDmlZ5mNkamL7KC9pFw2pt0NcZqKZrIxcZYGQGGvwXFV5qUpU2tDSBNU8jcmlaczlrGEHF8v7W6fljkNNNRimJX9G3sUKnpB+sX4nQe1qFbuOB'}
hugesu: head_account: after conn.request
hugesu: head_account: before raise
hugesu: head_account: resp.status=401
hugesu: head_account: resp.reason=Unauthorized
hugesu: head_account: begin
hugesu: head_account: url=http://proxy1:8080/v1/AUTH_3e54a18b27d542e5b55c9d4b522ac627
hugesu: head_account: before conn.request
hugesu: head_account: http_scheme=http
hugesu: head_account: http_host=proxy1:8080
hugesu: head_account: port=8080
hugesu: head_account: method=HEAD
hugesu: head_account: parsed.path=/v1/AUTH_3e54a18b27d542e5b55c9d4b522ac627
hugesu: head_account: headers={'X-Auth-Token': u'MIILlgYJKoZIhvcNAQcCoIILhzCCC4MCAQExCTAHBgUrDgMCGjCCCewGCSqGSIb3DQEHAaCCCd0EggnZeyJhY2Nlc3MiOiB7InRva2VuIjogeyJpc3N1ZWRfYXQiOiAiMjAxNC0wNy0xNVQwNzoxNDowMi4xOTQyOTIiLCAiZXhwaXJlcyI6ICIyMDE0LTA3LTE1VDA4OjE0OjAyWiIsICJpZCI6ICJwbGFjZWhvbGRlciIsICJ0ZW5hbnQiOiB7ImRlc2NyaXB0aW9uIjogIkFkbWluIFRlbmFudCIsICJlbmFibGVkIjogdHJ1ZSwgImlkIjogIjNlNTRhMThiMjdkNTQyZTViNTVjOWQ0YjUyMmFjNjI3IiwgIm5hbWUiOiAiYWRtaW4ifX0sICJzZXJ2aWNlQ2F0YWxvZyI6IFt7ImVuZHBvaW50cyI6IFt7ImFkbWluVVJMIjogImh0dHA6Ly9jb250cm9sbGVyOjg3NzQvdjIvM2U1NGExOGIyN2Q1NDJlNWI1NWM5ZDRiNTIyYWM2MjciLCAicmVnaW9uIjogInJlZ2lvbk9uZSIsICJpbnRlcm5hbFVSTCI6ICJodHRwOi8vY29udHJvbGxlcjo4Nzc0L3YyLzNlNTRhMThiMjdkNTQyZTViNTVjOWQ0YjUyMmFjNjI3IiwgImlkIjogIjM3ZDA4NWM3MTc2MDQwOGU4MWExNzgxNWFjMmY5ODQ2IiwgInB1YmxpY1VSTCI6ICJodHRwOi8vY29udHJvbGxlcjo4Nzc0L3YyLzNlNTRhMThiMjdkNTQyZTViNTVjOWQ0YjUyMmFjNjI3In1dLCAiZW5kcG9pbnRzX2xpbmtzIjogW10sICJ0eXBlIjogImNvbXB1dGUiLCAibmFtZSI6ICJub3ZhIn0sIHsiZW5kcG9pbnRzIjogW3siYWRtaW5VUkwiOiAiaHR0cDovL2NvbnRyb2xsZXI6ODc3Ni92Mi8zZTU0YTE4YjI3ZDU0MmU1YjU1YzlkNGI1MjJhYzYyNyIsICJyZWdpb24iOiAicmVnaW9uT25lIiwgImludGVybmFsVVJMIjogImh0dHA6Ly9jb250cm9sbGVyOjg3NzYvdjIvM2U1NGExOGIyN2Q1NDJlNWI1NWM5ZDRiNTIyYWM2MjciLCAiaWQiOiAiMTkyOTE4ZTNkYzMwNDUxZjgyNzQzY2Y3NjRjYzkxMTQiLCAicHVibGljVVJMIjogImh0dHA6Ly9jb250cm9sbGVyOjg3NzYvdjIvM2U1NGExOGIyN2Q1NDJlNWI1NWM5ZDRiNTIyYWM2MjcifV0sICJlbmRwb2ludHNfbGlua3MiOiBbXSwgInR5cGUiOiAidm9sdW1ldjIiLCAibmFtZSI6ICJjaW5kZXJ2MiJ9LCB7ImVuZHBvaW50cyI6IFt7ImFkbWluVVJMIjogImh0dHA6Ly9jb250cm9sbGVyOjkyOTIiLCAicmVnaW9uIjogInJlZ2lvbk9uZSIsICJpbnRlcm5hbFVSTCI6ICJodHRwOi8vY29udHJvbGxlcjo5MjkyIiwgImlkIjogIjE3NTRhZjIyZWEwODRmNDdiNjc5ZTFkYjU1ZDQyN2E4IiwgInB1YmxpY1VSTCI6ICJodHRwOi8vY29udHJvbGxlcjo5MjkyIn1dLCAiZW5kcG9pbnRzX2xpbmtzIjogW10sICJ0eXBlIjogImltYWdlIiwgIm5hbWUiOiAiZ2xhbmNlIn0sIHsiZW5kcG9pbnRzIjogW3siYWRtaW5VUkwiOiAiaHR0cDovL2NvbnRyb2xsZXI6ODc3Ni92MS8zZTU0YTE4YjI3ZDU0MmU1YjU1YzlkNGI1MjJhYzYyNyIsICJyZWdpb24iOiAicmVnaW9uT25lIiwgImludGVybmFsVVJMIjogImh0dHA6Ly9jb250cm9sbGVyOjg3NzYvdjEvM2U1NGExOGIyN2Q1NDJlNWI1NWM5ZDRiNTIyYWM2MjciLCAiaWQiOiAiMGU2MDBhNmI5OGViNGRlNDhhNGI3NTI2NTZmNTQ4OGIiLCAicHVibGljVVJMIjogImh0dHA6Ly9jb250cm9sbGVyOjg3NzYvdjEvM2U1NGExOGIyN2Q1NDJlNWI1NWM5ZDRiNTIyYWM2MjcifV0sICJlbmRwb2ludHNfbGlua3MiOiBbXSwgInR5cGUiOiAidm9sdW1lIiwgIm5hbWUiOiAiY2luZGVyIn0sIHsiZW5kcG9pbnRzIjogW3siYWRtaW5VUkwiOiAiaHR0cDovL3Byb3h5MTo4MDgwIiwgInJlZ2lvbiI6ICJyZWdpb25PbmUiLCAiaW50ZXJuYWxVUkwiOiAiaHR0cDovL3Byb3h5MTo4MDgwL3YxL0FVVEhfM2U1NGExOGIyN2Q1NDJlNWI1NWM5ZDRiNTIyYWM2MjciLCAiaWQiOiAiMGIyY2MxYTY5MDg1NGRmNWE3N2ZiYWI3YjU1ZWNmNDkiLCAicHVibGljVVJMIjogImh0dHA6Ly9wcm94eTE6ODA4MC92MS9BVVRIXzNlNTRhMThiMjdkNTQyZTViNTVjOWQ0YjUyMmFjNjI3In1dLCAiZW5kcG9pbnRzX2xpbmtzIjogW10sICJ0eXBlIjogIm9iamVjdC1zdG9yZSIsICJuYW1lIjogInN3aWZ0In0sIHsiZW5kcG9pbnRzIjogW3siYWRtaW5VUkwiOiAiaHR0cDovL2NvbnRyb2xsZXI6MzUzNTcvdjIuMCIsICJyZWdpb24iOiAicmVnaW9uT25lIiwgImludGVybmFsVVJMIjogImh0dHA6Ly9jb250cm9sbGVyOjUwMDAvdjIuMCIsICJpZCI6ICI0MmU4NjAzNmEzODI0Y2JmYmE4MWY1OGIwOWU5YjI3ZiIsICJwdWJsaWNVUkwiOiAiaHR0cDovL2NvbnRyb2xsZXI6NTAwMC92Mi4wIn1dLCAiZW5kcG9pbnRzX2xpbmtzIjogW10sICJ0eXBlIjogImlkZW50aXR5IiwgIm5hbWUiOiAia2V5c3RvbmUifV0sICJ1c2VyIjogeyJ1c2VybmFtZSI6ICJhZG1pbiIsICJyb2xlc19saW5rcyI6IFtdLCAiaWQiOiAiOWIzODhjYTEwZjQzNGRhMjg4N2Q5NDRhMjA4YzhmNWEiLCAicm9sZXMiOiBbeyJuYW1lIjogIl9tZW1iZXJfIn0sIHsibmFtZSI6ICJhZG1pbiJ9XSwgIm5hbWUiOiAiYWRtaW4ifSwgIm1ldGFkYXRhIjogeyJpc19hZG1pbiI6IDAsICJyb2xlcyI6IFsiOWZlMmZmOWVlNDM4NGIxODk0YTkwODc4ZDNlOTJiYWIiLCAiYmM3ZGMzMGIwN2NlNGU1MmIyZDRkMDJkM2U0MTMwOTgiXX19fTGCAYEwggF9AgEBMFwwVzELMAkGA1UEBhMCVVMxDjAMBgNVBAgMBVVuc2V0MQ4wDAYDVQQHDAVVbnNldDEOMAwGA1UECgwFVW5zZXQxGDAWBgNVBAMMD3d3dy5leGFtcGxlLmNvbQIBATAHBgUrDgMCGjANBgkqhkiG9w0BAQEFAASCAQBI+06BDDBCmDvRWqH7MdPzyU-38CODFXM0s-fA2k3mpDTKWPVw0n+q9m4GhaoiiwncBX3R4hZSIW08fqm3qWeAaL8ZGOqIiKSnFAuK16nhNVNwm34rNcB66ivkYpulABx+LTQMRHYymC3c0PQzg2AfEm6E0nL2Oc0d9ioVRLul0TH0BCUhdNqfoJlBOLm3loYC5zEIbSnkXteD62JAXmAHWhhOSkfRDXFKtK0L3za-MOtGHzDr7-l83cFRnmRJIYh4UfXpNIQzwHxFa7g7V-9VmiRIFngpDbz81OjfWIoP-gJHuzO7OthxoxCZpgfjjvw4PqZl9EzzeFdSo6xVLpkV'}
hugesu: head_account: after conn.request
hugesu: head_account: before raise
hugesu: head_account: resp.status=401
hugesu: head_account: resp.reason=Unauthorized
Account HEAD failed: http://proxy1:8080:8080/v1/AUTH_3e54a18b27d542e5b55c9d4b522ac627 401 Unauthorized

I am sure to have done ... (more)

edit retag flag offensive close merge delete

Comments

Can you please get proper heading. So it will help others to understand.

SGPJ gravatar imageSGPJ ( 2014-07-15 04:27:08 -0500 )edit

Search this site before posting questions. There are plenty of answers here on how to solve authentication issues with swift. Ex: https://ask.openstack.org/en/question...

smaffulli gravatar imagesmaffulli ( 2014-07-15 11:08:14 -0500 )edit

4 answers

Sort by ยป oldest newest most voted
5

answered 2014-12-22 21:34:54 -0500

ilya1725 gravatar image

updated 2014-12-22 23:28:54 -0500

Please check the configuration of your Swift proxy-server.conf. I had to change the [pipeline:main] to:

pipeline = catch_errors healthcheck cache authtoken proxy-logging proxy-server

to resolve this error. Having said that, the reason this solution works is because it bypasses the keystoneauth step that was in the original configuration file.

edit flag offensive delete link more
2

answered 2014-09-12 06:13:10 -0500

abhi24790 gravatar image

updated 2014-09-12 07:28:58 -0500

lafada gravatar image

Hi

In place of controller give your ip

auth_host = controller
edit flag offensive delete link more
1

answered 2014-07-15 10:27:22 -0500

Rowan gravatar image

have you configured your proxy-server.conf properly with controller and swift services logins?

edit flag offensive delete link more
1

answered 2015-01-16 18:01:35 -0500

Attila Szlovencsak gravatar image

This usually happens if swift-proxy fails to validate your token against keystone. So either you have wrong settings for admin_tenant_name ,admin_user or admin_password, or you admin_user (usually swift) does not have and admin role on tenant services.

As a way to debug, of course you could turn off token validation as suggested by ilya1725 (delete keystone_auth from pipeline:main in /etc/swift/proxy-server.conf). But this renders your swift "world-readable", so that anyone knowing your tenant-id could download your files, as simple as using

$> curl   http://<proxy>:8080/v1/AUTH_<tenant_id>/<container>/<path>

It is better to fix the parameters admin_tenant_name ,admin_user or admin_password. Last time I had this problem, as I was using service instead of services for admin_tenant_name.

edit flag offensive delete link more

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Get to know Ask OpenStack

Resources for moderators

Question Tools

1 follower

Stats

Asked: 2014-07-15 04:05:39 -0500

Seen: 7,479 times

Last updated: Jan 16 '15