Statistiques
| Révision :

root / src / gZFS / zfs.java @ 28

Historique | Voir | Annoter | Télécharger (55,33 ko)

1 14 kreverch
package gZFS;
2 14 kreverch
3 14 kreverch
import java.io.BufferedReader;
4 14 kreverch
import java.io.File;
5 14 kreverch
import java.io.FileInputStream;
6 14 kreverch
import java.io.FileNotFoundException;
7 14 kreverch
import java.io.IOException;
8 14 kreverch
import java.io.InputStream;
9 14 kreverch
import java.io.InputStreamReader;
10 14 kreverch
import java.io.OutputStream;
11 14 kreverch
import java.net.URL;
12 14 kreverch
import java.text.ParseException;
13 14 kreverch
import java.text.SimpleDateFormat;
14 14 kreverch
import java.util.ArrayList;
15 14 kreverch
import java.util.Arrays;
16 14 kreverch
import java.util.Hashtable;
17 14 kreverch
import java.util.List;
18 14 kreverch
import java.util.Properties;
19 14 kreverch
20 14 kreverch
import org.apache.log4j.Level;
21 14 kreverch
import org.apache.log4j.Logger;
22 14 kreverch
import org.jfree.util.Log;
23 14 kreverch
24 14 kreverch
import com.ibm.icu.math.BigDecimal;
25 14 kreverch
import com.jcraft.jsch.ChannelExec;
26 14 kreverch
import com.jcraft.jsch.JSch;
27 14 kreverch
import com.jcraft.jsch.JSchException;
28 14 kreverch
import com.jcraft.jsch.Session;
29 14 kreverch
30 14 kreverch
public class zfs {
31 14 kreverch
32 14 kreverch
33 14 kreverch
        private Logger log = Logger.getLogger(getClass().getPackage().getName()+" "+getClass().getCanonicalName());
34 14 kreverch
35 14 kreverch
        private String userLogin;
36 14 kreverch
        private String userPassword;
37 14 kreverch
        private String sshHost;
38 14 kreverch
        private int sshPort;
39 14 kreverch
        private Session session;
40 14 kreverch
        private Hashtable<String,Session> cacheSession = new Hashtable<String, Session>();
41 14 kreverch
        private JSch jsch = new JSch();
42 14 kreverch
        private String outCmd = null ;
43 14 kreverch
        private StringBuilder outErr ;
44 14 kreverch
        private List<Object> zpoolList = new ArrayList<Object>();
45 14 kreverch
        private List<Object> zfsList = new ArrayList<Object>();
46 14 kreverch
        private List<Object> zfsListSnapshots = new ArrayList<Object>();
47 14 kreverch
        private List<Object> zfsGetAllList = new ArrayList<Object>();
48 14 kreverch
        private List<Object> iscsiListConfigVol = new ArrayList<Object>();
49 14 kreverch
        private Hashtable<String,Object> modelZfsVolAndFS = new Hashtable<String, Object>();
50 14 kreverch
        private Hashtable<String,Object> error = new Hashtable<String, Object>();
51 14 kreverch
        private Hashtable<String,zdisk> hashDisks = new Hashtable<String, zdisk>();
52 14 kreverch
        private Hashtable<String,zraid> hashZRaid = new Hashtable<String, zraid>();
53 14 kreverch
54 14 kreverch
        private zpool zpool;
55 14 kreverch
        private zserver zserver;
56 14 kreverch
        private zvol zvol ;
57 14 kreverch
        private zsnapshots zsnapshots;
58 14 kreverch
        private zreplicas zreplicas;
59 14 kreverch
        private ziscsi ziscsi;
60 14 kreverch
        private zdisk zdisk;
61 14 kreverch
        private zraid zraid;
62 14 kreverch
        private List<Object> sidList;
63 14 kreverch
        private List<Object> ipList;
64 14 kreverch
        private Properties prop = new Properties();
65 14 kreverch
        zfs(){
66 14 kreverch
                this.loadConfig();
67 14 kreverch
                this.setZserver();
68 14 kreverch
                this.setZpool();
69 14 kreverch
                this.setZdisk();
70 14 kreverch
                this.setZvol();
71 14 kreverch
                this.setZsnapshots();
72 14 kreverch
                this.setZreplicas();
73 14 kreverch
                this.setZiscsi();
74 14 kreverch
                this.setZraid();
75 14 kreverch
                log.setLevel((Level) Level.DEBUG);
76 14 kreverch
        }
77 14 kreverch
78 14 kreverch
        public void setZvol(){
79 14 kreverch
                zvol= new zvol();
80 14 kreverch
        }
81 14 kreverch
82 14 kreverch
        public gZFS.zvol getZvol(){
83 14 kreverch
                return zvol;
84 14 kreverch
        }
85 14 kreverch
86 14 kreverch
        public boolean connectServer(String host, int port, String userLogin, String userPasswd){
87 14 kreverch
                try {
88 14 kreverch
                        setSession(jsch.getSession(userLogin, host, port));
89 14 kreverch
                        session.setPassword(userPasswd);
90 14 kreverch
                        Properties config = new Properties();
91 14 kreverch
                        config.put("StrictHostKeyChecking", "no");
92 14 kreverch
                        session.setConfig(config);
93 14 kreverch
                        session.connect();
94 14 kreverch
                        getCacheSession().put(host, session);
95 14 kreverch
                        if ( session.isConnected()){
96 14 kreverch
                                log.debug("Connected");
97 14 kreverch
                                return true;
98 14 kreverch
                        }else{
99 14 kreverch
                                log.debug("not Connected");
100 14 kreverch
                                return false;
101 14 kreverch
                        }
102 14 kreverch
103 14 kreverch
                } catch (JSchException e) {
104 14 kreverch
                        // TODO Auto-generated catch block
105 14 kreverch
                        e.printStackTrace();
106 14 kreverch
                        return false;
107 14 kreverch
                }
108 14 kreverch
        }
109 14 kreverch
110 28 kreverch
        public void disconnectAllServer(){
111 14 kreverch
                String[] keysProp = (String[]) this.getCacheSession().keySet().toArray(new String[0]);
112 14 kreverch
                Arrays.sort(keysProp);
113 14 kreverch
                for ( int i=0;i<keysProp.length;i++){
114 14 kreverch
                        String keyProp = keysProp[i];
115 14 kreverch
                        this.setSession(getCacheSession().get(keyProp));
116 14 kreverch
                        session.disconnect();
117 28 kreverch
                        getCacheSession().remove(keyProp);
118 14 kreverch
                }
119 14 kreverch
        }
120 28 kreverch
        public void disconnectServer(){
121 28 kreverch
                this.setSession(getCacheSession().get(this.getZserver().zProperties.get("serverIP").getValue()));
122 28 kreverch
                session.disconnect();
123 28 kreverch
                getCacheSession().remove(this.getZserver().zProperties.get("serverIP").getValue());
124 28 kreverch
        }
125 14 kreverch
126 14 kreverch
127 14 kreverch
        public Boolean executeCmd(String cmd) {
128 14 kreverch
                this.setOutCmd("");
129 14 kreverch
                try {
130 14 kreverch
131 14 kreverch
                        this.setSession(getCacheSession().get(this.getZserver().zProperties.get("serverIP").getValue()));
132 14 kreverch
                        log.debug("executeCMD : "+this.getZserver().zProperties.get("serverIP").getValue());
133 14 kreverch
                        ChannelExec channel = (ChannelExec) session.openChannel("exec");
134 14 kreverch
                        //((ChannelExec) channel).setCommand("lqs");
135 14 kreverch
                        ((ChannelExec) channel).setCommand(cmd);
136 14 kreverch
                        InputStream in = channel.getInputStream();
137 14 kreverch
                        OutputStream out = channel.getOutputStream();
138 14 kreverch
                        ((ChannelExec) channel).setErrStream(System.err);
139 14 kreverch
                        InputStream err = channel.getErrStream();
140 14 kreverch
                        channel.connect();
141 14 kreverch
                        log.debug("executeCmd "+cmd);
142 28 kreverch
                        if (!cmd.equals("/sbin/show-infodisk-cache")){
143 28 kreverch
                                BufferedReader reader = new BufferedReader(new InputStreamReader(err));
144 28 kreverch
                                outErr = new StringBuilder();
145 28 kreverch
                                String line;
146 28 kreverch
                                while ((line = reader.readLine()) != null) {
147 28 kreverch
                                        outErr.append(line);
148 28 kreverch
                                }
149 14 kreverch
                        }
150 28 kreverch
151 24 kreverch
                        byte[] tmp = new byte[4096];
152 14 kreverch
153 14 kreverch
                        while (true) {
154 14 kreverch
155 14 kreverch
                                int ind = 0;
156 14 kreverch
                                while (in.available() > 0) {
157 24 kreverch
                                        int i = in.read(tmp, 0, 4096);
158 14 kreverch
                                        if (i < 0)
159 14 kreverch
                                                break;
160 14 kreverch
161 14 kreverch
                                        this.setOutCmd(this.getOutCmd()+new String(tmp, 0, i));
162 14 kreverch
                                }
163 14 kreverch
                                if (channel.isClosed()) {
164 14 kreverch
                                        break;
165 14 kreverch
                                }
166 14 kreverch
                                try {
167 14 kreverch
                                        Thread.sleep(900);
168 14 kreverch
                                } catch (Exception ee) {
169 14 kreverch
                                        log.debug(ee);
170 14 kreverch
                                }
171 14 kreverch
                        }
172 14 kreverch
                        channel.disconnect();
173 14 kreverch
174 14 kreverch
                } catch (JSchException e) {
175 14 kreverch
                        // TODO Auto-generated catch block
176 14 kreverch
                        log.debug("executeCMD "+e.getMessage());
177 14 kreverch
                        e.printStackTrace();
178 14 kreverch
                        return false;
179 14 kreverch
                } catch (IOException e) {
180 14 kreverch
                        // TODO Auto-generated catch block
181 14 kreverch
                        log.debug("executeCmd "+e.getMessage());
182 14 kreverch
                        e.printStackTrace();
183 14 kreverch
                        return false;
184 14 kreverch
                }
185 14 kreverch
                /*for (int cpt=0;cpt < outCmd.length;cpt++ ) {
186 14 kreverch
                        log.debug(outCmd[cpt]);
187 14 kreverch
                }*/
188 14 kreverch
                //log.debug(this.getOutCmd());
189 14 kreverch
                return true;
190 14 kreverch
        }
191 14 kreverch
192 14 kreverch
        public Boolean zfsGetAllVolume(String volName){
193 14 kreverch
                zfsGetAllList.clear();
194 14 kreverch
                //clear this.getZvol properties
195 14 kreverch
                String[] keysProp = (String[]) this.getZvol().zProperties.keySet().toArray(new String[0]);
196 14 kreverch
                Arrays.sort(keysProp);
197 14 kreverch
                for ( int i=0;i<keysProp.length;i++){
198 14 kreverch
                        String keyProp = keysProp[i];
199 14 kreverch
                        this.getZvol().zProperties.get(keyProp).setMultivalues(null);
200 14 kreverch
                        this.getZvol().zProperties.get(keyProp).setValue("");;
201 14 kreverch
202 14 kreverch
                }
203 14 kreverch
                if (  this.executeCmd("/sbin/zfs get all "+volName) ){
204 14 kreverch
                        log.debug(this.getOutCmd());
205 14 kreverch
                        String[] Tsplit = this.getOutCmd().split("\n");
206 14 kreverch
                        for (int cpt=1;cpt<Tsplit.length;cpt++){
207 14 kreverch
208 14 kreverch
                                log.debug(Tsplit[cpt].replaceAll(volName+"\\s+","").replaceAll("\n", "").replaceAll("\\s+", " "));
209 14 kreverch
                                String[] TsplitLine = Tsplit[cpt].replaceAll(volName+"\\s+","").replaceAll("\n", "").replaceAll("\\s+", " ").split(" ");
210 14 kreverch
                                log.debug(TsplitLine[0]);
211 14 kreverch
                                if ( "creation".equalsIgnoreCase(TsplitLine[0])){
212 14 kreverch
                                        this.getZvol().zProperties.get("creation").setValue(TsplitLine[1]+" "+TsplitLine[2]+" "+TsplitLine[3]+" "+TsplitLine[4]+" "+TsplitLine[5]);;
213 14 kreverch
                                }else{
214 14 kreverch
                                        //this.getZvol().zProperties.containsKey(TsplitLine[0]);
215 14 kreverch
                                        if (this.getZvol().zProperties.containsKey(TsplitLine[0])){
216 14 kreverch
                                                this.getZvol().zProperties.get(TsplitLine[0]).setValue(TsplitLine[1]);
217 14 kreverch
                                                log.debug("ZFS DEBUG "+this.getZvol().zProperties.get(TsplitLine[0]).getNameProperty()+" "+ this.getZvol().zProperties.get(TsplitLine[0]).getValue());
218 14 kreverch
                                        }
219 14 kreverch
                                }
220 14 kreverch
                        }
221 14 kreverch
                        this.getZvol().zProperties.get("name").setValue(volName);
222 14 kreverch
                        //this.getZvol().zProperties.get("name").setValue(volName);
223 14 kreverch
                }
224 14 kreverch
225 14 kreverch
226 14 kreverch
                return true;
227 14 kreverch
        }
228 14 kreverch
        public void zfsGetInfoByProperty(String volName, String propertyName){
229 14 kreverch
                zfsGetAllList.clear();
230 14 kreverch
                if (  this.executeCmd("/sbin/zfs get "+propertyName+" -H "+volName) ){
231 14 kreverch
                        log.debug(this.getOutCmd());
232 14 kreverch
                        String[] Tsplit = this.getOutCmd().split("\n");
233 14 kreverch
                        for (int cpt=0;cpt<Tsplit.length;cpt++){
234 14 kreverch
235 14 kreverch
                                log.debug(Tsplit[cpt].replaceAll(volName+"\\s+","").replaceAll("\n", "").replaceAll("\\s+", " "));
236 14 kreverch
                                String[] TsplitLine = Tsplit[cpt].replaceAll(volName+"\\s+","").replaceAll("\n", "").replaceAll("\\s+", " ").split(" ");
237 14 kreverch
                                log.debug(TsplitLine[0]);
238 14 kreverch
                                if ( "creation".equalsIgnoreCase(TsplitLine[0])){
239 14 kreverch
                                        this.getZvol().zProperties.get("creation").setValue(TsplitLine[1]+" "+TsplitLine[2]+" "+TsplitLine[3]+" "+TsplitLine[4]+" "+TsplitLine[5]);;
240 14 kreverch
                                }else{
241 14 kreverch
                                        //this.getZvol().zProperties.containsKey(TsplitLine[0]);
242 14 kreverch
                                        if (this.getZvol().zProperties.containsKey(TsplitLine[0])){
243 14 kreverch
                                                this.getZvol().zProperties.get(TsplitLine[0]).setValue(TsplitLine[1]);
244 14 kreverch
                                                log.debug("ZFS DEBUG "+this.getZvol().zProperties.get(TsplitLine[0]).getNameProperty()+" "+ this.getZvol().zProperties.get(TsplitLine[0]).getValue());
245 14 kreverch
                                        }
246 14 kreverch
                                }
247 14 kreverch
                        }
248 14 kreverch
                        this.getZvol().zProperties.get("name").setValue(volName);
249 14 kreverch
                        //this.getZvol().zProperties.get("name").setValue(volName);
250 14 kreverch
                }
251 14 kreverch
252 14 kreverch
        }
253 14 kreverch
254 14 kreverch
255 14 kreverch
        public Boolean zpoolGetAll(String zpoolName){
256 14 kreverch
                zfsGetAllList.clear();
257 14 kreverch
                //clear this.getZvol properties
258 14 kreverch
                String[] keysProp = (String[]) this.getZpool().zProperties.keySet().toArray(new String[0]);
259 14 kreverch
                Arrays.sort(keysProp);
260 14 kreverch
                for ( int i=0;i<keysProp.length;i++){
261 14 kreverch
                        String keyProp = keysProp[i];
262 14 kreverch
                        this.getZpool().zProperties.get(keyProp).setMultivalues(null);
263 14 kreverch
                        this.getZpool().zProperties.get(keyProp).setValue("");;
264 14 kreverch
265 14 kreverch
                }
266 14 kreverch
                if (  this.executeCmd("/sbin/zpool get all "+zpoolName) ){
267 14 kreverch
                        log.debug(this.getOutCmd());
268 14 kreverch
                        String[] Tsplit = this.getOutCmd().split("\n");
269 14 kreverch
                        for (int cpt=1;cpt<Tsplit.length;cpt++){
270 14 kreverch
271 14 kreverch
                                log.debug(Tsplit[cpt].replaceAll(zpoolName+"\\s+","").replaceAll("\n", "").replaceAll("\\s+", " "));
272 14 kreverch
                                String[] TsplitLine = Tsplit[cpt].replaceAll(zpoolName+"\\s+","").replaceAll("\n", "").replaceAll("\\s+", " ").split(" ");
273 14 kreverch
                                log.debug(TsplitLine[0]);
274 14 kreverch
                                if ( "creation".equalsIgnoreCase(TsplitLine[0])){
275 14 kreverch
                                        this.getZpool().zProperties.get("creation").setValue(TsplitLine[1]+" "+TsplitLine[2]+" "+TsplitLine[3]+" "+TsplitLine[4]+" "+TsplitLine[5]);;
276 14 kreverch
                                }else{
277 14 kreverch
                                        //this.getZpool().zProperties.containsKey(TsplitLine[0]);
278 14 kreverch
                                        if (this.getZpool().zProperties.containsKey(TsplitLine[0])){
279 14 kreverch
                                                this.getZpool().zProperties.get(TsplitLine[0]).setValue(TsplitLine[1]);
280 14 kreverch
                                                log.debug("ZFS DEBUG "+this.getZpool().zProperties.get(TsplitLine[0]).getNameProperty()+" "+ this.getZpool().zProperties.get(TsplitLine[0]).getValue());
281 14 kreverch
                                        }
282 14 kreverch
                                }
283 14 kreverch
                        }
284 14 kreverch
                        this.getZpool().zProperties.get("name").setValue(zpoolName);
285 14 kreverch
                        //this.getZvol().zProperties.get("name").setValue(volName);
286 14 kreverch
287 14 kreverch
                        this.getZpoolRealUseableSpace(zpoolName);
288 14 kreverch
                        log.debug("zpoolGetAll "+this.getZpool().zProperties.get("realuseablespace").getValue());
289 14 kreverch
                        this.getZpoolProvisionedSpace(zpoolName);
290 14 kreverch
                        if (  this.executeCmd(this.getZserver().zProperties.get("binzpoolgetstate").getValue()+" -n "+this.getZpool().zProperties.get("name").getValue()) ){
291 14 kreverch
                                log.debug(this.getOutCmd());
292 14 kreverch
                                String[] TsplitOut = this.getOutCmd().split("\n");
293 14 kreverch
                                for (int cpt=1;cpt<TsplitOut.length;cpt++){
294 14 kreverch
295 14 kreverch
                                        String[] TsplitLineState= TsplitOut[cpt].replaceAll("\n","").split(":");
296 14 kreverch
                                        log.debug(TsplitLineState[0]);
297 14 kreverch
                                        //this.getZpool().zProperties.containsKey(TsplitLine[0]);
298 14 kreverch
                                        if (this.getZpool().zProperties.containsKey(TsplitLineState[0])){
299 14 kreverch
                                                this.getZpool().zProperties.get(TsplitLineState[0]).setValue(TsplitLineState[1]);
300 14 kreverch
                                                log.debug("ZFS DEBUG "+this.getZpool().zProperties.get(TsplitLineState[0]).getNameProperty()+" "+ this.getZpool().zProperties.get(TsplitLineState[0]).getValue());
301 14 kreverch
                                        }
302 14 kreverch
                                }
303 14 kreverch
                                this.getZpool().zProperties.get("name").setValue(zpoolName);
304 14 kreverch
                        }
305 14 kreverch
306 14 kreverch
                }
307 14 kreverch
308 14 kreverch
309 14 kreverch
                return true;
310 14 kreverch
        }
311 14 kreverch
312 14 kreverch
313 14 kreverch
        public List<Object> zpoolList(){
314 14 kreverch
                zpoolList.clear();
315 14 kreverch
316 14 kreverch
                if (  this.executeCmd("/sbin/zpool list -H") ){
317 14 kreverch
                        String[] Tsplit = this.getOutCmd().split("\n");
318 14 kreverch
                        for (int cpt=0;cpt<Tsplit.length;cpt++){
319 14 kreverch
                                log.debug(Tsplit[cpt].split("\\s+")[0] );
320 14 kreverch
                                zpoolList.add(Tsplit[cpt].split("\\s+")[0]);
321 14 kreverch
                                //zpoolNames[ind] = Tsplit[cpt].split("\\s+")[0];
322 14 kreverch
                        }
323 14 kreverch
                }
324 14 kreverch
                return zpoolList;
325 14 kreverch
        }
326 14 kreverch
327 14 kreverch
        public List<Object> zfsListSnapshotsByVolFS(String nameVolFS){
328 14 kreverch
                zfsListSnapshots.clear();
329 14 kreverch
330 14 kreverch
                log.debug("zfs list -H -r -t snapshot -oname,used,referenced "+nameVolFS);
331 14 kreverch
                if (  this.executeCmd("/sbin/zfs list -H -r -t snapshot "+nameVolFS) ){
332 14 kreverch
                        if ( this.getOutCmd().length() >0){
333 14 kreverch
                                String[] Tsplit = this.getOutCmd().split("\n");
334 14 kreverch
                                for (int cpt=0;cpt<Tsplit.length;cpt++){
335 14 kreverch
                                        log.debug(Tsplit[cpt].split("\\s+")[0] );
336 14 kreverch
                                        zfsListSnapshots.add(Tsplit[cpt].split("\\s+")[0]);
337 14 kreverch
                                        //zpoolNames[ind] = Tsplit[cpt].split("\\s+")[0];
338 14 kreverch
                                }
339 14 kreverch
                        }
340 14 kreverch
341 14 kreverch
                }
342 14 kreverch
                return zfsListSnapshots;
343 14 kreverch
        }
344 14 kreverch
345 14 kreverch
        public Boolean getIscsiListConfigVol(String nameVolFS){
346 14 kreverch
                sidList = new ArrayList<Object>();
347 14 kreverch
                ipList = new ArrayList<Object>();
348 14 kreverch
                //sidList=null;
349 14 kreverch
                //ipList=null;
350 14 kreverch
                log.debug("get-conf-iscsi-volume nameVolFS");
351 14 kreverch
                //Reset ziscsi object
352 14 kreverch
                this.setZiscsi();
353 14 kreverch
                if (  this.executeCmd("/sbin/get-conf-iscsi-volume "+nameVolFS) ){
354 14 kreverch
                        String[] Tsplit = this.getOutCmd().split("\n");
355 14 kreverch
                        for (int cpt=0;cpt<Tsplit.length;cpt++){
356 14 kreverch
357 14 kreverch
                                String[] TsplitLine = Tsplit[cpt].replaceAll("\n", "").replaceAll("\\s+", " ").split(" ");
358 14 kreverch
                                if ( "sid".equalsIgnoreCase(TsplitLine[0])){
359 14 kreverch
                                        sidList.add(TsplitLine[1]);
360 14 kreverch
                                }else{
361 14 kreverch
                                        if ("sessionIP".equalsIgnoreCase(TsplitLine[0])){
362 14 kreverch
                                                ipList.add(TsplitLine[1]);
363 14 kreverch
                                                log.debug("sessionIP "+TsplitLine[1]);
364 14 kreverch
                                        }else{
365 14 kreverch
                                                //this.getZvol().zProperties.containsKey(TsplitLine[0]);
366 21 kreverch
                                                if (this.getZiscsi().zProperties.containsKey(TsplitLine[0])&& TsplitLine.length ==2){
367 14 kreverch
                                                        this.getZiscsi().zProperties.get(TsplitLine[0]).setValue(TsplitLine[1]);
368 14 kreverch
                                                }
369 14 kreverch
                                        }
370 14 kreverch
                                }
371 14 kreverch
                        }
372 14 kreverch
                        this.getZiscsi().zProperties.get("name").setValue(this.getZvol().zProperties.get("name").getValue());
373 14 kreverch
                        this.getZiscsi().zProperties.get("sid").setMultivalues(sidList);
374 14 kreverch
                        this.getZiscsi().zProperties.get("sessionIP").setMultivalues(ipList);
375 14 kreverch
                        return true;
376 14 kreverch
                }else{
377 14 kreverch
                        return false;
378 14 kreverch
                }
379 14 kreverch
        }
380 14 kreverch
381 14 kreverch
382 14 kreverch
        public void getZpoolProvisionedSpace(String zpoolName){
383 14 kreverch
                log.debug("getZpoolProvisionedSpace "+this.getZpool().zProperties.get("realuseablespace").getValue());
384 14 kreverch
                if (  this.executeCmd("/sbin/get-provisioned-space "+zpoolName) ){
385 14 kreverch
                        log.debug(this.getOutCmd());
386 14 kreverch
                        String[] Tsplit = this.getOutCmd().split("\n");
387 14 kreverch
                        log.debug("getZpoolProvisionedSpace "+this.getZpool().zProperties.get("realuseablespace").getValue().substring((this.getZpool().zProperties.get("realuseablespace").getValue().length())));
388 14 kreverch
389 14 kreverch
                        String refUnit = this.getZpool().zProperties.get("realuseablespace").getValue().substring((this.getZpool().zProperties.get("realuseablespace").getValue().length()-1), (this.getZpool().zProperties.get("realuseablespace").getValue().length()));
390 14 kreverch
391 14 kreverch
392 14 kreverch
                        float totalProvisioned=0;
393 14 kreverch
                        log.debug(String.valueOf(totalProvisioned)+refUnit);
394 14 kreverch
                        for (int cpt=0;cpt<Tsplit.length;cpt++){
395 14 kreverch
396 14 kreverch
                                log.debug(Tsplit[cpt].replaceAll(zpoolName+"\\s+","").replaceAll("\n", "").replaceAll("\\s+", " "));
397 14 kreverch
                                String[] TsplitLine = Tsplit[cpt].replaceAll("\n", "").replaceAll("\\s+", " ").split(" ");
398 14 kreverch
                                log.debug(TsplitLine[0]);
399 14 kreverch
                                totalProvisioned=totalProvisioned+this.convertInReferenceUnit(TsplitLine[2], refUnit);
400 14 kreverch
401 14 kreverch
                        }
402 14 kreverch
                        log.debug("getZpoolProvisionedSpace "+String.valueOf(totalProvisioned)+refUnit);
403 14 kreverch
                        this.getZpool().zProperties.get("provisionspace").setValue(String.valueOf(BigDecimal.valueOf(totalProvisioned).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue())+refUnit);
404 14 kreverch
                        //this.getZvol().zProperties.get("name").setValue(volName);
405 14 kreverch
                        log.debug(String.valueOf(totalProvisioned)+refUnit);
406 14 kreverch
407 14 kreverch
408 14 kreverch
                }
409 14 kreverch
        }
410 14 kreverch
411 14 kreverch
        public void getZpoolRealUseableSpace(String zpoolName){
412 14 kreverch
413 14 kreverch
                this.zfsGetInfoByProperty(zpoolName, "used");
414 14 kreverch
                this.zfsGetInfoByProperty(zpoolName, "available");
415 14 kreverch
                log.debug("getZpoolRealUseableSpace "+this.getZvol().zProperties.get("used").getValue());
416 14 kreverch
                String refUnit = this.getZvol().zProperties.get("used").getValue().substring(this.getZvol().zProperties.get("used").getValue().length()-1, this.getZvol().zProperties.get("used").getValue().length());
417 14 kreverch
                if (!refUnit.equalsIgnoreCase("T")&&!refUnit.equalsIgnoreCase("G")){
418 14 kreverch
                        refUnit = this.getZvol().zProperties.get("available").getValue().substring(this.getZvol().zProperties.get("available").getValue().length()-1, this.getZvol().zProperties.get("available").getValue().length());
419 14 kreverch
                }
420 14 kreverch
                log.debug("getZpoolRealUseableSpace "+refUnit);
421 14 kreverch
                float usedSize = this.convertInReferenceUnit(this.getZvol().zProperties.get("used").getValue(), refUnit);
422 14 kreverch
                float availableSize = this.convertInReferenceUnit(this.getZvol().zProperties.get("available").getValue(), refUnit);
423 14 kreverch
                log.debug("getZpoolRealUseableSpace "+String.valueOf(usedSize+availableSize)+refUnit);
424 14 kreverch
                this.getZpool().zProperties.get("realuseablespace").setValue(String.valueOf(BigDecimal.valueOf(usedSize+availableSize).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue())+refUnit);
425 14 kreverch
426 14 kreverch
        }
427 14 kreverch
428 14 kreverch
        public void getZpoolStatus(){
429 14 kreverch
                error.clear();
430 14 kreverch
                if ( !"".equalsIgnoreCase(getZpool().zProperties.get("name").getValue())){
431 14 kreverch
432 14 kreverch
                        log.debug("getZpoolStatus");
433 14 kreverch
                        hashDisks.clear();
434 14 kreverch
                        hashZRaid.clear();
435 14 kreverch
                        this.setZraid();
436 14 kreverch
                        if ( this.executeCmd("/sbin/show-infodisk-cache")){
437 14 kreverch
                                log.debug("getZpoolStatus");
438 14 kreverch
                                this.setZdisk();
439 14 kreverch
                                if ( outErr.length() ==0){
440 14 kreverch
                                        //log.debug(this.getOutCmd());
441 14 kreverch
                                        String namePool="";
442 14 kreverch
                                        if (this.getOutCmd().length()>0) {
443 14 kreverch
444 14 kreverch
                                                String[] Tsplit = this.getOutCmd().split("\n");
445 14 kreverch
                                                for (int cpt=0;cpt<Tsplit.length;cpt++){
446 14 kreverch
                                                        String[] TsplitLine = Tsplit[cpt].replaceAll("\n", "").replaceAll("\\s+", "").replaceAll("'", "").split(":");
447 14 kreverch
                                                        String propertyDisk=TsplitLine[0].toLowerCase();
448 14 kreverch
                                                        String valuePropertyDisk="";
449 14 kreverch
450 14 kreverch
                                                        if (TsplitLine.length==2){
451 14 kreverch
                                                                valuePropertyDisk=TsplitLine[1];
452 14 kreverch
                                                        }
453 14 kreverch
454 14 kreverch
                                                        if (Tsplit[cpt].equalsIgnoreCase("#infoDisk#")){
455 14 kreverch
                                                                if (!this.getZdisk().zProperties.get("path").getValue().equalsIgnoreCase("") ){
456 14 kreverch
                                                                        hashDisks.put("disk"+cpt, this.getZdisk());
457 14 kreverch
                                                                        log.debug(this.getZraid().zProperties.get("poolname").getValue()+"-"+this.getZraid().zProperties.get("raidtype").getValue()+"-"+this.getZraid().zProperties.get("raidid").getValue());
458 14 kreverch
                                                                        if (!hashZRaid.containsKey(this.getZraid().zProperties.get("poolname").getValue()+"-"+this.getZraid().zProperties.get("raidtype").getValue()+"-"+this.getZraid().zProperties.get("raidid").getValue())){
459 14 kreverch
                                                                                this.getZraid().zProperties.get("name").setValue(this.getZraid().zProperties.get("poolname").getValue()+"-"+this.getZraid().zProperties.get("raidtype").getValue()+"-"+this.getZraid().zProperties.get("raidid").getValue());
460 14 kreverch
                                                                                hashZRaid.put(this.getZraid().zProperties.get("poolname").getValue()+"-"+this.getZraid().zProperties.get("raidtype").getValue()+"-"+this.getZraid().zProperties.get("raidid").getValue(), this.getZraid());
461 14 kreverch
                                                                                this.setZraid();
462 14 kreverch
                                                                        }
463 14 kreverch
                                                                }
464 14 kreverch
                                                                this.setZdisk();
465 14 kreverch
                                                        }else{
466 14 kreverch
                                                                if (TsplitLine.length==2){
467 14 kreverch
                                                                        valuePropertyDisk=TsplitLine[1];
468 14 kreverch
469 14 kreverch
                                                                        if (this.getZdisk().zProperties.containsKey(propertyDisk)){
470 14 kreverch
                                                                                this.getZdisk().zProperties.get(propertyDisk).setValue(valuePropertyDisk);
471 14 kreverch
                                                                                //log.debug(propertyDisk+" : "+valuePropertyDisk);
472 14 kreverch
                                                                        }
473 14 kreverch
474 14 kreverch
                                                                        if (this.getZraid().zProperties.containsKey(propertyDisk)){
475 14 kreverch
                                                                                this.getZraid().zProperties.get(propertyDisk).setValue(valuePropertyDisk);
476 14 kreverch
477 14 kreverch
                                                                                log.debug(propertyDisk+" : "+valuePropertyDisk);
478 14 kreverch
                                                                        }
479 14 kreverch
                                                                }
480 14 kreverch
                                                        }
481 14 kreverch
482 14 kreverch
                                                }
483 14 kreverch
                                        }
484 14 kreverch
                                }
485 14 kreverch
                        }
486 14 kreverch
                        log.debug("getZpoolStatus : "+hashDisks.size());
487 14 kreverch
                        log.debug("getZpoolStatus : "+hashZRaid.size());
488 14 kreverch
                        this.setHashDisks(hashDisks);
489 14 kreverch
                        this.setHashZRaid(hashZRaid);
490 14 kreverch
491 14 kreverch
                }
492 14 kreverch
493 14 kreverch
        }
494 14 kreverch
495 14 kreverch
496 14 kreverch
        public void getInfoDisk(){
497 14 kreverch
                if ( this.executeCmd(this.getZserver().zProperties.get("bingetdiskinfo").getValue() +" "+this.getZdisk().zProperties.get("path").getValue())){
498 14 kreverch
                        log.debug("getZpoolStatus");
499 14 kreverch
                        if ( outErr.length() ==0){
500 14 kreverch
                                log.debug(this.getOutCmd());
501 14 kreverch
                                if (this.getOutCmd().length()>0) {
502 14 kreverch
                                        String dataType="";
503 14 kreverch
                                        String[] Tsplit = this.getOutCmd().split("\n");
504 14 kreverch
505 14 kreverch
506 14 kreverch
                                        for (int cpt=0;cpt<Tsplit.length;cpt++){
507 14 kreverch
508 14 kreverch
                                                String[] TsplitLine = Tsplit[cpt].replaceAll("\n", "").replaceAll("\\s+", "").replaceAll("'", "").split(":");
509 14 kreverch
                                                String propertyDisk=TsplitLine[0];
510 14 kreverch
                                                String valuePropertyDisk="";
511 14 kreverch
512 14 kreverch
513 14 kreverch
                                        }
514 14 kreverch
                                }
515 14 kreverch
                        }
516 14 kreverch
                }
517 14 kreverch
        }
518 14 kreverch
519 14 kreverch
520 14 kreverch
        public void getZsnapshotConfig(){
521 14 kreverch
                log.debug("getZsnapshotConfig");
522 14 kreverch
                this.setZsnapshots();
523 14 kreverch
                if (  this.executeCmd(this.getZserver().zProperties.get("bingetconfsnapshot").getValue()+" "+this.getZvol().zProperties.get("name").getValue()) ){
524 14 kreverch
                        if ( outErr.length() ==0){
525 14 kreverch
                                log.debug(this.getOutCmd());
526 14 kreverch
                                if (this.getOutCmd().length()>0) {
527 14 kreverch
                                        String[] Tsplit = this.getOutCmd().split("\n");
528 14 kreverch
                                        for (int cpt=0;cpt<Tsplit.length;cpt++){
529 14 kreverch
                                                String[] TsplitLine = Tsplit[cpt].replaceAll("\n", "").replaceAll("\\s+", " ").split("=");
530 14 kreverch
                                                log.debug(TsplitLine.length);
531 14 kreverch
                                                log.debug(TsplitLine[0]+" "+TsplitLine[1]);
532 14 kreverch
533 14 kreverch
                                                this.zsnapshots.zSchedulerProperties.get(TsplitLine[0]).setValue(TsplitLine[1]);
534 14 kreverch
                                        }
535 14 kreverch
                                }
536 14 kreverch
537 14 kreverch
                        }else{
538 14 kreverch
                                log.debug(this.getOutCmd());
539 14 kreverch
                                this.setZsnapshots();
540 14 kreverch
                                this.getZsnapshots().zSchedulerProperties.get("name").setValue(this.getZvol().zProperties.get("name").getValue());
541 14 kreverch
                                this.getZsnapshots().zSchedulerProperties.get("type").setValue(this.getZvol().zProperties.get("type").getValue());
542 14 kreverch
                        }
543 14 kreverch
                }
544 14 kreverch
                this.getZsnapshots().zSchedulerProperties.get("name").setValue(this.getZvol().zProperties.get("name").getValue());
545 14 kreverch
                this.getZsnapshots().zSchedulerProperties.get("type").setValue(this.getZvol().zProperties.get("type").getValue());
546 14 kreverch
        }
547 14 kreverch
548 14 kreverch
        public void getZreplicaConfig(){
549 14 kreverch
                log.debug("getZreplicaConfig");
550 14 kreverch
                this.setZreplicas();
551 14 kreverch
                log.debug(this.getZserver().zProperties.get("bingetconfreplica").getValue()+" "+this.getZvol().zProperties.get("name").getValue());
552 14 kreverch
                if (  this.executeCmd(this.getZserver().zProperties.get("bingetconfreplica").getValue()+" "+this.getZvol().zProperties.get("name").getValue()) ){
553 14 kreverch
                        if ( outErr.length() ==0){
554 14 kreverch
                                log.debug(this.getOutCmd());
555 14 kreverch
                                if (this.getOutCmd().length()>0) {
556 14 kreverch
                                        String[] Tsplit = this.getOutCmd().split("\n");
557 14 kreverch
                                        for (int cpt=0;cpt<Tsplit.length;cpt++){
558 14 kreverch
                                                String[] TsplitLine = Tsplit[cpt].replaceAll("\n", "").replaceAll("\\s+", " ").split("=");
559 14 kreverch
                                                log.debug(TsplitLine.length);
560 14 kreverch
                                                if (TsplitLine.length>1){
561 14 kreverch
                                                        log.debug(TsplitLine[0]+" "+TsplitLine[1]);
562 14 kreverch
                                                        this.zreplicas.zSchedulerProperties.get(TsplitLine[0]).setValue(TsplitLine[1]);
563 14 kreverch
                                                }
564 14 kreverch
                                        }
565 14 kreverch
                                }
566 14 kreverch
567 14 kreverch
                        }else{
568 14 kreverch
                                log.debug(this.getOutCmd());
569 14 kreverch
                                this.setZreplicas();
570 14 kreverch
                                this.getZreplicas().zSchedulerProperties.get("name").setValue(this.getZvol().zProperties.get("name").getValue());
571 14 kreverch
                                //this.getZreplicas().zSchedulerProperties.get("type").setValue(this.getZvol().zProperties.get("type").getValue());
572 14 kreverch
                        }
573 14 kreverch
                }
574 14 kreverch
575 14 kreverch
576 14 kreverch
                //this.getZsnapshots().zSchedulerProperties.get("name").setValue(this.getZvol().zProperties.get("name").getValue());
577 14 kreverch
                //this.getZreplicas().zSchedulerProperties.get("type").setValue(this.getZvol().zProperties.get("type").getValue());
578 14 kreverch
        }
579 14 kreverch
580 14 kreverch
        public void zfsEnableSnapshots(){
581 14 kreverch
582 14 kreverch
                String[] keysProp = (String[]) this.getZsnapshots().zSchedulerProperties.keySet().toArray(new String[0]);
583 14 kreverch
                Arrays.sort(keysProp);
584 14 kreverch
                error.clear();
585 14 kreverch
586 14 kreverch
                for ( int i=0;i<keysProp.length;i++){
587 14 kreverch
                        String keyProp = keysProp[i];
588 14 kreverch
                        if ( !this.getZsnapshots().zSchedulerProperties.get(keyProp).getType().equals("nofreeentry") && this.getZsnapshots().zSchedulerProperties.get(keyProp).getValue().equals("") && !"fileconf".equalsIgnoreCase(keyProp)){
589 14 kreverch
                                error.put(keyProp, keyProp+" cannot be empty");
590 14 kreverch
                        }else{
591 14 kreverch
                                if ( this.getZsnapshots().zSchedulerProperties.get(keyProp).getType().equals("nofreeentry") && this.getZsnapshots().zSchedulerProperties.get(keyProp).getMultivalues().isEmpty()){
592 14 kreverch
                                        error.put(keyProp, keyProp+" cannot be empty");
593 14 kreverch
                                }else{
594 14 kreverch
                                        if (this.getZsnapshots().zSchedulerProperties.get(keyProp).getType().equals("nofreeentry") && this.getZsnapshots().zSchedulerProperties.get(keyProp).getMultivalues().contains("*") && this.getZsnapshots().zSchedulerProperties.get(keyProp).getMultivalues().size()>1){
595 14 kreverch
                                                error.put(keyProp, keyProp+ " All is not compatible with others selections");
596 14 kreverch
                                        }
597 14 kreverch
                                }
598 14 kreverch
599 14 kreverch
                        }
600 14 kreverch
                        log.debug(this.getZsnapshots().zSchedulerProperties.get(keyProp).getType()+" "+this.getZsnapshots().zSchedulerProperties.get(keyProp).getValue()+" "+this.getZsnapshots().zSchedulerProperties.get(keyProp).getMultivalues());
601 14 kreverch
                }
602 14 kreverch
603 14 kreverch
                log.debug("ERROR SIZE : "+error.size());
604 14 kreverch
                if ( error.size() ==0){
605 14 kreverch
                        //String contentFileCronSnapshot = this.getZsnapshots().formatCronValue(this.getZsnapshots().zSchedulerProperties.get("frequency").getValue(), this.getZsnapshots().zSchedulerProperties.get("dayofweeksnapshots").getValue());
606 14 kreverch
                        for ( int i=0;i<keysProp.length;i++){
607 14 kreverch
                                String keyProp = keysProp[i];
608 14 kreverch
                                log.debug("zfsEnable "+keyProp);
609 14 kreverch
                                if ( this.getZsnapshots().zSchedulerProperties.get(keyProp).getMultivalues() != null){
610 14 kreverch
                                        if ( this.getZsnapshots().zSchedulerProperties.get(keyProp).getMultivalues().size() ==1){
611 14 kreverch
                                                this.getZsnapshots().zSchedulerProperties.get(keyProp).setValue(this.getZsnapshots().zSchedulerProperties.get(keyProp).getMultivalues().get(0).toString());
612 14 kreverch
                                        }else{
613 14 kreverch
                                                this.getZsnapshots().zSchedulerProperties.get(keyProp).setValue("");
614 14 kreverch
                                                for ( int cpt=0;cpt<this.getZsnapshots().zSchedulerProperties.get(keyProp).getMultivalues().size();cpt++){
615 14 kreverch
                                                        this.getZsnapshots().zSchedulerProperties.get(keyProp).setValue(this.getZsnapshots().zSchedulerProperties.get(keyProp).getValue()+this.getZsnapshots().zSchedulerProperties.get(keyProp).getMultivalues().get(cpt)+",");
616 14 kreverch
                                                }
617 14 kreverch
                                                this.getZsnapshots().zSchedulerProperties.get(keyProp).setValue(this.getZsnapshots().zSchedulerProperties.get(keyProp).getValue().substring(0, this.getZsnapshots().zSchedulerProperties.get(keyProp).getValue().length()-1));
618 14 kreverch
                                        }
619 14 kreverch
                                }
620 14 kreverch
                        }
621 14 kreverch
                        String cronMin = this.getZsnapshots().zSchedulerProperties.get("minutesofsnapshots").getValue();
622 14 kreverch
                        String cronHour = this.getZsnapshots().zSchedulerProperties.get("hoursofsnapshots").getValue();
623 14 kreverch
                        String cronMonth = this.getZsnapshots().zSchedulerProperties.get("monthsnapshots").getValue();
624 14 kreverch
                        String cronDayofMonth = this.getZsnapshots().zSchedulerProperties.get("dayofmonthsnapshots").getValue();
625 14 kreverch
                        String cronDayofWeek = this.getZsnapshots().zSchedulerProperties.get("dayofweeksnapshots").getValue();
626 14 kreverch
                        String nameVolFS=this.getZsnapshots().zSchedulerProperties.get("name").getValue();
627 14 kreverch
                        String typeZFS=this.getZsnapshots().zSchedulerProperties.get("type").getValue();
628 14 kreverch
                        String nbsnapshots=this.getZsnapshots().zSchedulerProperties.get("nbsnapshots").getValue();
629 14 kreverch
                        if (  this.executeCmd(this.getZserver().zProperties.get("binzfsenablesnapshots").getValue()+" -m "+"\""+cronMin+"\""+
630 14 kreverch
                                        " -H "+"\""+cronHour+"\""+
631 14 kreverch
                                        " -M "+"\""+cronMonth+"\""+
632 14 kreverch
                                        " -D "+"\""+cronDayofMonth+"\""+
633 14 kreverch
                                        " -d "+"\""+cronDayofWeek+"\""+
634 14 kreverch
                                        " -N "+"\""+nameVolFS+"\""+
635 14 kreverch
                                        " -t "+"\""+typeZFS+"\""+
636 14 kreverch
                                        " -k "+"\""+nbsnapshots+"\"")){
637 14 kreverch
                                if ( outErr.length() ==0){
638 14 kreverch
                                        log.debug(this.getOutCmd());
639 14 kreverch
                                        String[] Tsplit = this.getOutCmd().split("\n");
640 14 kreverch
                                        for (int cpt=0;cpt<Tsplit.length;cpt++){
641 14 kreverch
                                                /*String[] TsplitLine = Tsplit[cpt].replaceAll("\n", "").replaceAll("\\s+", " ").split("=");
642 14 kreverch
                                                log.debug(TsplitLine.length);
643 14 kreverch
                                                log.debug(TsplitLine[0]+" "+TsplitLine[1]);
644 14 kreverch
                                                this.zsnapshots.zSchedulerProperties.get(TsplitLine[0]).setValue(TsplitLine[1]);*/
645 14 kreverch
                                        }
646 14 kreverch
                                }else{
647 14 kreverch
                                        log.debug(this.getOutCmd());
648 14 kreverch
                                        this.setZsnapshots();
649 14 kreverch
                                        this.getZsnapshots().zSchedulerProperties.get("name").setValue(this.getZvol().zProperties.get("name").getValue());
650 14 kreverch
                                        this.getZsnapshots().zSchedulerProperties.get("type").setValue(this.getZvol().zProperties.get("type").getValue());
651 14 kreverch
                                }
652 14 kreverch
                        }
653 14 kreverch
                }
654 14 kreverch
        }
655 14 kreverch
656 14 kreverch
657 14 kreverch
        public void zfsDisableSnapshots(){
658 14 kreverch
                error.clear();
659 14 kreverch
                if (  this.executeCmd(this.getZserver().zProperties.get("binzfsdisablesnapshots").getValue()+" -N "+"\""+this.getZsnapshots().zSchedulerProperties.get("name").getValue()+"\"" )){
660 14 kreverch
                        if ( outErr.length() ==0){
661 14 kreverch
                                log.debug(this.getOutCmd());
662 14 kreverch
                        }else{
663 14 kreverch
                                log.debug(this.getOutCmd());
664 14 kreverch
                                if (outErr.length()>0){
665 14 kreverch
                                        error.put("binzfsdisablesnapshots", outErr+"\n" );
666 14 kreverch
                                }
667 14 kreverch
                        }
668 14 kreverch
                }
669 14 kreverch
        }
670 14 kreverch
671 14 kreverch
        public void zfsSnapshots(){
672 14 kreverch
                error.clear();
673 14 kreverch
                if ( this.getZsnapshots().zSchedulerProperties.get("fileconf").getValue().isEmpty()){
674 14 kreverch
                        error.put("fileconf ", "Please configure the Snapshots");
675 14 kreverch
                }
676 14 kreverch
                if ( error.size() < 1){
677 14 kreverch
                        if (  this.executeCmd(this.getZserver().zProperties.get("binzfssnapshots").getValue()+" "+"\""+this.getZsnapshots().zSchedulerProperties.get("fileconf").getValue()+"\"" )){
678 14 kreverch
                                if ( outErr.length() ==0){
679 14 kreverch
                                        log.debug(this.getOutCmd());
680 14 kreverch
                                }else{
681 14 kreverch
                                        log.debug(this.getOutCmd());
682 14 kreverch
                                        if (outErr.length()>0){
683 14 kreverch
                                                error.put("binzfssnapshots", outErr+"\n" );
684 14 kreverch
                                        }
685 14 kreverch
                                }
686 14 kreverch
                        }
687 14 kreverch
                }
688 14 kreverch
        }
689 14 kreverch
690 14 kreverch
691 14 kreverch
        public void zfsEnableReplicas(){
692 14 kreverch
693 14 kreverch
                String[] keysProp = (String[]) this.getZreplicas().zSchedulerProperties.keySet().toArray(new String[0]);
694 14 kreverch
                Arrays.sort(keysProp);
695 14 kreverch
                error.clear();
696 14 kreverch
697 14 kreverch
                for ( int i=0;i<keysProp.length;i++){
698 14 kreverch
                        String keyProp = keysProp[i];
699 14 kreverch
                        log.debug("zfsEnableReplicas "+keyProp);
700 14 kreverch
                        if ( !this.getZreplicas().zSchedulerProperties.get(keyProp).getType().equals("nofreeentry") && !this.getZreplicas().zSchedulerProperties.get(keyProp).getType().equals("noupdateable") && this.getZreplicas().zSchedulerProperties.get(keyProp).getValue().equals("")){
701 14 kreverch
                                error.put(keyProp, keyProp+" cannot be empty");
702 14 kreverch
                        }else{
703 14 kreverch
                                if ( "nofreeentry".equalsIgnoreCase(this.getZreplicas().zSchedulerProperties.get(keyProp).getType()) && (this.getZreplicas().zSchedulerProperties.get(keyProp).getPermitValue() !=null)){
704 14 kreverch
                                        if ( this.getZreplicas().zSchedulerProperties.get(keyProp).getType().equals("nofreeentry") && this.getZreplicas().zSchedulerProperties.get(keyProp).getMultivalues().isEmpty()){
705 14 kreverch
                                                error.put(keyProp, keyProp+" cannot be empty");
706 14 kreverch
                                        }else{
707 14 kreverch
                                                if (this.getZreplicas().zSchedulerProperties.get(keyProp).getType().equals("nofreeentry") && this.getZreplicas().zSchedulerProperties.get(keyProp).getMultivalues().contains("*") && this.getZreplicas().zSchedulerProperties.get(keyProp).getMultivalues().size()>1){
708 14 kreverch
                                                        error.put(keyProp, keyProp+ " All is not compatible with others selections");
709 14 kreverch
                                                }
710 14 kreverch
                                        }
711 14 kreverch
                                }
712 14 kreverch
                        }
713 14 kreverch
                        log.debug(this.getZreplicas().zSchedulerProperties.get(keyProp).getType()+" "+this.getZreplicas().zSchedulerProperties.get(keyProp).getValue()+" "+this.getZreplicas().zSchedulerProperties.get(keyProp).getMultivalues());
714 14 kreverch
                }
715 14 kreverch
                if ("".equalsIgnoreCase(this.getZreplicas().zSchedulerProperties.get("replicapool").getValue())){
716 14 kreverch
                        error.put("replicaPool", "replicapool cannot be empty");
717 14 kreverch
                }
718 14 kreverch
719 14 kreverch
                log.debug("ERROR SIZE : "+error.size());
720 14 kreverch
                if ( error.size() ==0){
721 14 kreverch
                        //String contentFileCronSnapshot = this.getZsnapshots().formatCronValue(this.getZsnapshots().zSchedulerProperties.get("frequency").getValue(), this.getZsnapshots().zSchedulerProperties.get("dayofweeksnapshots").getValue());
722 14 kreverch
                        for ( int i=0;i<keysProp.length;i++){
723 14 kreverch
                                String keyProp = keysProp[i];
724 14 kreverch
                                log.debug("zfsEnable Replica"+keyProp);
725 14 kreverch
                                if ( this.getZreplicas().zSchedulerProperties.get(keyProp).getMultivalues() != null){
726 14 kreverch
                                        if ( this.getZreplicas().zSchedulerProperties.get(keyProp).getMultivalues().size() ==1){
727 14 kreverch
                                                this.getZreplicas().zSchedulerProperties.get(keyProp).setValue(this.getZreplicas().zSchedulerProperties.get(keyProp).getMultivalues().get(0).toString());
728 14 kreverch
                                        }else{
729 14 kreverch
                                                this.getZreplicas().zSchedulerProperties.get(keyProp).setValue("");
730 14 kreverch
                                                for ( int cpt=0;cpt<this.getZreplicas().zSchedulerProperties.get(keyProp).getMultivalues().size();cpt++){
731 14 kreverch
                                                        this.getZreplicas().zSchedulerProperties.get(keyProp).setValue(this.getZreplicas().zSchedulerProperties.get(keyProp).getValue()+this.getZreplicas().zSchedulerProperties.get(keyProp).getMultivalues().get(cpt)+",");
732 14 kreverch
                                                }
733 14 kreverch
                                                this.getZreplicas().zSchedulerProperties.get(keyProp).setValue(this.getZreplicas().zSchedulerProperties.get(keyProp).getValue().substring(0, this.getZreplicas().zSchedulerProperties.get(keyProp).getValue().length()-1));
734 14 kreverch
                                        }
735 14 kreverch
                                }
736 14 kreverch
                        }
737 14 kreverch
                        String cronMin = this.getZreplicas().zSchedulerProperties.get("minutesofreplicas").getValue();
738 14 kreverch
                        String cronHour = this.getZreplicas().zSchedulerProperties.get("hoursofreplicas").getValue();
739 14 kreverch
                        String cronMonth = this.getZreplicas().zSchedulerProperties.get("monthreplicas").getValue();
740 14 kreverch
                        String cronDayofMonth = this.getZreplicas().zSchedulerProperties.get("dayofmonthreplicas").getValue();
741 14 kreverch
                        String cronDayofWeek = this.getZreplicas().zSchedulerProperties.get("dayofweekreplicas").getValue();
742 14 kreverch
                        String nameVolFS=this.getZreplicas().zSchedulerProperties.get("name").getValue();
743 14 kreverch
                        String nameReplica=this.getZreplicas().zSchedulerProperties.get("replicapool").getValue()+"/"+this.getZvol().zProperties.get("name").getValue().split("/")[1];
744 14 kreverch
                        String lastSnapshotsReplicated=this.getZreplicas().zSchedulerProperties.get("lastsnapshotreplicated").getValue();
745 14 kreverch
                        String nbReplica=this.getZreplicas().zSchedulerProperties.get("nbreplica").getValue();
746 14 kreverch
                        String cmd2exec = this.getZserver().zProperties.get("binzfsenablereplicas").getValue()+" -m "+"\""+cronMin+"\""+
747 14 kreverch
                                        " -H "+"\""+cronHour+"\""+
748 14 kreverch
                                        " -M "+"\""+cronMonth+"\""+
749 14 kreverch
                                        " -D "+"\""+cronDayofMonth+"\""+
750 14 kreverch
                                        " -d "+"\""+cronDayofWeek+"\""+
751 14 kreverch
                                        " -o "+"\""+nameVolFS+"\""+
752 14 kreverch
                                        " -r "+"\""+nameReplica+"\""+
753 14 kreverch
                                        " -n "+"\""+nbReplica+"\"";
754 14 kreverch
755 14 kreverch
                        if (!"".equalsIgnoreCase(this.getZreplicas().zSchedulerProperties.get("server").getValue()) && (!this.getZserver().zProperties.get("serverIP").getValue().equalsIgnoreCase(this.getZreplicas().zSchedulerProperties.get("server").getValue())) ){
756 14 kreverch
                                cmd2exec = cmd2exec +" -s "+this.getZreplicas().zSchedulerProperties.get("server").getValue();
757 14 kreverch
                        }
758 14 kreverch
                        log.debug(cmd2exec+" "+this.getZreplicas().zSchedulerProperties.get("server").getValue()+" "+this.getZserver().zProperties.get("serverIP").getValue());
759 14 kreverch
                        if (  this.executeCmd(cmd2exec)){
760 14 kreverch
                                if ( outErr.length() ==0){
761 14 kreverch
                                        log.debug(this.getOutCmd());
762 14 kreverch
                                        String[] Tsplit = this.getOutCmd().split("\n");
763 14 kreverch
                                        for (int cpt=0;cpt<Tsplit.length;cpt++){
764 14 kreverch
                                                /*String[] TsplitLine = Tsplit[cpt].replaceAll("\n", "").replaceAll("\\s+", " ").split("=");
765 14 kreverch
                                                log.debug(TsplitLine.length);
766 14 kreverch
                                                log.debug(TsplitLine[0]+" "+TsplitLine[1]);
767 14 kreverch
                                                this.zsnapshots.zSchedulerProperties.get(TsplitLine[0]).setValue(TsplitLine[1]);*/
768 14 kreverch
                                        }
769 14 kreverch
                                }else{
770 14 kreverch
                                        log.debug(this.getOutCmd());
771 14 kreverch
                                        this.setZreplicas();
772 14 kreverch
                                        this.getZreplicas().zSchedulerProperties.get("name").setValue(this.getZvol().zProperties.get("name").getValue());
773 14 kreverch
                                        //this.getZreplicas().zSchedulerProperties.get("type").setValue(this.getZvol().zProperties.get("type").getValue());
774 14 kreverch
                                }
775 14 kreverch
                        }
776 14 kreverch
                }
777 14 kreverch
        }
778 14 kreverch
779 14 kreverch
780 14 kreverch
        public void zfsDisableReplicas(){
781 14 kreverch
                error.clear();
782 14 kreverch
                if (  this.executeCmd(this.getZserver().zProperties.get("binzfsdisablereplicas").getValue()+" -N "+"\""+this.getZreplicas().zSchedulerProperties.get("name").getValue()+"\"" )){
783 14 kreverch
                        if ( outErr.length() ==0){
784 14 kreverch
                                log.debug(this.getOutCmd());
785 14 kreverch
                        }else{
786 14 kreverch
                                log.debug(this.getOutCmd());
787 14 kreverch
                                if (outErr.length()>0){
788 14 kreverch
                                        error.put("binzfsdisablereplicas", outErr+"\n" );
789 14 kreverch
                                }
790 14 kreverch
                        }
791 14 kreverch
                }
792 14 kreverch
        }
793 14 kreverch
794 14 kreverch
        public void zfsReplicas(){
795 14 kreverch
                error.clear();
796 14 kreverch
                if ( this.getZreplicas().zSchedulerProperties.get("fileconf").getValue().isEmpty()){
797 14 kreverch
                        error.put("fileconf ", "Please configure the replication");
798 14 kreverch
                }
799 14 kreverch
                if ( error.size() < 1){
800 14 kreverch
                        if (  this.executeCmd(this.getZserver().zProperties.get("binzfsreplica").getValue()+" "+"\""+this.getZreplicas().zSchedulerProperties.get("fileconf").getValue()+"\" &" )){
801 14 kreverch
                                if ( outErr.length() ==0){
802 14 kreverch
                                        log.debug(this.getOutCmd());
803 14 kreverch
                                }else{
804 14 kreverch
                                        log.debug(this.getOutCmd());
805 14 kreverch
                                        if (outErr.length()>0){
806 14 kreverch
                                                error.put("binzfsreplica", outErr+"\n" );
807 14 kreverch
                                        }
808 14 kreverch
                                }
809 14 kreverch
                        }
810 14 kreverch
                }
811 14 kreverch
        }
812 14 kreverch
813 14 kreverch
814 14 kreverch
        public void zfsCreateVolFS(){
815 14 kreverch
                error.clear();
816 14 kreverch
                if (this.getZpool().zProperties.get("name").getValue().equals("")){
817 14 kreverch
                        error.put("pool", "Please select a pool");
818 14 kreverch
                }
819 14 kreverch
                String[] keysProp = (String[]) this.getZvol().zProperties.keySet().toArray(new String[0]);
820 14 kreverch
                Arrays.sort(keysProp);
821 14 kreverch
                String optionsList="";
822 14 kreverch
                for (int i = 0; i < keysProp.length; i++) {
823 14 kreverch
                        String keyProp = keysProp[i];
824 14 kreverch
                        log.debug(keyProp);
825 14 kreverch
                        if ( ("volume".equalsIgnoreCase(this.getZvol().zProperties.get("type").getValue()) &&
826 14 kreverch
                                        ("volume".equalsIgnoreCase(this.getZvol().zProperties.get(keyProp).getPropertyOf()) ||
827 14 kreverch
                                                        "volandfs".equalsIgnoreCase(this.getZvol().zProperties.get(keyProp).getPropertyOf())))) {
828 14 kreverch
                                if (this.getZvol().zProperties.get(keyProp).getValue().equals("")&&!this.getZvol().zProperties.get(keyProp).getType().equals("noupdateable")){
829 14 kreverch
                                        error.put(keyProp, keyProp+" cannot be empty");
830 14 kreverch
                                }
831 14 kreverch
                                if ( keyProp.equals("volblocksize")&& "".equals(this.getZvol().zProperties.get(keyProp).getValue())){
832 14 kreverch
                                        error.put(keyProp, keyProp+" cannot be empty");
833 14 kreverch
                                }
834 14 kreverch
835 14 kreverch
                                String nameVolFS = this.getZvol().zProperties.get("name").getValue();
836 14 kreverch
                                //Available space
837 14 kreverch
                                if (keyProp.equals("volsize")&& !"".equals(this.getZvol().zProperties.get(keyProp).getValue())){
838 14 kreverch
                                        String unit = this.getZvol().zProperties.get("volsize").getValue().substring(this.getZvol().zProperties.get("volsize").getValue().length()-1, this.getZvol().zProperties.get("volsize").getValue().length());
839 14 kreverch
840 14 kreverch
                                        if ( !unit.equalsIgnoreCase("T") && !unit.equalsIgnoreCase("G") && !unit.equalsIgnoreCase("M")){
841 14 kreverch
                                                error.put("volsize", "Field size : Unit valid est T,G or M");
842 14 kreverch
                                        }else{
843 14 kreverch
                                                Float realUseableSpace = this.convertInReferenceUnit(this.getZpool().zProperties.get("realuseablespace").getValue(), unit);
844 14 kreverch
                                                Float sizeVolFS = this.convertInReferenceUnit(this.getZvol().zProperties.get("volsize").getValue(), unit);
845 14 kreverch
                                                this.zfsGetInfoByProperty(this.getZpool().zProperties.get("name").getValue(), "used");
846 14 kreverch
                                                Float usedSpace = this.convertInReferenceUnit(this.getZvol().zProperties.get("used").getValue(), unit);
847 14 kreverch
                                                this.getZvol().zProperties.get("name").setValue(nameVolFS);
848 14 kreverch
                                                Float freeSpace = realUseableSpace - usedSpace;
849 14 kreverch
                                                if ( sizeVolFS > freeSpace){
850 14 kreverch
                                                        error.put("freespace", "No space available. Free Pool Space : "+String.valueOf(freeSpace)+unit);
851 14 kreverch
                                                }
852 14 kreverch
                                        }
853 14 kreverch
                                }
854 14 kreverch
                                log.debug("zfsCreateVolFS : "+keyProp+" "+this.getZvol().zProperties.get(keyProp).getType());
855 14 kreverch
                                if (!keyProp.equals("name") &&  !this.getZvol().zProperties.get(keyProp).getType().equals("noupdateable")){
856 14 kreverch
                                        log.debug("zfsCreateVolFS :"+keyProp);
857 14 kreverch
                                        optionsList = optionsList+keyProp+"="+this.getZvol().zProperties.get(keyProp).getValue()+",";
858 14 kreverch
                                }
859 14 kreverch
                        }else{
860 14 kreverch
                                if (("filesystem".equalsIgnoreCase(this.getZvol().zProperties.get("type").getValue()) &&
861 14 kreverch
                                                "fs".equalsIgnoreCase(this.getZvol().zProperties.get(keyProp).getPropertyOf())||"volandfs".equalsIgnoreCase(this.getZvol().zProperties.get(keyProp).getPropertyOf()))        ){
862 14 kreverch
                                        if (this.getZvol().zProperties.get(keyProp).getValue().equals("")&&!this.getZvol().zProperties.get(keyProp).getType().equals("noupdateable")&&!"quota".equals(keyProp)&&!"reservation".equals(keyProp) ){
863 14 kreverch
                                                error.put(keyProp, keyProp+" cannot be empty");
864 14 kreverch
                                        }
865 14 kreverch
                                        if (("quota".equals(keyProp)||"reservation".equals(keyProp))&&"".equals(this.getZvol().zProperties.get(keyProp).getValue())){
866 14 kreverch
                                                this.getZvol().zProperties.get(keyProp).setValue("none");
867 14 kreverch
                                        }
868 14 kreverch
                                        if (("quota".equals(keyProp)||"reservation".equals(keyProp))&& !"none".equals(this.getZvol().zProperties.get(keyProp).getValue()) &&!"".equals(this.getZvol().zProperties.get(keyProp).getValue())){
869 14 kreverch
                                                String nameVolFS = this.getZvol().zProperties.get("name").getValue();
870 14 kreverch
                                                String unit = this.getZvol().zProperties.get(keyProp).getValue().substring(this.getZvol().zProperties.get(keyProp).getValue().length()-1, this.getZvol().zProperties.get(keyProp).getValue().length());
871 14 kreverch
                                                if ( !unit.equalsIgnoreCase("T") && !unit.equalsIgnoreCase("G") && !unit.equalsIgnoreCase("M")){
872 14 kreverch
                                                        error.put(keyProp, "Field "+keyProp+" : Unit valid est T,G or M");
873 14 kreverch
                                                }else{
874 14 kreverch
                                                        Float realUseableSpace = this.convertInReferenceUnit(this.getZpool().zProperties.get("realuseablespace").getValue(), unit);
875 14 kreverch
                                                        Float valueKeyProp = this.convertInReferenceUnit(this.getZvol().zProperties.get(keyProp).getValue(), unit);
876 14 kreverch
                                                        this.zfsGetInfoByProperty(this.getZpool().zProperties.get("name").getValue(), "used");
877 14 kreverch
                                                        Float usedSpace = this.convertInReferenceUnit(this.getZvol().zProperties.get("used").getValue(), unit);
878 14 kreverch
                                                        this.getZvol().zProperties.get("name").setValue(nameVolFS);
879 14 kreverch
                                                        Float freeSpace = realUseableSpace - usedSpace;
880 14 kreverch
                                                        if ( valueKeyProp > freeSpace){
881 14 kreverch
                                                                error.put(keyProp, "Error value for "+keyProp+" : No space available. Free Pool Space : "+String.valueOf(freeSpace)+unit);
882 14 kreverch
                                                        }
883 14 kreverch
                                                }
884 14 kreverch
                                        }
885 14 kreverch
                                        log.debug("zfsCreateVolFS : "+keyProp+" "+this.getZvol().zProperties.get(keyProp).getType());
886 14 kreverch
                                        if (!keyProp.equals("name") &&  !this.getZvol().zProperties.get(keyProp).getType().equals("noupdateable")){
887 14 kreverch
                                                log.debug("zfsCreateVolFS :"+keyProp);
888 14 kreverch
                                                optionsList = optionsList+keyProp+"="+this.getZvol().zProperties.get(keyProp).getValue()+",";
889 14 kreverch
                                        }
890 14 kreverch
                                }
891 14 kreverch
892 14 kreverch
                        }
893 14 kreverch
                }
894 14 kreverch
                if (error.size()==0){
895 14 kreverch
                        log.debug(optionsList);
896 14 kreverch
                        if ( optionsList.length()>0){
897 14 kreverch
                                optionsList=optionsList.substring(0, optionsList.length()-1);
898 14 kreverch
                        }
899 14 kreverch
900 14 kreverch
                        if ( "volume".equals(this.getZvol().zProperties.get("type").getValue())&& this.executeCmd(this.getZserver().zProperties.get("binzfscreatevolume").getValue()+" -n "+this.getZvol().zProperties.get("name").getValue()+
901 14 kreverch
                                        " -p "+this.getZpool().zProperties.get("name").getValue()+
902 14 kreverch
                                        " -b "+this.getZvol().zProperties.get("volblocksize").getValue()+
903 14 kreverch
                                        " -s "+this.getZvol().zProperties.get("volsize").getValue()+
904 14 kreverch
                                        " -o "+optionsList)){
905 14 kreverch
                                if ( outErr.length() ==0){
906 14 kreverch
                                        log.debug(this.getOutCmd());
907 14 kreverch
                                }else{
908 14 kreverch
                                        log.debug(this.getOutCmd());
909 14 kreverch
                                        error.put("binzfscreatevolume", "Incoherence : Please connect you to server and launch manualy "+this.getZserver().zProperties.get("binzfscreatevolume").getValue() );
910 14 kreverch
                                }
911 14 kreverch
                        }else{
912 14 kreverch
                                if ("filesystem".equals(this.getZvol().zProperties.get("type").getValue())&& this.executeCmd(this.getZserver().zProperties.get("binzfscreatefilesystem").getValue()+" -n "+this.getZvol().zProperties.get("name").getValue()+
913 14 kreverch
                                                " -p "+this.getZpool().zProperties.get("name").getValue()+
914 14 kreverch
                                                " -o "+optionsList)){
915 14 kreverch
                                        if ( outErr.length() ==0){
916 14 kreverch
                                                log.debug(this.getOutCmd());
917 14 kreverch
                                        }else{
918 14 kreverch
                                                log.debug(this.getOutCmd());
919 14 kreverch
                                                error.put("binzfscreatefilesystem", "Incoherence : Please connect you to server and launch manualy "+this.getZserver().zProperties.get("binzfscreatefilesystem").getValue() );
920 14 kreverch
                                        }
921 14 kreverch
                                }
922 14 kreverch
                        }
923 14 kreverch
                }else{
924 14 kreverch
                        log.debug("Error : "+error.size());
925 14 kreverch
                }
926 14 kreverch
        }
927 14 kreverch
928 14 kreverch
        public void zfsUmountFS(){
929 14 kreverch
                error.clear();
930 14 kreverch
                if ("".equals(this.getZvol().zProperties.get("name").getValue())){
931 14 kreverch
                        error.put("name", "Please select a ZFS FileSystem");
932 14 kreverch
                }
933 14 kreverch
                if (error.size()==0){
934 14 kreverch
                        if (this.executeCmd(this.getZserver().zProperties.get("binzfs").getValue()+" umount "+this.getZvol().zProperties.get("name").getValue())){
935 14 kreverch
                                if ( outErr.length() ==0){
936 14 kreverch
                                        log.debug(this.getOutCmd());
937 14 kreverch
                                }else{
938 14 kreverch
                                        log.debug(this.getOutCmd());
939 14 kreverch
                                        if (outErr.toString().contains("Error")){
940 14 kreverch
                                                error.put("binzfs", "Incoherence : Please connect you to server and launch manualy "+this.getZserver().zProperties.get("binzfs").getValue() );
941 14 kreverch
                                        }
942 14 kreverch
                                }
943 14 kreverch
                        }else{
944 14 kreverch
                                error.put("executeCmd", "Problem with the command : "+this.getZserver().zProperties.get("binzfs").getValue()+" umount "+this.getZvol().zProperties.get("name").getValue());
945 14 kreverch
                        }
946 14 kreverch
                }
947 14 kreverch
948 14 kreverch
        }
949 14 kreverch
950 14 kreverch
        public void zfsDestroyVolFS(){
951 14 kreverch
                error.clear();
952 14 kreverch
                if ("".equals(this.getZvol().zProperties.get("name").getValue())){
953 14 kreverch
                        error.put("name", "Please select a ZFS FileSystem");
954 14 kreverch
                }
955 14 kreverch
                if ( error.size()==0){
956 14 kreverch
                        if ( "filesystem".equals(this.getZvol().zProperties.get("type").getValue())){
957 14 kreverch
                                if ( this.executeCmd(this.getZserver().zProperties.get("binzfsdelfilesystem").getValue()+" -n "+this.getZvol().zProperties.get("name").getValue() )) {
958 14 kreverch
                                        if ( outErr.length() ==0){
959 14 kreverch
                                                log.debug(this.getOutCmd());
960 14 kreverch
                                        }else{
961 14 kreverch
                                                log.debug(this.getOutCmd());
962 14 kreverch
                                                if (outErr.length()>0){
963 14 kreverch
                                                        error.put("binzfsdelvolume", outErr+"\n" );
964 14 kreverch
                                                }
965 14 kreverch
                                        }
966 14 kreverch
                                }else{
967 14 kreverch
                                        error.put("executeCmd", "Problem with the command : "+this.getZserver().zProperties.get("binzfsdelfilesystem").getValue()+" -n "+this.getZvol().zProperties.get("name").getValue());
968 14 kreverch
                                }
969 14 kreverch
                        }else{
970 14 kreverch
                                if ( "volume".equals(this.getZvol().zProperties.get("type").getValue())){
971 14 kreverch
                                        if ( this.executeCmd(this.getZserver().zProperties.get("binzfsdelvolume").getValue()+" -n "+this.getZvol().zProperties.get("name").getValue() )) {
972 14 kreverch
                                                if ( outErr.length() ==0){
973 14 kreverch
                                                        log.debug(this.getOutCmd());
974 14 kreverch
                                                }else{
975 14 kreverch
                                                        log.debug(this.getOutCmd());
976 14 kreverch
                                                        if (outErr.length()>0){
977 14 kreverch
                                                                error.put("binzfsdelvolume", outErr+"\n" );
978 14 kreverch
                                                        }
979 14 kreverch
                                                }
980 14 kreverch
                                        }else{
981 14 kreverch
                                                error.put("executeCmd", "Problem with the command : "+this.getZserver().zProperties.get("binzfsdelvolume").getValue()+" -n "+this.getZvol().zProperties.get("name").getValue());
982 14 kreverch
                                        }
983 14 kreverch
                                }else{
984 14 kreverch
                                        if ( "snapshot".equals(this.getZvol().zProperties.get("type").getValue())){
985 14 kreverch
                                                if ( this.executeCmd(this.getZserver().zProperties.get("binzfsdelvolume").getValue()+" -n "+this.getZvol().zProperties.get("name").getValue() )) {
986 14 kreverch
                                                        if ( outErr.length() ==0){
987 14 kreverch
                                                                log.debug(this.getOutCmd());
988 14 kreverch
                                                        }else{
989 14 kreverch
                                                                log.debug(this.getOutCmd());
990 14 kreverch
                                                                if (outErr.length()>0){
991 14 kreverch
                                                                        error.put("binzfsdelvolume", outErr+"\n" );
992 14 kreverch
                                                                }
993 14 kreverch
                                                        }
994 14 kreverch
                                                }else{
995 14 kreverch
                                                        error.put("executeCmd", "Problem with the command : "+this.getZserver().zProperties.get("binzfsdelvolume").getValue()+" -n "+this.getZvol().zProperties.get("name").getValue());
996 14 kreverch
                                                }
997 14 kreverch
                                        }
998 14 kreverch
                                }
999 14 kreverch
                        }
1000 14 kreverch
1001 14 kreverch
                }
1002 14 kreverch
        }
1003 14 kreverch
1004 14 kreverch
        public void zfsCreateIscsi(){
1005 14 kreverch
                String[] keysProp = (String[]) this.getZiscsi().zProperties.keySet().toArray(new String[0]);
1006 14 kreverch
                Arrays.sort(keysProp);
1007 14 kreverch
                error.clear();
1008 14 kreverch
                if ("filesystem".equals(this.getZvol().zProperties.get("type").getValue())){
1009 14 kreverch
                        error.put("type", "You cannot add a iscsi configuration for a zfs filesystem");
1010 14 kreverch
                }
1011 14 kreverch
1012 14 kreverch
                for ( int i=0;i<keysProp.length;i++){
1013 14 kreverch
                        String keyProp = keysProp[i];
1014 14 kreverch
                        if (!this.getZiscsi().zProperties.get(keyProp).getType().contains("noupdateable") && !keyProp.equalsIgnoreCase("allowIP")){
1015 14 kreverch
                                if ( "".equals(this.getZiscsi().zProperties.get(keyProp).getValue())) {
1016 14 kreverch
                                        error.put(keyProp, this.getZiscsi().zProperties.get(keyProp).getLabelProperty()+" cannot be empty" );
1017 14 kreverch
                                }
1018 14 kreverch
                        }
1019 14 kreverch
                }
1020 14 kreverch
                if (!"".equals(this.getZiscsi().zProperties.get("tid").getValue())){
1021 14 kreverch
                        error.put("tid", "Iscsi is already configured for this volume" );
1022 14 kreverch
                }
1023 14 kreverch
1024 14 kreverch
                if ( error.size() ==0){
1025 14 kreverch
                        String cmd = this.getZserver().zProperties.get("binzfsaddiscsi").getValue()+" -d "+this.getZserver().zProperties.get("pathzfsvoldevice").getValue()+this.getZiscsi().zProperties.get("name").getValue()
1026 14 kreverch
                                        +" -T "+this.getZiscsi().zProperties.get("exportType").getValue()+
1027 14 kreverch
                                        " -L 0"+
1028 14 kreverch
                                        " -o "+this.getZiscsi().zProperties.get("iomode").getValue()+
1029 14 kreverch
                                        " -l "+this.getZiscsi().zProperties.get("login").getValue()+
1030 14 kreverch
                                        " -p "+this.getZiscsi().zProperties.get("passwd").getValue()+
1031 14 kreverch
                                        " -t "+this.getZiscsi().zProperties.get("name").getValue();
1032 14 kreverch
                        if (!this.getZiscsi().zProperties.get("allowIP").getValue().isEmpty()){
1033 14 kreverch
                                cmd = cmd +" -R "+"\""+this.getZiscsi().zProperties.get("allowIP").getValue()+"\"";
1034 14 kreverch
                        }
1035 14 kreverch
                        if (  this.executeCmd(cmd)){
1036 14 kreverch
                                if ( outErr.length() ==0){
1037 14 kreverch
                                        //log.debug(this.getOutCmd());
1038 14 kreverch
                                }else{
1039 14 kreverch
                                        if (outErr.toString().contains("Error")){
1040 14 kreverch
                                                error.put("pathzfsvoldevice", "Incoherence : Please connect you to server and launch manualy "+this.getZserver().zProperties.get("binzfsaddiscsi").getValue() );
1041 14 kreverch
                                        }
1042 14 kreverch
                                }
1043 14 kreverch
                        }
1044 14 kreverch
                }
1045 14 kreverch
        }
1046 14 kreverch
1047 14 kreverch
        public void zfsDelIscsi(){
1048 14 kreverch
                error.clear();
1049 14 kreverch
                if (!"".equals(this.getZiscsi().zProperties.get("tid").getValue())){
1050 14 kreverch
                        if (  this.executeCmd(this.getZserver().zProperties.get("binzfsdeliscsi").getValue()+" -T "+"\""+this.getZiscsi().zProperties.get("tid").getValue()+"\"" )){
1051 14 kreverch
                                if ( outErr.length() ==0){
1052 14 kreverch
                                        log.debug(this.getOutCmd());
1053 14 kreverch
                                }else{
1054 14 kreverch
                                        log.debug("zdsdelIscsi Error : " +outErr);
1055 14 kreverch
                                        if ( outErr.toString().contains("in use")){
1056 14 kreverch
                                                error.put("binzfsdeliscsi", outErr.toString() );
1057 14 kreverch
                                        }else{
1058 14 kreverch
                                                error.put("binzfsdeliscsi", outErr+"\n"+"Incoherence : Please connect you to server and launch manualy "+this.getZserver().zProperties.get("binzfsdeliscsi").getValue() );
1059 14 kreverch
                                        }
1060 14 kreverch
                                }
1061 14 kreverch
                        }
1062 14 kreverch
                }
1063 14 kreverch
1064 14 kreverch
        }
1065 14 kreverch
1066 14 kreverch
1067 14 kreverch
        public void zfsClone(){
1068 14 kreverch
                error.clear();
1069 14 kreverch
                if ("".equals(this.getZvol().zProperties.get("name").getValue())){
1070 14 kreverch
                        error.put("name", "Please, select a volume or filesystem to clone" );
1071 14 kreverch
                }
1072 14 kreverch
1073 14 kreverch
                if ( error.size() ==0){
1074 14 kreverch
                        String cmd = this.getZserver().zProperties.get("binzfsclone").getValue()+" -n "+this.getZvol().zProperties.get("name").getValue();
1075 14 kreverch
                        if (  this.executeCmd(cmd)){
1076 14 kreverch
                                if ( outErr.length() ==0){
1077 14 kreverch
                                        log.debug(this.getOutCmd());
1078 14 kreverch
                                        String[] TsplitOut = this.getOutCmd().split("\n");
1079 14 kreverch
                                        if (TsplitOut.length>0){
1080 14 kreverch
                                                String[] TsplitLine = TsplitOut[0].split("name:");
1081 14 kreverch
                                                if (TsplitLine.length>0){
1082 14 kreverch
                                                        this.zfsGetAllVolume(TsplitLine[1]);
1083 14 kreverch
                                                        if ("".equalsIgnoreCase(this.getZvol().zProperties.get("name").getValue())){
1084 14 kreverch
                                                                error.put("zfsclone", "Clone Creation failed");
1085 14 kreverch
                                                        }
1086 14 kreverch
                                                }
1087 14 kreverch
                                        }
1088 14 kreverch
                                }else{
1089 14 kreverch
                                        if (outErr.length()>0){
1090 14 kreverch
                                                error.put("zfsclone", outErr);
1091 14 kreverch
                                        }
1092 14 kreverch
                                }
1093 14 kreverch
                        }
1094 14 kreverch
                }
1095 14 kreverch
        }
1096 14 kreverch
1097 14 kreverch
1098 14 kreverch
        public float convertInReferenceUnit(String value2Convert, String refUnit){
1099 14 kreverch
1100 14 kreverch
                float convertedValue=0;
1101 21 kreverch
                value2Convert = value2Convert.replace(",", ".");
1102 14 kreverch
                log.debug("convertInReferenceUnit "+value2Convert+" "+refUnit);
1103 14 kreverch
                if ( refUnit.equalsIgnoreCase("T")){
1104 14 kreverch
                        if (value2Convert.contains("T")){
1105 14 kreverch
                                convertedValue=Float.valueOf(value2Convert.substring(0, (value2Convert.length()-1)));
1106 14 kreverch
                        }else{
1107 14 kreverch
                                if (value2Convert.contains("G")){
1108 14 kreverch
                                        convertedValue=(Float.valueOf(value2Convert.substring(0, (value2Convert.length()-1)))/1024);
1109 14 kreverch
                                }else{
1110 14 kreverch
                                        if (value2Convert.contains("M")){
1111 14 kreverch
                                                convertedValue=(Float.valueOf(value2Convert.substring(0, (value2Convert.length()-1)))/1048576);
1112 14 kreverch
                                        }else{
1113 14 kreverch
                                                if (value2Convert.contains("K")){
1114 14 kreverch
                                                        convertedValue=(Float.valueOf(value2Convert.substring(0, (value2Convert.length()-1)))/1073741824);
1115 14 kreverch
                                                }
1116 14 kreverch
                                        }
1117 14 kreverch
                                }
1118 14 kreverch
                        }
1119 14 kreverch
1120 14 kreverch
                }
1121 14 kreverch
1122 14 kreverch
                if ( refUnit.equalsIgnoreCase("G")){
1123 14 kreverch
                        if (value2Convert.contains("G")){
1124 14 kreverch
                                convertedValue=(Float.valueOf(value2Convert.substring(0, (value2Convert.length()-1))));
1125 14 kreverch
                        }else{
1126 14 kreverch
                                if (value2Convert.contains("T")){
1127 14 kreverch
                                        convertedValue=(Float.valueOf(value2Convert.substring(0, (value2Convert.length()-1)))*1024);
1128 14 kreverch
                                }else{
1129 14 kreverch
                                        if (value2Convert.contains("M")){
1130 14 kreverch
                                                convertedValue=(Float.valueOf(value2Convert.substring(0, (value2Convert.length()-1)))/1024);
1131 14 kreverch
                                        }else{
1132 14 kreverch
                                                if (value2Convert.contains("K")){
1133 14 kreverch
                                                        convertedValue=(Float.valueOf(value2Convert.substring(0, (value2Convert.length()-1)))/1048576);
1134 14 kreverch
                                                }
1135 14 kreverch
                                        }
1136 14 kreverch
                                }
1137 14 kreverch
                        }
1138 14 kreverch
                }
1139 14 kreverch
                log.debug("getZpoolProvisionedSpace "+convertedValue);
1140 14 kreverch
                return convertedValue;
1141 14 kreverch
        }
1142 14 kreverch
1143 14 kreverch
        public List<Object> zfsList(){
1144 14 kreverch
                zfsList.clear();
1145 14 kreverch
1146 14 kreverch
1147 14 kreverch
                if (  this.executeCmd("/sbin/zfs list -H") ){
1148 14 kreverch
                        String[] Tsplit = this.getOutCmd().split("\n");
1149 14 kreverch
                        for (int cpt=0;cpt<Tsplit.length;cpt++){
1150 14 kreverch
                                log.debug(Tsplit[cpt].split("\\s+")[0] );
1151 14 kreverch
                                zfsList.add(Tsplit[cpt].split("\\s+")[0]);
1152 14 kreverch
                                //zpoolNames[ind] = Tsplit[cpt].split("\\s+")[0];
1153 14 kreverch
                        }
1154 14 kreverch
                }
1155 14 kreverch
                return zfsList;
1156 14 kreverch
        }
1157 14 kreverch
1158 14 kreverch
1159 14 kreverch
        public boolean addServer(){
1160 14 kreverch
1161 14 kreverch
                if (!"".equalsIgnoreCase(this.getZserver().zProperties.get("serverIP").getValue())) {
1162 14 kreverch
                        this.getZserver().add(System.getProperty("user.home")+prop.getProperty("serverConfDir")+this.getZserver().zProperties.get("serverIP").getValue()+".properties");
1163 14 kreverch
1164 14 kreverch
                }else{
1165 14 kreverch
                        return false;
1166 14 kreverch
                }
1167 14 kreverch
                return true;
1168 14 kreverch
        }
1169 14 kreverch
1170 14 kreverch
        public boolean removeServer(){
1171 14 kreverch
                if (!"".equalsIgnoreCase(this.getZserver().zProperties.get("serverIP").getValue())) {
1172 14 kreverch
                        this.getZserver().remove(System.getProperty("user.home")+prop.getProperty("serverConfDir")+this.getZserver().zProperties.get("serverIP").getValue()+".properties");
1173 14 kreverch
                        this.getCacheSession().remove(this.getZserver().zProperties.get("serverIP").getValue());
1174 14 kreverch
                }
1175 14 kreverch
                return false;
1176 14 kreverch
        }
1177 14 kreverch
1178 14 kreverch
        public List<Object> getListServer(){
1179 14 kreverch
                String dirName = System.getProperty("user.home")+prop.getProperty("serverConfDir");
1180 14 kreverch
                log.debug(System.getProperty("user.home")+prop.getProperty("serverConfDir"));
1181 14 kreverch
                File dir = new File(dirName);
1182 14 kreverch
                if ( !dir.exists()){
1183 14 kreverch
                        dir.mkdir();
1184 14 kreverch
                        log.debug((System.getProperty("user.home")+prop.getProperty("serverConfDir")));
1185 14 kreverch
                }
1186 14 kreverch
                log.debug((System.getProperty("user.home")+prop.getProperty("serverConfDir")));
1187 14 kreverch
                File f = new File(System.getProperty("user.home")+prop.getProperty("serverConfDir"));
1188 14 kreverch
                log.debug((System.getProperty("user.home")+prop.getProperty("serverConfDir")));
1189 14 kreverch
                File[] list = f.listFiles();
1190 14 kreverch
                List<Object> listServer = new ArrayList<Object>();
1191 14 kreverch
                for (int i=0;i<list.length;i++){
1192 14 kreverch
                        listServer.add(list[i].getName().split(".properties")[0]);
1193 14 kreverch
                }
1194 14 kreverch
                return listServer;
1195 14 kreverch
        }
1196 14 kreverch
1197 14 kreverch
        public void getServer(String serverName){
1198 14 kreverch
                this.getZserver().load(System.getProperty("user.home")+prop.getProperty("serverConfDir")+serverName+".properties");
1199 14 kreverch
                String[] keysProp = (String[]) this.getZserver().zProperties.keySet().toArray(new String[0]);
1200 14 kreverch
                Arrays.sort(keysProp);
1201 14 kreverch
                error.clear();
1202 14 kreverch
                for ( int i=0;i<keysProp.length;i++){
1203 14 kreverch
                        String keyProp = keysProp[i];
1204 14 kreverch
                        if (prop.containsKey(keyProp)){
1205 14 kreverch
                                this.getZserver().zProperties.get(keyProp).setValue(prop.getProperty(keyProp));
1206 14 kreverch
                        }
1207 14 kreverch
1208 14 kreverch
                }
1209 14 kreverch
        }
1210 14 kreverch
1211 14 kreverch
        public void checkBinEnv(){
1212 14 kreverch
                String[] keysProp = (String[]) this.getZserver().zProperties.keySet().toArray(new String[0]);
1213 14 kreverch
                Arrays.sort(keysProp);
1214 14 kreverch
                error.clear();
1215 14 kreverch
                for ( int i=0;i<keysProp.length;i++){
1216 14 kreverch
                        String keyProp = keysProp[i];
1217 14 kreverch
                        if ( !keyProp.equalsIgnoreCase("serverIP") && !keyProp.equalsIgnoreCase("userLogin") && !keyProp.equalsIgnoreCase("userPasswd")&&!keyProp.equalsIgnoreCase("pathzfsvoldevice")){
1218 14 kreverch
                                if (  this.executeCmd(prop.getProperty(keyProp)) && ! outErr.toString().contains("No such file or directory")){
1219 14 kreverch
                                        log.debug(prop.getProperty(keyProp));
1220 14 kreverch
                                        log.debug("checkBinEnv "+outErr.toString().contains("No such file or directory"));
1221 14 kreverch
                                }else{
1222 14 kreverch
                                        error.put(keyProp, outErr.toString());
1223 14 kreverch
                                }
1224 14 kreverch
                        }
1225 14 kreverch
                }
1226 14 kreverch
        }
1227 14 kreverch
1228 14 kreverch
        public void loadConfig(){
1229 14 kreverch
1230 14 kreverch
                try {
1231 14 kreverch
                        InputStream resource = getClass().getResourceAsStream("config.properties");
1232 14 kreverch
1233 14 kreverch
                        prop.load(resource);
1234 14 kreverch
                        log.debug(prop);
1235 14 kreverch
                } catch (FileNotFoundException e) {
1236 14 kreverch
                        // TODO Auto-generated catch block
1237 14 kreverch
                        e.printStackTrace();
1238 14 kreverch
                } catch (IOException e) {
1239 14 kreverch
                        // TODO Auto-generated catch block
1240 14 kreverch
                        e.printStackTrace();
1241 14 kreverch
                }
1242 14 kreverch
        }
1243 14 kreverch
        public String getUserPassword() {
1244 14 kreverch
                return userPassword;
1245 14 kreverch
        }
1246 14 kreverch
1247 14 kreverch
1248 14 kreverch
1249 14 kreverch
        public void setUserPassword(String userPassword) {
1250 14 kreverch
                this.userPassword = userPassword;
1251 14 kreverch
        }
1252 14 kreverch
1253 14 kreverch
1254 14 kreverch
1255 14 kreverch
        public String getUserLogin() {
1256 14 kreverch
                return userLogin;
1257 14 kreverch
        }
1258 14 kreverch
1259 14 kreverch
1260 14 kreverch
1261 14 kreverch
        public void setUserLogin(String userLogin) {
1262 14 kreverch
                this.userLogin = userLogin;
1263 14 kreverch
        }
1264 14 kreverch
1265 14 kreverch
1266 14 kreverch
1267 14 kreverch
        public String getSshHost() {
1268 14 kreverch
                return sshHost;
1269 14 kreverch
        }
1270 14 kreverch
1271 14 kreverch
1272 14 kreverch
1273 14 kreverch
        public void setSshHost(String sshHost) {
1274 14 kreverch
                this.sshHost = sshHost;
1275 14 kreverch
        }
1276 14 kreverch
1277 14 kreverch
1278 14 kreverch
1279 14 kreverch
        public int getSshPort() {
1280 14 kreverch
                return sshPort;
1281 14 kreverch
        }
1282 14 kreverch
1283 14 kreverch
1284 14 kreverch
1285 14 kreverch
        public void setSshPort(int sshPort) {
1286 14 kreverch
                this.sshPort = sshPort;
1287 14 kreverch
        }
1288 14 kreverch
1289 14 kreverch
        public String getOutCmd() {
1290 14 kreverch
                return outCmd;
1291 14 kreverch
        }
1292 14 kreverch
1293 14 kreverch
        public void setOutCmd(String out) {
1294 14 kreverch
                this.outCmd=out;
1295 14 kreverch
        }
1296 14 kreverch
1297 14 kreverch
        public Session getSession() {
1298 14 kreverch
                return session;
1299 14 kreverch
        }
1300 14 kreverch
1301 14 kreverch
        public void setSession(Session session) {
1302 14 kreverch
                this.session = session;
1303 14 kreverch
        }
1304 14 kreverch
1305 14 kreverch
        /**
1306 14 kreverch
         * @return the zSnapshot
1307 14 kreverch
         */
1308 14 kreverch
        public zsnapshots getZsnapshots() {
1309 14 kreverch
                return zsnapshots;
1310 14 kreverch
        }
1311 14 kreverch
1312 14 kreverch
        /**
1313 14 kreverch
         * @param zSnapshot the zSnapshot to set
1314 14 kreverch
         */
1315 14 kreverch
        public void setZsnapshots() {
1316 14 kreverch
                this.zsnapshots = new zsnapshots();
1317 14 kreverch
        }
1318 14 kreverch
1319 14 kreverch
        public zreplicas getZreplicas() {
1320 14 kreverch
                return zreplicas;
1321 14 kreverch
        }
1322 14 kreverch
1323 14 kreverch
        public void setZreplicas() {
1324 14 kreverch
                this.zreplicas = new zreplicas();
1325 14 kreverch
        }
1326 14 kreverch
1327 14 kreverch
        /**
1328 14 kreverch
         * @return the ziscsi
1329 14 kreverch
         */
1330 14 kreverch
        public ziscsi getZiscsi() {
1331 14 kreverch
                return ziscsi;
1332 14 kreverch
        }
1333 14 kreverch
1334 14 kreverch
        /**
1335 14 kreverch
         * @param ziscsi the ziscsi to set
1336 14 kreverch
         */
1337 14 kreverch
        public void setZiscsi() {
1338 14 kreverch
                this.ziscsi = new ziscsi();
1339 14 kreverch
        }
1340 14 kreverch
1341 14 kreverch
        /**
1342 14 kreverch
         * @return the zserver
1343 14 kreverch
         */
1344 14 kreverch
        public zserver getZserver() {
1345 14 kreverch
                return zserver;
1346 14 kreverch
        }
1347 14 kreverch
1348 14 kreverch
        /**
1349 14 kreverch
         * @param zserver the zserver to set
1350 14 kreverch
         */
1351 14 kreverch
        public void setZserver() {
1352 14 kreverch
                this.zserver = new zserver();
1353 14 kreverch
        }
1354 14 kreverch
1355 14 kreverch
        /**
1356 14 kreverch
         * @return the cacheSession
1357 14 kreverch
         */
1358 14 kreverch
        public Hashtable<String,Session> getCacheSession() {
1359 14 kreverch
                return cacheSession;
1360 14 kreverch
        }
1361 14 kreverch
1362 14 kreverch
        /**
1363 14 kreverch
         * @param cacheSession the cacheSession to set
1364 14 kreverch
         */
1365 14 kreverch
        public void setCacheSession(Hashtable<String,Session> cacheSession) {
1366 14 kreverch
                this.cacheSession = cacheSession;
1367 14 kreverch
        }
1368 14 kreverch
1369 14 kreverch
        /**
1370 14 kreverch
         * @return the zpool
1371 14 kreverch
         */
1372 14 kreverch
        public zpool getZpool() {
1373 14 kreverch
                return zpool;
1374 14 kreverch
        }
1375 14 kreverch
1376 14 kreverch
        /**
1377 14 kreverch
         * @param zpool the zpool to set
1378 14 kreverch
         */
1379 14 kreverch
        public void setZpool() {
1380 14 kreverch
                this.zpool = new zpool();
1381 14 kreverch
        }
1382 14 kreverch
1383 14 kreverch
1384 14 kreverch
        public zdisk getZdisk() {
1385 14 kreverch
                return zdisk;
1386 14 kreverch
        }
1387 14 kreverch
1388 14 kreverch
        public void setZdisk() {
1389 14 kreverch
                this.zdisk = new zdisk();
1390 14 kreverch
        }
1391 14 kreverch
1392 14 kreverch
        /**
1393 14 kreverch
         * @return the error
1394 14 kreverch
         */
1395 14 kreverch
        public Hashtable<String,Object> getError() {
1396 14 kreverch
                return error;
1397 14 kreverch
        }
1398 14 kreverch
1399 14 kreverch
        /**
1400 14 kreverch
         * @param error the error to set
1401 14 kreverch
         */
1402 14 kreverch
        public void setError(Hashtable<String,Object> error) {
1403 14 kreverch
                this.error = error;
1404 14 kreverch
        }
1405 14 kreverch
1406 14 kreverch
        public Hashtable<String, zdisk> getHashDisks() {
1407 14 kreverch
                return hashDisks;
1408 14 kreverch
        }
1409 14 kreverch
1410 14 kreverch
        public void setHashDisks(Hashtable<String, zdisk> hashDisks) {
1411 14 kreverch
                this.hashDisks = hashDisks;
1412 14 kreverch
        }
1413 14 kreverch
1414 14 kreverch
        public zraid getZraid() {
1415 14 kreverch
                return zraid;
1416 14 kreverch
        }
1417 14 kreverch
1418 14 kreverch
        public void setZraid() {
1419 14 kreverch
                this.zraid = new zraid();
1420 14 kreverch
        }
1421 14 kreverch
1422 14 kreverch
1423 14 kreverch
1424 14 kreverch
        public Hashtable<String, zraid> getHashZRaid() {
1425 14 kreverch
                return hashZRaid;
1426 14 kreverch
        }
1427 14 kreverch
1428 14 kreverch
        public void setHashZRaid(Hashtable<String, zraid> hashZRaid) {
1429 14 kreverch
                this.hashZRaid = hashZRaid;
1430 14 kreverch
        }
1431 14 kreverch
1432 14 kreverch
}