package com.buglabs.app.bugdash2.controller.system; import java.io.File; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.util.ListIterator; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.buglabs.app.bugdash2.App; import com.buglabs.app.bugdash2.LogManager; import com.buglabs.app.bugdash2.Package; import com.buglabs.app.bugdash2.ShellUtil; import com.buglabs.app.bugdash2.TemplateHelper; import com.buglabs.app.bugdash2.controller.ApplicationController; import com.buglabs.osgi.sewing.pub.util.RequestParameters; import freemarker.template.SimpleHash; import freemarker.template.SimpleList; import freemarker.template.SimpleScalar; import freemarker.template.TemplateModelException; import freemarker.template.TemplateModelRoot; /** * * @author Mike Angerville * * UPDATES: * 2010-08-10 AK moved html snippets to template; modify package install to use Package#install * */ public class DateTimeController extends ApplicationController { private static SimpleDateFormat date_format = new SimpleDateFormat("MM-dd-yyyy HH:mm"); private boolean installed = false; private boolean setTZ = false; public DateTimeController() { } public String getTemplateName() { return "system_display_datetime.fml"; } public TemplateModelRoot get(RequestParameters params, HttpServletRequest req, HttpServletResponse resp) { Calendar calendar = Calendar.getInstance(); SimpleHash root = new SimpleHash(); SimpleList zone_list = new SimpleList(); SimpleScalar output = Package.info("tzdata"); String tzDataInfo = (output != null) ? output.toString().trim() : ""; File zoneinfoDir = new File("/usr/share/zoneinfo"); boolean zoneinfoDirExists = zoneinfoDir.exists(); if( !tzDataInfo.equals("") && tzDataInfo.indexOf("ERROR") == -1 && zoneinfoDirExists) { installed = true; setTZ = true; } else { setTZ = false; installed = false; } if(installed) { String zoneinfoDirectory = "/usr/share/zoneinfo/"; String localtimeLink = ShellUtil.getSimpleScalar("ls -haltr /etc/localtime").toString().trim(); String[] linkParts = localtimeLink.split("-> "); String currentTZdir = ""; if(linkParts.length > 1) { currentTZdir = linkParts[1].replace(zoneinfoDirectory, ""); } String currentTZ = currentTZdir.replace("/", " - "); currentTZ = currentTZ.replace("_", " "); String[] zidItems = zoneinfoDir.list(); Arrays.sort(zidItems); ArrayList timezoneDirs = new ArrayList(); for(int i = 0; i < zidItems.length; i++) { File temp = new File(zoneinfoDirectory + zidItems[i]); if(temp.isDirectory()) { timezoneDirs.add(temp); } } ArrayList timezones = new ArrayList(); ListIterator tzdIterator = timezoneDirs.listIterator(); while(tzdIterator.hasNext()) { File temp = (File) tzdIterator.next(); File[] tempArr = temp.listFiles(); Arrays.sort(tempArr); for(int i = 0; i < tempArr.length; i++) { String timezone = temp.getName() + " - " + tempArr[i].getName(); timezones.add(timezone); } } ListIterator tzIterator = timezones.listIterator(); while(tzIterator.hasNext()) { String timezone = (String) tzIterator.next(); timezone = timezone.replace("_", " "); String[] tzParts = timezone.split("-"); tzParts[0] = tzParts[0].trim(); tzParts[1] = tzParts[1].trim(); tzParts[0] = tzParts[0].replace(" ", "_"); tzParts[1] = tzParts[1].replace(" ", "_"); SimpleHash timezoneHash = new SimpleHash(); if(timezone.equals(currentTZ)) { timezoneHash.put("selected", "selected"); } else timezoneHash.put("selected", ""); timezoneHash.put("value", tzParts[0] + "/" + tzParts[1]); timezoneHash.put("name", timezone); zone_list.add(timezoneHash); } } root.put("ipkg_installed", installed+""); root.put("zone_list", zone_list); root.put("current_datetime", date_format.format(calendar.getTime())); return root; } public TemplateModelRoot post(RequestParameters params, HttpServletRequest req, HttpServletResponse resp) { String user_input = params.get("inp_datetime"); String js_submit_status = "{category: '', message: '', detail: ''}"; SimpleScalar result = new SimpleScalar(); Date new_date; String zoneinfoDirectory = "/usr/share/zoneinfo/"; String ipkg_name = "tzdata"; boolean time_set = false; if(params.get("chb_install_tzdata") != null && !installed && !setTZ) { if (App.checkNetworkConnection()) { result = Package.downloadExtra(); result = Package.update(); result = Package.install(ipkg_name); try { if (result.getAsString().indexOf("error") > -1) { js_submit_status = "{category: 'error', message: 'There was a problem while installing " + ipkg_name + "', detail: '" + TemplateHelper.makeJSFriendly(result.getAsString()) + "'}"; } else { js_submit_status = "{category: 'info', message: 'The package " + ipkg_name + " is installed successfully', detail: '" + TemplateHelper.makeJSFriendly(result.getAsString()) + "'}"; } } catch (TemplateModelException e) { LogManager.logDebug(this.getClass().getName() + ": " + e.getMessage()); } } else { result = new SimpleScalar("No network connection"); js_submit_status = "{category: 'error', message: 'No network connection'}"; } } else if(setTZ && installed) { //possibly check for null/existence first? String timezone = params.get("ddl_timezone"); ShellUtil.getSimpleScalar( "ln -sf " + zoneinfoDirectory + timezone + " /etc/localtime" ); time_set = true; try { new_date = date_format.parse(user_input); SimpleDateFormat system_format = new SimpleDateFormat("MMddHHmmyyyy"); String cmd = "date " + system_format.format(new_date); result = ShellUtil.getSimpleScalar(cmd); js_submit_status = "{category: 'info', message: 'Date and time updated successfully'}"; } catch (ParseException e) { js_submit_status = "{category: 'error', message: 'Please check your date', detail: '" + TemplateHelper.makeJSFriendly(e.getMessage()) + "'}"; LogManager.logWarning(e.getMessage()); } } TemplateModelRoot root = get(params, req, resp); root.put("time_set", new SimpleScalar(time_set+"")); root.put("js_submit_status", new SimpleScalar(js_submit_status)); return root; } }