summaryrefslogtreecommitdiffstats
path: root/extras/volgen/glusterfs-volgen
blob: 1151053acf6eb2928920bbb4866bb2479971bc4c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
#!/usr/bin/python

import getopt, sys, os, string
import subprocess

if not "/usr/share/glusterfs" in sys.path:
    sys.path.append("/usr/share/glusterfs")

from CreateVolfile import *
from CreateBooster import *

def print_usage (name):
    spaces = ' ' * (len(name) + 1)
    print name, "--name <volume-name>"
    print "%s[--raid 0|1]" % spaces
    print "%s[--transport tcp,ib-verbs]" % spaces
    print "%s[--port <port>]" % spaces
    print "%s[--ibdev <lid>]" % spaces
    print "%s[--auth <ip-range>]" % spaces
    print "%s[--conf-dir <confdir>]" % spaces
    print "%s[--usage]" % spaces
    print "%s[--nfs]" % spaces
    print "%s[--cifs]" % spaces
    print "%s[--version]" % spaces
    print "%shost1:<export> host2:<export> ... hostN:<exportNN>" % spaces
    return

def print_version (version):
    print "glusterfs-volgen %s: A tool to generate volume files for GlusterFS." % version
    print "Copyright (C) 2009 Gluster, Inc. <http://www.gluster.com>"
    print """License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law."""


def main ():

    needs_upgrade = None
    needs_nfs = None
    needs_cifs = None
    version_num ="3.0"
    _volume_name = None
    _server_chain = {}
    _server = None
    _transports = ['tcp']
    _transport = None
    _port = 6996
    _auth_param = "*"
    _ib_dev = 1
    _raid_type = None
    node = None
    _conf_dir = None

    try:
        (opt, args) = getopt.getopt (sys.argv[1:], "r:t:p:n:a:i:ch",
                                     ["raid=",
                                      "transport=",
                                      "port=",
                                      "name=",
                                      "auth=",
                                      "ibdev=",
                                      "conf-dir=",
                                      "nfs",
                                      "cifs",
                                      "usage",
                                      "version",
                                      "help"])

    except getopt.GetoptError, (msg, opt):
        print msg
        sys.exit (1)

    for (o, val) in opt:
        if o == '--usage' or o == '--help':
            print_usage (sys.argv[0])
            sys.exit (0)

        if o == '-n' or o == '--name':
            _volume_name = val

        if o == '--nfs':
            needs_nfs = 1

        if o == '--cifs':
            needs_cifs = 1

        if o == '-t' or o == '--transport':
            if not val:
                print "--transport: option " + val + \
                    " is not valid transport type"
                sys.exit (1)
            _transports = val.split(',')

        if o == '-a' or o == '--auth':
            _auth_param = val

        if o == '-p' or o == '--port':
            _port = int(val)

        if o == '-r' or o == '--raid':
            if (val != "1" and val != "0"):
                print "--raid: option " + val + " is not valid raid type"
                sys.exit (1)
            _raid_type = int (val)

        if o == '-i' or o == '--ibdev':
            _ib_dev = int(val)

        if o == '-v' or o == '--version':
            print_version (version_num)
            sys.exit (0)

        if o == '-c' or o == '--conf-dir':
            _conf_dir = val

    if _volume_name is None:
        print "Volume name is mandatory, please provide volume name.. exiting"
        print_usage(sys.argv[0])
        sys.exit(1)

    _tmp = []
    for server in args:
        if server not in _tmp:
            _tmp.append (server)
        else:
            print "Duplicate arguments detected (%s)" % server
            sys.exit(1)

        node = server.split(':')[0]
        _server_chain[node] = []

    for server in args:
        node = server.split(':')[0]
        if server.split(':')[1] not in _server_chain [node]:
            if server.split(':')[1][0] != '/':
                print "Absolute export path required for %s" % server
                sys.exit(1)
            _server_chain [node].append (server.split(':')[1])

    num_servers = len (_server_chain.keys())

    if num_servers is 0:
        print "no servers provided, exiting"
        print_usage(sys.argv[0])
        sys.exit (1)

    print num_servers


    for _server in _server_chain.keys():
        create_exp = CreateVolfile (_server_chain, _server,
                                    _volume_name, None,
                                    _transports, _port,
                                    _auth_param, _ib_dev,
                                    _conf_dir, None)
        try:
            create_exp.create_export_volfile ()
        except IOError, (errno, strerror):
            print "Got %s creating server volfiles for %s" % (strerror, _server)

    for _transport in _transports:
        create_mnt = CreateVolfile (_server_chain, None,
                                    _volume_name, _transport,
                                    _transports, _port,
                                    _auth_param, _ib_dev,
                                    _conf_dir, args)
        try:
            create_mnt.create_mount_volfile (_raid_type)
        except IOError, (errno, strerror):
            print "Got %s creating client volfiles for transport '%s'" % (strerror, _transport)


    for _server in _server_chain.keys():
        for export_dir in _server_chain[_server]:
            commonobj = CreateBooster (_volume_name, export_dir)
            if needs_nfs is 1 or needs_cifs is 1:
                commonobj.configure_booster_fstab ()
            if needs_nfs is 1:
                commonobj.configure_nfs_booster ()
            if needs_cifs is 1:
                commonobj.configure_cifs_booster ()
    return

main ()