backend/satellite_tools
by Milan Zazrivec
backend/satellite_tools/exporter/exportLib.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
New commits:
commit 144791cf1c60ffe99a6f14fa58df07f1e366504e
Author: Milan Zazrivec <mzazrivec(a)redhat.com>
Date: Tue Mar 29 12:16:55 2011 +0200
688626 - export md5 attribute also for objects without a checksum
This is to make sure older satellite-sync versions are able to import
the rhn-package-file without a checksum (symlink, directory) correctly.
diff --git a/backend/satellite_tools/exporter/exportLib.py b/backend/satellite_tools/exporter/exportLib.py
index dd8d15e..40e795f 100644
--- a/backend/satellite_tools/exporter/exportLib.py
+++ b/backend/satellite_tools/exporter/exportLib.py
@@ -864,7 +864,7 @@ class _PackageFilesDumper(BaseDumper):
data['mtime'] = _dbtime2timestamp(data['mtime'])
data['checksum-type'] = data['checksum-type'] or ""
data['checksum'] = data['checksum'] or ""
- if data['checksum-type'] == 'md5':
+ if data['checksum-type'] in ('md5', ''):
# generate md5="..." attribute
# for compatibility with older satellites
data['md5'] = data['checksum']
13 years
java/code
by Tomas Lestach
java/code/src/com/redhat/rhn/domain/config/ConfigurationFactory.java | 13 +++++++---
1 file changed, 10 insertions(+), 3 deletions(-)
New commits:
commit ce2ab2d821d57702769c8205ad7d054b1c0f14df
Author: Tomas Lestach <tlestach(a)redhat.com>
Date: Tue Mar 29 10:40:11 2011 +0200
664715 - catch exception, if no data found
diff --git a/java/code/src/com/redhat/rhn/domain/config/ConfigurationFactory.java b/java/code/src/com/redhat/rhn/domain/config/ConfigurationFactory.java
index c0ecbd7..be2f138 100644
--- a/java/code/src/com/redhat/rhn/domain/config/ConfigurationFactory.java
+++ b/java/code/src/com/redhat/rhn/domain/config/ConfigurationFactory.java
@@ -29,6 +29,8 @@ import com.redhat.rhn.domain.user.User;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
+import org.hibernate.ObjectNotFoundException;
+import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
@@ -378,15 +380,20 @@ public class ConfigurationFactory extends HibernateFactory {
*/
public static ConfigFile lookupConfigFileByChannelAndName(Long channel, Long name) {
Session session = HibernateFactory.getSession();
- return (ConfigFile)
+ Query query =
session.getNamedQuery("ConfigFile.findByChannelAndName")
.setLong("channel_id", channel.longValue())
.setLong("name_id", name.longValue())
.setLong("state_id", ConfigFileState.normal().
getId().longValue())
//Retrieve from cache if there
- .setCacheable(true)
- .uniqueResult();
+ .setCacheable(true);
+ try {
+ return (ConfigFile) query.uniqueResult();
+ }
+ catch (ObjectNotFoundException e) {
+ return null;
+ }
}
/**
13 years
2 commits - client/rhel
by Miroslav Suchý
client/rhel/yum-rhn-plugin/rhnplugin.py | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
New commits:
commit b12837c8d1e45a6de46bd02fff10ed4fefac5bc7
Author: Miroslav Suchý <msuchy(a)redhat.com>
Date: Mon Mar 28 13:55:11 2011 +0200
add repo name in case you have old format of rhnplugin.repos
diff --git a/client/rhel/yum-rhn-plugin/rhnplugin.py b/client/rhel/yum-rhn-plugin/rhnplugin.py
index 3ead8a1..c803bde 100644
--- a/client/rhel/yum-rhn-plugin/rhnplugin.py
+++ b/client/rhel/yum-rhn-plugin/rhnplugin.py
@@ -63,7 +63,10 @@ def init_hook(conduit):
cachefile = open(cachefilename, 'r')
repolist = [ line.rstrip().split(' ', 1) for line in cachefile.readlines()]
cachefile.close()
- for (repoid, reponame) in repolist:
+ for repoitem in repolist:
+ if len(repo_item) == 1:
+ repo_item.append('')
+ (repoid, reponame) = repo_item
repodir = os.path.join(cachedir, repoid)
if os.path.isdir(repodir) and os.path.isfile(
os.path.join(repodir, 'repodata', 'repomd.xml')):
commit 972ff62b3050f89217b414b6927e2c492c54604b
Author: Miroslav Suchý <msuchy(a)redhat.com>
Date: Mon Mar 28 13:13:50 2011 +0200
691283 - create persistdir in _repos_persistdir instead of PWD
diff --git a/client/rhel/yum-rhn-plugin/rhnplugin.py b/client/rhel/yum-rhn-plugin/rhnplugin.py
index 4fd6de7..3ead8a1 100644
--- a/client/rhel/yum-rhn-plugin/rhnplugin.py
+++ b/client/rhel/yum-rhn-plugin/rhnplugin.py
@@ -166,6 +166,7 @@ def prereposetup_hook(conduit):
repo.sslcacert = sslcacert
repo.enablegroups = enablegroups
repo.metadata_expire = metadata_expire
+ repo.base_persistdir = conduit.getConf()._repos_persistdir
repoOptions = getRHNRepoOptions(conduit, repo.id)
if repoOptions:
for o in repoOptions:
13 years
Changes to 'refs/tags/spacecmd-1.4.5-1'
by aparsons
Tag 'spacecmd-1.4.5-1' created by Aron Parsons <aparsons(a)redhat.com> at 2011-03-28 19:47 +0000
Tagging package [spacecmd] version [1.4.5-1] in directory [spacecmd/].
Changes since rhn-client-tools-1.4.8-1:
Aron Parsons (2):
spacecmd: added 'repo' module into shell
Automatic commit of package [spacecmd] release [1.4.5-1].
Dale Bewley (1):
Fixing spacewalk-service start hang at waiting for tomcat.
Jan Pazdziora (3):
RHEL 4 is no longer a target version for osa-dispatcher, fixing .spec to always build osa-dispatcher-selinux.
RHEL 4 is no longer a target version for Spacewalk, fixing .spec to Require spacewalk-monitoring-selinux.
690767 - check that the result has some elements.
Michael Mraka (1):
hibernate 3.3 needs provider_class to be set
Milan Zazrivec (1):
correct input attribute
Miroslav Suchý (3):
add docstring
no need to assign variable for test if it exist
no need to support rhel2
Tomas Lestach (1):
fix ChannelEditorTest.testAddRemovePackages test
Trent Johnson (1):
spacecmd: added repo_list and repo_details
---
client/rhel/rhn-client-tools/src/up2date_client/config.py | 2
client/rhel/rhn-client-tools/src/up2date_client/rhnChannel.py | 1
client/tools/action-rpms/rhn-applet-actions/rhn_applet.py | 15 --
client/tools/osad/osad.spec | 19 --
client/tools/osad/src/osad.py | 10 -
client/tools/rhncustominfo/rhn-custom-info.py | 15 --
java/code/src/com/redhat/rhn/manager/channel/test/ChannelEditorTest.java | 4
java/code/src/com/redhat/rhn/manager/system/SystemManager.java | 2
java/code/webapp/WEB-INF/struts-config.xml | 2
java/conf/default/rhn_hibernate.conf | 1
monitoring/spacewalk-monitoring/spacewalk-monitoring.spec | 10 -
rel-eng/packages/spacecmd | 2
spacecmd/spacecmd.spec | 6
spacecmd/src/lib/repo.py | 69 ++++++++++
spacecmd/src/lib/shell.py | 6
spacewalk/admin/spacewalk-service | 2
16 files changed, 94 insertions(+), 72 deletions(-)
---
13 years
3 commits - rel-eng/packages spacecmd/spacecmd.spec spacecmd/src
by aparsons
rel-eng/packages/spacecmd | 2 -
spacecmd/spacecmd.spec | 6 +++-
spacecmd/src/lib/repo.py | 69 ++++++++++++++++++++++++++++++++++++++++++++++
spacecmd/src/lib/shell.py | 6 ++--
4 files changed, 78 insertions(+), 5 deletions(-)
New commits:
commit 9b949f3ad4011e67135e9045d5e801346577785a
Author: Aron Parsons <aparsons(a)redhat.com>
Date: Mon Mar 28 15:47:54 2011 -0400
Automatic commit of package [spacecmd] release [1.4.5-1].
diff --git a/rel-eng/packages/spacecmd b/rel-eng/packages/spacecmd
index a641560..02b6e52 100644
--- a/rel-eng/packages/spacecmd
+++ b/rel-eng/packages/spacecmd
@@ -1 +1 @@
-1.4.4-1 spacecmd/
+1.4.5-1 spacecmd/
diff --git a/spacecmd/spacecmd.spec b/spacecmd/spacecmd.spec
index 0302479..9e365ec 100644
--- a/spacecmd/spacecmd.spec
+++ b/spacecmd/spacecmd.spec
@@ -4,7 +4,7 @@
%endif
Name: spacecmd
-Version: 1.4.4
+Version: 1.4.5
Release: 1%{?dist}
Summary: Command-line interface to Spacewalk and Satellite servers
@@ -61,6 +61,10 @@ touch %{buildroot}/%{python_sitelib}/spacecmd/__init__.py
%doc %{_mandir}/man1/spacecmd.1.gz
%changelog
+* Mon Mar 28 2011 Aron Parsons <aparsons(a)redhat.com> 1.4.5-1
+- added 'repo' module into shell (aparsons(a)redhat.com)
+- added repo_list and repo_details (tljohnsn(a)oreillyschool.com)
+
* Fri Mar 11 2011 Aron Parsons <aparsons(a)redhat.com> 1.4.4-1
- added configchannel_verifyfile (aparsons(a)redhat.com)
commit 5af978607aff41ff991c1df234e13555dbc0e133
Author: Aron Parsons <aparsons(a)redhat.com>
Date: Mon Mar 28 15:44:08 2011 -0400
spacecmd: added 'repo' module into shell
diff --git a/spacecmd/src/lib/shell.py b/spacecmd/src/lib/shell.py
index 4d362fc..c95655b 100644
--- a/spacecmd/src/lib/shell.py
+++ b/spacecmd/src/lib/shell.py
@@ -28,7 +28,7 @@ class SpacewalkShell(Cmd):
__module_list = [ 'activationkey', 'configchannel', 'cryptokey',
'custominfo', 'distribution', 'errata',
'filepreservation', 'group', 'kickstart',
- 'misc', 'org', 'package', 'report', 'schedule',
+ 'misc', 'org', 'package', 'repo', 'report', 'schedule',
'snippet', 'softwarechannel', 'ssm',
'system', 'user', 'utils' ]
@@ -65,7 +65,7 @@ class SpacewalkShell(Cmd):
# this is used when loading and saving caches
self.conf_dir = conf_dir
-
+
self.history_file = os.path.join(self.conf_dir, 'history')
try:
@@ -112,7 +112,7 @@ class SpacewalkShell(Cmd):
if not self.session:
self.do_login('')
if self.session == '': return ''
-
+
parts = line.split()
if len(parts):
commit 21849b9a06763faad27724a86e9ae076e1fbb2cc
Author: Trent Johnson <tljohnsn(a)oreillyschool.com>
Date: Mon Mar 28 15:43:35 2011 -0400
spacecmd: added repo_list and repo_details
diff --git a/spacecmd/src/lib/repo.py b/spacecmd/src/lib/repo.py
new file mode 100644
index 0000000..c2f50b1
--- /dev/null
+++ b/spacecmd/src/lib/repo.py
@@ -0,0 +1,69 @@
+#
+# Licensed under the GNU General Public License Version 3
+#
+# 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 3 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Copyright 2011 Aron Parsons <aron(a)redhat.com>
+#
+
+# NOTE: the 'self' variable is an instance of SpacewalkShell
+
+from spacecmd.utils import *
+
+def help_repo_list(self):
+ print 'repo_list: List all available user repos'
+ print 'usage: repo_list'
+
+def do_repo_list(self, args, doreturn=False):
+ repos = self.client.channel.software.listUserRepos(self.session)
+ repos = [c.get('label') for c in repos]
+
+ if doreturn:
+ return repos
+ else:
+ if len(repos):
+ print '\n'.join(sorted(repos))
+
+####################
+
+def help_repo_details(self):
+ print 'repo_details: Show the details of a user repo'
+ print 'usage: repo_details <repo ...>'
+
+def complete_repo_details(self, text, line, beg, end):
+ return tab_completer(self.do_repo_list('', True), text)
+
+def do_repo_details(self, args):
+ (args, options) = parse_arguments(args)
+
+ if not len(args):
+ self.help_repo_details()
+ return
+
+ # allow globbing of repo names
+ repos = filter_results(self.do_repo_list('', True), args)
+
+ add_separator = False
+
+ for repo in repos:
+ details = self.client.channel.software.getRepoDetails(\
+ self.session, repo)
+
+ if add_separator: print self.SEPARATOR
+ add_separator = True
+
+ print 'Repository Label: %s' % details.get('label')
+ print 'Repository URL: %s' % details.get('sourceUrl')
+ print 'Repository Type: %s' % details.get('type')
13 years
java/conf
by Michael Mraka
java/conf/default/rhn_hibernate.conf | 1 +
1 file changed, 1 insertion(+)
New commits:
commit 7b66ff28c00bfc080aa015829155f844423f9ad2
Author: Michael Mraka <michael.mraka(a)redhat.com>
Date: Fri Mar 25 23:19:39 2011 +0100
hibernate 3.3 needs provider_class to be set
diff --git a/java/conf/default/rhn_hibernate.conf b/java/conf/default/rhn_hibernate.conf
index a2e313e..e2d1b37 100644
--- a/java/conf/default/rhn_hibernate.conf
+++ b/java/conf/default/rhn_hibernate.conf
@@ -10,6 +10,7 @@
hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
hibernate.connection.driver_class=oracle.jdbc.driver.OracleDriver
hibernate.connection.driver_proto=
+hibernate.connection.provider_class=org.hibernate.connection.C3P0ConnectionProvider
hibernate.use_outer_join=true
hibernate.jdbc.batch_size=0
13 years
spacewalk/admin
by Jan Pazdziora
spacewalk/admin/spacewalk-service | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
New commits:
commit c63c29542cbe22247ab6e4bdcabd78de3a13933e
Author: Dale Bewley <dale(a)fedoraproject.org>
Date: Fri Mar 25 19:55:21 2011 +0100
Fixing spacewalk-service start hang at waiting for tomcat.
If I run /usr/sbin/spacewalk-service start it hangs at "Waiting for
tomcat to be ready ..." until I telnet localhost 8009. Changing the lsof
command to below seems to fix that.
diff --git a/spacewalk/admin/spacewalk-service b/spacewalk/admin/spacewalk-service
index f5e823c..6b55e11 100755
--- a/spacewalk/admin/spacewalk-service
+++ b/spacewalk/admin/spacewalk-service
@@ -52,7 +52,7 @@ forward_services() {
if /usr/sbin/lsof /proc > /dev/null ; then
echo "Waiting for tomcat to be ready ..."
while [ -f "/var/run/$TOMCAT.pid" ] ; do
- /usr/sbin/lsof -t -i @localhost:8009 -p $(cat /var/run/$TOMCAT.pid) > /dev/null && break
+ /usr/sbin/lsof -t -i TCP:8009 -p $(cat /var/run/$TOMCAT.pid) > /dev/null && break
sleep 1
done
else
13 years
java/code
by Tomas Lestach
java/code/src/com/redhat/rhn/manager/channel/test/ChannelEditorTest.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
New commits:
commit 4c4e31646c2195d8c8a2d289e581389480a6f71e
Author: Tomas Lestach <tlestach(a)redhat.com>
Date: Fri Mar 25 18:19:53 2011 +0100
fix ChannelEditorTest.testAddRemovePackages test
ChannelEditor.changePackages expects to get List of Integers (default via xmlrpc)
diff --git a/java/code/src/com/redhat/rhn/manager/channel/test/ChannelEditorTest.java b/java/code/src/com/redhat/rhn/manager/channel/test/ChannelEditorTest.java
index f4f6eee..8a177dd 100644
--- a/java/code/src/com/redhat/rhn/manager/channel/test/ChannelEditorTest.java
+++ b/java/code/src/com/redhat/rhn/manager/channel/test/ChannelEditorTest.java
@@ -44,8 +44,8 @@ public class ChannelEditorTest extends RhnBaseTestCase {
assertEquals(0, channel.getPackages().size());
List pkgList = new ArrayList();
- pkgList.add(pkg.getId());
- Long bogusId = new Long(System.currentTimeMillis());
+ pkgList.add(pkg.getId().intValue());
+ Integer bogusId = new Integer((int) System.currentTimeMillis());
pkgList.add(bogusId);
ChannelEditor editor = ChannelEditor.getInstance();
13 years
java/code
by Jan Pazdziora
java/code/src/com/redhat/rhn/manager/system/SystemManager.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
New commits:
commit 9375dfe68fc90d9784c5456513b1dcc80a8d82d9
Author: Jan Pazdziora <jpazdziora(a)redhat.com>
Date: Fri Mar 25 16:44:31 2011 +0100
690767 - check that the result has some elements.
Addressing
Caused by: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.get(ArrayList.java:352)
at com.redhat.rhn.manager.system.SystemManager.getHardwareDeviceById(SystemManager.java:2435)
diff --git a/java/code/src/com/redhat/rhn/manager/system/SystemManager.java b/java/code/src/com/redhat/rhn/manager/system/SystemManager.java
index 4f9346f..1304d86 100644
--- a/java/code/src/com/redhat/rhn/manager/system/SystemManager.java
+++ b/java/code/src/com/redhat/rhn/manager/system/SystemManager.java
@@ -2427,7 +2427,7 @@ public class SystemManager extends BaseManager {
Map params = new HashMap();
params.put("hw_id", hwId);
DataResult<HardwareDeviceDto> dr = m.execute(params);
- if (dr != null) {
+ if (dr != null && !dr.isEmpty()) {
hwDto = dr.get(0);
}
return hwDto;
13 years
3 commits - client/rhel client/tools
by Miroslav Suchý
client/rhel/rhn-client-tools/src/up2date_client/config.py | 2 -
client/rhel/rhn-client-tools/src/up2date_client/rhnChannel.py | 1
client/tools/action-rpms/rhn-applet-actions/rhn_applet.py | 15 ++--------
client/tools/osad/src/osad.py | 10 ------
client/tools/rhncustominfo/rhn-custom-info.py | 15 ++--------
5 files changed, 10 insertions(+), 33 deletions(-)
New commits:
commit 9dc05b9abbd30fe7f8d00a042ab0b60a13c08af4
Author: Miroslav Suchý <msuchy(a)redhat.com>
Date: Fri Mar 25 14:28:56 2011 +0100
no need to support rhel2
diff --git a/client/tools/action-rpms/rhn-applet-actions/rhn_applet.py b/client/tools/action-rpms/rhn-applet-actions/rhn_applet.py
index ebcbeb5..b132875 100755
--- a/client/tools/action-rpms/rhn-applet-actions/rhn_applet.py
+++ b/client/tools/action-rpms/rhn-applet-actions/rhn_applet.py
@@ -99,17 +99,10 @@ def _create_server_obj(server_url):
def read_cfg_val(obj, key):
- """given up2date's rhel 2.1 vs 3 config 'obj', return the value"""
- if hasattr(obj, 'readEntry'):
- # rhel 2.1 style, obj.readEntry("serverURL")
- return obj.readEntry(key)
- if hasattr(obj, "__setitem__"):
- # rhel 3 style, obj['serverURL']
- if obj.has_key(key):
- return obj[key]
- return None
- raise Exception("unknow up2date config object")
-
+ """ return obj[key] or None if key does not exist"""
+ if obj.has_key(key):
+ return obj[key]
+ return None
def update_applet_cfg():
diff --git a/client/tools/osad/src/osad.py b/client/tools/osad/src/osad.py
index bd5fb9d..cd24654 100644
--- a/client/tools/osad/src/osad.py
+++ b/client/tools/osad/src/osad.py
@@ -331,9 +331,6 @@ class Runner(jabber_lib.Runner):
def get_up2date_config(self):
if self._up2date_config is None:
self._up2date_config = initUp2dateConfig()
- if not hasattr(self._up2date_config, '__getitem__'):
- # Old interface
- self._up2date_config = OldUp2dateConfig(self._up2date_config)
return self._up2date_config
def build_rpclib_params(self, config):
@@ -363,12 +360,5 @@ class Runner(jabber_lib.Runner):
username=username, password=password, resource=resource)
return auth_info
-class OldUp2dateConfig:
- def __init__(self, config_obj):
- self._config_obj = config_obj
-
- def __getitem__(self, name):
- return self._config_obj.readEntry(name)
-
if __name__ == '__main__':
sys.exit(main() or 0)
diff --git a/client/tools/rhncustominfo/rhn-custom-info.py b/client/tools/rhncustominfo/rhn-custom-info.py
index 21eec26..64878b1 100755
--- a/client/tools/rhncustominfo/rhn-custom-info.py
+++ b/client/tools/rhncustominfo/rhn-custom-info.py
@@ -93,18 +93,11 @@ def create_server_obj(server_url):
def read_cfg_val(obj, key):
- """given up2date's rhel 2.1 vs 3 config 'obj', return the value"""
- if hasattr(obj, 'readEntry'):
- # rhel 2.1 style, obj.readEntry("serverURL")
- return obj.readEntry(key)
- elif hasattr(obj, "__setitem__"):
- # rhel 3 style, obj['serverURL']
- if obj.has_key(key):
- return obj[key]
- else:
- raise "unknown config option: %s" % key
+ """ return obj[key] or None if key does not exists """
+ if obj.has_key(key):
+ return obj[key]
else:
- raise "unknown up2date config object"
+ raise "unknown config option: %s" % key
def read_username():
commit 65f1fd8f92c489b4aba7b75fc70e6ed2286751f5
Author: Miroslav Suchý <msuchy(a)redhat.com>
Date: Fri Mar 25 13:36:47 2011 +0100
no need to assign variable for test if it exist
diff --git a/client/rhel/rhn-client-tools/src/up2date_client/config.py b/client/rhel/rhn-client-tools/src/up2date_client/config.py
index c4b78bd..25c6fcd 100644
--- a/client/rhel/rhn-client-tools/src/up2date_client/config.py
+++ b/client/rhel/rhn-client-tools/src/up2date_client/config.py
@@ -299,7 +299,7 @@ def initUp2dateConfig(cfg_file = "/etc/sysconfig/rhn/up2date"):
"""This function is the right way to get at the up2date config."""
global cfg
try:
- cfg = cfg
+ cfg
except NameError:
cfg = None
commit 5fa2da67ac78601184857735621c4722ccfa104b
Author: Miroslav Suchý <msuchy(a)redhat.com>
Date: Thu Mar 24 17:58:05 2011 +0100
add docstring
diff --git a/client/rhel/rhn-client-tools/src/up2date_client/rhnChannel.py b/client/rhel/rhn-client-tools/src/up2date_client/rhnChannel.py
index b6a94d4..2348e14 100644
--- a/client/rhel/rhn-client-tools/src/up2date_client/rhnChannel.py
+++ b/client/rhel/rhn-client-tools/src/up2date_client/rhnChannel.py
@@ -85,6 +85,7 @@ cmdline_pkgs = []
global selected_channels
selected_channels = None
def getChannels(force=None, label_whitelist=None):
+ """ return rhnChannelList containing list of channel we are subscribed to """
cfg = config.initUp2dateConfig()
global selected_channels
if not selected_channels and not force:
13 years