mirror of
https://git.proxmox.com/git/mirror_lxc
synced 2025-08-16 05:42:54 +00:00
Merge pull request #793 from stgraber/master
Remove legacy versions of lxc-ls
This commit is contained in:
commit
57e40de3bd
4
.gitignore
vendored
4
.gitignore
vendored
@ -62,7 +62,6 @@ src/lxc/lxc-unfreeze
|
|||||||
src/lxc/lxc-unshare
|
src/lxc/lxc-unshare
|
||||||
src/lxc/lxc-usernsexec
|
src/lxc/lxc-usernsexec
|
||||||
src/lxc/lxc-wait
|
src/lxc/lxc-wait
|
||||||
src/lxc/legacy/lxc-ls
|
|
||||||
src/lxc/lxc-user-nic
|
src/lxc/lxc-user-nic
|
||||||
src/lxc/version.h
|
src/lxc/version.h
|
||||||
|
|
||||||
@ -121,12 +120,9 @@ doc/*.7
|
|||||||
doc/ja/*.1
|
doc/ja/*.1
|
||||||
doc/ja/*.5
|
doc/ja/*.5
|
||||||
doc/ja/*.7
|
doc/ja/*.7
|
||||||
doc/ja/legacy/*.1
|
|
||||||
doc/legacy/*.1
|
|
||||||
doc/ko/*.1
|
doc/ko/*.1
|
||||||
doc/ko/*.5
|
doc/ko/*.5
|
||||||
doc/ko/*.7
|
doc/ko/*.7
|
||||||
doc/ko/legacy/*.1
|
|
||||||
doc/manpage.links
|
doc/manpage.links
|
||||||
doc/manpage.refs
|
doc/manpage.refs
|
||||||
doc/api/html/*
|
doc/api/html/*
|
||||||
|
@ -685,7 +685,6 @@ AC_CONFIG_FILES([
|
|||||||
|
|
||||||
doc/Makefile
|
doc/Makefile
|
||||||
doc/api/Makefile
|
doc/api/Makefile
|
||||||
doc/legacy/lxc-ls.sgml
|
|
||||||
doc/lxc-attach.sgml
|
doc/lxc-attach.sgml
|
||||||
doc/lxc-autostart.sgml
|
doc/lxc-autostart.sgml
|
||||||
doc/lxc-cgroup.sgml
|
doc/lxc-cgroup.sgml
|
||||||
@ -734,7 +733,6 @@ AC_CONFIG_FILES([
|
|||||||
doc/examples/lxc-complex.conf
|
doc/examples/lxc-complex.conf
|
||||||
|
|
||||||
doc/ja/Makefile
|
doc/ja/Makefile
|
||||||
doc/ja/legacy/lxc-ls.sgml
|
|
||||||
doc/ja/lxc-attach.sgml
|
doc/ja/lxc-attach.sgml
|
||||||
doc/ja/lxc-autostart.sgml
|
doc/ja/lxc-autostart.sgml
|
||||||
doc/ja/lxc-cgroup.sgml
|
doc/ja/lxc-cgroup.sgml
|
||||||
@ -772,7 +770,6 @@ AC_CONFIG_FILES([
|
|||||||
doc/ja/see_also.sgml
|
doc/ja/see_also.sgml
|
||||||
|
|
||||||
doc/ko/Makefile
|
doc/ko/Makefile
|
||||||
doc/ko/legacy/lxc-ls.sgml
|
|
||||||
doc/ko/lxc-attach.sgml
|
doc/ko/lxc-attach.sgml
|
||||||
doc/ko/lxc-autostart.sgml
|
doc/ko/lxc-autostart.sgml
|
||||||
doc/ko/lxc-cgroup.sgml
|
doc/ko/lxc-cgroup.sgml
|
||||||
@ -835,9 +832,7 @@ AC_CONFIG_FILES([
|
|||||||
src/Makefile
|
src/Makefile
|
||||||
src/lxc/Makefile
|
src/lxc/Makefile
|
||||||
src/lxc/lxc-checkconfig
|
src/lxc/lxc-checkconfig
|
||||||
src/lxc/lxc-ls
|
|
||||||
src/lxc/lxc-start-ephemeral
|
src/lxc/lxc-start-ephemeral
|
||||||
src/lxc/legacy/lxc-ls
|
|
||||||
src/lxc/lxc.functions
|
src/lxc/lxc.functions
|
||||||
src/lxc/version.h
|
src/lxc/version.h
|
||||||
src/python-lxc/Makefile
|
src/python-lxc/Makefile
|
||||||
|
@ -31,6 +31,7 @@ man_MANS = \
|
|||||||
lxc-execute.1 \
|
lxc-execute.1 \
|
||||||
lxc-freeze.1 \
|
lxc-freeze.1 \
|
||||||
lxc-info.1 \
|
lxc-info.1 \
|
||||||
|
lxc-ls.1 \
|
||||||
lxc-monitor.1 \
|
lxc-monitor.1 \
|
||||||
lxc-snapshot.1 \
|
lxc-snapshot.1 \
|
||||||
lxc-start.1 \
|
lxc-start.1 \
|
||||||
@ -50,10 +51,7 @@ man_MANS = \
|
|||||||
lxc.7
|
lxc.7
|
||||||
|
|
||||||
if ENABLE_PYTHON
|
if ENABLE_PYTHON
|
||||||
man_MANS += lxc-ls.1
|
|
||||||
man_MANS += lxc-start-ephemeral.1
|
man_MANS += lxc-start-ephemeral.1
|
||||||
else
|
|
||||||
man_MANS += legacy/lxc-ls.1
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
%.1 : %.sgml
|
%.1 : %.sgml
|
||||||
|
@ -23,6 +23,7 @@ man_MANS = \
|
|||||||
lxc-execute.1 \
|
lxc-execute.1 \
|
||||||
lxc-freeze.1 \
|
lxc-freeze.1 \
|
||||||
lxc-info.1 \
|
lxc-info.1 \
|
||||||
|
lxc-ls.1 \
|
||||||
lxc-monitor.1 \
|
lxc-monitor.1 \
|
||||||
lxc-snapshot.1 \
|
lxc-snapshot.1 \
|
||||||
lxc-start.1 \
|
lxc-start.1 \
|
||||||
@ -42,10 +43,7 @@ man_MANS = \
|
|||||||
lxc.7
|
lxc.7
|
||||||
|
|
||||||
if ENABLE_PYTHON
|
if ENABLE_PYTHON
|
||||||
man_MANS += lxc-ls.1
|
|
||||||
man_MANS += lxc-start-ephemeral.1
|
man_MANS += lxc-start-ephemeral.1
|
||||||
else
|
|
||||||
man_MANS += legacy/lxc-ls.1
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
%.1 : %.sgml
|
%.1 : %.sgml
|
||||||
|
@ -1,176 +0,0 @@
|
|||||||
<!--
|
|
||||||
|
|
||||||
lxc: linux Container library
|
|
||||||
|
|
||||||
(C) Copyright IBM Corp. 2007, 2008
|
|
||||||
|
|
||||||
Authors:
|
|
||||||
Daniel Lezcano <dlezcano at fr.ibm.com>
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
Translated into Japanese
|
|
||||||
by KATOH Yasufumi <karma at jazz.email.ne.jp>
|
|
||||||
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!DOCTYPE refentry PUBLIC @docdtd@ [
|
|
||||||
|
|
||||||
<!ENTITY seealso SYSTEM "@builddir@/../see_also.sgml">
|
|
||||||
]>
|
|
||||||
|
|
||||||
<refentry>
|
|
||||||
|
|
||||||
<docinfo><date>@LXC_GENERATE_DATE@</date></docinfo>
|
|
||||||
|
|
||||||
<refmeta>
|
|
||||||
<refentrytitle>lxc-ls</refentrytitle>
|
|
||||||
<manvolnum>1</manvolnum>
|
|
||||||
</refmeta>
|
|
||||||
|
|
||||||
<refnamediv>
|
|
||||||
<refname>lxc-ls</refname>
|
|
||||||
|
|
||||||
<refpurpose>
|
|
||||||
<!--
|
|
||||||
list the containers existing on the system
|
|
||||||
-->
|
|
||||||
システム上に存在するコンテナをリスト表示する。
|
|
||||||
</refpurpose>
|
|
||||||
</refnamediv>
|
|
||||||
|
|
||||||
<refsynopsisdiv>
|
|
||||||
<cmdsynopsis>
|
|
||||||
<command>lxc-ls</command>
|
|
||||||
<arg choice="opt">--active</arg>
|
|
||||||
<arg choice="opt">ls option</arg>
|
|
||||||
</cmdsynopsis>
|
|
||||||
</refsynopsisdiv>
|
|
||||||
|
|
||||||
<refsect1>
|
|
||||||
<title><!-- Description -->説明</title>
|
|
||||||
<para>
|
|
||||||
<!--
|
|
||||||
<command>lxc-ls</command> list the containers existing on the
|
|
||||||
system.
|
|
||||||
-->
|
|
||||||
<command>lxc-ls</command> はシステム上に存在するコンテナをリスト表示します。
|
|
||||||
</para>
|
|
||||||
</refsect1>
|
|
||||||
|
|
||||||
<refsect1>
|
|
||||||
<title><!-- Options -->オプション</title>
|
|
||||||
<variablelist>
|
|
||||||
|
|
||||||
<varlistentry>
|
|
||||||
<term>
|
|
||||||
<option><optional>--active</optional></option>
|
|
||||||
</term>
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
<!--
|
|
||||||
List active containers.
|
|
||||||
-->
|
|
||||||
稼働中のコンテナをリスト表示します。
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
</varlistentry>
|
|
||||||
|
|
||||||
<varlistentry>
|
|
||||||
<term>
|
|
||||||
<option><optional>ls options</optional></option>
|
|
||||||
</term>
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
<!--
|
|
||||||
The option passed to <command>lxc-ls</command> are the
|
|
||||||
same as the <command>ls</command> command.
|
|
||||||
-->
|
|
||||||
<command>lxc-ls</command> が受け付けるオプションは、<command>ls</command> コマンドと同じです。
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
</varlistentry>
|
|
||||||
|
|
||||||
</variablelist>
|
|
||||||
|
|
||||||
</refsect1>
|
|
||||||
|
|
||||||
<refsect1>
|
|
||||||
<title><!-- Examples -->例</title>
|
|
||||||
<variablelist>
|
|
||||||
<varlistentry>
|
|
||||||
<term>lxc-ls -l</term>
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
<!--
|
|
||||||
list all the container and their permissions.
|
|
||||||
-->
|
|
||||||
全てのコンテナとそのパーミッションをリスト表示します。
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
</varlistentry>
|
|
||||||
|
|
||||||
<varlistentry>
|
|
||||||
<term>lxc-ls --active -1</term>
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
<!--
|
|
||||||
list active containers and display the list in one column.
|
|
||||||
-->
|
|
||||||
稼働中のコンテナを一列にリスト表示します。
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
</varlistentry>
|
|
||||||
|
|
||||||
</variablelist>
|
|
||||||
</refsect1>
|
|
||||||
|
|
||||||
<refsect1>
|
|
||||||
<title>See Also</title>
|
|
||||||
|
|
||||||
<simpara>
|
|
||||||
<citerefentry>
|
|
||||||
<refentrytitle>ls</refentrytitle>
|
|
||||||
<manvolnum>1</manvolnum>
|
|
||||||
</citerefentry>,
|
|
||||||
</simpara>
|
|
||||||
|
|
||||||
</refsect1>
|
|
||||||
|
|
||||||
&seealso;
|
|
||||||
|
|
||||||
<refsect1>
|
|
||||||
<title><!-- Author -->作者</title>
|
|
||||||
<para>Daniel Lezcano <email>daniel.lezcano@free.fr</email></para>
|
|
||||||
</refsect1>
|
|
||||||
|
|
||||||
</refentry>
|
|
||||||
|
|
||||||
<!-- Keep this comment at the end of the file
|
|
||||||
Local variables:
|
|
||||||
mode: sgml
|
|
||||||
sgml-omittag:t
|
|
||||||
sgml-shorttag:t
|
|
||||||
sgml-minimize-attributes:nil
|
|
||||||
sgml-always-quote-attributes:t
|
|
||||||
sgml-indent-step:2
|
|
||||||
sgml-indent-data:t
|
|
||||||
sgml-parent-document:nil
|
|
||||||
sgml-default-dtd-file:nil
|
|
||||||
sgml-exposed-tags:nil
|
|
||||||
sgml-local-catalogs:nil
|
|
||||||
sgml-local-ecat-files:nil
|
|
||||||
End:
|
|
||||||
-->
|
|
@ -23,6 +23,7 @@ man_MANS = \
|
|||||||
lxc-execute.1 \
|
lxc-execute.1 \
|
||||||
lxc-freeze.1 \
|
lxc-freeze.1 \
|
||||||
lxc-info.1 \
|
lxc-info.1 \
|
||||||
|
lxc-ls.1 \
|
||||||
lxc-monitor.1 \
|
lxc-monitor.1 \
|
||||||
lxc-snapshot.1 \
|
lxc-snapshot.1 \
|
||||||
lxc-start.1 \
|
lxc-start.1 \
|
||||||
@ -42,10 +43,7 @@ man_MANS = \
|
|||||||
lxc.7
|
lxc.7
|
||||||
|
|
||||||
if ENABLE_PYTHON
|
if ENABLE_PYTHON
|
||||||
man_MANS += lxc-ls.1
|
|
||||||
man_MANS += lxc-start-ephemeral.1
|
man_MANS += lxc-start-ephemeral.1
|
||||||
else
|
|
||||||
man_MANS += legacy/lxc-ls.1
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
%.1 : %.sgml
|
%.1 : %.sgml
|
||||||
|
@ -1,176 +0,0 @@
|
|||||||
<!--
|
|
||||||
|
|
||||||
lxc: linux Container library
|
|
||||||
|
|
||||||
(C) Copyright IBM Corp. 2007, 2008
|
|
||||||
|
|
||||||
Authors:
|
|
||||||
Daniel Lezcano <dlezcano at fr.ibm.com>
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
Translated into Korean
|
|
||||||
by Sungbae Yoo <sungbae.yoo at samsung.com>
|
|
||||||
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!DOCTYPE refentry PUBLIC @docdtd@ [
|
|
||||||
|
|
||||||
<!ENTITY seealso SYSTEM "@builddir@/../see_also.sgml">
|
|
||||||
]>
|
|
||||||
|
|
||||||
<refentry>
|
|
||||||
|
|
||||||
<docinfo><date>@LXC_GENERATE_DATE@</date></docinfo>
|
|
||||||
|
|
||||||
<refmeta>
|
|
||||||
<refentrytitle>lxc-ls</refentrytitle>
|
|
||||||
<manvolnum>1</manvolnum>
|
|
||||||
</refmeta>
|
|
||||||
|
|
||||||
<refnamediv>
|
|
||||||
<refname>lxc-ls</refname>
|
|
||||||
|
|
||||||
<refpurpose>
|
|
||||||
<!--
|
|
||||||
list the containers existing on the system
|
|
||||||
-->
|
|
||||||
시스템 내에 존재하는 컨테이너들의 리스트 표시
|
|
||||||
</refpurpose>
|
|
||||||
</refnamediv>
|
|
||||||
|
|
||||||
<refsynopsisdiv>
|
|
||||||
<cmdsynopsis>
|
|
||||||
<command>lxc-ls</command>
|
|
||||||
<arg choice="opt">--active</arg>
|
|
||||||
<arg choice="opt">ls option</arg>
|
|
||||||
</cmdsynopsis>
|
|
||||||
</refsynopsisdiv>
|
|
||||||
|
|
||||||
<refsect1>
|
|
||||||
<title><!-- Description -->설명</title>
|
|
||||||
<para>
|
|
||||||
<!--
|
|
||||||
<command>lxc-ls</command> list the containers existing on the
|
|
||||||
system.
|
|
||||||
-->
|
|
||||||
<command>lxc-ls</command>는 시스템 내에 존재하는 컨테이너들의 리스트를 표시한다.
|
|
||||||
</para>
|
|
||||||
</refsect1>
|
|
||||||
|
|
||||||
<refsect1>
|
|
||||||
<title><!-- Options -->옵션</title>
|
|
||||||
<variablelist>
|
|
||||||
|
|
||||||
<varlistentry>
|
|
||||||
<term>
|
|
||||||
<option><optional>--active</optional></option>
|
|
||||||
</term>
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
<!--
|
|
||||||
List active containers.
|
|
||||||
-->
|
|
||||||
동작 중인 컨테이너들의 리스트를 표시한다.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
</varlistentry>
|
|
||||||
|
|
||||||
<varlistentry>
|
|
||||||
<term>
|
|
||||||
<option><optional>ls options</optional></option>
|
|
||||||
</term>
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
<!--
|
|
||||||
The option passed to <command>lxc-ls</command> are the
|
|
||||||
same as the <command>ls</command> command.
|
|
||||||
-->
|
|
||||||
<command>lxc-ls</command>에는 <command>ls</command>와 같은 옵션을 사용할 수 있다.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
</varlistentry>
|
|
||||||
|
|
||||||
</variablelist>
|
|
||||||
|
|
||||||
</refsect1>
|
|
||||||
|
|
||||||
<refsect1>
|
|
||||||
<title><!-- Examples -->예제</title>
|
|
||||||
<variablelist>
|
|
||||||
<varlistentry>
|
|
||||||
<term>lxc-ls -l</term>
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
<!--
|
|
||||||
list all the container and their permissions.
|
|
||||||
-->
|
|
||||||
모든 컨테이너들의 리스트와 그들의 퍼미션 정보를 표시한다.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
</varlistentry>
|
|
||||||
|
|
||||||
<varlistentry>
|
|
||||||
<term>lxc-ls --active -1</term>
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
<!--
|
|
||||||
list active containers and display the list in one column.
|
|
||||||
-->
|
|
||||||
동작 중인 컨테이너들의 리스트를 1열로 표시한다.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
</varlistentry>
|
|
||||||
|
|
||||||
</variablelist>
|
|
||||||
</refsect1>
|
|
||||||
|
|
||||||
<refsect1>
|
|
||||||
<title><!-- See Also -->참조</title>
|
|
||||||
|
|
||||||
<simpara>
|
|
||||||
<citerefentry>
|
|
||||||
<refentrytitle>ls</refentrytitle>
|
|
||||||
<manvolnum>1</manvolnum>
|
|
||||||
</citerefentry>,
|
|
||||||
</simpara>
|
|
||||||
|
|
||||||
</refsect1>
|
|
||||||
|
|
||||||
&seealso;
|
|
||||||
|
|
||||||
<refsect1>
|
|
||||||
<title><!-- Author -->저자</title>
|
|
||||||
<para>Daniel Lezcano <email>daniel.lezcano@free.fr</email></para>
|
|
||||||
</refsect1>
|
|
||||||
|
|
||||||
</refentry>
|
|
||||||
|
|
||||||
<!-- Keep this comment at the end of the file
|
|
||||||
Local variables:
|
|
||||||
mode: sgml
|
|
||||||
sgml-omittag:t
|
|
||||||
sgml-shorttag:t
|
|
||||||
sgml-minimize-attributes:nil
|
|
||||||
sgml-always-quote-attributes:t
|
|
||||||
sgml-indent-step:2
|
|
||||||
sgml-indent-data:t
|
|
||||||
sgml-parent-document:nil
|
|
||||||
sgml-default-dtd-file:nil
|
|
||||||
sgml-exposed-tags:nil
|
|
||||||
sgml-local-catalogs:nil
|
|
||||||
sgml-local-ecat-files:nil
|
|
||||||
End:
|
|
||||||
-->
|
|
@ -1,156 +0,0 @@
|
|||||||
|
|
||||||
<!--
|
|
||||||
|
|
||||||
lxc: linux Container library
|
|
||||||
|
|
||||||
(C) Copyright IBM Corp. 2007, 2008
|
|
||||||
|
|
||||||
Authors:
|
|
||||||
Daniel Lezcano <dlezcano at fr.ibm.com>
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!DOCTYPE refentry PUBLIC @docdtd@ [
|
|
||||||
|
|
||||||
<!ENTITY seealso SYSTEM "@builddir@/../see_also.sgml">
|
|
||||||
]>
|
|
||||||
|
|
||||||
<refentry>
|
|
||||||
|
|
||||||
<docinfo><date>@LXC_GENERATE_DATE@</date></docinfo>
|
|
||||||
|
|
||||||
<refmeta>
|
|
||||||
<refentrytitle>lxc-ls</refentrytitle>
|
|
||||||
<manvolnum>1</manvolnum>
|
|
||||||
</refmeta>
|
|
||||||
|
|
||||||
<refnamediv>
|
|
||||||
<refname>lxc-ls</refname>
|
|
||||||
|
|
||||||
<refpurpose>
|
|
||||||
list the containers existing on the system
|
|
||||||
</refpurpose>
|
|
||||||
</refnamediv>
|
|
||||||
|
|
||||||
<refsynopsisdiv>
|
|
||||||
<cmdsynopsis>
|
|
||||||
<command>lxc-ls</command>
|
|
||||||
<arg choice="opt">--active</arg>
|
|
||||||
<arg choice="opt"><replaceable>ls options</replaceable></arg>
|
|
||||||
</cmdsynopsis>
|
|
||||||
</refsynopsisdiv>
|
|
||||||
|
|
||||||
<refsect1>
|
|
||||||
<title>Description</title>
|
|
||||||
<para>
|
|
||||||
<command>lxc-ls</command> list the containers existing on the
|
|
||||||
system.
|
|
||||||
</para>
|
|
||||||
</refsect1>
|
|
||||||
|
|
||||||
<refsect1>
|
|
||||||
<title>Options</title>
|
|
||||||
<variablelist>
|
|
||||||
|
|
||||||
<varlistentry>
|
|
||||||
<term>
|
|
||||||
<option><optional>--active</optional></option>
|
|
||||||
</term>
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
List active containers.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
</varlistentry>
|
|
||||||
|
|
||||||
<varlistentry>
|
|
||||||
<term>
|
|
||||||
<option><optional><replaceable>ls options</replaceable></optional></option>
|
|
||||||
</term>
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
The option passed to <command>lxc-ls</command> are the
|
|
||||||
same as the <command>ls</command> command.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
</varlistentry>
|
|
||||||
|
|
||||||
</variablelist>
|
|
||||||
|
|
||||||
</refsect1>
|
|
||||||
|
|
||||||
<refsect1>
|
|
||||||
<title>Examples</title>
|
|
||||||
<variablelist>
|
|
||||||
<varlistentry>
|
|
||||||
<term>lxc-ls -l</term>
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
list all the container and their permissions.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
</varlistentry>
|
|
||||||
|
|
||||||
<varlistentry>
|
|
||||||
<term>lxc-ls --active -1</term>
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
list active containers and display the list in one column.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
</varlistentry>
|
|
||||||
|
|
||||||
</variablelist>
|
|
||||||
</refsect1>
|
|
||||||
|
|
||||||
<refsect1>
|
|
||||||
<title>See Also</title>
|
|
||||||
|
|
||||||
<simpara>
|
|
||||||
<citerefentry>
|
|
||||||
<refentrytitle>ls</refentrytitle>
|
|
||||||
<manvolnum>1</manvolnum>
|
|
||||||
</citerefentry>,
|
|
||||||
</simpara>
|
|
||||||
|
|
||||||
</refsect1>
|
|
||||||
|
|
||||||
&seealso;
|
|
||||||
|
|
||||||
<refsect1>
|
|
||||||
<title>Author</title>
|
|
||||||
<para>Daniel Lezcano <email>daniel.lezcano@free.fr</email></para>
|
|
||||||
</refsect1>
|
|
||||||
|
|
||||||
</refentry>
|
|
||||||
|
|
||||||
<!-- Keep this comment at the end of the file
|
|
||||||
Local variables:
|
|
||||||
mode: sgml
|
|
||||||
sgml-omittag:t
|
|
||||||
sgml-shorttag:t
|
|
||||||
sgml-minimize-attributes:nil
|
|
||||||
sgml-always-quote-attributes:t
|
|
||||||
sgml-indent-step:2
|
|
||||||
sgml-indent-data:t
|
|
||||||
sgml-parent-document:nil
|
|
||||||
sgml-default-dtd-file:nil
|
|
||||||
sgml-exposed-tags:nil
|
|
||||||
sgml-local-catalogs:nil
|
|
||||||
sgml-local-ecat-files:nil
|
|
||||||
End:
|
|
||||||
-->
|
|
@ -190,14 +190,10 @@ endif
|
|||||||
bin_SCRIPTS = lxc-checkconfig
|
bin_SCRIPTS = lxc-checkconfig
|
||||||
|
|
||||||
EXTRA_DIST = \
|
EXTRA_DIST = \
|
||||||
lxc-ls \
|
|
||||||
lxc-top.lua
|
lxc-top.lua
|
||||||
|
|
||||||
if ENABLE_PYTHON
|
if ENABLE_PYTHON
|
||||||
bin_SCRIPTS += lxc-ls
|
|
||||||
bin_SCRIPTS += lxc-start-ephemeral
|
bin_SCRIPTS += lxc-start-ephemeral
|
||||||
else
|
|
||||||
bin_SCRIPTS += legacy/lxc-ls
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
bin_PROGRAMS = \
|
bin_PROGRAMS = \
|
||||||
|
@ -1,99 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
#
|
|
||||||
# lxc: linux Container library
|
|
||||||
|
|
||||||
# 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
|
|
||||||
|
|
||||||
. @DATADIR@/lxc/lxc.functions
|
|
||||||
|
|
||||||
usage()
|
|
||||||
{
|
|
||||||
echo "usage: $(basename $0) [--active] [--] [LS_OPTIONS...]" >&2
|
|
||||||
}
|
|
||||||
|
|
||||||
help() {
|
|
||||||
usage
|
|
||||||
echo >&2
|
|
||||||
echo "List containers existing on the system." >&2
|
|
||||||
echo >&2
|
|
||||||
echo " --active list active containers" >&2
|
|
||||||
echo " LS_OPTIONS ls command options (see \`ls --help')" >&2
|
|
||||||
}
|
|
||||||
|
|
||||||
get_parent_cgroup()
|
|
||||||
{
|
|
||||||
parent_cgroup=""
|
|
||||||
|
|
||||||
# Obtain a list of hierarchies that contain one or more subsystems
|
|
||||||
hierarchies=$(tail -n +2 /proc/cgroups | cut -f 2)
|
|
||||||
|
|
||||||
# Iterate through the list until a suitable hierarchy is found
|
|
||||||
for hierarchy in $hierarchies; do
|
|
||||||
# Obtain information about the init process in the hierarchy
|
|
||||||
fields=$(grep -E "^$hierarchy:" /proc/1/cgroup | head -n 1)
|
|
||||||
if [ -z "$fields" ]; then continue; fi
|
|
||||||
fields=${fields#*:}
|
|
||||||
|
|
||||||
# Get a comma-separated list of the hierarchy's subsystems
|
|
||||||
subsystems=${fields%:*}
|
|
||||||
|
|
||||||
# Get the cgroup of the init process in the hierarchy
|
|
||||||
init_cgroup=${fields#*:}
|
|
||||||
|
|
||||||
# Get the filesystem mountpoint of the hierarchy
|
|
||||||
mountpoint=$(awk -v subsysregex="(^|,)$subsystems(,|\$)" \
|
|
||||||
'$3 == "cgroup" && $4 ~ subsysregex {print $2}' /proc/self/mounts)
|
|
||||||
if [ -z "$mountpoint" ]; then continue; fi
|
|
||||||
|
|
||||||
# Return the absolute path to the containers' parent cgroup
|
|
||||||
# (do not append '/lxc' if the hierarchy contains the 'ns' subsystem)
|
|
||||||
case ",$subsystems," in
|
|
||||||
*,ns,*) parent_cgroup="${mountpoint}${init_cgroup%/}";;
|
|
||||||
*) parent_cgroup="${mountpoint}${init_cgroup%/}/lxc";;
|
|
||||||
esac
|
|
||||||
break
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
directory=$(readlink -f "$lxc_path")
|
|
||||||
|
|
||||||
for i in "$@"; do
|
|
||||||
case $i in
|
|
||||||
--help)
|
|
||||||
help; exit;;
|
|
||||||
--active)
|
|
||||||
get_parent_cgroup; directory="$parent_cgroup"; shift;;
|
|
||||||
--)
|
|
||||||
shift; break;;
|
|
||||||
*)
|
|
||||||
break;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
containers=""
|
|
||||||
if [ ! -z "$directory" ]; then
|
|
||||||
if [ x"$parent_cgroup" = x ]; then
|
|
||||||
containers=$(find -L $directory -mindepth 2 -maxdepth 2 -name config -type f |awk -F "/" '{print $(NF-1)}')
|
|
||||||
else
|
|
||||||
containers=$(find $directory -mindepth 1 -maxdepth 1 -type d 2>/dev/null | sed 's:.*/::')
|
|
||||||
fi
|
|
||||||
if [ x"$containers" = x ]; then
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
cd "$directory"
|
|
||||||
ls -d $@ -- $containers
|
|
@ -1,515 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
#
|
|
||||||
# lxc-ls: List containers
|
|
||||||
#
|
|
||||||
# This python implementation is based on the work done in the original
|
|
||||||
# shell implementation done by Serge Hallyn in Ubuntu (and other contributors)
|
|
||||||
#
|
|
||||||
# (C) Copyright Canonical Ltd. 2012
|
|
||||||
#
|
|
||||||
# Authors:
|
|
||||||
# Stéphane Graber <stgraber@ubuntu.com>
|
|
||||||
#
|
|
||||||
# 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
|
|
||||||
#
|
|
||||||
|
|
||||||
import argparse
|
|
||||||
import gettext
|
|
||||||
import json
|
|
||||||
import lxc
|
|
||||||
import os
|
|
||||||
import re
|
|
||||||
import shutil
|
|
||||||
import tempfile
|
|
||||||
import sys
|
|
||||||
|
|
||||||
_ = gettext.gettext
|
|
||||||
gettext.textdomain("lxc-ls")
|
|
||||||
|
|
||||||
# Required for containers without python
|
|
||||||
import encodings.ascii
|
|
||||||
assert encodings.ascii
|
|
||||||
|
|
||||||
# Constants
|
|
||||||
LXCPATH = "@LXCPATH@"
|
|
||||||
RUNTIME_PATH = "@RUNTIME_PATH@"
|
|
||||||
|
|
||||||
|
|
||||||
# Functions used later on
|
|
||||||
def batch(iterable, cols=1):
|
|
||||||
import math
|
|
||||||
|
|
||||||
length = len(iterable)
|
|
||||||
lines = math.ceil(length / cols)
|
|
||||||
|
|
||||||
for line in range(lines):
|
|
||||||
fields = []
|
|
||||||
for col in range(cols):
|
|
||||||
index = line + (col * lines)
|
|
||||||
if index < length:
|
|
||||||
fields.append(iterable[index])
|
|
||||||
yield fields
|
|
||||||
|
|
||||||
|
|
||||||
def get_terminal_size():
|
|
||||||
import os
|
|
||||||
env = os.environ
|
|
||||||
|
|
||||||
def ioctl_GWINSZ(fd):
|
|
||||||
try:
|
|
||||||
import fcntl
|
|
||||||
import termios
|
|
||||||
import struct
|
|
||||||
cr = struct.unpack('hh', fcntl.ioctl(fd, termios.TIOCGWINSZ,
|
|
||||||
'1234'))
|
|
||||||
return cr
|
|
||||||
except:
|
|
||||||
return
|
|
||||||
|
|
||||||
cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2)
|
|
||||||
if not cr:
|
|
||||||
try:
|
|
||||||
fd = os.open(os.ctermid(), os.O_RDONLY)
|
|
||||||
cr = ioctl_GWINSZ(fd)
|
|
||||||
os.close(fd)
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
|
|
||||||
if not cr:
|
|
||||||
cr = (env.get('LINES', 25), env.get('COLUMNS', 80))
|
|
||||||
|
|
||||||
return int(cr[1]), int(cr[0])
|
|
||||||
|
|
||||||
|
|
||||||
def get_root_path(path):
|
|
||||||
lxc_path = LXCPATH
|
|
||||||
global_conf = "%s/etc/lxc/lxc.conf" % path
|
|
||||||
if os.path.exists(global_conf):
|
|
||||||
with open(global_conf, "r") as fd:
|
|
||||||
for line in fd:
|
|
||||||
if line.startswith("lxc.lxcpath"):
|
|
||||||
lxc_path = line.split("=")[-1].strip()
|
|
||||||
break
|
|
||||||
return lxc_path
|
|
||||||
|
|
||||||
|
|
||||||
# Constants
|
|
||||||
FIELDS = ("name", "state", "interfaces", "ipv4", "ipv6", "autostart", "pid",
|
|
||||||
"memory", "ram", "swap", "groups")
|
|
||||||
DEFAULT_FIELDS = ("name", "state", "ipv4", "ipv6", "groups", "autostart")
|
|
||||||
|
|
||||||
# Begin parsing the command line
|
|
||||||
parser = argparse.ArgumentParser(description=_("LXC: List containers"),
|
|
||||||
formatter_class=argparse.RawTextHelpFormatter,
|
|
||||||
epilog=_("""Valid fancy-format fields:
|
|
||||||
%s
|
|
||||||
|
|
||||||
Default fancy-format fields:
|
|
||||||
%s\n""" % (", ".join(FIELDS), ", ".join(DEFAULT_FIELDS))))
|
|
||||||
|
|
||||||
parser.add_argument("-1", dest="one", action="store_true",
|
|
||||||
help=_("list one container per line (default when piped)"))
|
|
||||||
|
|
||||||
parser.add_argument("-P", "--lxcpath", dest="lxcpath", metavar="PATH",
|
|
||||||
help=_("Use specified container path"),
|
|
||||||
default=lxc.default_config_path)
|
|
||||||
|
|
||||||
parser.add_argument("--active", action="store_true",
|
|
||||||
help=_("list only active containers"))
|
|
||||||
|
|
||||||
parser.add_argument("--frozen", dest="state", action="append_const",
|
|
||||||
const="FROZEN", help=_("list only frozen containers"))
|
|
||||||
|
|
||||||
parser.add_argument("--running", dest="state", action="append_const",
|
|
||||||
const="RUNNING", help=_("list only running containers"))
|
|
||||||
|
|
||||||
parser.add_argument("--stopped", dest="state", action="append_const",
|
|
||||||
const="STOPPED", help=_("list only stopped containers"))
|
|
||||||
|
|
||||||
parser.add_argument("-f", "--fancy", action="store_true",
|
|
||||||
help=_("use fancy output"))
|
|
||||||
|
|
||||||
parser.add_argument("-F", "--fancy-format", type=str,
|
|
||||||
default=",".join(DEFAULT_FIELDS),
|
|
||||||
help=_("comma separated list of fields to show"))
|
|
||||||
|
|
||||||
parser.add_argument("-g", "--groups", type=str, action="append",
|
|
||||||
metavar="GROUPS",
|
|
||||||
help=_("groups (comma separated) the container must "
|
|
||||||
"be a member of"))
|
|
||||||
|
|
||||||
parser.add_argument("--nesting", dest="nesting", action="store_true",
|
|
||||||
help=_("show nested containers"))
|
|
||||||
|
|
||||||
parser.add_argument("filter", metavar='FILTER', type=str, nargs="?",
|
|
||||||
help=_("regexp to be applied on the container list"))
|
|
||||||
|
|
||||||
parser.add_argument("--version", action="version", version=lxc.version)
|
|
||||||
|
|
||||||
args = parser.parse_args()
|
|
||||||
|
|
||||||
# --active is the same as --running --frozen
|
|
||||||
if args.active:
|
|
||||||
if not args.state:
|
|
||||||
args.state = []
|
|
||||||
args.state += ["RUNNING", "FROZEN", "UNKNOWN"]
|
|
||||||
|
|
||||||
# If the output is piped, default to --one
|
|
||||||
if not sys.stdout.isatty():
|
|
||||||
args.one = True
|
|
||||||
|
|
||||||
# Turn args.fancy_format into a list
|
|
||||||
args.fancy_format = args.fancy_format.strip().split(",")
|
|
||||||
|
|
||||||
if set(args.fancy_format) - set(FIELDS):
|
|
||||||
parser.error(_("Invalid field(s): %s" %
|
|
||||||
", ".join(list(set(args.fancy_format) - set(FIELDS)))))
|
|
||||||
|
|
||||||
# Basic checks
|
|
||||||
## Check for setns
|
|
||||||
SUPPORT_SETNS = os.path.exists("/proc/self/ns")
|
|
||||||
SUPPORT_SETNS_NET = False
|
|
||||||
SUPPORT_SETNS_PID = False
|
|
||||||
if SUPPORT_SETNS:
|
|
||||||
SUPPORT_SETNS_NET = os.path.exists("/proc/self/ns/net")
|
|
||||||
SUPPORT_SETNS_PID = os.path.exists("/proc/self/ns/pid")
|
|
||||||
|
|
||||||
## Nesting requires setns to pid and net ns
|
|
||||||
if args.nesting:
|
|
||||||
if not SUPPORT_SETNS:
|
|
||||||
parser.error(_("Showing nested containers requires setns support "
|
|
||||||
"which your kernel doesn't support."))
|
|
||||||
|
|
||||||
if not SUPPORT_SETNS_NET:
|
|
||||||
parser.error(_("Showing nested containers requires setns to the "
|
|
||||||
"network namespace which your kernel doesn't support."))
|
|
||||||
|
|
||||||
if not SUPPORT_SETNS_PID:
|
|
||||||
parser.error(_("Showing nested containers requires setns to the "
|
|
||||||
"PID namespace which your kernel doesn't support."))
|
|
||||||
|
|
||||||
# Set the actual lxcpath value
|
|
||||||
if not args.lxcpath:
|
|
||||||
args.lxcpath = lxc.default_config_path
|
|
||||||
|
|
||||||
|
|
||||||
# List of containers, stored as dictionaries
|
|
||||||
def get_containers(fd=None, base="/", root=False):
|
|
||||||
containers = []
|
|
||||||
|
|
||||||
paths = [args.lxcpath]
|
|
||||||
|
|
||||||
if not root:
|
|
||||||
paths.append(get_root_path(base))
|
|
||||||
|
|
||||||
# Generate a unique list of valid paths
|
|
||||||
paths = set([os.path.normpath("%s/%s" % (base, path)) for path in paths])
|
|
||||||
|
|
||||||
for path in paths:
|
|
||||||
if not os.access(path, os.R_OK):
|
|
||||||
continue
|
|
||||||
|
|
||||||
for container_name in lxc.list_containers(config_path=path):
|
|
||||||
entry = {}
|
|
||||||
entry['name'] = container_name
|
|
||||||
|
|
||||||
# Apply filter
|
|
||||||
if root and args.filter and \
|
|
||||||
not re.match(args.filter, container_name):
|
|
||||||
continue
|
|
||||||
|
|
||||||
# Return before grabbing the object (non-root)
|
|
||||||
if not args.state and not args.fancy and not args.nesting \
|
|
||||||
and not args.groups:
|
|
||||||
containers.append(entry)
|
|
||||||
continue
|
|
||||||
|
|
||||||
try:
|
|
||||||
container = lxc.Container(container_name, path)
|
|
||||||
except:
|
|
||||||
continue
|
|
||||||
|
|
||||||
if args.groups or "autostart" in args.fancy_format \
|
|
||||||
or "groups" in args.fancy_format:
|
|
||||||
try:
|
|
||||||
groups = container.get_config_item("lxc.group")
|
|
||||||
except KeyError:
|
|
||||||
groups = []
|
|
||||||
|
|
||||||
if args.groups:
|
|
||||||
set_has = set(groups)
|
|
||||||
|
|
||||||
for group in args.groups:
|
|
||||||
set_must = set(group.split(","))
|
|
||||||
if not set_must - set_has:
|
|
||||||
break
|
|
||||||
else:
|
|
||||||
continue
|
|
||||||
|
|
||||||
if container.controllable:
|
|
||||||
state = container.state
|
|
||||||
else:
|
|
||||||
state = 'UNKNOWN'
|
|
||||||
|
|
||||||
# Filter by status
|
|
||||||
if args.state and state not in args.state:
|
|
||||||
continue
|
|
||||||
|
|
||||||
# Nothing more is needed if we're not printing some fancy output
|
|
||||||
if not args.fancy and not args.nesting:
|
|
||||||
containers.append(entry)
|
|
||||||
continue
|
|
||||||
|
|
||||||
# Some extra field we may want
|
|
||||||
if 'state' in args.fancy_format:
|
|
||||||
entry['state'] = state
|
|
||||||
|
|
||||||
if 'pid' in args.fancy_format:
|
|
||||||
entry['pid'] = "-"
|
|
||||||
if state == 'UNKNOWN':
|
|
||||||
entry['pid'] = state
|
|
||||||
elif container.init_pid != -1:
|
|
||||||
entry['pid'] = str(container.init_pid)
|
|
||||||
|
|
||||||
if 'groups' in args.fancy_format:
|
|
||||||
entry['groups'] = "-"
|
|
||||||
if len(groups) > 0:
|
|
||||||
entry['groups'] = ", ".join(groups)
|
|
||||||
|
|
||||||
if 'autostart' in args.fancy_format:
|
|
||||||
entry['autostart'] = "NO"
|
|
||||||
try:
|
|
||||||
if container.get_config_item("lxc.start.auto") == "1":
|
|
||||||
if len(groups) > 0:
|
|
||||||
entry['autostart'] = "BY-GROUP"
|
|
||||||
else:
|
|
||||||
entry['autostart'] = "YES"
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
if 'memory' in args.fancy_format or \
|
|
||||||
'ram' in args.fancy_format or \
|
|
||||||
'swap' in args.fancy_format:
|
|
||||||
|
|
||||||
if container.running:
|
|
||||||
try:
|
|
||||||
memory_ram = int(container.get_cgroup_item(
|
|
||||||
"memory.usage_in_bytes"))
|
|
||||||
except:
|
|
||||||
memory_ram = 0
|
|
||||||
|
|
||||||
try:
|
|
||||||
memory_stat = container.get_cgroup_item("memory.stat")
|
|
||||||
beg = memory_stat.find("\nswap ") + 6
|
|
||||||
end = memory_stat[beg:].find("\n") + len(memory_stat[:beg])
|
|
||||||
memory_swap = int(memory_stat[beg:end])
|
|
||||||
except:
|
|
||||||
memory_swap = 0
|
|
||||||
else:
|
|
||||||
memory_ram = 0
|
|
||||||
memory_swap = 0
|
|
||||||
|
|
||||||
memory_total = memory_ram + memory_swap
|
|
||||||
|
|
||||||
if 'memory' in args.fancy_format:
|
|
||||||
if container.running:
|
|
||||||
entry['memory'] = "%sMB" % round(memory_total / 1048576, 2)
|
|
||||||
else:
|
|
||||||
entry['memory'] = "-"
|
|
||||||
|
|
||||||
if 'ram' in args.fancy_format:
|
|
||||||
if container.running:
|
|
||||||
entry['ram'] = "%sMB" % round(memory_ram / 1048576, 2)
|
|
||||||
else:
|
|
||||||
entry['ram'] = "-"
|
|
||||||
|
|
||||||
if 'swap' in args.fancy_format:
|
|
||||||
if container.running:
|
|
||||||
entry['swap'] = "%sMB" % round(memory_swap / 1048576, 2)
|
|
||||||
else:
|
|
||||||
entry['swap'] = "-"
|
|
||||||
|
|
||||||
# Get the IPs
|
|
||||||
for family, protocol in {'inet': 'ipv4', 'inet6': 'ipv6'}.items():
|
|
||||||
if protocol in args.fancy_format:
|
|
||||||
entry[protocol] = "-"
|
|
||||||
|
|
||||||
if state == 'UNKNOWN':
|
|
||||||
entry[protocol] = state
|
|
||||||
continue
|
|
||||||
|
|
||||||
if container.running:
|
|
||||||
if not SUPPORT_SETNS_NET:
|
|
||||||
entry[protocol] = 'UNKNOWN'
|
|
||||||
continue
|
|
||||||
|
|
||||||
ips = container.get_ips(family=family)
|
|
||||||
if ips:
|
|
||||||
entry[protocol] = ", ".join(ips)
|
|
||||||
|
|
||||||
# Get the interfaces
|
|
||||||
if 'interfaces' in args.fancy_format:
|
|
||||||
entry['interfaces'] = "-"
|
|
||||||
|
|
||||||
if state == 'UNKNOWN' or (container.running and
|
|
||||||
not SUPPORT_SETNS_NET):
|
|
||||||
entry['interfaces'] = "UNKNOWN"
|
|
||||||
elif container.running:
|
|
||||||
interfaces = container.get_interfaces()
|
|
||||||
if interfaces:
|
|
||||||
entry['interfaces'] = ", ".join(interfaces)
|
|
||||||
|
|
||||||
# Nested containers
|
|
||||||
if args.nesting:
|
|
||||||
if container.running:
|
|
||||||
# Recursive call in container namespace
|
|
||||||
temp_fd, temp_file = tempfile.mkstemp()
|
|
||||||
os.remove(temp_file)
|
|
||||||
|
|
||||||
container.attach_wait(get_containers, temp_fd)
|
|
||||||
|
|
||||||
json_file = os.fdopen(temp_fd, "r")
|
|
||||||
json_file.seek(0)
|
|
||||||
|
|
||||||
try:
|
|
||||||
sub_containers = json.loads(json_file.read())
|
|
||||||
except:
|
|
||||||
sub_containers = []
|
|
||||||
|
|
||||||
json_file.close()
|
|
||||||
else:
|
|
||||||
def clear_lock():
|
|
||||||
try:
|
|
||||||
lock_path = "%s/lxc/lock/%s/%s" % (RUNTIME_PATH,
|
|
||||||
path,
|
|
||||||
entry['name'])
|
|
||||||
if os.path.exists(lock_path):
|
|
||||||
if os.path.isdir(lock_path):
|
|
||||||
shutil.rmtree(lock_path)
|
|
||||||
else:
|
|
||||||
os.remove(lock_path)
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
|
|
||||||
clear_lock()
|
|
||||||
|
|
||||||
# Recursive call using container rootfs
|
|
||||||
sub_containers = get_containers(
|
|
||||||
base="%s/%s" % (
|
|
||||||
base, container.get_config_item("lxc.rootfs")))
|
|
||||||
|
|
||||||
clear_lock()
|
|
||||||
|
|
||||||
for sub in sub_containers:
|
|
||||||
if 'nesting_parent' not in sub:
|
|
||||||
sub['nesting_parent'] = []
|
|
||||||
sub['nesting_parent'].insert(0, entry['name'])
|
|
||||||
sub['nesting_real_name'] = sub.get('nesting_real_name',
|
|
||||||
sub['name'])
|
|
||||||
sub['name'] = "%s/%s" % (entry['name'], sub['name'])
|
|
||||||
containers.append(sub)
|
|
||||||
|
|
||||||
# Append the container
|
|
||||||
containers.append(entry)
|
|
||||||
|
|
||||||
if fd:
|
|
||||||
json_file = os.fdopen(fd, "w+")
|
|
||||||
json_file.write(json.dumps(containers))
|
|
||||||
return
|
|
||||||
|
|
||||||
return containers
|
|
||||||
|
|
||||||
containers = get_containers(root=True)
|
|
||||||
|
|
||||||
# Print the list
|
|
||||||
## Standard list with one entry per line
|
|
||||||
if not args.fancy and args.one:
|
|
||||||
for container in sorted(containers,
|
|
||||||
key=lambda container: container['name']):
|
|
||||||
print(container['name'])
|
|
||||||
sys.exit(0)
|
|
||||||
|
|
||||||
## Standard list with multiple entries per line
|
|
||||||
if not args.fancy and not args.one:
|
|
||||||
# Get the longest name and extra simple list
|
|
||||||
field_maxlength = 0
|
|
||||||
container_names = []
|
|
||||||
for container in containers:
|
|
||||||
if len(container['name']) > field_maxlength:
|
|
||||||
field_maxlength = len(container['name'])
|
|
||||||
container_names.append(container['name'])
|
|
||||||
|
|
||||||
# Figure out how many we can put per line
|
|
||||||
width = get_terminal_size()[0]
|
|
||||||
|
|
||||||
entries = int(width / (field_maxlength + 2))
|
|
||||||
if entries == 0:
|
|
||||||
entries = 1
|
|
||||||
|
|
||||||
for line in batch(sorted(container_names), entries):
|
|
||||||
line_format = ""
|
|
||||||
for index in range(len(line)):
|
|
||||||
line_format += "{line[%s]:%s}" % (index, field_maxlength + 2)
|
|
||||||
|
|
||||||
print(line_format.format(line=line))
|
|
||||||
|
|
||||||
## Fancy listing
|
|
||||||
if args.fancy:
|
|
||||||
field_maxlength = {}
|
|
||||||
|
|
||||||
# Get the maximum length per field
|
|
||||||
for field in args.fancy_format:
|
|
||||||
field_maxlength[field] = len(field)
|
|
||||||
|
|
||||||
for container in containers:
|
|
||||||
for field in args.fancy_format:
|
|
||||||
if field == 'name' and 'nesting_real_name' in container:
|
|
||||||
fieldlen = len(" " * ((len(container['nesting_parent']) - 1)
|
|
||||||
* 4) + " \_ " + container['nesting_real_name'])
|
|
||||||
if fieldlen > field_maxlength[field]:
|
|
||||||
field_maxlength[field] = fieldlen
|
|
||||||
elif len(container[field]) > field_maxlength[field]:
|
|
||||||
field_maxlength[field] = len(container[field])
|
|
||||||
|
|
||||||
# Generate the line format string based on the maximum length and
|
|
||||||
# a 2 character padding
|
|
||||||
line_format = ""
|
|
||||||
index = 0
|
|
||||||
for field in args.fancy_format:
|
|
||||||
line_format += "{fields[%s]:%s}" % (index, field_maxlength[field] + 2)
|
|
||||||
index += 1
|
|
||||||
|
|
||||||
# Get the line length minus the padding of the last field
|
|
||||||
line_length = -2
|
|
||||||
for field in field_maxlength:
|
|
||||||
line_length += field_maxlength[field] + 2
|
|
||||||
|
|
||||||
# Print header
|
|
||||||
print(line_format.format(fields=[header.upper()
|
|
||||||
for header in args.fancy_format]))
|
|
||||||
print("-" * line_length)
|
|
||||||
|
|
||||||
# Print the entries
|
|
||||||
for container in sorted(containers,
|
|
||||||
key=lambda container: container['name']):
|
|
||||||
fields = []
|
|
||||||
for field in args.fancy_format:
|
|
||||||
if field == 'name' and 'nesting_real_name' in container:
|
|
||||||
prefix = " " * ((len(container['nesting_parent']) - 1) * 4)
|
|
||||||
fields.append(prefix + " \_ " + container['nesting_real_name'])
|
|
||||||
else:
|
|
||||||
fields.append(container[field])
|
|
||||||
|
|
||||||
print(line_format.format(fields=fields))
|
|
@ -291,7 +291,7 @@ int main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
ret = readlink("/proc/self/fd/2", ttyname2, sizeof(ttyname2));
|
ret = readlink("/proc/self/fd/2", ttyname2, sizeof(ttyname2));
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
printf("Warning: unable to open stderr, continueing.");
|
printf("Warning: unable to open stderr, continuing.");
|
||||||
memset(ttyname2, '\0', sizeof(ttyname2));
|
memset(ttyname2, '\0', sizeof(ttyname2));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user