/* * Copyright 2011 Future Systems * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.krakenapps.linux.api; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.InetAddress; import java.util.ArrayList; import java.util.List; public class DnsConfig { private List<InetAddress> nameserver; private String domain; private List<String> search; private List<Sortlist> sortlist; private List<String> others; private DnsConfig() { this.nameserver = new ArrayList<InetAddress>(); this.domain = null; this.search = new ArrayList<String>(); this.sortlist = new ArrayList<Sortlist>(); this.others = new ArrayList<String>(); } public static DnsConfig getConfig() throws IOException { DnsConfig resolv = new DnsConfig(); BufferedReader reader = null; try { reader = new BufferedReader(new InputStreamReader(new FileInputStream("/etc/resolv.conf"))); String line = null; while ((line = reader.readLine()) != null) { String[] tokens = line.split("[\t| ]+"); if (tokens.length < 2) { resolv.others.add(line); continue; } if (tokens[0].equals("nameserver")) resolv.nameserver.add(InetAddress.getByName(tokens[1])); else if (tokens[0].equals("domain")) resolv.domain = tokens[1]; else if (tokens[0].equals("search")) resolv.search.add(tokens[1]); else if (tokens[0].equals("sortlist")) { String[] addresses = tokens[1].split("/"); Sortlist list = new Sortlist(InetAddress.getByName(addresses[0])); if (addresses.length > 1) list.setNetmask(InetAddress.getByName(addresses[1])); resolv.sortlist.add(list); } else resolv.others.add(line); } } finally { if (reader != null) reader.close(); } return resolv; } public List<InetAddress> getNameserver() { return nameserver; } public void addNameserver(InetAddress nameserver) { addNameserver(this.nameserver.size(), nameserver); } public void addNameserver(int index, InetAddress nameserver) { if (this.nameserver.size() == 3) throw new IndexOutOfBoundsException("Nameserver count limit is up to 3"); this.nameserver.add(index, nameserver); } public void removeNameserver(InetAddress nameserver) { if (this.nameserver.contains(nameserver)) this.nameserver.remove(nameserver); } public void removeAllNameserver() { this.nameserver.clear(); } public String getDomain() { return domain; } public void setDomain(String domain) { this.domain = domain; } public List<String> getSearch() { return search; } public void addSearch(String search) { addSearch(this.search.size(), search); } public void addSearch(int index, String search) { if (search.length() > 256) throw new IllegalArgumentException("Search string length limit is up to 256"); if (this.search.size() == 6) throw new IndexOutOfBoundsException("Search count limit is up to 6"); this.search.add(index, search); } public void removeSearch(String search) { if (this.search.contains(search)) this.search.remove(search); } public void removeAllSearch() { this.search.clear(); } public List<Sortlist> getSortlist() { return sortlist; } public void addSortlist(Sortlist sortlist) { addSortlist(this.sortlist.size(), sortlist); } public void addSortlist(int index, Sortlist sortlist) { this.sortlist.add(index, sortlist); } public void removeSortlist(Sortlist sortlist) { if (this.sortlist.contains(sortlist)) this.sortlist.remove(sortlist); } public void removeAllSortlist() { this.sortlist.clear(); } public void save() { PrintStream pStream = null; try { pStream = new PrintStream("/etc/resolv.conf"); for (InetAddress addr : nameserver) pStream.println("nameserver " + addr.getHostAddress()); if (domain != null) pStream.println("domain " + domain); for (String str : search) pStream.println("search " + str); for (Sortlist list : sortlist) pStream.println(list); for (String str : others) pStream.println(str); } catch (FileNotFoundException e) { } finally { if (pStream != null) pStream.close(); } } public static class Sortlist { private InetAddress address; private InetAddress netmask; public Sortlist(InetAddress address) { this(address, null); } public Sortlist(InetAddress address, InetAddress netmask) { this.address = address; this.netmask = netmask; } public InetAddress getAddress() { return address; } public void setAddress(InetAddress address) { this.address = address; } public InetAddress getNetmask() { return netmask; } public void setNetmask(InetAddress netmask) { this.netmask = netmask; } @Override public String toString() { if (address == null) return ""; if (netmask == null) return address.getHostAddress(); return address.getHostAddress() + "/" + netmask.getHostAddress(); } } }