/* * $Id$ * * Copyright (C) 2003-2015 JNode.org * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; If not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ package org.jnode.fs.smbfs; import java.net.MalformedURLException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.GregorianCalendar; import jcifs.smb.NtlmAuthenticator; import jcifs.smb.NtlmPasswordAuthentication; import jcifs.smb.SmbException; import jcifs.smb.SmbFile; public class SmbShell extends NtlmAuthenticator { protected NtlmPasswordAuthentication getNtlmPasswordAuthentication() { System.out.println(getRequestingException().getMessage() + " for " + getRequestingURL()); System.out.print("username: "); try { int i; String username = readLine(); String domain = null, password; if ((i = username.indexOf('\\')) != -1) { domain = username.substring(0, i); username = username.substring(i + 1); } System.out.print("password: "); password = readLine(); if (password.length() == 0) { return null; } return new NtlmPasswordAuthentication(domain, username, password); } catch (Exception e) { //empty } return null; } public static String readLine() throws Exception { int c; StringBuffer sb = new StringBuffer(); while ((c = System.in.read()) != '\n') { if (c == -1) return ""; sb.append((char) c); } return sb.toString().trim(); } String start; public SmbShell(String start) { this.start = start; NtlmAuthenticator.setDefault(this); } void run() throws Exception { String cmd, prompt; SmbFile conn, tmp; SimpleDateFormat sdf1 = new SimpleDateFormat("EEE MMM"); SimpleDateFormat sdf2 = new SimpleDateFormat("d"); SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy h:mm a"); sdf1.setCalendar(new GregorianCalendar()); sdf2.setCalendar(new GregorianCalendar()); sdf3.setCalendar(new GregorianCalendar()); conn = new SmbFile(start); while (true) { try { if (conn.exists()) { prompt = conn.getName() + "> "; } else { System.out.println("error reading " + conn); conn = new SmbFile("smb://"); continue; } System.out.print(prompt); cmd = readLine(); if (cmd.equals("")) { //empty } else if (cmd.startsWith("cd")) { int i = cmd.indexOf(' '); String dir; if (i == -1 || (dir = cmd.substring(i).trim()).length() == 0) { conn = new SmbFile("smb://"); continue; } tmp = new SmbFile(conn, dir); if (tmp.exists()) { if (tmp.isDirectory()) { conn = tmp; } else { System.out.println(dir + " is not a directory"); } } else { System.out.println("no such directory"); } } else if (cmd.startsWith("ls")) { int i = cmd.indexOf(' '); SmbFile d = conn; String dir, wildcard = "*"; if (i != -1 && (dir = cmd.substring(i).trim()).length() != 0) { // there's an argument which could be a directory, // a wildcard, or a directory with a wildcard appended int s = dir.lastIndexOf('/'); int a = dir.lastIndexOf('*'); int q = dir.lastIndexOf('?'); if ((a != -1 && a > s) || (q != -1 && q > s)) { // it's a wildcard if (s == -1) { wildcard = dir; d = conn; } else { wildcard = dir.substring(s + 1); d = new SmbFile(conn, dir.substring(0, s)); } } else { d = new SmbFile(conn, dir); } } long t0 = System.currentTimeMillis(); SmbFile[] list = d.listFiles(wildcard); t0 = System.currentTimeMillis() - t0; if (list != null) { for (int j = 0; j < list.length; j++) { StringBuffer sb = new StringBuffer(); Date date = new Date(list[j].lastModified()); Format.print(System.out, "%-40s", list[j].getName()); sb.append(list[j].isDirectory() ? 'd' : '-'); sb.append(list[j].canRead() ? 'r' : '-'); sb.append(list[j].canWrite() ? 'w' : '-'); sb.append(list[j].isHidden() ? 'h' : '-'); sb.append(list[j].getType() == SmbFile.TYPE_WORKGROUP ? 'g' : '-'); Format.print(System.out, "%-6s", sb.toString()); Format.print(System.out, "%10d ", list[j].length()); System.out.print(sdf1.format(date)); Format.print(System.out, "%3s ", sdf2.format(date)); System.out.print(sdf3.format(date)); System.out.println(); } System.out.println(list.length + " items in " + t0 + "ms"); } else { System.out.println("no such file or directory"); } } else if (cmd.startsWith("pwd")) { System.out.println(conn.getCanonicalPath()); } else if (cmd.startsWith("q") || cmd.startsWith("x") || cmd.startsWith("ex") || cmd.startsWith("by")) { break; } else { System.out.println("commands:"); System.out.println(" ls [dir|file]"); System.out.println(" cd dir"); System.out.println(" pwd"); System.out.println(" quit"); } } catch (MalformedURLException mue) { mue.printStackTrace(); conn = null; } catch (SmbException se) { se.printStackTrace(); } catch (Exception e) { e.printStackTrace(); System.exit(1); } } System.exit(0); } public static void main(String[] argv) throws Exception { SmbShell smbsh = new SmbShell(argv.length > 0 ? argv[0] : "smb://"); smbsh.run(); } }