Changeset cae5dcd for apps


Ignore:
Timestamp:
Dec 17, 2018 11:23:08 AM (18 months ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
3867beb1
Parents:
2a805dd
Message:

Sybil: Refactoring part 6
Make Analysis class a JobImpl?, run on configured frequency
Bug fixes and cleanups

Location:
apps/routerconsole/java/src/net/i2p/router
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • apps/routerconsole/java/src/net/i2p/router/sybil/Analysis.java

    r2a805dd rcae5dcd  
    11package net.i2p.router.sybil;
    22
     3import java.io.IOException;
    34import java.io.Serializable;
    45import java.math.BigInteger;
     
    2223import net.i2p.data.router.RouterInfo;
    2324import net.i2p.data.router.RouterKeyGenerator;
     25import net.i2p.router.JobImpl;
    2426import net.i2p.router.RouterContext;
    2527import net.i2p.router.TunnelPoolSettings;
     
    3436import net.i2p.stat.RateAverages;
    3537import net.i2p.stat.RateStat;
     38import net.i2p.util.Addresses;
     39import net.i2p.util.Log;
    3640import net.i2p.util.ObjectCounter;
    3741
     
    4145 *
    4246 */
    43 public class Analysis implements RouterApp {
     47public class Analysis extends JobImpl implements RouterApp {
    4448
    4549    private final RouterContext _context;
     50    private final Log _log;
    4651    private final ClientAppManager _cmgr;
    4752    private final PersistSybil _persister;
    4853    private volatile ClientAppState _state = UNINITIALIZED;
    4954    private final DecimalFormat fmt = new DecimalFormat("#0.00");
     55    private boolean _wasRun;
     56
    5057    /**
    5158     *  The name we register with the ClientAppManager
     
    8188    /** Get via getInstance() */
    8289    private Analysis(RouterContext ctx, ClientAppManager mgr, String[] args) {
     90        super(ctx);
    8391        _context = ctx;
     92        _log = ctx.logManager().getLog(Analysis.class);
    8493        _cmgr = mgr;
    8594        _persister = new PersistSybil(ctx);
     
    103112    public PersistSybil getPersister() { return _persister; }
    104113
     114    /////// begin Job methods
     115
     116    public void runJob() {
     117        long now = _context.clock().now();
     118        _log.info("Running analysis");
     119        Map<Hash, Points> points = backgroundAnalysis();
     120        if (!points.isEmpty()) {
     121            try {
     122                _log.info("Storing analysis");
     123                _persister.store(now, points);
     124                _log.info("Store complete");
     125            } catch (IOException ioe) {
     126                _log.error("Failed to store analysis", ioe);
     127            }
     128        }
     129        schedule();
     130    }
     131
     132    /////// end Job methods
     133    /////// begin ClientApp methods
     134
    105135    /**
    106136     *  ClientApp interface
     
    144174    }
    145175
    146     public void schedule() {
     176    public synchronized void schedule() {
    147177        long freq = _context.getProperty(PROP_FREQUENCY, 0L);
    148178        if (freq > 0) {
    149179            List<Long> previous = _persister.load();
    150             long now = _context.clock().now();
     180            long now = _context.clock().now() + 15*1000;
     181            if (freq < MIN_FREQUENCY)
     182                freq = MIN_FREQUENCY;
    151183            long when;
    152             if (!previous.isEmpty()) {
    153                 if (freq < MIN_FREQUENCY)
    154                     freq = MIN_FREQUENCY;
     184            if (_wasRun) {
     185                when = now + freq;
     186            } else if (!previous.isEmpty()) {
    155187                when = Math.max(previous.get(0).longValue() + freq, now);
    156188            } else {
     
    159191            long up = _context.router().getUptime();
    160192            when = Math.max(when, now + MIN_UPTIME - up);
    161             // TODO schedule for when
     193            getTiming().setStartAfter(when);
     194            _context.jobQueue().addJob(this);
    162195        }
    163196    }
     
    240273     *  @since 0.9.38
    241274     */
    242     public Map<Hash, Points> backgroundAnalysis() {
     275    public synchronized Map<Hash, Points> backgroundAnalysis() {
     276        _wasRun = true;
     277        Map<Hash, Points> points = new HashMap<Hash, Points>(64);
    243278        Hash us = _context.routerHash();
     279        if (us == null)
     280            return points;
    244281        List<RouterInfo> ris = getFloodfills(us);
     282        if (ris.isEmpty())
     283            return points;
    245284
    246285        double avgMinDist = getAvgMinDist(ris);
    247         Map<Hash, Points> points = new HashMap<Hash, Points>(64);
    248286
    249287        // IP analysis
     
    376414        RouterInfo us = _context.router().getRouterInfo();
    377415        byte[] ourIP = getIP(us);
    378         if (ourIP == null)
    379             return;
     416        if (ourIP == null) {
     417            String last = _context.getProperty("i2np.lastIP");
     418            if (last == null)
     419                return;
     420            ourIP = Addresses.getIP(last);
     421            if (ourIP == null)
     422                return;
     423        }
    380424        for (RouterInfo info : ris) {
    381425            byte[] ip = getIP(info);
     
    386430                    if (ip[3] == ourIP[3]) {
    387431                        addPoints(points, info.getHash(), POINTS_US32, "Same IP as us");
     432                        ri32.add(info);
    388433                    } else {
    389434                        addPoints(points, info.getHash(), POINTS_US24, "Same /24 as us");
     435                        ri24.add(info);
    390436                    }
    391437                } else {
    392438                    addPoints(points, info.getHash(), POINTS_US16, "Same /16 as us");
     439                    ri16.add(info);
    393440                }
    394441            }
     
    417464            Integer ii = e.getKey();
    418465            int count = oc.count(ii);
     466            double point = POINTS32 * (count - 1);
    419467            int i = ii.intValue();
    420468            int i0 = (i >> 24) & 0xff;
     
    422470            int i2 = (i >> 8) & 0xff;
    423471            int i3 = i & 0xff;
     472            String reason = "Same IP with " + (count - 1) + " other" + (( count > 2) ? "s" : "");
    424473            for (RouterInfo info : ris) {
    425474                byte[] ip = getIP(info);
     
    435484                    continue;
    436485                e.getValue().add(info);
    437                 double point = POINTS32 * (count - 1);
    438                 addPoints(points, info.getHash(), point, "Same IP with " + (count - 1) + " other" + (( count > 2) ? "s" : ""));
     486                addPoints(points, info.getHash(), point, reason);
    439487            }
    440488        }
     
    463511            Integer ii = e.getKey();
    464512            int count = oc.count(ii);
     513            double point = POINTS24 * (count - 1);
    465514            int i = ii.intValue();
    466515            int i0 = i >> 16;
    467516            int i1 = (i >> 8) & 0xff;
    468517            int i2 = i & 0xff;
     518            String reason = "Same /24 IP with " + (count - 1) + " other" + (( count > 2) ? "s" : "");
    469519            for (RouterInfo info : ris) {
    470520                byte[] ip = getIP(info);
     
    478528                    continue;
    479529                e.getValue().add(info);
    480                 double point = POINTS24 * (count - 1);
    481                 addPoints(points, info.getHash(), point, "Same /24 IP with " + (count - 1) + " other" + (( count > 2) ? "s" : ""));
     530                addPoints(points, info.getHash(), point, reason);
    482531            }
    483532        }
     
    506555            Integer ii = e.getKey();
    507556            int count = oc.count(ii);
     557            double point = POINTS16 * (count - 1);
    508558            int i = ii.intValue();
    509559            int i0 = i >> 8;
    510560            int i1 = i & 0xff;
     561            String reason = "Same /16 IP with " + (count - 1) + " other" + (( count > 2) ? "s" : "");
    511562            for (RouterInfo info : ris) {
    512563                byte[] ip = getIP(info);
     
    518569                    continue;
    519570                e.getValue().add(info);
    520                 double point = POINTS16 * (count - 1);
    521                 addPoints(points, info.getHash(), point, "Same /16 IP with " + (count - 1) + " other" + (( count > 2) ? "s" : ""));
     571                addPoints(points, info.getHash(), point, reason);
    522572            }
    523573        }
  • apps/routerconsole/java/src/net/i2p/router/sybil/Points.java

    r2a805dd rcae5dcd  
    9393            return null;
    9494        }
    95         Points rv = new Points(d, ss[1]);
    96         for (int i = 2; i < ss.length; i++) {
     95        Points rv = new Points();
     96        for (int i = 1; i < ss.length; i++) {
    9797            rv.reasons.add(ss[i]);
    9898        }
     99        rv.points = d;
    99100        return rv;
    100101    }
  • apps/routerconsole/java/src/net/i2p/router/web/helpers/SybilRenderer.java

    r2a805dd rcae5dcd  
    201201                    ps.store(now, points);
    202202                } catch (IOException ioe) {
    203                     out.write("<b>Failed to store analysis " + ioe + "</b>");
     203                    out.write("<b>Failed to store analysis: " + ioe + "</b>");
    204204                }
    205205            }
     
    393393            List<Hash> warns = new ArrayList<Hash>(points.keySet());
    394394            Collections.sort(warns, new PointsComparator(points));
     395            ReasonComparator rcomp = new ReasonComparator();
    395396            buf.append("<h3 id=\"threats\" class=\"sybils\">Routers with Most Threat Points as of " + new Date(date) + "</h3>");
    396397            for (Hash h : warns) {
     
    405406                List<String> reasons = pp.getReasons();
    406407                if (reasons.size() > 1)
    407                     Collections.sort(reasons, new ReasonComparator());
     408                    Collections.sort(reasons, rcomp);
    408409                for (String s : reasons) {
    409410                    int c = s.indexOf(':');
    410411                    if (c <= 0)
    411412                        continue;
    412                     buf.append("<li><b>").append(s.substring(0, c+1)).append("</b>").append(s.substring(c+1)).append("</li>");
     413                    buf.append("<li><b>").append(s, 0, c+1).append("</b>").append(s, c+1, s.length()).append("</li>");
    413414                }
    414415                buf.append("</ul>");
     
    696697    private double renderRouterInfo(StringBuilder buf, RouterInfo info, Hash us, boolean isUs, boolean full) {
    697698        String hash = info.getIdentity().getHash().toBase64();
    698         buf.append("<a name=\"").append(hash.substring(0, 6)).append("\"></a><table class=\"sybil_routerinfo\"><tr>");
     699        buf.append("<a name=\"").append(hash, 0, 6).append("\"></a><table class=\"sybil_routerinfo\"><tr>");
    699700        double distance = 0;
    700701        if (isUs) {
     
    714715            if (!full) {
    715716                buf.append("<a title=\"View extended router info\" class=\"viewfullentry\" href=\"netdb?r=")
    716                    .append(hash.substring(0, 6)).append("\" >[").append(_t("Full entry")).append("]</a></th><th>");
     717                   .append(hash, 0, 6).append("\" >[").append(_t("Full entry")).append("]</a></th><th>");
    717718            }
    718719            if (_context.portMapper().isRegistered("imagegen"))
Note: See TracChangeset for help on using the changeset viewer.