Some small updates and new Timer class

This commit is contained in:
Ziver Koc 2015-07-15 12:58:59 +00:00
parent 41a5049e04
commit 56a59a959c
4 changed files with 178 additions and 9 deletions

BIN
Zutil.jar

Binary file not shown.

56
src/zutil/Timer.java Normal file
View file

@ -0,0 +1,56 @@
/*
* Copyright (c) 2015 ezivkoc
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package zutil;
/**
* This class is a timer, it will track time and
* timeout after a specific amount of time.
*
* Created by Ziver on 2015-07-15.
*/
public class Timer {
/** The timeout period **/
private long period;
/** The timestamp when the timer was started, -1 if timer has not been started or has been reset **/
private long timestamp;
public Timer(long milisec){
this.period = milisec;
reset();
}
public void start(){
timestamp = System.currentTimeMillis();
}
public void reset(){
timestamp = -1;
}
/**
* @return true if the timer has timed out or has been reset, false if timer is running
*/
public boolean hasTimedOut(){
return timestamp + period < System.currentTimeMillis();
}
}

View file

@ -71,7 +71,7 @@ public class HttpFilePage implements HttpPage{
else { // Resource root is a folder
File file = new File(resource_root,
client_info.getRequestURL());
if(file.getAbsolutePath().startsWith(resource_root.getAbsolutePath())){
if(file.getCanonicalPath().startsWith(resource_root.getCanonicalPath())){
if(file.isDirectory() && showFolders){
File indexFile = new File(file, "index.html");
// Redirect to index.html
@ -90,6 +90,9 @@ public class HttpFilePage implements HttpPage{
}
out.println("</UL><HR></BODY></HTML>");
}
else {
throw new SecurityException("User not allowed to view folder: root=" + resource_root.getAbsolutePath());
}
}
else {
deliverFile(file, out);

View file

@ -22,9 +22,11 @@
package zutil.osal.app.linux;
import zutil.Timer;
import zutil.log.LogUtil;
import zutil.osal.OSAbstractionLayer;
import java.util.HashMap;
import java.util.logging.Logger;
/**
@ -33,21 +35,129 @@ import java.util.logging.Logger;
public class AptGet {
public static final Logger log = LogUtil.getLogger();
private static long updateTimestamp;
private static Timer updateTimer = new Timer(1000*60*5); // 5min timer
private static Timer packageTimer = new Timer(1000*60*5); // 5min timer
private static HashMap<String, Package> packages = new HashMap<>();
public static synchronized void update(){
// Only run every 5 min
if(updateTimer.hasTimedOut()){
OSAbstractionLayer.runCommand("apt-get update");
updateTimer.start();
}
}
public static void install(String pkg) {
update();
OSAbstractionLayer.runCommand("apt-get install " + pkg);
}
public static void update(){
// Only run every 5 min
if(updateTimestamp + 1000*60*5 >System.currentTimeMillis()){
OSAbstractionLayer.runCommand("apt-get update");
}
packageTimer.reset();
}
public static void purge(String pkg) {
OSAbstractionLayer.runCommand("apt-get --purge remove " + pkg);
packageTimer.reset();
}
public static Package getPackage(String pkg){
updatePackages();
return packages.get(pkg);
}
public static synchronized void updatePackages(){
// Only run every 5 min
if(packageTimer.hasTimedOut()){
String[] output = OSAbstractionLayer.runCommand("dpkg --list");
for(int i=5; i<output.length; ++i) {
packages.put(output[i], new Package(output[5]));
}
packageTimer.start();
}
}
/**
* This class represents a system package and its current status
*/
public static class Package{
public enum PackageState{
// Expected States
/* u */ Unknown,
/* i */ Installed,
/* r */ Removed,
/* p */ Purged, // remove including config files
/* h */ Holding,
// Current States
/* n */ NotInstalled,
/* i */ //Installed,
/* c */ ConfigFiles, // only the config files are installed
/* u */ Unpacked,
/* f */ HalfConfigured, // configuration failed for some reason
/* h */ HalfInstalled, // installation failed for some reason
/* w */ TriggersAwaited, // package is waiting for a trigger from another package
/* t */ TriggersPending, //package has been triggered
// Error States
/* r */ ReinstallRequired // package broken, reinstallation required
}
private PackageState expectedState = PackageState.Unknown;
private PackageState currentState = PackageState.Unknown;;
private PackageState errorState = PackageState.Unknown;;
private String name;
private String version;
private String description;
protected Package(String dpkgStr){
switch (dpkgStr.charAt(0)){
case 'u': expectedState = PackageState.Unknown; break;
case 'i': expectedState = PackageState.Installed; break;
case 'r': expectedState = PackageState.Removed; break;
case 'p': expectedState = PackageState.Purged; break;
case 'h': expectedState = PackageState.Holding; break;
}
switch (dpkgStr.charAt(0)){
case 'n': currentState = PackageState.NotInstalled; break;
case 'i': currentState = PackageState.Installed; break;
case 'c': currentState = PackageState.ConfigFiles; break;
case 'u': currentState = PackageState.Unpacked; break;
case 'f': currentState = PackageState.HalfConfigured; break;
case 'h': currentState = PackageState.HalfInstalled; break;
case 'w': currentState = PackageState.TriggersAwaited; break;
case 't': currentState = PackageState.TriggersPending; break;
}
if(dpkgStr.charAt(2) == 'r')
errorState = PackageState.ReinstallRequired;
String[] tmp = dpkgStr.split("[ \\t]*", 4);
name = tmp[1];
version = tmp[2];
description = tmp[3];
}
public PackageState getExpectedState() {
return expectedState;
}
public PackageState getCurrentState() {
return currentState;
}
public PackageState getErrorState() {
return errorState;
}
public String getName() {
return name;
}
public String getVersion() {
return version;
}
public String getDescription() {
return description;
}
}
}