# Copyright (C) 2004 Mike Wray """Grand unified management application for Xen. """ import os import os.path import sys from getopt import getopt import socket from xen.xend import PrettyPrint from xen.xend import sxp from xen.xend.XendClient import XendError, server from xen.xend.XendClient import main as xend_client_main from xen.xm import create, destroy, migrate, shutdown, sysrq from xen.xm.opts import * class Group: name = "" info = "" def __init__(self, xm): self.xm = xm self.progs = {} def addprog(self, prog): self.progs[prog.name] = prog def getprog(self, name): return self.progs.get(name) def proglist(self): kl = self.progs.keys() kl.sort() return [ self.getprog(k) for k in kl ] def help(self, args): if self.info: print print self.info print else: print def shortHelp(self, args): self.help(args) for p in self.proglist(): p.shortHelp(args) class Prog: """Base class for sub-programs. """ """Program group it belongs to""" group = 'all' """Program name.""" name = '??' """Short program info.""" info = '' def __init__(self, xm): self.xm = xm def err(self, msg): self.xm.err(msg) def help(self, args): self.shortHelp(args) def shortHelp(self, args): print "%-14s %s" % (self.name, self.info) def main(self, args): """Program main entry point. """ pass class ProgUnknown(Prog): name = 'unknown' info = '' def help(self, args): self.xm.err("Unknown command: %s\nTry '%s help' for more information." % (args[0], self.xm.name)) main = help class Xm: """Main application. """ def __init__(self): self.name = 'xm' self.unknown = ProgUnknown(self) self.progs = {} self.groups = {} def err(self, msg): print >>sys.stderr, "Error:", msg sys.exit(1) def main(self, args): try: self.main_call(args) except socket.error, ex: print >>sys.stderr, ex self.err("Error connecting to xend, is xend running?") except XendError, ex: self.err(str(ex)) def main_call(self, args): """Main entry point. Dispatches to the progs. """ self.name = args[0] if len(args) < 2: args.append('help') help = self.helparg(args) p = self.getprog(args[1], self.unknown) if help or len(args) < 2: p.help(args[1:]) else: p.main(args[1:]) def helparg(self, args): for a in args: if a in ['-h', '--help']: return 1 return 0 def prog(self, pklass): """Add a sub-program. pklass program class (Prog subclass) """ p = pklass(self) self.progs[p.name] = p self.getgroup(p.group).addprog(p) return p def getprog(self, name, val=None): """Get a sub-program. name Name of the sub-program (or optionally, an unambiguous prefix of its name) val Default return value if no (unique) match is found """ match = None for progname in self.progs.keys(): if progname == name: match = progname break if progname.startswith(name): if not match: match = progname else: return val # name is ambiguous - bail out return self.progs.get(match, val) def group(self, klass): g = klass(self) self.groups[g.name] = g return g def getgroup(self, name): return self.groups[name] def grouplist(self): kl = self.groups.keys() kl.sort() return [ self.getgroup(k) for k in kl ] # Create the application object, then add the sub-program classes. xm = Xm() class GroupAll(Group): name = "all" info = "" xm.group(GroupAll) class GroupDomain(Group): name = "domain" info = "Commands on domains:" xm.group(GroupDomain) class GroupScheduler(Group): name = "scheduler" info = "Comands controlling scheduling:" xm.group(GroupScheduler) class GroupHost(Group): name = "host" info = "Commands related to the xen host (node):" xm.group(GroupHost) class GroupConsole(Group): name = "console" info = "Commands related to consoles:" xm.group(GroupConsole) class GroupVbd(Group): name = "vbd" info = "Commands related to virtual block devices:" xm.group(GroupVbd) class GroupVif(Group): name = "vif" info = "Commands related to virtual network interfaces:" xm.group(GroupVif) class ProgHelp(Prog): name = "help" info = "Print help." def help(self, args): if len(args) == 2: name = args[1] p = self.xm.getprog(name) if p: p.help(args[1:]) else: print '%s: Unknown command: %s' % (self.name, name) else: for g in self.xm.grouplist(): g.shortHelp(args) print "\nTry '%s help CMD' for help on CMD" % self.xm.name main = help xm.prog(ProgHelp) class ProgCreate(Prog): group = 'domain' name = "create" info = """Create a domain.""" def help(self, args): create.main([args[0], '-h']) def main(self, args): create.main(args) xm.prog(ProgCreate) class ProgSave(Prog): group = 'domain' name = "save" info = """Save domain state (and config) to file.""" def help(self, args): print args[0], "DOM FILE" print """\nSave domain with id DOM to FILE.""" def main(self, args): if len(args) < 3: self.err("%s: Missing arguments" % args[0]) dom = args[1] savefile = os.path.abspath(args[2]) server.xend_domain_save(dom, savefile) xm.prog(ProgSave) class ProgRestore(Prog): group = 'domain' name = "restore" info = """Create a domain from a saved state.""" def help(self, args): print args[0], "FILE" print "\nRestore a domain from FILE." def main(self, args): if len(args) < 2: self.err(
/*
 * patch-cmdline.c - patch the kernel command line on rb532
 *
 * Copyright (C) 2006 Felix Fietkau <nbd@openwrt.org>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 */

#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <string.h>

#define SEARCH_SPACE	(16 * 1024)
#define CMDLINE_MAX		512

int main(int argc, char **argv)
{
	int fd, found = 0, len, ret = -1;
	char *ptr, *p;

	if (argc != 3) {
		fprintf(stderr, "Usage: %s <file> <cmdline>\n", argv[0]);
		goto err1;
	}
	len = strlen(argv[2]);
	if (len + 9 > CMDLINE_MAX) {
		fprintf(stderr, "Command line string too long\n");
		goto err1;
	}
	
	if (((fd = open(argv[1], O_RDWR)) < 0) ||
		(ptr = (char *) mmap(0, SEARCH_SPACE + CMDLINE_MAX, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0)) == (void *) (-1)) {
		fprintf(stderr, "Could not open kernel image");
		goto err2;
	}
	
	for (p = ptr; p < (ptr + SEARCH_SPACE); p += 4) {
		if (memcmp(p, "CMDLINE:", 8) == 0) {
			found = 1;
			p += 8;
			break;
		}
	}
	if (!found) {
		fprintf(stderr, "Command line marker not found!\n");
		goto err3;
	}

	memset(p, 0, CMDLINE_MAX - 8);
	strcpy(p, argv[2]);
	msync(p, CMDLINE_MAX, MS_SYNC|MS_INVALIDATE);
	ret = 0;

err3:
	munmap((void *) ptr, len);
err2:
	if (fd > 0)
		close(fd);
err1:
	return ret;
}