#code to play with vdis and snapshots import os def run(cmd): fd = os.popen(cmd) res = [l for l in fd if l.rstrip()] return not fd.close(), res _blockstore = '/blockstore.dat' def set_blockstore(blockstore): global _blockstore __blockstore = blockstore class SnapShot: def __init__(self, vdi, block, index): self.__vdi = vdi self.__block = block self.__index = index #TODO add snapshot date and radix def __str__(self): return '%d %d %d' % (self.__vdi.id(), self.__block, self.__index) def vdi(self): return self.__vdi def block(self): return self.__block def index(self): return self.__index def match(self, block, index): return self.__block == block and self.__index == index class VDIException(Exception): pass class VDI: def __init__(self, id, name): self.__id = id self.__name = name def __str__(self): return 'vdi: %d %s' % (self.__id, self.__name) def id(self): return self.__id def name(self): return self.__name def list_snapshots(self): res, ls = run('vdi_snap_list %s %d' % (_blockstore, self.__id)) if res: return [SnapShot(self, int(l[0]), int(l[1])) for l in [l.split() for l in ls[1:]]] else: raise VDIException("Error reading snapshot list") def snapshot(self): res, ls = run('vdi_checkpoint %s %d' % (_blockstore, self.__id)) if res: _, block, idx = ls[0].split() return SnapShot(self, int(block), int(idx)) else: raise VDIException("Error taking vdi snapshot") def create(name, snap): res, _ = run('vdi_create %s %s %d %d' % (_blockstore, name, snap.block(), snap.index())) if res: return lookup_by_name(name) else: raise VDIException('Unable to create vdi from snapshot') def fill(name, img_file): res, _ = run('vdi_create %s %s' % (_blockstore, name)) if res: vdi = lookup_by_name(name) res, _ = run('vdi_fill %d %s' % (vdi.id(), img_file)) if res: return vdi raise VDIException('Unable to create vdi from disk img file') def list_vdis(): vdis = [] res, lines = run('vdi_list %s' % _blockstore) if res: for l in lines: r = l.split() vdis.append(VDI(int(r[0]), r[1])) return vdis else: raise VDIException("Error doing vdi list") def lookup_by_id(id): vdis = list_vdis() for v in vdis: if v.id() == id: return v raise VDIException("No match from vdi id") def lookup_by_name(name): vdis = list_vdis() for v in vdis: if v.name() == name: return v raise VDIException("No match for vdi name") e='10' name='q' value=''/>
path: root/docs/init-scripts.tex
blob: c8b07500b39e975e9dd499e9337d8f56712d366a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
Because OpenWrt uses its own init script system, all init scripts must be installed
as \texttt{/etc/init.d/\textit{name}} use \texttt{/etc/rc.common} as a wrapper.

Example: \texttt{/etc/init.d/httpd}

\begin{Verbatim}
#!/bin/sh /etc/rc.common
# Copyright (C) 2006 OpenWrt.org

START=50
start() {
    [ -d /www ] && httpd -p 80 -h /www -r OpenWrt
}

stop() {
    killall httpd
}
\end{Verbatim}

as you can see, the script does not actually parse the command line arguments itself.
This is done by the wrapper script \texttt{/etc/rc.common}.

\texttt{start()} and \texttt{stop()} are the basic functions, which almost any init
script should provide. \texttt{start()} is called when the user runs \texttt{/etc/init.d/httpd start}
or (if the script is enabled and does not override this behavior) at system boot time.

Enabling and disabling init scripts is done by running \texttt{/etc/init.d/\textit{name} enable}
or \texttt{/etc/init.d/\textit{name} disable}. This creates or removes symbolic links to the
init script in \texttt{/etc/rc.d}, which is processed by \texttt{/etc/init.d/rcS} at boot time.

The order in which these scripts are run is defined in the variable \texttt{START} in the init
script. Changing it requires running \texttt{/etc/init.d/\textit{name} enable} again.

You can also override these standard init script functions:
\begin{itemize}
    \item \texttt{boot()} \\
        Commands to be run at boot time. Defaults to \texttt{start()}

    \item \texttt{restart()} \\
        Restart your service. Defaults to \texttt{stop(); start()}

    \item \texttt{reload()} \\
        Reload the configuration files for your service. Defaults to \texttt{restart()}

\end{itemize}

You can also add custom commands by creating the appropriate functions and referencing them
in the \texttt{EXTRA\_COMMANDS} variable. Helptext is added in \texttt{EXTRA\_HELP}.

Example:

\begin{Verbatim}
status() {
    # print the status info
}

EXTRA_COMMANDS="status"
EXTRA_HELP="        status  Print the status of the service"
\end{Verbatim}