package jfrepo;
/**
*
* Created : Feb 27, 2012
*
* @author pquiring
*/
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;
import java.net.*;
import javax.net.ssl.*;
import javax.swing.*;
import javaforce.*;
import javaforce.linux.*;
public class MainPanel extends javax.swing.JPanel implements MouseListener, MouseMotionListener {
/**
* Creates new form SelectRepo
*/
public MainPanel() {
initComponents();
Linux.detectDistro();
if (Linux.distro == Linux.DistroTypes.Unknown) {
JF.showError("Error", "Unknown distro");
System.exit(0);
}
initMap();
if ((RepoApp.args != null) && (RepoApp.args.length > 1) && (RepoApp.args[0].equals("--update"))) {
updateRepo = true;
}
JFTask localtask = new JFTask() {
public boolean work() {
task = this;
setLabel("Loading Mirrors...");
setProgress(taskCnt);
initMirrors();
setLabel("Loading Repo Lists...");
setProgress(90);
loadRepo();
setLabel("Calculating Coordinates...");
setProgress(95);
calcMapCoords();
loadSelections();
updateDesc();
repaintMap();
setProgress(100);
return true;
}
};
ProgressDialog dialog = new ProgressDialog(null, true, localtask);
dialog.setAutoClose(true);
dialog.setVisible(true);
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
jLabel1 = new javax.swing.JLabel();
protocol = new javax.swing.JComboBox();
choose = new javax.swing.JButton();
map = new javax.swing.JPanel();
selection = new javax.swing.JComboBox();
jLabel1.setText("Protocol");
protocol.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "HTTP", "FTP", "RSYNC" }));
choose.setText("Choose Server");
choose.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
chooseActionPerformed(evt);
}
});
map.setLayout(new java.awt.GridLayout(1, 0));
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(protocol, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(choose))
.addComponent(map, javax.swing.GroupLayout.PREFERRED_SIZE, 480, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(selection, javax.swing.GroupLayout.PREFERRED_SIZE, 480, javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap()
.addComponent(map, javax.swing.GroupLayout.PREFERRED_SIZE, 240, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel1)
.addComponent(protocol, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(choose))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(selection, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
map.getAccessibleContext().setAccessibleName("");
}// </editor-fold>//GEN-END:initComponents
private void chooseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_chooseActionPerformed
applyRepo();
}//GEN-LAST:event_chooseActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton choose;
private javax.swing.JLabel jLabel1;
private javax.swing.JPanel map;
private javax.swing.JComboBox protocol;
private javax.swing.JComboBox selection;
// End of variables declaration//GEN-END:variables
private class Mirror {
double lng, lat;
int x, y; //translated screen coords
String country;
String hostname;
String http, ftp, rsync; //they can differ from each other
String bandwidth; //Kbps, Mbps or Gbps (ya, there are a few Kbps)
String name;
boolean isNew; //append to userList
public String toString() {
return "" + country + ":" + name + ":" + hostname + ":" + bandwidth;
}
}
private JFImage imgorg, img;
private ArrayList<Mirror> mirrors = new ArrayList<Mirror>();
private int selIdx = -1;
private JFTask task;
private int taskCnt = 5;
private boolean updateRepo = false;
private void initMap() {
imgorg = new JFImage();
imgorg.load(getClass().getResourceAsStream("/worldmap.png"));
img = new JFImage();
img.setImageSize(imgorg.getWidth(), imgorg.getHeight());
img.putJFImage(imgorg, 0, 0);
img.addMouseMotionListener(this);
img.addMouseListener(this);
img.setResizeOperation(JFImage.ResizeOperation.CHOP);
map.add(img);
map.revalidate();
}
/** This allows connections to untrusted hosts. */
private void initHttps() {
TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {}
public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {}
}
};
// Let us create the factory where we can set some parameters for the connection
try {
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
SSLSocketFactory sslsocketfactory = (SSLSocketFactory) sc.getSocketFactory(); //this method will work with untrusted certs
} catch (Exception e) {
JFLog.log(e);
}
}
private String getHost(String url) {
//url = http://host/file...
int i1 = url.indexOf("://");
int i2 = url.indexOf("/", i1+3);
if (i2 == -1)
return url.substring(i1+3);
else
return url.substring(i1+3, i2);
}
private int col = -1;
private String country = "none";
private Mirror mirror = null;
private void ubuntu_parseTag(XML.XMLTag tag) {
for(int i=0;i<tag.getChildCount();i++) {
XML.XMLTag child = tag.getChildAt(i);
String name = child.getName(); //th, span, a
if (name.equals("tr")) col = 0;
if (name.equals("th")) col++;
if (child.getChildCount() > 0) {
ubuntu_parseTag(child);
} else {
if (name.equals("th")) {
if (col == 1) {
country = child.content.replaceAll("\n", "").trim();
mirror = null;
}
continue;
}
if (name.equals("a")) {
String url = child.getArg("href");
if (url == null) continue; //should not happen
if (url.startsWith("/ubuntu")) {
mirror = new Mirror();
mirrors.add(mirror);
mirror.isNew = true;
mirror.http = "null";
mirror.ftp = "null";
mirror.rsync = "null";
mirror.country = country;
mirror.name = child.content.replaceAll("\n", "").trim();
continue;
}
if (url.startsWith("http")) {
mirror.http = url;
if (mirror.hostname == null) {
mirror.hostname = getHost(url);
}
continue;
}
if (url.startsWith("ftp")) {
mirror.ftp = url;
if (mirror.hostname == null) {
mirror.hostname = getHost(url);
}
continue;
}
if (url.startsWith("rsync")) {
mirror.rsync = url;
if (mirror.hostname == null) {
mirror.hostname = getHost(url);
}
continue;
}
continue;
}
if (name.equals("td")) {
if (mirror == null) continue; //country bps
if (child.content.endsWith("bps")) {
mirror.bandwidth = child.content.replaceAll("\n", "").trim();
}
continue;
}
}
}
}
//alt fedora ??? : http://mirrors.fedoraproject.org/mirrorlist?repo=fedora-16&arch=i386
int tdcnt = -1;
boolean inTable = false;
private void fedora_parseTag(XML.XMLTag tag) {
for(int i=0;i<tag.getChildCount();i++) {
XML.XMLTag child = tag.getChildAt(i);
String name = child.getName(); //th, span, a
if (name.equals("td") && (!inTable)) {
tdcnt++;
if (tdcnt == 1) {
mirror.country = child.content;
}
if (tdcnt == 3) {
mirror.name = child.content;
int cnt = 2;
for(int a=0;a<mirrors.size()-1;a++) {
if (mirrors.get(a).name.equals(mirror.name)) {
//duplicate name
mirror.name = child.content + "(" + cnt++ + ")";
a = -1;
}
}
}
if (tdcnt == 5) {
mirror.bandwidth = child.content + "Mbps";
}
}
if (child.getChildCount() > 0) {
if (name.equals("table")) inTable = true;
else if (name.equals("tr")) {
String cls = child.getArg("class");
if ((cls != null) && ((cls.equals("even")) || (cls.equals("odd")))) {
tdcnt = 0;
mirror = new Mirror();
mirrors.add(mirror);
mirror.isNew = true;
mirror.http = "null";
mirror.ftp = "null";
mirror.rsync = "null";
}
}
fedora_parseTag(child);
if (name.equals("table")) inTable = false;
} else {
if (name.equals("a")) {
String href = child.getArg("href");
if (href == null) continue;
if (href.startsWith("http")) mirror.http = href;
if (href.startsWith("ftp")) mirror.ftp = href;
if (href.startsWith("rsync")) mirror.rsync = href;
if (mirror.hostname == null) {
mirror.hostname = getHost(href);
}
}
}
}
}
/** Loads mirror global location from geoiptool.com */
private void getLocation(Mirror mirror) {
JFLog.log("getLocation():" + mirror.name + ":" + mirror.hostname);
InputStream is;
BufferedReader rd;
String line;
StringBuffer file;
int i1, i2;
try {
URL url = new URL("http://www.geoiptool.com/en/?IP=" + mirror.hostname);
HttpURLConnection uc = (HttpURLConnection)url.openConnection();
uc.connect();
is = uc.getInputStream();
rd = new BufferedReader(new InputStreamReader(is));
file = new StringBuffer();
while((line = rd.readLine()) != null) {
file.append(line);
file.append("\n");
}
String lns[] = file.toString().split("\n");
boolean lat_y = false, lng_x = false;
for(int a=0;a<lns.length;a++) {
if (lns[a].indexOf("Latitude") != -1) {lat_y = true; continue;}
if (lns[a].indexOf("Longitude") != -1) {lng_x = true; continue;}
if (lat_y) {
i1 = lns[a].indexOf(">");
i2 = lns[a].substring(i1+1).indexOf("<");
mirror.lat = Double.valueOf(lns[a].substring(i1+1, i1+1+i2));
lat_y = false;
}
if (lng_x) {
i1 = lns[a].indexOf(">");
i2 = lns[a].substring(i1+1).indexOf("<");
mirror.lng = Double.valueOf(lns[a].substring(i1+1, i1+1+i2));
lng_x = false;
}
}
task.setProgress(taskCnt++);
} catch (Exception e) {
JFLog.log(e);
}
}
private void initMirrors() {
switch (Linux.distro) {
case Ubuntu: ubuntu_initMirrors(); break;
case Fedora: fedora_initMirrors(); break;
}
}
private void ubuntu_initMirrors() {
InputStream is;
BufferedReader rd;
String line;
StringBuffer file;
int i1,i2;
//load saved system mirrors = /etc/jfrepo-ubuntu.list
ArrayList<Mirror> systemList = new ArrayList<Mirror>();
try {
FileInputStream fis = new FileInputStream("/etc/jfrepo-ubuntu.list");
byte buf[] = JF.readAll(fis);
fis.close();
String lns[] = new String(buf, "UTF-8").split("\n");
for(int i=0;i<lns.length;i++) {
String f[] = lns[i].split("[|]");
if (f.length != 9) {JFLog.log("warning:# fields == " + f.length); continue;}
Mirror mirror = new Mirror();
mirror.country = f[0];
mirror.name = f[1];
mirror.bandwidth = f[2];
mirror.hostname = f[3];
mirror.http = f[4];
mirror.ftp = f[5];
mirror.rsync = f[6];
mirror.lng = Double.valueOf(f[7]);
mirror.lat = Double.valueOf(f[8]);
systemList.add(mirror);
}
} catch (Exception e) {
JFLog.log(e);
}
//load saved personal mirrors = ~/.jfrepo-ubuntu.list
ArrayList<Mirror> userList = new ArrayList<Mirror>();
try {
FileInputStream fis = new FileInputStream(JF.getUserPath() + "/.jfrepo-ubuntu.list");
byte buf[] = JF.readAll(fis);
fis.close();
String lns[] = new String(buf, "UTF-8").split("\n");
for(int i=0;i<lns.length;i++) {
String f[] = lns[i].split("[|]");
if (f.length != 9) {JFLog.log("warning:# fields == " + f.length); continue;}
Mirror mirror = new Mirror();
mirror.country = f[0];
mirror.name = f[1];
mirror.bandwidth = f[2];
mirror.hostname = f[3];
mirror.http = f[4];
mirror.ftp = f[5];
mirror.rsync = f[6];
mirror.lng = Double.valueOf(f[7]);
mirror.lat = Double.valueOf(f[8]);
userList.add(mirror);
}
} catch (Exception e) {
JFLog.log(e);
}
//load URL = https://launchpad.net/ubuntu/+archivemirrors
JFLog.log("Loading mirrors list...");
initHttps();
if (updateRepo) {
try {
URL url = new URL("https://launchpad.net/ubuntu/+archivemirrors");
HttpsURLConnection uc = (HttpsURLConnection)url.openConnection();
uc.connect();
is = uc.getInputStream();
rd = new BufferedReader(new InputStreamReader(is, "UTF-8"));
file = new StringBuffer();
while((line = rd.readLine()) != null) {
file.append(line);
}
//process file
String mirrorsList = file.toString();
i1 = mirrorsList.indexOf("<table");
i2 = mirrorsList.indexOf("</table>");
if ((i1==-1) || (i2==-1)) {JFLog.log("Error:current mirrors:unable to find mirrors table tag"); return;}
mirrorsList = mirrorsList.substring(i1, i2 + 8);
XML xml = new XML();
ByteArrayInputStream buf = new ByteArrayInputStream(mirrorsList.getBytes());
xml.read(buf);
ubuntu_parseTag(xml.root);
} catch (Exception e) {
JFLog.log(e);
}
}
//match those already in systemList/userList
boolean ok = false;
Mirror m;
for(int i=0;i<systemList.size();i++) {
Mirror slm = systemList.get(i);
ok = false;
for(int j=0;j<mirrors.size();j++) {
m = mirrors.get(j);
if ( (m.hostname.equals(slm.hostname)) && (m.name.equals(slm.name))) {
m.lng = slm.lng;
m.lat = slm.lat;
m.isNew = false;
ok = true;
break;
}
}
if (!ok) {
mirrors.add(slm);
}
}
for(int i=0;i<userList.size();i++) {
Mirror ulm = userList.get(i);
for(int j=0;j<mirrors.size();j++) {
m = mirrors.get(j);
if ( (m.hostname.equals(ulm.hostname)) && (m.name.equals(ulm.name))) {
m.lng = ulm.lng;
m.lat = ulm.lat;
m.isNew = false;
ok = true;
break;
}
}
if (!ok) {
mirrors.add(ulm);
}
}
//convert lat/long to x/y for those that are new
for(int j=0;j<mirrors.size();j++) {
m = mirrors.get(j);
if (m.isNew) getLocation(m);
}
//save any new mirrors to ~/.jfrepo-ubuntu.list
try {
FileOutputStream fos = new FileOutputStream(JF.getUserPath() + "/.jfrepo-ubuntu.list", true);
int cnt = 0;
for(int j=0;j<mirrors.size();j++) {
m = mirrors.get(j);
if (!m.isNew) continue;
cnt++;
String ln = m.country + "|" + m.name + "|" + m.bandwidth + "|" + m.hostname
+ "|" + m.http + "|" + m.ftp + "|" + m.rsync + "|" + m.lng + "|" + m.lat + "\n";
fos.write(ln.getBytes());
}
fos.close();
JFLog.log("Wrote " + cnt + " new entries to ~/.jfrepo-ubuntu.list");
} catch (Exception e) {
JFLog.log(e);
}
}
private void fedora_initMirrors() {
InputStream is;
BufferedReader rd;
String line;
StringBuffer file;
int i1,i2;
//load saved system mirrors = /etc/jfrepo-fedora.list
ArrayList<Mirror> systemList = new ArrayList<Mirror>();
try {
FileInputStream fis = new FileInputStream("/etc/jfrepo-fedora.list");
byte buf[] = JF.readAll(fis);
fis.close();
String lns[] = new String(buf, "UTF-8").split("\n");
for(int i=0;i<lns.length;i++) {
String f[] = lns[i].split("[|]");
if (f.length != 9) {JFLog.log("warning:# fields == " + f.length); continue;}
Mirror mirror = new Mirror();
mirror.country = f[0];
mirror.name = f[1];
mirror.bandwidth = f[2];
mirror.hostname = f[3];
mirror.http = f[4];
mirror.ftp = f[5];
mirror.rsync = f[6];
mirror.lng = Double.valueOf(f[7]);
mirror.lat = Double.valueOf(f[8]);
systemList.add(mirror);
}
} catch (Exception e) {
JFLog.log(e);
}
//load saved personal mirrors = ~/.jfrepo.list
ArrayList<Mirror> userList = new ArrayList<Mirror>();
try {
FileInputStream fis = new FileInputStream(JF.getUserPath() + "/.jfrepo-fedora.list");
byte buf[] = JF.readAll(fis);
fis.close();
String lns[] = new String(buf, "UTF-8").split("\n");
for(int i=0;i<lns.length;i++) {
String f[] = lns[i].split("[|]");
if (f.length != 9) {JFLog.log("warning:# fields == " + f.length); continue;}
Mirror mirror = new Mirror();
mirror.country = f[0];
mirror.name = f[1];
mirror.bandwidth = f[2];
mirror.hostname = f[3];
mirror.http = f[4];
mirror.ftp = f[5];
mirror.rsync = f[6];
mirror.lng = Double.valueOf(f[7]);
mirror.lat = Double.valueOf(f[8]);
userList.add(mirror);
}
} catch (Exception e) {
JFLog.log(e);
}
//load URL = http://mirrors.fedoraproject.org/publiclist/Fedora/
JFLog.log("Loading mirrors list...");
initHttps();
if (updateRepo) {
try {
URL url = new URL("http://mirrors.fedoraproject.org/publiclist/Fedora/");
HttpURLConnection uc = (HttpURLConnection)url.openConnection();
uc.connect();
is = uc.getInputStream();
rd = new BufferedReader(new InputStreamReader(is, "UTF-8"));
file = new StringBuffer();
while((line = rd.readLine()) != null) {
file.append(line);
}
//process file
String mirrorsList = file.toString();
i1 = mirrorsList.indexOf("<table");
if (i1==-1) {JFLog.log("Error:current mirrors:unable to find mirrors table tag"); return;}
i1 = mirrorsList.indexOf("<table", i1+1); //2nd <table ...> tag
i2 = mirrorsList.lastIndexOf("</table>");
if ((i1==-1) || (i2==-1)) {JFLog.log("Error:current mirrors:unable to find mirrors table tag"); return;}
mirrorsList = mirrorsList.substring(i1, i2 + 8);
XML xml = new XML();
ByteArrayInputStream buf = new ByteArrayInputStream(mirrorsList.getBytes());
xml.read(buf);
fedora_parseTag(xml.root);
} catch (Exception e) {
JFLog.log(e);
}
}
//match those already in systemList/userList
boolean ok = false;
Mirror m;
for(int i=0;i<systemList.size();i++) {
Mirror slm = systemList.get(i);
ok = false;
for(int j=0;j<mirrors.size();j++) {
m = mirrors.get(j);
if ( (m.hostname.equals(slm.hostname)) && (m.name.equals(slm.name))) {
m.lng = slm.lng;
m.lat = slm.lat;
m.isNew = false;
ok = true;
break;
}
}
if (!ok) {
mirrors.add(slm);
}
}
for(int i=0;i<userList.size();i++) {
Mirror ulm = userList.get(i);
for(int j=0;j<mirrors.size();j++) {
m = mirrors.get(j);
if ( (m.hostname.equals(ulm.hostname)) && (m.name.equals(ulm.name))) {
m.lng = ulm.lng;
m.lat = ulm.lat;
m.isNew = false;
ok = true;
break;
}
}
if (!ok) {
mirrors.add(ulm);
}
}
//get lat/long for those that are new
for(int j=0;j<mirrors.size();j++) {
m = mirrors.get(j);
if (m.isNew) getLocation(m);
}
//save any new mirrors to ~/.jfrepo.list
try {
FileOutputStream fos = new FileOutputStream(JF.getUserPath() + "/.jfrepo-fedora.list", true);
int cnt = 0;
for(int j=0;j<mirrors.size();j++) {
m = mirrors.get(j);
if (!m.isNew) continue;
cnt++;
String ln = m.country + "|" + m.name + "|" + m.bandwidth + "|" + m.hostname
+ "|" + m.http + "|" + m.ftp + "|" + m.rsync + "|" + m.lng + "|" + m.lat + "\n";
fos.write(ln.getBytes());
}
fos.close();
JFLog.log("Wrote " + cnt + " new entries to ~/.jfrepo-fedora.list");
} catch (Exception e) {
JFLog.log(e);
}
}
//see http://en.wikipedia.org/wiki/Miller_cylindrical_projection
//image and equations taken from Ubuntu ubiquity
private int lngToX(double lng) {
double width = img.getWidth();
double x = (lng * (Math.PI / 180.0)) + Math.PI;
x = x / (2.0 * Math.PI);
x = x * width;
return (int)x;
}
private int latToY(double lat) {
double height = img.getHeight();
double y = 1.25 * Math.log(Math.tan(
(0.25 * Math.PI) + (0.4 * (lat * (Math.PI / 180.0)))));
//100 % = 4.6068250867599998
y /= 2.30341254338;
y *= 1.3; //scale adjust
y = y * -height/2.0 + height/2.0;
return (int)y;
}
private void calcMapCoords() {
for(int a=0;a<mirrors.size();a++) {
Mirror m = mirrors.get(a);
m.x = lngToX(m.lng);
m.y = latToY(m.lat);
}
}
private void repaintMap() {
img.putJFImage(imgorg, 0, 0);
Graphics2D g = img.getGraphics2D();
for(int a=0;a<mirrors.size();a++) {
Mirror m = mirrors.get(a);
if (a == selIdx)
g.setColor(new Color(0x00ff00)); //green dot (selected)
else
g.setColor(new Color(0xff0000)); //red dot (not selected)
int rad = 4; //TODO : change size based on bandwidth
g.fillOval(m.x-rad/2, m.y-rad/2, rad, rad);
}
img.repaint();
}
private void updateDesc() {
if (selIdx == -1) return;
selection.setSelectedIndex(selIdx);
}
public void loadRepo() {
switch (Linux.distro) {
case Ubuntu: _loadRepo("/etc/apt/sources.list"); break;
case Fedora: _loadRepo("/etc/yum.repo.d/fedora.repo"); break;
}
}
public void _loadRepo(String file) {
try {
FileInputStream fis = new FileInputStream(file);
String apt = new String(JF.readAll(fis));
fis.close();
String lns[] = apt.split("\n");
if (lns[0].startsWith("#$jfrepo$")) {
int idx;
String f[] = lns[0].split(":");
String hostname = null, name = null;
for(int a=0;a<f.length;a++) {
if (f[a].startsWith("hostname=")) {
idx = f[a].indexOf("=");
hostname = f[a].substring(idx + 1);
}
if (f[a].startsWith("name=")) {
idx = f[a].indexOf("=");
name = f[a].substring(idx + 1);
}
}
if ((hostname == null)||(name == null)) return;
for(int b=0;b<mirrors.size();b++) {
Mirror m = mirrors.get(b);
if ((m.hostname.equals(hostname)) && (m.name.equals(name))) {
selIdx = b;
break;
}
}
}
} catch (Exception e) {
JFLog.log(e);
}
}
private void applyRepo() {
switch (Linux.distro) {
case Ubuntu: ubuntu_applyRepo(); break;
case Fedora: fedora_applyRepo(); break;
}
}
private void ubuntu_applyRepo() {
if (selIdx == -1) {
JF.showError("Error", "Please select a site first");
return;
}
try {
FileInputStream fis = new FileInputStream("/etc/lsb-release");
String lsb = new String(JF.readAll(fis));
fis.close();
String lns[] = lsb.split("\n");
String codename = null;
for(int a=0;a<lns.length;a++) {
if (lns[a].startsWith("DISTRIB_CODENAME")) {
int idx = lns[a].indexOf("=");
codename = lns[a].substring(idx+1);
break;
}
}
if (codename == null) throw new Exception("/etc/lsb-release corrupt : unable to read DISTRIB_CODENAME");
InputStream is = getClass().getResourceAsStream("/sources.list");
String list = new String(JF.readAll(is));
is.close();
list = list.replaceAll("[$]DISTRIB_CODENAME[$]", codename);
String selURL = null;
Mirror m = mirrors.get(selIdx);
switch (protocol.getSelectedIndex()) {
case 0: selURL = m.http; break;
case 1: selURL = m.ftp; break;
case 2: selURL = m.rsync; break;
}
list = list.replaceAll("[$]HOSTNAME[$]", m.hostname);
list = list.replaceAll("[$]NAME[$]", m.name);
if ((selURL == null) || (selURL.equals("null"))) throw new Exception("internal error"); //shouldn't happen
list = list.replaceAll("[$]URL[$]", selURL);
File tmpFile = File.createTempFile("ubuntu", ".repo");
FileOutputStream fos = new FileOutputStream(tmpFile);
fos.write(list.getBytes());
fos.close();
if (!Linux.copyFile(tmpFile.getAbsolutePath(), "/etc/apt/sources.list")) {
JF.showError("Error", "Failed to apply repo");
return;
}
tmpFile.delete();
System.exit(0);
} catch (Exception e) {
JFLog.log(e);
}
}
private void fedora_applyRepo() {
if (selIdx == -1) {
JF.showError("Error", "Please select a site first");
return;
}
try {
InputStream is = getClass().getResourceAsStream("/fedora.repo");
String list = new String(JF.readAll(is));
is.close();
String selURL = null;
Mirror m = mirrors.get(selIdx);
switch (protocol.getSelectedIndex()) {
case 0: selURL = m.http; break;
case 1: selURL = m.ftp; break;
case 2: selURL = m.rsync; break;
}
if ((selURL == null) || (selURL.equals("null"))) throw new Exception("internal error"); //shouldn't happen
list = list.replaceAll("[$]URL[$]", selURL);
list = list.replaceAll("[$]HOSTNAME[$]", m.hostname);
list = list.replaceAll("[$]NAME[$]", m.name);
File tmpFile1 = File.createTempFile("fedora", ".repo");
FileOutputStream fos = new FileOutputStream(tmpFile1);
fos.write(list.getBytes());
fos.close();
is = getClass().getResourceAsStream("/fedora-updates.repo");
list = new String(JF.readAll(is));
is.close();
list = list.replaceAll("[$]URL[$]", selURL);
File tmpFile2 = File.createTempFile("fedora-updates", ".repo");
fos = new FileOutputStream(tmpFile2);
fos.write(list.getBytes());
fos.close();
is = getClass().getResourceAsStream("/fedora-updates-testing.repo");
list = new String(JF.readAll(is));
is.close();
list = list.replaceAll("[$]URL[$]", selURL);
File tmpFile3 = File.createTempFile("fedora-updates-testing", ".repo");
fos = new FileOutputStream(tmpFile3);
fos.write(list.getBytes());
fos.close();
boolean ok = true;
if (!Linux.runScript(new String[] {
"cp " + tmpFile1.getAbsolutePath() + " /etc/yum.repo.d/fedora.repo",
"cp " + tmpFile2.getAbsolutePath() + " /etc/yum.repo.d/fedora-updates.repo",
"cp " + tmpFile3.getAbsolutePath() + " /etc/yum.repo.d/fedora-updates-testing.repo"
})) {
JF.showError("Error", "Failed to apply repo");
ok = false;
}
tmpFile1.delete();
tmpFile2.delete();
tmpFile3.delete();
if (!ok) return;
System.exit(0);
} catch (Exception e) {
JFLog.log(e);
}
}
private void loadSelections() {
int cnt = mirrors.size();
for(int a=0;a<cnt;a++) {
Mirror m = mirrors.get(a);
selection.addItem(m);
}
}
public void mouseClicked(MouseEvent e) {
//find closest to point
int x = e.getX();
int y = e.getY();
int bd = 0xffffff;
int bi = -1;
Mirror m;
for(int a=0;a<mirrors.size();a++) {
m = mirrors.get(a);
int d = (int)Math.sqrt(Math.pow(m.x - x, 2) + Math.pow(m.y - y, 2));
if (d < bd) {
bi = a;
bd = d;
}
}
if (bi == -1) return;
selIdx = bi;
m = mirrors.get(selIdx);
updateDesc();
repaintMap();
protocol.removeAllItems();
if (!m.http.equals("null")) protocol.addItem("HTTP");
if (!m.ftp.equals("null")) protocol.addItem("FTP");
if (!m.rsync.equals("null")) protocol.addItem("RSYNC");
}
public void mouseEntered(MouseEvent e) { }
public void mouseExited(MouseEvent e) { }
public void mousePressed(MouseEvent e) { }
public void mouseReleased(MouseEvent e) { }
public void mouseDragged(MouseEvent e) { }
public void mouseMoved(MouseEvent e) { }
}