| #!/usr/bin/env python | |
| # | |
| # | |
| # Licensed to the Apache Software Foundation (ASF) under one | |
| # or more contributor license agreements. See the NOTICE file | |
| # distributed with this work for additional information | |
| # regarding copyright ownership. The ASF licenses this file | |
| # to you under the Apache License, Version 2.0 (the | |
| # "License"); you may not use this file except in compliance | |
| # with the License. You may obtain a copy of the License at | |
| # | |
| # http://www.apache.org/licenses/LICENSE-2.0 | |
| # | |
| # Unless required by applicable law or agreed to in writing, | |
| # software distributed under the License is distributed on an | |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
| # KIND, either express or implied. See the License for the | |
| # specific language governing permissions and limitations | |
| # under the License. | |
| # | |
| # | |
| # | |
| # server-version.py: print a Subversion server's version number | |
| # | |
| # USAGE: server-version.py URL | |
| # | |
| # The URL can contain any path on the server, as we are simply looking | |
| # for Apache's response to OPTIONS, and its Server: header. | |
| # | |
| # EXAMPLE: | |
| # | |
| # $ ./server-version.py http://svn.collab.net/ | |
| # or | |
| # $ ./server-version.py https://svn.collab.net/ | |
| # | |
| import sys | |
| try: | |
| # Python >=3.0 | |
| from http.client import HTTPConnection as http_client_HTTPConnection | |
| from http.client import HTTPSConnection as http_client_HTTPSConnection | |
| from urllib.parse import urlparse as urllib_parse_urlparse | |
| except ImportError: | |
| # Python <3.0 | |
| from httplib import HTTPConnection as http_client_HTTPConnection | |
| from httplib import HTTPSConnection as http_client_HTTPSConnection | |
| from urlparse import urlparse as urllib_parse_urlparse | |
| def print_version(url): | |
| scheme, netloc, path, params, query, fragment = urllib_parse_urlparse(url) | |
| if scheme == 'http': | |
| conn = http_client_HTTPConnection(netloc) | |
| elif scheme == 'https': | |
| conn = http_client_HTTPSConnection(netloc) | |
| else: | |
| print('ERROR: this script only supports "http" and "https" URLs') | |
| sys.exit(1) | |
| conn.putrequest('OPTIONS', path) | |
| conn.putheader('Host', netloc) | |
| conn.endheaders() | |
| resp = conn.getresponse() | |
| status, msg, server = (resp.status, resp.msg, resp.getheader('Server')) | |
| conn.close() | |
| # 1) Handle "OK" (200) | |
| # 2) Handle redirect requests (302), if requested resource | |
| # resides temporarily under a different URL | |
| # 3) Handle authorization (401), if server requests for authorization | |
| # ignore it, since we are interested in server version only | |
| if status != 200 and status != 302 and status != 401: | |
| print('ERROR: bad status response: %s %s' % (status, msg)) | |
| sys.exit(1) | |
| if not server: | |
| # a missing Server: header. Bad, bad server! Go sit in the corner! | |
| print('WARNING: missing header') | |
| else: | |
| for part in server.split(' '): | |
| if part[:4] == 'SVN/': | |
| print(part[4:]) | |
| break | |
| else: | |
| # the server might be configured to hide this information, or it | |
| # might not have mod_dav_svn loaded into it. | |
| print('NOTICE: version unknown') | |
| if __name__ == '__main__': | |
| if len(sys.argv) != 2: | |
| print('USAGE: %s URL' % sys.argv[0]) | |
| sys.exit(1) | |
| print_version(sys.argv[1]) |