1
0
mirror of https://git.FreeBSD.org/ports.git synced 2024-12-11 02:50:24 +00:00

Prepare split of net-mgmt/ccnet in client / server ports; update to 6.0.6

PR:		215292
Submitted by:	Ultima1252@gmail.com (maintainer)
This commit is contained in:
Thomas Zander 2016-12-25 14:38:34 +00:00
parent 76b7101742
commit bf55d96f5c
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=429432
11 changed files with 486 additions and 0 deletions

View File

@ -28,6 +28,7 @@
SUBDIR += cacti
SUBDIR += cacti-spine
SUBDIR += ccnet
SUBDIR += ccnet-server
SUBDIR += cdpd
SUBDIR += cdpr
SUBDIR += cdpsnarf

View File

@ -0,0 +1,71 @@
# $FreeBSD$
PORTNAME= ccnet-server
PORTVERSION= 6.0.6
DISTVERSIONPREFIX= v
DISTVERSIONSUFFIX= -server
CATEGORIES= net-mgmt devel
MAINTAINER= ultima1252@gmail.com
COMMENT= Internal communication framework for Seafile server
LICENSE= GPLv3
LICENSE_FILE= ${WRKSRC}/LICENSE.txt
BUILD_DEPENDS= valac:lang/vala
LIB_DEPENDS= libsearpc.so:devel/libsearpc \
libglib-2.0.so:devel/glib20 \
libsqlite3.so:databases/sqlite3 \
libzdb.so:databases/libzdb \
libuuid.so:misc/e2fsprogs-libuuid \
libevent.so:devel/libevent2 \
libjansson.so:devel/jansson \
libldap.so:net/openldap24-client
CONFLICT= ccnet-[0-9]*
USE_GITHUB= yes
GH_ACCOUNT= haiwen
USES= autoreconf gettext libtool localbase mysql:client \
pathfix pgsql pkgconfig python:-2.7 shebangfix ssl
USE_LDCONFIG= yes
SHEBANG_FILES= tools/*.py
PATHFIX_MAKEFILEIN= Makefile.am
CONFIGURE_ENV= SSL_CFLAGS="${OPENSSLINC}" SSL_LIBS="-L${OPENSSLLIB} -lssl -lcrypto"
GNU_CONFIGURE= yes
CONFIGURE_ARGS+= --enable-ldap
INSTALL_TARGET= install-strip
HAIWENDIR= www/haiwen
SEAFILE_SERVER= ${HAIWENDIR}/seafile-server
SEABIN= ${SEAFILE_SERVER}/seafile/bin
SEALIB= ${SEAFILE_SERVER}/seafile/lib
USERS= seafile
GROUPS= ${USERS}
PLIST_SUB= USERS=${USERS} \
GROUPS=${GROUPS} \
SEAFILE_SERVER=${SEAFILE_SERVER} \
HAIWENDIR=${HAIWENDIR}
.include <bsd.port.options.mk>
.if ${OPSYS} == FreeBSD && ${OSVERSION} < 1000000
WITH_OPENSSL_PORT= yes
.endif
post-install:
@${MKDIR} ${STAGEDIR}${PREFIX}/${SEABIN} ${STAGEDIR}${PREFIX}/${SEALIB}
${INSTALL_PROGRAM} ${STAGEDIR}${PREFIX}/bin/ccnet-init ${STAGEDIR}${PREFIX}/${SEABIN}
${INSTALL_PROGRAM} ${STAGEDIR}${PREFIX}/bin/ccnet-server ${STAGEDIR}${PREFIX}/${SEABIN}
${RM} ${STAGEDIR}${PREFIX}/bin/ccnet-init \
${STAGEDIR}${PREFIX}/bin/ccnet-server
(cd ${STAGEDIR}${PREFIX}/lib && \
${COPYTREE_SHARE} ${PYTHON_VERSION} ${STAGEDIR}${PREFIX}/${SEALIB})
@${RM} -rf ${STAGEDIR}${PREFIX}/lib/${PYTHON_VERSION}
${LN} -s ${PREFIX}/${SEABIN}/ccnet-server ${STAGEDIR}${PREFIX}/bin/
.include <bsd.port.mk>

View File

@ -0,0 +1,3 @@
TIMESTAMP = 1481476651
SHA256 (haiwen-ccnet-server-v6.0.6-server_GH0.tar.gz) = a8bb1cc138d64e535006ae39423ccf1f5e1bdc920a5fbe54769f52d0f5444f02
SIZE (haiwen-ccnet-server-v6.0.6-server_GH0.tar.gz) = 210290

View File

@ -0,0 +1,15 @@
--- Makefile.am.orig 2016-10-05 10:33:03 UTC
+++ Makefile.am
@@ -15,8 +15,12 @@ install-data-local:
if MACOS
sed -i '' -e "s|(DESTDIR)|${DESTDIR}|g" $(pcfiles)
else
+if BSD
+ sed -i '' "s|(DESTDIR)|${PREFIX}|g" $(pcfiles)
+else
${SED} -i "s|(DESTDIR)|${DESTDIR}|g" $(pcfiles)
endif
+endif
dist-hook:
git log --format='%H' -1 > $(distdir)/latest_commit

View File

@ -0,0 +1,78 @@
--- configure.ac.orig 2016-10-05 10:33:03 UTC
+++ configure.ac
@@ -52,8 +52,16 @@ else
AC_MSG_RESULT(no)
fi
+AC_MSG_CHECKING(for BSD)
+if test `uname | grep -e BSD -e DragonFly | wc -l` = "1"; then
+ bbsd=true
+ AC_MSG_RESULT(compile in BSD)
+else
+ AC_MSG_RESULT(no)
+fi
+
AC_MSG_CHECKING(for Linux)
-if test "$bmac" != "true" -a "$bwin32" != "true"; then
+if test "$bmac" != "true" -a "$bwin32" != "true" -a "$bbsd" != "true"; then
blinux=true
AC_MSG_RESULT(compile in linux)
else
@@ -73,6 +81,7 @@ AM_CONDITIONAL([COMPILE_PYTHON], [test "
AM_CONDITIONAL([WIN32], [test "$bwin32" = "true"])
AM_CONDITIONAL([MACOS], [test "$bmac" = "true"])
AM_CONDITIONAL([LINUX], [test "$blinux" = "true"])
+AM_CONDITIONAL([BSD], [test "$bbsd" = "true"])
# check libraries
@@ -132,6 +141,7 @@ if test "$bwin32" = true; then
LIBS=
LIB_RESOLV=
LIB_UUID=-lrpcrt4
+ LIB_KVM=
LIB_IPHLPAPI=-liphlpapi
LIB_SHELL32=-lshell32
LIB_PSAPI=-lpsapi
@@ -144,11 +154,25 @@ elif test "$bmac" = true ; then
LIB_INTL=
LIB_RESOLV=-lresolv
LIB_UUID=
+ LIB_KVM=
LIB_IPHLPAPI=
LIB_SHELL32=
LIB_PSAPI=
MSVC_CFLAGS=
LIB_DIRWATCH="-framework CoreServices"
+elif test "$bbsd" = true ; then
+ LIB_WS32=
+ LIB_GDI32=
+ LIB_RT=
+ LIB_INTL=
+ LIB_RESOLV=
+ LIB_UUID=-luuid
+ LIB_KVM=-lkvm
+ LIB_IPHLPAPI=
+ LIB_SHELL32=
+ LIB_PSAPI=
+ MSVC_CFLAGS=
+ LIB_DIRWATCH=
else
LIB_WS32=
LIB_GDI32=
@@ -156,6 +180,7 @@ else
LIB_INTL=
LIB_RESOLV=-lresolv
LIB_UUID=-luuid
+ LIB_KVM=
LIB_IPHLPAPI=
LIB_SHELL32=
LIB_PSAPI=
@@ -169,6 +194,7 @@ AC_SUBST(LIB_RT)
AC_SUBST(LIB_INTL)
AC_SUBST(LIB_RESOLV)
AC_SUBST(LIB_UUID)
+AC_SUBST(LIB_KVM)
AC_SUBST(LIB_IPHLPAPI)
AC_SUBST(LIB_SHELL32)
AC_SUBST(LIB_PSAPI)

View File

@ -0,0 +1,10 @@
--- lib/Makefile.am.orig 2016-10-20 15:27:27 UTC
+++ lib/Makefile.am
@@ -61,6 +61,7 @@ libccnetd_la_SOURCES = utils.c db.c job-
libccnetd_la_LDFLAGS = -no-undefined
libccnetd_la_LIBADD = @GLIB2_LIBS@ @GOBJECT_LIBS@ @SSL_LIBS@ @LIB_GDI32@ \
-lsqlite3 @LIBEVENT_LIBS@ @LIB_WS32@ @LIB_UUID@ \
+ @LIB_KVM@ \
@LIB_SHELL32@ @LIB_PSAPI@ @SEARPC_LIBS@

View File

@ -0,0 +1,14 @@
--- lib/net.c.orig 2016-10-05 10:33:03 UTC
+++ lib/net.c
@@ -152,7 +152,11 @@ ccnet_net_bind_tcp (int port, int nonblo
snprintf (buf, sizeof(buf), "%d", port);
+#if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__NetBSD__) || defined(__OpenBSD__)
+ if ( (n = getaddrinfo("0.0.0.0", buf, &hints, &res) ) != 0) {
+#else
if ( (n = getaddrinfo(NULL, buf, &hints, &res) ) != 0) {
+#endif
ccnet_warning ("getaddrinfo fails: %s\n", gai_strerror(n));
return -1;
}

View File

@ -0,0 +1,194 @@
--- lib/utils.c.orig 2016-10-05 10:33:03 UTC
+++ lib/utils.c
@@ -43,6 +43,16 @@
#include <event2/util.h>
+#if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__NetBSD__) || defined(__OpenBSD__)
+#include <netinet/in.h>
+#include <stdlib.h>
+#include <kvm.h>
+#include <paths.h>
+#include <sys/param.h>
+#include <sys/sysctl.h>
+#include <sys/user.h>
+#endif
+
extern int inet_pton(int af, const char *src, void *dst);
@@ -1469,14 +1479,20 @@ get_argv_utf8 (int *argc)
}
#endif /* ifdef WIN32 */
-#ifdef __linux__
+
/* read the link of /proc/123/exe and compare with `process_name' */
static int
-find_process_in_dirent(struct dirent *dir, const char *process_name)
+find_process_in_dirent_procfs(struct dirent *dir, const char *process_name)
{
char path[512];
/* fisrst construct a path like /proc/123/exe */
+#if defined(__linux__)
if (sprintf (path, "/proc/%s/exe", dir->d_name) < 0) {
+#elif defined(__FreeBSD__) || defined(__DragonFly__) || defined(__NetBSD__)
+ if (sprintf (path, "/proc/%s/file", dir->d_name) < 0) {
+#else
+ if (1) {
+#endif
return -1;
}
@@ -1500,7 +1516,8 @@ find_process_in_dirent(struct dirent *di
}
/* read the /proc fs to determine whether some process is running */
-gboolean process_is_running (const char *process_name)
+static gboolean
+process_is_running_procfs (const char *process_name)
{
DIR *proc_dir = opendir("/proc");
if (!proc_dir) {
@@ -1514,7 +1531,7 @@ gboolean process_is_running (const char
/* /proc/[1-9][0-9]* */
if (first > '9' || first < '1')
continue;
- int pid = find_process_in_dirent(subdir, process_name);
+ int pid = find_process_in_dirent_procfs(subdir, process_name);
if (pid > 0) {
closedir(proc_dir);
return TRUE;
@@ -1524,6 +1541,18 @@ gboolean process_is_running (const char
closedir(proc_dir);
return FALSE;
}
+
+#ifdef __linux__
+static int
+find_process_in_dirent(struct dirent *dir, const char *process_name)
+{
+ return find_process_in_dirent_procfs(dir, process_name);
+}
+
+gboolean
+process_is_running (const char *process_name) {
+ return process_is_running_procfs(process_name);
+}
#endif
#ifdef __APPLE__
@@ -1534,6 +1563,113 @@ gboolean process_is_running (const char
}
#endif
+#if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__NetBSD__) || defined(__OpenBSD__)
+#if defined(__FreeBSD__)
+#if __FreeBSD_version < 1100097
+#define PSKIP(kp) ((kp)->ki_pid == mypid || \
+ (!kthreads && ((kp)->ki_flag & P_KTHREAD) != 0))
+#else
+#define PSKIP(kp) ((kp)->ki_pid == mypid || \
+ (!kthreads && ((kp)->ki_flag & P_KPROC) != 0))
+#endif
+#define KVM_OPENFILES(exec, coref, buf) \
+ kvm_openfiles(exec, coref, NULL, O_RDONLY, buf)
+#define KVM_GETPROCS(kd, plist, nproc) \
+ kvm_getprocs(kd, KERN_PROC_PROC, 0, &nproc)
+
+#elif defined(__DragonFly__)
+#define PSKIP(kp) ((kp)->kp_pid == mypid || \
+ (!kthreads && ((kp)->kp_flags & P_SYSTEM) != 0))
+#define KVM_OPENFILES(exec, coref, buf) \
+ kvm_openfiles(exec, coref, NULL, O_RDONLY, buf)
+#define KVM_GETPROCS(kd, plist, nproc) \
+ kvm_getprocs(kd, KERN_PROC_ALL, 0, &nproc)
+
+#elif defined(__NetBSD__)
+#define PSKIP(kp) ((kp)->kp_pid == mypid || \
+ ((kp)->p_flag & P_SYSTEM) != 0)
+#define KVM_OPENFILES(exec, coref, buf) \
+ kvm_openfiles(exec, coref, NULL, KVM_NO_FILES, buf)
+#define KVM_GETPROCS(kd, plist, nproc) \
+ kvm_getprocs(kd, KERN_PROC_ALL, 0, sizeof(*plist), &nproc)
+
+#elif defined(__OpenBSD__)
+#define PSKIP(kp) ((kp)->kp_pid == mypid || \
+ ((kp)->p_flag & (P_SYSTEM | P_THREAD)) != 0)
+#define KVM_OPENFILES(exec, coref, buf) \
+ kvm_openfiles(exec, coref, NULL, KVM_NO_FILES, buf)
+#define KVM_GETPROCS(kd, plist, nproc) \
+ kvm_getprocs(kd, KERN_PROC_ALL, 0, sizeof(*plist), &nproc)
+
+#else
+#define PSKIP(kp) 0
+#define KVM_OPENFILES(exec, coref, buf) 0
+#define KVM_GETPROCS(kd, plist, nproc) 0
+#endif
+
+#define WITH_PROC_FS g_file_test("/proc/curproc", G_FILE_TEST_EXISTS)
+
+static int
+count_running_process_kvm(const char *process_name) {
+
+ static kvm_t *kd;
+ static struct kinfo_proc *plist;
+ static int nproc;
+ static pid_t mypid;
+ static int kthreads;
+
+ char buf[_POSIX2_LINE_MAX];
+ const char * execf, *coref;
+ char **pargv;
+ int i, selected_nproc;
+ struct kinfo_proc *kp;
+
+ selected_nproc = 0;
+ execf = NULL;
+ coref = _PATH_DEVNULL;
+
+ mypid = getpid();
+ kd = KVM_OPENFILES(execf, coref, buf);
+ if (kd == NULL) {
+ fprintf(stderr, "Error: Cannot open kernel files (%s)", buf);
+ exit(1);
+ }
+
+ plist = KVM_GETPROCS(kd, plist, nproc);
+ if (plist == NULL) {
+ fprintf(stderr, "Error: Cannot get process list (%s)", kvm_geterr(kd));
+ exit(1);
+ }
+
+ for(i = 0, kp = plist; i < nproc; i++, kp++) {
+ if (PSKIP(kp)) {
+ continue;
+ }
+ if ((pargv = kvm_getargv(kd, kp, 0)) != NULL) {
+ if (strstr(pargv[0], process_name) != NULL) {
+ selected_nproc += 1;
+ }
+ }
+ }
+ kvm_close(kd);
+ kvm_close(kd);
+
+ return selected_nproc;
+}
+
+gboolean
+process_is_running(const char * process_name) {
+ if (WITH_PROC_FS) {
+ return process_is_running_procfs(process_name);
+ }
+ if (count_running_process_kvm(process_name) > 0) {
+ return TRUE;
+ } else {
+ return FALSE;
+ }
+}
+#endif
+
char*
ccnet_object_type_from_id (const char *object_id)
{

View File

@ -0,0 +1,11 @@
--- net/common/getgateway.c.orig 2016-10-05 10:33:03 UTC
+++ net/common/getgateway.c
@@ -34,7 +34,7 @@
#undef USE_SYSCTL_NET_ROUTE
#endif
-#ifdef BSD
+#if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__NetBSD__) || defined(__OpenBSD__)
#undef USE_PROC_NET_ROUTE
#define USE_SOCKET_ROUTE
#undef USE_SYSCTL_NET_ROUTE

View File

@ -0,0 +1,7 @@
Ccnet is a framework for writing networked applications in C. It provides
the services of peer identification, connection management, service
invocation, and message sending. In ccnet network, there are two types of
nodes, i.e., client and server. Server has the following functions, User
management, Group management.
WWW: https://github.com/haiwen/ccnet-server

View File

@ -0,0 +1,82 @@
bin/ccnet-server
include/ccnet.h
include/ccnet/async-rpc-proc.h
include/ccnet/ccnet-client.h
include/ccnet/ccnet-object.h
include/ccnet/ccnet-session-base.h
include/ccnet/ccnetrpc-transport.h
include/ccnet/cevent.h
include/ccnet/invoke-service-proc.h
include/ccnet/job-mgr.h
include/ccnet/message.h
include/ccnet/mqclient-proc.h
include/ccnet/option.h
include/ccnet/packet.h
include/ccnet/peer.h
include/ccnet/proc-factory.h
include/ccnet/processor.h
include/ccnet/rpcserver-proc.h
include/ccnet/sendcmd-proc.h
include/ccnet/status-code.h
include/ccnet/threaded-rpcserver-proc.h
include/ccnet/timer.h
include/ccnet/valid-check.h
lib/libccnet.a
lib/libccnet.so
lib/libccnet.so.0
lib/libccnet.so.0.0.0
libdata/pkgconfig/libccnet.pc
%%SEAFILE_SERVER%%/seafile/bin/ccnet-init
%%SEAFILE_SERVER%%/seafile/bin/ccnet-server
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/__init__.py
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/__init__.pyc
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/__init__.pyo
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/async/__init__.py
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/async/__init__.pyc
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/async/__init__.pyo
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/async/async_client.py
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/async/async_client.pyc
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/async/async_client.pyo
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/async/mqclientproc.py
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/async/mqclientproc.pyc
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/async/mqclientproc.pyo
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/async/processor.py
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/async/processor.pyc
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/async/processor.pyo
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/async/rpcserverproc.py
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/async/rpcserverproc.pyc
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/async/rpcserverproc.pyo
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/async/sendcmdproc.py
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/async/sendcmdproc.pyc
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/async/sendcmdproc.pyo
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/async/timer.py
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/async/timer.pyc
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/async/timer.pyo
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/client.py
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/client.pyc
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/client.pyo
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/errors.py
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/errors.pyc
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/errors.pyo
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/message.py
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/message.pyc
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/message.pyo
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/packet.py
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/packet.pyc
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/packet.pyo
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/pool.py
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/pool.pyc
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/pool.pyo
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/rpc.py
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/rpc.pyc
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/rpc.pyo
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/status_code.py
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/status_code.pyc
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/status_code.pyo
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/sync_client.py
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/sync_client.pyc
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/sync_client.pyo
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/utils.py
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/utils.pyc
%%SEAFILE_SERVER%%/seafile/%%PYTHON_SITELIBDIR%%/ccnet/utils.pyo
@dir(%%USERS%%,%%GROUPS%%,755) %%HAIWENDIR%%