--- ipvsadm-1.24.orig/debian/copyright +++ ipvsadm-1.24/debian/copyright @@ -1,51 +1,27 @@ --------------------------------------------------------------------------- +This package was debianized by KiHyeon Seo on +Fri, 23 Nov 2001 23:02:50 +0900. -ipvsadm - Version 1.14 - 11th January 2001 +It was downloaded from http://www.linux-vs.org/software/index.html -This is free software. See below for details. +Upstream Author: Wensong Zhang -ipvsadm is a utility to administer the IP virtual server services -offered by the Linux kernel with IP virtual server support. -This version of ipvsadm requires IPVS module v0.0.5 for kernel 2.4 or -later. Check out the Linux Virtual Server Project home page on the -World Wide Web: - http://www.LinuxVirtualServer.org/ - or - http://www.Linux-VS.org/ -for the most recent information and original sources about ipvsadm. - -To make, make sure your Linux kernel is already patched with IPVS and -"make menuconfig" or "make xconfig" to setup the right compiling options, -see the README of the virtual server patch for detail, then simply type - make -in the source directory. - -Install to your liking. We suggest the following pathnames: - /sbin/ipvsadm - /usr/man/man8/ipvsadm.8 -This will be done automatically when calling - make install -in the source directory. - - -Wensong Zhang - - --------------------------------------------------------------------------- - -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., 675 Mass Ave, Cambridge, MA 02139, USA. - --------------------------------------------------------------------- +Copyright: + + 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. + +On Debian GNU/Linux systems, the complete text of the GNU General +Public License can be found in `/usr/share/common-licenses/GPL'. --- ipvsadm-1.24.orig/debian/ipvsadm.config +++ ipvsadm-1.24/debian/ipvsadm.config @@ -0,0 +1,76 @@ +#!/bin/sh + +set -e + +. /usr/share/debconf/confmodule || exit 0 + +IPVSADM_CONFIG="/etc/default/ipvsadm" + +db_version 2.0 + +if [ ! -f "/proc/net/ip_vs_conn" ]; then + db_fset ipvsadm/kernel_does_not_support_ipvs seen false + db_input high ipvsadm/kernel_does_not_support_ipvs || true + db_go + exit 0 +fi + +if [ -f $IPVSADM_CONFIG ]; then + . $IPVSADM_CONFIG + + [ -n "$AUTO" ] && db_set ipvsadm/auto_load_rules "$AUTO" + [ -n "$DAEMON" ] && db_set ipvsadm/daemon_method "$DAEMON" + [ -n "$IFACE" ] && db_set ipvsadm/daemon_multicast_interface "$IFACE" +fi + +db_input medium ipvsadm/auto_load_rules || true +db_go + +db_capb backup + +IFACE_ERR="" +STATE=1 +while [ "$STATE" != "0" -a "$STATE" != "4" ]; do + ERRNO=0 + case "$STATE" in + 1) + db_input medium ipvsadm/daemon_method || true + db_go || ERRNO=$? + ;; + 2) + db_get ipvsadm/daemon_method + if [ "$RET" != "none" ]; then + db_input low ipvsadm/daemon_multicast_interface || true + db_go || ERRNO=$? + if [ "$ERRNO" = "0" ]; then + db_get ipvsadm/daemon_multicast_interface + if echo "$RET"|egrep -vq "^(fddi|eth)[0-9]+$"; then + case "$LANG" in + ko*) + IFACE_ERR="$RET: ¿Ã¹Ù¸¥ ÀÎÅÍÆäÀ̽º°¡ ¾Æ´Õ´Ï´Ù." + ;; + ""|C|en*|*) + IFACE_ERR="$RET: Bad interface." + ;; + esac + db_subst ipvsadm/daemon_multicast_interface \ + interface_error "$IFACE_ERR" + IFACE_ERR="" + continue + fi + else + db_subst ipvsadm/daemon_multicast_interface \ + interface_error "" + fi + fi + ;; + esac + + if [ "$ERRNO" = "0" ]; then + STATE=$(($STATE + 1)) + else + STATE=$(($STATE - 1)) + fi +done + +db_subst ipvsadm/daemon_multicast_interface interface_error "" --- ipvsadm-1.24.orig/debian/ipvsadm.default +++ ipvsadm-1.24/debian/ipvsadm.default @@ -0,0 +1,7 @@ +# ipvsadm + +# daemon method (none|master|backup) +DAEMON="none" + +# use interface (eth0,eth1...) +IFACE="eth0" --- ipvsadm-1.24.orig/debian/ipvsadm.postrm +++ ipvsadm-1.24/debian/ipvsadm.postrm @@ -0,0 +1,9 @@ +#!/bin/sh + +set -e + +if [ "$1" = "purge" ]; then + rm -f /etc/ipvsadm.rules +fi + +#DEBHELPER# --- ipvsadm-1.24.orig/debian/ipvsadm.prerm +++ ipvsadm-1.24/debian/ipvsadm.prerm @@ -0,0 +1,6 @@ +#!/bin/sh + +set -e + +#DEBHELPER# + --- ipvsadm-1.24.orig/debian/ipvsadm.postinst +++ ipvsadm-1.24/debian/ipvsadm.postinst @@ -0,0 +1,32 @@ +#!/bin/sh + +set -e + +IPVSADM_CONFIG=/etc/default/ipvsadm + +if [ "$1" = "configure" ]; then + if . /usr/share/debconf/confmodule; then + db_version 2.0 + + db_get ipvsadm/auto_load_rules; AUTO="$RET" + db_get ipvsadm/daemon_method; DAEMON="$RET" + db_get ipvsadm/daemon_multicast_interface; IFACE="$RET" + + if [ "$DAEMON" = "none" ]; then + cat > $IPVSADM_CONFIG < $IPVSADM_CONFIG < $IPVSADM_RULES + $IPVSADM -S -n >> $IPVSADM_RULES + echo "Done." +} + +if [ -f $IPVSADM_CONFIG ]; then + . $IPVSADM_CONFIG +fi + +if [ ! -x $IPVSADM ]; then + exit 0 +fi + +if [ ! -f "/proc/net/ip_vs_conn" ]; then + echo "Kernel does not support IPVS!" + exit 0 +fi + +if [ ! -f $IPVSADM_RULES ]; then + echo "# ipvsadm.rules" > $IPVSADM_RULES +fi + +case "$1" in + start) + if [ "$AUTO" = "true" ]; then + flush + load + fi + start + ;; + stop) + stop + if [ "$AUTO" = "true" ]; then + save + flush + fi + ;; + restart) + stop + if [ "$AUTO" = "true" ]; then + flush + load + fi + start + ;; + reload|force-reload) + if [ "$AUTO" = "true" ]; then + flush + load + fi + ;; + status) + ipvsadm -L -n + ;; + rate) + ipvsadm -L --rate -n + ;; + load) + flush + load + ;; + save) + save + ;; + *) + echo "Usage: $0 + {start|stop|restart|status|rate|load|save|reload|force-reload}" + exit 1 + ;; +esac + +exit 0 --- ipvsadm-1.24.orig/debian/include/net/ip_vs.h +++ ipvsadm-1.24/debian/include/net/ip_vs.h @@ -0,0 +1,999 @@ +/* + * IP Virtual Server + * data structure and functionality definitions + */ + +#ifndef _IP_VS_H +#define _IP_VS_H + +#include /* For __uXX types */ + +#define IP_VS_VERSION_CODE 0x010200 +#define NVERSION(version) \ + (version >> 16) & 0xFF, \ + (version >> 8) & 0xFF, \ + version & 0xFF + +/* + * Virtual Service Flags + */ +#define IP_VS_SVC_F_PERSISTENT 0x0001 /* persistent port */ +#define IP_VS_SVC_F_HASHED 0x0002 /* hashed entry */ + +/* + * Destination Server Flags + */ +#define IP_VS_DEST_F_AVAILABLE 0x0001 /* server is available */ +#define IP_VS_DEST_F_OVERLOAD 0x0002 /* server is overloaded */ + +/* + * IPVS sync daemon states + */ +#define IP_VS_STATE_NONE 0x0000 /* daemon is stopped */ +#define IP_VS_STATE_MASTER 0x0001 /* started as master */ +#define IP_VS_STATE_BACKUP 0x0002 /* started as backup */ + +/* + * IPVS socket options + */ +#define IP_VS_BASE_CTL (64+1024+64) /* base */ + +#define IP_VS_SO_SET_NONE IP_VS_BASE_CTL /* just peek */ +#define IP_VS_SO_SET_INSERT (IP_VS_BASE_CTL+1) +#define IP_VS_SO_SET_ADD (IP_VS_BASE_CTL+2) +#define IP_VS_SO_SET_EDIT (IP_VS_BASE_CTL+3) +#define IP_VS_SO_SET_DEL (IP_VS_BASE_CTL+4) +#define IP_VS_SO_SET_FLUSH (IP_VS_BASE_CTL+5) +#define IP_VS_SO_SET_LIST (IP_VS_BASE_CTL+6) +#define IP_VS_SO_SET_ADDDEST (IP_VS_BASE_CTL+7) +#define IP_VS_SO_SET_DELDEST (IP_VS_BASE_CTL+8) +#define IP_VS_SO_SET_EDITDEST (IP_VS_BASE_CTL+9) +#define IP_VS_SO_SET_TIMEOUT (IP_VS_BASE_CTL+10) +#define IP_VS_SO_SET_STARTDAEMON (IP_VS_BASE_CTL+11) +#define IP_VS_SO_SET_STOPDAEMON (IP_VS_BASE_CTL+12) +#define IP_VS_SO_SET_RESTORE (IP_VS_BASE_CTL+13) +#define IP_VS_SO_SET_SAVE (IP_VS_BASE_CTL+14) +#define IP_VS_SO_SET_ZERO (IP_VS_BASE_CTL+15) +#define IP_VS_SO_SET_MAX IP_VS_SO_SET_ZERO + +#define IP_VS_SO_GET_VERSION IP_VS_BASE_CTL +#define IP_VS_SO_GET_INFO (IP_VS_BASE_CTL+1) +#define IP_VS_SO_GET_SERVICES (IP_VS_BASE_CTL+2) +#define IP_VS_SO_GET_SERVICE (IP_VS_BASE_CTL+3) +#define IP_VS_SO_GET_DESTS (IP_VS_BASE_CTL+4) +#define IP_VS_SO_GET_DEST (IP_VS_BASE_CTL+5) /* not used now */ +#define IP_VS_SO_GET_TIMEOUT (IP_VS_BASE_CTL+6) +#define IP_VS_SO_GET_DAEMON (IP_VS_BASE_CTL+7) +#define IP_VS_SO_GET_MAX IP_VS_SO_GET_DAEMON + + +/* + * IPVS Connection Flags + */ +#define IP_VS_CONN_F_FWD_MASK 0x0007 /* mask for the fwd methods */ +#define IP_VS_CONN_F_MASQ 0x0000 /* masquerading/NAT */ +#define IP_VS_CONN_F_LOCALNODE 0x0001 /* local node */ +#define IP_VS_CONN_F_TUNNEL 0x0002 /* tunneling */ +#define IP_VS_CONN_F_DROUTE 0x0003 /* direct routing */ +#define IP_VS_CONN_F_BYPASS 0x0004 /* cache bypass */ +#define IP_VS_CONN_F_SYNC 0x0020 /* entry created by sync */ +#define IP_VS_CONN_F_HASHED 0x0040 /* hashed entry */ +#define IP_VS_CONN_F_NOOUTPUT 0x0080 /* no output packets */ +#define IP_VS_CONN_F_INACTIVE 0x0100 /* not established */ +#define IP_VS_CONN_F_OUT_SEQ 0x0200 /* must do output seq adjust */ +#define IP_VS_CONN_F_IN_SEQ 0x0400 /* must do input seq adjust */ +#define IP_VS_CONN_F_SEQ_MASK 0x0600 /* in/out sequence mask */ +#define IP_VS_CONN_F_NO_CPORT 0x0800 /* no client port set yet */ + +/* Move it to better place one day, for now keep it unique */ +#define NFC_IPVS_PROPERTY 0x10000 + +#define IP_VS_SCHEDNAME_MAXLEN 16 +#define IP_VS_IFNAME_MAXLEN 16 + + +/* + * The struct ip_vs_service_user and struct ip_vs_dest_user are + * used to set IPVS rules through setsockopt. + */ +struct ip_vs_service_user { + /* virtual service addresses */ + u_int16_t protocol; + u_int32_t addr; /* virtual ip address */ + u_int16_t port; + u_int32_t fwmark; /* firwall mark of service */ + + /* virtual service options */ + char sched_name[IP_VS_SCHEDNAME_MAXLEN]; + unsigned flags; /* virtual service flags */ + unsigned timeout; /* persistent timeout in sec */ + u_int32_t netmask; /* persistent netmask */ +}; + + +struct ip_vs_dest_user { + /* destination server address */ + u_int32_t addr; + u_int16_t port; + + /* real server options */ + unsigned conn_flags; /* connection flags */ + int weight; /* destination weight */ + + /* thresholds for active connections */ + u_int32_t u_threshold; /* upper threshold */ + u_int32_t l_threshold; /* lower threshold */ +}; + + +/* + * IPVS statistics object (for user space) + */ +struct ip_vs_stats_user +{ + __u32 conns; /* connections scheduled */ + __u32 inpkts; /* incoming packets */ + __u32 outpkts; /* outgoing packets */ + __u64 inbytes; /* incoming bytes */ + __u64 outbytes; /* outgoing bytes */ + + __u32 cps; /* current connection rate */ + __u32 inpps; /* current in packet rate */ + __u32 outpps; /* current out packet rate */ + __u32 inbps; /* current in byte rate */ + __u32 outbps; /* current out byte rate */ +}; + + +/* The argument to IP_VS_SO_GET_INFO */ +struct ip_vs_getinfo { + /* version number */ + unsigned int version; + + /* size of connection hash table */ + unsigned int size; + + /* number of virtual services */ + unsigned int num_services; +}; + + +/* The argument to IP_VS_SO_GET_SERVICE */ +struct ip_vs_service_entry { + /* which service: user fills in these */ + u_int16_t protocol; + u_int32_t addr; /* virtual address */ + u_int16_t port; + u_int32_t fwmark; /* firwall mark of service */ + + /* service options */ + char sched_name[IP_VS_SCHEDNAME_MAXLEN]; + unsigned flags; /* virtual service flags */ + unsigned timeout; /* persistent timeout */ + u_int32_t netmask; /* persistent netmask */ + + /* number of real servers */ + unsigned int num_dests; + + /* statistics */ + struct ip_vs_stats_user stats; +}; + + +struct ip_vs_dest_entry { + u_int32_t addr; /* destination address */ + u_int16_t port; + unsigned conn_flags; /* connection flags */ + int weight; /* destination weight */ + + u_int32_t u_threshold; /* upper threshold */ + u_int32_t l_threshold; /* lower threshold */ + + u_int32_t activeconns; /* active connections */ + u_int32_t inactconns; /* inactive connections */ + u_int32_t persistconns; /* persistent connections */ + + /* statistics */ + struct ip_vs_stats_user stats; +}; + + +/* The argument to IP_VS_SO_GET_DESTS */ +struct ip_vs_get_dests { + /* which service: user fills in these */ + u_int16_t protocol; + u_int32_t addr; /* virtual address */ + u_int16_t port; + u_int32_t fwmark; /* firwall mark of service */ + + /* number of real servers */ + unsigned int num_dests; + + /* the real servers */ + struct ip_vs_dest_entry entrytable[0]; +}; + + +/* The argument to IP_VS_SO_GET_SERVICES */ +struct ip_vs_get_services { + /* number of virtual services */ + unsigned int num_services; + + /* service table */ + struct ip_vs_service_entry entrytable[0]; +}; + + +/* The argument to IP_VS_SO_GET_TIMEOUT */ +struct ip_vs_timeout_user { + int tcp_timeout; + int tcp_fin_timeout; + int udp_timeout; +}; + + +/* The argument to IP_VS_SO_GET_DAEMON */ +struct ip_vs_daemon_user { + /* sync daemon state (master/backup) */ + int state; + + /* multicast interface name */ + char mcast_ifn[IP_VS_IFNAME_MAXLEN]; + + /* SyncID we belong to */ + int syncid; +}; + + +#ifdef __KERNEL__ + +#include +#include /* for struct list_head */ +#include /* for struct rwlock_t */ +#include /* for struct sk_buff */ +#include /* for struct iphdr */ +#include /* for struct atomic_t */ +#include /* for struct neighbour */ +#include /* for struct dst_entry */ +#include +#include +#include + + +#ifdef CONFIG_IP_VS_DEBUG +extern int ip_vs_get_debug_level(void); +#define IP_VS_DBG(level, msg...) \ + do { \ + if (level <= ip_vs_get_debug_level()) \ + printk(KERN_DEBUG "IPVS: " msg); \ + } while (0) +#define IP_VS_DBG_RL(msg...) \ + do { \ + if (net_ratelimit()) \ + printk(KERN_DEBUG "IPVS: " msg); \ + } while (0) +#define IP_VS_DBG_PKT(level, pp, skb, ofs, msg) \ + do { \ + if (level <= ip_vs_get_debug_level()) \ + pp->debug_packet(pp, skb, ofs, msg); \ + } while (0) +#define IP_VS_DBG_RL_PKT(level, pp, skb, ofs, msg) \ + do { \ + if (level <= ip_vs_get_debug_level() && \ + net_ratelimit()) \ + pp->debug_packet(pp, skb, ofs, msg); \ + } while (0) +#else /* NO DEBUGGING at ALL */ +#define IP_VS_DBG(level, msg...) do {} while (0) +#define IP_VS_DBG_RL(msg...) do {} while (0) +#define IP_VS_DBG_PKT(level, pp, skb, ofs, msg) do {} while (0) +#define IP_VS_DBG_RL_PKT(level, pp, skb, ofs, msg) do {} while (0) +#endif + +#define IP_VS_BUG() BUG() +#define IP_VS_ERR(msg...) printk(KERN_ERR "IPVS: " msg) +#define IP_VS_INFO(msg...) printk(KERN_INFO "IPVS: " msg) +#define IP_VS_WARNING(msg...) \ + printk(KERN_WARNING "IPVS: " msg) +#define IP_VS_ERR_RL(msg...) \ + do { \ + if (net_ratelimit()) \ + printk(KERN_ERR "IPVS: " msg); \ + } while (0) + +#ifdef CONFIG_IP_VS_DEBUG +#define EnterFunction(level) \ + do { \ + if (level <= ip_vs_get_debug_level()) \ + printk(KERN_DEBUG "Enter: %s, %s line %i\n", \ + __FUNCTION__, __FILE__, __LINE__); \ + } while (0) +#define LeaveFunction(level) \ + do { \ + if (level <= ip_vs_get_debug_level()) \ + printk(KERN_DEBUG "Leave: %s, %s line %i\n", \ + __FUNCTION__, __FILE__, __LINE__); \ + } while (0) +#else +#define EnterFunction(level) do {} while (0) +#define LeaveFunction(level) do {} while (0) +#endif + +#define IP_VS_WAIT_WHILE(expr) while (expr) { cpu_relax(); } + + +/* + * The port number of FTP service (in network order). + */ +#define FTPPORT __constant_htons(21) +#define FTPDATA __constant_htons(20) + +/* + * IPVS sysctl variables under the /proc/sys/net/ipv4/vs/ + */ +#define NET_IPV4_VS 21 + +enum { + NET_IPV4_VS_DEBUG_LEVEL=1, + NET_IPV4_VS_AMEMTHRESH=2, + NET_IPV4_VS_AMDROPRATE=3, + NET_IPV4_VS_DROP_ENTRY=4, + NET_IPV4_VS_DROP_PACKET=5, + NET_IPV4_VS_SECURE_TCP=6, + NET_IPV4_VS_TO_ES=7, + NET_IPV4_VS_TO_SS=8, + NET_IPV4_VS_TO_SR=9, + NET_IPV4_VS_TO_FW=10, + NET_IPV4_VS_TO_TW=11, + NET_IPV4_VS_TO_CL=12, + NET_IPV4_VS_TO_CW=13, + NET_IPV4_VS_TO_LA=14, + NET_IPV4_VS_TO_LI=15, + NET_IPV4_VS_TO_SA=16, + NET_IPV4_VS_TO_UDP=17, + NET_IPV4_VS_TO_ICMP=18, + NET_IPV4_VS_LBLC_EXPIRE=19, + NET_IPV4_VS_LBLCR_EXPIRE=20, + NET_IPV4_VS_CACHE_BYPASS=22, + NET_IPV4_VS_EXPIRE_NODEST_CONN=23, + NET_IPV4_VS_SYNC_THRESHOLD=24, + NET_IPV4_VS_NAT_ICMP_SEND=25, + NET_IPV4_VS_LAST +}; + +/* + * TCP State Values + */ +enum { + IP_VS_TCP_S_NONE = 0, + IP_VS_TCP_S_ESTABLISHED, + IP_VS_TCP_S_SYN_SENT, + IP_VS_TCP_S_SYN_RECV, + IP_VS_TCP_S_FIN_WAIT, + IP_VS_TCP_S_TIME_WAIT, + IP_VS_TCP_S_CLOSE, + IP_VS_TCP_S_CLOSE_WAIT, + IP_VS_TCP_S_LAST_ACK, + IP_VS_TCP_S_LISTEN, + IP_VS_TCP_S_SYNACK, + IP_VS_TCP_S_LAST +}; + +/* + * UDP State Values + */ +enum { + IP_VS_UDP_S_NORMAL, + IP_VS_UDP_S_LAST, +}; + +/* + * ICMP State Values + */ +enum { + IP_VS_ICMP_S_NORMAL, + IP_VS_ICMP_S_LAST, +}; + +/* + * Delta sequence info structure + * Each ip_vs_conn has 2 (output AND input seq. changes). + * Only used in the VS/NAT. + */ +struct ip_vs_seq { + __u32 init_seq; /* Add delta from this seq */ + __u32 delta; /* Delta in sequence numbers */ + __u32 previous_delta; /* Delta in sequence numbers + before last resized pkt */ +}; + + +/* + * IPVS statistics object + */ +struct ip_vs_stats +{ + __u32 conns; /* connections scheduled */ + __u32 inpkts; /* incoming packets */ + __u32 outpkts; /* outgoing packets */ + __u64 inbytes; /* incoming bytes */ + __u64 outbytes; /* outgoing bytes */ + + __u32 cps; /* current connection rate */ + __u32 inpps; /* current in packet rate */ + __u32 outpps; /* current out packet rate */ + __u32 inbps; /* current in byte rate */ + __u32 outbps; /* current out byte rate */ + + spinlock_t lock; /* spin lock */ +}; + +struct ip_vs_conn; +struct ip_vs_app; + +struct ip_vs_protocol { + struct ip_vs_protocol *next; + char *name; + __u16 protocol; + int dont_defrag; + atomic_t appcnt; /* counter of proto app incs */ + int *timeout_table; /* protocol timeout table */ + + void (*init)(struct ip_vs_protocol *pp); + + void (*exit)(struct ip_vs_protocol *pp); + + int (*conn_schedule)(struct sk_buff *skb, + struct ip_vs_protocol *pp, + int *verdict, struct ip_vs_conn **cpp); + + struct ip_vs_conn * + (*conn_in_get)(const struct sk_buff *skb, + struct ip_vs_protocol *pp, + const struct iphdr *iph, + unsigned int proto_off, + int inverse); + + struct ip_vs_conn * + (*conn_out_get)(const struct sk_buff *skb, + struct ip_vs_protocol *pp, + const struct iphdr *iph, + unsigned int proto_off, + int inverse); + + int (*snat_handler)(struct sk_buff **pskb, + struct ip_vs_protocol *pp, struct ip_vs_conn *cp); + + int (*dnat_handler)(struct sk_buff **pskb, + struct ip_vs_protocol *pp, struct ip_vs_conn *cp); + + int (*csum_check)(struct sk_buff *skb, struct ip_vs_protocol *pp); + + const char *(*state_name)(int state); + + int (*state_transition)(struct ip_vs_conn *cp, int direction, + const struct sk_buff *skb, + struct ip_vs_protocol *pp); + + int (*register_app)(struct ip_vs_app *inc); + + void (*unregister_app)(struct ip_vs_app *inc); + + int (*app_conn_bind)(struct ip_vs_conn *cp); + + void (*debug_packet)(struct ip_vs_protocol *pp, + const struct sk_buff *skb, + int offset, + const char *msg); + + void (*timeout_change)(struct ip_vs_protocol *pp, int flags); + + int (*set_state_timeout)(struct ip_vs_protocol *pp, char *sname, int to); +}; + +extern struct ip_vs_protocol * ip_vs_proto_get(unsigned short proto); + +/* + * IP_VS structure allocated for each dynamically scheduled connection + */ +struct ip_vs_conn { + struct list_head c_list; /* hashed list heads */ + + /* Protocol, addresses and port numbers */ + __u32 caddr; /* client address */ + __u32 vaddr; /* virtual address */ + __u32 daddr; /* destination address */ + __u16 cport; + __u16 vport; + __u16 dport; + __u16 protocol; /* Which protocol (TCP/UDP) */ + + /* counter and timer */ + atomic_t refcnt; /* reference count */ + struct timer_list timer; /* Expiration timer */ + volatile unsigned long timeout; /* timeout */ + + /* Flags and state transition */ + spinlock_t lock; /* lock for state transition */ + volatile __u16 flags; /* status flags */ + volatile __u16 state; /* state info */ + + /* Control members */ + struct ip_vs_conn *control; /* Master control connection */ + atomic_t n_control; /* Number of controlled ones */ + struct ip_vs_dest *dest; /* real server */ + atomic_t in_pkts; /* incoming packet counter */ + + /* packet transmitter for different forwarding methods. If it + mangles the packet, it must return NF_DROP or better NF_STOLEN, + otherwise this must be changed to a sk_buff **. + */ + int (*packet_xmit)(struct sk_buff *skb, struct ip_vs_conn *cp, + struct ip_vs_protocol *pp); + + /* Note: we can group the following members into a structure, + in order to save more space, and the following members are + only used in VS/NAT anyway */ + struct ip_vs_app *app; /* bound ip_vs_app object */ + void *app_data; /* Application private data */ + struct ip_vs_seq in_seq; /* incoming seq. struct */ + struct ip_vs_seq out_seq; /* outgoing seq. struct */ +}; + + +/* + * The information about the virtual service offered to the net + * and the forwarding entries + */ +struct ip_vs_service { + struct list_head s_list; /* for normal service table */ + struct list_head f_list; /* for fwmark-based service table */ + atomic_t refcnt; /* reference counter */ + atomic_t usecnt; /* use counter */ + + __u16 protocol; /* which protocol (TCP/UDP) */ + __u32 addr; /* IP address for virtual service */ + __u16 port; /* port number for the service */ + __u32 fwmark; /* firewall mark of the service */ + unsigned flags; /* service status flags */ + unsigned timeout; /* persistent timeout in ticks */ + __u32 netmask; /* grouping granularity */ + + struct list_head destinations; /* real server d-linked list */ + __u32 num_dests; /* number of servers */ + struct ip_vs_stats stats; /* statistics for the service */ + struct ip_vs_app *inc; /* bind conns to this app inc */ + + /* for scheduling */ + struct ip_vs_scheduler *scheduler; /* bound scheduler object */ + rwlock_t sched_lock; /* lock sched_data */ + void *sched_data; /* scheduler application data */ +}; + + +/* + * The real server destination forwarding entry + * with ip address, port number, and so on. + */ +struct ip_vs_dest { + struct list_head n_list; /* for the dests in the service */ + struct list_head d_list; /* for table with all the dests */ + + __u32 addr; /* IP address of the server */ + __u16 port; /* port number of the server */ + volatile unsigned flags; /* dest status flags */ + atomic_t conn_flags; /* flags to copy to conn */ + atomic_t weight; /* server weight */ + + atomic_t refcnt; /* reference counter */ + struct ip_vs_stats stats; /* statistics */ + + /* connection counters and thresholds */ + atomic_t activeconns; /* active connections */ + atomic_t inactconns; /* inactive connections */ + atomic_t persistconns; /* persistent connections */ + __u32 u_threshold; /* upper threshold */ + __u32 l_threshold; /* lower threshold */ + + /* for destination cache */ + spinlock_t dst_lock; /* lock of dst_cache */ + struct dst_entry *dst_cache; /* destination cache entry */ + u32 dst_rtos; /* RT_TOS(tos) for dst */ + + /* for virtual service */ + struct ip_vs_service *svc; /* service it belongs to */ + __u16 protocol; /* which protocol (TCP/UDP) */ + __u32 vaddr; /* virtual IP address */ + __u16 vport; /* virtual port number */ + __u32 vfwmark; /* firewall mark of service */ +}; + + +/* + * The scheduler object + */ +struct ip_vs_scheduler { + struct list_head n_list; /* d-linked list head */ + char *name; /* scheduler name */ + atomic_t refcnt; /* reference counter */ + struct module *module; /* THIS_MODULE/NULL */ + + /* scheduler initializing service */ + int (*init_service)(struct ip_vs_service *svc); + /* scheduling service finish */ + int (*done_service)(struct ip_vs_service *svc); + /* scheduler updating service */ + int (*update_service)(struct ip_vs_service *svc); + + /* selecting a server from the given service */ + struct ip_vs_dest* (*schedule)(struct ip_vs_service *svc, + const struct sk_buff *skb); +}; + + +/* + * The application module object (a.k.a. app incarnation) + */ +struct ip_vs_app +{ + struct list_head a_list; /* member in app list */ + int type; /* IP_VS_APP_TYPE_xxx */ + char *name; /* application module name */ + __u16 protocol; + struct module *module; /* THIS_MODULE/NULL */ + struct list_head incs_list; /* list of incarnations */ + + /* members for application incarnations */ + struct list_head p_list; /* member in proto app list */ + struct ip_vs_app *app; /* its real application */ + __u16 port; /* port number in net order */ + atomic_t usecnt; /* usage counter */ + + /* output hook: return false if can't linearize. diff set for TCP. */ + int (*pkt_out)(struct ip_vs_app *, struct ip_vs_conn *, + struct sk_buff **, int *diff); + + /* input hook: return false if can't linearize. diff set for TCP. */ + int (*pkt_in)(struct ip_vs_app *, struct ip_vs_conn *, + struct sk_buff **, int *diff); + + /* ip_vs_app initializer */ + int (*init_conn)(struct ip_vs_app *, struct ip_vs_conn *); + + /* ip_vs_app finish */ + int (*done_conn)(struct ip_vs_app *, struct ip_vs_conn *); + + + /* not used now */ + int (*bind_conn)(struct ip_vs_app *, struct ip_vs_conn *, + struct ip_vs_protocol *); + + void (*unbind_conn)(struct ip_vs_app *, struct ip_vs_conn *); + + int * timeout_table; + int * timeouts; + int timeouts_size; + + int (*conn_schedule)(struct sk_buff *skb, struct ip_vs_app *app, + int *verdict, struct ip_vs_conn **cpp); + + struct ip_vs_conn * + (*conn_in_get)(const struct sk_buff *skb, struct ip_vs_app *app, + const struct iphdr *iph, unsigned int proto_off, + int inverse); + + struct ip_vs_conn * + (*conn_out_get)(const struct sk_buff *skb, struct ip_vs_app *app, + const struct iphdr *iph, unsigned int proto_off, + int inverse); + + int (*state_transition)(struct ip_vs_conn *cp, int direction, + const struct sk_buff *skb, + struct ip_vs_app *app); + + void (*timeout_change)(struct ip_vs_app *app, int flags); +}; + + +/* + * IPVS core functions + * (from ip_vs_core.c) + */ +extern const char *ip_vs_proto_name(unsigned proto); +extern unsigned int check_for_ip_vs_out(struct sk_buff **skb_p, + int (*okfn)(struct sk_buff *)); +extern void ip_vs_init_hash_table(struct list_head *table, int rows); +#define IP_VS_INIT_HASH_TABLE(t) ip_vs_init_hash_table(t, sizeof(t)/sizeof(t[0])) + +#define IP_VS_APP_TYPE_UNSPEC 0 +#define IP_VS_APP_TYPE_FTP 1 + +/* + * ip_vs_conn handling functions + * (from ip_vs_conn.c) + */ + +/* + * IPVS connection entry hash table + */ +#ifndef CONFIG_IP_VS_TAB_BITS +#define CONFIG_IP_VS_TAB_BITS 12 +#endif +/* make sure that IP_VS_CONN_TAB_BITS is located in [8, 20] */ +#if CONFIG_IP_VS_TAB_BITS < 8 +#define IP_VS_CONN_TAB_BITS 8 +#endif +#if CONFIG_IP_VS_TAB_BITS > 20 +#define IP_VS_CONN_TAB_BITS 20 +#endif +#if 8 <= CONFIG_IP_VS_TAB_BITS && CONFIG_IP_VS_TAB_BITS <= 20 +#define IP_VS_CONN_TAB_BITS CONFIG_IP_VS_TAB_BITS +#endif +#define IP_VS_CONN_TAB_SIZE (1 << IP_VS_CONN_TAB_BITS) +#define IP_VS_CONN_TAB_MASK (IP_VS_CONN_TAB_SIZE - 1) + +enum { + IP_VS_DIR_INPUT = 0, + IP_VS_DIR_OUTPUT, + IP_VS_DIR_INPUT_ONLY, + IP_VS_DIR_LAST, +}; + +extern struct ip_vs_conn *ip_vs_conn_in_get +(int protocol, __u32 s_addr, __u16 s_port, __u32 d_addr, __u16 d_port); +extern struct ip_vs_conn *ip_vs_conn_out_get +(int protocol, __u32 s_addr, __u16 s_port, __u32 d_addr, __u16 d_port); + +/* put back the conn without restarting its timer */ +static inline void __ip_vs_conn_put(struct ip_vs_conn *cp) +{ + atomic_dec(&cp->refcnt); +} +extern void ip_vs_conn_put(struct ip_vs_conn *cp); +extern void ip_vs_conn_fill_cport(struct ip_vs_conn *cp, __u16 cport); + +extern struct ip_vs_conn * +ip_vs_conn_new(int proto, __u32 caddr, __u16 cport, __u32 vaddr, __u16 vport, + __u32 daddr, __u16 dport, unsigned flags, + struct ip_vs_dest *dest); +extern void ip_vs_conn_expire_now(struct ip_vs_conn *cp); + +extern const char * ip_vs_state_name(__u16 proto, int state); + +extern void ip_vs_tcp_conn_listen(struct ip_vs_conn *cp); +extern int ip_vs_check_template(struct ip_vs_conn *ct); +extern void ip_vs_secure_tcp_set(int on); +extern void ip_vs_random_dropentry(void); +extern int ip_vs_conn_init(void); +extern void ip_vs_conn_cleanup(void); + +static inline void ip_vs_control_del(struct ip_vs_conn *cp) +{ + struct ip_vs_conn *ctl_cp = cp->control; + if (!ctl_cp) { + IP_VS_ERR("request control DEL for uncontrolled: " + "%d.%d.%d.%d:%d to %d.%d.%d.%d:%d\n", + NIPQUAD(cp->caddr),ntohs(cp->cport), + NIPQUAD(cp->vaddr),ntohs(cp->vport)); + return; + } + + IP_VS_DBG(7, "DELeting control for: " + "cp.dst=%d.%d.%d.%d:%d ctl_cp.dst=%d.%d.%d.%d:%d\n", + NIPQUAD(cp->caddr),ntohs(cp->cport), + NIPQUAD(ctl_cp->caddr),ntohs(ctl_cp->cport)); + + cp->control = NULL; + if (atomic_read(&ctl_cp->n_control) == 0) { + IP_VS_ERR("BUG control DEL with n=0 : " + "%d.%d.%d.%d:%d to %d.%d.%d.%d:%d\n", + NIPQUAD(cp->caddr),ntohs(cp->cport), + NIPQUAD(cp->vaddr),ntohs(cp->vport)); + return; + } + atomic_dec(&ctl_cp->n_control); +} + +static inline void +ip_vs_control_add(struct ip_vs_conn *cp, struct ip_vs_conn *ctl_cp) +{ + if (cp->control) { + IP_VS_ERR("request control ADD for already controlled: " + "%d.%d.%d.%d:%d to %d.%d.%d.%d:%d\n", + NIPQUAD(cp->caddr),ntohs(cp->cport), + NIPQUAD(cp->vaddr),ntohs(cp->vport)); + ip_vs_control_del(cp); + } + + IP_VS_DBG(7, "ADDing control for: " + "cp.dst=%d.%d.%d.%d:%d ctl_cp.dst=%d.%d.%d.%d:%d\n", + NIPQUAD(cp->caddr),ntohs(cp->cport), + NIPQUAD(ctl_cp->caddr),ntohs(ctl_cp->cport)); + + cp->control = ctl_cp; + atomic_inc(&ctl_cp->n_control); +} + + +/* + * IPVS application functions + * (from ip_vs_app.c) + */ +#define IP_VS_APP_MAX_PORTS 8 +extern int register_ip_vs_app(struct ip_vs_app *app); +extern void unregister_ip_vs_app(struct ip_vs_app *app); +extern int ip_vs_bind_app(struct ip_vs_conn *cp, struct ip_vs_protocol *pp); +extern void ip_vs_unbind_app(struct ip_vs_conn *cp); +extern int +register_ip_vs_app_inc(struct ip_vs_app *app, __u16 proto, __u16 port); +extern int ip_vs_app_inc_get(struct ip_vs_app *inc); +extern void ip_vs_app_inc_put(struct ip_vs_app *inc); + +extern int ip_vs_app_pkt_out(struct ip_vs_conn *, struct sk_buff **pskb); +extern int ip_vs_app_pkt_in(struct ip_vs_conn *, struct sk_buff **pskb); +extern int ip_vs_skb_replace(struct sk_buff *skb, int pri, + char *o_buf, int o_len, char *n_buf, int n_len); +extern int ip_vs_app_init(void); +extern void ip_vs_app_cleanup(void); + + +/* + * IPVS protocol functions (from ip_vs_proto.c) + */ +extern int ip_vs_protocol_init(void); +extern void ip_vs_protocol_cleanup(void); +extern void ip_vs_protocol_timeout_change(int flags); +extern int *ip_vs_create_timeout_table(int *table, int size); +extern int +ip_vs_set_state_timeout(int *table, int num, char **names, char *name, int to); +extern void +ip_vs_tcpudp_debug_packet(struct ip_vs_protocol *pp, const struct sk_buff *skb, + int offset, const char *msg); + +extern struct ip_vs_protocol ip_vs_protocol_tcp; +extern struct ip_vs_protocol ip_vs_protocol_udp; +extern struct ip_vs_protocol ip_vs_protocol_icmp; +extern struct ip_vs_protocol ip_vs_protocol_esp; +extern struct ip_vs_protocol ip_vs_protocol_ah; + + +/* + * Registering/unregistering scheduler functions + * (from ip_vs_sched.c) + */ +extern int register_ip_vs_scheduler(struct ip_vs_scheduler *scheduler); +extern int unregister_ip_vs_scheduler(struct ip_vs_scheduler *scheduler); +extern int ip_vs_bind_scheduler(struct ip_vs_service *svc, + struct ip_vs_scheduler *scheduler); +extern int ip_vs_unbind_scheduler(struct ip_vs_service *svc); +extern struct ip_vs_scheduler *ip_vs_scheduler_get(const char *sched_name); +extern void ip_vs_scheduler_put(struct ip_vs_scheduler *scheduler); +extern struct ip_vs_conn * +ip_vs_schedule(struct ip_vs_service *svc, const struct sk_buff *skb); +extern int ip_vs_leave(struct ip_vs_service *svc, struct sk_buff *skb, + struct ip_vs_protocol *pp); + + +/* + * IPVS control data and functions (from ip_vs_ctl.c) + */ +extern int sysctl_ip_vs_cache_bypass; +extern int sysctl_ip_vs_expire_nodest_conn; +extern int sysctl_ip_vs_sync_threshold[2]; +extern int sysctl_ip_vs_nat_icmp_send; +extern struct ip_vs_stats ip_vs_stats; + +extern struct ip_vs_service * +ip_vs_service_get(__u32 fwmark, __u16 protocol, __u32 vaddr, __u16 vport); + +static inline void ip_vs_service_put(struct ip_vs_service *svc) +{ + atomic_dec(&svc->usecnt); +} + +extern struct ip_vs_dest * +ip_vs_lookup_real_service(__u16 protocol, __u32 daddr, __u16 dport); +extern int ip_vs_use_count_inc(void); +extern void ip_vs_use_count_dec(void); +extern int ip_vs_control_init(void); +extern void ip_vs_control_cleanup(void); + + +/* + * IPVS sync daemon data and function prototypes + * (from ip_vs_sync.c) + */ +extern volatile int ip_vs_sync_state; +extern volatile int ip_vs_master_syncid; +extern volatile int ip_vs_backup_syncid; +extern char ip_vs_master_mcast_ifn[IP_VS_IFNAME_MAXLEN]; +extern char ip_vs_backup_mcast_ifn[IP_VS_IFNAME_MAXLEN]; +extern int start_sync_thread(int state, char *mcast_ifn, __u8 syncid); +extern int stop_sync_thread(int state); +extern void ip_vs_sync_conn(struct ip_vs_conn *cp); + + +/* + * IPVS rate estimator prototypes (from ip_vs_est.c) + */ +extern int ip_vs_new_estimator(struct ip_vs_stats *stats); +extern void ip_vs_kill_estimator(struct ip_vs_stats *stats); +extern void ip_vs_zero_estimator(struct ip_vs_stats *stats); + +/* + * Various IPVS packet transmitters (from ip_vs_xmit.c) + */ +extern int ip_vs_null_xmit +(struct sk_buff *skb, struct ip_vs_conn *cp, struct ip_vs_protocol *pp); +extern int ip_vs_bypass_xmit +(struct sk_buff *skb, struct ip_vs_conn *cp, struct ip_vs_protocol *pp); +extern int ip_vs_nat_xmit +(struct sk_buff *skb, struct ip_vs_conn *cp, struct ip_vs_protocol *pp); +extern int ip_vs_tunnel_xmit +(struct sk_buff *skb, struct ip_vs_conn *cp, struct ip_vs_protocol *pp); +extern int ip_vs_dr_xmit +(struct sk_buff *skb, struct ip_vs_conn *cp, struct ip_vs_protocol *pp); +extern int ip_vs_icmp_xmit +(struct sk_buff *skb, struct ip_vs_conn *cp, struct ip_vs_protocol *pp, int offset); +extern void ip_vs_dst_reset(struct ip_vs_dest *dest); + + +/* + * This is a simple mechanism to ignore packets when + * we are loaded. Just set ip_vs_drop_rate to 'n' and + * we start to drop 1/rate of the packets + */ +extern int ip_vs_drop_rate; +extern int ip_vs_drop_counter; + +static __inline__ int ip_vs_todrop(void) +{ + if (!ip_vs_drop_rate) return 0; + if (--ip_vs_drop_counter > 0) return 0; + ip_vs_drop_counter = ip_vs_drop_rate; + return 1; +} + +/* + * ip_vs_fwd_tag returns the forwarding tag of the connection + */ +#define IP_VS_FWD_METHOD(cp) (cp->flags & IP_VS_CONN_F_FWD_MASK) + +extern __inline__ char ip_vs_fwd_tag(struct ip_vs_conn *cp) +{ + char fwd; + + switch (IP_VS_FWD_METHOD(cp)) { + case IP_VS_CONN_F_MASQ: + fwd = 'M'; break; + case IP_VS_CONN_F_LOCALNODE: + fwd = 'L'; break; + case IP_VS_CONN_F_TUNNEL: + fwd = 'T'; break; + case IP_VS_CONN_F_DROUTE: + fwd = 'R'; break; + case IP_VS_CONN_F_BYPASS: + fwd = 'B'; break; + default: + fwd = '?'; break; + } + return fwd; +} + +extern int ip_vs_make_skb_writable(struct sk_buff **pskb, int len); +extern void ip_vs_nat_icmp(struct sk_buff *skb, struct ip_vs_protocol *pp, + struct ip_vs_conn *cp, int dir); + +extern u16 ip_vs_checksum_complete(struct sk_buff *skb, int offset); + +static inline u16 ip_vs_check_diff(u32 old, u32 new, u16 oldsum) +{ + u32 diff[2] = { old, new }; + + return csum_fold(csum_partial((char *) diff, sizeof(diff), + oldsum ^ 0xFFFF)); +} + +#endif /* __KERNEL__ */ + +#endif /* _IP_VS_H */ --- ipvsadm-1.24.orig/debian/watch +++ ipvsadm-1.24/debian/watch @@ -0,0 +1,3 @@ +version=2 +http://www.linux-vs.org/software/kernel-2.6/ipvsadm-(.*)\.tar\.gz + --- ipvsadm-1.24.orig/debian/po/POTFILES.in +++ ipvsadm-1.24/debian/po/POTFILES.in @@ -0,0 +1 @@ +[type: gettext/rfc822deb] ipvsadm.templates --- ipvsadm-1.24.orig/debian/po/templates.pot +++ ipvsadm-1.24/debian/po/templates.pot @@ -0,0 +1,106 @@ +# +# Translators, if you are not familiar with the PO format, gettext +# documentation is worth reading, especially sections dedicated to +# this format, e.g. by running: +# info -n '(gettext)PO Files' +# info -n '(gettext)Header Entry' +# +# Some information specific to po-debconf are available at +# /usr/share/doc/po-debconf/README-trans +# or http://www.debian.org/intl/l10n/po-debconf/README-trans +# +# Developers do not need to manually edit POT or PO files. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2004-08-25 02:58+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: select +#. Choices +#: ../ipvsadm.templates:3 +msgid "none, master, backup" +msgstr "" + +#. Type: select +#. Description +#: ../ipvsadm.templates:5 +msgid "Select a daemon method." +msgstr "" + +#. Type: select +#. Description +#: ../ipvsadm.templates:5 +msgid "" +"ipvsadm can activate the IPVS synchronization daemon. \"master\" starts this " +"daemon in master mode, \"backup\" in backup mode. \"none\" disables the " +"daemon." +msgstr "" + +#. Type: select +#. Description +#: ../ipvsadm.templates:5 +msgid "See the man page for more details, ipvsadm(8)." +msgstr "" + +#. Type: note +#. Description +#: ../ipvsadm.templates:14 +msgid "Kernel does not support IPVS." +msgstr "" + +#. Type: note +#. Description +#: ../ipvsadm.templates:14 +msgid "" +"ipvsadm requires IPVS support in the kernel. Please use a kernel with IPVS " +"modules, otherwise this software is pretty useless." +msgstr "" + +#. Type: boolean +#. Description +#: ../ipvsadm.templates:21 +msgid "Do you want to automatically load IPVS rules on boot?" +msgstr "" + +#. Type: boolean +#. Description +#: ../ipvsadm.templates:21 +msgid "" +"If you choose this option your IPVS rules will be saved to and loaded from /" +"etc/ipvsadm.rules automatically on shutdown resp. boot." +msgstr "" + +#. Type: string +#. Default +#: ../ipvsadm.templates:27 +msgid "eth0" +msgstr "" + +#. Type: string +#. Description +#: ../ipvsadm.templates:28 +msgid "Enter the multicast interface that sync daemon uses." +msgstr "" + +#. Type: string +#. Description +#: ../ipvsadm.templates:28 +msgid "" +"Select the multicast interface to be used by synchronization daemon. e.g. " +"eth0, eth1..." +msgstr "" + +#. Type: string +#. Description +#: ../ipvsadm.templates:28 +msgid "${interface_error}" +msgstr "" --- ipvsadm-1.24.orig/debian/po/de.po +++ ipvsadm-1.24/debian/po/de.po @@ -0,0 +1,116 @@ +# +# Translators, if you are not familiar with the PO format, gettext +# documentation is worth reading, especially sections dedicated to +# this format, e.g. by running: +# info -n '(gettext)PO Files' +# info -n '(gettext)Header Entry' +# +# Some information specific to po-debconf are available at +# /usr/share/doc/po-debconf/README-trans +# or http://www.debian.org/intl/l10n/po-debconf/README-trans +# +# Developers do not need to manually edit POT or PO files. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2004-08-25 02:58+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Joerg Wendland \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: select +#. Choices +#: ../ipvsadm.templates:3 +msgid "none, master, backup" +msgstr "none, master, backup" + +#. Type: select +#. Description +#: ../ipvsadm.templates:5 +msgid "Select a daemon method." +msgstr "Wählen Sie die Art des Daemons" + +#. Type: select +#. Description +#: ../ipvsadm.templates:5 +msgid "" +"ipvsadm can activate the IPVS synchronization daemon. \"master\" starts this " +"daemon in master mode, \"backup\" in backup mode. \"none\" disables the " +"daemon." +msgstr "" +"ipvsadm kann den IPVS Synchronisationsdaemon aktivieren. \"master\" startet " +"diesen Daemon im Master Modus, \"backup\" im Backup Modus. \"none\" " +"deaktiviert den Daemon." + +#. Type: select +#. Description +#: ../ipvsadm.templates:5 +msgid "See the man page for more details, ipvsadm(8)." +msgstr "Für nähere Informantionen lesen Sie die manpage, ipvsadm(8)" + +#. Type: note +#. Description +#: ../ipvsadm.templates:14 +msgid "Kernel does not support IPVS." +msgstr "Der Kernel unterstützt IPVS nicht." + +#. Type: note +#. Description +#: ../ipvsadm.templates:14 +msgid "" +"ipvsadm requires IPVS support in the kernel. Please use a kernel with IPVS " +"modules, otherwise this software is pretty useless." +msgstr "" +"ipvsadm benötigt IPVS Unterstützung im Kernel. Bitte benutzen Sie einen " +"Kernel mit IPVS Modulen, sonst ist diese Software nutzlos." + +#. Type: boolean +#. Description +#: ../ipvsadm.templates:21 +msgid "Do you want to automatically load IPVS rules on boot?" +msgstr "Möchten Sie IPVS Regeln beim Booten automatisch laden?" + +#. Type: boolean +#. Description +#: ../ipvsadm.templates:21 +msgid "" +"If you choose this option your IPVS rules will be saved to and loaded from /" +"etc/ipvsadm.rules automatically on shutdown resp. boot." +msgstr "" +"Wenn Sie dies auswählen, werden Ihre IPVS Regeln beim Herunterfahren " +"automatisch nach /etc/ipvsadm.rules gespeichert und beim Booten von " +"dort automatisch geladen." + +#. Type: string +#. Default +#: ../ipvsadm.templates:27 +msgid "eth0" +msgstr "eth0" + +#. Type: string +#. Description +#: ../ipvsadm.templates:28 +msgid "Enter the multicast interface that sync daemon uses." +msgstr "Geben Sie das Multicast Interface für den Sync Daemon ein." + +#. Type: string +#. Description +#: ../ipvsadm.templates:28 +msgid "" +"Select the multicast interface to be used by synchronization daemon. e.g. " +"eth0, eth1..." +msgstr "" +"Geben Sie das Multicast Interface ein, das vom Synchronisationsdaemon " +"verwendet werden soll, z.B. eth0, eth1 usw." + +#. Type: string +#. Description +#: ../ipvsadm.templates:28 +msgid "${interface_error}" +msgstr "${interface_error}" --- ipvsadm-1.24.orig/debian/po/ko.po +++ ipvsadm-1.24/debian/po/ko.po @@ -0,0 +1,119 @@ +# +# Translators, if you are not familiar with the PO format, gettext +# documentation is worth reading, especially sections dedicated to +# this format, e.g. by running: +# info -n '(gettext)PO Files' +# info -n '(gettext)Header Entry' +# +# Some information specific to po-debconf are available at +# /usr/share/doc/po-debconf/README-trans +# or http://www.debian.org/intl/l10n/po-debconf/README-trans +# +# Developers do not need to manually edit POT or PO files. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2004-08-25 02:58+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=EUC-KR\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: select +#. Choices +#: ../ipvsadm.templates:3 +msgid "none, master, backup" +msgstr "none, master, backup" + +#. Type: select +#. Description +#: ../ipvsadm.templates:5 +msgid "Select a daemon method." +msgstr "´ë¸ó ¹æ½ÄÀ» ¼±ÅÃÇϽʽÿÀ." + +#. Type: select +#. Description +#: ../ipvsadm.templates:5 +msgid "" +"ipvsadm can activate the IPVS synchronization daemon. \"master\" starts this " +"daemon in master mode, \"backup\" in backup mode. \"none\" disables the " +"daemon." +msgstr "" +"ipvsadm´Â Ä¿³ÎÀÇ IPVS µ¿±âÈ­ ´ë¸óÀ» Ȱ¼ºÈ­, ºñȰ¼ºÈ­ ½Ãų ¼ö ÀÖ½À´Ï´Ù. " +"master, backup´Â ±× ¸ðµå·Î ´ë¸óÀ» Ȱ¼ºÈ­ ½Ãŵ´Ï´Ù, ÀÌ ±â´ÉÀÌ ÇÊ¿ä ¾ø´Ù¸é " +"\"none\"À» ¼±ÅÃÇϽʽÿÀ." + +#. Type: select +#. Description +#: ../ipvsadm.templates:5 +msgid "See the man page for more details, ipvsadm(8)." +msgstr "´õ ÀÚ¼¼ÇÑ »çÇ×Àº ¸Ç ÆäÀÌÁö ipvsadm(8)À» ÂüÁ¶ÇϽʽÿÀ." + +#. Type: note +#. Description +#: ../ipvsadm.templates:14 +msgid "Kernel does not support IPVS." +msgstr "Ä¿³ÎÀÌ IPVSÀ» Áö¿øÇÏÁö ¾Ê½À´Ï´Ù." + +#. Type: note +#. Description +#: ../ipvsadm.templates:14 +#, fuzzy +msgid "" +"ipvsadm requires IPVS support in the kernel. Please use a kernel with IPVS " +"modules, otherwise this software is pretty useless." +msgstr "" +"ÀÌ µµ±¸¸¦ ¾²±âÀ§Çؼ­´Â Ä¿³ÎÀÌ IPVS ±â´ÉÀ» Áö¿øÇؾßÇÕ´Ï´Ù. kernel-patch-2.4-" +"ipvs ÆÐŰÁö¸¦ ¼³Ä¡Çϰųª, http://www.linux-vs.org/software/index.html¿¡¼­ ÆÐ" +"Ä¡¸¦ ±¸Çؼ­ Ä¿³Î¿¡ Àû¿ë½ÃŲ ÈÄ, Ä¿³ÎÀ» »õ·Î ºôµåÇØ¾ßÇÕ´Ï´Ù. ¸ðµâ·Î Æ÷ÇÔ½ÃÄ×´Ù" +"¸é ÀûÀçÇϽʽÿÀ." + +#. Type: boolean +#. Description +#: ../ipvsadm.templates:21 +msgid "Do you want to automatically load IPVS rules on boot?" +msgstr "ÃʱâÈ­ ½ºÅ©¸³Æ®¿¡¼­ ÀÚµ¿ ±ÔÄ¢·Îµù ±â´ÉÀ» ¾²°Ú½À´Ï±î?" + +#. Type: boolean +#. Description +#: ../ipvsadm.templates:21 +msgid "" +"If you choose this option your IPVS rules will be saved to and loaded from /" +"etc/ipvsadm.rules automatically on shutdown resp. boot." +msgstr "" +"ÀÌ ±â´ÉÀ» ¾²¸é /etc/ipvsadm.rules¶ó´Â ÆÄÀÏ¿¡ ÀúÀåµÈ ipvs ±ÔÄ¢µéÀ» ÃʱâÈ­ ½ºÅ©" +"¸³Æ®¸¦ ½ÃÀÛÇÒ ¶§. ÀÚµ¿À¸·Î ·ÎµùÇÕ´Ï´Ù. ¸¸¾à ´Ù¸¥ ipvs °ü¸®µµ±¸¸¦ »ç¿ëÇÑ´Ù¸é " +"ÀÌ ±â´ÉÀ» ¾²Áö ¸¶½Ê½Ã¿À." + +#. Type: string +#. Default +#: ../ipvsadm.templates:27 +msgid "eth0" +msgstr "eth0" + +#. Type: string +#. Description +#: ../ipvsadm.templates:28 +msgid "Enter the multicast interface that sync daemon uses." +msgstr "µ¿±âÈ­ ´ë¸óÀÌ »ç¿ëÇÒ ¸ÖƼij½ºÆ® ÀÎÅÍÆäÀ̽º¸¦ ÀÔ·ÂÇϽʽÿÀ." + +#. Type: string +#. Description +#: ../ipvsadm.templates:28 +msgid "" +"Select the multicast interface to be used by synchronization daemon. e.g. " +"eth0, eth1..." +msgstr "" +"µ¿±âÈ­ ´ë¸óÀÌ »ç¿ëÇÒ ¸ÖƼij½ºÆ® ÀÎÅÍÆäÀ̽º¸¦ ÀÔ·ÂÇϽʽÿÀ. ±× ¿¹·Î´Â eth0, " +"eth1, ... µîÀÌ ÀÖ½À´Ï´Ù." + +#. Type: string +#. Description +#: ../ipvsadm.templates:28 +msgid "${interface_error}" +msgstr "${interface_error}" --- ipvsadm-1.24.orig/debian/po/pt_BR.po +++ ipvsadm-1.24/debian/po/pt_BR.po @@ -0,0 +1,120 @@ +# +# Translators, if you are not familiar with the PO format, gettext +# documentation is worth reading, especially sections dedicated to +# this format, e.g. by running: +# info -n '(gettext)PO Files' +# info -n '(gettext)Header Entry' +# +# Some information specific to po-debconf are available at +# /usr/share/doc/po-debconf/README-trans +# or http://www.debian.org/intl/l10n/po-debconf/README-trans +# +# Developers do not need to manually edit POT or PO files. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2004-08-25 02:58+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: select +#. Choices +#: ../ipvsadm.templates:3 +msgid "none, master, backup" +msgstr "none, master, backup" + +#. Type: select +#. Description +#: ../ipvsadm.templates:5 +msgid "Select a daemon method." +msgstr "Selecione um método do daemon." + +#. Type: select +#. Description +#: ../ipvsadm.templates:5 +msgid "" +"ipvsadm can activate the IPVS synchronization daemon. \"master\" starts this " +"daemon in master mode, \"backup\" in backup mode. \"none\" disables the " +"daemon." +msgstr "" +"A ferramenta ipvsadm pode habilitar ou desabilitar a sincronização do daemon " +"IPVS. master e backup ativam o daemon. Caso você não precise disso, escolha " +"\"none\"." + +#. Type: select +#. Description +#: ../ipvsadm.templates:5 +msgid "See the man page for more details, ipvsadm(8)." +msgstr "Leia a página de manual ipvsadm(8) para maiores detalhes." + +#. Type: note +#. Description +#: ../ipvsadm.templates:14 +msgid "Kernel does not support IPVS." +msgstr "Seu kernel atual não suporta IPVS." + +#. Type: note +#. Description +#: ../ipvsadm.templates:14 +#, fuzzy +msgid "" +"ipvsadm requires IPVS support in the kernel. Please use a kernel with IPVS " +"modules, otherwise this software is pretty useless." +msgstr "" +"Para utilizar esta ferramenta seu kernel deve suportar IPVS. Caso você " +"insista em usá-la, você deve instalar o pacote kernel-patch-2.4-ipvs ou " +"aplicar alguns patches obtidos a partir de http://www.linux-vs.org/software/" +"index.html em seu kernel e então reconstruir seu próprio kernel. Carregue o " +"módulo caso o mesmo esteja disponível." + +#. Type: boolean +#. Description +#: ../ipvsadm.templates:21 +msgid "Do you want to automatically load IPVS rules on boot?" +msgstr "Deseja carregar as regras automaticamente no script de inicialização ?" + +#. Type: boolean +#. Description +#: ../ipvsadm.templates:21 +msgid "" +"If you choose this option your IPVS rules will be saved to and loaded from /" +"etc/ipvsadm.rules automatically on shutdown resp. boot." +msgstr "" +"As regras ipvs em /etc/ipvsadm.rules estão sendo automaicamente carregadas " +"quando os scripts de incialização são executados. Caso você utilize uma " +"outra ferramenta de administração, não use esta." + +#. Type: string +#. Default +#: ../ipvsadm.templates:27 +msgid "eth0" +msgstr "eth0" + +#. Type: string +#. Description +#: ../ipvsadm.templates:28 +msgid "Enter the multicast interface that sync daemon uses." +msgstr "Interface multicast usada pelo daemon de sincronização." + +#. Type: string +#. Description +#: ../ipvsadm.templates:28 +msgid "" +"Select the multicast interface to be used by synchronization daemon. e.g. " +"eth0, eth1..." +msgstr "" +"Selecione a interface multicast utilizada na daemon de sincronização. Por " +"exemplor, eth0, eth1, ..." + +#. Type: string +#. Description +#: ../ipvsadm.templates:28 +msgid "${interface_error}" +msgstr "${interface_error}" --- ipvsadm-1.24.orig/debian/ipvsadm.templates +++ ipvsadm-1.24/debian/ipvsadm.templates @@ -0,0 +1,32 @@ +Template: ipvsadm/daemon_method +Type: select +_Choices: none, master, backup +Default: none +_Description: Select a daemon method. + ipvsadm can activate the IPVS synchronization daemon. "master" starts this + daemon in master mode, "backup" in backup mode. "none" disables the + daemon. + . + See the man page for more details, ipvsadm(8). + +Template: ipvsadm/kernel_does_not_support_ipvs +Type: note +_Description: Kernel does not support IPVS. + ipvsadm requires IPVS support in the kernel. Please use a kernel with IPVS + modules, otherwise this software is pretty useless. + +Template: ipvsadm/auto_load_rules +Type: boolean +Default: false +_Description: Do you want to automatically load IPVS rules on boot? + If you choose this option your IPVS rules will be saved to and loaded from + /etc/ipvsadm.rules automatically on shutdown resp. boot. + +Template: ipvsadm/daemon_multicast_interface +Type: string +_Default: eth0 +_Description: Enter the multicast interface that sync daemon uses. + Select the multicast interface to be used by synchronization daemon. e.g. + eth0, eth1... + . + ${interface_error} --- ipvsadm-1.24.orig/debian/compat +++ ipvsadm-1.24/debian/compat @@ -0,0 +1 @@ +4 --- ipvsadm-1.24.orig/debian/rules +++ ipvsadm-1.24/debian/rules @@ -1,64 +1,7 @@ #!/usr/bin/make -f -# Sample debian/rules that uses debhelper. -# GNU copyright 1997 to 1999 by Joey Hess. -export DH_COMPAT=2 -pwd:=$(shell pwd) -cfg:= +include /usr/share/cdbs/1/class/makefile.mk +include /usr/share/cdbs/1/rules/debhelper.mk -build: build-stamp -build-stamp: - dh_testdir - - #test -x autogen.sh && ./autogen.sh $(cfg) || ./configure $(cfg) - - $(MAKE) - - touch build-stamp - -clean: - dh_testdir - dh_testroot - rm -f build-stamp - - -$(MAKE) distclean - - dh_clean - -install: build - dh_testdir - dh_testroot - dh_clean -k - dh_installdirs - - BUILD_ROOT=$(pwd)/debian/tmp make install - - [ ! -d $(pwd)/debian/tmp/etc/init.d/ ] && \ - mkdir -p $(pwd)/debian/tmp/etc/init.d/ - install -c -m 755 ipvsadm.sh $(pwd)/debian/tmp/etc/init.d/ipvsadm - - dh_movefiles --source=debian/tmp - -binary-indep: build install - -binary-arch: build install - dh_testversion 2.0 - dh_testdir - dh_testroot - dh_installdocs - dh_installchangelogs - dh_link - dh_strip - dh_compress - dh_fixperms - dh_suidregister - dh_makeshlibs - dh_installdeb - dh_shlibdeps - dh_gencontrol - dh_md5sums - dh_builddeb - -binary: binary-indep binary-arch -.PHONY: build clean binary-indep binary-arch binary install +CFLAGS=-g -O2 -Wall -I$(CURDIR)/debian/include --- ipvsadm-1.24.orig/debian/ipvsadm.rules +++ ipvsadm-1.24/debian/ipvsadm.rules @@ -0,0 +1 @@ +# empty rules file for ipvsadm --- ipvsadm-1.24.orig/debian/ipvsadm.install +++ ipvsadm-1.24/debian/ipvsadm.install @@ -0,0 +1,4 @@ +ipvsadm sbin +ipvsadm-restore sbin +ipvsadm-save sbin +debian/ipvsadm.rules etc --- ipvsadm-1.24.orig/debian/ipvsadm.manpages +++ ipvsadm-1.24/debian/ipvsadm.manpages @@ -0,0 +1,3 @@ +ipvsadm.8 +ipvsadm-save.8 +ipvsadm-restore.8 --- ipvsadm-1.24.orig/debian/control +++ ipvsadm-1.24/debian/control @@ -1,12 +1,21 @@ Source: ipvsadm Section: net -Priority: optional -Maintainer: Horms -Standards-Version: 3.1.1 +Priority: extra +Maintainer: Joerg Wendland +Standards-Version: 3.6.1.0 +Build-Depends: debhelper (>> 4.0.0), cdbs, libpopt-dev, po-debconf Package: ipvsadm Architecture: any -Depends: ${shlibs:Depends} -Description: - ipvsadm is a utility to administer the IP virtual server services - offered by the Linux kernel augmented with the virtual server patch. +Depends: ${shlibs:Depends}, debconf (>> 0.5.00) +Conflicts: lvs +Replaces: lvs +Suggests: heartbeat, keepalived, ldirectord +Description: Linux Virtual Server support programs + The Linux Virtual Server is a highly scalable and highly available server + built on a cluster of real servers. The architecture of the cluster is + transparent to end users, and the users see only a single virtual server. + . + This package provides some support programs necessary to implement a virtual + server under Linux. With the addition of the mon and heartbeat packages it is + possible to implement a complete high-availability solution for Linux. --- ipvsadm-1.24.orig/debian/changelog +++ ipvsadm-1.24/debian/changelog @@ -1,10 +1,121 @@ -ipvsadm (1.13-1) nstable; urgency=low +ipvsadm (1.24-1) unstable; urgency=low - * A release + * New upstream version. + (closes: Bug#240195) + * New maintainer. Thanks to nefsall maintaining this package + until now. This is a package hijacking. + (closes: Bug#262221) + * debian/rules: + Change build system to CDBS. + * debian/watch: + Added. + * Rework debconf templates and use po-debconf. + (closes: Bug#258719) + * debian/control: + - Remove Suggests: kernel-patch-2.4-ipvs since IPVS is included + in current 2.4 and 2.6 kernels. + - Add Suggests: keepalived for this is an alternative to heartbeat + and features IPVS support. + - Add Build-Depends: po-debconf. + - Bump Standards-Version to 3.6.1.0, no changes required. + * po/de.po: + Add German debconf templates. + * Use newer version of ip_vs.h from 2.6 kernels. + + -- Joerg Wendland Wed, 25 Aug 2004 03:30:24 +0200 + +ipvsadm (1.21release6-1) unstable; urgency=low + + * New Upstream Release. + * Sync header file (ip_vs.h) to IPVS version 1.0.9 (Kernel 2.4.20). + * Added two scheduling algorithms (SED and NQ) to SCHEDULERS. + + -- KiHyeon Seo Fri, 13 Jun 2003 13:09:50 +0900 + +ipvsadm (1.21release4-1) unstable; urgency=low + + * New Upstream Release. + * Sync header file (ip_vs.h) to IPVS version 1.0.8 (Kernel 2.4.20). + + -- KiHyeon Seo Mon, 21 Apr 2003 13:10:20 +0900 + +ipvsadm (1.21release3-1) unstable; urgency=low + + * New Upstream Release. + * Sync header file (ip_vs.h) to IPVS version 1.0.7 (Kernel 2.4.19). + * debian/ipvsadm.templates: Updated. (Thanks, ??? , + closes: #163353) + + -- KiHyeon Seo Thu, 12 Dec 2002 03:11:35 +0900 + +ipvsadm (1.21release2-1) unstable; urgency=low + + * New Upstream Release. + * Sync header file (ip_vs.h) to IPVS version 1.0.5 (Kernel 2.4.19). + + -- KiHyeon Seo Sat, 17 Aug 2002 13:27:49 +0900 + +ipvsadm (1.21release1-1) unstable; urgency=low + + * New Upstream Release. + * Sync header file (ip_vs.h) to IPVS version 1.0.4 (Kernel 2.4.18). + + -- KiHyeon Seo Wed, 24 Jul 2002 01:35:59 +0900 + +ipvsadm (1.20release6-2) unstable; urgency=low + + * debian/ipvsadm.templates: Added Brazilian Portuguese (pt_BR) + translation. (Andre Luis Lopes ) + (closes: #141534) + * Sync header file (ip_vs.h) to IPVS version 1.0.2 (Kernel 2.4.18). + + -- KiHyeon Seo Tue, 9 Apr 2002 12:04:45 +0900 + +ipvsadm (1.20release6-1) unstable; urgency=low + + * New Upstream Release. + * Sync header file (ip_vs.h) to IPVS version 1.0.1 (Kernel 2.4.18). + + -- KiHyeon Seo Thu, 28 Mar 2002 03:14:00 +0900 + +ipvsadm (1.20release5-2) unstable; urgency=low + + * Fixed debian/control, debian/ipvsadm.templates. (Because, Merged + kernel-patch-2.4.*-ipvs to kernel-patch-2.4-ipvs.) + * Sync header file (ip_vs.h) to IPVS version 1.0.0 (Kernel 2.4.18). + + -- KiHyeon Seo Mon, 18 Mar 2002 01:20:13 +0900 + +ipvsadm (1.20release5-1) unstable; urgency=low + + * New Upstream Release. (closes: #71792) + * New Maintainer. (closes: #125779) + * Renamed to ipvsadm. + * Moved patch file to kernel-patch-2.4.x-ipvs. + * Added init script. + * Used debconf. + * Sync header file (ip_vs.h) to IPVS version 0.9.9 (Kernel 2.4.17). + + -- KiHyeon Seo Mon, 4 Mar 2002 03:23:34 +0900 + +lvs (0.9.7-2) unstable; urgency=low + + * Package is orphaned (see bug #114113). Setting maintainer to QA. + * Suggest kernel-source virtual package rather than depending on specific + (now outdated) versions (closes: #71791, #102791). + * debian/copyright: Fix typos and correct upstream URL. + * debian/control: Minor wording improvements to package description. + * Policy version 3.5.6: add build dependencies and implement + DEB_BUILD_OPTIONS. + + -- Colin Watson Mon, 1 Oct 2001 19:43:45 +0100 + +lvs (0.9.7-1) unstable; urgency=low + + * Initial Release. + * Mangled .orig.tar.gz to include patches for both 2.2.13 and 2.2.14 + and gui for ipvsadm (lvs-gui.) + + -- Federico Di Gregorio Wed, 26 Jan 2000 16:12:55 +0100 - -- Horms Thu, 14 Dec 2000 17:00:00 -0800 -Local variables: -mode: debian-changelog -End: -eoch