home *** CD-ROM | disk | FTP | other *** search
Java Source | 1996-05-23 | 23.4 KB | 960 lines |
- // AdminComponent.java
- // A JFS application for performing various admin tasks on a JFS server.
- // For example - adding/deleting/changing users
- // - adding/deleting/changing printers
- // - monitoring connections
- // - getting/setting server properties
- import java.awt.*;
- import java.util.Vector;
- import java.util.Date;
- import java.util.StringTokenizer;
- import java.io.IOException;
-
- public class AdminComponent extends JFScomponent
- {
- UsersPanel up;
- PrintersPanel pp;
- ConnectionsPanel cp;
- PropertiesPanel rp;
- DevicesPanel dp;
-
- // init
- // Setup this component
- void init(java.applet.Applet ap)
- {
- // create user interface
- setLayout(new BorderLayout());
- TabbedPanel t = new TabbedPanel();
- t.addItem("Users",up = new UsersPanel());
- t.addItem("Printers",pp = new PrintersPanel());
- t.addItem("Connections",cp = new ConnectionsPanel());
- t.addItem("Properties",rp = new PropertiesPanel());
- t.addItem("Devices",dp = new DevicesPanel());
- add("Center",t);
- }
-
- // connect
- // Use this client for talking to the server
- void connect(JFSclient c)
- {
- super.connect(c);
- if (!client.authname.equals("root")) {
- new ErrorWindow("Only root can run the AdminComponent tool");
- client = null;
- return;
- }
- up.connect(client);
- pp.connect(client);
- cp.connect(client);
- rp.connect(client);
- dp.connect(client);
- }
-
- Dimension wantedsize()
- {
- return new Dimension(500,300);
- }
- }
-
-
- // UsersPanel
- // A panel displaying a list of all server users for addition, deletion and
- // modification.
- class UsersPanel extends Panel
- {
- JFSclient client;
- Vector users = new Vector();
- DoubleListPanel list;
- Button add,del,mod;
-
- UsersPanel()
- {
- setLayout(new BorderLayout());
- add("Center",list = new DoubleListPanel("Username","Real name"));
- Panel top = new Panel();
- top.setLayout(new FlowLayout(FlowLayout.LEFT));
- top.add(add = new Button("Add"));
- top.add(del = new Button("Delete"));
- top.add(mod = new Button("Modify"));
- add("North",top);
- }
-
- // connect
- // Retrieve a list of users from the server
- void connect(JFSclient c)
- {
- // Build list of JFSuser structures
- client = c;
- BufferInputStream buf = null;
- try buf = new BufferInputStream(client.get("/etc/users",0));
- catch(RequestException e) {
- new ErrorWindow("Could not read /etc/users : "+e.getMessage());
- return;
- }
- try {
- while(true)
- users.addElement(new JFSuser(buf.gets()));
- }
- catch(IOException e);
- fill();
- }
-
- // fill
- // Fill the list with known users
- void fill()
- {
- // Display the list
- list.clear();
- for(int i=0; i<users.size(); i++) {
- JFSuser u = (JFSuser)users.elementAt(i);
- list.addItem(u.name, u.realname);
- }
- }
-
- // write
- // Write the list of users back to /etc/users
- void write()
- {
- BufferOutputStream buf = new BufferOutputStream();
- for(int i=0; i<users.size(); i++)
- buf.puts(((JFSuser)users.elementAt(i)).output());
- try client.put("/etc/users", 0, buf.getarray(), "text/plain");
- catch(RequestException e)
- new ErrorWindow("Failed to write to /etc/users : "+
- e.getMessage());
- }
-
- public boolean action(Event evt, Object obj)
- {
- int sel = list.selected();
- if (evt.target == add) {
- // Add button clicked. Open new user details requestor.
- new UserEditRequestor(this);
- }
- else if (evt.target == del) {
- // Delete button clicked. Remove this user
- if (sel < 0) return false;
- users.removeElementAt(sel);
- fill();
- write();
- }
- else if (evt.target == mod ||
- evt.target == list && ((String)evt.arg).equals("Double")) {
- // Modify button clicked. Open requestor to edit user
- if (sel < 0) return false;
- new UserEditRequestor(this, sel);
- }
- return true;
- }
- }
-
- // UserEditRequestor
- // A window for editing or adding a user
- class UserEditRequestor extends FixedFrame
- {
- UsersPanel parent;
- int sel = -1;
- TextField name, real, password, homedir, groups;
- Checkbox homeyes, homeno;
- Button ok,cancel;
-
- // Create a requestor for adding a new user
- UserEditRequestor(UsersPanel p)
- {
- super(new Dimension(300, -1));
- parent = p;
- // create user interface
- setLayout(new BorderLayout());
- Panel top = new Panel();
- top.setLayout(new BorderLayout());
- Panel left = new Panel();
- left.setLayout(new GridLayout(6,1));
- left.add(new Label("Username"));
- left.add(new Label("Real name"));
- left.add(new Label("Password"));
- left.add(new Label("Groups"));
- left.add(new Label("Home dir"));
- left.add(new Label("Create home dir"));
- top.add("West",left);
- Panel right = new Panel();
- right.setLayout(new GridLayout(6,1));
- right.add(name = new TextField());
- right.add(real = new TextField());
- right.add(password = new TextField());
- right.add(groups = new TextField());
- right.add(homedir = new TextField());
- Panel hp = new Panel();
- hp.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 0));
- CheckboxGroup hg = new CheckboxGroup();
- hp.add(homeyes = new Checkbox("Yes", hg, true));
- hp.add(homeno = new Checkbox("No", hg, false));
- right.add(hp);
- top.add("Center",right);
- add("North",top);
- Panel bot = new Panel();
- bot.setLayout(new FlowLayout(FlowLayout.RIGHT));
- bot.add(ok = new Button("Ok"));
- bot.add(cancel = new Button("Cancel"));
- add("South",bot);
- setTitle("User details");
- pack();
- show();
- }
-
- // Create a requestor for editing an existing user
- UserEditRequestor(UsersPanel p, int s)
- {
- this(p);
- sel = s;
- JFSuser u = (JFSuser)parent.users.elementAt(sel);
- name.setText(u.name);
- name.setEditable(false);
- real.setText(u.realname);
- password.setText(u.password);
- homedir.setText(u.home);
- String g = "";
- for(int i=0; i<u.groups.size(); i++) {
- g += (String)u.groups.elementAt(i);
- if (i != u.groups.size()-1)
- g += ",";
- }
- groups.setText(g);
- }
-
- public boolean handleEvent(Event evt)
- {
- if (evt.id == Event.WINDOW_DESTROY ||
- evt.id == Event.ACTION_EVENT && evt.target == cancel)
- dispose();
- else if (evt.id == Event.ACTION_EVENT && evt.target == ok) {
- // Add or update this user
-
- // Build a new user structure
- JFSuser nu = new JFSuser();
- nu.name = name.getText();
- if (nu.name.trim().length() == 0) {
- new ErrorWindow("Empty username");
- return true;
- }
- nu.realname = real.getText();
- nu.password = password.getText();
- nu.home = homedir.getText();
- StringSplitter tok = new StringSplitter(groups.getText(),',');
- String gr;
- while((gr = tok.nextToken()) != null) {
- // Check and add each group name
- if (gr.trim().length() == 0)
- continue; // useless string
- for(int i=0; i<parent.users.size(); i++) {
- JFSuser eu = (JFSuser)parent.users.elementAt(i);
- if (eu.name.equals(gr)) {
- // oh no! a user with this group name
- // already exists.
- new ErrorWindow("The group name "+gr+
- " cannot be used, as "+
- "it belongs to a user");
- return true;
- }
- }
- nu.groups.addElement(gr);
- }
-
- // Try to find a user with this name
- JFSuser existing = null;
- for(int i=0; i<parent.users.size(); i++) {
- JFSuser eu = (JFSuser)parent.users.elementAt(i);
- if (eu.name.equals(nu.name))
- existing = eu;
- }
-
- if (sel < 0) {
- // Create a new user
- if (existing != null) {
- new ErrorWindow("A user with the name "+
- nu.name+" already exists");
- return true;
- }
- }
- else {
- // modify an existing one
- parent.users.removeElement(existing);
- }
- parent.users.addElement(nu);
- parent.fill();
- parent.write();
-
- // Create home directory if needed
- if (homeyes.getState()) {
- boolean made = true;
- try parent.client.mkdir(homedir.getText());
- catch(RequestException e)
- made = false;
- if (made) {
- // chmod home dir
- try parent.client.chmod(homedir.getText(),
- name.getText(), "rwp");
- catch(RequestException e);
- }
- }
-
- dispose();
- }
- return super.handleEvent(evt);
- }
- }
-
-
- // PrintersPanel
- // Displays a list of all printers from /etc/printers, for addition,
- // modification and deletion
- class PrintersPanel extends Panel
- {
- JFSclient client;
- Vector name = new Vector(), type = new Vector(),
- desc = new Vector(), comm = new Vector();
- DoubleListPanel list;
- Button add,del,mod;
-
- PrintersPanel()
- {
- setLayout(new BorderLayout());
- add("Center",list = new DoubleListPanel("Name","Description"));
- Panel top = new Panel();
- top.setLayout(new FlowLayout(FlowLayout.LEFT));
- top.add(add = new Button("Add"));
- top.add(del = new Button("Delete"));
- top.add(mod = new Button("Modify"));
- add("North",top);
- }
-
- // connect
- // Read and display a list of printers from the server
- void connect(JFSclient c)
- {
- client = c;
- try client.getprinters(name, type, desc, comm);
- catch(RequestException e) {
- new ErrorWindow("Could not read /etc/printers : "+
- e.getMessage());
- return;
- }
- fill();
- }
-
- // fill
- // Fill the list with known printers
- void fill()
- {
- list.clear();
- for(int i=0; i<name.size(); i++)
- list.addItem((String)name.elementAt(i),
- (String)desc.elementAt(i));
- }
-
- // write
- // Output the list of printers to /etc/printers
- void write()
- {
- BufferOutputStream buf = new BufferOutputStream();
- for(int i=0; i<name.size(); i++) {
- StringJoiner j = new StringJoiner(':');
- j.add((String)name.elementAt(i));
- j.add((String)type.elementAt(i));
- j.add((String)desc.elementAt(i));
- j.add((String)comm.elementAt(i));
- buf.puts(j.toString());
- }
- try client.put("/etc/printers", 0, buf.getarray(), "text/plain");
- catch(RequestException e)
- new ErrorWindow("Failed to write to /etc/printer : "+
- e.getMessage());
- }
-
- public boolean action(Event evt, Object obj)
- {
- int sel = list.selected();
- if (evt.target == add) {
- // Add printer button clicked. Open new printer details req.
- new PrinterEditRequestor(this);
- }
- else if (evt.target == del) {
- // Delete button clicked. Remove selected printer
- if (sel < 0) return false;
- name.removeElementAt(sel);
- type.removeElementAt(sel);
- desc.removeElementAt(sel);
- comm.removeElementAt(sel);
- fill();
- write();
- }
- else if (evt.target == mod ||
- evt.target == list && ((String)evt.arg).equals("Double")) {
- // Modify button clicked. Open requestor to edit printer
- if (sel < 0) return false;
- new PrinterEditRequestor(this, sel);
- }
- return true;
- }
- }
-
- // PrinterEditRequestor
- // A pop-up window for entering details of a new or existing printer
- class PrinterEditRequestor extends FixedFrame
- {
- PrintersPanel parent;
- int sel = -1;
- TextField name, type, desc, comm;
- Button ok, cancel;
-
- // Create a requestor for adding a new printer
- PrinterEditRequestor(PrintersPanel p)
- {
- super(new Dimension(300, -1));
- parent = p;
- // create UI
- setLayout(new BorderLayout());
- Panel top = new Panel();
- top.setLayout(new BorderLayout());
- Panel left = new Panel();
- left.setLayout(new GridLayout(4,1));
- left.add(new Label("Name"));
- left.add(new Label("Type"));
- left.add(new Label("Description"));
- left.add(new Label("Command"));
- top.add("West",left);
- Panel right = new Panel();
- right.setLayout(new GridLayout(4,1));
- right.add(name = new TextField());
- right.add(type = new TextField());
- right.add(desc = new TextField());
- right.add(comm = new TextField());
- top.add("Center",right);
- add("North",top);
- Panel bot = new Panel();
- bot.setLayout(new FlowLayout(FlowLayout.RIGHT));
- bot.add(ok = new Button("Ok"));
- bot.add(cancel = new Button("Cancel"));
- add("South",bot);
- setTitle("Printer details");
- pack();
- show();
- }
-
- PrinterEditRequestor(PrintersPanel p, int s)
- {
- this(p);
- sel = s;
- name.setText((String)parent.name.elementAt(sel));
- name.setEditable(false);
- type.setText((String)parent.type.elementAt(sel));
- desc.setText((String)parent.desc.elementAt(sel));
- comm.setText((String)parent.comm.elementAt(sel));
- }
-
- public boolean handleEvent(Event evt)
- {
- if (evt.id == Event.WINDOW_DESTROY ||
- evt.id == Event.ACTION_EVENT && evt.target == cancel)
- dispose();
- else if (evt.id == Event.ACTION_EVENT && evt.target == ok) {
- // Add or update this printer
-
- // Try to find a printer with this name
- int old = -1;
- for(int i=0; i<parent.name.size(); i++) {
- String oldname = (String)parent.name.elementAt(i);
- if (oldname.equals(name.getText()))
- old = i;
- }
-
- if (sel < 0) {
- // Is this a unique name?
- if (old != -1) {
- new ErrorWindow("A printer with the name "+
- name.getText()+" exists");
- return true;
- }
- }
- else {
- // Remove old printer
- parent.name.removeElementAt(old);
- parent.type.removeElementAt(old);
- parent.desc.removeElementAt(old);
- parent.comm.removeElementAt(old);
- }
- parent.name.addElement(name.getText());
- parent.type.addElement(type.getText());
- parent.desc.addElement(desc.getText());
- parent.comm.addElement(comm.getText());
- parent.fill();
- parent.write();
- dispose();
- }
- return super.handleEvent(evt);
- }
- }
-
-
- // ConnectionsPanel
- // Displays the list of current connections to the server
- class ConnectionsPanel extends Panel
- {
- JFSclient client;
- DoubleListPanel clist;
- Button cref, cinfo, ckill;
-
- Vector id, host, name, last, sent, recv;
-
- ConnectionsPanel()
- {
- // Create user interface
- setLayout(new BorderLayout());
- add("Center",clist = new DoubleListPanel("Host","User"));
- Panel top = new Panel();
- top.setLayout(new FlowLayout(FlowLayout.LEFT));
- top.add(cref = new Button("Refresh"));
- top.add(cinfo = new Button("Info"));
- top.add(ckill = new Button("Kill"));
- add("North",top);
-
- }
-
- // connect
- // Read and display connections
- void connect(JFSclient c)
- {
- client = c;
- cread();
- cfill();
- }
-
- // cread
- // Get the list of active connections from the server
- void cread()
- {
- BufferInputStream buf = null;
- Message head = new Message();
- head.add("Command","Netstat");
- try buf = new BufferInputStream(
- client.devget("/dev/Server", head).getdata());
- catch(RequestException e) {
- new ErrorWindow("Could not read /dev/Server : "+
- e.getMessage());
- return;
- }
- id = new Vector(); host = new Vector(); name = new Vector();
- last = new Vector(); sent = new Vector(); recv = new Vector();
- try {
- while(true) {
- String line = buf.gets();
- StringSplitter tok = new StringSplitter(line, ':');
- id.addElement(new Integer(tok.nextToken()));
- host.addElement(tok.nextToken());
- name.addElement(tok.nextToken());
- last.addElement(new Long(tok.nextToken()));
- sent.addElement(new Integer(tok.nextToken()));
- recv.addElement(new Integer(tok.nextToken()));
- }
- }
- catch(IOException e);
- }
-
- // cfill
- // Fill the connections list with current connections
- void cfill()
- {
- clist.clear();
- for(int i=0; i<id.size(); i++)
- clist.addItem((String)host.elementAt(i),
- (String)name.elementAt(i));
- }
-
- public boolean action(Event evt, Object obj)
- {
- int sel = clist.selected();
- if (evt.target == cref) {
- // refresh button clicked
- cread();
- cfill();
- }
- else if (evt.target == cinfo ||
- evt.target == clist && ((String)evt.arg).equals("Double")) {
- // Info button clicked
- if (sel < 0) return true;
- new ConnectionInfoRequestor(
- ((Integer)id.elementAt(sel)).intValue(),
- (String)host.elementAt(sel),
- (String)name.elementAt(sel),
- ((Long)last.elementAt(sel)).longValue(),
- ((Integer)sent.elementAt(sel)).intValue(),
- ((Integer)recv.elementAt(sel)).intValue() );
- }
- else if (evt.target == ckill) {
- // Kill connection button clicked
- if (sel < 0) return true;
- int cid = ((Integer)id.elementAt(sel)).intValue();
- Message head = new Message();
- head.add("Command","Kill");
- head.add("Id",String.valueOf(cid));
- try client.devput("/dev/Server", null, head);
- catch(RequestException e)
- new ErrorWindow("Failed to kill connection : "+
- e.getMessage());
- cread();
- cfill();
- }
- return true;
- }
- }
-
- // ConnectionInfoRequestor
- // A window for displaying information about one connection to the server
- class ConnectionInfoRequestor extends FixedFrame
- {
- Button close;
-
- ConnectionInfoRequestor(int id, String host, String name,
- long last, int sent, int recv)
- {
- super(new Dimension(300, -1));
- setLayout(new BorderLayout());
- Panel top = new Panel();
- top.setLayout(new BorderLayout());
- Panel left = new Panel();
- left.setLayout(new GridLayout(6,1));
- left.add(new Label("Connection ID"));
- left.add(new Label("Hostname"));
- left.add(new Label("Username"));
- left.add(new Label("Last activity"));
- left.add(new Label("Bytes sent"));
- left.add(new Label("Bytes received"));
- top.add("West",left);
- Panel right = new Panel();
- right.setLayout(new GridLayout(6,1));
- right.add(new StaticTextField(String.valueOf(id)));
- right.add(new StaticTextField(host));
- right.add(new StaticTextField(name));
- right.add(new StaticTextField(new Date(last).toString()));
- right.add(new StaticTextField(String.valueOf(sent)));
- right.add(new StaticTextField(String.valueOf(recv)));
- top.add("Center",right);
- add("North",top);
- Panel bot = new Panel();
- bot.setLayout(new FlowLayout(FlowLayout.RIGHT));
- bot.add(close = new Button("Close"));
- add("South",bot);
-
- setTitle("Connection info");
- pack();
- show();
- }
-
- public boolean handleEvent(Event evt)
- {
- if (evt.id == Event.WINDOW_DESTROY ||
- evt.id == Event.ACTION_EVENT && evt.target == close)
- dispose();
- return super.handleEvent(evt);
- }
- }
-
- // PropertiesPanel
- // Displays all server properties currently stored on the server
- class PropertiesPanel extends Panel
- {
- JFSclient client;
- DoubleListPanel plist;
- TextField pname, puser, pvalue;
- Button psave, pnew, pdel, pref;
-
- Vector prop; // properties from server
-
- PropertiesPanel()
- {
- // create user interface
- setLayout(new GridLayout(1,2));
- Panel left = new Panel();
- left.setLayout(new BorderLayout());
- left.add("Center", plist = new DoubleListPanel("Property", "Owner"));
- left.add("South", pref = new Button("Refresh"));
- add(left);
- Panel right = new Panel();
- right.setLayout(new BorderLayout());
- Panel rt = new Panel();
- rt.setLayout(new GridLayout(6,1));
- rt.add(new Label("Property"));
- rt.add(pname = new TextField());
- rt.add(new Label("Owner"));
- rt.add(puser = new TextField());
- rt.add(new Label("Value"));
- rt.add(pvalue = new TextField());
- right.add("North",rt);
- Panel rb = new Panel();
- rb.setLayout(new FlowLayout(FlowLayout.RIGHT));
- rb.add(psave = new Button("Save"));
- rb.add(pnew = new Button("New"));
- rb.add(pdel = new Button("Delete"));
- right.add("South",rb);
- add(right);
- }
-
- // connect
- // Read and display properties
- void connect(JFSclient c)
- {
- client = c;
- pread();
- pfill();
- }
-
- // pread
- // Read all properties from the server
- void pread()
- {
- prop = new Vector();
- Message head = new Message(), r = null;
- head.add("Command","Properties");
- try r = client.devget("/dev/Server", head);
- catch(RequestException e) {
- new ErrorWindow("Failed to read properties from server");
- return;
- }
- BufferInputStream buf = new BufferInputStream(r.getdata());
- try {
- while(true)
- prop.addElement(new ServerProperty(buf.gets()));
- }
- catch(IOException e);
- }
-
- // pfill
- // Display properties in the list
- void pfill()
- {
- plist.clear();
- for(int i=0; i<prop.size(); i++) {
- ServerProperty p = (ServerProperty)prop.elementAt(i);
- plist.addItem(p.name, p.user);
- }
- }
-
- public boolean action(Event evt, Object obj)
- {
- if (evt.target == plist) {
- // Property chosen from list
- int sel = plist.selected();
- ServerProperty p = (ServerProperty)prop.elementAt(sel);
- pname.setText(p.name);
- puser.setText(p.user);
- pvalue.setText(p.value);
- setmod(p.external);
- }
- else if (evt.target == pref) {
- // Refresh properties button clicked
- pread();
- pfill();
- }
- else if (evt.target == pnew) {
- // New button clicked
- pname.setText("");
- puser.setText("");
- pvalue.setText("");
- setmod(true);
- }
- else if (evt.target == psave) {
- // Save property button clicked
- ServerProperty np = new ServerProperty(pname.getText(),
- puser.getText(),
- pvalue.getText(),
- true);
- client.putprop(np);
- pread();
- pfill();
- }
- else if (evt.target == pdel) {
- // Delete property button clicked
- int sel = plist.selected();
- if (sel < 0) return true;
- ServerProperty vic = (ServerProperty)prop.elementAt(sel);
- client.delprop(vic.name, vic.user);
- pread();
- pfill();
- }
- return true;
- }
-
- // setmod
- // Enable or display editing of property details
- void setmod(boolean m)
- {
- pname.setEditable(m);
- puser.setEditable(m);
- pvalue.setEditable(m);
- psave.enable(m);
- }
- }
-
- // DevicesPanel
- // Displays devices files in /dev and their permissions.
- class DevicesPanel extends Panel
- {
- JFSclient client;
- JFSdirectory devices;
- DoubleListPanel list;
- Button add, del;
-
- DevicesPanel()
- {
- setLayout(new BorderLayout());
- add("Center", list = new DoubleListPanel("Device", "Permissions"));
- Panel top = new Panel();
- top.setLayout(new FlowLayout(FlowLayout.LEFT));
- top.add(add = new Button("Add"));
- top.add(del = new Button("Delete"));
- add("North", top);
- }
-
- // connect
- // Retrieve a list of devices from the server
- void connect(JFSclient c)
- {
- client = c;
- JFSdirectory d = null;
- try devices = client.getdir("/dev");
- catch(RequestException e) {
- new ErrorWindow("Could not read /dev : "+e.getMessage());
- return;
- }
- fill();
- }
-
- // fill
- // Display the important stuff from /dev in the list
- void fill()
- {
- list.clear();
- for(int i=0; i<devices.size(); i++) {
- JFSfile f = devices.find(i);
- String p = "";
- for(int j=0; j<f.users.size(); j++) {
- JFSfileuser u = (JFSfileuser)f.users.elementAt(j);
- p += u.name + " (" + u.rwp + ") ";
- }
- list.addItem("/dev/"+f.name, p);
- }
- }
-
- public boolean action(Event evt, Object obj)
- {
- if (evt.target == add) {
- // Add device button clicked
- new DeviceEditRequestor(this);
- }
- else if (evt.target == del) {
- // Delete device button clicked
- int sel = list.selected();
- if (sel < 0) return false;
- JFSfile doomed = devices.find(sel);
- try client.delete("/dev/"+doomed.name, 0);
- catch(RequestException e) {
- new ErrorWindow("Failed to delete device : "+
- e.getMessage());
- return false;
- }
- devices.delete(doomed);
- fill();
- }
- return true;
- }
- }
-
- // DeviceEditRequestor
- // A pop-up window for creating a new device entry
- class DeviceEditRequestor extends FixedFrame
- {
- DevicesPanel parent;
- TextField name;
- Choice perms;
- Button ok, cancel;
-
- DeviceEditRequestor(DevicesPanel p)
- {
- super(new Dimension(250, -1));
- parent = p;
-
- // create UI
- setLayout(new BorderLayout());
- Panel top = new Panel();
- top.setLayout(new BorderLayout());
- Panel left = new Panel();
- left.setLayout(new GridLayout(2,1));
- left.add(new Label("Name"));
- left.add(new Label("Permissions"));
- top.add("West", left);
- Panel right = new Panel();
- right.setLayout(new GridLayout(2,1));
- right.add(name = new TextField());
- right.add(perms = new Choice());
- perms.addItem("No access");
- perms.addItem("Read only");
- perms.addItem("Write only");
- perms.addItem("Read and write");
- top.add("Center", right);
- add("North", top);
- Panel bot = new Panel();
- bot.setLayout(new FlowLayout(FlowLayout.RIGHT));
- bot.add(ok = new Button("Ok"));
- bot.add(cancel = new Button("Cancel"));
- add("South", bot);
-
- setTitle("New device");
- pack();
- show();
- }
-
- public boolean handleEvent(Event evt)
- {
- if (evt.id == Event.WINDOW_DESTROY ||
- evt.id == Event.ACTION_EVENT && evt.target == cancel)
- dispose();
- else if (evt.id == Event.ACTION_EVENT && evt.target == ok) {
- // add this device
- String nm = name.getText();
-
- // does it already exist?
- if (parent.devices.find(nm) != null) {
- new ErrorWindow("A device with the name "+nm+
- " already exists");
- return false;
- }
-
- // create file in /dev
- String path = "/dev/"+nm;
- try parent.client.put(path, 0, new byte[0], "jfs/special");
- catch(RequestException e) {
- new ErrorWindow("Could not create device : "+
- e.getMessage());
- return false;
- }
- int ch =perms.getSelectedIndex();
- if (ch != 0) {
- try parent.client.chmod(path, "all",ch==1 ? "r" :
- ch==2 ? "w" : "rw");
- catch(RequestException e) {
- new ErrorWindow("Could not set permissions : "+
- e.getMessage());
- return false;
- }
- }
-
- // update list
- try parent.devices.add(parent.client.statfile(path));
- catch(RequestException e);
- parent.fill();
- dispose();
- }
- return super.handleEvent(evt);
- }
- }
-
-